From 0fb27266c7eeb7545c3e3d108bcab566d219daaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Tue, 12 Apr 2022 08:17:18 +0200 Subject: [PATCH] Support for XISF --- 3rdparty/include/pcl/APASSDatabaseFile.h | 509 + 3rdparty/include/pcl/ATrousWaveletTransform.h | 686 + 3rdparty/include/pcl/AbstractImage.h | 1428 ++ 3rdparty/include/pcl/Action.h | 586 + 3rdparty/include/pcl/AdaptiveLocalFilter.h | 216 + 3rdparty/include/pcl/AkimaInterpolation.h | 322 + 3rdparty/include/pcl/Algebra.h | 659 + 3rdparty/include/pcl/AlignedAllocator.h | 178 + 3rdparty/include/pcl/Allocator.h | 409 + 3rdparty/include/pcl/Arguments.h | 681 + 3rdparty/include/pcl/Array.h | 2171 ++ 3rdparty/include/pcl/Association.h | 164 + 3rdparty/include/pcl/AstrometricMetadata.h | 1121 + 3rdparty/include/pcl/Atomic.h | 670 + 3rdparty/include/pcl/AutoLock.h | 380 + 3rdparty/include/pcl/AutoPointer.h | 912 + .../include/pcl/AutoStatusCallbackRestorer.h | 233 + 3rdparty/include/pcl/AutoViewLock.h | 345 + .../include/pcl/BicubicFilterInterpolation.h | 670 + 3rdparty/include/pcl/BicubicInterpolation.h | 791 + .../include/pcl/BidimensionalInterpolation.h | 236 + 3rdparty/include/pcl/BilinearInterpolation.h | 164 + 3rdparty/include/pcl/Bitmap.h | 1531 ++ 3rdparty/include/pcl/BitmapBox.h | 156 + 3rdparty/include/pcl/Brush.h | 820 + 3rdparty/include/pcl/Button.h | 430 + 3rdparty/include/pcl/ButtonCodes.h | 135 + 3rdparty/include/pcl/ByteArray.h | 100 + 3rdparty/include/pcl/CUDADevice.h | 131 + 3rdparty/include/pcl/CanvasColor.h | 190 + 3rdparty/include/pcl/CharTraits.h | 1453 ++ 3rdparty/include/pcl/ChebyshevFit.h | 945 + 3rdparty/include/pcl/CheckBox.h | 129 + 3rdparty/include/pcl/Checksum.h | 161 + 3rdparty/include/pcl/CodeEditor.h | 894 + 3rdparty/include/pcl/Color.h | 412 + 3rdparty/include/pcl/ColorComboBox.h | 269 + 3rdparty/include/pcl/ColorDialog.h | 196 + 3rdparty/include/pcl/ColorFilterArray.h | 348 + 3rdparty/include/pcl/ColorSpace.h | 133 + 3rdparty/include/pcl/ComboBox.h | 567 + 3rdparty/include/pcl/Complex.h | 1110 + 3rdparty/include/pcl/Compression.h | 809 + 3rdparty/include/pcl/Console.h | 829 + 3rdparty/include/pcl/Constants.h | 199 + 3rdparty/include/pcl/Container.h | 134 + 3rdparty/include/pcl/Control.h | 1869 ++ 3rdparty/include/pcl/Convolution.h | 359 + 3rdparty/include/pcl/Crop.h | 261 + 3rdparty/include/pcl/Cryptography.h | 1103 + .../include/pcl/CubicSplineInterpolation.h | 357 + 3rdparty/include/pcl/Cursor.h | 297 + 3rdparty/include/pcl/Defs.h | 1206 ++ 3rdparty/include/pcl/Diagnostics.h | 130 + 3rdparty/include/pcl/Dialog.h | 309 + 3rdparty/include/pcl/DisplayFunction.h | 463 + 3rdparty/include/pcl/DrizzleData.h | 1496 ++ 3rdparty/include/pcl/Edit.h | 391 + 3rdparty/include/pcl/ElapsedTime.h | 401 + 3rdparty/include/pcl/EndianConversions.h | 168 + 3rdparty/include/pcl/EphemerisFile.h | 2304 ++ 3rdparty/include/pcl/ErrorHandler.h | 184 + 3rdparty/include/pcl/Exception.h | 671 + 3rdparty/include/pcl/ExternalProcess.h | 852 + 3rdparty/include/pcl/FFT1D.h | 838 + 3rdparty/include/pcl/FFT2D.h | 869 + 3rdparty/include/pcl/FFTConvolution.h | 477 + 3rdparty/include/pcl/FFTRegistration.h | 611 + 3rdparty/include/pcl/FITSHeaderKeyword.h | 290 + 3rdparty/include/pcl/FastRotation.h | 241 + 3rdparty/include/pcl/File.h | 2415 +++ 3rdparty/include/pcl/FileDataCache.h | 549 + .../pcl/FileDataCachePreferencesDialog.h | 123 + 3rdparty/include/pcl/FileDialog.h | 535 + 3rdparty/include/pcl/FileFormat.h | 495 + 3rdparty/include/pcl/FileFormatBase.h | 515 + .../include/pcl/FileFormatImplementation.h | 903 + 3rdparty/include/pcl/FileFormatInstance.h | 1180 + 3rdparty/include/pcl/FileInfo.h | 442 + 3rdparty/include/pcl/Flags.h | 409 + 3rdparty/include/pcl/Font.h | 547 + 3rdparty/include/pcl/FontComboBox.h | 393 + 3rdparty/include/pcl/FourierTransform.h | 386 + 3rdparty/include/pcl/Frame.h | 195 + 3rdparty/include/pcl/GaiaDatabaseFile.h | 483 + 3rdparty/include/pcl/GaussianFilter.h | 498 + .../include/pcl/GeometricTransformation.h | 277 + 3rdparty/include/pcl/GlobalSettings.h | 522 + 3rdparty/include/pcl/GnomonicProjection.h | 178 + 3rdparty/include/pcl/Graphics.h | 2329 ++ 3rdparty/include/pcl/GridInterpolation.h | 987 + 3rdparty/include/pcl/GroupBox.h | 175 + 3rdparty/include/pcl/HammerAitoffProjection.h | 132 + 3rdparty/include/pcl/Histogram.h | 660 + .../include/pcl/HistogramTransformation.h | 530 + 3rdparty/include/pcl/Homography.h | 406 + 3rdparty/include/pcl/ICCProfile.h | 905 + .../include/pcl/ICCProfileTransformation.h | 691 + 3rdparty/include/pcl/Image.h | 17817 ++++++++++++++++ 3rdparty/include/pcl/ImageColor.h | 258 + 3rdparty/include/pcl/ImageDescription.h | 141 + 3rdparty/include/pcl/ImageGeometry.h | 404 + 3rdparty/include/pcl/ImageInfo.h | 180 + 3rdparty/include/pcl/ImageOptions.h | 186 + 3rdparty/include/pcl/ImageRenderingModes.h | 189 + 3rdparty/include/pcl/ImageResolution.h | 207 + 3rdparty/include/pcl/ImageSelections.h | 122 + 3rdparty/include/pcl/ImageStatistics.h | 1000 + 3rdparty/include/pcl/ImageTransformation.h | 436 + 3rdparty/include/pcl/ImageVariant.h | 7277 +++++++ 3rdparty/include/pcl/ImageView.h | 1459 ++ 3rdparty/include/pcl/ImageWindow.h | 3025 +++ 3rdparty/include/pcl/Indirect.h | 323 + 3rdparty/include/pcl/IndirectArray.h | 2023 ++ 3rdparty/include/pcl/IndirectSortedArray.h | 1311 ++ 3rdparty/include/pcl/IntegerResample.h | 220 + 3rdparty/include/pcl/IntegrationMetadata.h | 426 + .../include/pcl/InterlacedTransformation.h | 181 + 3rdparty/include/pcl/Interpolation.h | 112 + 3rdparty/include/pcl/Iterator.h | 734 + 3rdparty/include/pcl/JPLEphemeris.h | 611 + 3rdparty/include/pcl/KDTree.h | 607 + 3rdparty/include/pcl/KernelFilter.h | 583 + 3rdparty/include/pcl/KeyCodes.h | 481 + 3rdparty/include/pcl/KeyValue.h | 184 + 3rdparty/include/pcl/Label.h | 170 + 3rdparty/include/pcl/LanczosInterpolation.h | 976 + 3rdparty/include/pcl/LinearFilter.h | 203 + 3rdparty/include/pcl/LinearFit.h | 251 + 3rdparty/include/pcl/LinearInterpolation.h | 161 + 3rdparty/include/pcl/LinearTransformation.h | 287 + 3rdparty/include/pcl/LocalNormalizationData.h | 795 + 3rdparty/include/pcl/Math.h | 4996 +++++ 3rdparty/include/pcl/Matrix.h | 3749 ++++ 3rdparty/include/pcl/MeanFilter.h | 182 + 3rdparty/include/pcl/Memory.h | 241 + 3rdparty/include/pcl/MercatorProjection.h | 134 + 3rdparty/include/pcl/MessageBox.h | 337 + 3rdparty/include/pcl/MetaFileFormat.h | 895 + 3rdparty/include/pcl/MetaModule.h | 1037 + 3rdparty/include/pcl/MetaObject.h | 192 + 3rdparty/include/pcl/MetaParameter.h | 1999 ++ 3rdparty/include/pcl/MetaProcess.h | 1030 + 3rdparty/include/pcl/MoffatFilter.h | 504 + 3rdparty/include/pcl/MorphologicalOperator.h | 1237 ++ .../include/pcl/MorphologicalTransformation.h | 246 + 3rdparty/include/pcl/MultiVector.h | 432 + .../include/pcl/MultiViewSelectionDialog.h | 146 + .../include/pcl/MultiscaleLinearTransform.h | 228 + .../include/pcl/MultiscaleMedianTransform.h | 344 + 3rdparty/include/pcl/MuteStatus.h | 189 + 3rdparty/include/pcl/Mutex.h | 436 + .../pcl/NearestNeighborInterpolation.h | 129 + 3rdparty/include/pcl/NetworkTransfer.h | 621 + 3rdparty/include/pcl/NumericControl.h | 468 + .../include/pcl/OnlineObjectSearchDialog.h | 300 + 3rdparty/include/pcl/Optional.h | 283 + 3rdparty/include/pcl/OrthographicProjection.h | 144 + 3rdparty/include/pcl/PSFEstimator.h | 392 + 3rdparty/include/pcl/PSFFit.h | 611 + 3rdparty/include/pcl/PSFScaleEstimator.h | 276 + 3rdparty/include/pcl/PSFSignalEstimator.h | 280 + 3rdparty/include/pcl/ParallelProcess.h | 187 + 3rdparty/include/pcl/Pen.h | 371 + 3rdparty/include/pcl/PhaseMatrices.h | 168 + 3rdparty/include/pcl/PixelAllocator.h | 251 + 3rdparty/include/pcl/PixelInterpolation.h | 1132 + 3rdparty/include/pcl/PixelTraits.h | 6294 ++++++ 3rdparty/include/pcl/PlateCarreeProjection.h | 136 + 3rdparty/include/pcl/Point.h | 1484 ++ 3rdparty/include/pcl/PolarTransform.h | 299 + 3rdparty/include/pcl/Position.h | 1522 ++ 3rdparty/include/pcl/PreviewSelectionDialog.h | 130 + 3rdparty/include/pcl/Process.h | 365 + 3rdparty/include/pcl/ProcessBase.h | 303 + 3rdparty/include/pcl/ProcessImplementation.h | 813 + 3rdparty/include/pcl/ProcessInstance.h | 701 + 3rdparty/include/pcl/ProcessInterface.h | 2618 +++ 3rdparty/include/pcl/ProcessParameter.h | 695 + 3rdparty/include/pcl/ProgressBarStatus.h | 143 + 3rdparty/include/pcl/ProgressDialog.h | 275 + 3rdparty/include/pcl/ProjectionBase.h | 231 + 3rdparty/include/pcl/ProjectionFactory.h | 146 + 3rdparty/include/pcl/Property.h | 278 + 3rdparty/include/pcl/PropertyDescription.h | 164 + 3rdparty/include/pcl/PushButton.h | 136 + .../include/pcl/PyramidalWaveletTransform.h | 517 + 3rdparty/include/pcl/QuadTree.h | 1453 ++ 3rdparty/include/pcl/RGBColorSystem.h | 1587 ++ 3rdparty/include/pcl/RadioButton.h | 117 + 3rdparty/include/pcl/Random.h | 921 + 3rdparty/include/pcl/ReadWriteMutex.h | 194 + 3rdparty/include/pcl/ReadoutOptions.h | 724 + 3rdparty/include/pcl/RealTimePreview.h | 241 + 3rdparty/include/pcl/RealTimeProgressStatus.h | 188 + 3rdparty/include/pcl/Rectangle.h | 3024 +++ .../pcl/RedundantMultiscaleTransform.h | 576 + 3rdparty/include/pcl/ReferenceArray.h | 2253 ++ 3rdparty/include/pcl/ReferenceCounter.h | 231 + 3rdparty/include/pcl/ReferenceSortedArray.h | 1552 ++ 3rdparty/include/pcl/Relational.h | 129 + 3rdparty/include/pcl/Resample.h | 406 + .../include/pcl/RobustChauvenetRejection.h | 369 + 3rdparty/include/pcl/Rotate.h | 247 + 3rdparty/include/pcl/Rotation.h | 272 + 3rdparty/include/pcl/SVG.h | 259 + 3rdparty/include/pcl/ScrollBox.h | 664 + 3rdparty/include/pcl/Search.h | 510 + 3rdparty/include/pcl/SectionBar.h | 379 + 3rdparty/include/pcl/Selection.h | 250 + 3rdparty/include/pcl/SeparableConvolution.h | 488 + 3rdparty/include/pcl/SeparableFilter.h | 399 + 3rdparty/include/pcl/SeparableMedianFilter.h | 143 + 3rdparty/include/pcl/Settings.h | 896 + 3rdparty/include/pcl/SharedPixelData.h | 249 + 3rdparty/include/pcl/ShepardInterpolation.h | 842 + 3rdparty/include/pcl/Sizer.h | 644 + 3rdparty/include/pcl/Slider.h | 492 + 3rdparty/include/pcl/Sort.h | 573 + 3rdparty/include/pcl/SortedArray.h | 1104 + 3rdparty/include/pcl/SphericalRotation.h | 131 + 3rdparty/include/pcl/SpinBox.h | 484 + 3rdparty/include/pcl/SpinStatus.h | 203 + 3rdparty/include/pcl/StandardAllocator.h | 349 + 3rdparty/include/pcl/StandardStatus.h | 202 + 3rdparty/include/pcl/StarDatabaseFile.h | 746 + 3rdparty/include/pcl/StarDetector.h | 664 + 3rdparty/include/pcl/StatusMonitor.h | 619 + 3rdparty/include/pcl/String.h | 13714 ++++++++++++ 3rdparty/include/pcl/StringList.h | 152 + 3rdparty/include/pcl/StructuringElement.h | 956 + 3rdparty/include/pcl/SurfacePolynomial.h | 546 + 3rdparty/include/pcl/SurfaceSimplifier.h | 581 + 3rdparty/include/pcl/SurfaceSpline.h | 2011 ++ 3rdparty/include/pcl/TabBox.h | 391 + 3rdparty/include/pcl/TextAlign.h | 112 + 3rdparty/include/pcl/TextBox.h | 316 + 3rdparty/include/pcl/Thread.h | 753 + .../include/pcl/ThresholdedTransformation.h | 170 + 3rdparty/include/pcl/TimePoint.h | 1210 ++ 3rdparty/include/pcl/Timer.h | 238 + 3rdparty/include/pcl/ToolButton.h | 126 + 3rdparty/include/pcl/Translation.h | 210 + 3rdparty/include/pcl/TreeBox.h | 962 + 3rdparty/include/pcl/UIObject.h | 409 + 3rdparty/include/pcl/UIScaling.h | 362 + .../include/pcl/UnidimensionalInterpolation.h | 218 + 3rdparty/include/pcl/UnixSignalException.h | 240 + 3rdparty/include/pcl/Utility.h | 705 + 3rdparty/include/pcl/VariableShapeFilter.h | 531 + 3rdparty/include/pcl/Variant.h | 1900 ++ 3rdparty/include/pcl/Vector.h | 3325 +++ 3rdparty/include/pcl/Version.h | 295 + 3rdparty/include/pcl/View.h | 1121 + 3rdparty/include/pcl/ViewList.h | 329 + 3rdparty/include/pcl/ViewSelectionDialog.h | 149 + 3rdparty/include/pcl/WCSKeywords.h | 172 + 3rdparty/include/pcl/WebView.h | 553 + 3rdparty/include/pcl/Win32Exception.h | 317 + 3rdparty/include/pcl/WordArray.h | 121 + 3rdparty/include/pcl/WorldTransformation.h | 681 + 3rdparty/include/pcl/XISF.h | 1629 ++ 3rdparty/include/pcl/XML.h | 3038 +++ 3rdparty/include/pcl/ZenithalProjections.h | 281 + 3rdparty/lib/Linux/libPCL.a | Bin 0 -> 35568008 bytes 3rdparty/lib/Linux/libRFC6234.a | Bin 0 -> 36778 bytes 3rdparty/lib/Linux/liblcms.a | Bin 0 -> 788236 bytes 3rdparty/lib/Linux/liblz4.a | Bin 0 -> 189350 bytes 3rdparty/lib/Linux/libzlib.a | Bin 0 -> 146546 bytes 3rdparty/lib/Windows/libPCL.a | Bin 0 -> 30930232 bytes 3rdparty/lib/Windows/libRFC6234.a | Bin 0 -> 28718 bytes 3rdparty/lib/Windows/liblcms.a | Bin 0 -> 604216 bytes 3rdparty/lib/Windows/liblz4.a | Bin 0 -> 178326 bytes 3rdparty/lib/Windows/libzlib.a | Bin 0 -> 121000 bytes CMakeLists.txt | 11 +- imageringlist.cpp | 2 +- loadrunable.cpp | 86 +- mainwindow.cpp | 2 +- 278 files changed, 209068 insertions(+), 7 deletions(-) create mode 100644 3rdparty/include/pcl/APASSDatabaseFile.h create mode 100644 3rdparty/include/pcl/ATrousWaveletTransform.h create mode 100644 3rdparty/include/pcl/AbstractImage.h create mode 100644 3rdparty/include/pcl/Action.h create mode 100644 3rdparty/include/pcl/AdaptiveLocalFilter.h create mode 100644 3rdparty/include/pcl/AkimaInterpolation.h create mode 100644 3rdparty/include/pcl/Algebra.h create mode 100644 3rdparty/include/pcl/AlignedAllocator.h create mode 100644 3rdparty/include/pcl/Allocator.h create mode 100644 3rdparty/include/pcl/Arguments.h create mode 100644 3rdparty/include/pcl/Array.h create mode 100644 3rdparty/include/pcl/Association.h create mode 100644 3rdparty/include/pcl/AstrometricMetadata.h create mode 100644 3rdparty/include/pcl/Atomic.h create mode 100644 3rdparty/include/pcl/AutoLock.h create mode 100644 3rdparty/include/pcl/AutoPointer.h create mode 100644 3rdparty/include/pcl/AutoStatusCallbackRestorer.h create mode 100644 3rdparty/include/pcl/AutoViewLock.h create mode 100644 3rdparty/include/pcl/BicubicFilterInterpolation.h create mode 100644 3rdparty/include/pcl/BicubicInterpolation.h create mode 100644 3rdparty/include/pcl/BidimensionalInterpolation.h create mode 100644 3rdparty/include/pcl/BilinearInterpolation.h create mode 100644 3rdparty/include/pcl/Bitmap.h create mode 100644 3rdparty/include/pcl/BitmapBox.h create mode 100644 3rdparty/include/pcl/Brush.h create mode 100644 3rdparty/include/pcl/Button.h create mode 100644 3rdparty/include/pcl/ButtonCodes.h create mode 100644 3rdparty/include/pcl/ByteArray.h create mode 100644 3rdparty/include/pcl/CUDADevice.h create mode 100644 3rdparty/include/pcl/CanvasColor.h create mode 100644 3rdparty/include/pcl/CharTraits.h create mode 100644 3rdparty/include/pcl/ChebyshevFit.h create mode 100644 3rdparty/include/pcl/CheckBox.h create mode 100644 3rdparty/include/pcl/Checksum.h create mode 100644 3rdparty/include/pcl/CodeEditor.h create mode 100644 3rdparty/include/pcl/Color.h create mode 100644 3rdparty/include/pcl/ColorComboBox.h create mode 100644 3rdparty/include/pcl/ColorDialog.h create mode 100644 3rdparty/include/pcl/ColorFilterArray.h create mode 100644 3rdparty/include/pcl/ColorSpace.h create mode 100644 3rdparty/include/pcl/ComboBox.h create mode 100644 3rdparty/include/pcl/Complex.h create mode 100644 3rdparty/include/pcl/Compression.h create mode 100644 3rdparty/include/pcl/Console.h create mode 100644 3rdparty/include/pcl/Constants.h create mode 100644 3rdparty/include/pcl/Container.h create mode 100644 3rdparty/include/pcl/Control.h create mode 100644 3rdparty/include/pcl/Convolution.h create mode 100644 3rdparty/include/pcl/Crop.h create mode 100644 3rdparty/include/pcl/Cryptography.h create mode 100644 3rdparty/include/pcl/CubicSplineInterpolation.h create mode 100644 3rdparty/include/pcl/Cursor.h create mode 100644 3rdparty/include/pcl/Defs.h create mode 100644 3rdparty/include/pcl/Diagnostics.h create mode 100644 3rdparty/include/pcl/Dialog.h create mode 100644 3rdparty/include/pcl/DisplayFunction.h create mode 100644 3rdparty/include/pcl/DrizzleData.h create mode 100644 3rdparty/include/pcl/Edit.h create mode 100644 3rdparty/include/pcl/ElapsedTime.h create mode 100644 3rdparty/include/pcl/EndianConversions.h create mode 100644 3rdparty/include/pcl/EphemerisFile.h create mode 100644 3rdparty/include/pcl/ErrorHandler.h create mode 100644 3rdparty/include/pcl/Exception.h create mode 100644 3rdparty/include/pcl/ExternalProcess.h create mode 100644 3rdparty/include/pcl/FFT1D.h create mode 100644 3rdparty/include/pcl/FFT2D.h create mode 100644 3rdparty/include/pcl/FFTConvolution.h create mode 100644 3rdparty/include/pcl/FFTRegistration.h create mode 100644 3rdparty/include/pcl/FITSHeaderKeyword.h create mode 100644 3rdparty/include/pcl/FastRotation.h create mode 100644 3rdparty/include/pcl/File.h create mode 100644 3rdparty/include/pcl/FileDataCache.h create mode 100644 3rdparty/include/pcl/FileDataCachePreferencesDialog.h create mode 100644 3rdparty/include/pcl/FileDialog.h create mode 100644 3rdparty/include/pcl/FileFormat.h create mode 100644 3rdparty/include/pcl/FileFormatBase.h create mode 100644 3rdparty/include/pcl/FileFormatImplementation.h create mode 100644 3rdparty/include/pcl/FileFormatInstance.h create mode 100644 3rdparty/include/pcl/FileInfo.h create mode 100644 3rdparty/include/pcl/Flags.h create mode 100644 3rdparty/include/pcl/Font.h create mode 100644 3rdparty/include/pcl/FontComboBox.h create mode 100644 3rdparty/include/pcl/FourierTransform.h create mode 100644 3rdparty/include/pcl/Frame.h create mode 100644 3rdparty/include/pcl/GaiaDatabaseFile.h create mode 100644 3rdparty/include/pcl/GaussianFilter.h create mode 100644 3rdparty/include/pcl/GeometricTransformation.h create mode 100644 3rdparty/include/pcl/GlobalSettings.h create mode 100644 3rdparty/include/pcl/GnomonicProjection.h create mode 100644 3rdparty/include/pcl/Graphics.h create mode 100644 3rdparty/include/pcl/GridInterpolation.h create mode 100644 3rdparty/include/pcl/GroupBox.h create mode 100644 3rdparty/include/pcl/HammerAitoffProjection.h create mode 100644 3rdparty/include/pcl/Histogram.h create mode 100644 3rdparty/include/pcl/HistogramTransformation.h create mode 100644 3rdparty/include/pcl/Homography.h create mode 100644 3rdparty/include/pcl/ICCProfile.h create mode 100644 3rdparty/include/pcl/ICCProfileTransformation.h create mode 100644 3rdparty/include/pcl/Image.h create mode 100644 3rdparty/include/pcl/ImageColor.h create mode 100644 3rdparty/include/pcl/ImageDescription.h create mode 100644 3rdparty/include/pcl/ImageGeometry.h create mode 100644 3rdparty/include/pcl/ImageInfo.h create mode 100644 3rdparty/include/pcl/ImageOptions.h create mode 100644 3rdparty/include/pcl/ImageRenderingModes.h create mode 100644 3rdparty/include/pcl/ImageResolution.h create mode 100644 3rdparty/include/pcl/ImageSelections.h create mode 100644 3rdparty/include/pcl/ImageStatistics.h create mode 100644 3rdparty/include/pcl/ImageTransformation.h create mode 100644 3rdparty/include/pcl/ImageVariant.h create mode 100644 3rdparty/include/pcl/ImageView.h create mode 100644 3rdparty/include/pcl/ImageWindow.h create mode 100644 3rdparty/include/pcl/Indirect.h create mode 100644 3rdparty/include/pcl/IndirectArray.h create mode 100644 3rdparty/include/pcl/IndirectSortedArray.h create mode 100644 3rdparty/include/pcl/IntegerResample.h create mode 100644 3rdparty/include/pcl/IntegrationMetadata.h create mode 100644 3rdparty/include/pcl/InterlacedTransformation.h create mode 100644 3rdparty/include/pcl/Interpolation.h create mode 100644 3rdparty/include/pcl/Iterator.h create mode 100644 3rdparty/include/pcl/JPLEphemeris.h create mode 100644 3rdparty/include/pcl/KDTree.h create mode 100644 3rdparty/include/pcl/KernelFilter.h create mode 100644 3rdparty/include/pcl/KeyCodes.h create mode 100644 3rdparty/include/pcl/KeyValue.h create mode 100644 3rdparty/include/pcl/Label.h create mode 100644 3rdparty/include/pcl/LanczosInterpolation.h create mode 100644 3rdparty/include/pcl/LinearFilter.h create mode 100644 3rdparty/include/pcl/LinearFit.h create mode 100644 3rdparty/include/pcl/LinearInterpolation.h create mode 100644 3rdparty/include/pcl/LinearTransformation.h create mode 100644 3rdparty/include/pcl/LocalNormalizationData.h create mode 100644 3rdparty/include/pcl/Math.h create mode 100644 3rdparty/include/pcl/Matrix.h create mode 100644 3rdparty/include/pcl/MeanFilter.h create mode 100644 3rdparty/include/pcl/Memory.h create mode 100644 3rdparty/include/pcl/MercatorProjection.h create mode 100644 3rdparty/include/pcl/MessageBox.h create mode 100644 3rdparty/include/pcl/MetaFileFormat.h create mode 100644 3rdparty/include/pcl/MetaModule.h create mode 100644 3rdparty/include/pcl/MetaObject.h create mode 100644 3rdparty/include/pcl/MetaParameter.h create mode 100644 3rdparty/include/pcl/MetaProcess.h create mode 100644 3rdparty/include/pcl/MoffatFilter.h create mode 100644 3rdparty/include/pcl/MorphologicalOperator.h create mode 100644 3rdparty/include/pcl/MorphologicalTransformation.h create mode 100644 3rdparty/include/pcl/MultiVector.h create mode 100644 3rdparty/include/pcl/MultiViewSelectionDialog.h create mode 100644 3rdparty/include/pcl/MultiscaleLinearTransform.h create mode 100644 3rdparty/include/pcl/MultiscaleMedianTransform.h create mode 100644 3rdparty/include/pcl/MuteStatus.h create mode 100644 3rdparty/include/pcl/Mutex.h create mode 100644 3rdparty/include/pcl/NearestNeighborInterpolation.h create mode 100644 3rdparty/include/pcl/NetworkTransfer.h create mode 100644 3rdparty/include/pcl/NumericControl.h create mode 100644 3rdparty/include/pcl/OnlineObjectSearchDialog.h create mode 100644 3rdparty/include/pcl/Optional.h create mode 100644 3rdparty/include/pcl/OrthographicProjection.h create mode 100644 3rdparty/include/pcl/PSFEstimator.h create mode 100644 3rdparty/include/pcl/PSFFit.h create mode 100644 3rdparty/include/pcl/PSFScaleEstimator.h create mode 100644 3rdparty/include/pcl/PSFSignalEstimator.h create mode 100644 3rdparty/include/pcl/ParallelProcess.h create mode 100644 3rdparty/include/pcl/Pen.h create mode 100644 3rdparty/include/pcl/PhaseMatrices.h create mode 100644 3rdparty/include/pcl/PixelAllocator.h create mode 100644 3rdparty/include/pcl/PixelInterpolation.h create mode 100644 3rdparty/include/pcl/PixelTraits.h create mode 100644 3rdparty/include/pcl/PlateCarreeProjection.h create mode 100644 3rdparty/include/pcl/Point.h create mode 100644 3rdparty/include/pcl/PolarTransform.h create mode 100644 3rdparty/include/pcl/Position.h create mode 100644 3rdparty/include/pcl/PreviewSelectionDialog.h create mode 100644 3rdparty/include/pcl/Process.h create mode 100644 3rdparty/include/pcl/ProcessBase.h create mode 100644 3rdparty/include/pcl/ProcessImplementation.h create mode 100644 3rdparty/include/pcl/ProcessInstance.h create mode 100644 3rdparty/include/pcl/ProcessInterface.h create mode 100644 3rdparty/include/pcl/ProcessParameter.h create mode 100644 3rdparty/include/pcl/ProgressBarStatus.h create mode 100644 3rdparty/include/pcl/ProgressDialog.h create mode 100644 3rdparty/include/pcl/ProjectionBase.h create mode 100644 3rdparty/include/pcl/ProjectionFactory.h create mode 100644 3rdparty/include/pcl/Property.h create mode 100644 3rdparty/include/pcl/PropertyDescription.h create mode 100644 3rdparty/include/pcl/PushButton.h create mode 100644 3rdparty/include/pcl/PyramidalWaveletTransform.h create mode 100644 3rdparty/include/pcl/QuadTree.h create mode 100644 3rdparty/include/pcl/RGBColorSystem.h create mode 100644 3rdparty/include/pcl/RadioButton.h create mode 100644 3rdparty/include/pcl/Random.h create mode 100644 3rdparty/include/pcl/ReadWriteMutex.h create mode 100644 3rdparty/include/pcl/ReadoutOptions.h create mode 100644 3rdparty/include/pcl/RealTimePreview.h create mode 100644 3rdparty/include/pcl/RealTimeProgressStatus.h create mode 100644 3rdparty/include/pcl/Rectangle.h create mode 100644 3rdparty/include/pcl/RedundantMultiscaleTransform.h create mode 100644 3rdparty/include/pcl/ReferenceArray.h create mode 100644 3rdparty/include/pcl/ReferenceCounter.h create mode 100644 3rdparty/include/pcl/ReferenceSortedArray.h create mode 100644 3rdparty/include/pcl/Relational.h create mode 100644 3rdparty/include/pcl/Resample.h create mode 100644 3rdparty/include/pcl/RobustChauvenetRejection.h create mode 100644 3rdparty/include/pcl/Rotate.h create mode 100644 3rdparty/include/pcl/Rotation.h create mode 100644 3rdparty/include/pcl/SVG.h create mode 100644 3rdparty/include/pcl/ScrollBox.h create mode 100644 3rdparty/include/pcl/Search.h create mode 100644 3rdparty/include/pcl/SectionBar.h create mode 100644 3rdparty/include/pcl/Selection.h create mode 100644 3rdparty/include/pcl/SeparableConvolution.h create mode 100644 3rdparty/include/pcl/SeparableFilter.h create mode 100644 3rdparty/include/pcl/SeparableMedianFilter.h create mode 100644 3rdparty/include/pcl/Settings.h create mode 100644 3rdparty/include/pcl/SharedPixelData.h create mode 100644 3rdparty/include/pcl/ShepardInterpolation.h create mode 100644 3rdparty/include/pcl/Sizer.h create mode 100644 3rdparty/include/pcl/Slider.h create mode 100644 3rdparty/include/pcl/Sort.h create mode 100644 3rdparty/include/pcl/SortedArray.h create mode 100644 3rdparty/include/pcl/SphericalRotation.h create mode 100644 3rdparty/include/pcl/SpinBox.h create mode 100644 3rdparty/include/pcl/SpinStatus.h create mode 100644 3rdparty/include/pcl/StandardAllocator.h create mode 100644 3rdparty/include/pcl/StandardStatus.h create mode 100644 3rdparty/include/pcl/StarDatabaseFile.h create mode 100644 3rdparty/include/pcl/StarDetector.h create mode 100644 3rdparty/include/pcl/StatusMonitor.h create mode 100644 3rdparty/include/pcl/String.h create mode 100644 3rdparty/include/pcl/StringList.h create mode 100644 3rdparty/include/pcl/StructuringElement.h create mode 100644 3rdparty/include/pcl/SurfacePolynomial.h create mode 100644 3rdparty/include/pcl/SurfaceSimplifier.h create mode 100644 3rdparty/include/pcl/SurfaceSpline.h create mode 100644 3rdparty/include/pcl/TabBox.h create mode 100644 3rdparty/include/pcl/TextAlign.h create mode 100644 3rdparty/include/pcl/TextBox.h create mode 100644 3rdparty/include/pcl/Thread.h create mode 100644 3rdparty/include/pcl/ThresholdedTransformation.h create mode 100644 3rdparty/include/pcl/TimePoint.h create mode 100644 3rdparty/include/pcl/Timer.h create mode 100644 3rdparty/include/pcl/ToolButton.h create mode 100644 3rdparty/include/pcl/Translation.h create mode 100644 3rdparty/include/pcl/TreeBox.h create mode 100644 3rdparty/include/pcl/UIObject.h create mode 100644 3rdparty/include/pcl/UIScaling.h create mode 100644 3rdparty/include/pcl/UnidimensionalInterpolation.h create mode 100644 3rdparty/include/pcl/UnixSignalException.h create mode 100644 3rdparty/include/pcl/Utility.h create mode 100644 3rdparty/include/pcl/VariableShapeFilter.h create mode 100644 3rdparty/include/pcl/Variant.h create mode 100644 3rdparty/include/pcl/Vector.h create mode 100644 3rdparty/include/pcl/Version.h create mode 100644 3rdparty/include/pcl/View.h create mode 100644 3rdparty/include/pcl/ViewList.h create mode 100644 3rdparty/include/pcl/ViewSelectionDialog.h create mode 100644 3rdparty/include/pcl/WCSKeywords.h create mode 100644 3rdparty/include/pcl/WebView.h create mode 100644 3rdparty/include/pcl/Win32Exception.h create mode 100644 3rdparty/include/pcl/WordArray.h create mode 100644 3rdparty/include/pcl/WorldTransformation.h create mode 100644 3rdparty/include/pcl/XISF.h create mode 100644 3rdparty/include/pcl/XML.h create mode 100644 3rdparty/include/pcl/ZenithalProjections.h create mode 100644 3rdparty/lib/Linux/libPCL.a create mode 100644 3rdparty/lib/Linux/libRFC6234.a create mode 100644 3rdparty/lib/Linux/liblcms.a create mode 100644 3rdparty/lib/Linux/liblz4.a create mode 100644 3rdparty/lib/Linux/libzlib.a create mode 100755 3rdparty/lib/Windows/libPCL.a create mode 100755 3rdparty/lib/Windows/libRFC6234.a create mode 100755 3rdparty/lib/Windows/liblcms.a create mode 100755 3rdparty/lib/Windows/liblz4.a create mode 100755 3rdparty/lib/Windows/libzlib.a diff --git a/3rdparty/include/pcl/APASSDatabaseFile.h b/3rdparty/include/pcl/APASSDatabaseFile.h new file mode 100644 index 0000000..1dcc17c --- /dev/null +++ b/3rdparty/include/pcl/APASSDatabaseFile.h @@ -0,0 +1,509 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/APASSDatabaseFile.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_APASSDatabaseFile_h +#define __PCL_APASSDatabaseFile_h + +/// \file pcl/APASSDatabaseFile.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::APASSStarFlag + * \brief Data availability and quality flags for APASS star data. + * + * + * + * + * + * + * + * + * + * + * + *
APASSStarFlag::NoMag_V No Johnson V magnitude available.
APASSStarFlag::NoMag_B No Johnson B magnitude available.
APASSStarFlag::NoMag_u No Sloan u' magnitude available (APASS DR10 only).
APASSStarFlag::NoMag_g No Sloan g' magnitude available.
APASSStarFlag::NoMag_r No Sloan r' magnitude available.
APASSStarFlag::NoMag_i No Sloan i' magnitude available.
APASSStarFlag::NoMag_z_s No Sloan z_s magnitude available (APASS DR10 only).
APASSStarFlag::NoMag_Y No Sloan Y magnitude available (APASS DR10 only).
APASSStarFlag::PosErrorHigh Uncertainty in right ascension or declination greater than 0.75 arcseconds.
+ * + * \ingroup point_source_databases + */ +namespace APASSStarFlag +{ + enum mask_type + { + NoMag_V = 0x0001, + NoMag_B = 0x0002, + NoMag_u = 0x0004, + NoMag_g = 0x0008, + NoMag_r = 0x0010, + NoMag_i = 0x0020, + NoMag_z_s = 0x0040, + NoMag_Y = 0x0080, + PosErrorHigh = 0x0100 + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \struct APASSStarData + * \brief Star data structure for APASS catalog search operations. + * + * \ingroup point_source_databases + */ +struct PCL_CLASS APASSStarData +{ + double ra = 0; //!< Right ascension in degrees, in the range [0,360). + double dec = 0; //!< Declination in degrees, in the range [-90,+90]. + float mag_V = 0; //!< Magnitude in Johnson V (Vega system). + float mag_B = 0; //!< Magnitude in Johnson B (Vega system). + float mag_u = 0; //!< Magnitude in Sloan u' (AB system) (APASS DR10 only). + float mag_g = 0; //!< Magnitude in Sloan g' (AB system). + float mag_r = 0; //!< Magnitude in Sloan r' (AB system). + float mag_i = 0; //!< Magnitude in Sloan i' (AB system). + float mag_z_s = 0; //!< Magnitude in Sloan z_s (AB system) (APASS DR10 only). + float mag_Y = 0; //!< Magnitude in Sloan Y (AB system) (APASS DR10 only). + float err_V = 0; //!< Uncertainty in mag_V. + float err_B = 0; //!< Uncertainty in mag_B. + float err_u = 0; //!< Uncertainty in mag_u (APASS DR10 only). + float err_g = 0; //!< Uncertainty in mag_g. + float err_r = 0; //!< Uncertainty in mag_r. + float err_i = 0; //!< Uncertainty in mag_i. + float err_z_s = 0; //!< Uncertainty in mag_z_s (APASS DR10 only). + float err_Y = 0; //!< Uncertainty in mag_Y (APASS DR10 only). + uint16 flags = 0u; //!< Data availability and quality flags. See the APASSStarFlag namespace. +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct pcl::APASSSearchData + * \brief Data items and parameters for APASS catalog search operations. + * + * \ingroup point_source_databases + */ +typedef XPSD::SearchData APASSSearchData; + +// ---------------------------------------------------------------------------- + +/*! + * \class APASSDatabaseFile + * \brief APASS catalog star database file (XPSD format). + * + * This class implements an interface to XPSD files serializing encoded APASS + * star data. As of writing this documentation (December 2020), APASS DR9 and + * DR10 are supported and have been implemented. + * + * The most important functionality of this class is performing fast indexed + * search operations to retrieve point source data for APASS stars matching a + * set of user-defined criteria. See the APASSDatabaseFile::Search() member + * function and the APASSSearchData structure for detailed information. + * + * This implementation provides the following data for the complete APASS DR9 + * and DR10 catalogs: + * + * \li Source positions. + * \li Magnitudes on the Johnson V and B bands (Vega system) and Sloan u', g', + * r', i', z_s and Y magnitudes (AB system). + * \li Data availability and quality flags. + * + * \b References + * + * \li APASS: The AAVSO Photometric All-Sky Survey: + * https://www.aavso.org/apass + * + * \b Credits + * + * This work makes use of data from the AAVSO Photometric All Sky Survey, whose + * funding has been provided by the Robert Martin Ayers Sciences Fund and from + * the NSF (AST-1412587). + * + * \sa StarDatabaseFile, GaiaDatabaseFile + * \ingroup point_source_databases + */ +class PCL_CLASS APASSDatabaseFile : public StarDatabaseFile +{ +public: + + /*! + * Default constructor. + * + * Constructs an invalid instance that cannot be used until initialized by + * calling the Open() member function. + */ + APASSDatabaseFile() = default; + + /*! + * Constructs a &APASSDatabaseFile instance initialized from the specified + * point source database file in XPSD format. As of writing this + * documentation (December 2020), The APASS DR9 and DR10 catalogs are + * available. + * + * In the event of errors or invalid data, this constructor will throw the + * appropriate Error exception. + */ + APASSDatabaseFile( const String& filePath ) + : StarDatabaseFile( filePath ) + { + static_assert( sizeof( EncodedDR9StarData ) == 32, "Invalid sizeof( APASSDatabaseFile::EncodedDR9StarData )" ); + static_assert( sizeof( EncodedDR10StarData ) == 36, "Invalid sizeof( APASSDatabaseFile::EncodedDR10StarData )" ); + if ( Metadata().databaseIdentifier == "APASSDR9" ) + { + m_dr = "DR9"; + m_decoder = &APASSDatabaseFile::GetEncodedDR9Data; + } + else if ( Metadata().databaseIdentifier == "APASSDR10" ) + { + m_dr = "DR10"; + m_decoder = &APASSDatabaseFile::GetEncodedDR10Data; + } + else + throw Error( "Invalid or unsupported APASS database file with unknown identifier '" + + Metadata().databaseIdentifier + "': " + filePath ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + APASSDatabaseFile& operator =( APASSDatabaseFile&& ) = default; + + /*! + * Deleted copy constructor. %APASSDatabaseFile instances are unique, + * hence cannot be copied. + */ + APASSDatabaseFile( const APASSDatabaseFile& ) = delete; + + /*! + * Deleted copy assignment operator. %APASSDatabaseFile instances are + * unique, hence cannot be copied. + */ + APASSDatabaseFile& operator =( const APASSDatabaseFile& ) = delete; + + /*! + * Performs a search operation for point sources matching the specified + * criteria. + * + * This member function performs a fast indexed search for point sources in + * this database file matching the criteria defined in the specified \a data + * structure. See the APASSSearchData structure for detailed information on + * search parameters and output data. + * + * Summarily, search criteria include: + * + * \li The region of the sky where point sources will be searched for. This + * region is defined by the equatorial coordinates of a field center and a + * field radius. + * + * \li An optional range of magnitudes. + * + * \li Optional inclusion/exclusion flags. + * + * \li An optional limit for the number of sources included in the search + * result. + * + * The result of the search operation is also returned in the specified + * \a data structure, including, among others, the following items: + * + * \li The list of point sources found. + * + * \li Instrumentation items for performance analysis, including: total + * search time, time used for I/O operations, total I/O operations, time + * used for data decoding, and time used for data decompression. + */ + void Search( APASSSearchData& data ) const + { + ElapsedTime T; + for ( const XPSD::IndexTree& tree : m_index ) + tree.Search( data.centerRA, data.centerDec, data.radius, &data ); + data.timeTotal += T(); + } + + /*! + * Returns the name of the APASS data release corresponding to the data + * available in this database file. As of writing this documentation + * (December 2020), this member function can return either "DR9" or "DR10". + */ + const IsoString& DataRelease() const + { + return m_dr; + } + +private: + + IsoString m_dr; // data release, one of "DR9", "DR10" + + typedef void (APASSDatabaseFile::*star_decoder)( const ByteArray&, const XPSD::IndexTree&, const XPSD::IndexNode&, void* ) const; + star_decoder m_decoder = nullptr; + +#pragma pack(push, 1) + + /* + * Encoded DR9 star record (32 bytes uncompressed). + */ + struct EncodedDR9StarData + { + // Projected coordinates relative to the origin of the parent quadtree + // node, in mas units. + uint32 dx; + uint32 dy; + // Magnitudes in 0.001 mag units, encoded as (mag + 1.5)*1000. + uint16 mag_V; + uint16 mag_B; + uint16 mag_g; + uint16 mag_r; + uint16 mag_i; + // Magnitude uncertainties in 0.001 mag units. + uint16 err_V; + uint16 err_B; + uint16 err_g; + uint16 err_r; + uint16 err_i; + // Right ascension correction for high declinations, in 0.1 mas units. + int16 dra; + // Data availability and quality flags. + uint16 flags; + }; + + /* + * Encoded DR10 star record (36 bytes uncompressed). + */ + struct EncodedDR10StarData + { + // Projected coordinates relative to the origin of the parent quadtree + // node, in mas units. + uint32 dx; + uint32 dy; + // Magnitudes in 0.001 mag units, encoded as (mag + 1.5)*1000. + uint16 mag_V; + uint16 mag_B; + // uint16 mag_u; + uint16 mag_g; + uint16 mag_r; + uint16 mag_i; + uint16 mag_z_s; + // uint16 mag_Y; + // Magnitude uncertainties in 0.001 mag units. + uint16 err_V; + uint16 err_B; + // uint16 err_u; + uint16 err_g; + uint16 err_r; + uint16 err_i; + uint16 err_z_s; + // uint16 err_Y; + // Right ascension correction for high declinations, in 0.1 mas units. + int16 dra; + // Data availability and quality flags. + uint16 flags; + }; + +#pragma pack(pop) + + void LoadData( void* block, uint64 offset, uint32 size, void* searchData ) const override + { + ElapsedTime T; + StarDatabaseFile::LoadData( block, offset, size, searchData ); + reinterpret_cast( searchData )->timeIO += T(); + ++reinterpret_cast( searchData )->countIO; + } + + void Uncompress( ByteArray& block, uint32 uncompressedSize, void* searchData ) const override + { + ElapsedTime T; + StarDatabaseFile::Uncompress( block, uncompressedSize, searchData ); + reinterpret_cast( searchData )->timeUncompress += T(); + } + + void GetEncodedData( const ByteArray& data, const XPSD::IndexTree& tree, const XPSD::IndexNode& node, void* searchData ) const override + { + (this->*m_decoder)( data, tree, node, searchData ); + } + + void GetEncodedDR9Data( const ByteArray& data, const XPSD::IndexTree& tree, const XPSD::IndexNode& node, void* searchData ) const + { + ElapsedTime T; + APASSSearchData* search = reinterpret_cast( searchData ); + double r = Rad( search->radius ); + const EncodedDR9StarData* S = reinterpret_cast( data.Begin() ); + int count = int( data.Size() / sizeof( EncodedDR9StarData ) ); + int matched = 0; + for ( int i = 0; i < count; ++i, ++S ) + if ( search->requiredFlags == 0 || (S->flags & search->requiredFlags) == search->requiredFlags ) + if ( search->inclusionFlags == 0 || (S->flags & search->inclusionFlags) != 0 ) + if ( search->exclusionFlags == 0 || (S->flags & search->exclusionFlags) == 0 ) + { + float mag_V = 0.001*S->mag_V - 1.5; + if ( mag_V >= search->magnitudeLow ) + if ( mag_V <= search->magnitudeHigh ) + { + APASSStarData star; + double x = node.x0 + double( S->dx )/3600/1000; + double y = node.y0 + double( S->dy )/3600/1000; + tree.Unproject( star.ra, star.dec, x, y ); + if ( unlikely( S->dra != 0 ) ) + { + star.ra += double( S->dra )/3600/1000/10; + if ( star.ra < 0 ) + star.ra += 360; + else if ( star.ra >= 360 ) + star.ra -= 360; + } + if ( Distance( search->centerRA, search->centerDec, star.ra, star.dec ) < r ) + { + if ( search->stars.Length() < size_type( search->sourceLimit ) ) + { + star.mag_V = mag_V; + star.mag_B = 0.001*S->mag_B - 1.5; + star.mag_g = 0.001*S->mag_g - 1.5; + star.mag_r = 0.001*S->mag_r - 1.5; + star.mag_i = 0.001*S->mag_i - 1.5; + star.err_V = 0.001*S->err_V; + star.err_B = 0.001*S->err_B; + star.err_g = 0.001*S->err_g; + star.err_r = 0.001*S->err_r; + star.err_i = 0.001*S->err_i; + star.flags = S->flags; + search->stars << star; + } + else + ++search->excessCount; + ++matched; + } + } + } + + search->rejectCount += count - matched; + search->timeDecode += T(); + } + + void GetEncodedDR10Data( const ByteArray& data, const XPSD::IndexTree& tree, const XPSD::IndexNode& node, void* searchData ) const + { + ElapsedTime T; + APASSSearchData* search = reinterpret_cast( searchData ); + double r = Rad( search->radius ); + const EncodedDR10StarData* S = reinterpret_cast( data.Begin() ); + int count = int( data.Size() / sizeof( EncodedDR10StarData ) ); + int matched = 0; + for ( int i = 0; i < count; ++i, ++S ) + if ( search->requiredFlags == 0 || (S->flags & search->requiredFlags) == search->requiredFlags ) + if ( search->inclusionFlags == 0 || (S->flags & search->inclusionFlags) != 0 ) + if ( search->exclusionFlags == 0 || (S->flags & search->exclusionFlags) == 0 ) + { + float mag_V = 0.001*S->mag_V - 1.5; + if ( mag_V >= search->magnitudeLow ) + if ( mag_V <= search->magnitudeHigh ) + { + APASSStarData star; + double x = node.x0 + double( S->dx )/3600/1000; + double y = node.y0 + double( S->dy )/3600/1000; + tree.Unproject( star.ra, star.dec, x, y ); + if ( unlikely( S->dra != 0 ) ) + { + star.ra += double( S->dra )/3600/1000/10; + if ( star.ra < 0 ) + star.ra += 360; + else if ( star.ra >= 360 ) + star.ra -= 360; + } + if ( Distance( search->centerRA, search->centerDec, star.ra, star.dec ) < r ) + { + if ( search->stars.Length() < size_type( search->sourceLimit ) ) + { + star.mag_V = mag_V; + star.mag_B = 0.001*S->mag_B - 1.5; + // star.mag_u = 0.001*S->mag_u - 1.5; + star.mag_g = 0.001*S->mag_g - 1.5; + star.mag_r = 0.001*S->mag_r - 1.5; + star.mag_i = 0.001*S->mag_i - 1.5; + star.mag_z_s = 0.001*S->mag_z_s - 1.5; + // star.mag_Y = 0.001*S->mag_Y - 1.5; + star.err_V = 0.001*S->err_V; + star.err_B = 0.001*S->err_B; + // star.err_u = 0.001*S->err_u; + star.err_g = 0.001*S->err_g; + star.err_r = 0.001*S->err_r; + star.err_i = 0.001*S->err_i; + star.err_z_s = 0.001*S->err_z_s; + // star.err_Y = 0.001*S->err_Y; + star.flags = S->flags; + search->stars << star; + } + else + ++search->excessCount; + ++matched; + } + } + } + + search->rejectCount += count - matched; + search->timeDecode += T(); + } + + friend class APASSDR9DatabaseFileGenerator; + friend class APASSDR10DatabaseFileGenerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_APASSDatabaseFile_h + +// ---------------------------------------------------------------------------- +// EOF pcl/APASSDatabaseFile.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ATrousWaveletTransform.h b/3rdparty/include/pcl/ATrousWaveletTransform.h new file mode 100644 index 0000000..d68100f --- /dev/null +++ b/3rdparty/include/pcl/ATrousWaveletTransform.h @@ -0,0 +1,686 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ATrousWaveletTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ATrousWaveletTransform_h +#define __PCL_ATrousWaveletTransform_h + +/// \file pcl/ATrousWaveletTransform.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class InterlacedTransformation; + +/*! + * \class ATrousWaveletTransform + * \brief Discrete isotropic à trous wavelet transform. + * + * The Isotropic Undecimated Wavelet Transform, also known as starlet transform + * or à trous (with holes) wavelet transform, produces a coefficient + * set {w1,w2,...,wN,cN}, where each wj is a set of zero-mean coefficients at + * scale j, which we call detail layer, and cN is a large-scale + * smoothed residual, which we call residual layer. Each layer has the + * same dimensions as the input image, hence the transform is redundant. + * + * The wavelet function in the à trous algorithm is the difference between the + * values of a scaling function F at two successive scales. Using the dyadic + * scaling sequence, the wavelet function can be represented as + * (F(x) - F(x/2)). The scaling function F can be any positive low-pass filter. + * + * The reconstruction algorithm consists of the sum of all wj detail layers + * for 1 <= j <= N, plus the residual layer cN. + * + * \b References + * + * \li Jean-Luc Starck, Fionn Murtagh, Mario Bertero, Handbook of + * Mathematical Methods in Imaging, ch. 34, Starlet Transform in + * Astronomical Data Processing, Springer, 2011, pp. 1489-1531. + * + * \li Starck, J.-L., Murtagh, F. and J. Fadili, A., Sparse %Image and + * Signal Processing: Wavelets, Curvelets, Morphological Diversity, + * Cambridge University Press, 2010. + * + * \li Starck, J.-L., Murtagh, F., Astronomical %Image and Data + * Analysis, Springer, 2002. + * + * \li Jean-Luc Starck, Fionn Murtagh, Albert Bijaoui, %Image processing + * and Data Analysis: The Multiscale Approach, Cambridge University Press, + * 1998. + * + * \b Implementation + * + * In our implementation, each layer in a wavelet transform is a floating-point + * image with the same dimensions as the transformed image. Layers are indexed + * from 0 to N. Layers at indexes from 0 to N-1 are detail layers, whose + * elements are actually wavelet difference coefficients. Pixels in a detail + * layer can be negative, zero or positive real values. + * + * The last layer, at index N, is the large-scale residual layer. Pixels in the + * residual layer image can only be positive or zero real values. + * + * \ingroup multiscale_transforms + * + * \note The StarletTransform class is an alias for %ATrousWaveletTransform. + */ +class PCL_CLASS ATrousWaveletTransform : public RedundantMultiscaleTransform +{ +public: + + /*! + * Represents a wavelet layer. + */ + typedef RedundantMultiscaleTransform::layer layer; + + /*! + * Represents a set of wavelet layers, or wavelet transform. + */ + typedef RedundantMultiscaleTransform::transform transform; + + /*! + * Represents a set of layer enabled/disabled states. + */ + typedef RedundantMultiscaleTransform::layer_state_set layer_state_set; + + /*! + * \brief The scaling function of a wavelet transform. + * + * A wavelet scaling function can be either a non-separable kernel filter, + * implemented as the KernelFilter class, or a separable filter implemented + * as SeparableFilter. + * + * Separable filters should be better in terms of performance, since + * separable convolution has O(N) complexity, as opposed to O(N^2) for + * non-separable convolution. However, in current PCL versions separable + * convolutions are only faster for relatively large filter sizes as a resut + * of vectorization with SIMD processor instructions. See the + * SeparableConvolution class and the \ref convolution_speed_limits "Helper + * Functions for Selection of Convolution Algorithms" section for more + * information. + * + * \sa KernelFilter, SeparableFilter + */ + struct WaveletScalingFunction + { + AutoPointer kernelFilter; //!< Non-separable kernel filter + AutoPointer separableFilter; //!< Separable filter + + /*! + * Default constructor. Constructs an uninitialized instance. + */ + WaveletScalingFunction() = default; + + /*! + * Non-separable filter constructor. The scaling function will own a + * duplicate of the specified kernel filter. + */ + WaveletScalingFunction( const KernelFilter& f ) + { + kernelFilter = f.Clone(); + PCL_CHECK( !kernelFilter.IsNull() ) + } + + /*! + * Separable filter constructor. The scaling function will own a + * duplicate of the specified separable filter. + */ + WaveletScalingFunction( const SeparableFilter& f ) + { + separableFilter = f.Clone(); + PCL_CHECK( !separableFilter.IsNull() ) + } + + /*! + * Copy constructor. The scaling function will own a duplicate of the + * kernel or separable filter in the source object. + */ + WaveletScalingFunction( const WaveletScalingFunction& s ) + { + if ( !s.kernelFilter.IsNull() ) + { + kernelFilter = s.kernelFilter->Clone(); + PCL_CHECK( !kernelFilter.IsNull() ) + } + if ( !s.separableFilter.IsNull() ) + { + separableFilter = s.separableFilter->Clone(); + PCL_CHECK( !separableFilter.IsNull() ) + } + } + + /*! + * Move constructor. + */ + WaveletScalingFunction( WaveletScalingFunction&& s ) + : kernelFilter( s.kernelFilter ) + , separableFilter( s.separableFilter ) + { + } + + /*! + * Destroys this scaling function object. Destroys and deallocates the + * existing kernel or separable filter in this object. + */ + virtual ~WaveletScalingFunction() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + WaveletScalingFunction& operator =( const WaveletScalingFunction& s ) + { + if ( s.kernelFilter.IsNull() ) + kernelFilter.Destroy(); + else + { + kernelFilter = s.kernelFilter->Clone(); + PCL_CHECK( !kernelFilter.IsNull() ) + } + + if ( s.separableFilter.IsNull() ) + separableFilter.Destroy(); + else + { + separableFilter = s.separableFilter->Clone(); + PCL_CHECK( !separableFilter.IsNull() ) + } + + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + WaveletScalingFunction& operator =( WaveletScalingFunction&& ) = default; + + /*! + * Returns true if this scaling function is a separable filter; false if + * it is an invalid or non-separable kernel filter. + */ + bool IsSeparable() const + { + return !separableFilter.IsNull() && !separableFilter->IsEmpty(); + } + + /*! + * Returns true if this scaling function is a non-separable kernel + * filter; false if it is an invalid or separable filter. + */ + bool IsNonseparable() const + { + return !kernelFilter.IsNull() && !kernelFilter->IsEmpty(); + } + + /*! + * Returns true iff this scaling function is valid, that is, if it owns a + * nonempty filter. + */ + bool IsValid() const + { + return IsSeparable() || IsNonseparable(); + } + + /*! + * Causes this scaling function to own a duplicate of the specified + * non-separable kernel filter. A previously existing filter is destroyed + * and deallocated. + */ + void Set( const KernelFilter& f ) + { + separableFilter.Destroy(); + kernelFilter = f.Clone(); + PCL_CHECK( !kernelFilter.IsNull() ) + } + + /*! + * Causes this scaling function to own a duplicate of the specified + * separable filter. A previously existing filter is destroyed and + * deallocated. + */ + void Set( const SeparableFilter& f ) + { + kernelFilter.Destroy(); + separableFilter = f.Clone(); + PCL_CHECK( !separableFilter.IsNull() ) + } + + /*! + * Destroys the kernel and/or separable filter(s) owned by this object, + * yielding an invalid instance. + */ + void Clear() + { + kernelFilter.Destroy(); + separableFilter.Destroy(); + } + + /*! + * Equality operator. Returns true only if this scaling function is equal + * to another instance. + */ + bool operator ==( const WaveletScalingFunction& other ) const + { + if ( !kernelFilter.IsNull() ) + return !other.kernelFilter.IsNull() && *kernelFilter == *other.kernelFilter; + if ( !separableFilter.IsNull() ) + return !other.separableFilter.IsNull() && *separableFilter == *other.separableFilter; + return other.kernelFilter.IsNull() && other.separableFilter.IsNull(); + } + }; + + /*! + * Default constructor. + * + * \note This constructor yields an uninitialized instance that cannot be + * used prior to initializing it with a reference to a filter object + * (either KernelFilter or SeparableFilter), which will be used as the + * scaling function of the wavelet transform. + */ + ATrousWaveletTransform() = default; + + /*! + * Constructs an %ATrousWaveletTransform instance using the specified + * scaling function. + * + * \param f A wavelet scaling function that can be either a non-separable + * filter (KernelFilter) or a separable filter (SeparableFilter). + * + * \param n Number of wavelet layers. The transform will consist of \a n + * wavelet layers plus a residual layer, i.e. n+1 total layers. + * + * \param d Scaling sequence. If \a d <= 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * wavelet layers and the dyadic scaling sequence). + */ + ATrousWaveletTransform( const WaveletScalingFunction& f, int n = 4, int d = 0 ) + : RedundantMultiscaleTransform( n, d ) + , m_scalingFunction( f ) + { + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Constructs an %ATrousWaveletTransform instance that uses a non-separable + * kernel filter as a scaling function. + * + * \param f Non-separable filter that will be used as the scaling + * function of the transform. Must be a positive, low-pass + * filter function. + * + * \param n Number of wavelet layers. The transform will consist of \a n + * wavelet layers plus a residual layer, i.e. n+1 total layers. + * + * \param d Scaling sequence. If \a d <= 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * wavelet layers and the dyadic scaling sequence). + */ + ATrousWaveletTransform( const KernelFilter& f, int n = 4, int d = 0 ) + : RedundantMultiscaleTransform( n, d ) + , m_scalingFunction( f ) + { + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Constructs an %ATrousWaveletTransform instance that uses a separable + * kernel filter as a scaling function. + * + * \param f Separable filter that will be used as the scaling function of + * the transform. Must be a positive, low-pass filter function. + * + * \param n Number of wavelet layers. The transform will consist of \a n + * wavelet layers plus a residual layer, i.e. n+1 total layers. + * + * \param d Scaling sequence. If \a d <= 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * wavelet layers and the dyadic scaling sequence). + */ + ATrousWaveletTransform( const SeparableFilter& f, int n = 4, int d = 0 ) + : RedundantMultiscaleTransform( n, d ) + , m_scalingFunction( f ) + { + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Copy constructor. + */ + ATrousWaveletTransform( const ATrousWaveletTransform& ) = default; + + /*! + * Move constructor. + */ + ATrousWaveletTransform( ATrousWaveletTransform&& ) = default; + + /*! + * Destroys this %ATrousWaveletTransform object. All existing wavelet layers + * and the internal scaling function filter object are destroyed and + * deallocated. + */ + virtual ~ATrousWaveletTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ATrousWaveletTransform& operator =( const ATrousWaveletTransform& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ATrousWaveletTransform& operator =( ATrousWaveletTransform&& ) = default; + + /*! + * Returns a reference to the (immutable) scaling function used by this + * wavelet transform. + */ + const WaveletScalingFunction& ScalingFunction() const + { + return m_scalingFunction; + } + + /*! + * Sets a new scaling function \a f for this wavelet transform. + * + * \note As a consequence of calling this member function, all existing + * wavelet layers in this transform are destroyed. + */ + void SetScalingFunction( const WaveletScalingFunction& f ) + { + DestroyLayers(); + m_scalingFunction = f; + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Sets a non-separable kernel filter as the scaling function \a f used by + * this wavelet transform. + * + * \note As a consequence of calling this member function, all existing + * wavelet layers in this transform are destroyed. + */ + void SetScalingFunction( const KernelFilter& f ) + { + DestroyLayers(); + m_scalingFunction.Set( f ); + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Sets a separable kernel filter as the scaling function \a f used by this + * wavelet transform. + * + * \note As a consequence of calling this member function, all existing + * wavelet layers in this transform are destroyed. + */ + void SetScalingFunction( const SeparableFilter& f ) + { + DestroyLayers(); + m_scalingFunction.Set( f ); + PCL_CHECK( m_scalingFunction.IsValid() ) + } + + /*! + * Estimation of the standard deviation of the noise, assuming a Gaussian + * noise distribution. This routine implements the k-sigma clipping noise + * estimation algorithm described by Starck et al. (see the references in + * the detailed documentation for this class). The algorithm is described + * for example in Astronomical %Image and Data Analysis, pp. 37-38. + * + * This routine can be used to provide an initial estimate to the more + * accurate multiresolution support noise estimation algorithm, + * implemented as the NoiseMRS() routine. When used with a relative error + * bound (see the \a eps parameter), this routine can easily yield noise + * estimates to within 1% accuracy. + * + * \param j Wavelet layer index (zero-based). The default index is 0. + * + * \param k Clipping multiplier in sigma units. The default value is 3. + * + * \param eps Fractional relative accuracy. If this parameter is greater + * than zero, the algorithm will iterate until the difference + * between two successive iterations is less than \a eps. The + * default value is 0.01, so this routine iterates to achieve an + * estimate to within 1% accuracy. + * + * \param n Maximum number of iterations. When \a eps is zero, this is + * the fixed number of iterations of the noise estimation + * algorithm. Three iterations usually give an estimate to + * within 5% accuracy. 5 or 6 iterations can provide 1% accuracy + * in most cases. When \a eps is greater than zero, this + * parameter works as a security limit to prevent too long + * execution times when convergence is slow (which shouldn't + * happen under normal conditions). The default value is 10. + * + * \param[out] N Pointer to a variable that will receive the total number + * of pixels tagged as noise during the noise evaluation + * process. This pointer can legally be \c nullptr, which is + * also the default value of this parameter. + * + * Returns the estimated standard deviation of the noise in the specified + * scale \a j of the wavelet transform after a relative \a eps accuracy has + * been reached or \a n sigma clipping iterations have been performed, + * whichever happens first. + * + * The returned value must be scaled by the standard deviation of the + * Gaussian noise at the specified wavelet scale. The scaling factor depends + * on the wavelet scaling function used to perform the wavelet decomposition + * and must be coherent with the transform performed by this object. + * + * If this %ATrousWaveletTransform object does not contain a valid wavelet + * transform, or if the specified wavelet layer has been deleted, this + * routine throws an Error exception. + */ + double NoiseKSigma( int j = 0, float k = 3, + float eps = 0.01, int n = 10, size_type* N = nullptr ) const; + + /*! + * Estimation of the standard deviation of the noise, assuming a Gaussian + * noise distribution, for a specified range of pixel values. + * + * This routine implements essentially the same algorithm as its unbounded + * counterpart: + * + * NoiseKSigma( int j, float k, float eps, int n, size_type* N ). + * + * The difference is that this version allows you to specify a valid range + * of pixel values with the \a low, \a high and \a image parameters. The + * standard deviation of the noise will only be computed for those pixels + * whose values in the specified \a image pertain to the range + * (low,high), that is, for every pixel with value \a v in + * \a image such that the condition \a low < \e v < \a high is true. + * + * The specified \a image must be compatible with the wavelet transform. In + * particular, the dimensions of \a image must be identical to those of the + * wavelet layers in this transform; otherwise an Error exception will be + * thrown. For selection of pixels within the specified range, only the + * currently selected channel in \a image will be taken into account. + * Normally, the specified \a image must be the same image that was used to + * compute the current wavelet decomposition in this object. + * + * For detailed information on the rest of parameters, the implemented + * algorithm, and special usage conditions for this routine, refer to the + * documentation for the unbounded version of this member function. + */ + double NoiseKSigma( int j, const ImageVariant& image, + float low = 0.00002F, float high = 0.99998F, + float k = 3, float eps = 0.01, int n = 10, size_type* N = nullptr ) const; + + /*! + * Estimation of the standard deviation of the Gaussian noise from the + * multiresolution support. This routine implements the iterative algorithm + * described by Jean-Luc Starck and Fionn Murtagh in their paper + * Automatic Noise Estimation from the Multiresolution Support + * (Publications of the Royal Astronomical Society of the Pacific, vol. 110, + * February 1998, pp. 193-199). + * + * \param image The original image. Normally this image should be the same + * image from which this wavelet transform has been + * calculated. + * + * \param sj Noise standard deviation at each wavelet scale for a + * Gaussian noise distribution with unit sigma. There must be + * at least NumberOfLayers() elements in the array pointed to + * by this parameter. + * + * \param sigma Initial estimate of the noise standard deviation in the + * image. The default value is zero. The best starting value + * is the result of the NoiseKSigma() routine. However, the + * noise estimate provided by NoiseKSigma() is relative to a + * particular wavelet layer, so it must be scaled as + * appropriate to make it coherent with the whole image. + * + * \param k Clipping multiplier in sigma units. The default value is 3. + * + * \param[out] N Pointer to a variable that will receive the total number + * of pixels tagged as noise during the noise evaluation + * process. This pointer can legally be \c nullptr, which is + * also the default value of this parameter. + * + * \param low Lower bound of the sampling range in the normalized [0,1] + * range. Pixel sample values less than or equal to \a low + * will be excluded from the noise evaluation process. The + * default value is 0.00002. + * + * \param high Upper bound of the sampling range in the normalized [0,1] + * range. Pixel sample values greater than or equal to + * \a high will be excluded from the noise evaluation + * process. The default value is 0.99998. + * + * Returns the estimated standard deviation of the noise from the + * multiresolution support, using all wavelet scales available. As long as + * successive noise estimates converge to a stable solution, this routine + * performs the necessary iterations until a relative fractional accuracy of + * 1e-4 is achieved. Normally this requires between 4 and 8 iterations, + * depending on the relation between the noise and significant structures in + * the image. + * + * If no convergence is achieved after a large number of iterations, this + * function returns zero and, if a nonzero N argument pointer is specified, + * sets *N = 0. This should never happen if this wavelet transform defines a + * reasonable number of wavelet layers (4 or 5 layers are recommended) and + * the passed parameters are valid and coherent with the wavelet transform. + * + * If this %ATrousWaveletTransform object does not contain a valid wavelet + * transform, if any wavelet layer has been deleted, or if the specified + * image doesn't have the same geometry as the wavelet layers in this + * transform, this routine throws an Error exception. + */ + double NoiseMRS( const ImageVariant& image, const float sj[], + double sigma = 0, float k = 3, size_type* N = nullptr, + float low = 0.00002F, float high = 0.99998F ) const; + +private: + + /* + * Wavelet scaling function. + */ + WaveletScalingFunction m_scalingFunction; + + /* + * Transform (decomposition) + */ + void Transform( const pcl::Image& ) override; + void Transform( const pcl::DImage& ) override; + void Transform( const pcl::ComplexImage& ) override; + void Transform( const pcl::DComplexImage& ) override; + void Transform( const pcl::UInt8Image& ) override; + void Transform( const pcl::UInt16Image& ) override; + void Transform( const pcl::UInt32Image& ) override; + + void ValidateScalingFunction() const; + + friend class ATWTDecomposition; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class pcl::StarletTransform + * \brief Starlet wavelet transform, a synonym for ATrousWaveletTransform. + * + * The isotropic stationary wavelet transform known as à trous wavelet + * transform since the early publications of Mallat, Starck and Murtagh in + * the 90's, is now known "officially" as starlet transform, at least + * since 2010's %Sparse %Image and %Signal %Processing book. + * + * \ingroup multiscale_transforms + */ +typedef ATrousWaveletTransform StarletTransform; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ATrousWaveletTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ATrousWaveletTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AbstractImage.h b/3rdparty/include/pcl/AbstractImage.h new file mode 100644 index 0000000..90c9fd2 --- /dev/null +++ b/3rdparty/include/pcl/AbstractImage.h @@ -0,0 +1,1428 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AbstractImage.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AbstractImage_h +#define __PCL_AbstractImage_h + +/// \file pcl/AbstractImage.h + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ +class SharedImage; +} +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_width m_geometry->width +#define m_height m_geometry->height +#define m_numberOfChannels m_geometry->numberOfChannels + +#define m_colorSpace m_color->colorSpace +#define m_RGBWS m_color->RGBWS + +// ---------------------------------------------------------------------------- + +/*! + * \class AbstractImage + * \brief Base class of all two-dimensional images in PCL. + * + * %AbstractImage encapsulates ImageGeometry and ImageColor into a single class + * employed as the root base class for all two-dimensional images in PCL. + * + * This class provides fundamental properties and functionality that are + * independent on the particular data types used to store and manage pixel + * samples. + * + * %AbstractImage also provides a simple selection mechanism consisting of a + * rectangular selection (also known as region of interest, or ROI), a + * channel range, and an anchor point. Image selections can be stored in a + * local stack for quick retrieval (see PushSelections() and PopSelections()). + * Note that for practical reasons, image selections have been implemented as + * \c mutable data members internally, so modifying selections is possible for + * immutable %AbstractImage instances. + * + * Finally, %AbstractImage provides function and data members to manage status + * monitoring of images. The status monitoring mechanism can be used to provide + * feedback to the user about the progress of a running process. Status + * monitoring is implemented through the StatusMonitor and StatusCallback + * classes. See the Status(), StatusCallback() and SetStatusCallback() member + * functions for more information. + * + * \sa ImageGeometry, ImageColor, GenericImage, ImageVariant + */ +class PCL_CLASS AbstractImage : public ImageGeometry, + public ImageColor, + public ParallelProcess +{ +public: + + /*! + * A type used to implement a stack of stored image selections. + */ + typedef Array selection_stack; + + /*! + * An enumerated type that represents the set of supported color spaces. + * Valid constants for this enumeration are defined in the ColorSpace + * namespace. + */ + typedef ImageColor::color_space color_space; + + /*! + * Virtual destructor. + */ + virtual ~AbstractImage() + { + } + + /*! + * Returns the number of nominal channels corresponding to the current color + * space of this image. + */ + int NumberOfNominalChannels() const noexcept + { + return ColorSpace::NumberOfNominalChannels( m_colorSpace ); + } + + /*! + * Returns the number of nominal samples in this image. This is equal to the + * area in square pixels multiplied by the number of nominal channels. + */ + size_type NumberOfNominalSamples() const noexcept + { + return NumberOfPixels() * NumberOfNominalChannels(); + } + + /*! + * Returns true iff this image has one or more alpha channels. + * + * Alpha channels are those in excess of nominal channels, e.g. a fourth + * channel in a RGB image, or a second channel in a grayscale image. + */ + bool HasAlphaChannels() const noexcept + { + PCL_PRECONDITION( NumberOfChannels() != 0 ) + return NumberOfChannels() > NumberOfNominalChannels(); + } + + /*! + * Returns the number of existing alpha channels in this image. + */ + int NumberOfAlphaChannels() const noexcept + { + PCL_PRECONDITION( NumberOfChannels() != 0 ) + return NumberOfChannels() - NumberOfNominalChannels(); + } + + /*! + * Returns the number of existing alpha samples in this image. The returned + * value is equal to the number of alpha channels multiplied by the area of + * the image in square pixels. + */ + size_type NumberOfAlphaSamples() const noexcept + { + return NumberOfPixels() * NumberOfAlphaChannels(); + } + + // ------------------------------------------------------------------------- + + /*! + * Selects a single channel. + * + * \param c Channel index, 0 ≤ \a c < \a n, where \a n is the total + * number of channels in this image, including alpha channels. + */ + void SelectChannel( int c ) const noexcept + { + PCL_PRECONDITION( 0 <= c && c < m_numberOfChannels ) + m_selected.channel = m_selected.lastChannel = c; + ValidateChannelRange(); + } + + /*! + * Returns the index of the currently selected channel. + * + * If the current channel selection includes more than one channel, this + * function returns the index of the first selected channel. + * + * This function is a convenience synonym for FirstSelectedChannel(). + */ + int SelectedChannel() const noexcept + { + return m_selected.channel; + } + + /*! + * Selects a range of channels by their channel indices. The selected range + * \e includes the two channels specified. + * + * \param c0 Index of the first channel to select. + * \param c1 Index of the last channel to select. + */ + void SelectChannelRange( int c0, int c1 ) const noexcept + { + PCL_PRECONDITION( 0 <= c0 && c0 < m_numberOfChannels ) + PCL_PRECONDITION( 0 <= c1 && c1 < m_numberOfChannels ) + m_selected.channel = c0; + m_selected.lastChannel = c1; + ValidateChannelRange(); + } + + /*! + * Sets the current channel range selection to include all nominal channels + * exclusively, excluding alpha channels. + */ + void SelectNominalChannels() const noexcept + { + m_selected.channel = 0; + m_selected.lastChannel = NumberOfNominalChannels()-1; + ValidateChannelRange(); + } + + /*! + * Sets the current channel range selection to include the existing alpha + * channels only, excluding the nominal channels. + * + * \note If this image has no alpha channels, this function selects the last + * nominal channel. The channel range selection cannot be empty by design. + */ + void SelectAlphaChannels() const noexcept + { + m_selected.channel = NumberOfNominalChannels(); + m_selected.lastChannel = m_numberOfChannels-1; + ValidateChannelRange(); + } + + /*! + * Resets the channel range selection to include all existing channels (all + * nominal and alpha channels) in this image. + */ + void ResetChannelRange() const noexcept + { + m_selected.channel = 0; + m_selected.lastChannel = pcl::Max( 0, m_numberOfChannels-1 ); + } + + /*! + * Returns the number of selected channels. + */ + int NumberOfSelectedChannels() const noexcept + { + return 1 + m_selected.lastChannel - m_selected.channel; + } + + /*! + * Returns the channel index of the first selected channel. + */ + int FirstSelectedChannel() const noexcept + { + return m_selected.channel; + } + + /*! + * Returns the channel index of the last selected channel. + */ + int LastSelectedChannel() const noexcept + { + return m_selected.lastChannel; + } + + /*! + * Copies the first and last channel indices of the current channel + * selection to the specified variables. + * + * \param[out] c0 Index of the first selected channel. + * \param[out] c1 Index of the last selected channel. + */ + void GetSelectedChannelRange( int& c0, int& c1 ) const noexcept + { + c0 = m_selected.channel; + c1 = m_selected.lastChannel; + } + + /*! + * Selects an anchor point by its separate image coordinates. + * + * \param x Horizontal coordinate of the new anchor point. + * \param y Vertical coordinate of the new anchor point. + */ + void SelectPoint( int x, int y ) const noexcept + { + m_selected.point.MoveTo( x, y ); + } + + /*! + * Selects a new anchor point \a p in image coordinates. + */ + void SelectPoint( const Point& p ) const noexcept + { + m_selected.point = p; + } + + /*! + * Resets the anchor point to the origin of image coordinates, i.e to x=y=0. + */ + void ResetPoint() const noexcept + { + m_selected.point = 0; + } + + /*! + * Returns the current anchor point. + */ + const Point& SelectedPoint() const noexcept + { + return m_selected.point; + } + + /*! + * Defines the current rectangular selection by its separate image + * coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical) of + * the new rectangular selection. + * + * \param x1,y1 Lower right corner coordinates (horizontal, vertical) of + * the new rectangular selection. + * + * The resulting selection is constrained to stay within the image + * boundaries. + */ + void SelectRectangle( int x0, int y0, int x1, int y1 ) const noexcept + { + m_selected.rectangle.Set( x0, y0, x1, y1 ); + Clip( m_selected.rectangle ); + } + + /*! + * Defines the current rectangular selection by its separate corner + * points in image coordinates. + * + * \param p0 Position of the upper left corner of the new selection. + * + * \param p1 Position of the lower right corner of the new selection. + */ + void SelectRectangle( const Point& p0, const Point& p1 ) const noexcept + { + SelectRectangle( p0.x, p0.y, p1.x, p1.y ); + } + + /*! + * Defines the current rectangular selection as the specified rectangle \a r + * in image coordinates. + */ + void SelectRectangle( const Rect& r ) const noexcept + { + SelectRectangle( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Resets the rectangular selection to include the entire image boundaries. + */ + void ResetSelection() const noexcept + { + m_selected.rectangle.Set( 0, 0, m_width, m_height ); + } + + /*! + * Returns true iff the current selection is empty, i.e. if its area is zero. + */ + bool IsEmptySelection() const noexcept + { + return m_selected.rectangle.IsPointOrLine(); + } + + /*! + * Returns true iff the current rectangular selection comprises the entire + * image. + */ + bool IsFullSelection() const noexcept + { + return m_selected.rectangle.x0 <= 0 && + m_selected.rectangle.y0 <= 0 && + m_selected.rectangle.x1 >= m_width && + m_selected.rectangle.y1 >= m_height; + } + + /*! + * Returns the current rectangular selection. + */ + const Rect& SelectedRectangle() const noexcept + { + return m_selected.rectangle; + } + + /*! + * Returns true if this image is completely selected; false if it is + * only partially selected. + * + * In a completely selected image, the current rectangular selection + * includes the whole image, and the current channel range selection + * comprises all existing channels, including nominal and alpha channels. + */ + bool IsCompletelySelected() const noexcept + { + return m_selected.channel == 0 && + m_selected.lastChannel >= m_numberOfChannels-1 && + m_selected.rectangle.x0 <= 0 && + m_selected.rectangle.y0 <= 0 && + m_selected.rectangle.x1 >= m_width && + m_selected.rectangle.y1 >= m_height; + } + + /*! + * Returns the number of selected pixels. This is the area in square pixels + * of the current selection rectangle. + */ + size_type NumberOfSelectedPixels() const noexcept + { + return size_type( m_selected.rectangle.Width() ) * size_type( m_selected.rectangle.Height() ); + // ### N.B. Rect::Area() cannot be used here because it performs a + // *signed* multiplication of two 32-bit signed integers. + //return m_selected.rectangle.Area(); + } + + /*! + * Returns the number of selected samples. This is the area in square pixels + * of the current selection rectangle multiplied by the number of selected + * channels. + */ + size_type NumberOfSelectedSamples() const noexcept + { + return NumberOfSelectedPixels()*size_type( NumberOfSelectedChannels() ); + } + + /*! + * Returns true iff range clipping is currently enabled for this image. + * + * When range clipping is enabled, pixel samples outside the current + * clipping range: + * + * ( RangeClipLow(), RangeClipHigh() ) + * + * are ignored by statistics calculation routines. Note that range bounds + * are always excluded, since the range is open on both sides. The clipping + * range is always defined in the normalized [0,1] range for all pixel + * sample data types; the necessary conversions are performed transparently. + * + * When range clipping is disabled, the clipping range is ignored and all + * pixel samples are considered for statistical calculations. + * + * To make it more flexible, range clipping can be enabled/disabled + * separately for the low and high bounds. + * + * The default clipping range is the normalized (0,1) range. Range clipping + * is disabled by default. + */ + bool IsRangeClippingEnabled() const noexcept + { + return m_selected.clippedLow || m_selected.clippedHigh; + } + + /*! + * Returns true iff range clipping is currently enabled for the low clipping + * bound. When this is true, pixel samples with values less than or equal to + * the low clipping bound (as reported by RangeClipLow() ) will be rejected + * for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + bool IsLowRangeClippingEnabled() const noexcept + { + return m_selected.clippedLow; + } + + /*! + * Returns true iff range clipping is currently enabled for the high + * clipping bound. When this is true, pixel samples with values greater than + * or equal to the high clipping bound (as reported by RangeClipHigh() ) + * will be rejected for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + bool IsHighRangeClippingEnabled() const noexcept + { + return m_selected.clippedHigh; + } + + /*! + * Enables range clippings for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void EnableRangeClipping( bool enableLow = true, bool enableHigh = true ) const noexcept + { + m_selected.clippedLow = enableLow; + m_selected.clippedHigh = enableHigh; + } + + /*! + * Disables range clippings for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void DisableRangeClipping( bool disableLow = true, bool disableHigh = true ) const noexcept + { + m_selected.clippedLow = !disableLow; + m_selected.clippedHigh = !disableHigh; + } + + /*! + * Returns the lower bound of the current clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + double RangeClipLow() const noexcept + { + return m_selected.clipLow; + } + + /*! + * Returns the upper bound of the current clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + double RangeClipHigh() const noexcept + { + return m_selected.clipHigh; + } + + /*! + * Sets the lower bound of the clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipLow( double clipLow ) const noexcept + { + m_selected.clipLow = clipLow; + if ( m_selected.clipHigh < m_selected.clipLow ) + pcl::Swap( m_selected.clipLow, m_selected.clipHigh ); + } + + /*! + * Sets the upper bound of the clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipHigh( double clipHigh ) const noexcept + { + m_selected.clipHigh = clipHigh; + if ( m_selected.clipHigh < m_selected.clipLow ) + pcl::Swap( m_selected.clipLow, m_selected.clipHigh ); + } + + /*! + * Sets the lower and upper bounds of the clipping range and enables range + * clipping (both low and high clipping bounds), in a single function call. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipping( double clipLow, double clipHigh ) const noexcept + { + if ( clipHigh < clipLow ) + pcl::Swap( clipLow, clipHigh ); + m_selected.clipLow = clipLow; + m_selected.clipHigh = clipHigh; + m_selected.clippedLow = m_selected.clippedHigh = true; + } + + /*! + * Resets the range clipping parameters: + * + * Clipping range lower bound = 0.0 + * Clipping range upper bound = 1.0 + * Range clipping disabled + */ + void ResetRangeClipping() const noexcept + { + m_selected.clipLow = 0; + m_selected.clipHigh = 1; + m_selected.clippedLow = m_selected.clippedHigh = false; + } + + /*! + * Resets all image selections to default values: + * + * \li All channels are selected, including nominal and alpha channels. + * \li The anchor point is located at {0,0}, that is the upper left corner. + * \li The rectangular selection is set to comprise the entire image. + * \li The clipping range is set to [0,1]. + * \li Range clipping is disabled. + * + * Calling this member function is equivalent to: + * + * \code + * ResetChannelRange(); + * ResetPoint(); + * ResetSelection(); + * ResetRangeClipping(); + * \endcode + */ + void ResetSelections() const noexcept + { + ResetChannelRange(); + ResetPoint(); + ResetSelection(); + ResetRangeClipping(); + } + + /*! + * Returns a reference to the internal ImageSelections object in this image. + */ + ImageSelections& Selections() const noexcept + { + return m_selected; + } + + /*! + * Saves the current selections (rectangular area, channel range, anchor + * point and range clipping), pushing them to the internal selection stack. + */ + void PushSelections() const + { + m_savedSelections.Append( m_selected ); + } + + /*! + * Restores and pops (removes) the current selections (rectangular area, + * channel range, anchor point and range clipping) from the internal + * selection stack. + * + * If no selections have been previously pushed to the internal selection + * stack, this function is ignored. + */ + void PopSelections() const + { + if ( CanPopSelections() ) + { + selection_stack::iterator i = m_savedSelections.ReverseBegin(); + m_selected = *i; + m_savedSelections.Remove( i ); + } + } + + /*! + * Returns true iff one or more selections have been pushed to the internal + * selection stack, that is, if the PopSelections() function can be called + * to restore them. + */ + bool CanPopSelections() const noexcept + { + return !m_savedSelections.IsEmpty(); + } + + /*! + * Interprets the coordinates of a rectangle as a parameter to define a + * pixel selection. + * + * \param[in,out] rect If this rectangle is empty (defining either a + * point or a line), this function sets it to the + * current rectangular selection in this image. If this + * rectangle is nonempty, this function constrains its + * coordinates to stay within image boundaries. + * + * Returns true iff the output rectangle is nonempty. + */ + bool ParseRect( Rect& rect ) const noexcept + { + if ( !rect.IsRect() ) + { + rect = m_selected.rectangle; + if ( !rect.IsRect() ) + return false; + } + if ( !Clip( rect ) ) + return false; + return true; + } + + /*! + * Interprets a channel index as a parameter to define a pixel sample + * selection. + * + * \param[in,out] channel If a negative channel index is specified, this + * parameter will be replaced with the currently + * selected channel index in this image. + * + * Returns true iff the output channel index is valid. + */ + bool ParseChannel( int& channel ) const noexcept + { + if ( channel < 0 ) + { + channel = m_selected.channel; + if ( channel < 0 ) + return false; + } + if ( channel >= m_numberOfChannels ) + return false; + + return true; + } + + /*! + * Interprets the coordinates of a rectangle and two channel indexes as + * parameters to define a pixel sample selection. + * + * \param[in,out] rect If this rectangle is empty (defining either a + * point or a line), this function sets it to the + * current rectangular selection in this image. If this + * rectangle is nonempty, this function constrains its + * coordinates to stay within image boundaries. + * + * \param[in,out] firstChannel If a negative channel index is specified, + * this parameter will be replaced with the first + * channel index of the current channel range selection + * in this image. + * + * \param[in,out] lastChannel If a negative channel index is specified, + * this parameter will be replaced with the last + * channel index of the current channel range selection + * in this image. + * + * Returns true iff the output rectangle is nonempty and the output channel + * range is valid. When true is returned, this function ensures that + * \a firstChannel ≤ \a lastChannel. + */ + bool ParseSelection( Rect& rect, int& firstChannel, int& lastChannel ) const noexcept + { + if ( !ParseRect( rect ) || !ParseChannel( firstChannel ) ) + return false; + + if ( lastChannel < 0 ) + { + lastChannel = m_selected.lastChannel; + if ( lastChannel < 0 ) + return false; + } + if ( lastChannel >= m_numberOfChannels ) + return false; + + if ( lastChannel < firstChannel ) + pcl::Swap( firstChannel, lastChannel ); + + return true; + } + + /*! + * Interprets the coordinates of a rectangle and one channel index as + * parameters to define a pixel sample selection. + * + * \param[in,out] rect If this rectangle is empty (defining either a + * point or a line), this function sets it to the + * current rectangular selection in this image. If this + * rectangle is nonempty, this function constrains its + * coordinates to stay within image boundaries. + * + * \param[in,out] channel If a negative channel index is specified, this + * parameter will be replaced with the currently + * selected channel index in this image. + * + * Returns true iff the output rectangle is nonempty and the output channel + * index is valid. + */ + bool ParseSelection( Rect& rect, int& channel ) const noexcept + { + return ParseRect( rect ) && ParseChannel( channel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Returns a reference to the status monitoring object associated with this + * image. + */ + StatusMonitor& Status() const noexcept + { + return m_status; + } + + /*! + * Returns the address of the status monitoring callback object currently + * selected for this image. + */ + pcl::StatusCallback* StatusCallback() const noexcept + { + return m_status.Callback(); + } + + /*! + * \deprecated This function has been deprecated. It is included in this + * version of PCL to keep existing code functional. Use StatusCallback() in + * newly produced code. + */ + pcl::StatusCallback* GetStatusCallback() const noexcept + { + return StatusCallback(); + } + + /*! + * Specifies the address of an object that will be used to perform status + * monitoring callbacks for this image. + */ + void SetStatusCallback( pcl::StatusCallback* callback ) const noexcept + { + m_status.SetCallback( callback ); + } + + /*! + * Returns the maximum number of threads that this image can use + * concurrently to process a set of items. + * + * \param count Number of processing units. A processing + * unit can be a single pixel, a row of pixels, or any suitable + * item, according to the task being performed by the caller. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of processors allowed, which takes + * precedence over the current limit set for this image (see the + * MaxProcessors() and SetMaxProcessors() member functions). If + * zero or a negative value is specified, it is ignored and the + * current MaxProcessors() limit is applied. + * + * \param overheadLimit Thread overhead limit in processing units. The + * function returns a maximum number of threads such that no + * thread would have to process less processing units than this + * value. The default overhead limit is 16 processing units. + * + * This function takes into account if parallel processing is currently + * enabled for this image, as well as the maximum number of processors + * allowed for the calling process. + * + * \sa Thread::NumberOfThreads() + */ + int NumberOfThreads( size_type count, int maxProcessors = 0, size_type overheadLimit = 16u ) const noexcept + { + return m_parallel ? pcl::Min( (maxProcessors > 0) ? maxProcessors : m_maxProcessors, + Thread::NumberOfThreads( count, overheadLimit ) ) : 1; + } + + /*! + * Returns the maximum number of threads that this image can use + * concurrently to process a set of pixel rows. + * + * \param rowCount Number of pixel rows to be processed. If zero or + * a negative value is specified, the height of the image in + * pixels will be used. The default value is zero. + * + * \param rowWidth Width in pixels of the ROI being processed. If + * zero or a negative value is specified, the width of the image + * in pixels is used. The default value is zero. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of processors allowed, which takes + * precedence over the current limit set for this image (see the + * MaxProcessors() and SetMaxProcessors() member functions). If + * zero or a negative value is specified, it is ignored and the + * current MaxProcessors() limit is applied. The default value + * is zero. + * + * \param overheadLimitPx Thread overhead limit in pixels. The function + * will calculate the minimum number of pixel rows that a single + * thread can process, based on this value and on the specified + * \a rowWidth (or the image's width if zero is passed for that + * parameter). The default overhead limit is 1024 pixels. + * + * This function takes into account if parallel processing is currently + * enabled for this image, as well as the maximum number of processors + * allowed for the calling process. + * + * \sa NumberOfThreads(), Thread::NumberOfThreads() + */ + int NumberOfThreadsForRows( int rowCount = 0, int rowWidth = 0, int maxProcessors = 0, size_type overheadLimitPx = 1024u ) const noexcept + { + return NumberOfThreads( (rowCount > 0) ? rowCount : Height(), + maxProcessors, + pcl::Max( size_type( 1 ), size_type( overheadLimitPx/((rowWidth > 0) ? rowWidth : Width()) ) ) ); + } + + /*! + * Returns a list of per-thread counts optimized for parallel processing of + * a set of pixel rows. + * + * \param rowCount Number of pixel rows to be processed. If zero or + * a negative value is specified, the height of the image in + * pixels will be used. The default value is zero. + * + * \param rowWidth Width in pixels of the ROI being processed. If + * zero or a negative value is specified, the width of the image + * in pixels is used. The default value is zero. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of processors allowed, which takes + * precedence over the current limit set for this image (see the + * MaxProcessors() and SetMaxProcessors() member functions). If + * zero or a negative value is specified, it is ignored and the + * current MaxProcessors() limit is applied. The default value + * is zero. + * + * \param overheadLimitPx Thread overhead limit in pixels. The function + * will calculate the minimum number of pixel rows that a single + * thread can process, based on this value and on the specified + * \a rowWidth (or the image's width if zero is passed for that + * parameter). The default overhead limit is 1024 pixels. + * + * This function takes into account if parallel processing is currently + * enabled for this image, as well as the maximum number of processors + * allowed for the calling process. + * + * This function returns a dynamic array of unsigned integers, where each + * element is the number of pixel rows that the corresponding thread should + * process in order to make an optimal usage of the processor resources + * currently available. The length of the returned array is the maximum + * number of threads that the calling process should execute concurrently to + * process the specified number of pixel rows, with the specified overhead + * limit and maximum number of processors. + * + * \sa Thread::OptimalThreadLoads() + */ + Array OptimalThreadRows( int rowCount = 0, int rowWidth = 0, int maxProcessors = 0, size_type overheadLimitPx = 1024u ) const noexcept + { + return Thread::OptimalThreadLoads( (rowCount > 0) ? rowCount : Height(), + pcl::Max( size_type( 1 ), size_type( overheadLimitPx/((rowWidth > 0) ? rowWidth : Width()) ) ), + m_parallel ? ((maxProcessors > 0) ? maxProcessors : m_maxProcessors) : 1 ); + } + + // ------------------------------------------------------------------------- + + /*! + * \struct pcl::AbstractImage::ThreadData + * \brief Thread synchronization data for status monitoring of parallel + * image processing tasks. + * + * The %ThreadData structure provides the required objects to synchronize + * the status monitoring task for a set of running threads. An instance of + * %ThreadData (or of a derived class) can be used along with the + * AbstractImage::RunThreads() function to run a set of threads with + * synchronized monitoring and task abortion. + */ + struct ThreadData + { + mutable StatusMonitor status; //!< %Status monitoring object. + mutable Mutex mutex; //!< Mutual exclusion for synchronized thread access. + mutable size_type count = 0; //!< current monitoring count. + size_type total = 0; //!< Total monitoring count. + size_type numThreads = 0; //!< Number of concurrent threads being executed (set by RunThreads()). + + /*! + * Constructs a default %ThreadData object. + */ + ThreadData() = default; + + /*! + * Constructs a %ThreadData object with a copy of the current status + * monitor of the specified \a image, and the specified total monitoring + * count \a N. + * + * If a zero count \a N is specified, the monitor will be initialized as + * an \e unbounded monitor. See the StatusMonitor::Initialize() member + * function for more information. + */ + ThreadData( const AbstractImage& image, size_type N ) + : status( image.Status() ) + , total( N ) + { + } + + /*! + * Constructs a %ThreadData object with a copy of the specified status + * monitor, and the specified total monitoring count \a N. + * + * If a zero count \a N is specified, the monitor will be initialized as + * an \e unbounded monitor. See the StatusMonitor::Initialize() member + * function for more information. + */ + ThreadData( const StatusMonitor& a_status, size_type N ) + : status( a_status ) + , total( N ) + { + } + }; + + /*! + * Runs a set of threads with synchronized status monitoring and task + * abortion. + * + * \param threads Reference to a ReferenceArray container of threads. + * %ReferenceArray contains pointers to objects and allows + * direct iteration and access by reference. It cannot + * contain null pointers. Each %ReferenceArray element + * must be an instance of a derived class of Thread, where + * a reimplemented Thread::Run() member function should + * perform the required parallel processing. + * + * \param data Reference to a ThreadData object for synchronization. + * + * \param useAffinity If (1) this parameter is true, (2) the \a threads + * array contains two or more threads, and (3) this + * function is being called from the root thread (see + * Thread::IsRootThread()), then each thread will be run + * with its affinity set to a single processor (on systems + * that support thread processor affinity). If one or more + * of the three conditions above is false, the thread(s) + * will be run without forcing their processor affinities. + * + * When the \a threads array contains more than one thread, this static + * member function launches the threads in sequence and waits until all + * threads have finished execution. While the threads are running, the + * \c status member of ThreadData is incremented regularly to perform the + * process monitoring task. This also ensures that the graphical interface + * remains responsive during the whole process. + * + * When the \a threads array contains just one thread, this member function + * simply calls the Thread::Run() member function for the unique thread in + * the array, so no additional parallel execution is performed in the + * single-threaded case. If the reimplemented Thread::Run() member function + * uses standard PCL macros to perform the thread monitoring task (see the + * INIT_THREAD_MONITOR() and UPDATE_THREAD_MONITOR() macros), all possible + * situations will be handled correctly and automatically. + * + * For normal execution of multiple concurrent threads with maximum + * performance, the \a useAffinity parameter should be true in order to + * minimize cache invalidations due to processor reassignments of running + * threads. However, there are cases where forcing processor affinities can + * be counterproductive. An example is real-time previewing of intensive + * processes requiring continuous GUI updates. In these cases, disabling + * processor affinity can help to keep the GUI responsive with the required + * granularity. + * + * The threads can be aborted asynchronously with the standard + * Thread::Abort() mechanism, or through StatusMonitor/StatusCallback. If + * one or more threads are aborted, this function destroys all the threads + * by calling ReferenceArray::Destroy(), and then throws a ProcessAborted + * exception. In the single-threaded case, if the reimplemented + * Thread::Run() member function throws an exception, the array is also + * destroyed and the exception is thrown. Otherwise, if all threads complete + * execution normally, the \a threads array is left intact and the function + * returns. The caller is then responsible for destroying the threads when + * appropriate. + * + * \warning For parallel execution of two or more threads, do not call this + * function from a high-priority thread. Doing so can lead to a significant + * performance loss because this function will consume too much processing + * time just for process monitoring. In general, you should call this + * function from normal priority threads. + */ + template + static void RunThreads( ReferenceArray& threads, ThreadData& data, bool useAffinity = true ) + { + if ( threads.IsEmpty() ) + return; + + data.numThreads = threads.Length(); + if ( data.numThreads == 1 ) + { + try + { + threads[0].Run(); + return; + } + catch ( ... ) + { + threads.Destroy(); + throw; + } + } + + if ( useAffinity ) + if ( !Thread::IsRootThread() ) + useAffinity = false; + + { + int n = 0; + for ( thread& t : threads ) + t.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + } + + uint32 waitTime = StatusMonitor::RefreshRate() >> 1; + waitTime += waitTime >> 2; // waitTime = 0.625 * StatusMonitor::RefreshRate() + + for ( size_type lastCount = 0; ; ) + { + for ( typename ReferenceArray::iterator i = threads.Begin(); ; ) + { + if ( !i->Wait( waitTime ) ) + break; + + if ( ++i == threads.End() ) + { + if ( data.total > 0 ) + data.status += data.total - lastCount; + return; + } + } + + if ( data.mutex.TryLock() ) + { + try + { + if ( data.total > 0 ) + { + data.status += data.count - lastCount; + lastCount = data.count; + } + else + ++data.status; + + data.mutex.Unlock(); + } + catch ( ... ) + { + data.mutex.Unlock(); + for ( thread& t : threads ) + t.Abort(); + for ( thread& t : threads ) + t.Wait(); + threads.Destroy(); + throw ProcessAborted(); + } + } + } + } + +protected: + + mutable ImageSelections m_selected; + mutable selection_stack m_savedSelections; + mutable StatusMonitor m_status; + + AbstractImage() = default; + + AbstractImage( const AbstractImage& ) = default; + + AbstractImage& operator =( const AbstractImage& ) = default; + + void Swap( AbstractImage& image ) noexcept + { + ImageGeometry::Swap( image ); + ImageColor::Swap( image ); + ParallelProcess::Swap( image ); + pcl::Swap( m_selected, image.m_selected ); + pcl::Swap( m_savedSelections, image.m_savedSelections ); + pcl::Swap( m_status, image.m_status ); + } + + void ValidateChannelRange() const noexcept + { + if ( m_numberOfChannels > 0 ) + { + if ( m_selected.channel < 0 ) + m_selected.channel = 0; + else if ( m_selected.channel >= m_numberOfChannels ) + m_selected.channel = m_numberOfChannels-1; + + if ( m_selected.lastChannel < 0 ) + m_selected.lastChannel = 0; + else if ( m_selected.lastChannel >= m_numberOfChannels ) + m_selected.lastChannel = m_numberOfChannels-1; + + if ( m_selected.lastChannel < m_selected.channel ) + pcl::Swap( m_selected.channel, m_selected.lastChannel ); + } + else + { + m_selected.channel = m_selected.lastChannel = 0; + } + } + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + friend class pi::SharedImage; +#endif +}; + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_numberOfChannels +#undef m_colorSpace +#undef m_RGBWS + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup thread_monitoring_macros Helper Macros for Synchronized Status \ + * Monitoring of Image Processing Threads + */ + +/*! + * \def INIT_THREAD_MONITOR() + * \brief Declares and initializes local variables used for synchronization of + * thread status monitoring. + * \ingroup thread_monitoring_macros + * + * This macro is intended to be used at the beginning of a reimplemented + * Thread::Run() member function. It declares and initializes some counters + * required to update a status monitoring count with thread synchronization in + * the UPDATE_THREAD_MONITOR macro. + * + * For an example of code using these macros, see UPDATE_THREAD_MONITOR(). + */ +#define INIT_THREAD_MONITOR() \ + size_type ___n___ = 0, ___n1___ = 0; + +/*! + * \def UPDATE_THREAD_MONITOR() + * \brief Synchronized status monitoring of a set of image processing threads. + * \ingroup thread_monitoring_macros + * + * \param N Number of accumulated monitoring counts before performing a + * a synchronized update of the ThreadData monitoring count. A + * larger value will reduce the frequency of monitor updates. A + * value of 64K (65536), equivalent to the number of pixels in a + * square of 256x256 pixels, is quite appropriate for threads that + * process individual pixels. + * + * This macro increments a status monitoring count in a ThreadData member of an + * image processing thread, with thread synchronization. It must be used within + * a reimplemented Thread::Run() member function. + * + * The thread class where this macro is used must have a data member declared + * as follows: + * + * \code AbstractImage::ThreadData& m_data; \endcode + * + * where AbstractImage::ThreadData can be replaced with a suitable derived + * class, e.g. when the thread requires additional data items. + * + * The \c m_data member is a reference to a structure providing the necessary + * objects to perform the synchronized status monitoring task for a set of + * concurrent threads. For more information on synchronized thread monitoring, + * see the AbstractImage::RunThreads() member function. + * + * To use this macro, the INIT_THREAD_MONITOR macro must also be used at the + * begining of the reimplemented Thread::Run() function. + * + * Here is a brief example pseudocode: + * + * \code + * class FooThreadData : public AbstractImage::ThreadData + * { + * ... constructor and additional data members here + * }; + * + * class FooThread : public Thread + * { + * public: + * + * ... constructor and other member functions here + * + * void Run() override + * { + * INIT_THREAD_MONITOR() + * + * for ( int i = m_startRow, i < m_endRow; ++i ) + * { + * for ( int j = 0; j < width; ++j ) + * { + * ... process a single pixel here + * + * // Update monitor every 64K processed pixels. + * UPDATE_THREAD_MONITOR( 65536 ) + * } + * } + * } + * + * private: + * + * FooThreadData& m_data; + * int m_startRow; + * int m_endRow; + * ... other data members here + * }; + * + * ... the code that initializes and runs the threads: + * + * FooThreadData data; + * ... initialize thread data here + * + * ReferenceArray threads; + * ... create and construct the threads here + * + * AbstractImage::RunThreads( threads, data ); + * threads.Destroy(); + * \endcode + * + * For a similar macro that allows incrementing the status monitor by steps + * larger than one unit, see UPDATE_THREAD_MONITOR_CHUNK(). + */ +#define UPDATE_THREAD_MONITOR( N ) \ + if ( ++___n1___ == (N) ) \ + { \ + if ( this->m_data.numThreads > 1 ) \ + { \ + if ( this->TryIsAborted() ) \ + return; \ + ___n___ += (N); \ + if ( this->m_data.total > 0 ) \ + if ( this->m_data.mutex.TryLock() ) \ + { \ + this->m_data.count += ___n___; \ + this->m_data.mutex.Unlock(); \ + ___n___ = 0; \ + } \ + } \ + else \ + { \ + if ( this->m_data.total > 0 ) \ + this->m_data.status += (N); \ + else \ + ++this->m_data.status; \ + } \ + ___n1___ = 0; \ + } + +/*! + * \def UPDATE_THREAD_MONITOR_CHUNK() + * \brief Synchronized status monitoring of a set of image processing threads. + * \ingroup thread_monitoring_macros + * + * This macro is identical to UPDATE_THREAD_MONITOR(), but it updates the + * status monitoring count by successive steps of the specified \a chunkSize. + * + * Typically, this macro is used in situations where the status monitor cannot + * be incremented by single units, due to the complexity of the monitored code + * or to excessive overhead of monitoring count. The difference between this + * macro and %UPDATE_THREAD_MONITOR() can be easily understood with the + * following two examples. In these examples, we show a reimplemented + * Thread::Run() member function in an image processing thread: + * + * Example of code using %UPDATE_THREAD_MONITOR_CHUNK(): + * + * \code + * void Run() override + * { + * INIT_THREAD_MONITOR() + * + * for ( int i = m_startRow, i < m_endRow; ++i ) + * { + * for ( int j = 0; j < width; ++j ) + * { + * ... process a row of pixels here. + * } + * + * // Update every 64K processed pixels, once for each processed row. + * UPDATE_THREAD_MONITOR_CHUNK( 65536, width ) + * } + * } + * \endcode + * + * Example of code using %UPDATE_THREAD_MONITOR(): + * + * \code + * void Run() override + * { + * INIT_THREAD_MONITOR() + * + * for ( int i = m_startRow, i < m_endRow; ++i ) + * { + * for ( int j = 0; j < width; ++j ) + * { + * ... process a single pixel here. + * + * // Update monitor every 64K processed pixels. + * UPDATE_THREAD_MONITOR( 65536 ) + * } + * } + * } + * \endcode + */ +#define UPDATE_THREAD_MONITOR_CHUNK( N, chunkSize ) \ + if ( (___n1___ += (chunkSize)) == (N) ) \ + { \ + if ( this->m_data.numThreads > 1 ) \ + { \ + if ( this->TryIsAborted() ) \ + return; \ + ___n___ += (N); \ + if ( this->m_data.total > 0 ) \ + if ( this->m_data.mutex.TryLock() ) \ + { \ + this->m_data.count += ___n___; \ + this->m_data.mutex.Unlock(); \ + ___n___ = 0; \ + } \ + } \ + else \ + { \ + if ( this->m_data.total > 0 ) \ + this->m_data.status += (N); \ + else \ + ++this->m_data.status; \ + } \ + ___n1___ = 0; \ + } + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AbstractImage_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AbstractImage.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Action.h b/3rdparty/include/pcl/Action.h new file mode 100644 index 0000000..72928f8 --- /dev/null +++ b/3rdparty/include/pcl/Action.h @@ -0,0 +1,586 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Action.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Action_h +#define __PCL_Action_h + +/// \file pcl/Action.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ActionInfo + * \brief Provides information about the current state of the core + * application's GUI to module-defined actions. + * + * This structure is passed to the Action::IsEnabled() virtual member function. + * See the description of Action::IsEnabled() for more information. + * + * \sa Action + */ +struct ActionInfo +{ + bool isImage : 1; //!< true if there is an active image window and it is not read-locked + bool isCurrentPreview : 1; //!< true if the active view is a preview + bool isColor : 1; //!< true if the active view is a color image; false if it is grayscale + int : 5; // reserved for future use, should be zero + uint8 bitsPerSample : 8; //!< number of bits per sample in the active view's image + bool isFloatSample : 1; //!< true if the active view's image is in floating-point format + bool hasPreviews : 1; //!< true if the active image window has one or more previews defined + bool hasMask : 1; //!< true if the active image window is masked + bool thereAreImages : 1; //!< true if there are one or more image windows currently open + int : 12; // reserved for future use, should be zero +}; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class Action + * \brief Client-side interface to a PixInsight module-defined action object. + * + * Module-defined actions manage integration of external processes and tools + * with the main menu and tool bars of the PixInsight core application. + * + * Integration of actions is governed by two main properties: menu item and + * tool bar. + * + * Menu Item + * + * This is a string indicating a menu item where an action will be integrated + * within the PixInsight's main menu structure. + * + * The menu item string describes a path on PixInsight's main menu structure. + * Multiple menu items can be specified, separated with the ">" character. + * + * If this parameter is an empty string, the newly created action won't be + * integrated with the main menu. This can be useful for actions that only + * respond to keyboard accelerators, or actions that only integrate with tool + * bars (see the Tool Bar section below). + * + * Integrating actions into existing top-level main menu items + * + * "Image >> Geometry > Rotate 180 degrees" + * "View > Memory Status" + * + * The above strings will integrate actions into existing top-level main menu + * items (Image and View, respectively). In the first example, a submenu + * entitled "Geometry" will be created under the Image top-level menu item, if + * it doesn't exist yet. The sequence '>>' can be used to insert a separator + * menu item, as has been done before "Geometry" in the example above. Then a + * new item "Rotate 180 degrees" will be created and associated to the + * corresponding action. Note that in this case the PixInsight core application + * decides where exactly new actions are inserted within existing menu items, + * applying different criteria for each menu. In general, in these cases new + * actions are inserted on a per-module basis, in strict order of creation. + * + * Creating custom top-level main menu items + * + * Custom main menu top-level entries can also be created. For example, the + * following menu item string: + * + * "MyTools > Color Tools > A better color saturation process" + * + * Will create a new custom "MyTools" top-level item in the main menu, if it + * doesn't already exist. Custom top-level main menu items are inserted after + * the standard Process menu item, in strict order of creation. Common sense + * and care must be observed when creating custom top-level menu items. If + * possible, it is always preferable to integrate actions into existing + * top-level items; one must be motivated by a really strong reason to create a + * custom menu. + * + * Tool Bar + * + * This is an optional parameter. This is the name of a tool bar where the + * action will be integrated. + * + * If this string is empty, the action will not be integrated in a tool bar. + * Otherwise, the string must be the name of a tool bar where a new tool button + * will be created and associated to the action. + * + * A standard tool bar name can be used (i.e. View, File, and so on). If the + * specified name does not correspond to an existing tool bar, a new, custom + * tool bar will be created, and a new tool button corresponding to this action + * will be added to it. + * + * The specified tool bar name can start with a ">" character to insert a tool + * bar separator (a vertical or horizontal line, depending on the tool bar's + * orientation) before the newly created tool button. + */ +class PCL_CLASS Action : public UIObject +{ +public: + + /*! + * Constructs a new %Action object. + * + * \param menuItem Specifies the menu item that will be associated with + * this action. + * + * \param iconSVGFile Path to an existing file in the local file system, + * which must store a valid SVG document defining the icon + * image that will be associated with this action. The SVG + * source code must be encoded in UTF-8. The icon will be + * used for menu items and tool bar buttons associated + * with this action. If this parameter is not specified, + * or if the specified SVG document does not exist, is not + * valid, or cannot be rendered, no icon will be used to + * represent this action. + * + * \param toolBar The name of a tool bar where this action will be + * integrated. If this parameter is not specified, the + * action will not be integrated in a tool bar. + * + * Automatic Resource Location + * + * The specified \a iconSVGFile string can be prefixed with the + * "@module_icons_dir/" special token to let the PixInsight core application + * load the corresponding SVG document automatically from the a standard + * distribution directory. See the documentation for + * MetaProcess::IconImageSVGFile() for complete information. + * + * To learn how the menu item and tool bar parameters work for actions, see + * the description of the Action class. + */ + Action( const String& menuItem, + const String& iconSVGFile = String(), const String& toolBar = String() ); + + /*! + * Constructs a new %Action object. + * + * \param menuItem Specifies the menu item that will be associated with + * this action. + * + * \param iconSVGsource The source code of a valid SVG document defining + * the icon image that will be associated with this + * action. The SVG source code must be encoded in UTF-8. + * The icon will be used for all menu items and tool bar + * buttons associated with this action. If this parameter + * is not specified, or if the specified SVG document is + * not valid or cannot be rendered, no icon will be used + * to represent this action. + * + * \param toolBar The name of a tool bar where this action will be + * integrated. If this parameter is not specified, the + * action will not be integrated in a tool bar. + * + * \note The unused third \c int parameter serves to distinguish this + * constructor from the other one that takes a file path argument. This is + * necessary because both String and IsoString can be constructed from + * literal \c const \c char* arguments. + * + * To learn how the menu item and tool bar parameters work for actions, see + * the description of the Action class. + */ + Action( const String& menuItem, + const IsoString& iconSVGSource, int, const String& toolBar = String() ); + +#ifdef __PCL_ACTION_DEPRECATED_CTOR + + /*! + * Constructs a new %Action object. + * + * \param menuItem Specifies the menu item that will be associated with + * this action. + * + * \param icon A Bitmap object representing the icon image that will + * be associated with this action. The icon will be used + * for menu items and tool bar buttons. If this parameter + * is not specified, no menu icon will be used and a + * default icon will be assigned automatically for tool + * bar buttons, if necessary. + * + * \param toolBar The name of a tool bar where this action will be + * integrated. If this parameter is not specified, the + * action will not be integrated in a tool bar. + * + * To learn how the menu item and tool bar parameters work for actions, see + * the description of the Action class. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use the constructors that define icon images + * in SVG format. Existing modules should also be refactored in the same way + * to support scalable icons. + */ + Action( const String& menuItem, + const Bitmap& icon, const String& toolBar = String() ); + +#endif // __PCL_ACTION_DEPRECATED_CTOR + + /*! + * Move constructor. + */ + Action( Action&& x ) : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys this %Action object. + * + * This destructor does not destroy the actual action object, which is part + * of the PixInsight core application. Only the managed alias object living + * in the caller module is destroyed. + */ + virtual ~Action() + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Action& operator =( Action&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since actions are unique objects, calling this member function has no + * effect. + */ + void EnsureUnique() override + { + } + + /*! + * Returns a reference to a null %Action instance. A null %Action does not + * correspond to an existing action in the PixInsight core application. + */ + static Action& Null(); + + /*! + * Returns the menu item where this action has been integrated in the main + * menu of the PixInsight core application. + * + * An action's menu item is a read-only property: its value can only be set + * with the constructor. In other words: Once an action has been created, + * its menu text can be freely changed, but it cannot be moved in the main + * menu structure. + * + * \sa MenuText() + */ + String MenuItem() const; + + /*! + * Returns the text of the menu item where this action has been integrated + * in the main menu of the PixInsight core application. + * + * \sa SetMenuText(), MenuItem() + */ + String MenuText() const; + + /*! + * Changes the text of the menu item where this action has been integrated + * in the main menu of the PixInsight core application. + * + * \param text A string representing the new menu text for this action + * object. + * + * \sa MenuText() + */ + void SetMenuText( const String& text ); + + /*! + * Returns the name of a tool bar where this action has been integrated in + * the PixInsight core application. + * + * Integration of actions with tool bars is optional. If this action has not + * been integrated in a tool bar, this function returns an empty string. + * + * An action's tool bar is a read-only property whose value can only be set + * with the constructor. + * + * \sa SetToolBar() + */ + String ToolBar() const; + + /*! + * Obtains the optional keyboard accelerator associated to this action. + * + * \param[out] keyModifiers Specifies an OR'ed combination of the Shift, + * Control and Alt keys. Use the KeyModifier namespace, defined + * in the pcl/ButtonCodes.h header, to decode this value. + * + * \param[out] keyCode Any valid PCL key code, except those codes + * corresponding to modifier keys or system-managed keys. Use + * the KeyCode namespace, defined in the pcl/KeyCodes.h header, + * to decode the returned value. + * + * If no keyboard accelerator has been associated to this action, zero is + * returned for both parameters. + * + * \sa SetAccelerator(), HasAccelerator(), RemoveAccelerator() + */ + void GetAccelerator( int& keyModifiers, int& keyCode ) const; + + /*! + * Changes the keyboard accelerator associated to this action. + * + * \param keyModifiers An OR'ed combination of the Shift, Control and + * Alt keys. Use the KeyModifier namespace, defined in the + * pcl/ButtonCodes.h header, to build this value. + * + * \param keyCode A valid PCL key code, except those codes + * corresponding to modifier keys or system-managed keys. Use + * the KeyCode namespace, defined in the pcl/KeyCodes.h header, + * to build this value. If this parameter is zero, no keyboard + * accelerator will be associated to this action. + * + * \sa GetAccelerator(), HasAccelerator(), RemoveAccelerator() + */ + void SetAccelerator( int keyModifiers, int keyCode ); + + /*! + * Returns true iff this action has an associated keyboard accelerator. + * + * \sa GetAccelerator(), SetAccelerator(), RemoveAccelerator() + */ + bool HasAccelerator() const + { + int dum, key; GetAccelerator( dum, key ); return key != 0; + } + + /*! + * Clears (deactivates) the keyboard accelerator associated to this action, + * if any. This is an overloaded function, provided for convenience. It + * is equivalent to SetAccelerator( 0, 0 ). + * + * \sa GetAccelerator(), SetAccelerator(), HasAccelerator() + */ + void RemoveAccelerator() + { + SetAccelerator( 0, 0 ); + } + + /*! + * Returns the tool tip text that has been assigned to this action. Tool + * tips are used for tool buttons corresponding to the integration of + * actions in tool bars. + * + * If this action has not been integrated in a tool bar, this function has + * no meaning, and an empty string is always returned. + * + * \sa SetToolTip() + */ + String ToolTip() const; + + /*! + * Changes the tool tip text for this action. Tool tips are used for tool + * buttons corresponding to the integration of actions in tool bars. + * + * \param tip A string that represents the new tool tip text for this + * action object. + * + * If this action has not been integrated in a tool bar, this function is + * ignored. + * + * \sa ToolTip() + */ + void SetToolTip( const String& tip ); + + /*! + * Returns a Bitmap corresponding to the icon that has been assigned to + * this action object. %Action icons are used to render the associated menu + * items and tool bar buttons. + * + * If no icon has been associated to this object, a null Bitmap object is + * returned. + * + * \sa SetIcon() + */ + Bitmap Icon() const; + + /*! + * Changes the icon associated with this %Action to an image specified in + * SVG format. + * + * \param svgSource The source code of a valid SVG document defining the + * icon image that will be associated with this action. + * The SVG source code must be encoded in UTF-8. + * + * The new icon will be used for all menu items and tool bar buttons + * associated with this action after calling this function. If an empty + * string is specified, or if the specified SVG document is not valid, no + * icon will be used to represent this action. + * + * \sa SetIconSVGFile() + */ + void SetIconSVG( const IsoString& svgSource ); + + /*! + * Changes the icon associated with this %Action to an image specified in + * SVG format. + * + * \param filePath Path to an existing file in the local file system, + * which must store a valid SVG document representing the + * icon image that will be associated with this action. + * The SVG source code must be encoded in UTF-8. + * + * The new icon will be used for all menu items and tool bar buttons + * associated with this action after calling this function. If an empty + * string is specified, or if the specified SVG document does not exist or + * is not valid, no icon will be used to represent this action. + * + * Automatic Resource Location + * + * The specified \a filePath string can be prefixed with the + * "@module_icons_dir/" special token to let the PixInsight core application + * load the corresponding SVG document automatically from the a standard + * distribution directory. See the documentation for + * MetaProcess::IconImageSVGFile() for complete information. + * + * \sa SetIconSVG() + */ + void SetIconSVGFile( const String& filePath ); + + /*! + * Changes the icon associated with this %Action object. + * + * \param icon The new icon Bitmap that will be assigned to this %Action. + * + * The new icon will be used for all menu items and tool bar buttons + * associated with this action after calling this function. If a null bitmap + * is specified, no icon will be used to represent this action. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use the SetIconSVG() or SetIconSVGFile() + * member functions, which define action icon images in SVG format. Existing + * modules should be refactored in the same way to support scalable icons. + * + * \sa Icon() + */ + void SetIcon( const Bitmap& icon ); + + /*! + * Callback routine for this action. This function will be called each time + * this action is activated, either by selecting the associated menu item or + * by clicking the corresponding tool button. + * + * Despite this function has not been formalized as a pure virtual function, + * it is such conceptually, so it must be always reimplemented in descendant + * classes. + */ + virtual void Execute(); + + /*! + * Returns the current \e enabled \e state of this %Action object. + * + * Disabled actions have their associated menu items and tool bar buttons + * disabled, and cannot be activated by the user. + * + * The PixInsight application will call this function repeatedly to learn + * the current state of this action, with the purpose of keeping the + * associated interface elements up-to-date. + * + * The caller of this function is a specialized idle-priority thread that is + * permanently running in the background. This means that this function will + * not be executed in the core application's main GUI thread, so all code in + * this function must be thread-safe. Reimplementations of this function in + * derived classes should decide the action's current state and return as + * quickly as possible. + * + * An ActionInfo structure is passed to this function, describing the + * current state of the user interface. That description should be used by + * the IsEnabled() function to decide whether this action should be enabled + * or disabled, depending on the current interface context. + * + * \note The default implementation of this function always returns true, + * regardless of the current context. This means that all actions are + * enabled by default. + * + * \sa ActionInfo + */ + virtual bool IsEnabled( ActionInfo info ) const + { + return true; + } + +private: + + Action( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Action_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Action.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AdaptiveLocalFilter.h b/3rdparty/include/pcl/AdaptiveLocalFilter.h new file mode 100644 index 0000000..28b4413 --- /dev/null +++ b/3rdparty/include/pcl/AdaptiveLocalFilter.h @@ -0,0 +1,216 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AdaptiveLocalFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AdaptiveLocalFilter_h +#define __PCL_AdaptiveLocalFilter_h + +/// \file pcl/AdaptiveLocalFilter.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AdaptiveLocalFilter + * \brief Adaptive, local noise reduction filter in the spatial domain. + * + * Implementation of the adaptive, local noise reduction filter in the spatial + * domain as described by González and Woods. + * + * References + * + * R.C. González and R.E. Woods, Digital %Image Processing, Third + * Edition, Pearson / Prentice Hall, 2008. pp 330-332. + */ +class PCL_CLASS AdaptiveLocalFilter : public ImageTransformation, + public ParallelProcess +{ +public: + + /*! + * Constructs an %AdaptiveLocalFilter instance. + * + * \param sigma Standard deviation or median absolute deviation from the + * median (MAD) of the noise (see the \a useMAD parameter). + * If the MAD is used, the specified \a sigma value must be + * consistent with the standard deviation of a normal + * distribution (typically, the computed MAD estimate must be + * multiplied by 1.4826). + * + * \param size Filter size in pixels. This is the length of a side of the + * square pixel neighborhood used by the adaptive filter. The + * filter size must be an odd number greater than or equal to + * three. If an even size is specified, the smallest odd size + * greater than the specified value will be used. The default + * size is five pixels. + * + * \param useMAD If true, use the median absolute deviation from the median + * (MAD) instead of variance / standard deviation for noise + * estimates. Note that this changes the meaning of the + * \a sigma parameter. The default value is false (variance + * is used by default). + */ + AdaptiveLocalFilter( double sigma, int size = 5, bool useMAD = false ) + : m_size( Max( 3, size|1 ) ) + , m_sigma( Max( 0.0, sigma ) ) + , m_useMAD( useMAD ) + { + } + + /*! + * Copy constructor. + */ + AdaptiveLocalFilter( const AdaptiveLocalFilter& ) = default; + + /*! + * Destroys this %AdaptiveLocalFilter object. + */ + virtual ~AdaptiveLocalFilter() + { + } + + /*! + * Returns the filter size in pixels. + */ + int Size() const + { + return m_size; + } + + /*! + * Sets the filter \a size in pixels. + */ + void SetSize( int size ) + { + PCL_PRECONDITION( size >= 3 ) + PCL_PRECONDITION( (size & 1) != 0 ) + m_size = Max( 3, size|1 ); + } + + /*! + * Returns the standard deviation or median absolute deviation from the + * median (MAD) of the noise in this adaptive filter. + * + * The meaning of the returned value depends on whether this filter uses + * variance or MAD for noise estimates --see the UsingMAD() member function + * and the class constructor for more information. + */ + double Sigma() const + { + return m_sigma; + } + + /*! + * Sets the standard deviation or median absolute deviation from the median + * (MAD) of the noise in this adaptive filter. The specified \a sigma must + * be a positive, nonzero value (a zero noise value is legal, but the filter + * will obviously have no effect). + * + * The meaning of the specified \a sigma value depends on whether this + * filter uses variance or MAD for noise estimates--see the UsingMAD() + * member function and the class constructor for more information. + */ + void SetSigma( double sigma ) + { + PCL_PRECONDITION( sigma >= 0 ) + m_sigma = Max( 0.0, sigma ); + } + + /*! + * Returns true iff this adaptive filter uses median absolute deviation (MAD) + * instead of variance / standard deviation to interpret noise estimates. + */ + bool UsingMAD() const + { + return m_useMAD; + } + + /*! + * Sets the way this adaptive filter interprets noise estimates: either as + * the median absolute deviation from the median (MAD) or as the standard + * deviation of the noise in the target image. + */ + void UseMAD( bool useMAD = true ) + { + m_useMAD = useMAD; + } + +protected: + + int m_size; // filter size in pixels. + double m_sigma = 5; // standard deviation of the noise in the target image. + bool m_useMAD = false; // use MAD instead of variance / standard deviation. + + /* + * Adaptive local filter in the spatial domain. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AdaptiveLocalFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AdaptiveLocalFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AkimaInterpolation.h b/3rdparty/include/pcl/AkimaInterpolation.h new file mode 100644 index 0000000..dd4cdd9 --- /dev/null +++ b/3rdparty/include/pcl/AkimaInterpolation.h @@ -0,0 +1,322 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AkimaInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AkimaInterpolation_h +#define __PCL_AkimaInterpolation_h + +/// \file pcl/AkimaInterpolation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_x this->m_x +#define m_y this->m_y + +/*! + * \class AkimaInterpolation + * \brief Akima subspline interpolation algorithm + * + * References + * + * Hiroshi Akima, A new method of interpolation and smooth curve fitting + * based on local procedures, Journal of the ACM, Vol. 17, No. 4, October + * 1970, pages 589-602. + * + * Implementation + * + * Our implementation is based on the book Numerical Algorithms with + * C, by G. Engeln-Mullges and F. Uhlig (Springer, 1996), section 13.1. + * + * We properly represent corners when a data point lies between two adjacent + * straight lines with different slopes. This means that our implementation + * does not impose continuous differentiability, which deviates from the + * original work by Akima. Supporting the accurate representation of corners + * has several practical advantages in our opinion; one of them is the enhanced + * flexibility for the application of Akima interpolation to graphical + * representations of curves given by a set of prescribed x,y data points. + * + * \sa CubicSplineInterpolation, LinearInterpolation + */ +template +class PCL_CLASS AkimaInterpolation : public UnidimensionalInterpolation +{ +public: + + /*! + * Represents a vector of independent and dependent variable values. + */ + typedef typename UnidimensionalInterpolation::vector_type vector_type; + + /*! + * Represents a vector of interpolation coefficients. + */ + typedef vector_type coefficient_vector; + + /*! + * Constructs an %AkimaInterpolation object. + */ + AkimaInterpolation() = default; + + /*! + * Copy constructor. + */ + AkimaInterpolation( const AkimaInterpolation& ) = default; + + /*! + * Move constructor. + */ + AkimaInterpolation( AkimaInterpolation&& ) = default; + + /*! + * Destroys an %AkimaInterpolation object. + */ + virtual ~AkimaInterpolation() + { + } + + /*! + * Initializes a new interpolation. + * + * \param x %Vector of x-values:\n + * \n + * \li If x is not empty: Must be a vector of monotonically increasing, + * distinct values: x[0] < x[1] < ... < x[n-1].\n + * \li If x is empty: The interpolation will use implicit x[i] = i for + * i = {0,1,...,n-1}.\n + * + * \param y %Vector of function values for i = {0,1,...,n-1}. + * + * The length of the \a y vector (and also the length of a nonempty \a x + * vector) must be \e n >= 5. This is because Akima interpolation requires + * at least 4 subintervals. + */ + void Initialize( const vector_type& x, const vector_type& y ) override + { + if ( y.Length() < 5 ) + throw Error( "AkimaInterpolation::Initialize(): Less than five data points specified." ); + + try + { + Clear(); + UnidimensionalInterpolation::Initialize( x, y ); + + int n = m_y.Length(); + int N = n-1; // Number of subintervals + + m_b = coefficient_vector( N ); + m_c = coefficient_vector( N ); + m_d = coefficient_vector( N ); + + // Chordal slopes + coefficient_vector m0( N+4 ); // room for 4 additional prescribed slopes + T* m = m0.At( 2 ); // allow negative subscripts m[-1] and m[-2] + + // Akima left-hand slopes to support corners + coefficient_vector tL( n ); + + // Calculate chordal slopes for each subinterval + if ( m_x ) + for ( int i = 0; i < N; ++i ) + { + T h = m_x[i+1] - m_x[i]; + if ( 1 + h*h == 1 ) + throw Error( "AkimaInterpolation::Initialize(): Empty interpolation subinterval(s)." ); + m[i] = (m_y[i+1] - m_y[i])/h; + } + else + for ( int i = 0; i < N; ++i ) + m[i] = m_y[i+1] - m_y[i]; + + // Prescribed slopes at ending locations + m[-2 ] = 3*m[ 0] - 2*m[ 1]; + m[-1 ] = 2*m[ 0] - m[ 1]; + m[ N ] = 2*m[N-1] - m[N-2]; + m[N+1] = 3*m[N-1] - 2*m[N-2]; + + /* + * Akima left-hand and right-hand slopes. + * Right-hand slopes are just the interpolation coefficients bi. + */ + for ( int i = 0; i < n; ++i ) + { + T f = Abs( m[i-1] - m[i-2] ); + T e = Abs( m[i+1] - m[i] ) + f; + if ( 1 + e != 1 ) + { + tL[i] = m[i-1] + f*(m[i] - m[i-1])/e; + if ( i < N ) + m_b[i] = tL[i]; + } + else + { + tL[i] = m[i-1]; + if ( i < N ) + m_b[i] = m[i]; + } + } + + /* + * Interpolation coefficients m_b[i], m_c[i], m_d[i]. 'ai' + * coefficients are the m_y[i] ordinate values. + */ + for ( int i = 0; i < N; ++i ) + { + m_c[i] = 3*m[i] - 2*m_b[i] - tL[i+1]; + m_d[i] = m_b[i] + tL[i+1] - 2*m[i]; + + if ( m_x ) + { + T h = m_x[i+1] - m_x[i]; + m_c[i] /= h; + m_d[i] /= h*h; + } + } + } + catch ( ... ) + { + Clear(); + throw; + } + } + + /*! + * Returns an interpolated function value at \a x location. + */ + PCL_HOT_FUNCTION + double operator()( double x ) const override + { + PCL_PRECONDITION( IsValid() ) + + /* + * Find the subinterval i0 such that m_x[i0] <= x < m_x[i0+1]. + * Find the distance dx = x - m_x[i], or dx = x - i for implicit x = {0,1,...n-1}. + */ + int i0; + double dx; + if ( m_x ) + { + i0 = 0; + int i1 = m_x.Length() - 1; + while ( i1-i0 > 1 ) + { + int im = (i0 + i1) >> 1; + if ( x < m_x[im] ) + i1 = im; + else + i0 = im; + } + dx = x - double( m_x[i0] ); + } + else + { + if ( x <= 0 ) + return m_y[0]; + if ( x >= m_y.Length()-1 ) + return m_y[m_y.Length()-1]; + i0 = TruncInt( x ); + dx = x - i0; + } + + /* + * Use a Horner scheme to calculate b[i]*dx + c[i]*dx^2 + d[i]*dx^3. + */ + return m_y[i0] + dx*(m_b[i0] + dx*(m_c[i0] + dx*m_d[i0])); + } + + /*! + * Frees internal data structures in this AkimaInterpolation object. + */ + void Clear() override + { + m_b.Clear(); + m_c.Clear(); + m_d.Clear(); + UnidimensionalInterpolation::Clear(); + } + + /*! + * Returns true iff this interpolation is valid, i.e. if it has been + * correctly initialized and is ready to interpolate function values. + */ + bool IsValid() const override + { + return m_b && m_c && m_d; + } + +protected: + + /* + * Interpolating coefficients for each subinterval. + * The coefficients for dx^0 are the input ordinate values in the m_y vector. + */ + coefficient_vector m_b; // coefficients for dx^1 + coefficient_vector m_c; // coefficients for dx^2 + coefficient_vector m_d; // coefficients for dx^3 +}; + +#undef m_x +#undef m_y + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AkimaInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AkimaInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Algebra.h b/3rdparty/include/pcl/Algebra.h new file mode 100644 index 0000000..40493e1 --- /dev/null +++ b/3rdparty/include/pcl/Algebra.h @@ -0,0 +1,659 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Algebra.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Algebra_h +#define __PCL_Algebra_h + +/// \file pcl/Algebra.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup in_place_gauss_jordan In-Place Gauss-Jordan Solvers + */ + +/*! + * Solution to the linear system A*X = B + * + * On output, A is replaced by its inverse matrix and B is the set of solution + * vectors X. + * + * This is an overloaded function for the Matrix type, which is a template + * instantiation of GenericMatrix for double. + * + * \ingroup in_place_gauss_jordan + */ +void PCL_FUNC InPlaceGaussJordan( Matrix& A, Matrix& B ); + +/*! + * Solution to the linear system A*X = B + * + * On output, A is replaced by its inverse matrix and B is the set of solution + * vectors X. + * + * This is an overloaded function for the FMatrix type, which is a template + * instantiation of GenericMatrix for float. + * + * \ingroup in_place_gauss_jordan + */ +void PCL_FUNC InPlaceGaussJordan( FMatrix& A, FMatrix& B ); + +/*! + * \class GenericGaussJordan + * \brief Generic Gauss-Jordan linear system solver. + */ +template +class PCL_CLASS GenericGaussJordan +{ +public: + + /*! + * Represents a matrix involved in the solution of a linear system. + */ + typedef GenericMatrix matrix; + + /*! + * Represents a matrix element. + */ + typedef typename matrix::element matrix_element; + + /*! + * Inverse matrix + */ + matrix Ai; // Inverse matrix + + /*! + * Solution vectors + */ + matrix X; // Solution vectors + + /*! + * Solution to the linear system A*X = B + * + * This constructor replaces the Ai member of this object with the inverse + * matrix of \a A, and the X member with the set of solution vectors. + */ + GenericGaussJordan( const matrix& A, const matrix& B ) + { + Ai = A; + X = B; + InPlaceGaussJordan( Ai, X ); + } +}; + +/*! + * \class GaussJordan + * \brief Gauss-Jordan linear system solver for Matrix objects. + * + * %GaussJordan is a template instantiation of GenericGaussJordan for the + * double type. %GaussJordan works with Matrix objects. %Matrix is a template + * instantiation of GenericMatrix for double. + */ +class PCL_CLASS GaussJordan : public GenericGaussJordan +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericGaussJordan algorithm_implementation; + + /*! + * Represents a matrix involved in the solution of a linear system. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Solution to the linear system A*X = B + * + * This constructor replaces the Ai member of this object with the inverse + * matrix of \a A, and the X member with the set of solution vectors. + */ + GaussJordan( const Matrix& A, const Matrix& B ) + : algorithm_implementation( A, B ) + { + } +}; + +/*! + * \class FGaussJordan + * \brief Gauss-Jordan linear system solver for FMatrix objects. + * + * %FGaussJordan is a template instantiation of GenericGaussJordan for the + * float type. %FGaussJordan works with FMatrix objects. %FMatrix is a template + * instantiation of GenericMatrix for float. + */ +class PCL_CLASS FGaussJordan : public GenericGaussJordan +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericGaussJordan algorithm_implementation; + + /*! + * Represents a matrix involved in the solution of a linear system. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Solution to the linear system A*X = B + * + * This constructor replaces the Ai member of this object with the inverse + * matrix of \a A, and the X member with the set of solution vectors. + */ + FGaussJordan( const FMatrix& A, const FMatrix& B ) + : algorithm_implementation( A, B ) + { + } +}; + +// ---------------------------------------------------------------------------- + +void PCL_FUNC InPlaceSVDImplementation( Matrix&, Vector&, Matrix& ); +void PCL_FUNC InPlaceSVDImplementation( FMatrix&, FVector&, FMatrix& ); + +/*! + * \class GenericInPlaceSVD + * \brief Generic in-place singular value decomposition algorithm. + */ +template +class PCL_CLASS GenericInPlaceSVD +{ +public: + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef GenericVector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef GenericMatrix matrix; + + /*! + * Represents a vector component. + */ + typedef typename vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef typename matrix::element matrix_element; + + /*! + * The components of this vector are the m (positive) diagonal elements of + * the matrix W in a singular value decomposition A=U*W*Vt. m is the number + * of columns in the decomposed matrix A. + */ + vector W; + + /*! + * Each column of this m x m matrix is the eigenvector for the corresponding + * element of W in a singular value decomposition A=U*W*Vt. m is the number + * of columns in the decomposed matrix A. + */ + matrix V; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor replaces the specified matrix \a A with the + * matrix U that results from the SVD decomposition (indeed that's why this + * is an in-place decomposition). W and V are stored in the corresponding + * members of this object. + */ + GenericInPlaceSVD( matrix& A ) + : W( A.Columns() ) + , V( A.Columns(), A.Columns() ) + { + InPlaceSVDImplementation( A, W, V ); + } + + /*! + * Returns the column index of the largest eigenvector in matrix V. This is + * the index of the largest component of vector W. + */ + int IndexOfLargestSingularValue() const + { + return W.IndexOfLargestComponent(); + } + + /*! + * Returns the column index of the smallest eigenvector in matrix V. This is + * the index of the smallest nonzero component of vector W. + * + * Before calling this function, you should edit the components of vector W + * to set to zero all singular values below a suitable tolerance. For + * example, using the machine epsilon: + * + * \code + * Matrix A; + * ... + * InPlaceSVD svd( A ); + * for ( int i = 0; i < svd.W.Length(); ++i ) + * if ( 1 + svd.W[i] == 1 ) + * svd.W[i] = 0; + * int i = svd.IndexOfSmallestSingularValue(); + * ... + * \endcode + */ + int IndexOfSmallestSingularValue() const + { + return W.IndexOfSmallestNonzeroComponent(); + } +}; + +/*! + * \class InPlaceSVD + * \brief In-place singular value decomposition algorithm for Matrix and Vector objects. + * + * %InPlaceSVD is a template instantiation of GenericInPlaceSVD for the double + * type. %InPlaceSVD works with Matrix and Vector objects. %Matrix and %Vector + * are template instantiations of GenericMatrix and GenericVector, + * respectively, for the double type. + */ +class PCL_CLASS InPlaceSVD : public GenericInPlaceSVD +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericInPlaceSVD algorithm_implementation; + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef algorithm_implementation::vector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a vector component. + */ + typedef vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor replaces the specified matrix \a A with the + * matrix U that results from the SVD decomposition (indeed that's why this + * is an in-place decomposition). W and V are stored in the corresponding + * members of this object. + */ + InPlaceSVD( matrix& A ) + : algorithm_implementation( A ) + { + } +}; + +/*! + * \class FInPlaceSVD + * \brief In-place singular value decomposition algorithm for FMatrix and FVector objects. + * + * %FInPlaceSVD is a template instantiation of GenericInPlaceSVD for the float + * type. %FInPlaceSVD works with FMatrix and FVector objects. %FMatrix and + * %FVector are template instantiations of GenericMatrix and GenericVector, + * respectively, for the float type. + */ +class PCL_CLASS FInPlaceSVD : public GenericInPlaceSVD +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericInPlaceSVD algorithm_implementation; + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef algorithm_implementation::vector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a vector component. + */ + typedef vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor replaces the specified matrix \a A with the + * matrix U that results from the SVD decomposition (indeed that's why this + * is an in-place decomposition). W and V are stored in the corresponding + * members of this object. + */ + FInPlaceSVD( matrix& A ) + : algorithm_implementation( A ) + { + } +}; + +/*! + * \class GenericSVD + * \brief Generic singular value decomposition algorithm. + */ +template +class PCL_CLASS GenericSVD +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericInPlaceSVD algorithm_implementation; + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef typename algorithm_implementation::vector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef typename algorithm_implementation::matrix matrix; + + /*! + * Represents a vector component. + */ + typedef typename vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef typename matrix::element matrix_element; + + /*! + * This is the n x m matrix resulting from the singular value decomposition + * A = U*W*Vt. n and m are the rows and columns of the decomposed matrix A. + */ + matrix U; + + /*! + * The components of this vector are the m (positive) diagonal elements of + * the matrix W in a singular value decomposition A = U*W*Vt. m is the + * number of columns in the decomposed matrix A. + */ + vector W; + + /*! + * Each column of this m x m matrix is the eigenvector for the corresponding + * element of W in a singular value decomposition A = U*W*Vt. m is the + * number of columns in the decomposed matrix A. + */ + matrix V; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor stores U, W and V in the corresponding + * members of this object. + */ + GenericSVD( const matrix& A ) + { + U = A; + algorithm_implementation svd( U ); + W = svd.W; + V = svd.V; + } + + /*! + * Returns the column index of the largest eigenvector in matrix V. This is + * the index of the largest component of vector W. + */ + int IndexOfLargestSingularValue() const + { + return W.IndexOfLargestComponent(); + } + + /*! + * Returns the column index of the smallest eigenvector in matrix V. This is + * the index of the smallest nonzero component of vector W. + * + * Before calling this function, you should edit the components of vector W + * to set to zero all singular values below a suitable tolerance. For + * example, using the machine epsilon: + * + * \code + * Matrix A; + * ... + * SVD svd( A ); + * for ( int i = 0; i < svd.W.Length(); ++i ) + * if ( 1 + svd.W[i] == 1 ) + * svd.W[i] = 0; + * int i = svd.IndexOfSmallestSingularValue(); + * ... + * \endcode + */ + int IndexOfSmallestSingularValue() const + { + return W.IndexOfSmallestNonzeroComponent(); + } +}; + +/*! + * \class SVD + * \brief Singular value decomposition algorithm for Matrix and Vector objects. + * + * %SVD is a template instantiation of GenericSVD for the double type. %SVD + * works with Matrix and Vector objects. %Matrix and %Vector are template + * instantiations of GenericMatrix and GenericVector, respectively, for the + * double type. + */ +class PCL_CLASS SVD : public GenericSVD +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericSVD algorithm_implementation; + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef algorithm_implementation::vector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a vector component. + */ + typedef vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor stores U, W and V in the corresponding + * members of this object. + */ + SVD( const matrix& A ) + : algorithm_implementation( A ) + { + } +}; + +/*! + * \class FSVD + * \brief Singular value decomposition algorithm for FMatrix and FVector objects. + * + * %FSVD is a template instantiation of GenericSVD for the float type. %FSVD + * works with FMatrix and FVector objects. %FMatrix and %FVector are template + * instantiations of GenericMatrix and GenericVector, respectively, for the + * float type. + */ +class PCL_CLASS FSVD : public GenericSVD +{ +public: + + /*! + * Identifies the parent template class, which implements the underlying + * algorithm for this class. + */ + typedef GenericSVD algorithm_implementation; + + /*! + * Represents a vector involved in a singular value decomposition. + */ + typedef algorithm_implementation::vector vector; + + /*! + * Represents a matrix involved in a singular value decomposition. + */ + typedef algorithm_implementation::matrix matrix; + + /*! + * Represents a vector component. + */ + typedef vector::component vector_component; + + /*! + * Represents a matrix element. + */ + typedef matrix::element matrix_element; + + /*! + * Singular Value Decomposition: A = U*W*Vt + * + * The dimensions of A are n rows and m columns. U is an n x m matrix. The m + * components of W are the positive diagonal elements of W, and each column + * of V (m x m) is the eigenvector for the corresponding element of W. + * + * On output, this constructor stores U, W and V in the corresponding + * members of this object. + */ + FSVD( const matrix& A ) + : algorithm_implementation( A ) + { + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Algebra_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Algebra.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AlignedAllocator.h b/3rdparty/include/pcl/AlignedAllocator.h new file mode 100644 index 0000000..d2ab8dc --- /dev/null +++ b/3rdparty/include/pcl/AlignedAllocator.h @@ -0,0 +1,178 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AlignedAllocator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AlignedAllocator_h +#define __PCL_AlignedAllocator_h + +/// \file pcl/AlignedAllocator.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AlignedAllocator + * \brief A block allocator class for aligned memory allocation/deallocation. + * + * %AlignedAllocator is a block allocator class. It can be used for + * all PCL container classes instead of the default StandardAllocator class, + * from which it derives publicly, providing exactly the same memory allocation + * policies. + * + * %AlignedAllocator guarantees that all allocated memory blocks are aligned + * for optimal performance of SIMD processor instructions on all supported + * platforms. Currently all blocks are allocated with 32 byte alignment, which + * is optimal for both SSE and AVX2 load/store instructions. + * + * For a complete description of block allocators and their fundamental role in + * PCL, read the documentation for the Allocator class. + * + * \sa Allocator, StandardAllocator + */ +class PCL_CLASS AlignedAllocator : public StandardAllocator +{ +public: + + /*! + * Constructs an %AlignedAllocator object. + * + * \param fastGrowth Whether to enable the fast block size growing policy + * for this allocator. + * + * \param canShrink Whether to enable the block shrinking policy for + * this allocator. + * + * See the IsFastGrowthEnabled() and IsShrinkingEnabled() member functions + * for more information on block allocation policies. + */ + AlignedAllocator( bool fastGrowth = true, bool canShrink = true ) + : StandardAllocator( fastGrowth, canShrink ) + { + } + + /*! + * Copy constructor. + */ + AlignedAllocator( const AlignedAllocator& ) = default; + + /*! + * Custom allocation routine. Allocates a contiguous memory block of the + * specified \a size in bytes with 32-byte alignment, and returns the + * address of the first byte in the newly allocated block. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa DeallocateBlock() + */ + void* AllocateBlock( size_type size ) + { + PCL_PRECONDITION( size != 0 ) + void* p = PCL_ALIGNED_MALLOC( size, 32 ); + if ( unlikely( p == nullptr ) ) + throw std::bad_alloc(); + return PCL_ASSUME_ALIGNED_32( p ); + } + + /*! + * Custom deallocation routine. Deallocates a previously allocated + * contiguous memory block that begins at the specified location \a p. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa AllocateBlock() + */ + void DeallocateBlock( void* p ) + { + PCL_PRECONDITION( p != nullptr ) + PCL_ALIGNED_FREE( p ); + } +}; + +} // pcl + +// ---------------------------------------------------------------------------- + +/*! + * Placement new operator for class AlignedAllocator. Returns the specified + * address \a p. + */ +inline void* operator new( pcl::size_type, void* p, pcl::AlignedAllocator& ) +{ + PCL_PRECONDITION( p != nullptr ) + return p; +} + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4100 ) // 'unreferenced formal parameter' + +inline void operator delete( void* p, void*, pcl::AlignedAllocator& ) +{ + PCL_PRECONDITION( p != nullptr ) +} + +#pragma warning( pop ) +#endif // _MSC_VER + +// ---------------------------------------------------------------------------- + +#endif // __PCL_AlignedAllocator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AlignedAllocator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Allocator.h b/3rdparty/include/pcl/Allocator.h new file mode 100644 index 0000000..6c0dd82 --- /dev/null +++ b/3rdparty/include/pcl/Allocator.h @@ -0,0 +1,409 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Allocator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Allocator_h +#define __PCL_Allocator_h + +/// \file pcl/Allocator.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Allocator + * \brief Provides memory allocation for PCL containers. + * + * %Allocator inherits directly from its template argument A, which + * corresponds to a block allocator class. A block allocator is + * responsible for allocation and deallocation of untyped blocks of contiguous + * memory. %Allocator inherits block allocation capabilities and specializes + * them for allocation of a particular type T. + * + * The type T must have default and copy construction semantics. + * + * Besides the default and copy constructors, the block allocator class A must + * define the following member functions: + * + * \code + * size_type A::MaxSize() const + * \endcode + * + * Returns the maximum size in bytes that the block allocator is able to + * allocate as a contiguous memory block. + * + * \code + * size_type A::BlockSize( size_type n ) const + * \endcode + * + * Returns the size in bytes of an allocation block suitable to store + * at least \a n contiguous bytes. %Allocator uses this block size to reserve + * memory in chunks of optimized length. This greatly improves efficiency of + * containers because it minimizes the frequency of allocation/deallocation + * operations. + * + * \code + * size_type A::ReallocatedBlockSize( size_type currentSize, size_type newSize ) const + * \endcode + * + * Returns the size in bytes of a reallocated block. \a currentSize is the + * current size in bytes of the block being reallocated, and \a newSize is the + * requested block size. This function is similar to A::BlockSize(), but it is + * called for reallocation of already existing data blocks, for example before + * deleting a subset of container elements. + * + * \code + * void* AllocateBlock( size_type sz ) + * \endcode + * + * Custom allocation routine. Allocates a contiguous memory block of length + * \a sz in bytes, and returns the address of the first byte in the newly + * allocated block. + * + * \code + * void DeallocateBlock( void* p ) + * \endcode + * + * Custom deallocation routine. Deallocates a contiguous block of memory that + * has been previously allocated by any allocator of class A. + * + * StandardAllocator is an example of a block allocator that uses the standard + * \c new and \c delete operators. + * + * \sa StandardAllocator + */ +template +class PCL_CLASS Allocator : public A +{ +public: + + /*! + * Default constructor. + */ + Allocator() = default; + + /*! + * Copy constructor. + */ + Allocator( const Allocator& ) = default; + + /*! + * Constructs an %Allocator instance as a copy of other block allocator. + */ + Allocator( const A& a ) + : A( a ) + { + } + + /*! + * Allocates a contiguous block of memory, sufficient to store at least \a n + * instance of class T. Optionally, allocates the necessary space for \a n + * objects plus \a extra additional bytes. + * + * Returns the starting address of the allocated block. + * + * \note This member function does not construct any T instance; + * it only allocates the required memory to store \a n instances of T. + */ + T* Allocate( size_type n, size_type extra = 0 ) + { + PCL_PRECONDITION( n+extra > 0 ) + return (T*)this->AllocateBlock( n*sizeof( T )+extra ); + //return (T*)new ( *this ) uint8[ n*sizeof( T )+extra ]; + } + + /*! + * Deallocates a block of memory. + * + * \note This member function does not destruct any T instance; it + * only deallocates a previously allocated block where an unspecified number + * of T instances might be stored (either constructed or not). + */ + void Deallocate( T* p ) + { + PCL_PRECONDITION( p != nullptr ) + this->DeallocateBlock( (void*)p ); + //this->operator delete( (void*)p ); + } + + /*! + * Returns the maximum number of instances of class T that this allocator + * can allocate. + */ + size_type MaxLength() const + { + return A::MaxSize()/sizeof( T ); + } + + /*! + * Returns the length of a newly allocated data block. + * + * Given a number \a n of T instances, returns the corresponding paged + * length for this allocator. The paged length is the actual number of + * T instances that would be allocated instead of \a n, which depends on the + * block allocation policy implemented by the block allocator class. + * + * The value returned by this member function is always greater than or + * equal to \a n. + * + * \sa ShrunkLength() + */ + size_type PagedLength( size_type n ) const + { + return A::BlockSize( n*sizeof( T ) )/sizeof( T ); + } + + /*! + * Returns the length of a reallocated data block. + * + * \param currentLength The current length of an allocated data block. + * + * \param newLength The new length of the reallocated data block. + * + * The returned length is the actual number of T instances that would be + * allocated instead of \a newLength, which depends on the block allocation + * policy implemented by the block allocator class. + * + * The value returned by this member function is always greater than or + * equal to \a n. + * + * \sa PagedLength() + */ + size_type ReallocatedLength( size_type currentLength, size_type newLength ) const + { + return A::ReallocatedBlockSize( currentLength*sizeof( T ), newLength*sizeof( T ) )/sizeof( T ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup object_construction_destruction Construction and \ + * Destruction of Objects with Explicit Allocation + */ + +/*! + * Constructs an object with storage at address \a p and allocator \a a. This + * function invokes the default constructor of class T for the object stored at + * \a p. + * \sa Allocator + * \ingroup object_construction_destruction + */ +template inline void Construct( T* p, A& a ) +{ + PCL_PRECONDITION( p != nullptr ) + new( (void*)p, a )T(); +} + +/*! + * Constructs an object with storage at address \a p, initial value \a v, and + * allocator \a a. This function invokes the copy constructor of class T, with + * argument \a v, for the object stored at \a p. + * \sa Allocator + * \ingroup object_construction_destruction + */ +template inline void Construct( T* p, const T1& v, A& a ) +{ + PCL_PRECONDITION( p != nullptr ) + new( (void*)p, a )T( v ); +} + +#ifdef _MSC_VER +# pragma warning( push ) +# pragma warning( disable : 4100 ) // unreferenced formal parameter +#endif // (VC++ limitation !?) + +/*! + * Destroys an object stored at address \a p. Invokes the destructor of + * class T for the object stored at \a p. + * \sa Allocator + * \ingroup object_construction_destruction + */ +template inline void Destroy( T* p ) +{ + PCL_PRECONDITION( p != nullptr ) + p->~T(); +} + +/*! + * Destroys a contiguous sequence of objects. Invokes the destructor of class + * T for each object in the range [p,q). + * \sa Allocator + * \ingroup object_construction_destruction + */ +template inline void Destroy( T* p, T* q ) +{ + PCL_PRECONDITION( p != nullptr && q != nullptr ) + for ( ; p < q; ++p ) + p->~T(); +} + +#ifdef _MSC_VER +# pragma warning( pop ) +#endif + +inline void Destroy( void* ) {} +inline void Destroy( void*, void* ) {} + +inline void Destroy( bool* ) {} +inline void Destroy( bool*, bool* ) {} + +inline void Destroy( signed char* ) {} +inline void Destroy( signed char*, signed char* ) {} + +inline void Destroy( unsigned char* ) {} +inline void Destroy( unsigned char*, unsigned char* ) {} + +inline void Destroy( wchar_t* ) {} +inline void Destroy( wchar_t*, wchar_t* ) {} + +inline void Destroy( char16_t* ) {} +inline void Destroy( char16_t*, char16_t* ) {} + +inline void Destroy( char32_t* ) {} +inline void Destroy( char32_t*, char32_t* ) {} + +inline void Destroy( signed int* ) {} +inline void Destroy( signed int*, signed int* ) {} + +inline void Destroy( unsigned int* ) {} +inline void Destroy( unsigned int*, unsigned int* ) {} + +inline void Destroy( signed short* ) {} +inline void Destroy( signed short*, signed short* ) {} + +inline void Destroy( unsigned short* ) {} +inline void Destroy( unsigned short*, unsigned short* ) {} + +inline void Destroy( signed long* ) {} +inline void Destroy( signed long*, signed long* ) {} + +inline void Destroy( unsigned long* ) {} +inline void Destroy( unsigned long*, unsigned long* ) {} + +inline void Destroy( signed long long* ) {} +inline void Destroy( signed long long*, signed long long* ) {} + +inline void Destroy( unsigned long long* ) {} +inline void Destroy( unsigned long long*, unsigned long long* ) {} + +inline void Destroy( float* ) {} +inline void Destroy( float*, float* ) {} + +inline void Destroy( double* ) {} +inline void Destroy( double*, double* ) {} + +inline void Destroy( long double* ) {} +inline void Destroy( long double*, long double* ) {} + +inline void Destroy( void** ) {} +inline void Destroy( void**, void** ) {} + +inline void Destroy( bool** ) {} +inline void Destroy( bool**, bool** ) {} + +inline void Destroy( signed char** ) {} +inline void Destroy( signed char**, signed char** ) {} + +inline void Destroy( unsigned char** ) {} +inline void Destroy( unsigned char**, unsigned char** ) {} + +inline void Destroy( wchar_t** ) {} +inline void Destroy( wchar_t**, wchar_t** ) {} + +inline void Destroy( signed int** ) {} +inline void Destroy( signed int**, signed int** ) {} + +inline void Destroy( unsigned int** ) {} +inline void Destroy( unsigned int**, unsigned int** ) {} + +inline void Destroy( signed short** ) {} +inline void Destroy( signed short**, signed short** ) {} + +inline void Destroy( unsigned short** ) {} +inline void Destroy( unsigned short**, unsigned short** ) {} + +inline void Destroy( signed long** ) {} +inline void Destroy( signed long**, signed long** ) {} + +inline void Destroy( unsigned long** ) {} +inline void Destroy( unsigned long**, unsigned long** ) {} + +inline void Destroy( signed long long** ) {} +inline void Destroy( signed long long**, signed long long** ) {} + +inline void Destroy( unsigned long long** ) {} +inline void Destroy( unsigned long long**, unsigned long long** ) {} + +inline void Destroy( float** ) {} +inline void Destroy( float**, float** ) {} + +inline void Destroy( double** ) {} +inline void Destroy( double**, double** ) {} + +inline void Destroy( long double** ) {} +inline void Destroy( long double**, long double** ) {} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Allocator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Allocator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Arguments.h b/3rdparty/include/pcl/Arguments.h new file mode 100644 index 0000000..0c55f2c --- /dev/null +++ b/3rdparty/include/pcl/Arguments.h @@ -0,0 +1,681 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Arguments.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Arguments_h +#define __PCL_Arguments_h + +/// \file pcl/Arguments.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup argument_parsing Argument Parsing Routines and Utilities + */ + +// ---------------------------------------------------------------------------- + +/*! + * \class Argument + * \brief A command-line argument + * + * %Argument implements a command-line argument that can be used with the + * ParseArguments() function. + * + * Command-line arguments can be \e parametric and \e non-parametric + * arguments (also known as \e item \e arguments). + * + * 1. Parametric Arguments + * + * Parametric arguments specify \e modifiers or parameter values of different + * types to their receiving processes. Syntactically, parametric arguments are + * formalized as: + * + * -<arg_id>[<arg_value>] + * + * where the starting hypen character '-' is the standard parameter + * prefix. <arg_id> is the argument identifier and + * <arg_value> is an optional argument value specification. For + * example, in the following parametric arguments: + * + * -n=17 --use-all-processors + * + * the argument identifiers are 'n' and '-use-all-processors', respectively, + * and '=17' is an argument value specification. + * + * We consider four types of parametric arguments: \e literal, \e switch, + * \e numeric and \e string arguments. + * + * 1.1 Literal Arguments + * + * Literal arguments are parametric arguments that don't have a particular + * value. They are modifiers that act as functions of their existence. For + * example, in the following arguments: + * + * -c -x=10 -b="none" --verbose + * + * '-c' and '--verbose' are literal arguments. + * + * 1.2 Switch Arguments + * + * Switch arguments are parametric arguments that can only have a boolean + * \e enabled/disabled state. Switch arguments are of the form: + * + * -<arg_id>+|- + * + * where the + suffix means 'enabled' and the - suffix means 'disabled'. + * For example, here are some switch arguments: + * + * -u+ -color- --mySwitchArgument+ + * + * It is customary to allow the use of switch arguments also as literal + * arguments. When switch arguments are used as literal arguments, a default + * 'enabled' or 'disabled' state is assumed, depending on the functionality and + * purpose of each argument. When switch arguments can also be literal, they + * are formalized as: + * + * -<arg_id>[+|-] + * + * indicating that the + and - suffixes are optional. + * + * 1.3 Numeric Arguments + * + * A numeric argument has an integer or floating-point numeric value. Numeric + * arguments are formalized as: + * + * -<arg_id>=<numeric_constant> + * + * where <numeric_constant> is a valid representation of an integer or + * floating-point real constant, following the applicable syntax rules of the C + * language. Integer constants can have the '0x' standard prefix to indicate + * hexadecimal values. + * + * 1.4 %String Arguments + * + * A string argument has a literal value represented as a string of ISO 8859-1 + * characters. String arguments are formalized as: + * + * -<arg_id>=<string_constant> + * + * where <string_constant> is any sequence of ISO 8859-1 characters, + * optionally enclosed by double quotes. For example: + * + * -s=foo -s1="bar" + * + * are two string arguments with 'foo' and 'bar' values, respectively. When the + * <string_constant> string includes white spaces, the enclosing quotes are + * not optional, as in: + * + * -aStringArg="this is a string literal" + * + * or otherwise the above sequence would be interpreted as a single string + * argument (aStringArg=this) and four additional, non-parametric arguments. + * + * 2. Non-Parametric Arguments + * + * Non-parametric arguments specify \e objects that their receiving processes + * can act on or use in any way. Non-parametric arguments are formalized as: + * + * <arg_value> + * + * where <arg_value> is any sequence of ISO 8859-1 characters. Note that the + * absence of a standard parameter prefix (the hypen character, '-') + * characterizes non-parametric arguments. For example, in the following + * arguments: + * + * -mode="auto" *.js -z foo.scp + * + * '*.js' and 'foo.scp' are two non-parametric arguments. + * + * Each non-parametric argument can be expanded into a list of items. + * For example, the '*.js' argument above would be expanded into a list of all + * files with the .js suffix in the current directory, provided that the + * argument is parsed as a wild file path specification. + * + * \sa ParseArguments(), ArgumentItemMode, ArgumentOption + * + * \ingroup argument_parsing + */ +class PCL_CLASS Argument +{ +public: + + /*! + * Constructs an empty %Argument object. + */ + Argument() + { + Initialize(); + } + + /*! + * Constructs an %Argument object and parses the specified \a argv string. + */ + Argument( const String& argv ) + { + Parse( argv.c_str() ); + } + + /*! + * Constructs an %Argument object and parses the specified \a argv string. + */ + Argument( const char16_type* argv ) + { + Parse( argv ); + } + + /*! + * Constructs an %Argument object and interprets that the specified \a argv + * string corresponds to a non-parametric argument corresponding to the + * \a items list of items. + */ + Argument( const String& argv, const StringList& items ) + { + type = item_arg; + token = argv; + asItems = items; + } + + /*! + * Copy constructor. + */ + Argument( const Argument& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Argument& operator =( const Argument& ) = default; + + /*! + * Equality operator. Returns true if this %Argument object is equal to the + * specified \a x instance. + */ + bool operator ==( const Argument& x ) const + { + if ( id == x.id && type == x.type ) + { + if ( IsLiteral() || !IsValid() ) + return true; + if ( IsNumeric() ) + return asNumeric == x.asNumeric; + if ( IsString() ) + return asString == x.asString; + if ( IsSwitch() ) + return asSwitch == x.asSwitch; + if ( IsItemList() ) + return asItems == x.asItems; + } + return false; + } + + /*! + * Returns true iff this argument has successfully parsed a token string. + */ + bool IsValid() const + { + return type != invalid_arg; + } + + /*! + * Returns the token string corresponding to this argument. The token is the + * exact string that has been parsed by this %Argument instance. If no token + * has been parsed by this instance, an empty string is returned. + */ + String Token() const + { + return token; + } + + /*! + * Returns the argument's parameter identifier, if this argument has been + * parsed and it is a parametric argument, or an empty string + * otherwise. + */ + String Id() const + { + return id; + } + + /*! + * Returns true iff this argument has been parsed and it is a + * non-parametric argument, also known as an item + * argument. + */ + bool IsItemList() const + { + return type == item_arg; + } + + /*! + * Returns a reference to the (constant) list of items that have been + * generated after expansion of a non-parametric argument. The returned list + * cannot be modified, and it's empty if this argument is parametric, or if + * it has not been parsed yet. + */ + const StringList& Items() const + { + return asItems; + } + + /*! + * Returns a reference to the list of items that have been generated after + * expansion of a non-parametric argument. The returned list can be freely + * modified, and it's empty if this argument is parametric, or if it has not + * been parsed yet. + */ + StringList& Items() + { + return asItems; + } + + /*! + * Returns true iff this argument has been parsed and it is a literal + * argument. + */ + bool IsLiteral() const + { + return type == literal_arg; + } + + /*! + * Returns true iff this argument has been parsed and it is a switch + * argument. + */ + bool IsSwitch() const + { + return type == switch_arg; + } + + /*! + * Returns the switch state of this argument, if it has been parsed and it + * is a switch argument, or false otherwise. + */ + bool SwitchState() const + { + return asSwitch; + } + + /*! + * Returns true iff this argument has been parsed and it is a numeric + * argument. + */ + bool IsNumeric() const + { + return type == numeric_arg; + } + + /*! + * Returns the numeric value of this argument, if it has been parsed and it + * is a numeric argument, or zero otherwise. + */ + double NumericValue() const + { + return asNumeric; + } + + /*! + * Returns true iff this argument has been parsed and it is a string + * argument. + */ + bool IsString() const + { + return type == string_arg; + } + + /*! + * Returns the string value of this argument, if it has been parsed and it + * is a string argument, or an empty string otherwise. + */ + String StringValue() const + { + return asString; + } + +private: + + enum arg_type { invalid_arg = -1, item_arg, literal_arg, switch_arg, numeric_arg, string_arg }; + + String token; // argument token + String id; // argument id + arg_type type; // argument type, or invalid + + StringList asItems; // list of non-parameters (e.g. file names or view ids) + bool asSwitch; // logical state of a switch argument + double asNumeric; // value of a numerical argument + String asString; // value of a string argument + + void Initialize() + { + token.Clear(); + id.Clear(); + type = invalid_arg; + asItems.Clear(); + asSwitch = false; + asNumeric = 0; + asString.Clear(); + } + + void Parse( const char16_type* ); +}; + +/*! + * \class pcl::ArgumentList + * \brief A dynamic array of command-line arguments + * \ingroup argument_parsing + */ +typedef Array ArgumentList; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ArgumentItemMode + * \brief Non-parametric argument parsing modes. + * + * + * + * + * + * + *
ArgumentItemMode::Ignore Consider non-parametric items as literal items (plain strings)
ArgumentItemMode::AsFiles Non-parametric items are file paths
ArgumentItemMode::AsViews Non-parametric items are view identifiers
ArgumentItemMode::NoItems Non-parametric items are not allowed
+ * + * \ingroup argument_parsing + */ +namespace ArgumentItemMode +{ + enum value_type + { + Ignore, // Consider non-parametric items as literal items (plain strings) + AsFiles, // Non-parametric items are file paths + AsViews, // Non-parametric items are view identifiers + NoItems, // Non-parametric items are not allowed + }; +} + +/*! + * \class pcl::argument_item_mode + * \brief Represents an ArgumentItemMode enumerated value. + * \ingroup argument_parsing + */ +typedef ArgumentItemMode::value_type argument_item_mode; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ArgumentOption + * \brief Working options affecting how non-parametric arguments are + * interpreted. + * + * + * + * + * + * + *
ArgumentOption::AllowWildcards Allow wildcard characters (*?) in non-parametric items
ArgumentOption::NoPreviews Don't allow preview specifications (with the '->' standard separator)
ArgumentOption::RecursiveDirSearch Perform recursive directory searches for wild path specifications
ArgumentOption::RecursiveSearchArgs Use standard arguments to toggle recursive directory searching
+ * + * \ingroup argument_parsing + */ +namespace ArgumentOption +{ + enum mask_type + { + AllowWildcards = 0x00000001, // Allow wildcard characters (*?) in non-parametric items + NoPreviews = 0x00000002, // Don't allow preview specifications (with the '->' standard separator) + RecursiveDirSearch = 0x00000004, // Perform recursive directory searches for wild path specifications + RecursiveSearchArgs = 0x00000008, // Use standard arguments to toggle recursive directory searching + }; +} + +/*! + * \class pcl::ArgumentOptions + * \brief A combination of ArgumentOption flags + * \ingroup argument_parsing + */ +typedef Flags ArgumentOptions; + +// ---------------------------------------------------------------------------- + +// The implementation of ExtractArguments() is slightly different in core. +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +} // pcl +using namespace pcl; +namespace pi +{ +#endif + +/*! + * Extracts a sequence of command-line arguments of the form: + * + * [<arg_list>] [<item_list>] + * + * where: + * + * <item_list> + * Is a sequence <item> [<item_list>] + * + * <item> + * Is a non-parametric (or "item") argument. If file parsing is active + * (see the \a mode parameter below), each item will be parsed as a file path + * specification. If view parsing is active, items will be considered + * as view identifiers. In both cases, each item may include wildcards to + * define a search pattern, which will be automatically expanded into a + * sequence of actual file paths or view identifiers. + * + * <arg_list> + * Is a sequence <arg> [<arg_list>] + * + * <arg> + * Is a parametric argument (see the documentation for the Argument class for a + * complete description). + * + * \param argv The list of input argument tokens that will be parsed.\n\n + * + * \param mode Indicates how non-parametric items will be handled by this + * function. \a mode must have one of the following values:\n + * \n + * + * + * + * + * + * + * + * + * + *
ArgumentItemMode::Ignore. Non-parametric arguments will + * not be parsed and will be passed unchanged.
ArgumentItemMode::AsFiles. Each non-parametric argument + * is interpreted as a file path specification. Note that neither + * validity of file paths nor the existence of actual files are + * verified.
ArgumentItemMode::AsViews. Each non-parametric argument + * is interpreted and parsed as a view identifier specification. Note + * that only validity of view identifiers is verified, not the + * existence of actual views with such identifiers.
ArgumentItemMode::NoItems. This mode disallows + * non-parametric arguments. An exception is thrown if a + * non-parametric item is found in the input sequence of \a argv + * elements.
\n\n + * + * \param options This is an OR'ed combination of flags from the + * ArgumentOption enumeration:\n + * \n + * + * + * + * + * + * + * + * + * + *
ArgumentItemMode::AllowWildcards. If this flag is + * included, each file argument containing wildcards ('*' and '?' + * characters) will originate a search for all files matching the + * specified wildcard pattern. If view arguments are being considered, + * each wildcard item will be expanded into a list of matching view + * identifiers.
ArgumentItemMode::NoPreviews. This flag prevents the + * inclusion of preview identifiers in the output arguments set. If a + * preview specification (imageId->previewId) is found and this flag + * is active, an exception is thrown.
ArgumentItemMode::RecursiveDirSearch. This flag only + * makes sense along with the ArgumentItemMode::AsFiles mode. If used, + * this flag will originate recursive directory searches for all file + * path specifications containing wildcards. Note that the behavior of + * this flag can be altered by the RecursiveSearchArgs flag (see + * below).
ArgumentItemMode::RecursiveSearchArgs. This flag only + * makes sense along with the ArgumentItemMode::AsFiles mode and the + * RecursiveDirSearch flag (see above). If used, recursive directory + * searches will be controlled by a special toggle argument. All + * instances of this argument will be processed automatically by the + * routine and will not be included in the output arguments list. By + * default, this argument is --r[+|-], but it can be changed + * by calling the SetRecursiveDirSearchArgument() static function.\n + * \n + * Example of wild path argument specifications with recursive search + * through the standard --r toggle argument: + * + * *.cpp --r *.h *.png --r- *.exe + * + * In the example above, *.h and *.png will be + * searched recursively through the entire directory tree rooted at + * the current directory, but *.cpp and *.exe files + * will only be searched for in the current directory.
+ * + * This function generates a ParseError exception when it encounters an error + * while parsing the sequence of input arguments. + * + * Returns a list with all the arguments extracted from the input \a argv + * sequence as instances of the Argument class. If non-parametric arguments are + * being interpreted as file paths, each non-parametric item is expanded to its + * corresponding full file path. If non-parametric arguments are being parsed + * as view identifiers, each non-parametric item is replaced (if appropriate) + * by its full view identifier. Otherwise, non-parametric items are returned + * unchanged. + * + * \ingroup argument_parsing + */ +ArgumentList PCL_FUNC ExtractArguments( const StringList& argv, + argument_item_mode mode = ArgumentItemMode::Ignore, + ArgumentOptions options = ArgumentOptions() ); + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +} // pi +namespace pcl +{ +#endif + +/*! + * Returns the identifier of the argument used by ExtractArguments() for + * automatic toggle of recursive directory searches. By default, this is the + * --r[+|-] argument. + * + * \ingroup argument_parsing + */ +String PCL_FUNC RecursiveDirSearchArgument(); + +/*! + * Sets the identifier of the argument used by ExtractArguments() for + * automatic toggle of recursive directory searches. + * + * \param id New identifier for the automatic recursive search argument. + * N.B.: When specifying this argument, don't include the '-' + * standard parameter prefix. + * + * \ingroup argument_parsing + */ +void PCL_FUNC SetRecursiveDirSearchArgument( const String& id ); + +/*! + * Auxiliary directory search routine used by ExtractArguments(). + * + * Returns a list of full file paths corresponding to a template wild file + * specification (\a filePath), optionally recursing the directory tree, + * starting from the directory specified in \a filePath. + * + * \ingroup argument_parsing + */ +StringList PCL_FUNC SearchDirectory( const String& filePath, bool recursive = false ); + +/*! + * Returns a copy of a source string \a s where all references to environment + * variables have been replaced with their corresponding values. + * + * This function finds all occurrences of environment variables of the form: + * + * $<env_name> + * + * where <env_name> is any sequence of alphabetic, decimal, or underscore + * characters. If <env_name> corresponds to an existing environment + * variable of the calling process, the entire $<env_name> sequence is + * replaced with the variable's value. References to nonexistent environment + * variables, as well as empty references (isolated $ characters), are + * replaced with an empty string (removed). + * + * This function works recursively: it can replace environment variables + * inside the values of environment variables. The routine performs + * replacements recursively until no $ character is found in the string. + * + * \ingroup argument_parsing + */ +String PCL_FUNC ReplaceEnvironmentVariables( const String& s ); + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Arguments_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Arguments.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Array.h b/3rdparty/include/pcl/Array.h new file mode 100644 index 0000000..96d99f9 --- /dev/null +++ b/3rdparty/include/pcl/Array.h @@ -0,0 +1,2171 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Array.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Array_h +#define __PCL_Array_h + +/// \file pcl/Array.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup dynamic_arrays Dynamic Arrays + */ + +// ---------------------------------------------------------------------------- + +/*! + * \class Array + * \brief Generic dynamic array. + * + * %Array is a generic, finite ordered sequence of objects, implemented as a + * reference-counted, dynamic array of T instances. The type A provides dynamic + * allocation for contiguous sequences of elements of type T (StandardAllocator + * is used by default). + * + * \sa SortedArray, ReferenceArray, ReferenceSortedArray, IndirectArray, + * IndirectSortedArray + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS Array : public DirectContainer +{ +public: + + /*! # + */ + typedef A block_allocator; + + /*! # + */ + typedef pcl::Allocator allocator; + + /*! # + */ + typedef T* iterator; + + /*! # + */ + typedef const T* const_iterator; + + /*! # + */ + typedef ReverseRandomAccessIterator + reverse_iterator; + + /*! # + */ + typedef ReverseRandomAccessIterator + const_reverse_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty array. + */ + Array() + { + m_data = new Data; + } + + /*! + * Constructs an array of \a n default-constructed objects. + */ + explicit + Array( size_type n ) + { + m_data = new Data; + m_data->Allocate( n ); + m_data->Initialize( m_data->begin, m_data->end ); + } + + /*! + * Constructs an array with \a n copies of an object \a v. + */ + Array( size_type n, const T& v ) + { + m_data = new Data; + m_data->Allocate( n ); + m_data->Initialize( m_data->begin, m_data->end, v ); + } + + /*! + * Constructs an array that stores a copy of the objects in the range [i,j) + * of forward iterators. + */ + template + Array( FI i, FI j ) + { + m_data = new Data; + m_data->Allocate( size_type( pcl::Distance( i, j ) ) ); + if ( m_data->begin != nullptr ) + m_data->Build( m_data->begin, i, j ); + } + + /*! + * Constructs an array that stores a copy of the objects in the specified + * initializer list \a l. + * + * This constructor is equivalent to: + * + * \code Array( l.begin(), l.end() ) \endcode + */ + template + Array( std::initializer_list l ) + : Array( l.begin(), l.end() ) + { + } + + /*! + * Copy constructor. + */ + Array( const Array& x ) + : m_data( x.m_data ) + { + if ( m_data != nullptr ) + m_data->Attach(); + } + + /*! + * Move constructor. + */ + Array( Array&& x ) + : m_data( x.m_data ) + { + x.m_data = nullptr; + } + + /*! + * Destroys an %Array object. Destroys and deallocates all contained + * objects. + */ + ~Array() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Returns true iff this array uniquely references its contained data. + */ + bool IsUnique() const noexcept + { + return m_data->IsUnique(); + } + + /*! + * Returns true iff this array is an alias of an array \a x. + * + * Two objects are aliases if both share the same data. + */ + bool IsAliasOf( const Array& x ) const noexcept + { + return m_data == x.m_data; + } + + /*! + * Ensures that this array uniquely references its contained data. + * + * If necessary, this member function generates a duplicate of the array + * data, references it, and then decrements the reference counter of the + * original array data. + */ + void EnsureUnique() + { + if ( !IsUnique() ) + { + Data* newData = new Data; + newData->Allocate( Length() ); + newData->Build( newData->begin, m_data->begin, m_data->end ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the total number of bytes required to store the objects contained + * by this dynamic array. + */ + size_type Size() const noexcept + { + return m_data->Size(); + } + + /*! + * Returns the length of this dynamic array. + */ + size_type Length() const noexcept + { + return m_data->Length(); + } + + /*! + * Returns the capacity of this array. The capacity is the maximum number of + * objects that this array can contain without requiring a reallocation. + */ + size_type Capacity() const noexcept + { + return m_data->Capacity(); + } + + /*! + * Returns the length of the space available in this array, or zero if this + * array cannot contain more objects. The available space is the number of + * objects that can be added to this array without requiring a reallocation. + * It is equal to Capacity() - Length() by definition. + */ + size_type Available() const noexcept + { + return m_data->Available(); + } + + /*! + * Returns true only if this array is valid. An array is valid if it + * references an internal array structure, even if it is an empty array. + * + * In general, all %Array objects are valid with only two exceptions: + * + * \li Objects that have been move-copied or move-assigned to other arrays. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid array object cannot be used and should be destroyed + * immediately. Invalid arrays are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const noexcept + { + return m_data != nullptr; + } + + /*! + * Returns true iff this array is empty. + */ + bool IsEmpty() const noexcept + { + return m_data->IsEmpty(); + } + + /*! + * Returns the minimum legal index in this array (always zero). For empty + * arrays, this function returns a meaningless value. + */ + size_type LowerBound() const noexcept + { + return 0; + } + + /*! + * Returns the maximum legal index in this array. It is equal to Length()-1. + * For empty arrays, this function returns a meaningless value. + */ + size_type UpperBound() const noexcept + { + return Length()-1; + } + + /*! + * Returns a reference to the allocator object used by this array. + */ + const allocator& Allocator() const noexcept + { + return m_data->alloc; + } + + /*! + * Sets a new allocator object for this array. + */ + void SetAllocator( const allocator& a ) + { + EnsureUnique(); + m_data->alloc = a; + } + + /*! + * Returns an array iterator located at the specified array index \a i. + */ + iterator At( size_type i ) + { + PCL_PRECONDITION( !IsEmpty() && i < Length() ) + EnsureUnique(); + return m_data->begin + i; + } + + /*! + * Returns an immutable array iterator located at the specified index \a i. + */ + const_iterator At( size_type i ) const noexcept + { + PCL_PRECONDITION( !IsEmpty() && i < Length() ) + return m_data->begin + i; + } + + /*! + * Returns a mutable iterator pointing to the same array element as the + * specified immutable iterator \a i. + * + * \warning As a side-effect of calling this function, the specified + * immutable iterator \a i may become invalid. This happens when this + * function is called for a shared array, since in this case getting a + * mutable iterator involves a deep copy of the array through an implicit + * call to EnsureUnique(). + */ + iterator MutableIterator( const_iterator i ) + { + return At( i - m_data->begin ); + } + + /*! + * Returns a reference to the element at the specified index \a i. No bounds + * checking is performed. + */ + T& operator []( size_type i ) + { + return *At( i ); + } + + /*! + * Returns a reference to the unmodifiable element at the specified index + * \a i in this array. No bounds checking is performed. + */ + const T& operator []( size_type i ) const noexcept + { + return *At( i ); + } + + /*! + * Returns a reference to the first element of this array. + */ + T& operator *() + { + PCL_PRECONDITION( m_data->begin != nullptr ) + EnsureUnique(); + return *m_data->begin; + } + + /*! + * Returns a reference to the unmodifiable first element of this array. + */ + const T& operator *() const noexcept + { + PCL_PRECONDITION( m_data->begin != nullptr ) + return *m_data->begin; + } + + /*! + * Returns a mutable iterator located at the beginning of this array. + */ + iterator Begin() + { + EnsureUnique(); + return m_data->begin; + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator Begin() const noexcept + { + return m_data->begin; + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator ConstBegin() const noexcept + { + return m_data->begin; + } + + /*! + * Returns a mutable iterator located at the end of this array. + */ + iterator End() + { + EnsureUnique(); + return m_data->end; + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator End() const noexcept + { + return m_data->end; + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator ConstEnd() const noexcept + { + return m_data->end; + } + + /*! + * Returns a mutable reverse iterator located at the reverse + * beginning of this array. + * + * The reverse beginning corresponds to the last element in the array. + */ + reverse_iterator ReverseBegin() + { + PCL_PRECONDITION( m_data->end != nullptr ) + EnsureUnique(); + return m_data->end - 1; + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this array. + * + * The reverse beginning corresponds to the last element in the array. + */ + const_reverse_iterator ReverseBegin() const noexcept + { + PCL_PRECONDITION( m_data->end != nullptr ) + return m_data->end - 1; + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this array. + * + * The reverse beginning corresponds to the last element in the array. + */ + const_reverse_iterator ConstReverseBegin() const noexcept + { + PCL_PRECONDITION( m_data->end != nullptr ) + return m_data->end - 1; + } + + /*! + * Returns a mutable reverse iterator located at the reverse end of + * this array. + * + * The reverse end corresponds to an (nonexistent) element immediately + * before the first element in the array. + */ + reverse_iterator ReverseEnd() + { + PCL_PRECONDITION( m_data->begin != nullptr ) + EnsureUnique(); + return m_data->begin - 1; + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this array. + * + * The reverse end corresponds to an (nonexistent) element immediately + * before the first element in the array. + */ + const_reverse_iterator ReverseEnd() const noexcept + { + PCL_PRECONDITION( m_data->begin != nullptr ) + return m_data->begin - 1; + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this array. + * + * The reverse end corresponds to an (nonexistent) element immediately + * before the first element in the array. + */ + const_reverse_iterator ConstReverseEnd() const noexcept + { + PCL_PRECONDITION( m_data->begin != nullptr ) + return m_data->begin - 1; + } + + /*! + * Ensures that the specified iterator points to a uniquely referenced + * object. If necessary, this function builds a new, uniquely referenced + * copy of this array by calling EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the object + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + PCL_PRECONDITION( i >= m_data->begin && i <= m_data->end ) + if ( !IsUnique() ) + { + distance_type d = i - m_data->begin; + EnsureUnique(); + i = m_data->begin + d; + } + } + + /*! + * Ensures that the specified iterators point to uniquely referenced + * objects. If necessary, this function builds a new, uniquely referenced + * copy of this array by calling EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the objects at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + PCL_PRECONDITION( i >= m_data->begin && i <= m_data->end ) + PCL_PRECONDITION( j >= m_data->begin && j <= m_data->end ) + if ( !IsUnique() ) + { + distance_type d = i - m_data->begin; + distance_type r = j - i; + EnsureUnique(); + j = (i = m_data->begin + d) + r; + } + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const noexcept + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const noexcept + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this array to reference the same data as another array \a x. + * Returns a reference to this object. + */ + Array& operator =( const Array& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns an array \a x to this array. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Increments the reference counter of the source array's data and + * references it in this array. + */ + void Assign( const Array& x ) + { + x.m_data->Attach(); + DetachFromData(); + m_data = x.m_data; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Array& operator =( Array&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( Array& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Transfers data from another array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( Array&& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Replaces the contents of this array with a sequence of \a n copies of an + * object \a v. + */ + void Assign( const T& v, size_type n = 1 ) + { + if ( n > 0 ) + { + if ( !IsUnique() ) + { + Data* newData = new Data; + DetachFromData(); + m_data = newData; + } + + if ( Capacity() < n ) + { + m_data->Deallocate(); + m_data->Allocate( n ); + } + else + { + m_data->Destroy( m_data->begin, m_data->end ); + m_data->end = m_data->begin + n; + } + + m_data->Initialize( m_data->begin, m_data->end, v ); + } + else + Clear(); + } + + /*! + * Replaces the contents of this array with a copy of the sequence defined + * by the range [i,j) of forward iterators. + * + * \note \a i and \a j must not be iterators into this array. + */ + template + void Assign( FI i, FI j ) + { + size_type n = size_type( pcl::Distance( i, j ) ); + if ( n > 0 ) + { + if ( !IsUnique() ) + { + Data* newData = new Data; + DetachFromData(); + m_data = newData; + } + + if ( Capacity() < n ) + { + m_data->Deallocate(); + m_data->Allocate( n ); + } + else + { + m_data->Destroy( m_data->begin, m_data->end ); + m_data->end = m_data->begin + n; + } + + m_data->Build( m_data->begin, i, j ); + } + else + Clear(); + } + + /*! + * Causes this array to contain the sequence of objects defined by the range + * [i,j) of array iterators. The previously referenced data structure is + * dereferenced and destroyed/deallocated if it becomes unreferenced. + * + * After calling this function, this array, or a subsequently created alias, + * will own and eventually destroy and deallocate the specified sequence of + * contiguous objects. + */ + void Import( iterator i, iterator j ) + { + if ( i >= m_data->available || j <= m_data->begin ) + { + Clear(); + size_type n = size_type( pcl::Distance( i, j ) ); + if ( n > 0 ) + { + EnsureUnique(); + m_data->begin = i; + m_data->end = m_data->available = j; + } + } + } + + /*! + * Releases the data contained by this array. + * + * This member function returns a pointer to the internal data block + * referenced by this object, after ensuring that it is uniquely referenced. + * If the array is empty, this function may return the null pointer. + * + * Before returning, this member function empties this array without + * deallocating its contained data. The caller is then responsible for + * destructing and/or deallocating the returned block when it is no longer + * required. + */ + iterator Release() + { + EnsureUnique(); + iterator b = m_data->begin; + m_data->begin = m_data->end = m_data->available = nullptr; + return b; + } + + /*! + * Inserts a contiguous sequence of \a n default-constructed objects at the + * specified location \a i in this array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first newly created array element, or + * \a i if \a n is zero. + */ + iterator Grow( iterator i, size_type n = 1 ) + { + i = pcl::Range( i, m_data->begin, m_data->end ); + if ( n > 0 ) + { + UniquifyIterator( i ); + m_data->Initialize( i = m_data->UninitializedGrow( i, n ), n ); + } + return i; + } + + /*! + * Appends a contiguous sequence of \a n default-constructed objects to this + * array. This operation is equivalent to: + * + * \code Grow( End(), n ) \endcode + * + * Returns an iterator pointing to the first newly created array element, or + * End() if \a n is zero. + */ + iterator Expand( size_type n = 1 ) + { + return Grow( m_data->end, n ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing objects from this + * array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + */ + void Shrink( size_type n = 1 ) + { + if ( n < m_data->Length() ) + Truncate( m_data->end - n ); + else + Clear(); + } + + /*! + * Resizes this array to the specified length \a n, either by appending new + * default-constructed objects, or by removing existing trailing objects. + * This operation is equivalent to: + * + * \code + * if ( n > Length() ) + * Expand( n - Length() ); + * else + * Shrink( Length() - n ); + * \endcode + */ + void Resize( size_type n ) + { + size_type l = m_data->Length(); + if ( n > l ) + Expand( n - l ); + else + Shrink( l - n ); + } + + /*! + * Inserts a copy of the objects in a direct container \a x at the specified + * location \a i in this array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. The source array \a x can + * safely be a reference to this array. + * + * Returns an iterator pointing to the first newly created array element, or + * \a i if \a x is empty. + */ + iterator Insert( iterator i, const Array& x ) + { + if ( &x != this ) + return Insert( i, x.Begin(), x.End() ); + Array t( *this ); + t.EnsureUnique(); + return Insert( i, t.m_data->begin, t.m_data->end ); + } + + /*! + * Inserts a contiguous sequence of \a n copies of the object \a v at the + * specified location \a i in this array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a n is zero. + */ + iterator Insert( iterator i, const T& v, size_type n = 1 ) + { + i = pcl::Range( i, m_data->begin, m_data->end ); + if ( n > 0 ) + { + UniquifyIterator( i ); + m_data->Initialize( i = m_data->UninitializedGrow( i, n ), n, v ); + } + return i; + } + + /*! + * Inserts a copy of the sequence of objects defined by the range [p,q) of + * forward iterators at the specified location \a i in this array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a q <= \a p. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Insert( iterator i, FI p, FI q ) + { + i = pcl::Range( i, m_data->begin, m_data->end ); + size_type n = size_type( pcl::Distance( p, q ) ); + if ( n > 0 ) + { + UniquifyIterator( i ); + m_data->Build( i = m_data->UninitializedGrow( i, n ), p, q ); + } + return i; + } + + /*! + * Appends a copy of the objects stored in the array \a x to this array. + */ + void Append( const Array& x ) + { + Insert( m_data->end, x ); + } + + /*! + * Appends a contiguous sequence of \a n copies of the object \a v to this + * array. + */ + void Append( const T& v, size_type n = 1 ) + { + Insert( m_data->end, v, n ); + } + + /*! + * Appends a copy of the sequence of objects defined by the range [p,q) + * of forward iterators to this array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Append( FI p, FI q ) + { + Insert( m_data->end, p, q ); + } + + /*! + * Inserts a copy of the objects stored in the array \a x at the beginning + * of this array. + */ + void Prepend( const Array& x ) + { + Insert( m_data->begin, x ); + } + + /*! + * Inserts a contiguous sequence of \a n copies of the object \a v at + * the beginning of this array. + */ + void Prepend( const T& v, size_type n = 1 ) + { + Insert( m_data->begin, v, n ); + } + + /*! + * Inserts a copy of the sequence of objects defined by the range [p,q) of + * forward iterators at the beginning of this array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Prepend( FI p, FI q ) + { + Insert( m_data->begin, p, q ); + } + + /*! + * A synonym for Append( const Array<>& ). + */ + void Add( const Array& x ) + { + Append( x ); + } + + /*! + * A synonym for Append( const T&, size_type ) + */ + void Add( const T& v, size_type n = 1 ) + { + Append( v, n ); + } + + /*! + * A synonym for Append( FI, FI ) + */ + template + void Add( FI p, FI q ) + { + Append( p, q ); + } + + /*! + * Destroys and removes a sequence of \a n contiguous objects starting at + * the specified location \a i in this array. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a n is zero, this function does nothing. Otherwise \a i is + * constrained to stay in the range [Begin(),End()) of existing array + * elements. + */ + void Remove( iterator i, size_type n = 1 ) + { + Remove( i, i+n ); + } + + /*! + * Destroys and removes a sequence of contiguous objects in the range [i,j) + * of this array. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + */ + void Remove( iterator i, iterator j ) + { + if ( i < m_data->end ) + if ( i < j ) + { + i = pcl::Max( m_data->begin, i ); + j = pcl::Min( j, m_data->end ); + if ( i > m_data->begin || j < m_data->end ) + { + UniquifyIterators( i, j ); + m_data->Destroy( j = pcl::Copy( i, j, m_data->end ), m_data->end ); + m_data->end = j; + } + else + Clear(); + } + } + + /*! + * Destroys and removes a trailing sequence of contiguous objects from the + * specified iterator of this array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator is located at or after the end of this array, + * this function does nothing. Otherwise the iterator is constrained to stay + * in the range [Begin(),End()) of existing array elements. + */ + void Truncate( iterator i ) + { + Remove( i, m_data->end ); + } + + /*! + * Destroys and removes all existing objects equal to the specified value + * \a v in this array. + */ + void Remove( const T& v ) + { + Array a; + for ( iterator i = m_data->begin, j = i; ; ++j ) + { + if ( j == m_data->end ) + { + if ( i != m_data->begin ) + { + a.Add( i, j ); + Transfer( a ); + } + break; + } + + if ( *j == v ) + { + a.Add( i, j ); + i = j; + ++i; + } + } + } + + /*! + * Destroys and removes every object x in this array such that the binary + * predicate p( x, \a v ) is true. + */ + template + void Remove( const T& v, BP p ) + { + Array a; + for ( iterator i = m_data->begin, j = i; ; ++j ) + { + if ( j == m_data->end ) + { + if ( i != m_data->begin ) + { + a.Add( i, j ); + Transfer( a ); + } + break; + } + + if ( p( *j, v ) ) + { + a.Add( i, j ); + i = j; + ++i; + } + } + } + + /*! + * Removes and possibly destroys all objects contained, yielding an empty + * array. + * + * If this array is empty, then calling this member function has no effect. + * + * If this array uniquely references its internal array data structure, all + * objects contained are destroyed and deallocated; otherwise its reference + * counter is decremented and a new, empty array data structure is created + * and uniquely referenced. + */ + void Clear() + { + if ( !IsEmpty() ) + if ( IsUnique() ) + m_data->Deallocate(); + else + { + Data* newData = new Data; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Replaces a sequence of contiguous objects defined by the range [i,j) of + * iterators in this array by the objects stored in an array \a x. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + */ + iterator Replace( iterator i, iterator j, const Array& x ) + { + if ( &x != this ) + return Replace( i, j, x.Begin(), x.End() ); + Array t( *this ); + t.EnsureUnique(); + return Replace( i, j, t.ConstBegin(), t.ConstEnd() ); + } + + /*! + * Replaces a sequence of contiguous objects defined by the range [i,j) of + * iterators in this array by \a n copies of the specified object \a v. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + */ + iterator Replace( iterator i, iterator j, const T& v, size_type n = 1 ) + { + i = pcl::Range( i, m_data->begin, m_data->end ); + j = pcl::Range( j, m_data->begin, m_data->end ); + if ( i < j ) + if ( i < m_data->end ) + { + UniquifyIterators( i, j ); + size_type d = size_type( j - i ); + if ( d < n ) + { + m_data->Destroy( i, j ); + m_data->Initialize( i = m_data->UninitializedGrow( i, n-d ), n, v ); + } + else + { + iterator k = i + n; + pcl::Fill( i, k, v ); + Remove( k, j ); + if ( m_data->begin == nullptr ) + i = nullptr; + } + } + return i; + } + + /*! + * Replaces a sequence of contiguous objects defined by the range [i,j) of + * iterators in this array by the sequence of objects in the range [p,q) of + * forward iterators. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Replace( iterator i, iterator j, FI p, FI q ) + { + i = pcl::Range( i, m_data->begin, m_data->end ); + j = pcl::Range( j, m_data->begin, m_data->end ); + if ( i < j ) + if ( i < m_data->end ) + { + UniquifyIterators( i, j ); + size_type d = size_type( j - i ); + size_type n = size_type( pcl::Distance( p, q ) ); + if ( d < n ) + { + m_data->Destroy( i, j ); + m_data->Build( i = m_data->UninitializedGrow( i, n-d ), p, q ); + } + else + { + Remove( pcl::Move( i, p, q ), j ); + if ( m_data->begin == nullptr ) + i = nullptr; + } + } + return i; + } + + /*! + * Ensures that this array has enough capacity to store \a n objects. + * + * After calling this member function with \a n > 0, this object is + * guaranteed to uniquely reference its array data. + */ + void Reserve( size_type n ) + { + if ( n > 0 ) + if ( IsUnique() ) + { + if ( Capacity() < n ) + { + iterator b = m_data->alloc.Allocate( n ); + iterator e = m_data->Build( b, m_data->begin, m_data->end ); + m_data->Deallocate(); + m_data->begin = b; + m_data->end = e; + m_data->available = m_data->begin + n; + } + } + else + { + Data* newData = new Data; + newData->begin = newData->alloc.Allocate( n = pcl::Max( Length(), n ) ); + newData->end = newData->Build( newData->begin, m_data->begin, m_data->end ); + newData->available = newData->begin + n; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Causes this array to allocate the exact required memory space to store + * its contained objects. + * + * If the array has excess capacity, a new copy of its contained objects + * is generated and stored in a newly allocated memory block that fits them + * exactly, then the previous memory block is deallocated. + * + * If the array is empty, calling this function is equivalent to Clear(). + * Note that in this case a previously allocated memory block (by a call to + * Reserve()) may also be deallocated. + */ + void Squeeze() + { + if ( IsUnique() ) + { + if ( Available() > 0 ) + { + iterator b = m_data->alloc.Allocate( Length() ); + iterator e = m_data->Build( b, m_data->begin, m_data->end ); + m_data->Deallocate(); + m_data->begin = b; + m_data->end = m_data->available = e; + } + } + else + { + Data* newData = new Data; + if ( !IsEmpty() ) + { + newData->begin = newData->alloc.Allocate( Length() ); + newData->available = newData->end = newData->Build( newData->begin, m_data->begin, m_data->end ); + } + DetachFromData(); + m_data = newData; + } + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + EnsureUnique(); + pcl::Fill( m_data->begin, m_data->end, v ); + } + + /*! + * Securely fills this array and all instances sharing its data with the + * specified value \a v. + * + * The normal data sharing mechanism is ignored on purpose by this member + * function, so if there are other objects sharing the same array data, all + * of them will be affected unconditionally. + * + * This function is useful to ensure that sensitive data, such as user + * passwords and user names, are destroyed without the risk of surviving + * duplicates as a result of implicit data sharing. + */ + void SecureFill( const T& v ) + { + pcl::Fill( m_data->begin, m_data->end, v ); + } + + /*! + * Calls f( T& x ) for every object x contained by this array, successively + * from the first contained object to the last one. + */ + template + void Apply( F f ) + { + EnsureUnique(); + pcl::Apply( m_data->begin, m_data->end, f ); + } + + /*! + * Calls f( const T& x ) for every object x contained by this array, + * successively from the first contained object to the last one. + */ + template + void Apply( F f ) const noexcept( noexcept( f ) ) + { + pcl::Apply( m_data->begin, m_data->end, f ); + } + + /*! + * Returns an iterator pointing to the first object x in this array such + * that f( const T& x ) is true. Returns End() if such object does not + * exist. + */ + template + iterator FirstThat( F f ) const noexcept( noexcept( f ) ) + { + return const_cast( pcl::FirstThat( m_data->begin, m_data->end, f ) ); + } + + /*! + * Returns an iterator pointing to the last object x in this array such + * that f( const T& x ) is true. Returns End() if such object does not + * exist. + */ + template + iterator LastThat( F f ) const noexcept( noexcept( f ) ) + { + return const_cast( pcl::LastThat( m_data->begin, m_data->end, f ) ); + } + + /*! # + */ + size_type Count( const T& v ) const noexcept + { + return pcl::Count( m_data->begin, m_data->end, v ); + } + + /*! # + */ + template + size_type Count( const T& v, BP p ) const noexcept( noexcept( p ) ) + { + return pcl::Count( m_data->begin, m_data->end, v, p ); + } + + /*! # + */ + template + size_type CountIf( UP p ) const noexcept( noexcept( p ) ) + { + return pcl::CountIf( m_data->begin, m_data->end, p ); + } + + /*! # + */ + iterator MinItem() const noexcept + { + return const_cast( pcl::MinItem( m_data->begin, m_data->end ) ); + } + + /*! # + */ + template + iterator MinItem( BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::MinItem( m_data->begin, m_data->end, p ) ); + } + + /*! # + */ + iterator MaxItem() const noexcept + { + return const_cast( pcl::MaxItem( m_data->begin, m_data->end ) ); + } + + /*! # + */ + template + iterator MaxItem( BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::MaxItem( m_data->begin, m_data->end, p ) ); + } + + /*! # + */ + void Reverse() + { + EnsureUnique(); + pcl::Reverse( m_data->begin, m_data->end ); + } + + /*! # + */ + void Rotate( distance_type n ) + { + if ( Length() > 1 && n != 0 ) + { + EnsureUnique(); + if ( (n %= Length()) < 0 ) + n += Length(); + pcl::Rotate( m_data->begin, m_data->begin+n, m_data->end ); + } + } + + /*! # + */ + void ShiftLeft( const T& v, size_type n = 1 ) + { + if ( !IsEmpty() && n > 0 ) + { + EnsureUnique(); + if ( n >= Length() ) + pcl::Fill( m_data->begin, m_data->end, v ); + else + pcl::ShiftLeft( m_data->begin, m_data->begin+n, m_data->end, v ); + } + } + + /*! # + */ + void ShiftRight( const T& v, size_type n = 1 ) + { + if ( !IsEmpty() && n > 0 ) + { + EnsureUnique(); + if ( n >= Length() ) + pcl::Fill( m_data->begin, m_data->end, v ); + else + pcl::ShiftRight( m_data->begin, m_data->end-n, m_data->end, v ); + } + } + + /*! # + */ + iterator Search( const T& v ) const noexcept + { + return const_cast( pcl::LinearSearch( m_data->begin, m_data->end, v ) ); + } + + /*! # + */ + template + iterator Search( const T& v, BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::LinearSearch( m_data->begin, m_data->end, v, p ) ); + } + + /*! # + */ + iterator SearchLast( const T& v ) const noexcept + { + return const_cast( pcl::LinearSearchLast( m_data->begin, m_data->end, v ) ); + } + + /*! # + */ + template + iterator SearchLast( const T& v, BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::LinearSearchLast( m_data->begin, m_data->end, v, p ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j ) const noexcept + { + return const_cast( pcl::Search( m_data->begin, m_data->end, i, j ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j, BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::Search( m_data->begin, m_data->end, i, j, p ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& x ) const noexcept + { + PCL_ASSERT_DIRECT_CONTAINER( C, T ); + return const_cast( pcl::Search( m_data->begin, m_data->end, x.Begin(), x.End() ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& x, BP p ) const noexcept( noexcept( p ) ) + { + PCL_ASSERT_DIRECT_CONTAINER( C, T ); + return const_cast( pcl::Search( m_data->begin, m_data->end, x.Begin(), x.End(), p ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j ) const noexcept + { + return const_cast( pcl::SearchLast( m_data->begin, m_data->end, i, j ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j, BP p ) const noexcept( noexcept( p ) ) + { + return const_cast( pcl::SearchLast( m_data->begin, m_data->end, i, j, p ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& x ) const noexcept + { + PCL_ASSERT_DIRECT_CONTAINER( C, T ); + return const_cast( pcl::SearchLast( m_data->begin, m_data->end, x.Begin(), x.End() ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& x, BP p ) const noexcept( noexcept( p ) ) + { + PCL_ASSERT_DIRECT_CONTAINER( C, T ); + return const_cast( pcl::SearchLast( m_data->begin, m_data->end, x.Begin(), x.End(), p ) ); + } + + /*! # + */ + bool Contains( const T& v ) const noexcept + { + return Search( v ) != m_data->end; + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const noexcept( noexcept( p ) ) + { + return Search( v, p ) != m_data->end; + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j ) const noexcept + { + return SearchSubset( i, j ) != m_data->end; + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j, BP p ) const noexcept( noexcept( p ) ) + { + return SearchSubset( i, j, p ) != m_data->end; + } + + /*! # + */ + template + iterator ContainsSubset( const C& c ) const noexcept + { + return SearchSubset( c ) != m_data->end; + } + + /*! # + */ + template + iterator ContainsSubset( const C& c, BP p ) const noexcept( noexcept( p ) ) + { + return SearchSubset( c, p ) != m_data->end; + } + + /*! # + */ + void Sort() + { + EnsureUnique(); + pcl::QuickSort( m_data->begin, m_data->end ); + } + + /*! # + */ + template + void Sort( BP p ) + { + EnsureUnique(); + pcl::QuickSort( m_data->begin, m_data->end, p ); + } + + /*! + * Exchanges two dynamic arrays \a x1 and \a x2. + */ + friend void Swap( Array& x1, Array& x2 ) noexcept + { + pcl::Swap( x1.m_data, x2.m_data ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each element in this array, this function appends a string + * representation (known as a \e token) to the target string \a s. If the + * array contains more than one element, successive tokens are separated + * with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + const_iterator i = m_data->begin; + if ( i < m_data->end ) + { + s.Append( S( *i ) ); + if ( ++i < m_data->end ) + do + { + s.Append( separator ); + s.Append( S( *i ) ); + } + while ( ++i < m_data->end ); + } + return s; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each element x in this array, this function appends a string + * representation (known as a \e token) to the target string \a s by calling + * the \a append function: + * + *\code append( s, S( x ) ); \endcode + * + * If the array contains more than one element, successive tokens are + * separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + const_iterator i = m_data->begin; + if ( i < m_data->end ) + { + append( s, S( *i ) ); + if ( ++i < m_data->end ) + { + S p( separator ); + do + { + append( s, p ); + append( s, S( *i ) ); + } + while ( ++i < m_data->end ); + } + } + return s; + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return ToSeparated( s, ',' ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return ToSeparated( s, ' ' ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return ToSeparated( s, '\t' ); + } + + /*! + * Generates a newline-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\n' ); \endcode + */ + template + S& ToNewLineSeparated( S& s ) const + { + return ToSeparated( s, '\n' ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this array. + * + * This function calls pcl::Hash64() for the internal array buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return pcl::Hash64( m_data->begin, m_data->Size(), seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this array. + * + * This function calls pcl::Hash32() for the internal array buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const noexcept + { + return pcl::Hash32( m_data->begin, m_data->Size(), seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this array. This + * function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const noexcept + { + return Hash64( seed ); + } + + // ------------------------------------------------------------------------- + +private: + + /*! + * \struct Data + * \internal + * Reference-counted array data structure. + */ + struct Data : public ReferenceCounter + { + iterator begin = nullptr; //!< Beginning of the dynamic array + iterator end = nullptr; //!< End of the array + iterator available = nullptr; //!< End of the allocated block + allocator alloc; //!< The allocator object + + /*! + * Constructs an empty array data structure. + */ + Data() = default; + + /*! + * Destroys an array data structure. + */ + ~Data() + { + Deallocate(); + } + + /*! + * Returns the size in bytes of the array. + */ + size_type Size() const noexcept + { + return Length()*sizeof( T ); + } + + /*! + * Returns the number of elements in the array. + */ + size_type Length() const noexcept + { + return end - begin; + } + + /*! + * Returns the total capacity of the allocated block in array elements. + */ + size_type Capacity() const noexcept + { + return available - begin; + } + + /*! + * Returns the number of array elements available in the allocated block. + */ + size_type Available() const noexcept + { + return available - end; + } + + /*! + * Returns true iff the array is empty. + */ + bool IsEmpty() const noexcept + { + return begin == end; + } + + /*! + * Allocates space to store at least \a n array elements, and updates + * internal pointers to define an array of \a n elements. + */ + void Allocate( size_type n ) + { + if ( n > 0 ) + { + size_type m = alloc.PagedLength( n ); + begin = alloc.Allocate( m ); + end = begin + n; + available = begin + m; + } + } + + /*! + * Deallocates array data, yielding an empty structure. + */ + void Deallocate() + { + PCL_CHECK( (begin == nullptr) ? end == nullptr : begin < end ) + if ( begin != nullptr ) + { + Destroy( begin, end ); + alloc.Deallocate( begin ); + begin = end = available = nullptr; + } + } + + /*! + * Constructs array elements with default values in the range [i,j). + */ + void Initialize( iterator __restrict__ i, iterator __restrict__ j ) + { + for ( ; i < j; ++i ) + pcl::Construct( i, alloc ); + } + + /*! + * Constructs \a n consecutive array elements with default values, + * starting from the element pointed to by \a i. + */ + void Initialize( iterator __restrict__ i, size_type n ) + { + for ( ; n > 0; ++i, --n ) + pcl::Construct( i, alloc ); + } + + /*! + * Constructs array elements with the specified value \a v in the range + * [i,j). + */ + void Initialize( iterator __restrict__ i, iterator __restrict__ j, const T& v ) + { + for ( ; i < j; ++i ) + pcl::Construct( i, v, alloc ); + } + + /*! + * Constructs \a n consecutive array elements with the specified value + * \a v, starting from the element pointed to by \a i. + */ + void Initialize( iterator __restrict__ i, size_type n, const T& v ) + { + for ( ; n > 0; ++i, --n ) + pcl::Construct( i, v, alloc ); + } + + /*! + * Copy-constructs array elements starting from the element pointed to by + * \a i, with source elements in the range [p,q) of iterators. Returns an + * iterator after the last constructed element. + */ + template + iterator Build( iterator __restrict__ i, FI p, FI q ) + { + for ( ; p != q; ++i, ++p ) + pcl::Construct( i, *p, alloc ); + return i; + } + + /*! + * Causes this array to grow by \a n uninitialized elements at the + * array location corresponding to the specified iterator \a i. Returns + * an iterator pointing to the first newly created element. + */ + iterator UninitializedGrow( iterator __restrict__ i, size_type n ) + { + if ( n > 0 ) + if ( Available() >= n ) + { + if ( i < end ) + { + iterator __restrict__ j1 = end; + iterator __restrict__ j2 = end + n; + + for ( ;; ) + { + pcl::Construct( --j2, *--j1, alloc ); + + if ( j1 == i ) + { + j2 = end; + break; + } + else if ( j2 == end ) + { + do + *--j2 = *--j1; + while ( j1 > i ); + break; + } + } + + Destroy( i, j2 ); + } + end += n; + } + else + { + size_type m = alloc.PagedLength( Length()+n ); + iterator b = alloc.Allocate( m ); + iterator r = Build( b, begin, i ); + iterator e = Build( r+n, i, end ); + + Deallocate(); + begin = b; + end = e; + available = b + m; + i = r; + } + + return i; + } + + /*! + * Destroys array elements in the range [i,j). + */ + static void Destroy( iterator i, iterator j ) + { + pcl::Destroy( i, j ); + } + }; + + /*! + * \internal + * The reference-counted array data. + */ + Data* m_data = nullptr; + + /*! + * \internal + * Dereferences array data and disposes it if it becomes garbage. + */ + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup array_relational_operators Array Relational Operators + */ + +/*! + * Returns true only if two arrays \a x1 and \a x2 are equal. This operator + * compares the objects contained by both arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator ==( const Array& x1, const Array& x2 ) noexcept +{ + return x1.Length() == x2.Length() && pcl::Equal( x1.Begin(), x2.Begin(), x2.End() ); +} + +/*! + * Returns true only if an array \a x1 precedes another array \a x2. This + * operator compares the objects contained by both arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator <( const Array& x1, const Array& x2 ) noexcept +{ + return pcl::Compare( x1.Begin(), x1.End(), x2.Begin(), x2.End() ) < 0; +} + +/*! + * \defgroup array_insertion_operators Array Insertion Operators + */ + +/*! + * Appends an object \a v to an array \a x. Returns a reference to the array. + * + * The template argument type T must have conversion semantics from the type V, + * such as T::T( const V& ) or equivalent. + * \ingroup array_insertion_operators + */ +template inline +Array& operator <<( Array& x, const V& v ) +{ + x.Append( T( v ) ); + return x; +} + +/*! + * Appends an object \a v to an array \a x. Returns a reference to the array. + * + * The template argument type T must have conversion semantics from the type V, + * such as T::T( const V& ) or equivalent. + * \ingroup array_insertion_operators + */ +template inline +Array& operator <<( Array&& x, const V& v ) +{ + x.Append( T( v ) ); + return x; +} + +/*! + * Appends an array \a x2 to an array \a x1. Returns a reference to the + * left-hand array \a x1. + * \ingroup array_insertion_operators + */ +template inline +Array& operator <<( Array& x1, const Array& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +/*! + * Appends an array \a x2 to a temporary array \a x1. Returns a reference to + * the left-hand array \a x1. + * \ingroup array_insertion_operators + */ +template inline +Array& operator <<( Array&& x1, const Array& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Array_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Array.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Association.h b/3rdparty/include/pcl/Association.h new file mode 100644 index 0000000..ad9acf4 --- /dev/null +++ b/3rdparty/include/pcl/Association.h @@ -0,0 +1,164 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Association.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Association_h +#define __PCL_Association_h + +/// \file pcl/Association.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Association + * \brief Generic association of two objects. + */ +template +class PCL_CLASS Association +{ +public: + + T1 first; //!< First member of this association + T2 second; //!< Second member of this association + + /*! + * Constructs an association with default-constructed member values. + */ + Association() = default; + + /*! + * Copy constructor. + */ + Association( const Association& ) = default; + + /*! + * Move constructor. + */ + Association( Association&& ) = default; + + /*! + * Constructs an association with the specified values \a x1 and \a x2, + * respectively for the \a first and \a second members. + */ + Association( const T1& x1, const T2& x2 ) + : first( x1 ) + , second( x2 ) + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup association_utilities Association Operators and Utility Functions + */ + +/*! + * Returns an Association whose members are copies of the specified objects + * \a x1 and \a x2. + * \ingroup association_utilities + */ +template inline +Association Associate( const T1& x1, const T2& x2 ) +{ + return Association( x1, x2 ); +} + +/*! + * Returns true iff two associations, \a x1 and \a x2, are equal. Two + * associations are equal if their homolog members are equal. + * \ingroup association_utilities + */ +template inline +bool operator ==( const Association& x1, const Association& x2 ) +{ + return x1.first == x2.first && x1.second == x2.second; +} + +/*! + * Returns true iff an association \a x1 is less than other association \a x2. + * The comparison algorithm is as follows: + * + * \code + * if ( x1.first == x2.first ) + * return x1.second < x2.second; + * else + * return x1.first < x2.first; + * \endcode + * + * So in association comparisons the first member of each association has + * precedence over the second member. + * + * The implementation of this operator only requires less than + * semantics for the two types T1 and T2; it doesn't use equality operators. + * \ingroup association_utilities + */ +template inline +bool operator <( const Association& x1, const Association& x2 ) +{ + //return (x1.first == x2.first) ? x1.second < x2.second : x1.first < x2.first; + return (x1.first < x2.first) ? true : ((x2.first < x1.first) ? false : x1.second < x2.second); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Association_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Association.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AstrometricMetadata.h b/3rdparty/include/pcl/AstrometricMetadata.h new file mode 100644 index 0000000..e80d081 --- /dev/null +++ b/3rdparty/include/pcl/AstrometricMetadata.h @@ -0,0 +1,1121 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AstrometricMetadata.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AstrometricMetadata_h +#define __PCL_AstrometricMetadata_h + +/// \file pcl/AstrometricMetadata.h + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ + class ImageWindow; +} +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup astrometry_support Astrometry Support Classes + * + * This group of classes implement the core astrometry support on the + * PixInsight platform. + * + * The original implementation of these classes has been contributed by Spanish + * software developer and PTeam member Andrés del Pozo, who is also the author + * of all astrometry scripts available in the standard PixInsight distribution, + * including the ImageSolver and AnnotateImage scripts, among others. + */ + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION +class PCL_CLASS ImageWindow; +#endif + +class PCL_CLASS XISFReader; +class PCL_CLASS XISFWriter; + +/*! + * \class AstrometricMetadata + * \brief Astrometric metadata + * + * \ingroup astrometry_support + */ +class PCL_CLASS AstrometricMetadata +{ +public: + + /*! + * \struct pcl::AstrometricMetadata::DescriptionItems + * \brief A collection of strings describing the properties and parameters + * of an astrometric solution. + */ + struct DescriptionItems + { + String referenceMatrix; + String wcsTransformationType; + String controlPoints; + String splineLengths; + String projectionName; + String projectionOrigin; + String resolution; + String rotation; + String referenceSystem; + String observationStartTime; + String observationEndTime; + String observerLocation; + String focalDistance; + String pixelSize; + String fieldOfView; + String centerCoordinates; + String topLeftCoordinates; + String topRightCoordinates; + String bottomLeftCoordinates; + String bottomRightCoordinates; + }; + + /*! + * Default constructor. Constructs an uninitialized %AstrometricMetadata + * object. + */ + AstrometricMetadata() = default; + + /*! + * Copy constructor. + */ + AstrometricMetadata( const AstrometricMetadata& x ) + : m_projection( x.m_projection->Clone() ) + , m_transformWI( x.m_transformWI->Clone() ) + , m_refSys( x.m_refSys ) + , m_width( x.m_width ) + , m_height( x.m_height ) + , m_pixelSize( x.m_pixelSize ) + , m_obsStartTime( x.m_obsStartTime ) + , m_obsEndTime( x.m_obsEndTime ) + , m_geoLongitude( x.m_geoLongitude ) + , m_geoLatitude( x.m_geoLatitude ) + , m_geoHeight( x.m_geoHeight ) + , m_resolution( x.m_resolution ) + , m_focalLength( x.m_focalLength ) + { + } + + /*! + * Move constructor. + */ + AstrometricMetadata( AstrometricMetadata&& ) = default; + + /*! + * Constructor from minimal data. + * + * \param projection Pointer to a dynamically allocated projection + * system. + * + * \param worldTransformation Pointer to a dynamically allocated world + * transformation. + * + * \param width Width in pixels of the image with which this + * astrometric solution is associated. + * + * \param height Height in pixels of the image with which this + * astrometric solution is associated. + * + * Ownership of the specified \a projection and \a worldTransformation + * objects will be transferred to this object, which will destroy and + * deallocate them when appropriate. + */ + AstrometricMetadata( ProjectionBase* projection, WorldTransformation* worldTransformation, int width, int height ); + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + // Implemented in /core/Components/ImageWindow.cpp + AstrometricMetadata( const pi::ImageWindow* ); +#else + /*! + * Constructs an %AstrometricMetadata object from the existing keywords and + * properties of an image \a window. + */ + AstrometricMetadata( const ImageWindow& window ); +#endif + + /*! + * Constructs an %AstrometricMetadata object from the existing keywords and + * properties of the currently selected image in an XISF \a reader. + */ + AstrometricMetadata( XISFReader& reader ); + + /*! + * Virtual destructor. + */ + virtual ~AstrometricMetadata() + { + } + + /*! + * Copy constructor. Returns a reference to this object. + */ + AstrometricMetadata& operator =( const AstrometricMetadata& x ) + { + m_projection = x.m_projection->Clone(); + m_transformWI = x.m_transformWI->Clone(); + m_refSys = x.m_refSys; + m_width = x.m_width; + m_height = x.m_height; + m_pixelSize = x.m_pixelSize; + m_obsStartTime = x.m_obsStartTime; + m_obsEndTime = x.m_obsEndTime; + m_geoLongitude = x.m_geoLongitude; + m_geoLatitude = x.m_geoLatitude; + m_geoHeight = x.m_geoHeight; + m_resolution = x.m_resolution; + m_focalLength = x.m_focalLength; + return *this; + } + + /*! + * Move constructor. Returns a reference to this object. + */ + AstrometricMetadata& operator =( AstrometricMetadata&& ) = default; + + /*! + * Returns true iff this object is valid. A valid %AstrometricMetadata + * instance defines a projection system and a world transformation. + */ + bool IsValid() const + { + return !m_projection.IsNull() && !m_transformWI.IsNull(); + } + + /*! + * Checks that this astrometric solution is valid and can perform coherent + * coordinate transformations, and returns the reprojection errors + * measured at the center and the four corners of the image. + * + * \param[out] centerErrors Reprojection errors at the geometric center + * of the image, or (Width()/2,Height()/2) + * image coordinates. + * + * \param[out] topLeftErrors Reprojection errors at (0,0) image + * coordinates. + * + * \param[out] topRightErrors Reprojection errors at (Width(),0) image + * coordinates. + * + * \param[out] bottomLeftErrors Reprojection errors at (0,Height()) image + * coordinates. + * + * \param[out] bottomRightErrors Reprojection errors at (Width(),Height()) + * image coordinates. + * + * This routine performs five successive coordinate transformations, from + * image to celestial and from celestial to image coordinates, computed for + * the four corners and the geometric center of the image. The reported + * values in the specified point variables are the differences between the + * initial and final image coordinates, on the X and Y axes, in pixels. + * + * This function throws an Error exception if the solution has not been + * initialized, or if it cannot perform valid coordinate transformations. + */ + void Verify( DPoint& centerErrors, + DPoint& topLeftErrors, DPoint& topRightErrors, + DPoint& bottomLeftErrors, DPoint& bottomRightErrors ) const; + + /*! + * Checks that this astrometric solution is valid and can perform coherent + * coordinate transformations. + * + * \param tolerance Maximum difference in pixels allowed for validation. + * The default value is 0.01 pixels. + * + * This routine performs two successive coordinate transformations, from + * image to celestial and from celestial to image coordinates, computed for + * the geometric center of the image. If the absolute value of the + * difference between the initial and final image coordinates is greater + * than the specified tolerance in pixels, for one or both axes, an Error + * exception is thrown. + * + * This function also throws an Error exception if the solution has not been + * initialized, or if it cannot perform valid coordinate transformations. + */ + void Validate( double tolerance = 0.01 ) const; + + /*! + * Returns true if this object uses a world transformation based on 2-D + * surface splines (or thin plates), false if a WCS linear + * transformation is being used. + */ + bool HasSplineWorldTransformation() const + { + return dynamic_cast( m_transformWI.Pointer() ) != nullptr; + } + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + // Implemented in /core/Components/ImageWindow/ImageWindow.cpp + void Write( pi::ImageWindow* window, bool notify = true ) const; +#else + /*! + * Updates the keywords and properties of an image \a window to represent + * this astrometric solution. + * + * The pixel dimensions of the image in the target \a window must be + * coherent with this astrometric solution. If that is not true, this member + * function will throw an Error exception. An Error exception will also be + * thrown if this object does not define a valid astrometric solution. + * + * See the UpdateBasicKeywords(), UpdateWCSKeywords() and UpdateProperties() + * member functions for information on the metadata items modified by this + * function. + */ + void Write( ImageWindow& window, bool notify = true ) const; +#endif + + /*! + * Updates the keywords and properties of the current image in an XISF + * \a writer to store the astrometric solution represented by this object. + * + * The caller must ensure that the pixel dimensions of the current image in + * the target %XISF \a writer, that is, the width and height of the image + * being generated, are coherent with this astrometric solution. Currently + * this condition cannot be verified or enforced by this member function. + * + * This function will throw an Error exception if this object does not + * define a valid astrometric solution. + * + * See the UpdateBasicKeywords(), UpdateWCSKeywords() and UpdateProperties() + * member functions for information on the metadata items modified by this + * function. + */ + void Write( XISFWriter& writer ) const; + + /*! + * Returns the name of the coordinate reference system to which this + * astrometric solution has been referred. + * + * This corresponds to the reference system of the coordinates of the + * reference point sources (usually stars with data acquired from + * astrometric catalogs) used to compute the astrometric solution. The + * current implementation supports the following reference systems: + * + * \b ICRS + * + * Reference point source positions are \e astrometric: they include + * corrections for space motion (proper motions, annual parallax and radial + * velocity, when available) and gravitational deflection of light, but + * \e not annual aberration. This is the default reference system that is + * assumed when none is specified or acquired from existing metadata. + * + * \b GCRS + * + * Reference point source positions are \e proper: they include corrections + * for space motion (proper motions, annual parallax and radial velocity, + * when available), gravitational deflection of light, and annual aberration + * (rigorous relativistic model). + * + * Other nonstandard values can be returned by this function, such as + * different values of the RADESYS FITS keyword. Such values will be + * preserved but won't be supported by standard platform implementations. + */ + IsoString ReferenceSystem() const + { + return m_refSys.IsEmpty() ? IsoString( "ICRS" ) : m_refSys; + } + + /*! + * Sets the coordinate reference system. See ReferenceSystem() for more + * information and supported values. + */ + void SetReferenceSystem( const IsoString& refSys ) + { + m_refSys = refSys.Trimmed(); + } + + /*! + * Returns the name of the reference system of celestial coordinates + * derived from the specified image metadata. + * + * \param properties A list of XISF image properties. + * + * \param keywords A list of FITS header keywords. + * + * The reference system will be inferred from the following metadata items: + * + * \li The standard XISF property 'Observation:CelestialReferenceSystem' + * + * \li The standard FITS keyword 'RADESYS'. + * + * In case of metadata duplicity, XISF properties always take precedence + * over FITS keywords. + * + * Typical returned values are "ICRS" and "GCRS". If no valid reference + * system can be deduced from the specified metadata, this function returns + * an empty string. + */ + static IsoString ReferenceSystemFromMetadata( const PropertyArray& properties, const FITSKeywordArray& keywords ); + + /*! + * Returns the width in pixels of the image associated with the astrometric + * solution represented by this object. + */ + int Width() const + { + return m_width; + } + + /*! + * Returns the height in pixels of the image associated with the astrometric + * solution represented by this object. + */ + int Height() const + { + return m_height; + } + + /*! + * Returns a pointer to the projection system of this astrometric solution. + * Returns \c nullptr if this object is not valid. + */ + const ProjectionBase* Projection() const + { + return m_projection.Pointer(); + } + + /*! + * Returns a pointer to the world coordinate transformation of this + * astrometric solution. Returns \c nullptr if this object is not valid. + */ + const WorldTransformation* WorldTransform() const + { + return m_transformWI.Pointer(); + } + + /*! + * Returns the image resolution in seconds of arc per pixel, calculated from + * the specified \a focal distance in millimeters. + */ + double ResolutionFromFocal( double focal ) const + { + return (focal > 0) ? m_pixelSize.OrElse( 0 )/focal * 0.18/Const::pi() : 0.0; + } + + /*! + * Returns the focal distance in millimeters, calculated from the specified + * image \a resolution expressed in seconds of arc per pixel. + */ + double FocalFromResolution( double resolution ) const + { + return ResolutionFromFocal( resolution ); + } + + /*! + * Returns the angle of rotation of the Y axis of the image with respect to + * the north direction, as represented on a flat projection of the celestial + * sphere. A rotation angle of zero aligns north along the positive Y axis. + * A positive rotation angle rotates the Y axis from north to east. + * + * The returned value is the rotation angle of the projection in degrees. + * The \a flipped variable will be true iff the projection is mirrored on + * the east-west direction. + */ + double Rotation( bool& flipped ) const; + + /*! + * Returns the resolution of the image in degrees per pixel. + * + * This value usually is an approximation since it changes across the image. + * It should only be used for informative purposes. + */ + double Resolution() const + { + return m_resolution; + } + + /*! + * Returns the observation start time, if available. When defined, the + * returned value should be represented in the UTC timescale. + */ + Optional ObservationStartTime() const + { + return m_obsStartTime; + } + + /*! + * Sets the observation start time. The specified \a startTime value should + * be represented in the UTC timescale. + */ + void SetObservationStartTime( TimePoint startTime ) + { + m_obsStartTime = startTime; + } + + /*! + * Returns the observation end time, if available. When defined, the + * returned value should be represented in the UTC timescale. + */ + Optional ObservationEndTime() const + { + return m_obsEndTime; + } + + /*! + * Sets the observation end time. The specified \a endTime value should be + * represented in the UTC timescale. + */ + void SetObservationEndTime( TimePoint endTime ) + { + m_obsEndTime = endTime; + } + + /*! + * Returns an estimate of the observation middle time. If both the start and + * end times are defined, returns the time point between them. If only the + * start time is defined, it is returned. Otherwise an undefined object is + * returned. + */ + Optional ObservationMiddleTime() const + { + if ( !m_obsStartTime.IsDefined() ) + return Optional(); + if ( !m_obsEndTime.IsDefined() ) + return m_obsStartTime; + return m_obsStartTime() + (m_obsEndTime() - m_obsStartTime())/2; + } + + /*! + * Returns the geodetic longitude of the observation location, if available. + * The returned value is expressed in degrees in the range (-180,+180], + * reckoned positive eastward of the reference meridian. + */ + Optional LocationLongitude() const + { + return m_geoLongitude; + } + + /*! + * Sets the geodetic longitude of the observation location. The specified + * \a longitude must be expressed in degrees and can be either in the range + * [0,360] or [-180,+180], reckoned positive eastward. + * + * If a value out of the valid range is specified, this function will throw + * an Error exception. + */ + void SetLocationLongitude( double longitude ) + { + if ( longitude > 180 ) + longitude -= 360; + else if ( longitude <= -180 ) + longitude += 360; + if ( longitude < -180 || longitude > +180 ) + throw Error( "AstrometricMetadata::SetLocationLongitude(): Geographic longitude out of range." ); + m_geoLongitude = longitude; + } + + /*! + * Returns the geodetic latitude of the observation location, if available. + * The returned value is expressed in degrees in the range [-90,+90], + * reckoned positive north of the equator. + */ + Optional LocationLatitude() const + { + return m_geoLatitude; + } + + /*! + * Sets the geodetic latitude of the observation location. The specified + * \a latitude must be expressed in degrees and must be in the range + * [-90,+90], reckoned positive north of the equator. + * + * If a value out of the valid range is specified, this function will throw + * an Error exception. + */ + void SetLocationLatitude( double latitude ) + { + if ( latitude < -90 || latitude > +90 ) + throw Error( "AstrometricMetadata::SetLocationLatitude(): Geographic latitude out of range." ); + m_geoLatitude = latitude; + } + + /*! + * Returns the geodetic height of the observation location in meters, if + * available. + */ + Optional LocationHeight() const + { + return m_geoHeight; + } + + /*! + * Sets the geodetic height of the observation location in meters. + */ + void SetLocationHeight( double height ) + { + m_geoHeight = height; + } + + /*! + * Returns the physical pixel size in micrometers, if available. + */ + Optional PixelSize() const + { + return m_pixelSize; + } + + /*! + * Redefines the physical pixel size in micrometers. Recalculates the focal + * distance as a function of the pixel size. + */ + void SetPixelSize( double pixelSize ) + { + m_pixelSize = pixelSize; + m_focalLength = FocalFromResolution( m_resolution ); + } + + /*! + * Transformation from image coordinates to celestial coordinates. + * + * \param[out] pRD Reference to a point where the output equatorial + * spherical coordinates will be stored, expressed in + * degrees. \a pRD.x will be the right ascension and + * \a pRD.y the declination. Output right ascensions are + * constrained to the [0,360) range. Output declinations + * are in the range [-90,+90]. + * + * \param pI Input image coordinates in pixels. The specified + * location can legally lie outside the image bounds + * defined by [0,0]-[Width(),Height()]. + * + * Returns true iff the specified point \a pI can be projected on the + * celestial sphere using this astrometric solution. + * + * The output coordinates stored in \a pRD will be referred to the reference + * system of this astrometric solution, either ICRS or GCRS, as returned by + * the ReferenceSystem() member function. + * + * \sa RawImageToCelestial(), CelestialToImage() + */ + bool ImageToCelestial( DPoint& pRD, const DPoint& pI ) const + { + if ( !IsValid() ) + throw Error( "Invalid call to AstrometricMetadata::ImageToCelestial(): No astrometric solution." ); + if ( m_projection->Inverse( pRD, m_transformWI->Inverse( pI ) ) ) + { + // Constrain right ascension to the [0,360) range. + if ( pRD.x < 0 ) + pRD.x += 360; + else if ( pRD.x >= 360 ) + pRD.x -= 360; + return true; + } + return false; + } + + /*! + * Transformation from image coordinates to celestial coordinates, without + * enforcing a valid range of right ascensions. + * + * \param[out] pRD Reference to a point where the output equatorial + * spherical coordinates will be stored, expressed in + * degrees. \a pRD.x will be the right ascension and + * \a pRD.y the declination. Output right ascensions are + * \e not constrained to the [0,360) range. Output + * declinations are in the range [-90,+90]. + * + * \param pI Input image coordinates in pixels. The specified + * location can legally lie outside the image bounds + * defined by [0,0]-[Width(),Height()]. + * + * Returns true iff the specified point \a pI can be projected on the + * celestial sphere using this astrometric solution. + * + * The output coordinates stored in \a pRD will be referred to the reference + * system of this astrometric solution, either ICRS or GCRS, as returned by + * the ReferenceSystem() member function. + * + * This function is useful for interpolation schemes where discontinuities + * caused by zero crossings in right ascension, i.e. abrupt changes from 360 + * to 0 degrees, are not admissible numerically. Right ascensions returned + * by this function can be larger than 360 degrees or less than zero, + * ensuring smooth transitions. + * + * \sa ImageToCelestial(), CelestialToImage() + */ + bool RawImageToCelestial( DPoint& pRD, const DPoint& pI ) const + { + if ( !IsValid() ) + throw Error( "Invalid call to AstrometricMetadata::RawImageToCelestial(): No astrometric solution." ); + return m_projection->Inverse( pRD, m_transformWI->Inverse( pI ) ); + } + + /*! + * Transformation from celestial coordinates to image coordinates. + * + * \param[out] pI Reference to a point where the output image coordinates + * will be stored. + * + * \param pRD Input equatorial spherical coordinates expressed in + * degrees. \a pRD.x is the right ascension and \a pRD.y + * is declination. + * + * Returns true iff the specified celestial coordinates can be reprojected + * on the image coordinate system. Note that the output image coordinates + * can lie outside of the image bounds defined by [0,0]-[Width(),Height()]. + * + * The input coordinates specified in \a pRD are expected to be referred to + * the reference system of this astrometric solution, either ICRS or GCRS, + * as returned by the ReferenceSystem() member function. + * + * \sa ImageToCelestial(), RawImageToCelestial() + */ + bool CelestialToImage( DPoint& pI, const DPoint& pRD ) const + { + if ( !IsValid() ) + throw Error( "Invalid call to AstrometricMetadata::CelestialToImage(): No astrometric solution." ); + DPoint pW; + if ( m_projection->Direct( pW, pRD ) ) + { + pI = m_transformWI->Direct( pW ); + return true; + } + return false; + } + + /*! + * Regenerates the astrometric solution from standardized metadata. + * + * \param properties A list of XISF image properties describing + * critical astrometry-related metadata items. + * + * \param keywords A list of FITS header keywords, which should + * contain at least a minimal set of standard WCS + * keywords to define a linear world transformation + * from celestial to image coordinates. + * + * \param controlPoints If not empty, this array must contain a list of + * spline control points and generation parameters + * serialized in raw binary format. See the + * SplineWorldTransformation class for more + * information. + * + * \param width Width in pixels of the image with which this + * astrometric solution is associated. + * + * \param height Height in pixels of the image with which this + * astrometric solution is associated. + * + * The following standard XISF properties will be extracted from the + * specified \a properties array, if available: + * + *
+    * Observation:CelestialReferenceSystem
+    * Observation:Center:RA
+    * Observation:Center:Dec
+    * Observation:Equinox
+    * Observation:Time:Start
+    * Observation:Time:End
+    * Observation:Location:Longitude
+    * Observation:Location:Latitude
+    * Observation:Location:Elevation
+    * Instrument:Telescope:FocalLength
+    * Instrument:Sensor:XPixelSize
+    * 
+ * + * %XISF properties will take precedence over equivalent %FITS keywords. + * + * If the specified \a controlPoints array contains a valid serialization of + * spline control points, the astrometric solution will use a high-precision + * world transformation based on two-dimensional surface splines, also knwon + * as thin plate splines, which is capable of modeling local image + * distortions that are intractable with WCS linear transformations. + * + * If this object contains valid metadata before calling this function, it + * will be disposed as appropriate, and a completely new astrometric + * solution will be constructed. + * + * This member function can throw exceptions (of the Error class) if either + * the specified \a controlPoints array is not empty and does not contain a + * valid raw serialization of a spline-based transformation, or if the + * generated coordinate transformations are not invalid (in the numerical or + * geometric sense). + */ + void Build( const PropertyArray& properties, const FITSKeywordArray& keywords, + const ByteArray& controlPoints, int width, int height ); + + /*! + * Updates the specified \a keywords array with basic astrometric FITS + * header keywords. This includes a number of standard instrumental and + * observational keywords, as well as some customary nonstandard keywords, + * included for compatibility with third-party applications: + * + *
+    * RA
+    * OBJCTRA
+    * DEC
+    * OBJCTDEC
+    * DATE-OBS
+    * DATE-END
+    * OBSGEO-L
+    * LONG-OBS
+    * OBSGEO-B
+    * LAT-OBS
+    * OBSGEO-H
+    * ALT-OBS
+    * FOCALLEN
+    * XPIXSZ
+    * YPIXSZ
+    * PIXSIZE
+    * 
+ * + * Keywords are updated when the corresponding metadata items are available. + */ + void UpdateBasicKeywords( FITSKeywordArray& keywords ) const; + + /*! + * Updates the specified \a keywords array with the set of standard WCS FITS + * header keywords: + * + *
+    * RADESYS
+    * EQUINOX
+    * EPOCH
+    * CTYPE1
+    * CTYPE2
+    * CRVAL1
+    * CRVAL2
+    * CRPIX1
+    * CRPIX2
+    * CD1_1
+    * CD1_2
+    * CD2_1
+    * CD2_2
+    * PC1_1
+    * PC1_2
+    * PC2_1
+    * PC2_2
+    * CDELT1
+    * CDELT2
+    * CROTA1
+    * CROTA2
+    * PV1_1
+    * PV1_2
+    * PV1_3
+    * PV1_4
+    * LONPOLE
+    * LATPOLE
+    * 
+ * + * In addition, a custom nonstandard keyword is also generated to signal the + * availability of a spline-based astrometric solution: + * + *
+    * REFSPLIN
+    * 
+ */ + void UpdateWCSKeywords( FITSKeywordArray& keywords ) const; + + /*! + * Updates the specified \a properties array with a restricted set of view + * properties to reflect the state of this astrometric solution. + * + * The following standard XISF properties will be created or redefined: + * + *
+    * Instrument:Telescope:FocalLength
+    * Instrument:Sensor:XPixelSize
+    * Instrument:Sensor:YPixelSize
+    * Observation:Center:RA
+    * Observation:Center:Dec
+    * Observation:CelestialReferenceSystem
+    * Observation:Equinox
+    * 
+ * + * The following properties can be removed if the transformation is valid, + * since the default coordinate reference point is the geometric center of + * the image, which is used to calculate the values of the standard + * \c Observation:Center:RA and \c Observation:Center:Dec properties: + * + *
+    * Observation:Center:X
+    * Observation:Center:Y
+    * 
+ * + * The following properties will be created or redefined if the + * corresponding metadata items are available, or removed otherwise: + * + *
+    * Observation:Time:Start
+    * Observation:Time:End
+    * Observation:Location:Longitude
+    * Observation:Location:Latitude
+    * Observation:Location:Elevation
+    * 
+ * + * In addition, the following nonstandard property, used by platform image + * plate solving scripts, will be created, redefined, or removed: + * + *
+    * Transformation_ImageToProjection
+    * 
+ */ + void UpdateProperties( PropertyArray& properties ) const; + + /*! + * Removes astrometry-related FITS header keywords from the specified + * \a keywords array. This includes some basic instrumental and + * observational keywords, as well as the following keywords: + * + *
+    * RADESYS
+    * EQUINOX
+    * EPOCH
+    * CTYPE1
+    * CTYPE2
+    * CRVAL1
+    * CRVAL2
+    * CRPIX1
+    * CRPIX2
+    * CD1_1
+    * CD1_2
+    * CD2_1
+    * CD2_2
+    * PC1_1
+    * PC1_2
+    * PC2_1
+    * PC2_2
+    * CDELT1
+    * CDELT2
+    * CROTA1
+    * CROTA2
+    * PV1_1
+    * PV1_2
+    * PV1_3
+    * PV1_4
+    * LONPOLE
+    * LATPOLE
+    * REFSPLIN
+    * 
+ * + * If \a removeCenterKeywords is true, the following keywords will also be + * removed: + * + *
+    * RA
+    * OBJCTRA
+    * DEC
+    * OBJCTDEC
+    * 
+ * + * If \a removeScaleKeywords is true, the following keywords will also be + * removed: + * + *
+    * FOCALLEN
+    * XPIXSZ
+    * YPIXSZ
+    * PIXSIZE
+    * 
+ */ + static void RemoveKeywords( FITSKeywordArray& keywords, bool removeCenterKeywords = true, bool removeScaleKeywords = true ); + + /*! + * Rescales the values of existing FITS header keywords defining physical + * pixel dimensions in the specified \a keywords array. + * + * This function multiplies the values of the following keywords by the + * specified \a scalingFactor: + * + *
+    * XPIXSZ
+    * YPIXSZ
+    * PIXSIZE
+    * 
+ * + * This is useful in cases where a geometric transformation has to be + * applied to an image to modify its scale, such as a resampling operation. + */ + static void RescalePixelSizeKeywords( FITSKeywordArray& keywords, double scalingFactor ); + + /*! + * Removes astrometry-related XISF properties from the specified + * \a properties array. + * + * If \a removeCenterProperties is true, the following properties will also + * be removed: + * + *
+    * Observation:Center:RA
+    * Observation:Center:Dec
+    * Observation:Center:X
+    * Observation:Center:Y
+    * Observation:CelestialReferenceSystem
+    * Observation:Equinox
+    * 
+ * + * If \a removeScaleProperties is true, the following properties will also + * be removed: + * + *
+    * Instrument:Telescope:FocalLength
+    * Instrument:Sensor:XPixelSize
+    * Instrument:Sensor:YPixelSize
+    * 
+ * + * In addition, the following nonstandard property, used by platform image + * plate solving scripts, will be removed: + * + *
+    * Transformation_ImageToProjection
+    * 
+ */ + static void RemoveProperties( PropertyArray& properties, bool removeCenterProperties = true, bool removeScaleProperties = true ); + + /*! + * Removes astrometry-related XISF properties from the specified \a window's + * main view. + * + * See RemoveProperties( PropertyArray&, bool, bool ) for detailed + * information. + */ + static void RemoveProperties( ImageWindow& window, bool removeCenterProperties = true, bool removeScaleProperties = true ); + + /*! + * Rescales the values of existing XISF properties defining physical pixel + * dimensions in the specified \a properties array. + * + * This function multiplies the values of the following properties by the + * specified \a scalingFactor: + * + *
+    * Instrument:Sensor:XPixelSize
+    * Instrument:Sensor:YPixelSize
+    * 
+ * + * This is useful in cases where a geometric transformation has to be + * applied to an image to modify its scale, such as a resampling operation. + */ + static void RescalePixelSizeProperties( PropertyArray& properties, double scalingFactor ); + + /*! + * Rescales the values of existing XISF properties defining physical pixel + * dimensions for the specified \a window's main view. + * + * See RescalePixelSizeProperties( PropertyArray&, double ) for detailed + * information. + */ + static void RescalePixelSizeProperties( ImageWindow& window, double scalingFactor ); + + /*! + * Returns a printable textual representation of the metadata properties and + * parameters of the astrometric solution represented by this object. + */ + String Summary() const; + + /*! + * Returns a collection of strings describing the metadata properties and + * parameters of this astrometric solution. + * + * The returned object is a copy of an internal structure that is generated + * automatically as necessary and cached between successive function calls. + * This allows for efficient real-time representations of astrometric + * metadata and parameters. + */ + DescriptionItems Description() const + { + UpdateDescription(); + return m_description.IsNull() ? DescriptionItems() : *m_description; + } + +private: + + AutoPointer m_projection; + AutoPointer m_transformWI; + IsoString m_refSys; // ICRS(default) or GCRS + Optional m_equinox; // years - deprecated + int m_width = 0; // px + int m_height = 0; // px + Optional m_pixelSize; // um + Optional m_obsStartTime; // UTC + Optional m_obsEndTime; // UTC + Optional m_geoLongitude; // deg + Optional m_geoLatitude; // deg + Optional m_geoHeight; // m + double m_resolution = 0; // deg/px + Optional m_focalLength; // mm + mutable + AutoPointer m_description; + + WCSKeywords ComputeWCSKeywords() const; + void UpdateDescription() const; +}; + +} //pcl + +#endif // __AstrometricMetadata_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AstrometricMetadata.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Atomic.h b/3rdparty/include/pcl/Atomic.h new file mode 100644 index 0000000..6c82b6c --- /dev/null +++ b/3rdparty/include/pcl/Atomic.h @@ -0,0 +1,670 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Atomic.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Atomic_h +#define __PCL_Atomic_h + +/// \file pcl/Atomic.h + +#include + +#ifdef __PCL_WINDOWS +# include +#ifdef _MSC_VER +# pragma intrinsic (_InterlockedIncrement) +# pragma intrinsic (_InterlockedDecrement) +# pragma intrinsic (_InterlockedCompareExchange) +# pragma intrinsic (_InterlockedExchange) +# pragma intrinsic (_InterlockedExchangeAdd) +#endif +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AtomicInt + * \brief Atomic operations on integers. + * + * %AtomicInt allows non-blocking synchronization of multithreaded code with + * respect to reference counting and other critical operations in parallel + * algorithm implementations. This class is used extensively by PCL code to + * implement copy-on-write shared containers and container operations in a + * thread-safe way. An example is the ReferenceCounter class, which is at the + * hearth of most PCL container and image classes. + * + * %AtomicInt implements the following synchronization primitives on integers: + * + * reference \n + * dereference \n + * test-and-set \n + * fetch-and-store \n + * fetch-and-add + * + * \sa ReferenceCounter + */ +class PCL_CLASS AtomicInt +{ +public: + + /*! + * Constructs an %AtomicInt instance with the specified \a value. When not + * explicitly specified, the default value is zero. + */ + AtomicInt( int value = 0 ) + : m_value( value ) + { + // ### N.B.: + // The default zero initialization is *critical* - DO NOT change it. + } + + /*! + * Copy constructor. + */ + AtomicInt( const AtomicInt& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + AtomicInt& operator =( const AtomicInt& ) = default; + + /*! + * Returns the current value of this atomic integer. + * + * \note This operation is not guaranteed to be atomic. + */ + operator int() const + { + return m_value; + } + + /*! + * Logical negation operator. Returns true iff this atomic integer is zero. + * + * \note This operation is not guaranteed to be atomic. + */ + bool operator !() const + { + return m_value == 0; + } + + /*! + * Equality operator. Returns true iff this atomic integer is equal to an + * integer \a x. + * + * \note This operation is not guaranteed to be atomic. + */ + bool operator ==( int x ) const + { + return m_value == x; + } + + /*! + * Inequality operator. Returns true iff this atomic integer is not equal to + * an integer \a x. + * + * \note This operation is not guaranteed to be atomic. + */ + bool operator !=( int x ) const + { + return m_value != x; + } + + /*! + * Integer assignment operator. Assigns the specified integer \a x to this + * atomic integer. Returns a reference to this object. + * + * \note This operation is not guaranteed to be atomic. + */ + AtomicInt& operator =( int x ) + { + m_value = x; + return *this; + } + + /*! + * Atomic load operation. + * + * Returns the current value of this atomic integer. + * + * \note The integer load operation is guaranteed to be atomic on all + * supported platforms and architectures. + */ + int Load() + { + return FetchAndAdd( 0 ); + } + + /*! + * Atomic store operation. + * + * Assigns the specified \a newValue to this object. + * + * \note The integer store operation is guaranteed to be atomic on all + * supported platforms and architectures. + */ + void Store( int newValue ) + { + (void)FetchAndStore( newValue ); + } + + /*! + * Atomic increment operation. + * + * Increments the value of this object as an atomic operation. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + void Increment() + { +#ifdef __PCL_WINDOWS + (void)_InterlockedIncrement( &m_value ); +#else + asm volatile( "lock\n\t" + "incl %0\n" + : "=m" (m_value) + : "m" (m_value) + : "memory", "cc" ); +#endif + } + + /*! + * Atomic decrement operation. + * + * Decrements the value of this object as an atomic operation. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + void Decrement() + { +#ifdef __PCL_WINDOWS + (void)_InterlockedDecrement( &m_value ); +#else + asm volatile( "lock\n\t" + "decl %0\n" + : "=m" (m_value) + : "m" (m_value) + : "memory", "cc" ); +#endif + } + + /*! + * Atomic reference operation. + * + * Increments the value of this object as an atomic operation. Returns true + * if the resulting value after incrementing this object is nonzero. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + bool Reference() + { +#ifdef __PCL_WINDOWS + return _InterlockedIncrement( &m_value ) != 0; +#else + uint8 result; + asm volatile( "lock\n\t" + "incl %0\n\t" + "setnz %1\n" + : "=m" (m_value), "=qm" (result) + : "m" (m_value) + : "memory", "cc" ); + return result != 0; +#endif + } + + /*! + * Atomic dereference operation. + * + * Decrements the value of this object as an atomic operation. Returns true + * if the resulting value after decrementing this object is nonzero. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + bool Dereference() + { +#ifdef __PCL_WINDOWS + return _InterlockedDecrement( &m_value ) != 0; +#else + uint8 result; + asm volatile( "lock\n\t" + "decl %0\n\t" + "setnz %1\n" + : "=m" (m_value), "=qm" (result) + : "m" (m_value) + : "memory", "cc" ); + return result != 0; +#endif + } + + /*! + * Atomic test-and-set operation. + * + * If the current value of this object is equal to \a expectedValue, this + * function assigns \a newValue to this object and returns true. If the + * current value is not equal to \a expectedValue, this function performs no + * operation and returns false. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + bool TestAndSet( int expectedValue, int newValue ) + { +#ifdef __PCL_WINDOWS + return _InterlockedCompareExchange( &m_value, newValue, expectedValue ) == expectedValue; +#else + uint8 result; + asm volatile( "lock\n\t" + "cmpxchgl %3,%2\n\t" + "setz %1\n" + : "=a" (newValue), "=qm" (result), "+m" (m_value) + : "r" (newValue), "0" (expectedValue) + : "memory", "cc" ); + return result != 0; +#endif + } + + /*! + * Atomic fetch-and-store operation. + * + * Assigns \a newValue to this object and returns the initial value before + * assignment, as an atomic operation. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + int FetchAndStore( int newValue ) + { +#ifdef __PCL_WINDOWS + return _InterlockedExchange( &m_value, newValue ); +#else + asm volatile( "xchgl %0,%1\n" + : "=r" (newValue), "+m" (m_value) + : "0" (newValue) + : "memory" ); + return newValue; +#endif + } + + /*! + * Atomic fetch-and-add operation. Adds \a valueToAdd to this object and + * returns the initial value before addition, as an atomic operation. + * + * \note This operation is guaranteed to be atomic on all supported + * platforms and architectures. + */ + int FetchAndAdd( int valueToAdd ) + { +#ifdef __PCL_WINDOWS + return _InterlockedExchangeAdd( &m_value, valueToAdd ); +#else + asm volatile( "lock\n\t" + "xaddl %0,%1\n" + : "=r" (valueToAdd), "+m" (m_value) + : "0" (valueToAdd) + : "memory", "cc" ); + return valueToAdd; +#endif + } + +private: + +#ifdef _MSC_VER + __declspec(align(4)) volatile long m_value; +#elif __PCL_WINDOWS + volatile long m_value __attribute__ ((aligned (4))); +#else + volatile int m_value __attribute__ ((aligned (4))); +#endif +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup reentrancy_protection Thread-Safe Protection of Non-Reentrant Code + */ + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoReentrancyGuard + * \brief Automatic reentrancy guard sentinel. + * + * %AutoReentrancyGuard allows you to protect a block of code ensuring that it + * cannot be reentrant. All you need is a static AtomicInt variable that works + * as a 'busy state' flag persistent across function invocations. + * + * Consider the following example: + * + * \code void foo() + * { + * static AtomicInt flag; + * AutoReentrancyGuard guard( flag ); + * if ( guard ) + * { + * // protected code + * } + * } + * \endcode + * + * The function \c foo is not reentrant, so we want to protect it against + * possible reentrant invocations while the function's code is being executed. + * + * The \c flag variable is initially zero (because AtomicInt's default + * constructor initializes its integer member to zero). The first time \c foo + * is called, %AutoReentrancyGuard's constructor can change the value of + * \c flag from zero to one as an atomic operation. When this happens, + * AutoReentrancyGuard::operator bool() returns true, and the code protected + * within the \c if block can be executed. + * + * When the \c guard object gets out of scope (just before the \c foo function + * returns), its class destructor resets \c flag to zero automatically, which + * permits the next non-reentrant execution of \c foo. However, if \c foo is + * called again before \c guard is destroyed, a newly constructed + * %AutoReentrancyGuard object cannot make a transition 0 -> 1 with the static + * \c flag variable, and hence a reentrant execution of the protected code is + * not allowed (in this case, the function simply does nothing and returns + * after the \c if block). Note that the protected code can freely return from + * the function or throw exceptions; the \c flag variable will be reset to zero + * automatically when \c guard gets out of scope. + * + * Since %AutoReentrancyGuard uses AtomicInt to implement atomic transitions, + * code blocks can be protected against reentrant execution in multithreaded + * environments. + * + * The macros PCL_REENTRANCY_GUARDED_BEGIN and PCL_REENTRANCY_GUARDED_END + * greatly simplify reentrancy protection. For example, the above code could be + * implemented as follows: + * + * \code void foo() + * { + * PCL_REENTRANCY_GUARDED_BEGIN + * // protected code + * PCL_REENTRANCY_GUARDED_END + * } \endcode + * + * In addition, the macros PCL_CLASS_REENTRANCY_GUARD and + * PCL_CLASS_REENTRANCY_GUARDED_BEGIN are useful for protection of all + * non-reentrant member functions of a class, and the macros + * PCL_MEMBER_REENTRANCY_GUARD and PCL_MEMBER_REENTRANCY_GUARDED_BEGIN provide + * protection of specific member functions. See these macros for examples. + * + * \ingroup reentrancy_protection + */ +class AutoReentrancyGuard +{ +public: + + /*! + * Constructs an %AutoReentrancyGuard object to monitor the specified + * \a guard variable. If \c guard is zero, its value is set to one as an + * atomic operation. If \c guard is nonzero, its value is not changed. + * + * \warning The monitored guard variable *must* be either a static variable + * local to the function being protected, or a data member of the same class + * to which a protected member function belongs. Otherwise the protection + * mechanism will not work. This can be dangerous, especially because you + * may erroneously think that your code is being protected when it is not. + * In addition, the guard variable must be zero initially, or the protected + * code will never be allowed to work. We strongly recommend you don't use + * this class directly, but the PCL_REENTRANCY_GUARDED_BEGIN and + * PCL_REENTRANCY_GUARDED_END macros to implement function level protection, + * or PCL_CLASS_REENTRANCY_GUARD, PCL_CLASS_REENTRANCY_GUARDED_BEGIN and + * PCL_CLASS_REENTRANCY_GUARDED_END to implement per-instance function + * member protection. + */ + AutoReentrancyGuard( AtomicInt& guard ) + : m_guard( guard ) + { + m_guarded = m_guard.TestAndSet( 0, 1 ); + } + + /*! + * Destroys this object. If the value of the monitored guard variable (see + * the class constructor) was zero when this object was constructed, its + * value is reset to zero as an atomic operation. + */ + ~AutoReentrancyGuard() + { + if ( m_guarded ) + m_guard.Store( 0 ); + } + + /*! + * Returns true iff the value of the monitored guard variable (see the class + * constructor) was zero when this object was constructed. + */ + operator bool() const volatile + { + return m_guarded; + } + +private: + + AtomicInt& m_guard; + bool m_guarded = false; +}; + +/*! + * \def PCL_REENTRANCY_GUARDED_BEGIN + * + * This macro along with PCL_REENTRANCY_GUARDED_END simplifies protection of + * non-reentrant code. See the AutoReentrancyGuard class for detailed + * information and examples. + * + * \ingroup reentrancy_protection + */ +#define PCL_REENTRANCY_GUARDED_BEGIN \ + { \ + static pcl::AtomicInt __r_g__( 0 ); \ + volatile pcl::AutoReentrancyGuard __a_r_g__( __r_g__ ); \ + if ( __a_r_g__ ) \ + { + +/*! + * \def PCL_REENTRANCY_GUARDED_END + * + * This macro, along with PCL_REENTRANCY_GUARDED_BEGIN, simplifies protection + * of non-reentrant code. See the AutoReentrancyGuard class for detailed + * information and examples. + * + * \ingroup reentrancy_protection + */ +#define PCL_REENTRANCY_GUARDED_END \ + } \ + } + +/*! + * \def PCL_CLASS_REENTRANCY_GUARD + * + * Declares a class data member for class-wide protection of non-reentrant + * member functions with the PCL_CLASS_REENTRANCY_GUARDED_BEGIN and + * PCL_REENTRANCY_GUARDED_END macros. + * + * Example: + * + * \code class foo + * { + * public: + * // ... + * private: + * PCL_CLASS_REENTRANCY_GUARD + * + * void bar1() + * { + * PCL_CLASS_REENTRANCY_GUARDED_BEGIN + * // Protected code + * PCL_REENTRANCY_GUARDED_END + * } + * + * void bar2() const + * { + * PCL_CLASS_REENTRANCY_GUARDED_BEGIN + * // Protected code + * PCL_REENTRANCY_GUARDED_END + * } + * }; \endcode + * + * In this example the bar1 and bar2 member functions are protected against + * reentrant execution. Note that reentrancy protection is a per-instance, + * class-wide property in this case: the bar1() and bar2() functions can be + * executed simultaneously for different objects, but they cannot be re-entered + * for the same instance. Furthermore, one of these functions cannot call the + * other for the same object, since both share the same reentrancy guard member + * in the foo class. + * + * See the AutoReentrancyGuard class for more information on the PCL + * implementation of reentrancy protection. + * + * \ingroup reentrancy_protection + */ +#define PCL_CLASS_REENTRANCY_GUARD \ + mutable pcl::AtomicInt __pcl_guard__; + +/*! + * \def PCL_CLASS_REENTRANCY_GUARDED_BEGIN + * + * This macro, along with PCL_CLASS_REENTRANCY_GUARD and + * PCL_REENTRANCY_GUARDED_END, simplifies per-instance protection of + * non-reentrant class member functions. See PCL_CLASS_REENTRANCY_GUARD for an + * example. + * + * See the AutoReentrancyGuard class for more information on the PCL + * implementation of reentrancy protection. + * + * \ingroup reentrancy_protection + */ +#define PCL_CLASS_REENTRANCY_GUARDED_BEGIN \ + { \ + volatile pcl::AutoReentrancyGuard __a_r_g__( __pcl_guard__ ); \ + if ( __a_r_g__ ) \ + { + +/*! + * \def PCL_MEMBER_REENTRANCY_GUARD + * + * Declares a class data member for protection of a specific non-reentrant + * member function with the PCL_MEMBER_REENTRANCY_GUARDED_BEGIN and + * PCL_REENTRANCY_GUARDED_END macros. + * + * Example: + * + * \code class foo + * { + * public: + * // ... + * private: + * PCL_MEMBER_REENTRANCY_GUARD( bar1 ) + * PCL_MEMBER_REENTRANCY_GUARD( bar2 ) + * + * void bar1() + * { + * PCL_MEMBER_REENTRANCY_GUARDED_BEGIN( bar1 ) + * // Protected code + * PCL_REENTRANCY_GUARDED_END + * } + * + * void bar2() const + * { + * PCL_MEMBER_REENTRANCY_GUARDED_BEGIN( bar2 ) + * // Protected code + * PCL_REENTRANCY_GUARDED_END + * } + * }; \endcode + * + * In this example the bar1 and bar2 member functions are protected against + * reentrant execution. Note that reentrancy protection is a per-instance, + * function-specific property in this case: the bar1() and bar2() functions can + * be executed simultaneously for different objects, but they cannot be + * re-entered for the same instance. Since each member function uses its own + * reentrancy guard member in the foo class, each of them can safely call the + * other for the same object. + * + * See the AutoReentrancyGuard class for more information on the PCL + * implementation of reentrancy protection. + * + * \ingroup reentrancy_protection + */ +#define PCL_MEMBER_REENTRANCY_GUARD( member ) \ + mutable pcl::AtomicInt __pcl_guard_##member##__; + +/*! + * \def PCL_MEMBER_REENTRANCY_GUARDED_BEGIN + * + * This macro, along with PCL_MEMBER_REENTRANCY_GUARD and + * PCL_REENTRANCY_GUARDED_END, simplifies per-instance protection of specific + * non-reentrant member functions. See PCL_MEMBER_REENTRANCY_GUARD for an + * example. + * + * See the AutoReentrancyGuard class for more information on the PCL + * implementation of reentrancy protection. + * + * \ingroup reentrancy_protection + */ +#define PCL_MEMBER_REENTRANCY_GUARDED_BEGIN( member ) \ + { \ + volatile pcl::AutoReentrancyGuard __a_r_g__( __pcl_guard_##member##__ );\ + if ( __a_r_g__ ) \ + { + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Atomic_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Atomic.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AutoLock.h b/3rdparty/include/pcl/AutoLock.h new file mode 100644 index 0000000..7ce6044 --- /dev/null +++ b/3rdparty/include/pcl/AutoLock.h @@ -0,0 +1,380 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AutoLock.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AutoLock_h +#define __PCL_AutoLock_h + +/// \file pcl/AutoLock.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoLock + * \brief Automatic mutex lock/unlock. + * + * %AutoLock is a convenience class that simplifies using Mutex objects to + * protect code or data that can be accessed by multiple threads. + * + * An %AutoLock object locks a %Mutex object upon construction and unlocks it + * upon destruction. This ensures that the state of the %Mutex object will + * always be well defined, and that it will never be left locked, even in + * critical situations involving multiple function return points and + * exceptions. + * + * \sa AutoLockCounter, Mutex + */ +class PCL_CLASS AutoLock +{ +public: + + /*! + * Constructs an %AutoLock object to monitor a specified Mutex object. + * + * \param mutex A %Mutex object that will be monitored by this %AutoLock + * instance. + * + * The specified mutex object will be locked by this constructor. It will be + * unlocked automatically when this %AutoLock object gets out of scope, or + * if it is destroyed explicitly. + */ + explicit AutoLock( pcl::Mutex& mutex ) + : m_mutex( &mutex ) + { + Lock(); + } + + /*! + * Move constructor. + */ + AutoLock( AutoLock&& x ) + : m_mutex( x.m_mutex ) + , m_lock( x.m_lock ) + { + x.m_mutex = nullptr; + } + + /*! + * Destroys this %AutoLock object. + * + * If the monitored mutex object (that was specified in the constructor) is + * locked, it is unlocked by this destructor. + */ + ~AutoLock() + { + Unlock(); + m_mutex = nullptr; + } + + /*! + * Copy constructor. This constructor is disabled because %AutoLock objects + * cannot be copied. + */ + AutoLock( const AutoLock& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %AutoLock objects + * cannot be copied. + */ + AutoLock& operator =( const AutoLock& ) = delete; + + /*! + * Move assignment. This operator is disabled because %AutoLock objects + * cannot be move-assigned. + */ + AutoLock& operator =( AutoLock&& ) = delete; + + /*! + * Locks the monitored mutex object, if it has not been previously locked by + * this object. + */ + void Lock() + { + if ( m_mutex != nullptr ) + if ( m_lock.TestAndSet( 0, 1 ) ) + m_mutex->Lock(); + } + + /*! + * Unlocks the monitored mutex object, if it has been previously locked by + * this object. + */ + void Unlock() + { + if ( m_mutex != nullptr ) + if ( m_lock.TestAndSet( 1, 0 ) ) + m_mutex->Unlock(); + } + +private: + + pcl::Mutex* m_mutex = nullptr; + AtomicInt m_lock; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoLockCounter + * \brief Automatic mutex lock/unlock with limited concurrent access allowance. + * + * %AutoLockCounter is similar to AutoLock: it allows protecting a section of + * code against concurrent thread access through a Mutex, with automatic + * lock/unlock operations upon object construction/destruction. However, + * %AutoLockCounter is slightly more complex because it can allow a specified + * amount of concurrent accesses, while %AutoLock forbids them completely. + * + * %AutoLockCounter is useful for scenarios where the protected code can + * exploit a resource concurrently, but only to a given extent that can be + * predicted or configured. Typical examples are routines performing file + * read/write operations. + * + * Example: + * + * \code + * void ParallelWriteFile( const String& filePath, const ByteArray& data, int limit ) + * { + * static Mutex mutex; + * static AtomicInt count; + * volatile AutoLockCounter lock( mutex, count, limit ); + * File::WriteFile( filePath, data ); + * } + * \endcode + * + * In this example, the ParallelWriteFile routine allows creating and writing + * up to \e limit different disk files simultaneously. If \e limit files are + * already being written concurrently, a new call to ParallelWriteFile() will + * block the caller thread until at least one of the running tasks terminates. + * + * \sa AutoLock, Mutex, AtomicInt + */ +class PCL_CLASS AutoLockCounter +{ +public: + + /*! + * Constructs an %AutoLockCounter object to monitor a Mutex with automatic + * counting of lock operations and a given maximum number of concurrent + * accesses. + * + * \param mutex Reference to a Mutex object that will be monitored by this + * %AutoLockCounter instance. + * + * \param count Reference to an AtomicInt object that will be updated by + * this instance to control the current amount of concurrent + * accesses. + * + * \param limit Maximum number of concurrent accesses allowed. The + * specified \a count variable will be atomically incremented + * by this constructor. If \a count is greater than \a limit + * after the increment, this constructor will lock the + * specified \a mutex. Otherwise the mutex will not be locked + * automatically upon construction. Note that the mutex can + * be locked explicitly by calling the Lock() member function + * for any AutoLock or AutoLockCounter object sharing the + * same \a mutex variable. + * + * By specifying a \a limit of zero, no concurrent access will be allowed + * and this object will be functionally equivalent to an AutoLock instance + * monitoring the same \a mutex. By setting \a limit to a value greater than + * or equal to one, the protected code section will be allowed to run once, + * twice, etc. without a (potentially expensive) lock operation. + * + * If the specified \a mutex has been locked by this object, be it + * automatically or explicitly, it will be unlocked automatically when this + * %AutoLockCounter object is destroyed or gets out of scope. + */ + explicit AutoLockCounter( pcl::Mutex& mutex, AtomicInt& count, int limit ) + : m_mutex( &mutex ) + , m_count( &count ) + , m_lock( 0 ) + { + if ( m_count->FetchAndAdd( 1 ) >= limit-1 ) + { + Lock(); + if ( m_count->Load() < limit ) + Unlock(); + } + } + + /*! + * Move constructor. + */ + AutoLockCounter( AutoLockCounter&& x ) + : m_mutex( x.m_mutex ) + , m_count( x.m_count ) + , m_lock( x.m_lock ) + { + x.m_mutex = nullptr; + x.m_count = nullptr; + } + + /*! + * Destroys this %AutoLockCounter object. + * + * This destructor performs two separate actions: + * + * - If the monitored mutex (which was specified in the constructor) has + * been locked by this object, it will be unlocked. This applies both if the + * mutex has been locked automatically upon construction (because the + * monitored counter was larger than the specified limit), or explicitly by + * calling the Lock() member function for this object. + * + * - The monitored counter, which was atomically incremented upon + * construction, will be atomically decremented. + */ + ~AutoLockCounter() + { + Unlock(); + m_mutex = nullptr; + if ( m_count != nullptr ) + { + m_count->Decrement(); + m_count = nullptr; + } + } + + /*! + * Copy constructor. This constructor is disabled because %AutoLockCounter + * objects cannot be copied. + */ + AutoLockCounter( const AutoLockCounter& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %AutoLockCounter + * objects cannot be copied. + */ + AutoLockCounter& operator =( const AutoLockCounter& ) = delete; + + /*! + * Move assignment. This operator is disabled because %AutoLockCounter + * objects cannot be move-assigned. + */ + AutoLockCounter& operator =( AutoLockCounter&& ) = delete; + + /*! + * Locks the monitored mutex object, if it has not been previously locked by + * this object. + */ + void Lock() + { + if ( m_mutex != nullptr ) + if ( m_lock.TestAndSet( 0, 1 ) ) + m_mutex->Lock(); + } + + /*! + * Unlocks the monitored mutex object, if it has been previously locked by + * this object. + */ + void Unlock() + { + if ( m_mutex != nullptr ) + if ( m_lock.TestAndSet( 1, 0 ) ) + m_mutex->Unlock(); + } + +private: + + pcl::Mutex* m_mutex = nullptr; + AtomicInt* m_count = nullptr; + AtomicInt m_lock; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \def Synchronized + * \brief A macro to protect a simple fragment of code with a Mutex object. + * + * Example of use: + * + * \code + * Mutex mutex; + * ... + * Synchronized( mutex, count += img.Width(); ) + * \endcode + * + * The protected code should not contain tokens that could invalidate macro + * argument semantics. To synchronize more complex pieces of code, use an + * AutoLock object explicitly. For example: + * + * \code + * Mutex mutex; + * ... + * { + * AutoLock locker( mutex ); + * ... some code to protect here ... + * } + * \endcode + */ +#define Synchronized( mutex, code ) \ +{ \ + pcl::AutoLock _________( mutex ); \ + code \ +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AutoLock_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AutoLock.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AutoPointer.h b/3rdparty/include/pcl/AutoPointer.h new file mode 100644 index 0000000..3ab3147 --- /dev/null +++ b/3rdparty/include/pcl/AutoPointer.h @@ -0,0 +1,912 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AutoPointer.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AutoPointer_h +#define __PCL_AutoPointer_h + +/// \file pcl/AutoPointer.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class StandardDeleter + * \brief An object deleter that uses the standard delete operator. + * + * Deleter objects are used by smart pointer classes (e.g., AutoPointer) to + * destroy and deallocate dynamically allocated objects. A valid deleter class + * must implement the following member functions: + * + * \li Default constructor. + * + * \li Copy constructor. + * + * \li Move constructor. + * + * \li Function call operator with a single argument of type T* (pointer to T). + * This member function will destroy and deallocate the T object pointed to by + * its argument. + * + * \li Function call operator with a single argument of type T[] (array of T). + * This member function will destroy and deallocate a contiguous sequence of + * objects stored at the location pointed to by its argument. + * + * %StandardDeleter implements object and array destruction/deallocation by + * calling the standard \c delete operator. + * + * \sa AutoPointer, AutoPointerCloner + */ +template +class PCL_CLASS StandardDeleter +{ +public: + + /*! + * Represents the type of objects to destroy and deallocate. + */ + typedef T value_type; + + /*! + * Represents a pointer to an object to destroy and deallocate. + */ + + typedef T* pointer; + + /*! + * Function call operator. Destroys and deallocates the object pointed to by + * the specified pointer \a p. + */ + void operator()( pointer p ) const + { + PCL_PRECONDITION( p != nullptr ) + delete p; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoPointer + * \brief A smart pointer with exclusive object ownership and optional + * automatic object destruction. + * + * %AutoPointer stores a pointer to an object of which it is the sole owner. + * The owned object can optionally be destroyed when the owner %AutoPointer + * instance is destroyed. + * + * The template argument T represents the type of the objects owned by this + * template instantiation. The template argument D represents a functor class + * responsible for deletion of objects of type T. By default, %AutoPointer uses + * the StandardDeleter template class, which is a simple wrapper for the + * standard \c delete operator. + * + * Smart pointers are useful entities to guarantee proper destruction and + * deallocation of data in a variety of scenarios, such as exception driven + * code where the same objects have to be destroyed at different points in the + * execution workflow. For example, consider the following pseudocode: + * + * \code + * struct Foo { ... }; + * void Bar() + * { + * Foo* one = nullptr, * two = nullptr; + * try + * { + * // ... some code that may create new Foo objects ... + * if ( condition1 ) one = new Foo; + * if ( condition2 ) two = new Foo; + * // ... some code that can throw exceptions ... + * if ( one != nullptr ) delete one; + * if ( two != nullptr ) delete two; + * } + * catch ( ... ) + * { + * if ( one != nullptr ) delete one; + * if ( two != nullptr ) delete two; + * throw; + * } + * } + * \endcode + * + * Note that the objects pointed to by the \c one and \c two variables have to + * be destroyed at two locations: at the bottom of the \c try block (normal + * execution), and when an exception is caught, within the \c catch block. If + * the %Bar() routine were more complex, even more deallocations might be + * necessary at different locations, making the code intricate and prone to + * memory leaks. + * + * All of these complexities and potential problems can be avoided easily with + * smart pointers. For example, the following snippet would be equivalent to + * the pseudocode above: + * + * \code + * struct Foo { ... }; + * void Bar() + * { + * AutoPointer one, two; + * // ... some code that may create new Foo objects ... + * if ( condition1 ) one = new Foo; + * if ( condition2 ) two = new Foo; + * // ... some code that can throw exceptions ... + * } + * \endcode + * + * With smart pointers, there's no need to explicitly destroy the dynamically + * allocated objects \c one and \c two: The %AutoPointer objects will destroy + * and deallocate them automatically when they get out of scope. On the other + * hand, the %AutoPointer instances behave just like normal pointers allowing + * indirections, pointer assignments, and structure member selections for their + * owned objects transparently. The resulting code is simpler and more robust. + * + * By default, when an %AutoPointer instance is destroyed it also destroys the + * object pointed to by its contained pointer (if the %AutoPointer stores a + * non-null pointer). This automatic deletion feature can be disabled + * in some situations where a single %AutoPointer can store either a pointer to + * a dynamically allocated object, or a pointer to an already existing object + * that must be preserved (e.g., an object living in the stack). For example: + * + * \code + * void Foo( Image& image ) + * { + * // + * // Extract the CIE L* component of a color image ... + * // ... or use the same image as the working lightness if it is grayscale. + * // + * AutoPointer lightness; + * if ( image.IsColor() ) + * { + * lightness = new Image; + * image.ExtractLightness( *lightness ); + * } + * else + * { + * lightness = ℑ + * lightness.DisableAutoDelete(); + * } + * + * DoSomeStuffWithTheLightnessComponent( *lightness ); + * + * // + * // Insert the modified CIE L* component back in the color image. + * // + * if ( image.IsColor() ) + * image.SetLightness( *lightness ); + * } + * \endcode + * + * In the above code, the \c lightness variable can either store a newed image, + * if the passed \a image is a color image, or a pointer to \a image if it is a + * grayscale image. In the latter case we have disabled the automatic deletion + * feature for the \c lightness %AutoPointer, so it won't delete its stored + * pointer when it gets out of scope. + * + * \sa StandardDeleter, AutoPointerCloner + */ +template > +class PCL_CLASS AutoPointer +{ +public: + + /*! + * Represents the type of the object pointed to by this smart pointer. + */ + typedef T value_type; + + /*! + * Represents a pointer stored in this smart pointer. + */ + typedef T* pointer; + + /*! + * Represents a pointer to an immutable object stored in this smart pointer. + */ + typedef const T* const_pointer; + + /*! + * Represents the type of the object responsible for object deletion. + */ + typedef D deleter; + + /*! + * Constructs a null smart pointer. + * + * \param autoDelete Initial state of the automatic deletion feature. The + * default value is true, so auto deletion is always + * enabled by default for newly created %AutoPointer + * objects. + * + * \param d Deleter object, responsible for object destruction + * when the automatic deletion feature is enabled. + * + * A null smart pointer stores a null pointer, so it does not point to a + * valid object. + * + * A copy of the specified deleter \a d will be used. If no deleter is + * specified, this object will use a default-constructed instance of the + * \a D template argument class. + */ + AutoPointer( bool autoDelete = true, const deleter& d = deleter() ) + : m_deleter( d ) + , m_autoDelete( autoDelete ) + { + } + + /*! + * Constructs a smart pointer to store a given pointer. + * + * \param p The pointer to store in this %AutoPointer instance. + * + * \param autoDelete Initial state of the automatic deletion feature. The + * default value is true, so auto deletion is always + * enabled by default for newly created %AutoPointer + * objects. + * + * \param d Deleter object, responsible for object destruction + * when the automatic deletion feature is enabled. + * + * A copy of the specified deleter \a d will be used. If no deleter is + * specified, this object will use a default-constructed instance of the + * \a D template argument class. + */ + AutoPointer( pointer p, bool autoDelete = true, const deleter& d = deleter() ) + : m_deleter( d ) + , m_autoDelete( autoDelete ) + { + m_pointer = p; + } + + /*! + * Non-trivial copy constructor. Constructs a smart pointer by transferring + * the pointer stored in another smart pointer \a x. + * + * The automatic deletion feature for this object will be in the same state + * as it is currently set for the source object \a x. + * + * The smart pointer \a x will transport a null pointer after this instance + * is constructed. This happens irrespective of the state of the automatic + * deletion feature. This guarantees that, as long as no two %AutoPointer + * instances have been \e explicitly constructed to store the same pointer, + * no two %AutoPointer instances can share the same pointer accidentally, + * and hence multiple deletions are not possible. + */ + AutoPointer( AutoPointer& x ) + : m_deleter( x.m_deleter ) + , m_autoDelete( x.m_autoDelete ) + { + m_pointer = x.Release(); + } + + /*! + * Move constructor. + */ + AutoPointer( AutoPointer&& x ) + : m_deleter( std::move( x.m_deleter ) ) + , m_autoDelete( x.m_autoDelete ) + { + m_pointer = x.Release(); + } + + /*! + * Destroys an %AutoPointer object. + * + * If this instance stores a non-null pointer, and the automatic deletion + * feature is enabled, the pointed object will be destroyed by calling the + * deleter object. + */ + virtual ~AutoPointer() + { + Reset(); + } + + /*! + * Causes this smart pointer to store the specified pointer \a p. + * + * If this instance stores a non-null pointer when this function is called, + * and the automatic deletion feature is enabled, the pointed object is + * destroyed by calling the deleter object. + */ + void SetPointer( pointer p ) + { + if ( m_pointer != p ) + { + if ( m_autoDelete ) + if ( m_pointer != nullptr ) + m_deleter( Release() ); // in case m_deleter throws + m_pointer = p; + } + } + + /*! + * Causes this smart pointer to store a null pointer. + * + * If this instance stores a non-null pointer when this function is called, + * and the automatic deletion feature is enabled, the pointed object is + * destroyed by calling the deleter object. + * + * This member function is functionally equivalent to SetPointer( nullptr ). + */ + void Reset() + { + if ( m_pointer != nullptr ) + { + pointer p = Release(); // in case m_deleter throws + if ( m_autoDelete ) + m_deleter( p ); + } + } + + /*! + * A synonym for Reset(). Useful to enforce semantics when the smart pointer + * owns the pointed object. + */ + void Destroy() + { + Reset(); + } + + /*! + * Returns the pointer stored in this %AutoPointer, and causes this object + * to \e forget it by storing a null pointer. + * + * The object pointed is never destroyed by this function, irrespective of + * the state of automatic deletion. In this way, ownership of the pointed + * object (or more specifically, the responsibility for destroying it) is + * transferred to the caller. + */ + pointer Release() + { + pointer p = m_pointer; + m_pointer = nullptr; + return p; + } + + /*! + * Returns a pointer to the immutable object pointed to by this %AutoPointer + * instance. + */ + const_pointer Pointer() const + { + return m_pointer; + } + + /*! + * Returns a copy of the pointer stored in this %AutoPointer instance. + */ + pointer Pointer() + { + return m_pointer; + } + + /*! + * A synonym for Pointer() const. + */ + const_pointer Ptr() const + { + return m_pointer; + } + + /*! + * A synonym for Pointer(). + */ + pointer Ptr() + { + return m_pointer; + } + + /*! + * Returns true iff this smart pointer object stores a null pointer. + */ + bool IsNull() const + { + return m_pointer == nullptr; + } + + /*! + * Returns true iff this smart pointer object stores a non-null pointer. + * Equivalent to !IsNull(). + */ + bool IsValid() const + { + return !IsNull(); + } + + /*! + * Returns true iff the automatic deletion feature of %AutoPointer is + * currently enabled for this object. + * + * When automatic deletion is enabled, the object pointed to by this + * instance will be destroyed (by calling the deleter object) when this + * instance is destroyed, or when it is assigned with a different pointer. + * + * When automatic deletion is disabled, the pointed object will not be + * destroyed automatically. + * + * See the detailed description for the %AutoPointer class for more + * information, including code examples. + * + * \sa EnableAutoDelete(), DisableAutoDelete() + */ + bool IsAutoDelete() const + { + return m_autoDelete; + } + + /*! + * Enables (or disables) the automatic deletion feature of %AutoPointer for + * this object. + * + * \sa IsAutoDelete(), DisableAutoDelete() + */ + void EnableAutoDelete( bool enable = true ) + { + m_autoDelete = enable; + } + + /*! + * Disables (or enables) the automatic deletion feature of %AutoPointer for + * this object. + * + * \sa IsAutoDelete(), EnableAutoDelete() + */ + void DisableAutoDelete( bool disable = true ) + { + EnableAutoDelete( !disable ); + } + + /*! + * Returns a reference to the immutable deleter object in this instance. + */ + const deleter& Deleter() const + { + return m_deleter; + } + + /*! + * Returns a reference to the deleter object in this instance. + */ + deleter& Deleter() + { + return m_deleter; + } + + /*! + * Copy assignment operator. Transfers the pointer stored in another smart + * pointer to this object. + * + * This assignment operator performs the following actions: + * + * (1) If this smart pointer stores a valid (non-null) pointer, and the + * automatic deletion feature is enabled, the pointed object is destroyed by + * the deleter object. + * + * (2) The pointer stored in the other smart pointer \a x is copied to this + * instance. + * + * (3) The other smart pointer \a x is forced to store a null pointer. + * + * (4) Returns a reference to this object. + * + * This operator function does nothing if the specified %AutoPointer \a x + * stores the same pointer as this object. This prevents multiple deletions. + */ + AutoPointer& operator =( AutoPointer& x ) + { + SetPointer( x.Release() ); + m_deleter = x.m_deleter; + m_autoDelete = x.m_autoDelete; + return *this; + } + + /*! + * Move assignment operator. For the %AutoPointer class, this member + * function performs the same actions as the copy assignment operator. + */ + AutoPointer& operator =( AutoPointer&& x ) + { + SetPointer( x.Release() ); + m_deleter = std::move( x.m_deleter ); + m_autoDelete = x.m_autoDelete; + return *this; + } + + /*! + * Causes this smart pointer to store the specified pointer \a p. Returns a + * reference to this object. + * + * If this instance stores a non-null pointer when this function is called, + * and the automatic deletion feature is enabled, the pointed object is + * destroyed by the deleter object. + * + * If this object already stores the specified pointer \a p, this function + * does nothing. + * + * This member function is equivalent to: + * + * \code + * SetPointer( p ); + * \endcode + */ + AutoPointer& operator =( pointer p ) + { + SetPointer( p ); + return *this; + } + + /*! + * Returns a pointer to the immutable object pointed to by this instance. + * + * This operator is a synonym for the Pointer() const member function. + */ + operator const_pointer() const + { + return m_pointer; + } + + /*! + * Returns a copy of the pointer stored in this %AutoPointer instance. + * + * This operator is a synonym for the Pointer() member function. + */ + operator pointer() + { + return m_pointer; + } + + /*! + * Structure member selection operator. Returns a pointer to the immutable + * object pointed to by this %AutoPointer instance. + */ + const_pointer operator ->() const + { + PCL_PRECONDITION( m_pointer != nullptr ) + return m_pointer; + } + + /*! + * Structure member selection operator. Returns a copy of the pointer stored + * in this %AutoPointer instance. + */ + pointer operator ->() + { + PCL_PRECONDITION( m_pointer != nullptr ) + return m_pointer; + } + + /*! + * Dereference operator. Returns a reference to the immutable object pointed + * to by this smart pointer. + */ + const value_type& operator *() const + { + PCL_PRECONDITION( m_pointer != nullptr ) + return *m_pointer; + } + + /*! + * Dereference operator. Returns a reference to the object pointed to by + * this smart pointer. + */ + value_type& operator *() + { + PCL_PRECONDITION( m_pointer != nullptr ) + return *m_pointer; + } + + /*! + * Returns true iff this smart pointer stores a non-null pointer. This + * operator is equivalent to !IsNull(). + */ + operator bool() const + { + return !IsNull(); + } + + /*! + * Exchanges two smart pointers \a x1 and \a x2. + */ + friend void Swap( AutoPointer& x1, AutoPointer& x2 ) + { + pcl::Swap( x1.m_pointer, x2.m_pointer ); + pcl::Swap( x1.m_deleter, x2.m_deleter ); + bool b = x1.m_autoDelete; x1.m_autoDelete = x2.m_autoDelete; x2.m_autoDelete = b; + } + +protected: + + pointer m_pointer = nullptr; + deleter m_deleter; + bool m_autoDelete = true; +}; + +// ---------------------------------------------------------------------------- + +#define ASSERT_COPIABLE_T() \ + static_assert( std::is_copy_constructible::value, "AutoPointerCloner<> requires a copy-constructible type." ) + +/*! + * \class AutoPointerCloner + * \brief A smart pointer able to generate dynamically allocated copies of the + * objects pointed to by other smart pointers. + * + * %AutoPointerCloner is like AutoPointer, from which it derives publicly, with + * the only and substantial difference that it makes a dynamically allocated + * copy (or \e clone) of the object pointed to by another smart pointer upon + * copy construction or copy assignment. This is useful in cases where a + * dynamically allocated data member object must be duplicated automatically by + * the copy constructors and copy assignment operator of its base class. + * + * \sa AutoPointer + */ +template > +class PCL_CLASS AutoPointerCloner : public AutoPointer +{ +public: + + typedef AutoPointer base_type; + + /*! + * Represents the type of the object pointed to by this smart pointer. + */ + typedef typename base_type::value_type value_type; + + /*! + * Represents a pointer stored in this smart pointer. + */ + typedef typename base_type::pointer pointer; + + /*! + * Represents a pointer to an immutable object stored in this smart pointer. + */ + typedef typename base_type::const_pointer const_pointer; + + /*! + * Represents the type of the object responsible for object deletion. + */ + typedef typename base_type::deleter deleter; + + /*! + * Constructs a null smart pointer cloner. + * + * \param autoDelete Initial state of the automatic deletion feature. The + * default value is true, so auto deletion is always + * enabled by default for newly created %AutoPointer + * objects. + * + * \param d Deleter object, responsible for object destruction + * when the automatic deletion feature is enabled. + * + * A null smart pointer stores a null pointer, so it does not point to a + * valid object. + * + * A copy of the specified deleter \a d will be used. If no deleter is + * specified, this object will use a default-constructed instance of the + * deleter template argument class. + */ + AutoPointerCloner( bool autoDelete = true, const deleter& d = deleter() ) + : base_type( autoDelete, d ) + { + ASSERT_COPIABLE_T(); + } + + /*! + * Constructs a smart pointer cloner to store a given pointer. + * + * \param p The pointer to store in this %AutoPointer instance. + * + * \param autoDelete Initial state of the automatic deletion feature. The + * default value is true, so auto deletion is always + * enabled by default for newly created %AutoPointer + * objects. + * + * \param d Deleter object, responsible for object destruction + * when the automatic deletion feature is enabled. + * + * A copy of the specified deleter \a d will be used. If no deleter is + * specified, this object will use a default-constructed instance of the + * deleter template argument class. + */ + AutoPointerCloner( pointer p, bool autoDelete = true, const deleter& d = deleter() ) + : base_type( p, autoDelete, d ) + { + ASSERT_COPIABLE_T(); + } + + /*! + * Non-trivial copy constructor. Constructs a smart pointer cloner by making + * a dynamically allocated copy (or \e clone) of the object pointed to by + * the pointer stored in another smart pointer \a x. + * + * The automatic deletion feature will be enabled for this object if a clone + * object is generated; otherwise it will be in the same state as it is + * currently set for the source object \a x. + * + * Contrarily to the copy constructor of AutoPointer, the source smart + * pointer \a x will not be modified in any way by this constructor. + */ + AutoPointerCloner( const base_type& x ) + : base_type( nullptr ) + { + ASSERT_COPIABLE_T(); + this->m_pointer = x ? new value_type( *x ) : nullptr; + this->m_deleter = x.m_deleter; + this->m_autoDelete = x || x.m_autoDelete; + } + + /*! + * Copy constructor. Constructs a smart pointer cloner by making a + * dynamically allocated copy (or \e clone) of the object pointed to by + * the pointer stored in another smart pointer cloner \a x. + * + * The automatic deletion feature will be enabled for this object if a clone + * object is generated; otherwise it will be in the same state as it is + * currently set for the source object \a x. + * + * Contrarily to the copy constructor of AutoPointer, the source smart + * pointer \a x will not be modified in any way by this constructor. + */ + AutoPointerCloner( const AutoPointerCloner& x ) + : base_type( nullptr ) + { + ASSERT_COPIABLE_T(); + this->m_pointer = x ? new value_type( *x ) : nullptr; + this->m_deleter = x.m_deleter; + this->m_autoDelete = x || x.m_autoDelete; + } + + /*! + * Move constructor. + */ + AutoPointerCloner( base_type&& x ) + : base_type( std::move( x ) ) + { + } + + /*! + * Copy assignment from base class operator. + * + * This assignment operator performs the following actions: + * + * (1) If this smart pointer stores a valid (non-null) pointer, and the + * automatic deletion feature is enabled, the pointed object is destroyed by + * the deleter object. This behavior is the same as for AutoPointer. + * + * (2) If the other smart pointer \a x stores a valid (non-null) pointer, + * a dynamically allocated copy (or \e clone) of the pointed object will be + * generated, and a pointer to the newly constructed object will be stored + * in this instance. In such case, the automatic deletion feature will be + * enabled for this object; otherwise, it will have the same state as in the + * source object \a x, and this object will store a null pointer. + * + * (3) Returns a reference to this object. + * + * In contrast to AutoPointer's copy assignment operator, this operator does + * not modify the specified source object \a x in any way. + */ + AutoPointerCloner& operator =( const base_type& x ) + { + this->SetPointer( x ? new value_type( *x ) : nullptr ); + this->m_deleter = x.m_deleter; + this->m_autoDelete = x || x.m_autoDelete; + return *this; + } + + /*! + * Copy assignment operator. + * + * This assignment operator performs the following actions: + * + * (1) If this smart pointer stores a valid (non-null) pointer, and the + * automatic deletion feature is enabled, the pointed object is destroyed by + * the deleter object. This behavior is the same as for AutoPointer. + * + * (2) If the other smart pointer \a x stores a valid (non-null) pointer, + * a dynamically allocated copy (or \e clone) of the pointed object will be + * generated, and a pointer to the newly constructed object will be stored + * in this instance. In such case, the automatic deletion feature will be + * enabled for this object; otherwise, it will have the same state as in the + * source object \a x, and this object will store a null pointer. + * + * (3) Returns a reference to this object. + * + * In contrast to AutoPointer's copy assignment operator, this operator does + * not modify the specified source object \a x in any way. + */ + AutoPointerCloner& operator =( const AutoPointerCloner& x ) + { + this->SetPointer( x ? new value_type( *x ) : nullptr ); + this->m_deleter = x.m_deleter; + this->m_autoDelete = x || x.m_autoDelete; + return *this; + } + + /*! + * Move assignment operator. This function simply calls the base class + * version of the same operator and returns a reference to this object. + */ + AutoPointerCloner& operator =( base_type&& x ) + { + (void)base_type::operator =( std::move( x ) ); + return *this; + } + + /*! + * Causes this smart pointer cloner to store the specified pointer \a p. + * Returns a reference to this object. + * + * This member function is identical to its base class counterpart + * AutoPointer::operator =( pointer ). It is equivalent to: + * + * \code SetPointer( p ); \endcode + */ + AutoPointerCloner& operator =( pointer p ) + { + this->SetPointer( p ); + return *this; + } +}; + +#undef ASSERT_COPIABLE_T + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AutoPointer_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AutoPointer.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AutoStatusCallbackRestorer.h b/3rdparty/include/pcl/AutoStatusCallbackRestorer.h new file mode 100644 index 0000000..bd31003 --- /dev/null +++ b/3rdparty/include/pcl/AutoStatusCallbackRestorer.h @@ -0,0 +1,233 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AutoStatusCallbackRestorer.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AutoStatusCallbackRestorer_h +#define __PCL_AutoStatusCallbackRestorer_h + +/// \file pcl/AutoStatusCallbackRestorer.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoStatusCallbackRestorer + * \brief Automatic recovery of status monitoring callbacks. + * + * %AutoStatusCallbackRestorer simplifies working with different status + * monitoring callback objects, including objects allocated as automatic + * variables (i.e., inside functions without the static qualifier), ensuring + * that the initial monitoring callback will be recovered when the instance + * gets out of scope. + * + * An instance of %AutoStatusCallbackRestorer stores a pointer to the + * StatusCallback object being used by a StatusMonitor instance upon + * construction, and restores it upon destruction. This ensures that the + * %StatusMonitor object will always be left in a valid state, even in critical + * situations involving multiple function return points and exceptions. + * + * Consider the following example: + * + * \code + * void Foo( Image& image ) + * { + * StatusCallback* oldStatus = image.StatusCallback(); + * StandardStatus status; + * image.SetStatusCallback( &status ); + * image.Status().Initialize( "Performing Foo()", image.NumberOfPixels() ); + * image.Status().DisableInitialization(); + * + * try + * { + * DoFoo( image ); + * image.SetStatusCallback( oldStatus ); + * } + * catch ( ... ) + * { + * image.SetStatusCallback( oldStatus ); + * throw; + * } + * } + * \endcode + * + * Since \c status is an automatic variable, we cannot return from the Foo() + * function without removing it from image.Status(), because otherwise the + * StatusMonitor object would be referencing a dangling pointer. For this + * reason we have to be careful to restore the \c oldStatus pointer before + * returning from Foo(), including any possible returning points and all + * exceptions thrown. + * + * With %AutoStatusCallbackRestorer the above code can be simplified to: + * + * \code + * void Foo( Image& image ) + * { + * AutoStatusCallbackRestorer saveStatus( image.Status() ); + * StandardStatus status; + * image.SetStatusCallback( &status ); + * image.Status().Initialize( "Performing Foo()", image.NumberOfPixels() ); + * image.Status().DisableInitialization(); + * DoFoo( image ); + * } + * \endcode + * + * Note that the try-catch blocks are now unnecessary. As soon as the + * \c saveStatus variable gets out of scope, the \c image.Status() object will + * use its previous status callback again, that is, the same status callback + * that it was using before calling Foo(). This will happen automatically, + * including both normal function returns and uncaught exceptions within the + * Foo() function. + * + * \sa StatusMonitor, StatusCallback + */ +class PCL_CLASS AutoStatusCallbackRestorer +{ +public: + + /*! + * Constructs an %AutoStatusCallbackRestorer object for the specified + * client status \a monitor. + * + * \param monitor Reference to the client StatusMonitor instance. This + * object will store a pointer to the StatusCallback + * object currently being used by the client \a monitor. + * + * \warning The specified \a monitor object must remain valid while this + * object exists. Otherwise undefined behavior will be invoked when this + * object is destroyed. + */ + explicit AutoStatusCallbackRestorer( StatusMonitor& monitor ) + : m_monitor( monitor ) + { + Store(); + } + + /*! + * Destroys this %AutoStatusCallbackRestorer object. + * + * This destructor restores the status callback being used by the client + * status monitor when this object was constructed, or upon the last call to + * Store(). + */ + ~AutoStatusCallbackRestorer() + { + Restore(); + } + + /*! + * Restores the status callback that was being used by the client status + * monitor when this object was constructed, or upon the last call to + * Store(). + */ + void Restore() + { + m_monitor.m_callback = m_callback; + } + + /*! + * Stores the status callback currently used by the client status monitor. + */ + void Store() + { + m_callback = m_monitor.m_callback; + } + + /*! + * Returns a reference to the client status monitor object. The client + * status monitor has been specified upon construction of this instance and + * cannot be changed. + */ + StatusMonitor& Monitor() const + { + return m_monitor; + } + + /*! + * Returns the address of the status callback object currently stored by + * this instance. This is a pointer to a StatusCallback object that was + * acquired when this object was constructed, or in the last call to the + * Store() member function. + */ + StatusCallback* Callback() const + { + return m_callback; + } + + /*! + * Copy constructor. This constructor is disabled. + */ + AutoStatusCallbackRestorer( const AutoStatusCallbackRestorer& ) = delete; + + /*! + * Copy assignment. This constructor is disabled. + */ + AutoStatusCallbackRestorer& operator =( const AutoStatusCallbackRestorer& ) = delete; + +private: + + StatusMonitor& m_monitor; + StatusCallback* m_callback = nullptr; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AutoStatusCallbackRestorer_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AutoStatusCallbackRestorer.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/AutoViewLock.h b/3rdparty/include/pcl/AutoViewLock.h new file mode 100644 index 0000000..db6dba5 --- /dev/null +++ b/3rdparty/include/pcl/AutoViewLock.h @@ -0,0 +1,345 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/AutoViewLock.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_AutoViewLock_h +#define __PCL_AutoViewLock_h + +/// \file pcl/AutoViewLock.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class AutoViewLock + * \brief Automatic view lock/unlock. + * + * %AutoViewLock simplifies locking and unlocking View objects accessed from + * process execution routines. + * + * An %AutoViewLock object locks a %View upon construction and unlocks it upon + * destruction. This ensures that a view will never be left locked, even in + * critical situations involving multiple function return points and + * exceptions. + * + * %AutoViewLock works for %View just as AutoLock does for Mutex. The main + * difference is that a view can be locked and unlocked for read and write + * operations separately, while a mutex cannot. + * + * Typically %AutoViewLock is used within a reimplementation of the + * ProcessImplementation::ExecuteOn() virtual member function for a process + * instance class. Consider the following example: + * + * \code + * bool FooProcessInstance::ExecuteOn( View& view ) + * { + * try + * { + * view.Lock(); + * + * ImageVariant image = view.Image(); + * + * if ( image.IsComplexSample() ) + * { + * view.Unlock(); + * return false; + * } + * + * Console().EnableAbort(); + * + * StandardStatus status; + * image->SetStatusCallback( &status ); + * + * FooEngine::Apply( image, *this ); + * + * view.Unlock(); + * return true; + * } + * catch ( ... ) + * { + * view.Unlock(); + * throw; + * } + * } + * \endcode + * + * With %AutoViewLock the above code can be simplified considerably: + * + * \code + * bool FooProcessInstance::ExecuteOn( View& view ) + * { + * AutoViewLock lock( view ); + * + * ImageVariant image = view.Image(); + * + * if ( image.IsComplexSample() ) + * return false; + * + * Console().EnableAbort(); + * + * StandardStatus status; + * image->SetStatusCallback( &status ); + * + * FooEngine::Apply( image, *this ); + * + * return true; + * } + * \endcode + * + * Note that the try-catch blocks are now unnecessary. As soon as the \c lock + * variable gets out of scope, the \c view object will be unlocked + * automatically, including both normal function returns and uncaught + * exceptions within the ExecuteOn() function. Keep in mind that all exceptions + * will always be caught by internal PCL routines. + * + * \sa View + */ +class PCL_CLASS AutoViewLock +{ +public: + + /*! + * Constructs an %AutoViewLock object to monitor the specified \a view. + * + * \param view A %View object that will be monitored by this + * %AutoViewLock instance. The object must remain valid for + * the whole lifetime of this %AutoViewLock instance. + * + * \param lock Whether the specified \a view should be locked for read + * and write operations by this constructor. The default + * value is true. + * + * If the \a lock argument is true, the specified \a view will be locked for + * read and write operations immediately by this constructor. It will be + * unlocked automatically when this %AutoViewLock object gets out of scope, + * or if it is destroyed explicitly. + * + * By specifying \a lock=false, you can create an %AutoViewLock object to + * monitor a view and lock it for write operations exclusively: + * + * \code + * void foo( View& view ) + * { + * AutoViewLock lock( view, false ); // do not lock for read-write ops. + * lock.LockForWrite(); + * ... + * } + * \endcode + * + * See AutoViewWriteLock for a convenience class to implements this + * functionality in a cleaner way. + */ + explicit AutoViewLock( View& view, bool lock = true ) + : m_view( view ) + , m_readLock( 0 ) + , m_writeLock( 0 ) + { + if ( lock ) + Lock(); + } + + /*! + * Destroys this %AutoViewLock object. + * + * If the monitored view (that was specified in the constructor) is locked, + * it is unlocked by this destructor. + */ + ~AutoViewLock() + { + Unlock(); + m_view = View::Null(); + } + + /*! + * Copy constructor. This constructor is disabled because views and view + * locks are unique objects. + */ + AutoViewLock( const AutoViewLock& ) = delete; + + /*! + * Copy assignment. This operator is disabled because views and view locks + * are unique objects. + */ + AutoViewLock& operator =( const AutoViewLock& ) = delete; + + /*! + * Locks the monitored view for read and write operations, if it has not + * been previously locked. + * + * For more information, see the documentation for View::Lock(). + */ + void Lock() + { + if ( !m_view.IsNull() ) + { + int unlocked = 0; + if ( m_readLock.TestAndSet( 0, 1 ) ) + ++unlocked; + if ( m_writeLock.TestAndSet( 0, 1 ) ) + ++unlocked; + if ( unlocked ) + m_view.Lock(); + } + } + + /*! + * Unlocks the monitored view for read and write operations, if it has been + * previously locked. + * + * For more information, see the documentation for View::Unlock(). + */ + void Unlock() + { + if ( !m_view.IsNull() ) + { + int locked = 0; + if ( m_readLock.TestAndSet( 1, 0 ) ) + ++locked; + if ( m_writeLock.TestAndSet( 1, 0 ) ) + ++locked; + if ( locked ) + m_view.Unlock(); + } + } + + /*! + * Locks the monitored view for write operations, if it has not already been + * write-locked. + * + * For more information, see the documentation for View::LockForWrite(). + */ + void LockForWrite() + { + if ( !m_view.IsNull() ) + if ( m_writeLock.TestAndSet( 0, 1 ) ) + m_view.LockForWrite(); + } + + /*! + * Unlocks the monitored view for read operations, if it has already been + * read-locked. + * + * For more information, see the documentation for View::UnlockForRead(). + */ + void UnlockForRead() + { + if ( !m_view.IsNull() ) + if ( m_readLock.TestAndSet( 1, 0 ) ) + m_view.UnlockForRead(); + } + + /*! + * Unlocks the monitored view for read operations only, if it has not + * already been unlocked. + * + * For more information, see the documentation for View::RelockForRead(). + */ + void RelockForRead() + { + if ( !m_view.IsNull() ) + if ( m_readLock.TestAndSet( 0, 1 ) ) + m_view.RelockForRead(); + } + +private: + + View m_view; + AtomicInt m_readLock; + AtomicInt m_writeLock; +}; + +/*! + * \class AutoViewWriteLock + * \brief Automatic write-only view lock/unlock. + * + * %AutoViewWriteLock performs automatic write-only locking/unlocking of View + * objects. See the documentation for the base class, AutoViewLock, for + * complete information. + * + * \sa View, AutoViewLock + */ +class PCL_CLASS AutoViewWriteLock : public AutoViewLock +{ +public: + + /*! + * Constructs an %AutoViewWriteLock object to monitor the specified \a view + * and lock it for write operations exclusively. + * + * This constructor is equivalent to the following: + * + * \code + * AutoViewLock lock( view, false ); // do not lock for read-write ops. + * lock.LockForWrite(); + * \endcode + */ + explicit AutoViewWriteLock( View& view ) + : AutoViewLock( view, false/*lock*/ ) + { + LockForWrite(); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_AutoViewLock_h + +// ---------------------------------------------------------------------------- +// EOF pcl/AutoViewLock.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/BicubicFilterInterpolation.h b/3rdparty/include/pcl/BicubicFilterInterpolation.h new file mode 100644 index 0000000..faadc88 --- /dev/null +++ b/3rdparty/include/pcl/BicubicFilterInterpolation.h @@ -0,0 +1,670 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/BicubicFilterInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BicubicFilterInterpolation_h +#define __PCL_BicubicFilterInterpolation_h + +/// \file pcl/BicubicFilterInterpolation.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class CubicFilter + * \brief Mitchell-Netravali parameterized cubic filters. + * + * %CubicFilter implements a two-parameter, separable cubic filter as described + * in Don P. Mitchell, Arun N. Netravali (1988), %Reconstruction Filters in + * %Computer %Graphics, %Computer %Graphics, Vol. 22, No. 4, pp. 221-228. + * + * The family of cubic filters designed by Mitchell and Netravali has two + * parameters called B and C. Although these parameters can take any values, + * the authors recommend values pertaining to the line B + 2C = 1. In + * particular, the filter defined by B=C=1/3 has been proven to have excellent + * characteristics for a wide range of image reconstruction tasks. + * + * \sa MitchellNetravaliCubicFilter, CatmullRomSplineFilter, CubicBSplineFilter + */ +class PCL_CLASS CubicFilter +{ +public: + + /*! + * Constructs a new %CubicFilter object with the specified filter + * parameters \a B and \a C. + */ + CubicFilter( double B, double C ) + : m_B( B ) + , m_C( C ) + { + m_k31 = ( 12 - 9*m_B - 6*m_C)/6; + m_k21 = (-18 + 12*m_B + 6*m_C)/6; + m_k01 = ( 6 - 2*m_B )/6; + m_k32 = ( -m_B - 6*m_C)/6; + m_k22 = ( 6*m_B + 30*m_C)/6; + m_k12 = ( -12*m_B - 48*m_C)/6; + m_k02 = ( 8*m_B + 24*m_C)/6; + } + + /*! + * Copy constructor. + */ + CubicFilter( const CubicFilter& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~CubicFilter() + { + } + + /*! + * Assignment operator. + */ + CubicFilter& operator =( const CubicFilter& ) = default; + + /*! + * Evaluates this cubic filter for \a x. + * + * \note For performance reasons, this function returns an invalid value + * outside the range ]-2,+2[, which is the support of Mitchell-Netravali + * cubic filters. Strictly, zero should be returned outside the support + * range, but since this is a performance-critical routine, we have + * sacrified strictness for the sake of optimization. This function should + * never be called for Abs( \a x ) >= 2. + */ + PCL_HOT_FUNCTION + double operator()( double x ) const noexcept + { + if ( x < 0 ) + x = -x; + return (x < 1) ? m_k01 + x*x*(m_k21 + x*m_k31) : + m_k02 + x*(m_k12 + x*(m_k22 + x*m_k32)); + } + + /*! + * Returns the filter's \e width, measured from the origin to its cutoff + * point. We define the \e support of a (symmetric) filter as the range + * ]-width,+width[. + * + * Mitchell-Netravali cubic filters are zero outside the range ]-2,+2[, + * hence this function always returns 2. + */ + double Width() const noexcept + { + return 2.0; + } + + /*! + * Returns a descriptive text string for this cubic filter. + */ + virtual String Description() const + { + return String().Format( "Cubic filter (B=%.6f, C=%.6f)", m_B, m_C ); + } + + /*! + * Returns a pointer to a dynamically allocated duplicate of this filter. + */ + virtual CubicFilter* Clone() const + { + return new CubicFilter( *this ); + } + +protected: + + double m_k31, m_k21, m_k01, m_k32, m_k22, m_k12, m_k02; + +private: + + double m_B, m_C; // for reference only; not used in calculations +}; + +/*! + * \class MitchellNetravaliCubicFilter + * \brief Mitchell-Netravali cubic filter with B=C=1/3 + * + * This is the cubic filter recommended by Mitchell and Netravali (1988). It is + * implemented as a CubicFilter with parameters B=1/3 and C=1/3. + * + * \sa CubicFilter, CatmullRomSplineFilter, CubicBSplineFilter + */ +class PCL_CLASS MitchellNetravaliCubicFilter : public CubicFilter +{ +public: + + /*! + * Constructs a new %MitchellNetravaliCubicFilter object. + */ + MitchellNetravaliCubicFilter() + : CubicFilter( 1.0/3, 1.0/3 ) + { + } + + /*! + * Copy constructor. + */ + MitchellNetravaliCubicFilter( const MitchellNetravaliCubicFilter& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~MitchellNetravaliCubicFilter() + { + } + + /*! + */ + String Description() const override + { + return "Mitchell-Netravali cubic filter"; + } + + /*! + */ + CubicFilter* Clone() const override + { + return new MitchellNetravaliCubicFilter( *this ); + } +}; + +/*! + * \class CatmullRomSplineFilter + * \brief Catmull-Rom spline filter + * + * The Catmull-Rom spline filter is implemented as a CubicFilter with + * parameters B=0 and C=0.5. + * + * \sa CubicFilter, MitchellNetravaliCubicFilter, CubicBSplineFilter + */ +class PCL_CLASS CatmullRomSplineFilter : public CubicFilter +{ +public: + + /*! + * Constructs a new %CatmullRomSplineFilter object. + */ + CatmullRomSplineFilter() + : CubicFilter( 0, 0.5 ) + { + } + + /*! + * Copy constructor. + */ + CatmullRomSplineFilter( const CatmullRomSplineFilter& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~CatmullRomSplineFilter() + { + } + + /*! + */ + String Description() const override + { + return "Catmull-Rom spline filter"; + } + + /*! + */ + CubicFilter* Clone() const override + { + return new CatmullRomSplineFilter( *this ); + } +}; + +/*! + * \class CubicBSplineFilter + * \brief Cubic B-spline filter + * + * The cubic B-spline filter is implemented as a CubicFilter with + * parameters B=1 and C=0. + * + * \sa CubicFilter, MitchellNetravaliCubicFilter, CatmullRomSplineFilter + */ +class PCL_CLASS CubicBSplineFilter : public CubicFilter +{ +public: + + /*! + * Constructs a new %CubicBSplineFilter object. + */ + CubicBSplineFilter() + : CubicFilter( 1, 0 ) + { + } + + /*! + * Copy constructor. + */ + CubicBSplineFilter( const CubicBSplineFilter& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~CubicBSplineFilter() + { + } + + /*! + */ + String Description() const override + { + return "Cubic B-spline filter"; + } + + /*! + */ + CubicFilter* Clone() const override + { + return new CubicBSplineFilter( *this ); + } +}; + +// ---------------------------------------------------------------------------- + +#define m_width this->m_width +#define m_height this->m_height +#define m_fillBorder this->m_fillBorder +#define m_fillValue this->m_fillValue +#define m_data this->m_data + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicFilterInterpolation + * \brief Bicubic filter interpolation algorithms. + * + * Bicubic filter interpolation uses a \e cubic \e filter (an instance of + * CubicFilter or a derived class) to interpolate pixel values in a rectangular + * pixel matrix of the specified horizontal and vertical \e radii. Thanks to + * the separability of cubic filters, %BicubicFilterInterpolation can be + * applied with a different filter size on each axis. + * + * \sa BidimensionalInterpolation, CubicFilter, MitchellNetravaliCubicFilter, + * CatmullRomSplineFilter, CubicBSplineFilter, NearestNeighborInterpolation, + * BilinearInterpolation, BicubicSplineInterpolation, + * BicubicBSplineInterpolation, LanczosInterpolation + */ +template +class PCL_CLASS BicubicFilterInterpolation : public BidimensionalInterpolation +{ +public: + + /*! + * Constructs a new %BicubicFilterInterpolation instance. + * + * \param rx,ry Horizontal and vertical interpolation radii, respectively, + * in pixels. Both radii must be >= 1. Interpolation will + * take place in a rectangular pixel matrix with 2*rx + 1 + * columns and 2*ry + 1 rows. + * + * \param filter Reference to a CubicFilter instance that will be used as + * the interpolation filter. + */ + BicubicFilterInterpolation( int rx, int ry, const CubicFilter& filter ) + : m_rx( Max( 1, rx ) ) + , m_ry( Max( 1, ry ) ) + , m_filter( filter ) + { + PCL_PRECONDITION( rx >= 1 ) + PCL_PRECONDITION( ry >= 1 ) + Initialize(); + } + + /*! + * Copy constructor. + */ + BicubicFilterInterpolation( const BicubicFilterInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BicubicFilterInterpolation() + { + } + + /*! + */ + void Initialize( const T* data, int dataWidth, int dataHeight ) override + { + BidimensionalInterpolation::Initialize( data, dataWidth, dataHeight ); + + if ( m_rx > m_width || m_ry > m_height ) + { + m_rx = Min( m_rx, m_width ); + m_ry = Min( m_ry, m_height ); + Initialize(); + } + } + + /*! + * Returns an interpolated value at {\a x,\a y} location. + * + * \param x,y Coordinates of the interpolation point (horizontal,vertical). + * + * %Interpolation takes place on a rectangular matrix whose center is the + * nearest pixel to {\a x, \a y}. The interpolation matrix has 2*rx + 1 + * columns and 2*ry + 1 rows, where rx and ry are the horizontal and + * vertical interpolation radii, respectively. + */ + PCL_HOT_FUNCTION + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + PCL_PRECONDITION( x >= 0 && x < m_width ) + PCL_PRECONDITION( y >= 0 && y < m_height ) + PCL_CHECK( m_rx >= 1 && m_rx <= m_width ) + PCL_CHECK( m_ry >= 1 && m_ry <= m_height ) + PCL_CHECK( !m_k.IsEmpty() ) + + int x0 = Range( RoundInt( x ), 0, m_width-1 ); + int y0 = Range( RoundInt( y ), 0, m_height-1 ); + + double dx = x - x0; + double dy = y - y0; + + int64 d = int64( y0 - m_ry )*m_width + x0 - m_rx; + + if ( m_rx >= m_ry ) + { + double wx = 0; + for ( int xi = -m_rx, c = 0; xi <= m_rx; ++xi, ++c ) + wx += (m_k[c] = m_filter( m_sx*(xi - dx) )); + + double sy = 0, wy = 0; + for ( int yi = -m_ry; yi <= m_ry; ++yi ) + { + double ky = m_filter( m_sy*(yi - dy) ); + wy += ky; + + const T* p; + int y = y0 + yi; + + if ( y < 0 ) + { + d += m_width; + + if ( m_fillBorder ) + { + sy += m_fillValue * ky; + continue; + } + + p = m_data + (d - 2*int64( m_width )*(y + 1)); + } + else if ( y >= m_height ) + { + if ( m_fillBorder ) + { + sy += m_fillValue * ky; + continue; + } + + p = m_data + (d -= m_width); + } + else + { + p = m_data + d; + d += m_width; + } + + int x = x0 - m_rx; + int x2 = x0 + m_rx; + int x1 = Min( x2, m_width-1 ); + double sx = 0; + const double* kx = m_k.Begin(); + + while ( x < 0 ) + { + ++x; + ++p; + sx += (m_fillBorder ? m_fillValue : double( *(p - (x + x)) )) * *kx++; + } + + for ( ;; ) + { + sx += *p++ * *kx++; + if ( ++x > x1 ) + break; + } + + while ( x <= x2 ) + { + sx += (m_fillBorder ? m_fillValue : double( *--p )) * *kx++; + ++x; + } + + sy += sx/wx * ky; + } + + return sy/wy; + } + else + { + double wy = 0; + for ( int yi = -m_ry, r = 0; yi <= m_ry; ++yi, ++r ) + wy += (m_k[r] = m_filter( m_sy*(yi - dy) )); + + double sx = 0, wx = 0; + for ( int xi = -m_rx; xi <= m_rx; ++xi ) + { + double kx = m_filter( m_sx*(xi - dx) ); + wx += kx; + + const T* p; + int x = x0 + xi; + + if ( x < 0 ) + { + ++d; + + if ( m_fillBorder ) + { + sx += m_fillValue * kx; + continue; + } + + p = m_data + (d - 2*(x + 1)); + } + else if ( x >= m_width ) + { + if ( m_fillBorder ) + { + sx += m_fillValue * kx; + continue; + } + + p = m_data + --d; + } + else + p = m_data + d++; + + int y = y0 - m_ry; + int y2 = y0 + m_ry; + int y1 = Min( y2, m_height-1 ); + double sy = 0; + const double* ky = m_k.Begin(); + + while ( y < 0 ) + { + ++y; + p += m_width; + sy += (m_fillBorder ? m_fillValue : double( *(p - (y + y)*m_width) )) * *ky++; + } + + for ( ;; ) + { + sy += *p * *ky++; + p += m_width; + if ( ++y > y1 ) + break; + } + + while ( y <= y2 ) + { + sy += (m_fillBorder ? m_fillValue : double( *(p -= m_width) )) * *ky++; + ++y; + } + + sx += sy/wy * kx; + } + + return sx/wx; + } + } + + /*! + * Returns the horizontal interpolation radius in pixels. + */ + int HorizontalRadius() const noexcept + { + return m_rx; + } + + /*! + * Returns the vertical interpolation radius in pixels. + */ + int VerticalRadius() const noexcept + { + return m_ry; + } + + /*! + * Sets new interpolation radii. + * + * \param rx,ry Horizontal and vertical interpolation radii, respectively, + * in pixels. Both radii must be >= 1. Interpolation will + * take place in a rectangular pixel matrix with 2*rh + 1 + * columns and 2*rv + 1 rows. + */ + void SetRadii( int rx, int ry ) + { + if ( rx != m_rx || ry != m_ry ) + { + m_rx = Max( 1, rx ); + m_ry = Max( 1, ry ); + + if ( this->data != nullptr ) + { + if ( m_rx > m_width ) + m_rx = m_width; + if ( m_ry > m_height ) + m_ry = m_height; + } + + Initialize(); + } + } + + /*! + * Returns a constant reference to the cubic filter being used by this + * interpolation. + */ + const CubicFilter& Filter() const noexcept + { + return m_filter; + } + + /*! + * Sets a new cubic \a filter to be applied by this interpolation. + */ + void SetFilter( const CubicFilter& filter ) + { + m_filter = filter; + Initialize(); + } + +protected: + + int m_rx, m_ry; // horizontal and vertical radii + double m_sx, m_sy; // filter scaling ratios + mutable DVector m_k; // workspace for interpolated values + CubicFilter m_filter; + + void Initialize() + { + m_sx = m_filter.Width()/(m_rx + 0.5); + m_sy = m_filter.Width()/(m_ry + 0.5); + m_k = DVector( 1 + (Max( m_rx, m_ry ) << 1) ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_fillBorder +#undef m_fillValue +#undef m_data + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BicubicFilterInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/BicubicFilterInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/BicubicInterpolation.h b/3rdparty/include/pcl/BicubicInterpolation.h new file mode 100644 index 0000000..1769ba1 --- /dev/null +++ b/3rdparty/include/pcl/BicubicInterpolation.h @@ -0,0 +1,791 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/BicubicInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BicubicInterpolation_h +#define __PCL_BicubicInterpolation_h + +/// \file pcl/BicubicInterpolation.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +#define m_width this->m_width +#define m_height this->m_height +#define m_fillBorder this->m_fillBorder +#define m_fillValue this->m_fillValue +#define m_data this->m_data + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicInterpolationBase + * \brief Base class for bicubic interpolation algorithm implementations + * + * %BicubicInterpolationBase is a base class for BicubicSplineInterpolation and + * BicubicBSplineInterpolation. + * + * \sa BicubicSplineInterpolation, BicubicBSplineInterpolation + */ +template +class PCL_CLASS BicubicInterpolationBase : public BidimensionalInterpolation +{ +public: + + /*! + * Constructs a new %BicubicInterpolationBase instance. + */ + BicubicInterpolationBase() = default; + + /*! + * Copy constructor. + */ + BicubicInterpolationBase( const BicubicInterpolationBase& ) = default; + +protected: + + void InitXY( int& i1, int& j1, double* p0, double* p1, double* p2, double* p3, double x, double y ) const noexcept + { + PCL_PRECONDITION( int( x ) >= 0 ) + PCL_PRECONDITION( int( x ) < m_width ) + PCL_PRECONDITION( int( y ) >= 0 ) + PCL_PRECONDITION( int( y ) < m_height ) + + // Central grid coordinates + i1 = pcl::Range( TruncInt( y ), 0, m_height-1 ); + j1 = pcl::Range( TruncInt( x ), 0, m_width-1 ); + + // Set up source matrix + + int j0 = j1 - 1; + int i0 = i1 - 1; + + int j2 = j1 + 1; + int i2 = i1 + 1; + + int j3 = j1 + 2; + int i3 = i1 + 2; + + const T* fp = m_data + (int64( i0 )*m_width + j0); + + // Row 0 + + if ( i0 < 0 ) + { + fp += m_width; + + if ( m_fillBorder ) + { + p0[0] = p0[1] = p0[2] = p0[3] = m_fillValue; + goto __row1; + } + } + + GetRow( p0, fp, j0, j2, j3 ); + + if ( i0 >= 0 ) + fp += m_width; + +__row1: // Row 1 + + GetRow( p1, fp, j0, j2, j3 ); + + // Row 2 + + if ( i2 < m_height ) + fp += m_width; + + GetRow( p2, fp, j0, j2, j3 ); + + // Row 3 + + if ( i3 < m_height ) + fp += m_width; + else if ( m_fillBorder ) + { + p3[0] = p3[1] = p3[2] = p3[3] = m_fillValue; + goto __done; + } + + GetRow( p3, fp, j0, j2, j3 ); + +__done: + ; + } + + void InitYX( int& i1, int& j1, double* p0, double* p1, double* p2, double* p3, double x, double y ) const noexcept + { + PCL_PRECONDITION( int( x ) >= 0 ) + PCL_PRECONDITION( int( x ) < m_width ) + PCL_PRECONDITION( int( y ) >= 0 ) + PCL_PRECONDITION( int( y ) < m_height ) + + // Central grid coordinates + i1 = pcl::Range( TruncInt( y ), 0, m_height-1 ); + j1 = pcl::Range( TruncInt( x ), 0, m_width-1 ); + + // Set up source matrix + + int j0 = j1 - 1; + int i0 = i1 - 1; + + int j2 = j1 + 1; + int i2 = i1 + 1; + + int j3 = j1 + 2; + int i3 = i1 + 2; + + const T* fp = m_data + (int64( i0 )*m_width + j0); + + // Column 0 + + if ( j0 < 0 ) + { + ++fp; + + if ( m_fillBorder ) + { + p0[0] = p0[1] = p0[2] = p0[3] = m_fillValue; + goto __col1; + } + } + + GetColumn( p0, fp, i0, i2, i3 ); + + if ( j0 >= 0 ) + ++fp; + +__col1: // Column 1 + + GetColumn( p1, fp, i0, i2, i3 ); + + // Column 2 + + if ( j2 < m_width ) + ++fp; + + GetColumn( p2, fp, i0, i2, i3 ); + + // Column 3 + + if ( j3 < m_width ) + ++fp; + else if ( m_fillBorder ) + { + p3[0] = p3[1] = p3[2] = p3[3] = m_fillValue; + goto __done; + } + + GetColumn( p3, fp, i0, i2, i3 ); + +__done: + ; + } + +private: + + void GetRow( double* p, const T* fp, int j0, int j2, int j3 ) const noexcept + { + if ( m_fillBorder ) + { + *p = (j0 >= 0) ? *fp : m_fillValue; + *++p = *++fp; + + if ( j2 < m_width ) + { + *++p = *++fp; + *++p = (j3 < m_width) ? *++fp : m_fillValue; + } + else + p[1] = p[2] = m_fillValue; + } + else + { + if ( j0 < 0 ) + ++fp; + *p = *fp; + if ( j0 >= 0 ) + ++fp; + *++p = *fp; + + if ( j2 < m_width ) + { + *++p = *++fp; + if ( j3 < m_width ) + ++fp; + *++p = *fp; + } + else + { + *++p = *fp; + *++p = *(fp - 1); + } + } + } + + void GetColumn( double* p, const T* fp, int i0, int i2, int i3 ) const noexcept + { + if ( m_fillBorder ) + { + *p = (i0 >= 0) ? *fp : m_fillValue; + *++p = *(fp += m_width); + + if ( i2 < m_height ) + { + *++p = *(fp += m_width); + *++p = (i3 < m_height) ? *(fp += m_width) : m_fillValue; + } + else + p[1] = p[2] = m_fillValue; + } + else + { + if ( i0 < 0 ) + fp += m_width; + *p = *fp; + if ( i0 >= 0 ) + fp += m_width; + *++p = *fp; + + if ( i2 < m_height ) + { + *++p = *(fp += m_width); + if ( i3 < m_height ) + fp += m_width; + *++p = *fp; + } + else + { + *++p = *fp; + *++p = *(fp - m_width); + } + } + } +}; + +// ---------------------------------------------------------------------------- + +#define InitXY this->InitXY +#define InitYX this->InitYX + +/* + * Undefine the following to use any free constant value a != -1/2 + */ +#define __PCL_BICUBIC_SPLINE_A_IS_MINUS_ONE_HALF 1 + +/* + * The "a" constant controls the depth of the negative lobes in the bicubic + * spline interpolation function, -1 <= a < 0. Larger values of a (in absolute + * value) lead to more ringing (sharpness). The default is -1/2, as recommended + * in [Keys 1981]. + */ +#define __PCL_BICUBIC_SPLINE_A -0.5 + +/* + * Default clamping threshold for linear images. This value has been optimized + * for a = -1/2. If you use another value for a, this must also be fine tuned. + */ +#ifndef __PCL_BICUBIC_SPLINE_CLAMPING_THRESHOLD +#define __PCL_BICUBIC_SPLINE_CLAMPING_THRESHOLD 0.3F +#endif + +/*! + * \class BicubicSplineInterpolation + * \brief Bicubic spline interpolation algorithm + * + * Bicubic interpolation algorithms interpolate from the nearest sixteen mapped + * source data items. Our implementation uses the following cubic spline + * function as a separable filter to perform a convolution interpolation: + * + *
+ * f(x) = (a+2)*x^3 - (a+3)*x^2 + 1       for 0 <= x <= 1
+ * f(x) = a*x^3 - 5*a*x^2 + 8*a*x - 4*a   for 1 < x <= 2
+ * f(x) = 0                               otherwise
+ * 
+ * + * Reference: Keys, R. G. (1981), %Cubic %Convolution %Interpolation for + * %Digital %Image %Processing, IEEE Trans. %Acoustics, %Speech & %Signal + * Proc., Vol. 29, pp. 1153-1160. + * + * The a constant parameter of the cubic spline (-1 <= a < 0) controls the + * depth of the negative lobes of the interpolation function. In this + * implementation we have set a fixed value a=-1/2. + * + * Our implementation includes an automatic linear clamping mechanism + * to avoid discontinuity problems when interpolating linear images. The cubic + * spline function has negative lobes that can cause undershoot (aka ringing) + * artifacts when they fall over bright pixels. This happens frequently with + * linear CCD images. See the documentation for the + * BicubicSplineInterpolation::SetClampingThreshold( float ) function for a + * more detailed description of the linear clamping mechanism. + */ +template +class PCL_CLASS BicubicSplineInterpolation : public BicubicInterpolationBase +{ +public: + + /*! + * Constructs a %BicubicSplineInterpolation instance. + * + * The optional \e clamp parameter defines a threshold to trigger the + * linear clamping mechanism. See the documentation for the + * SetClampingThreshold( float ) function for a detailed description of the + * automatic linear clamping mechanism. The default value of \e clamp = 0.1 + * is appropriate for most linear images. + */ + BicubicSplineInterpolation( float clamp = __PCL_BICUBIC_SPLINE_CLAMPING_THRESHOLD ) + : m_clamp( Range( clamp, 0.0F, 1.0F ) ) + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + BicubicSplineInterpolation( const BicubicSplineInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BicubicSplineInterpolation() + { + } + + /*! + * Returns an interpolated value at {\a x,\a y} location. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + * + * This function performs a two-dimensional interpolation via a convolution + * with the separable cubic spline filter. + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + + // Initialize grid coordinates and source matrix + int i1, j1; + double p0[ 4 ], p1[ 4 ], p2[ 4 ], p3[ 4 ]; + InitXY( i1, j1, p0, p1, p2, p3, x, y ); + + // Cubic spline coefficients + double C[ 4 ]; + GetSplineCoefficients( C, x-j1 ); + + // Interpolate neighbor rows + double c[ 4 ]; + c[0] = Interpolate( p0, C ); + c[1] = Interpolate( p1, C ); + c[2] = Interpolate( p2, C ); + c[3] = Interpolate( p3, C ); + + // Interpolate result vertically + GetSplineCoefficients( C, y-i1 ); + return Interpolate( c, C ); + } + + /*! + * Horizontal interpolation. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + * + * \param[out] fx Address of the first element of a vector where the four + * interpolated X-values will be stored. + * + * This function interpolates horizontally the four neighbor rows for the + * specified \a x, \a y coordinates. This is useful when this interpolation + * algorithm is being used to interpolate an image on the horizontal axis + * exclusively. + */ + void InterpolateX( double fx[], double x, double y ) const noexcept + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + + // Initialize grid coordinates and source matrix + int i1, j1; + double p0[ 4 ], p1[ 4 ], p2[ 4 ], p3[ 4 ]; + InitXY( i1, j1, p0, p1, p2, p3, x, y ); + + // Cubic spline coefficients + double C[ 4 ]; + GetSplineCoefficients( C, x-j1 ); + + // Interpolate neighbor rows + fx[0] = Interpolate( p0, C ); + fx[1] = Interpolate( p1, C ); + fx[2] = Interpolate( p2, C ); + fx[3] = Interpolate( p3, C ); + } + + /*! + * Vertical interpolation. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + * + * \param[out] fy Address of the first element of a vector where the four + * interpolated Y-values will be stored. + * + * This function interpolates vertically the four neighbor columns for the + * specified \a x, \a y coordinates. This is useful when this interpolation + * algorithm is being used to interpolate an image on the vertical axis + * exclusively. + */ + void InterpolateY( double fy[], double x, double y ) const noexcept + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + + // Initialize grid coordinates and source matrix + int i1, j1; + double p0[ 4 ], p1[ 4 ], p2[ 4 ], p3[ 4 ]; + InitYX( i1, j1, p0, p1, p2, p3, x, y ); + + // Cubic spline coefficients + double C[ 4 ]; + GetSplineCoefficients( C, y-i1 ); + + // Interpolate neighbor columns + fy[0] = Interpolate( p0, C ); + fy[1] = Interpolate( p1, C ); + fy[2] = Interpolate( p2, C ); + fy[3] = Interpolate( p3, C ); + } + + /*! + * %Vector interpolation. + * + * \param c Address of the first element of a vector of four data points. + * + * \param dx %Interpolation point in the range [0,+1[. A value of zero + * corresponds to the second element in the f vector. + * + * This function interpolates four neighbor rows or columns by direct + * convolution with the cubic spline function. The four elements of the \a c + * vector can be raw data points, to use cubic spline interpolation in one + * dimension, or they can be interpolated rows or columns from an arbitrary + * 2-D matrix. For example, \a c can be generated by a previous call to + * InterpolateX() or InterpolateY(), respectively to provide source + * interpolated rows or columns, or by equivalent functions from a different + * separable cubic interpolation algorithm. This is useful to mix cubic + * spline interpolation with other interpolation algorithms, which allows + * for flexible interpolation schemes. + */ + double InterpolateVector( const double c[], double dx ) const noexcept + { + double C[ 4 ]; + GetSplineCoefficients( C, dx ); + return Interpolate( c, C ); + } + + /*! + * Returns the current linear clamping threshold for this + * interpolation object. + * + * See the documentation for SetClampingThreshold( float ) for a detailed + * description of the automatic linear clamping mechanism. + */ + float ClampingThreshold() const noexcept + { + return m_clamp; + } + + /*! + * Defines a threshold to trigger the linear clamping mechanism. + * The clamping mechanism automatically switches to linear interpolation + * when the differences between neighbor pixels are so large that the cubic + * interpolation function may cause ringing artifacts. Ringing occurs when + * the negative lobes of the cubic spline interpolation function fall over + * isolated bright source pixels or bright edges. For example, ringing + * problems happen frequently around stars in linear CCD images. For + * nonlinear images, linear clamping is almost never necessary, as in + * nonlinear images (e.g., stretched deep-sky images, or diurnal images) + * there are normally no such large variations between neighbor pixels. + * + * Linear clamping works on a per-row or per-column basis within the + * interpolation neighborhood of 16 pixels. This means that when the + * clamping mechanism selects linear interpolation, it restricts its use to + * the affected (by too strong variations) row or column, without changing + * the bicubic interpolation scheme as a whole. This ensures artifact-free + * interpolated images without degrading the overall performance of bicubic + * spline interpolation. + * + * The specified clamping threshold \e clamp must be in the [0,1] range. + * Lower values cause a more aggressive deringing effect. + */ + void SetClampingThreshold( float c ) noexcept + { + PCL_PRECONDITION( 0 <= c && c <= 1 ) + m_clamp = Range( c, 0.0F, 1.0F ); + } + +private: + + double m_clamp; + + PCL_HOT_FUNCTION + double Interpolate( const double* __restrict__ p, const double* __restrict__ C ) const noexcept + { + // Unclamped code: + //return p[0]*C[0] + p[1]*C[1] + p[2]*C[2] + p[3]*C[3]; + double f12 = p[1]*C[1] + p[2]*C[2]; + double f03 = p[0]*C[0] + p[3]*C[3]; + return (-f03 < f12*m_clamp) ? f12 + f03 : f12/(C[1] + C[2]); + } + + PCL_HOT_FUNCTION + void GetSplineCoefficients( double* __restrict__ C, double dx ) const noexcept + { + double dx2 = dx*dx; + double dx3 = dx2*dx; + +#ifdef __PCL_BICUBIC_SPLINE_A_IS_MINUS_ONE_HALF + // Optimized code for a = -1/2 + // We *really* need optimization here since this routine is called twice + // for each interpolated pixel. + double dx1_2 = dx/2; + double dx2_2 = dx2/2; + double dx3_2 = dx3/2; + double dx22 = dx2 + dx2; + double dx315 = dx3 + dx3_2; + C[0] = dx2 - dx3_2 - dx1_2; + C[1] = dx315 - dx22 - dx2_2 + 1; + C[2] = dx22 - dx315 + dx1_2; + C[3] = dx3_2 - dx2_2; +#else +# define a (__PCL_BICUBIC_SPLINE_A) + C[0] = a*dx3 - 2*a*dx2 + a*dx; + C[1] = (a + 2)*dx3 - (a + 3)*dx2 + 1; + C[2] = -(a + 2)*dx3 + (2*a + 3)*dx2 - a*dx; + C[3] = -a*dx3 + a*dx2; +# undef a +#endif + } +}; + +/*! + * \class BicubicInterpolation + * \brief Bicubic interpolation - an alias for BicubicSplineInterpolation + * + * %BicubicInterpolation is a synonym for the BicubicSplineInterpolation class. + * + * \deprecated This class exists to support old PCL-based code; all new code + * should use the BicubicSplineInterpolation class. + * + * \sa BicubicSplineInterpolation + */ +template +class PCL_CLASS BicubicInterpolation : public BicubicSplineInterpolation +{ +public: + + /*! + * Constructs a %BicubicInterpolation instance. + */ + BicubicInterpolation() = default; + + /*! + * Copy constructor. + */ + BicubicInterpolation( const BicubicInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BicubicInterpolation() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicBSplineInterpolation + * \brief Bicubic B-Spline Interpolation Algorithm + * + * Like bicubic spline interpolation, the bicubic B-spline interpolation + * algorithm also interpolates from the nearest sixteen data items. However, + * this algorithm uses B-spline interpolating functions instead of cubic + * splines, which yields quite (too?) smooth results. + * + * This implementation is based on Bicubic %Interpolation for %Image + * Scaling, by Paul Bourke. It performs a convolution with a nonseparable + * 2-D filter, so its performance is O(n^2). + * + * \sa BicubicSplineInterpolation, BicubicInterpolation, BilinearInterpolation, + * NearestNeighborInterpolation + */ +template +class PCL_CLASS BicubicBSplineInterpolation : public BicubicInterpolationBase +{ +public: + + /*! + * Constructs a %BicubicBSplineInterpolation instance. + */ + BicubicBSplineInterpolation() = default; + + /*! + * Copy constructor. + */ + BicubicBSplineInterpolation( const BicubicBSplineInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BicubicBSplineInterpolation() + { + } + + /*! + * Interpolated value at \a {x,y} location. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( f != 0 ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + + // Initialize grid coordinates and source matrix + int i1, j1; + double p0[ 4 ], p1[ 4 ], p2[ 4 ], p3[ 4 ]; + InitXY( i1, j1, p0, p1, p2, p3, x, y ); + + // Bicubic B-Spline interpolation functions + + double dx = x - j1; + double dx0 = -1 - dx; + double dx1 = -dx; + double dx2 = 1 - dx; + double dx3 = 2 - dx; + + double dy = y - i1; + double dy0 = -1 - dy; + double dy1 = -dy; + double dy2 = 1 - dy; + double dy3 = 2 - dy; + + return + BXY( p0, 0, dx0, dy0 ) + + BXY( p0, 1, dx1, dy0 ) + + BXY( p0, 2, dx2, dy0 ) + + BXY( p0, 3, dx3, dy0 ) + + BXY( p1, 0, dx0, dy1 ) + + BXY( p1, 1, dx1, dy1 ) + + BXY( p1, 2, dx2, dy1 ) + + BXY( p1, 3, dx3, dy1 ) + + BXY( p2, 0, dx0, dy2 ) + + BXY( p2, 1, dx1, dy2 ) + + BXY( p2, 2, dx2, dy2 ) + + BXY( p2, 3, dx3, dy2 ) + + BXY( p3, 0, dx0, dy3 ) + + BXY( p3, 1, dx1, dy3 ) + + BXY( p3, 2, dx2, dy3 ) + + BXY( p3, 3, dx3, dy3 ); + } + +private: + + double BXY( const double* __restrict__ p, int j, double x, double y ) const noexcept + { + return p[j]*B( x )*B( y ); + } + + double B( double x ) const noexcept + { + double fx = (x > 0) ? x*x*x : 0; + + double fxp1 = x + 1; + fxp1 = (fxp1 > 0) ? fxp1*fxp1*fxp1 : 0; + + double fxp2 = x + 2; + fxp2 = (fxp2 > 0) ? fxp2*fxp2*fxp2 : 0; + + double fxm1 = x - 1; + fxm1 = (fxm1 > 0) ? fxm1*fxm1*fxm1 : 0; + + return (fxp2 - 4*fxp1 + 6*fx - 4*fxm1)/6; + } +}; + +// ---------------------------------------------------------------------------- + +#undef InitXY +#undef InitYX + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_fillBorder +#undef m_fillValue +#undef m_data + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BicubicInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/BicubicInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/BidimensionalInterpolation.h b/3rdparty/include/pcl/BidimensionalInterpolation.h new file mode 100644 index 0000000..59966b7 --- /dev/null +++ b/3rdparty/include/pcl/BidimensionalInterpolation.h @@ -0,0 +1,236 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/BidimensionalInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BidimensionalInterpolation_h +#define __PCL_BidimensionalInterpolation_h + +/// \file pcl/BidimensionalInterpolation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class BidimensionalInterpolation + * \brief A generic interface to two-dimensional interpolation algorithms. + * + * %BidimensionalInterpolation is a base class for all two-dimensional + * interpolation algorithm implementations in PCL. + */ +template +class PCL_CLASS BidimensionalInterpolation +{ +public: + + /*! + * Constructs a %BidimensionalInterpolation object. + */ + BidimensionalInterpolation() = default; + + /*! + * Copy constructor. + */ + BidimensionalInterpolation( const BidimensionalInterpolation& ) = default; + + /*! + * Destroys a %BidimensionalInterpolation object. + */ + virtual ~BidimensionalInterpolation() + { + Clear(); + } + + /*! + * Initializes a new interpolation. + * + * \param data Two-dimensional matrix of function values stored in + * row-order. Must remain valid and accessible while this + * object is used to compute interpolated function values. + * + * \param width Horizontal dimension (most rapidly varying coordinate) of + * the data array. + * + * \param height Vertical dimension (most slowly varying coordinate) of the + * data array. + */ + virtual void Initialize( const T* data, int width, int height ) + { + if ( data == nullptr ) + throw Error( "Null data pointer in BidimensionalInterpolation::Initialize()" ); + if ( width <= 0 || height <= 0 ) + throw Error( "Invalid dimensions in BidimensionalInterpolation::Initialize()" ); + m_data = data; + m_width = width; + m_height = height; + } + + /*! + * Returns an interpolated function value at \a x, \a y coordinates. + */ + virtual double operator()( double x, double y ) const = 0; + + /*! + * Clears auxiliary/intermediate data (and/or whatever requires clean up). + * Derived classes overriding this function should call their base class + * version via explicit downcast. + */ + virtual void Clear() + { + m_data = nullptr; + m_width = m_height = 0; + } + + /*! + * Returns a pointer to the interpolated data array. + */ + const T* BeingInterpolated() const + { + return m_data; + } + + /*! + * Returns the width (number of columns) of the interpolated data matrix. + */ + int Width() const + { + return m_width; + } + + /*! + * Returns the height (number of rows) of the interpolated data matrix. + */ + int Height() const + { + return m_height; + } + + /*! + * Enables (or disables) border filling. + * + * When border filling is enabled, a user-defined constant fill value is + * used to interpolate at locations near the borders of the data matrix. + * + * When border filling is disabled, existing border values are extended to + * interpolate at border locations (Neumann boundary conditions). + */ + void EnableBorderFilling( bool enable = true ) + { + m_fillBorder = enable; + } + + /*! + * Disables (or enables) border filling. + * + * This is a convenience member function, equivalent to: + * + * EnableBorderFilling( !disable ); + */ + void DisableBorderFilling( bool disable = true ) + { + m_fillBorder = !disable; + } + + /*! + * Returns true iff border filling is enabled for this interpolation. See the + * documentation for EnableBorderFilling() for more information. + */ + bool IsBorderFillingEnabled() const + { + return m_fillBorder; + } + + /*! + * Sets the border fill value \a v. See the documentation for + * EnableBorderFilling() for more information about border filling and + * boundary conditions. + * + * \param v Border fill value. It is the responsibility of the caller to + * ensure that the specified value is within the valid range of + * the data type used by this interpolation. + */ + void SetBorderFillValue( double v ) + { + m_fillValue = v; + } + + /*! + * Returns the current border fill value for this interpolation. See the + * documentation for EnableBorderFilling() for more information about border + * filling and boundary conditions. + */ + double BorderFillValue() const + { + return m_fillValue; + } + +protected: + + const T* m_data = nullptr; // functional data being interpolated + int m_width = 0; // width of the data table + int m_height = 0; // height of the data table + double m_fillValue = 0; // fill value, when m_fillBorder = true + bool m_fillBorder = false; // don't apply Neumann boundary conditions +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BidimensionalInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/BidimensionalInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/BilinearInterpolation.h b/3rdparty/include/pcl/BilinearInterpolation.h new file mode 100644 index 0000000..02fd76b --- /dev/null +++ b/3rdparty/include/pcl/BilinearInterpolation.h @@ -0,0 +1,164 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/BilinearInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BilinearInterpolation_h +#define __PCL_BilinearInterpolation_h + +/// \file pcl/BilinearInterpolation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_width this->m_width +#define m_height this->m_height +#define m_fillBorder this->m_fillBorder +#define m_fillValue this->m_fillValue +#define m_data this->m_data + +// ---------------------------------------------------------------------------- + +/*! + * \class BilinearInterpolation + * \brief Bilinear interpolation algorithm. + * + * The bilinear interpolation algorithm interpolates from the nearest four + * mapped source data items. It builds and evaluates two linear interpolation + * polynomials, one for each plane direction. + * + * \sa NearestNeighborInterpolation, BicubicSplineInterpolation, + * BicubicBSplineInterpolation, BicubicFilterInterpolation, + */ +template +class PCL_CLASS BilinearInterpolation : public BidimensionalInterpolation +{ +public: + + /*! + * Constructs a %BilinearInterpolation instance. + */ + BilinearInterpolation() = default; + + /*! + * Copy constructor. + */ + BilinearInterpolation( const BilinearInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BilinearInterpolation() + { + } + + /*! + * Returns an interpolated value at {\a x,\a y} location. + * + * \param x,y Coordinates of the interpolation point (horizontal,vertical). + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + + int j0 = pcl::Range( TruncInt( x ), 0, m_width-1 ); + int i0 = pcl::Range( TruncInt( y ), 0, m_height-1 ); + + int j1 = j0 + 1; + int i1 = i0 + 1; + + double p00, p10, p01, p11; + const T* fp = m_data + (int64( i0 )*m_width + j0); + + p00 = *fp; + p10 = (j1 < m_width) ? fp[1] : (m_fillBorder ? m_fillValue : *fp); + + if ( i1 < m_height ) + fp += m_width; + else if ( m_fillBorder ) + { + p01 = p11 = m_fillValue; + goto __1; + } + + p01 = *fp; + p11 = (j1 < m_width) ? fp[1] : (m_fillBorder ? m_fillValue : *fp); + +__1: + double dx = x - j0, dx1 = 1 - dx; + double dy = y - i0, dy1 = 1 - dy; + return p00*dx1*dy1 + p10*dx*dy1 + p01*dx1*dy + p11*dx*dy; + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_fillBorder +#undef m_fillValue +#undef m_data + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BilinearInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/BilinearInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Bitmap.h b/3rdparty/include/pcl/Bitmap.h new file mode 100644 index 0000000..2d84d1b --- /dev/null +++ b/3rdparty/include/pcl/Bitmap.h @@ -0,0 +1,1531 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Bitmap.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Bitmap_h +#define __PCL_Bitmap_h + +/// \file pcl/Bitmap.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::BitmapFormat + * \brief Bitmap pixel value interpretation modes. + * + * + * + * + * + * + * + * + *
BitmapFormat::ARGB32AARRGGBB format. The alpha AA component is used to represent the + * transparency of each pìxel: from 0=transparent to 0xFF=opaque. + * This is the default mode.
BitmapFormat::RGB32ffRRGGBB format. The alpha component is set to a constant value of + * 255 = 0xff, hence the bitmap is always opaque. This mode can be used + * to improve the performance of graphics output when painting on + * controls, especially on X11 platforms (Linux and FreeBSD).
BitmapFormat::ARGB32_PremultipliedAARRGGBB format with red, green and blue components premultiplied by + * the alpha channel and divided by 255. This format is faster for + * bitmap renditions drawn with the Graphics and VectorGraphics + * classes.
+ */ +namespace BitmapFormat +{ + enum value_type + { + ARGB32, // AARRGGBB + RGB32, // ffRRGGBB + ARGB32_Premultiplied, // AARRGGBB with premultiplied RGB + + // ### TODO: Core version 1.8.x: Implement 16-bit bitmap formats. +// RGBA64, // RRRRGGGGBBBBAAAA +// RGBA64, // RRRRGGGGBBBBffff +// RGBA64_Premultiplied, // RRRRGGGGBBBBAAAA with premultiplied RGB + + NumberOfBitmapFormats, + + Invalid = -1 + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::SVGRenderOption + * \brief Rendering options for raster image representation of SVG documents. + * + * + * + * + * + * + * + * + *
SVGRenderOption::PreserveAspectRatioRender within the specified rectangular area, preserving the + * original aspect ratio of the SVG drawing. If not selected, render + * freely to fill the specified rectangular area entirely.
SVGRenderOption::HighQualityRender with a high-quality, thread-unsafe implementation supporting + * the entire SVG 1.1 specification. If not selected, use a fast + * thread-safe implementation that supports most of the SVG 1.1 + * specification.
SVGRenderOption::DefaultDefault rendering options: + * SVGRenderOption::PreserveAspectRatio | SVGRenderOption::Fast
+ */ +namespace SVGRenderOption +{ + enum mask_type + { + IgnoreAspectRatio = 0x00000000, // Render freely to fill the specified rectangular area entirely, ignoring aspect ratio. + PreserveAspectRatio = 0x00000001, // Render within the specified rectangular area, preserving the original aspect ratio of the SVG drawing. + Fast = 0x00000000, // Render with a fast, thread-safe implementation that supports most of the SVG 1.1 specification. + HighQuality = 0x00000010, // Render with a high-quality, thread-unsafe implementation supporting the entire SVG 1.1 specification. + Default = PreserveAspectRatio|Fast + }; +}; + +/*! + * \class pcl::SVGRenderOptions + * \brief A collection of rendering options for raster image representation of + * SVG documents. + */ +typedef Flags SVGRenderOptions; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class PCL_CLASS ImageVariant; + +// ---------------------------------------------------------------------------- + +/*! + * \class Bitmap + * \brief Client-side interface to a PixInsight %Bitmap object. + * + * In the PixInsight platform, bitmaps are device-independent images that can + * be used for graphics output and allow direct pixel manipulation. + * + * Pixels in a bitmap are always stored as 32-bit values in the following + * format: + * + * AARRGGBB + * + * where each letter represents a 4-bit hexadecimal digit (from 0 to F). Each + * 8-bit pair represents a pixel component in the range from 0 to 255: + * + * + * + * + * + * + *
AA Alpha value, or pixel opacity: 0 means + * completely transparent, 255 corresponds to an opaque + * pixel.
RR Red pixel color component.
GG Green pixel color component.
BB Blue pixel color component.
+ * + * %Bitmap is a managed, high-level object that encapsulates the properties and + * behavior of an actual bitmap living in the PixInsight core application. + * + * %Bitmap provides a comprehensive set of functions and utility routines to + * manipulate bitmap images, such as direct pixel access functions, specular + * and affine transformations, bitwise logical operations, and high-performance + * rendering of images as bitmaps, among many others. + * + * Along with the Graphics class, %Bitmap can be used for off-screen graphics + * output. Graphics offers a thorough collection of painting routines that can + * be used to generate sophisticated graphics as bitmaps. + * + * As we have said, bitmaps are device-independent images in PixInsight. It + * must be pointed out that there is no equivalent to a \e device-dependent + * bitmap or image in PixInsight: all device dependencies are managed + * internally by the PixInsight core application. + */ +class PCL_CLASS Bitmap : public UIObject +{ +public: + + /*! + * Represents a bitmap pixel format. See the BitmapFormat namespace for + * supported values. + */ + typedef BitmapFormat::value_type pixel_format; + + /*! + * The %display_channel type represents a display channel supported by the + * PixInsight core application. Valid channels are defined in the + * DisplayChannel namespace. + */ + typedef DisplayChannel::value_type display_channel; + + /*! + * The %mask_mode type represents a mask rendering mode supported by + * the PixInsight core application. Valid mask rendering modes are defined + * in the MaskMode namespace. + */ + typedef MaskMode::value_type mask_mode; + + /*! + * Constructs an empty %Bitmap object. + */ + Bitmap(); + + /*! + * Constructs a %Bitmap object of the specified \a width and \a height + * dimensions, and pixel format \a fmt + * + * For the sake of performance, bitmap pixel values are not initialized, so + * they will contain unpredictable \e garbage values. + */ + Bitmap( int width, int height, pixel_format fmt = BitmapFormat::ARGB32 ); + + /*! + * Constructs a %Bitmap object from a source image in the XPM format. + * + * \param xpm Starting address of an XPM image description. + * + * \b References + * + * \li http://en.wikipedia.org/wiki/X_PixMap + * \li http://www.xfree86.org/current/xpm.pdf + */ + Bitmap( const char** xpm ); + + /*! + * Constructs a %Bitmap object by loading an embedded resource or disk file. + * + * \param filePath Path to the source image file or resource. A resource + * path begins with the ":/" prefix. For a list of supported + * image file formats, see the documentation for the + * Load( const String& ) member function. The source file format + * is always determined from the specified file extension. + * + * For more information on embedded resources, see + * Bitmap::Bitmap( const char* ). + * + * In the even of file I/O error, or if the specified file cannot be decoded + * and read correctly, this constructor throws an Error exception. + */ + Bitmap( const String& filePath ); + + /*! + * Constructs a %Bitmap object by loading an embedded resource or disk file. + * + * \param filePath Path to the source image file or resource. A resource + * path begins with the ":/" prefix. For a list of supported + * image file formats, see the documentation for the + * Load( const String& ) member function. The source file format + * is always determined from the specified file extension. + * + * The PixInsight core application uses the Qt resource system for embedded + * images that can be loaded dynamically from .rcc binary files. For + * example, the following code snippet loads one of the standard core + * application icons: + * + * \code Bitmap icon( ":/icons/document.png" ); \endcode + * + * A module can also use the standard ":/@module_root/" prefix to load + * module-defined resources. See MetaModule::LoadResource() for a detailed + * description. + * + * In the even of stream I/O error, or if the specified resource or file + * cannot be decoded and read correctly, this constructor throws an Error + * exception. + * + * \b References + * + * \li The Qt Resource System: http://doc.qt.io/qt-5/resources.html + */ + Bitmap( const char* filePath ); + + /*! + * Constructs a %Bitmap object by loading an embedded resource or disk file. + * This constructor is equivalent to Bitmap::Bitmap( const char* ). + */ + Bitmap( const IsoString& filePath ); + + /*! + * Constructs a %Bitmap object from bitmap data stored in memory. + * + * \param data Starting address of the source bitmap data block. + * + * \param size Length of the source data in bytes. + * + * \param format A nul-terminated character string identifying the format + * of the source data. Currently the following formats are + * supported by the PixInsight core application: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
%BMP Windows %Bitmap
%GIF %Graphics Interchange Format
%ICO Windows %Icon Format
%JPG Joint Photographic Experts Group
%WEBP %WebP image format
%MNG Multiple Network %Graphics
%PBM Portable Bitmap
%PNG Portable Network %Graphics
%PPM Portable Pixel Map
%SVG Scalable Vector Graphics
%TIFF Tagged %Image %File Format
%TGA Truevision TGA Format (TARGA)
%XBM X11 Bitmap
%XPM X11 Pixmap
+ * + * The default value (when no format is specified) is SVG. + * + * \param flags Currently not used. This parameter is reserved for future + * extension and its value must be zero (the default value). + * + * If the \a data address is invalid, or if the data are not valid in the + * specified \a format, this constructor throws an Error exception. + */ + Bitmap( const void* data, size_type size, const char* format = "SVG", uint32 flags = 0 ); + + /*! + * Constructs a %Bitmap object as a subimage of an existing %Bitmap. + * + * \param bmp Source bitmap. + * + * \param r Rectangle that defines the source subimage, in source + * bitmap coordinates. + */ + Bitmap( const Bitmap& bmp, const pcl::Rect& r ); + + /*! + * Constructs a %Bitmap object as a subimage of an existing %Bitmap. + * + * \param bmp Source bitmap. + * + * \param x0, y0 Coordinates of the upper left corner of the rectangle that + * defines the source subimage, in source bitmap coordinates. + * + * \param x1, y1 Coordinates of the lower right corner of the rectangle + * that defines the source subimage, in source bitmap + * coordinates. + */ + Bitmap( const Bitmap& bmp, int x0, int y0, int x1, int y1 ); + + /*! + * Copy constructor. This object will reference the same server-side bitmap + * as the specified instance \a b. + */ + Bitmap( const Bitmap& bmp ) : UIObject( bmp ) + { + } + + /*! + * Move constructor. + */ + Bitmap( Bitmap&& x ) : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a %Bitmap object. + * + * The actual bitmap object that this %Bitmap instance refers to lives in + * the PixInsight core application, and as such, it will be destroyed and + * deallocated (garbage-collected) only when no more references exist to it + * in other high-level managed objects, such as other instances of %Bitmap + * living in installed modules, or some element of the graphical interface. + */ + virtual ~Bitmap() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side bitmap as the specified + * instance \a bmp. If the previous bitmap becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + Bitmap& operator =( const Bitmap& bmp ) + { + Assign( bmp ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Bitmap& operator =( Bitmap&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null %Bitmap instance. A null %Bitmap does not + * correspond to an existing bitmap in the PixInsight core application. + */ + static Bitmap& Null(); + + /*! + * Returns the current pixel format for this bitmap. + * + * Supported pixel format values are enumerated in the BitmapFormat + * namespace. + */ + pixel_format PixelFormat() const; + + /*! + * Sets the pixel format for this bitmap. If necessary, pixel values will + * be converted internally to match the specified format. + * + * Supported pixel format values are enumerated in the BitmapFormat + * namespace. + */ + void SetPixelFormat( pixel_format fmt ); + + /*! + * Renders an image as a bitmap. + * + * \param image The source image to be rendered. It can be a PCL image of + * any supported sample type. + * + * \param zoom Zoom factor. If zoom == 1, the image will be rendered at + * its actual dimensions in pixels. Positive zoom factors are + * enlarging ratios; for example, if zoom == 2, the image will + * be rendered zoomed 2:1 (twice its actual sizes). Negative + * zoom factors are reduction ratios: zoom = -3 means zoomed + * 1:3, or one third of the actual image dimensions. + * + * \param displayChannel See the DisplayChannel enumeration for possible + * values. The default mode is DisplayChannel::RGBK, which means + * that the image will be rendered in RGB/gray composite mode. + * + * \param transparency If this parameter is true and the image has one + * or more alpha channels, the image will be rendered over a + * transparent background and the first alpha channel will + * define pixel opacity. If this parameter is false, alpha + * channels will not be interpreted as transparency masks. + * + * \param mask If non-null, this is the address of an image that will be + * treated as a mask acting for the source image. Mask pixels + * modify the image rendition according to the specified mask + * rendering mode (see the maskMode paramter). The mask image + * must have the same dimensions as the source image. This + * parameter is nullptr by default. + * + * \param maskMode This parameter defines the mask rendering mode to be + * used if a mask image has been specified. See the MaskMode + * enumeration for supported values. The default mode is + * MaskMode::Default, which corresponds to the red overlay mask + * rendering mode. + * + * \param maskInverted If \a mask is non-null and this parameter is + * true, mask pixels will be inverted before rendering them over + * source image pixels. + * + * \param LUT If non-null, this is the address of a look-up + * table that will be used to remap bitmap pixel values. + * This parameter is nullptr by default. + * + * \param fastDownsample If this parameter is true, a fast sparse + * interpolation algorithm will be used to render the image if a + * \a zoom factor less than -2 is specified. Fast subsampling + * interpolation is considerably faster than normal (slow) + * interpolation, but the generated renditions are less + * accurate. In general though, fast interpolation errors are + * barely noticeable. This parameter is true by default. + * + * \param callback If non-null, this is the address of a callback routine + * that will be invoked during the bitmap rendition procedure. + * If the callback routine returns false, the rendition is + * aborted and a null bitmap (Bitmap::Null()) is returned. By + * default this parameter is nullptr. + * + * This is a high-performance routine, implemented with highly optimized + * parallel code, that can be used for real-time image visualization. If + * allowed through global preferences, it will use all available processors + * and processor cores by means of concurrent threads. + */ + static Bitmap Render( const ImageVariant& image, + int zoom = 1, display_channel displayChannel = DisplayChannel::RGBK, bool transparency = true, + const ImageVariant* mask = nullptr, mask_mode maskMode = MaskMode::Default, bool maskInverted = false, + const uint8** LUT = nullptr, bool fastDownsample = true, bool (*callback)() = nullptr ); + + /*! + * Obtains the dimensions (width, height) of this bitmap in pixels. + */ + void GetDimensions( int& width, int& height ) const; + + /*! + * Returns the width of this bitmap in pixels. + */ + int Width() const + { + int w, dum; GetDimensions( w, dum ); return w; + } + + /*! + * Returns the height of this bitmap in pixels. + */ + int Height() const + { + int dum, h; GetDimensions( dum, h ); return h; + } + + /*! + * Returns the bounding rectangle of this bitmap. + * + * The upper-left corner of the returned rectangle is always at (0,0). The + * width and height of the returned rectangle are the bitmap dimensions. + */ + pcl::Rect Bounds() const + { + int w, h; GetDimensions( w, h ); return pcl::Rect( w, h ); + } + + /*! + * Returns true iff this bitmap is empty. An empty bitmap has zero dimensions + * and does not contain any image. + */ + bool IsEmpty() const; + + /*! + * Returns true iff this bitmap contains an image, that is, if it is not an + * empty bitmap. + * + * This is a convenience operator that simply returns !IsEmpty(). + */ + operator bool() const + { + return !IsEmpty(); + } + + /*! + * \defgroup bitmap_pixel_access Bitmap Pixel Access Functions + */ + + /*! + * Returns the value of a bitmap pixel. + * + * \param x,y Bitmap coordinates of the pixel to read. Pixel coordinates + * can vary in the range from (0,0) to (Width()-1, Height()-1). + * + * \ingroup bitmap_pixel_access + */ + RGBA Pixel( int x, int y ) const; + + /*! + * Returns the value of a bitmap pixel. + * + * \param p A Point object whose coordinates identify the pixel to read. + * Pixel coordinates can vary in the range from (0,0) to + * (Width()-1, Height()-1). + * + * \ingroup bitmap_pixel_access + */ + RGBA Pixel( const pcl::Point& p ) const + { + return Pixel( p.x, p.y ); + } + + /*! + * Sets the value of a bitmap pixel. + * + * \param x,y Bitmap coordinates of the pixel to write. Pixel coordinates + * can vary in the range from (0,0) to (Width()-1, Height()-1). + * + * \param v 32-bit pixel value encoded in the AARRGGBB format: AA is the + * alpha (transparency) value, RR is the red component, GG is + * green and BB is blue. Each element is an 8-bit value. + * + * \ingroup bitmap_pixel_access + */ + void SetPixel( int x, int y, RGBA v ); + + /*! + * Sets the value of a bitmap pixel. + * + * \param p A Point object whose coordinates identify the pixel to write. + * Pixel coordinates can vary in the range from (0,0) to + * (Width()-1, Height()-1). + * + * \param v 32-bit pixel value encoded in the AARRGGBB format: AA is the + * alpha (transparency) value, RR is the red component, GG is + * green and BB is blue. Each element is an 8-bit value. + * + * \ingroup bitmap_pixel_access + */ + void SetPixel( const pcl::Point& p, RGBA v ) + { + SetPixel( p.x, p.y, v ); + } + + /*! + * Returns the (constant) starting address of a row of pixels in this + * bitmap. + * + * \param y Vertical coordinate of the row of pixels. Vertical + * coordinates can vary in the range from 0 to Height()-1. + * + * \ingroup bitmap_pixel_access + */ + const RGBA* ScanLine( int y ) const; + + /*! + * Returns the starting address of a row of pixels in this bitmap. + * + * \param y Vertical coordinate of the row of pixels. Vertical + * coordinates can vary in the range from 0 to Height()-1. + * + * The returned address can be used to modify pixel values. + * + * \ingroup bitmap_pixel_access + */ + RGBA* ScanLine( int y ); + + /*! + * \defgroup bitmap_specular_transformations Bitmap Specular Transformations + */ + + /*! + * Returns a mirrored duplicate of this bitmap. The original (this) bitmap + * is not modified. + * + * \ingroup bitmap_specular_transformations + */ + Bitmap Mirrored() const; + + /*! + * Returns a duplicate of this bitmap, mirrored horizontally. The original + * (this) bitmap is not modified. + * + * \ingroup bitmap_specular_transformations + */ + Bitmap MirroredHorizontally() const; + + /*! + * Returns a duplicate of this bitmap, mirrored vertically. The original + * (this) bitmap is not modified. + * + * \ingroup bitmap_specular_transformations + */ + Bitmap MirroredVertically() const; + + /*! + * \defgroup bitmap_affine_transformations Bitmap Affine Transformations + */ + + /*! + * Returns a scaled duplicate of this bitmap. + * + * \param sx,sy Scaling factors in the X and Y axes. + * + * \param precise If this parameter is true, the scaled bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap Scaled( double sx, double sy, bool precise = true ) const; + + /*! + * Returns a scaled duplicate of this bitmap. + * + * \param sxy Scaling factor applied to both X and Y axes. + * + * \param precise If this parameter is true, the scaled bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap Scaled( double sxy, bool precise = true ) const; + + /*! + * Returns a scaled duplicate of this bitmap, with its width equal to a + * prescribed value in pixels. + * + * \param width Width in pixels of the returned bitmap. If this parameter + * is zero, an empty bitmap will be returned. + * + * \param precise If this parameter is true, the scaled bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap ScaledToWidth( int width, bool precise = true ) const; + + /*! + * Returns a scaled duplicate of this bitmap, with its height equal to a + * prescribed value in pixels. + * + * \param height Height in pixels of the returned bitmap. If this parameter + * is zero, an empty bitmap will be returned. + * + * \param precise If this parameter is true, the scaled bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap ScaledToHeight( int height, bool precise = true ) const; + + /*! + * Returns a scaled duplicate of this bitmap, with its width and height + * equal to prescribed values in pixels. + * + * \param width, height Width and height in pixels of the returned + * bitmap. If one or both of these parameters are zero, an + * empty bitmap will be returned. + * + * \param precise If this parameter is true, the scaled bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap ScaledToSize( int width, int height, bool precise = true ) const; + + /*! + * Returns a rotated duplicate of this bitmap. + * + * \param angle %Rotation angle in radians. + * + * \param precise If this parameter is true, the rotated bitmap will be + * generated using a precise, smooth interpolation algorithm. + * This parameter is true by default. + * + * \ingroup bitmap_affine_transformations + */ + Bitmap Rotated( double angle, bool precise = true ) const; + + /*! + * \defgroup bitmap_file_io Bitmap File I/O Routines + */ + + /*! + * Loads a disk image file in this bitmap. + * + * \param filePath %File path to the input image file. + * + * The input file format is always determined by the specified file + * extension (in \a filePath). Supported input formats: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
%BMP Windows %Bitmap (.bmp)
%GIF %Graphics Interchange Format (.gif) (read-only)
%ICO Windows %Icon Format (.ico)
%JPEG Joint Photographic Experts Group (.jpg, .jpeg)
%WEBP %WebP image format (.webp)
%MNG Multiple Network %Graphics (.mng) (read-only)
%PBM Portable BitMap (.pbm) (read-only)
%PNG Portable Network %Graphics (.png)
%PPM Portable Pixel Map (.ppm)
%SVG Scalable Vector Graphics (.svg) (read-only)
%TIFF Tagged %Image %File Format (.tif, .tiff).
%TGA Truevision TGA Format (TARGA) (.tga, .tpic).
%XBM X BitMap (.xbm)
%XPM X PixMap (.xpm)
+ * + * In the even of file I/O error, or if the specified file cannot be decoded + * and loaded correctly, this member function throws an Error exception. + * + * \ingroup bitmap_file_io + */ + void Load( const String& filePath ); + + /*! + * Saves this bitmap to a disk image file. + * + * \param filePath %File path to the output image file. + * + * \param quality Image quality for lossy compression in the range from 0 + * (lowest quality) to 100 (highest quality). Currently, this + * parameter is ignored if the output file is not in one of the + * %JPEG or %WebP formats. If this parameter is < 0, a default, + * format-dependent quality will be used. + * + * The output file format is always determined by the specified file + * extension (in \a filePath). Supported output formats include: + * + * + * + * + * + * + * + * + * + * + * + *
%BMP Windows %Bitmap (.bmp)
%ICO Windows %Icon Format (.ico)
%JPEG Joint Photographic Experts Group (.jpg, .jpeg)
%WEBP %WebP image format (.webp)
%PNG Portable Network %Graphics (.png)
%PPM Portable Pixel Map (.ppm)
%TIFF Tagged %Image %File Format (.tif, .tiff).
%XBM X BitMap (.xbm)
%XPM X PixMap (.xpm)
+ * + * In the even of file I/O error, or if the specified file cannot be encoded + * and written correctly, this member function throws an Error exception. + * + * \ingroup bitmap_file_io + */ + void Save( const String& filePath, int quality = -1 ) const; + + /*! + * Loads this bitmap from data stored in memory. + * + * \param data Starting address of the source bitmap data block. + * + * \param size Length of the source data in bytes. + * + * \param format A nul-terminated character string identifying the format + * of the source data. Currently the only supported format is + * Scalable Vector Graphics (SVG), and this is also the + * default value of this parameter ("SVG"). + * + * \param flags Currently not used. This parameter is reserved for future + * extension and its value must be zero (the default value). + * + * If the \a data address is invalid, or if the data are not valid in the + * specified \a format, this member function throws an Error exception. + */ + void Load( const void* data, size_type size, const char* format = "SVG", uint32 flags = 0 ); + + /*! + * Returns a subimage of this bitmap. + * + * \param x0, y0 Coordinates of the upper left corner of the source + * rectangular region. + * + * \param x1, y1 Coordinates of the lower right corner of the source + * rectangular region. + * + * The rectangular region defines the size and position of the subimage that + * is extracted and returned as a new %Bitmap object. + */ + Bitmap Subimage( int x0, int y0, int x1, int y1 ) const; + + /*! + * Returns a subimage of this bitmap. + * + * \param r A Rect object defining subimage boundaries. + * + * The rectangular area defines the size and position of the subimage that + * is extracted and returned as a new %Bitmap object. + */ + Bitmap Subimage( const pcl::Rect& r ) const + { + return Subimage( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * \defgroup bitmap_bitwise_ops Bitmap Bitwise Logical Operations + */ + + /*! + * Copies a region of a source bitmap to the specified location on this + * bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap, whose pixels will be copied to this bitmap. + * + * \param r Defines the rectangular area that will be copied, in source + * bitmap coordinates. + * + * Target pixels on this bitmap are replaced with pixels read from the + * source bitmap \a src. Source pixels falling outside the boundaries of + * this bitmap are ignored. + * + * \ingroup bitmap_bitwise_ops + */ + void Copy( const pcl::Point& p, const Bitmap& src, const pcl::Rect& r ); + + /*! + * Copies all pixels from a source bitmap to the specified location on this + * bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap, whose pixels will be copied to this bitmap. + * + * Target pixels on this bitmap are replaced with pixels read from the + * source bitmap \a src. Source pixels falling outside the boundaries of + * this bitmap are ignored. + * + * This function is equivalent to: + * + * Copy( p, src, src.Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void Copy( const pcl::Point& p, const Bitmap& src ) + { + Copy( p, src, src.Bounds() ); + } + + /*! + * Copies all pixels from a source bitmap to this bitmap. + * + * \param src Source bitmap, whose pixels will be copied to this bitmap. + * + * Target pixels on this bitmap are replaced with pixels read from the + * source bitmap \a src. Pixels are copied at the upper left corner of this + * image (0,0). Source pixels falling outside the boundaries of this bitmap + * are ignored. + * + * This function is equivalent to: + * + * Copy( pcl::Point( 0, 0 ), src ); + * + * \ingroup bitmap_bitwise_ops + */ + void Copy( const Bitmap& src ) + { + Copy( pcl::Point( 0 ), src ); + } + + /*! + * Fills a rectangular region of this bitmap with a constant value. + * + * \param rect Rectangular region to be filled. + * \param fillWith Pixel value to fill with. + * + * \ingroup bitmap_bitwise_ops + */ + void Fill( const pcl::Rect& rect, RGBA fillWith ); + + /*! + * Fills the entire bitmap with a constant value \a fillWith. This + * function is equivalent to: + * + * Fill( Bounds(), fillWith ); + * + * \ingroup bitmap_bitwise_ops + */ + void Fill( RGBA fillWith ) + { + Fill( Bounds(), fillWith ); + } + + /*! + * Replaces each pixel in a rectangular region of this bitmap with the + * result of the bitwise inclusive OR operation between its current value + * and a specified constant value. + * + * \param rect Rectangular region to be operated. + * \param orWith Value to be ORed with current pixel values. + * + * \ingroup bitmap_bitwise_ops + */ + void Or( const pcl::Rect& rect, RGBA orWith ); + + /*! + * Replaces each pixel in this bitmap with the result of the bitwise + * inclusive OR operation between its current value and a specified constant + * value \a andWith. + * + * This function is equivalent to: + * + * Or( Bounds(), orWith ); + * + * \ingroup bitmap_bitwise_ops + */ + void Or( RGBA orWith ) + { + Or( Bounds(), orWith ); + } + + /*! + * Replaces a rectangular region of this bitmap with the bitwise inclusive + * OR operation between its current pixel values and the pixels of a + * corresponding region of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be ORed with this bitmap. + * + * \param r Defines the rectangular area that will be operated, in source + * bitmap coordinates. + * + * Target pixels on this bitmap are replaced with the result of the bitwise + * OR operation with the corresponding pixels read from the source bitmap + * \a src. Source pixels falling outside the boundaries of this bitmap are + * ignored. + * + * \ingroup bitmap_bitwise_ops + */ + void Or( const pcl::Point& p, const Bitmap& src, const pcl::Rect& r ); + + /*! + * Replaces a rectangular region of this bitmap with the bitwise inclusive + * OR operation between its current pixel values and the corresponding + * pixels of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be ORed with this bitmap. + * + * Target pixels on this bitmap are replaced with the result of the bitwise + * OR operation with the corresponding pixels read from the source bitmap + * \a src. Source pixels falling outside the boundaries of this bitmap are + * ignored. + * + * This function is equivalent to: + * + * Or( p, src, src.Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void Or( const pcl::Point& p, const Bitmap& src ) + { + Or( p, src, src.Bounds() ); + } + + /*! + * Replaces all pixels in this bitmap with the bitwise inclusive OR + * operation between their current values and the pixels of a source bitmap + * \a src. This function is equivalent to: + * + * Or( Point( 0, 0 ), src ); + * + * \ingroup bitmap_bitwise_ops + */ + void Or( const Bitmap& src ) + { + Or( pcl::Point( 0 ), src ); + } + + /*! + * Replaces each pixel in a rectangular region of this bitmap with the + * result of the bitwise AND operation between its current value and a + * specified constant value. + * + * \param rect Rectangular region to be operated. + * \param andWith Value to be ANDed with current pixel values. + * + * \ingroup bitmap_bitwise_ops + */ + void And( const pcl::Rect& rect, RGBA andWith ); + + /*! + * Replaces each pixel in this bitmap with the result of the bitwise + * AND operation between its current value and a specified constant value + * \a andWith. + * + * This function is equivalent to: + * + * And( Bounds(), andWith ); + * + * \ingroup bitmap_bitwise_ops + */ + void And( RGBA andWith ) + { + And( Bounds(), andWith ); + } + + /*! + * Replaces a rectangular region of this bitmap with the bitwise AND + * operation between its current pixel values and the pixels of a + * corresponding region of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be ANDed with this bitmap. + * + * \param r Defines the rectangular area that will be operated, in source + * bitmap coordinates. + * + * Target pixels on this bitmap are replaced with the result of the bitwise + * AND operation with the corresponding pixels read from the source bitmap + * \a src. Source pixels falling outside the boundaries of this bitmap are + * ignored. + * + * \ingroup bitmap_bitwise_ops + */ + void And( const pcl::Point& p, const Bitmap& src, const pcl::Rect& r ); + + /*! + * Replaces a rectangular region of this bitmap with the bitwise AND + * operation between its current pixel values and the corresponding pixels + * of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be ANDed with this bitmap. + * + * Target pixels on this bitmap are replaced with the result of the bitwise + * AND operation with the corresponding pixels read from the source bitmap + * \a src. Source pixels falling outside the boundaries of this bitmap are + * ignored. + * + * This function is equivalent to: + * + * And( p, src, src.Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void And( const pcl::Point& p, const Bitmap& src ) + { + And( p, src, src.Bounds() ); + } + + /*! + * Replaces all pixels in this bitmap with the bitwise AND operation between + * their current values and the pixels of a source bitmap \a src. This + * function is equivalent to: + * + * And( Point( 0, 0 ), src ); + * + * \ingroup bitmap_bitwise_ops + */ + void And( const Bitmap& src ) + { + And( pcl::Point( 0 ), src ); + } + + /*! + * Replaces each pixel in a rectangular region of this bitmap with the + * result of the bitwise exclusive OR (XOR) operation between its current + * value and a specified constant value. + * + * \param rect Rectangular region to be operated. + * \param xorWith Value to be XORed with current pixel values. + * + * \ingroup bitmap_bitwise_ops + */ + void Xor( const pcl::Rect& rect, RGBA xorWith ); + + /*! + * Replaces each pixel in this bitmap with the result of the bitwise + * exclusive OR (XOR) operation between its current value and a specified + * constant value \a xorWith. + * + * This function is equivalent to: + * + * Xor( Bounds(), xorWith ); + * + * \ingroup bitmap_bitwise_ops + */ + void Xor( RGBA xorWith ) + { + Xor( Bounds(), xorWith ); + } + + /*! + * Replaces a rectangular region of this bitmap with the bitwise exclusive + * OR (XOR) operation between its current pixel values and the pixels of a + * corresponding region of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be XORed with this bitmap. + * + * \param r Defines the rectangular area that will be operated, in source + * bitmap coordinates. + * + * Target pixels on this bitmap are replaced with the result of the XOR + * operation with the corresponding pixels read from the source bitmap + * \a src. Source pixels falling outside the boundaries of this bitmap are + * ignored. + * + * \ingroup bitmap_bitwise_ops + */ + void Xor( const pcl::Point& p, const Bitmap& src, const pcl::Rect& r ); + + /*! + * Replaces a rectangular region of this bitmap with the bitwise exclusive + * OR (XOR) operation between its current pixel values and the corresponding + * pixels of a source bitmap. + * + * \param p Position of the upper left corner of the target rectangle on + * this bitmap. + * + * \param src Source bitmap whose pixels will be XORed with this bitmap. + * + * Target pixels on this bitmap are replaced with the result of the + * exclusive OR (XOR) operation with the corresponding pixels read from the + * source bitmap \a src. Source pixels falling outside the boundaries of + * this bitmap are ignored. + * + * This function is equivalent to: + * + * Xor( p, src, src.Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void Xor( const pcl::Point& p, const Bitmap& src ) + { + Xor( p, src, src.Bounds() ); + } + + /*! + * Replaces all pixels in this bitmap with the bitwise exclusive OR (XOR) + * operation between their current values and the pixels of a source bitmap + * \a src. This function is equivalent to: + * + * Xor( Point( 0, 0 ), src ); + * + * \ingroup bitmap_bitwise_ops + */ + void Xor( const Bitmap& src ) + { + Xor( pcl::Point( 0 ), src ); + } + + /*! + * Replaces the pixels pertaining to a rectangle defined on this bitmap with + * the bitwise exclusive OR (XOR) operation between their current values and + * a specified constant value. + * + * \param rect Rectangle that will be operated. + * + * \param xorWith Value to be XORed with current pixel values. + * + * This function does not operate on a rectangular region; only the \e sides + * of the specified rectangle are XORed: two one-pixel columns and two + * one-pixel rows. + * + * \ingroup bitmap_bitwise_ops + */ + void XorRect( const pcl::Rect& rect, RGBA xorWith ); + + /*! + * Replaces the pixels pertaining to the bounding rectangle of this bitmap + * with the bitwise exclusive OR (XOR) operation between their current + * values and a specified constant value. + * + * \param xorWith Value to be XORed with current pixel values. + * + * This function is equivalent to: + * + * XorRect( Bounds(), xorWith ); + * + * \ingroup bitmap_bitwise_ops + */ + void XorRect( RGBA xorWith ) + { + XorRect( Bounds(), xorWith ); + } + + /*! + * Inverts a rectangular region of this bitmap. + * + * \param rect Rectangular region to be inverted. + * + * This function does not invert alpha pixel components, but just color + * components. It is equivalent to: + * + * Xor( rect, 0x00ffffff ); + * + * \ingroup bitmap_bitwise_ops + */ + void Invert( const pcl::Rect& rect ) + { + Xor( rect, 0x00ffffff ); + } + + /*! + * Inverts all pixels of this bitmap. + * + * This function does not invert alpha pixel components, but just color + * components. It is equivalent to: + * + * Invert( Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void Invert() + { + Invert( Bounds() ); + } + + /*! + * Inverts the pixels pertaining to a rectangle \a rect defined on this + * bitmap. + * + * This function does not invert alpha pixel components, but just color + * components. It is equivalent to: + * + * XorRect( rect, 0x00ffffff ); + * + * \ingroup bitmap_bitwise_ops + */ + void InvertRect( const pcl::Rect& rect ) + { + XorRect( rect, 0x00ffffff ); + } + + /*! + * Inverts the pixels pertaining to the bounding rectangle of this bitmap. + * + * This function does not invert alpha pixel components, but just color + * components. It is equivalent to: + * + * InvertRect( Bounds() ); + * + * \ingroup bitmap_bitwise_ops + */ + void InvertRect() + { + InvertRect( Bounds() ); + } + + /*! + * \defgroup bitmap_color_replacement Bitmap Color Replacement Functions + */ + + /*! + * Replaces all occurrences of a specified pixel value in a rectangular + * region of this bitmap with a new value. + * + * \param rect Rectangular region. + * \param replaceThis Pixel value to be replaced. + * \param replaceWith New pixel value for replacement. + * + * \ingroup bitmap_color_replacement + */ + void ReplaceColor( const pcl::Rect& rect, RGBA replaceThis, RGBA replaceWith ); + + /*! + * Replaces all occurrences of a specified pixel value in this bitmap with a + * new value. + * + * \param replaceThis Pixel value to be replaced. + * \param replaceWith New pixel value for replacement. + * + * This function is equivalent to: + * + * ReplaceColor( Bounds(), replaceThis, replaceWith ); + * + * \ingroup bitmap_color_replacement + */ + void ReplaceColor( RGBA replaceThis, RGBA replaceWith ) + { + ReplaceColor( Bounds(), replaceThis, replaceWith ); + } + + /*! + * Replaces the alpha (transparency) components of all pixels in a + * rectangular region of this bitmap with a new alpha value. + * + * \param rect Rectangular region. + * \param newAlpha New alpha (transparency) value in the range [0,255]. + * + * \ingroup bitmap_color_replacement + */ + void SetAlpha( const pcl::Rect& rect, uint8 newAlpha ); + + /*! + * Replaces the alpha (transparency) components of all pixels in this bitmap + * with a new alpha value. + * + * \param newAlpha New alpha (transparency) value in the range [0,255]. + * + * This function is equivalent to: + * + * SetAlpha( Bounds(), newAlpha ); + * + * \ingroup bitmap_color_replacement + */ + void SetAlpha( uint8 newAlpha ) + { + SetAlpha( Bounds(), newAlpha ); + } + + /*! + * Returns the ratio between output device pixels and pixels of this + * device-independent bitmap. See the SetPhysicalPixelRatio() member + * function for a detailed description. + * + * \ingroup ui_scaling_functions + * \sa SetPhysicalPixelRatio() + */ + double PhysicalPixelRatio() const; + + /*! + * Sets the ratio between output device pixels and pixels of this + * device-independent bitmap. This ratio is used as a scaling factor by + * core bitmap rendering routines to reproduce bitmaps on high-dpi screens + * and other high-density graphics output devices. + * + * The specified \e ratio must be greater than or equal to one. On macOS + * with Retina monitors working in high-dpi modes, this function can be used + * to ensure that a bitmap will be reproduced as a high-resolution image by + * setting its output pixel ratio to 2.0. In such case the bitmap will be + * drawn on the screen with one half its actual pixel dimensions in logical + * pixels, using the native physical monitor resoluton. On other platforms + * such as X11 (Linux and FreeBSD) and Windows, where no automatic display + * scaling is performed, the physical pixel ratio of a bitmap is ignored. + * + * \ingroup ui_scaling_functions + * \sa PhysicalPixelRatio() + */ + void SetPhysicalPixelRatio( double ratio ); + + /*! + * Renders an SVG document file as a raster image into a new %Bitmap object. + * + * \param filePath Path to an existing file in the local file system, + * which must store a valid SVG document representing the + * image to be rendered. The SVG source code must be + * encoded in UTF-8. + * + * \param width,height The width and height in pixels of the image where + * the SVG rendition will be generated. If a dimension is + * ≤ 0, the rendition will use the corresponding + * dimension specified by the SVG document: either viewBox + * coordinates, if available, or the width and height + * attributes of the root svg element. + * + * \param options Rendering options. See the SVGRenderOption namespace + * for possible values. + * + * Automatic Resource Location + * + * This function can load SVG documents from arbitrary locations on the + * local file system. However, modules typically install their process and + * interface icons on the /rsc/icons/module directory under the local + * PixInsight installation. A module can specify the "@module_icons_dir/" + * prefix in the \a filePath argument to this function to let the PixInsight + * core application load the corresponding SVG document from the appropriate + * standard distribution directory automatically. For example, suppose that + * this function is invoked by a "Foo" module as follows: + * + * \code + * Bitmap RenderSpecialIcon() + * { + * return Bitmap::FromSVGFile( "@module_icons_dir/special/icon.svg" ); + * } + * \endcode + * + * Then the core application will attempt to load the following SVG file: + * + * <install-dir>/rsc/icons/module/Foo/special/icon.svg + * + * where <install-dir> is the local directory where the running + * PixInsight core application is installed. + * + * \sa FromSVG() + */ + static Bitmap FromSVGFile( const String& filePath, int width = 0, int height = 0, + SVGRenderOptions options = SVGRenderOption::Default ); + + /*! + * Renders an SVG document as a raster image into a new %Bitmap object. + * + * \param filePath The source code of a valid SVG document representing + * the image to be rendered, encoded in UTF-8. + * + * \param width,height The width and height in pixels of the image where + * the SVG rendition will be generated. If a dimension is + * ≤ 0, the rendition will use the corresponding + * dimension specified by the SVG document: either viewBox + * coordinates, if available, or the width and height + * attributes of the root svg element. + * + * \param options Rendering options. See the SVGRenderOption namespace + * for possible values. + * + * \sa FromSVGFile() + */ + static Bitmap FromSVG( const IsoString& svgSource, int width = 0, int height = 0, + SVGRenderOptions options = SVGRenderOption::Default ); + +private: + + Bitmap( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class GraphicsContextBase; + friend class Graphics; + friend class VectorGraphics; + friend class Action; + friend class Brush; + friend class Cursor; + friend class Button; + friend class PushButton; + friend class ToolButton; + friend class BitmapBox; + friend class TabBox; + friend class ComboBox; + friend class TreeBox; + friend class ImageView; + friend class ImageWindow; + friend class Process; + friend class FileFormat; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Bitmap_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Bitmap.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/BitmapBox.h b/3rdparty/include/pcl/BitmapBox.h new file mode 100644 index 0000000..c2e83fa --- /dev/null +++ b/3rdparty/include/pcl/BitmapBox.h @@ -0,0 +1,156 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/BitmapBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BitmapBox_h +#define __PCL_BitmapBox_h + +/// \file pcl/BitmapBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class BitmapBox + * \brief Client-side interface to a PixInsight %BitmapBox control. + * + * ### TODO: Write a detailed description for %BitmapBox + */ +class PCL_CLASS BitmapBox : public Frame +{ +public: + + /*! + * Constructs a %BitmapBox control that draws a bitmap \a bmp and is a child + * of \a parent. + */ + BitmapBox( const Bitmap& bmp = Bitmap::Null(), Control& parent = Control::Null() ); + + /*! + * Destroys a %BitmapBox object. + */ + virtual ~BitmapBox() + { + } + + /*! + * Returns the bitmap currently drawn by this %BitmapBox control. + */ + Bitmap CurrentBitmap() const; + + /*! + * Sets the bitmap \a bmp for this %BitmapBox control. + */ + void SetBitmap( const Bitmap& bmp ); + + /*! + * Removes the bitmap in this %BitmapBox control. Does not destroy the + * bitmap (unless it becomes unreferenced); only disassociates it from this + * %BitmapBox control. + */ + void Clear() + { + SetBitmap( Bitmap::Null() ); + } + + /*! + * Returns the margin in pixels that this %BitmapBox control reserves around + * its bitmap. + */ + int Margin() const; + + /*! + * Sets a new margin \a m in pixels for this %BitmapBox control. + */ + void SetMargin( int m ); + + /*! + * Sets the margin of this %BitmapBox control to zero pixels. + */ + void ClearMargin() + { + SetMargin( 0 ); + } + + /*! # + */ + bool IsAutoFitEnabled() const; + + /*! # + */ + void EnableAutoFit( bool = true ); + + /*! # + */ + void DisableAutoFit( bool disable = true ) + { + EnableAutoFit( !disable ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_BitmapBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/BitmapBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Brush.h b/3rdparty/include/pcl/Brush.h new file mode 100644 index 0000000..2591e29 --- /dev/null +++ b/3rdparty/include/pcl/Brush.h @@ -0,0 +1,820 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Brush.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Brush_h +#define __PCL_Brush_h + +/// \file pcl/Brush.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::BrushStyle + * \brief Supported brush styles. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
BrushStyle::Empty Empty brush (transparent brush)
BrushStyle::Solid Solid brush
BrushStyle::Dense Dense pattern brush
BrushStyle::HalfTone 50% pattern brush
BrushStyle::Sparse Sparse pattern brush
BrushStyle::HorzizontalHatch -----
BrushStyle::VerticalHatch |||||
BrushStyle::CrossHatch +++++
BrushStyle::ForwardDiagonalHatch /////
BrushStyle::BackwardDiagonalHatch\\\\\\\\\\
BrushStyle::CrossDiagonalHatch XXXXX
BrushStyle::Stipple Fill with a tiled Bitmap
BrushStyle::LinearGradient Fill with a linear gradient
BrushStyle::RadialGradient Fill with a radial gradient
BrushStyle::ConicalGradient Fill with a conical gradient
+ */ +namespace BrushStyle +{ + enum value_type + { + Empty, // empty brush (transparent brush) + Solid, // solid brush + Dense, // dense pattern brush + HalfTone, // 50% pattern brush + Sparse, // sparse pattern brush + HorzizontalHatch, // ----- + VerticalHatch, // ||||| + CrossHatch, // +++++ + ForwardDiagonalHatch, // ///// + BackwardDiagonalHatch, // \\\\\. <--- why this dot? :) + CrossDiagonalHatch, // XXXXX + Stipple, // fill with a tiled Bitmap + LinearGradient, // fill with a linear gradient + RadialGradient, // fill with a radial gradient + ConicalGradient, // fill with a conical gradient + + NumberOfBrushStyles + }; +} + +/*! + * \namespace pcl::GradientSpreadMode + * \brief Supported gradient spread modes. + * + * + * + * + * + *
GradientSpreadMode::Pad Areas outside the gradient are filled with the nearest (first or last) stop color.
GradientSpreadMode::Reflect Gradients are reflected outside gradient areas.
GradientSpreadMode::Repeat Gradients are repeated outside gradient areas.
+ */ +namespace GradientSpreadMode +{ + enum value_type + { + Pad, + Reflect, + Repeat, + + NumberOfGradientSpreadModes + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class PCL_CLASS Bitmap; + +// ---------------------------------------------------------------------------- + +/*! + * \class Brush + * \brief Client-side interface to a PixInsight %Brush object. + * + * ### TODO: Write a detailed description for %Brush. + * + * \sa GradientBrush, LinearGradientBrush, RadialGradientBrush, + * ConicalGradientBrush + */ +class PCL_CLASS Brush : public UIObject +{ +public: + + /*! + * Represents the brush style. + * Supported values are defined in the BrushStyle namespace. + */ + typedef BrushStyle::value_type style; + + /*! + * Constructs a brush with the specified \a color and \a style. + */ + Brush( RGBA color = 0xff000000, style = BrushStyle::Solid ); + + /*! + * Constructs a stippled brush with the specified bitmap pattern \a bmp. + */ + Brush( const Bitmap& bmp ); + + /*! + * Copy constructor. This object will reference the same server-side brush + * as the specified instance \a b. + */ + Brush( const Brush& b ) : UIObject( b ) + { + } + + /*! + * Move constructor. + */ + Brush( Brush&& x ) : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a %Brush object. If this object references an existing brush in + * the PixInsight core application, its reference count is decremented. If + * it becomes unreferenced, it will be garbage-collected. + */ + virtual ~Brush() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side brush as the specified + * instance \a b. If the previous brush becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + Brush& operator =( const Brush& b ) + { + Assign( b ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Brush& operator =( Brush&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null brush. A null %Brush object does + * not correspond to an existing brush object in the PixInsight core + * application. + */ + static Brush& Null(); + + /*! + * Returns the current color of this brush. + */ + RGBA Color() const; + + /*! + * Sets the color of this brush. + */ + void SetColor( RGBA ); + + /*! + * Returns the current style of this brush. + */ + style Style() const; + + /*! + * Returns true iff this brush is solid, i.e. if its current style is + * BrushStyle::Solid. + */ + bool IsSolid() const + { + return Style() == BrushStyle::Solid; + } + + /*! + * Returns true iff this brush is empty (or transparent), i.e. if its current + * style is BrushStyle::Empty. An empty brush produces transparent shapes. + */ + bool IsEmpty() const + { + return Style() == BrushStyle::Empty; + } + + /*! + * Returns true iff this brush is transparent. This function is a synonym + * for IsEmpty(). + */ + bool IsTransparent() const + { + return IsEmpty(); + } + + /*! + * Returns true iff this brush is \e stippled, i.e. if its current style is + * BrushStyle::Stippled. A stippled brush draws a regular pattern + * consisting of multiple, adjacent copies of a Bitmap image. + */ + bool IsStippled() const + { + return Style() == BrushStyle::Stipple; + } + + /*! + * Sets the style of this brush. + * + * Gradient styles (BrushStyle::LinearGradient, BrushStyle::RadialGradient + * and BrushStyle::ConicalGradient) cannot be set with this function, since + * gradient brushes are implemented as separate PCL classes + * (LinearGradientBrush, RadialGradientBrush and ConicalGradientBrush, + * respectively). + */ + void SetStyle( style ); + + /*! + * Returns the current \e stipple of this brush. If the current style of + * this brush is not BrushStyle::Stippled, a null Bitmap object is + * returned. + */ + Bitmap Stipple() const; + + /*! + * Sets the current \e stipple for this brush. This function implicitly + * forces the style of this brush to be BrushStyle::Stippled. + */ + void SetStipple( const Bitmap& ); + + /*! + * Returns true iff this object is a gradient brush. + */ + virtual bool IsGradient() const + { + return false; + } + +private: + + Brush( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class GraphicsContextBase; + friend class Graphics; + friend class VectorGraphics; + friend class GradientBrush; + friend class Pen; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GradientBrush + * \brief Base class of PCL gradient brushes. + * + * ### TODO: Write a detailed description for %GradientBrush. + * + * \sa Brush, LinearGradientBrush, RadialGradientBrush, ConicalGradientBrush + */ +class PCL_CLASS GradientBrush : public Brush +{ +public: + + /*! + * Represents a gradient spread mode. + * Supported values are defined in the GradientSpreadMode namespace. + */ + typedef GradientSpreadMode::value_type spread_mode; + + /*! \struct Stop + * \brief Gradient stop. + * + * A gradient brush interpolates color values from an ordered list of + * gradient stops. A gradient stop is formed by a position in the + * [0,1] range and a RGBA color value. + */ + struct Stop + { + double position = 0; //!< Stop position in the [0,1] range, where 0 and 1 correspond, respectively, to the starting and end locations of the gradient area. + RGBA color = 0xff000000; //!< Stop color encoded as a 32-bit AARRGGBB value. + + /*! + * Constructs a default gradient stop. + */ + Stop() = default; + + /*! + * Constructs a gradient stop at the specified position \a p with the + * color \a c. + */ + Stop( double p, RGBA c ) + : position( Range( p, 0.0, 1.0 ) ) + , color( c ) + { + } + + /*! + * Copy constructor. + */ + Stop( const Stop& ) = default; + + /*! + * Equality operator. Used to enforce ordering of gradient stop lists. + */ + bool operator ==( const Stop& x ) const + { + return position == x.position && color == x.color; + } + + /*! + * Less than relational operator. Used to enforce ordering of gradient + * stop lists. + * + * Gradient stop comparison is exclusively based on stop positions; stop + * colors are irrelevant for ordering. + */ + bool operator <( const Stop& x ) const + { + return position < x.position; // color is irrelevant to ordering of gradient stops + } + }; + + /*! + * Represents a list of gradient stops. + */ + typedef Array stop_list; + + /*! + * Returns the list of stops in this gradient brush. + */ + stop_list Stops() const; + + /*! + * Returns the current gradient spread mode for this gradient brush. + */ + spread_mode SpreadMode() const; + + /*! + */ + bool IsGradient() const override + { + return true; + } + +protected: + + GradientBrush( void* h ) : Brush( h ) + { + } + + GradientBrush( const GradientBrush& x ) : Brush( x ) + { + } + + GradientBrush( GradientBrush&& x ) : Brush( std::move( x ) ) + { + } +}; + +/*! + * \class LinearGradientBrush + * \brief Linear gradient brush. + * + * ### TODO: Write a detailed description for %LinearGradientBrush. + * + * \sa Brush, GradientBrush, RadialGradientBrush, ConicalGradientBrush + */ +class PCL_CLASS LinearGradientBrush : public GradientBrush +{ +public: + + /*! + * Represents a gradient spread mode. + * Supported values are defined in the GradientSpreadMode namespace. + */ + typedef GradientBrush::spread_mode spread_mode; + + /*! + * Represents a list of gradient stops. + */ + typedef GradientBrush::stop_list stop_list; + + /*! + * Constructs a %LinearGradientBrush object. + * + * \param x1,y1 Coordinates of the gradient's starting point. + * + * \param x2,y2 Coordinates of the gradient's end point. + * + * \param stops Reference to a list of gradient stops. If an empty list is + * specified (as by default), two stops will be generated + * automatically: {0.0,0x00000000} and {1.0,0xFF000000}. + * + * \param spread Gradient spread mode. Supported spread modes are defined + * in the GradientSpreadMode namespace. The default is + * GradientSpreadMode::Pad. + */ + LinearGradientBrush( double x1, double y1, double x2, double y2, + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Constructs a %LinearGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the linear gradient parameters are + * specified as a rectangle \a r using floating point coordinates. + */ + LinearGradientBrush( const DRect& r, + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Constructs a %LinearGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the linear gradient parameters are + * specified as a rectangle \a r using integer coordinates. + */ + LinearGradientBrush( const Rect& r, + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Copy constructor. This object will reference the same server-side brush + * as the specified instance \a b. + */ + LinearGradientBrush( const LinearGradientBrush& b ) + : GradientBrush( b ) + { + } + + /*! + * Move constructor. + */ + LinearGradientBrush( LinearGradientBrush&& x ) + : GradientBrush( std::move( x ) ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side brush as the specified + * instance \a b. If the previous brush becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + LinearGradientBrush& operator =( const LinearGradientBrush& b ) + { + SetHandle( b.handle ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + LinearGradientBrush& operator =( LinearGradientBrush&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Retrieves the linear gradient parameters of this object. + * + * \param[out] x1,y1 Coordinates of the gradient's starting point. + * \param[out] x2,y2 Coordinates of the gradient's end point. + * + * \sa Parameters() + */ + void GetParameters( double& x1, double& y1, double& x2, double& y2 ) const; + + /*! + * Returns the linear gradient parameters of this object as a DRect + * object. + * + * \sa GetParameters( double&, double&, double&, double& ) + */ + DRect Parameters() const + { + DRect r; + GetParameters( r.x0, r.y0, r.x1, r.y1 ); + return r; + } +}; + +/*! + * \class RadialGradientBrush + * \brief Radial gradient brush. + * + * ### TODO: Write a detailed description for %RadialGradientBrush. + * + * \sa Brush, GradientBrush, LinearGradientBrush, ConicalGradientBrush + */ +class PCL_CLASS RadialGradientBrush : public GradientBrush +{ +public: + + /*! + * Represents a gradient spread mode. + * Supported values are defined in the GradientSpreadMode namespace. + */ + typedef GradientBrush::spread_mode spread_mode; + + /*! + * Represents a list of gradient stops. + */ + typedef GradientBrush::stop_list stop_list; + + /*! + * Constructs a %RadialGradientBrush object. + * + * \param cx,cy Coordinates of the gradient's center. + * + * \param r Gradient's radius. + * + * \param fx,fy Coordinates of the gradient's focal point. If these + * coordinates are not specified, they will be set at + * the specified gradient's center point. + * + * \param stops Reference to a list of gradient stops. If an empty list is + * specified (as by default), two stops will be generated + * automatically: {0.0,0x00000000} and {1.0,0xFF000000}. + * + * \param spread Gradient spread mode. Supported spread modes are defined + * in the GradientSpreadMode namespace. The default is + * GradientSpreadMode::Pad. + */ + RadialGradientBrush( double cx, double cy, double r, double fx = uint32_max, double fy = uint32_max, + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Constructs a %RadialGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the radial gradient parameters are + * specified as a center point \a c, radius \a r and focal point \a f. + */ + RadialGradientBrush( const DPoint& c, double r, const DPoint& f = DPoint( uint32_max ), + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Constructs a %RadialGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the radial gradient parameters are + * specified as a center point \a c, radius \a r and focal point \a f. + */ + RadialGradientBrush( const Point& c, double r, const Point& f = Point( uint32_max ), + const stop_list& stops = stop_list(), + spread_mode spread = GradientSpreadMode::Pad ); + + /*! + * Copy constructor. This object will reference the same server-side brush + * as the specified instance \a b. + */ + RadialGradientBrush( const RadialGradientBrush& b ) + : GradientBrush( b ) + { + } + + /*! + * Move constructor. + */ + RadialGradientBrush( RadialGradientBrush&& x ) + : GradientBrush( std::move( x ) ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side brush as the specified + * instance \a b. If the previous brush becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + RadialGradientBrush& operator =( const RadialGradientBrush& b ) + { + SetHandle( b.handle ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + RadialGradientBrush& operator =( RadialGradientBrush&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Retrieves the radial gradient parameters of this object. + * + * \param[out] cx,cy Coordinates of the gradient's center. + * \param[out] r Gradient's radius. + * \param[out] fx,fy Coordinates of the gradient's focal point. + * + * \sa GetParameters( DPoint&, double&, DPoint& ) + */ + void GetParameters( double& cx, double& cy, double& r, double& fx, double& fy ) const; + + /*! + * Returns the radial gradient parameters of this object. + * + * This is an overloaded function, provided for convenience. It behaves like + * the preceding function, except the center and focal point parameters are + * retrieved as DPoint objects. + * + * \sa GetParameters( double&, double&, double&, double&, double& ) + */ + void GetParameters( DPoint& c, double& r, DPoint& f ) const + { + GetParameters( c.x, c.y, r, f.x, f.y ); + } +}; + +/*! + * \class ConicalGradientBrush + * \brief Conical gradient brush. + * + * ### TODO: Write a detailed description for %ConicalGradientBrush. + * + * \sa Brush, GradientBrush, LinearGradientBrush, RadialGradientBrush + */ +class PCL_CLASS ConicalGradientBrush : public GradientBrush +{ +public: + + /*! + * Represents a list of gradient stops. + */ + typedef GradientBrush::stop_list stop_list; + + /*! + * Constructs a %ConicalGradientBrush object. + * + * \param cx,cy Coordinates of the gradient's center. + * + * \param a Gradient's angle in radians. + * + * \param stops Reference to a list of gradient stops. If an empty list is + * specified (as by default), two stops will be generated + * automatically: {0.0,0x00000000} and {1.0,0xFF000000}. + */ + ConicalGradientBrush( double cx, double cy, double a, const stop_list& stops = stop_list() ); + + /*! + * Constructs a %ConicalGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the conical gradient parameters + * specified as a center point \a c and angle \a a in radians. + */ + ConicalGradientBrush( const DPoint& c, double a, const stop_list& stops = stop_list() ); + + /*! + * Constructs a %ConicalGradientBrush object. + * + * This is an overloaded constructor, provided for convenience. It behaves + * like the preceding constructor, except the conical gradient parameters + * specified as a center point \a c and angle \a a in radians. + */ + ConicalGradientBrush( const Point& c, double a, const stop_list& stops = stop_list() ); + + /*! + * Copy constructor. This object will reference the same server-side brush + * as the specified instance \a b. + */ + ConicalGradientBrush( const ConicalGradientBrush& b ) + : GradientBrush( b ) + { + } + + /*! + * Move constructor. + */ + ConicalGradientBrush( ConicalGradientBrush&& x ) + : GradientBrush( std::move( x ) ) + { + } + + /*! + * Assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side brush as the specified + * instance \a b. If the previous brush becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + ConicalGradientBrush& operator =( const ConicalGradientBrush& b ) + { + SetHandle( b.handle ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ConicalGradientBrush& operator =( ConicalGradientBrush&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Retrieves the conical gradient parameters of this object. + * + * \param[out] cx,cy Coordinates of the gradient's center. + * \param[out] a Gradient's angle in radians. + * + * \sa GetParameters( DPoint&, double& ) + */ + void GetParameters( double& cx, double& cy, double& a ) const; + + /*! + * Returns the conical gradient parameters of this object. + * + * This is an overloaded function, provided for convenience. It behaves like + * the preceding function, except the center coordinates are retrieved as a + * DPoint object. + * + * \sa GetParameters( double&, double&, double& ) + */ + void GetParameters( DPoint& c, double& a ) const + { + GetParameters( c.x, c.y, a ); + } +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Brush_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Brush.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Button.h b/3rdparty/include/pcl/Button.h new file mode 100644 index 0000000..6c98d59 --- /dev/null +++ b/3rdparty/include/pcl/Button.h @@ -0,0 +1,430 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Button.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Button_h +#define __PCL_Button_h + +/// \file pcl/Button.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::CheckState + * \brief Button check states + * + * + * + * + * + *
CheckState::Unchecked The control is not checked
CheckState::Checked The control is checked
CheckState::ThirdState The check box is in its 'third state'
+ * + */ +namespace CheckState +{ + enum value_type + { + Unchecked, // the item is not checked + Checked, // the item is checked + ThirdState // the check box is in its 'third state' + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Button + * \brief Abstract base class for all client-side interfaces to PixInsight + * button controls. + * + * ### TODO: Write a detailed description for Button + */ +class PCL_CLASS Button : public Control +{ +public: + + /*! + * Represents a button check state. Supported values are defined in the + * CheckState namespace. + */ + typedef CheckState::value_type check_state; + + /*! + * Destroys a %Button control. + */ + virtual ~Button() + { + } + + /*! + * Returns the current button text. + */ + String Text() const; + + /*! + * Sets the current button text. + */ + void SetText( const String& ); + + /*! + * Returns the current icon shown by this button, or a null Bitmap object if + * this button has no associated icon. + */ + Bitmap Icon() const; + + /*! + * Sets the icon shown by this button. If a null Bitmap object is specified, + * no icon will be associated with this button. + */ + void SetIcon( const Bitmap& ); + + /*! + * Obtains the current icon dimensions of this button in pixels. The icon's + * \a width and \a height are returned in the referenced variables. + */ + void GetIconSize( int& width, int& height ) const; + + /*! + * Returns the current icon width in pixels for this button. + */ + int IconWidth() const + { + int width, dum; GetIconSize( width, dum ); return width; + } + + /*! + * Returns the current icon height in pixels for this button. + */ + int IconHeight() const + { + int dum, height; GetIconSize( dum, height ); return height; + } + + /*! + * Sets new icon sizes for this button, \a width and \a height in pixels, + * respectively. + */ + void SetIconSize( int width, int height ); + + /*! # + */ + void SetIconSize( int size ) + { + SetIconSize( size, size ); + } + + /*! # + */ + void GetScaledIconSize( int& width, int& height ) const + { + GetIconSize( width, height ); width = PhysicalPixelsToLogical( width ); height = PhysicalPixelsToLogical( height ); + } + + /*! # + */ + int ScaledIconWidth() const + { + int width, dum; GetIconSize( width, dum ); return PhysicalPixelsToLogical( width ); + } + + /*! # + */ + int ScaledIconHeight() const + { + int dum, height; GetIconSize( dum, height ); return PhysicalPixelsToLogical( height ); + } + + /*! # + */ + void SetScaledIconSize( int width, int height ) + { + SetIconSize( LogicalPixelsToPhysical( width ), LogicalPixelsToPhysical( height ) ); + } + + /*! # + */ + void SetScaledIconSize( int size ) + { + size = LogicalPixelsToPhysical( size ); + SetIconSize( size, size ); + } + + /*! + * Returns true iff this button can be pushed down. + * + * \note This is a pure virtual member function that must be reimplemented + * by derived classes. + */ + virtual bool IsPushable() const = 0; + + /*! + * Returns true iff this button is in pushed down state. + */ + bool IsPushed() const; + + /*! + * Sets the current push state of this button. + */ + void SetPushed( bool = true ); + + /*! + * A convenience synonym for SetPushed( true ). + */ + void Push() + { + SetPushed( true ); + } + + /*! + * A convenience synonym for SetPushed( false ). + */ + void Unpush() + { + SetPushed( false ); + } + + /*! + * Returns true iff this button can be checked. + * + * \note This is a pure virtual member function that must be reimplemented + * by derived classes. + */ + virtual bool IsCheckable() const = 0; + + /*! + * Returns true iff this button is in checked state. + */ + bool IsChecked() const; + + /*! + * Sets the current check state of this button. + */ + void SetChecked( bool = true ); + + /*! + * A convenience synonym for SetChecked( true ). + */ + void Check() + { + SetChecked( true ); + } + + /*! + * A convenience synonym for SetChecked( false ). + */ + void Uncheck() + { + SetChecked( false ); + } + + /*! + * Returns the current check state of this button. This function must be + * used for button controls that can adopt \e tristate check states. + */ + check_state State() const; + + /*! + * Sets the current check state of this button. This function must be used + * for button controls that can adopt \e tristate check states. + */ + void SetState( check_state ); + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnClick( Button& sender, bool checked ); + // void OnPress( Button& sender ); + // void OnRelease( Button& sender ); + // void OnCheck( Button& sender, Button::check_state state ); + + /*! + * \defgroup button_event_handlers Button Event Handlers + */ + + /*! + * Defines the prototype of a button click event handler. + * + * A button click event is generated when a button control is clicked with + * the mouse (pressed down then released while the mouse cursor stays within + * the button) or activated with the keyboard. + * + * \param sender The control that sends a button click event. + * \param checked Whether the sender button is currently checked. + * + * \ingroup button_event_handlers + */ + typedef void (Control::*click_event_handler)( Button& sender, bool checked ); + + /*! + * Defines the prototype of a button press event handler. + * + * A button press event is generated when a button control is either pressed + * down with the mouse, or released after having being pressed. + * + * \param sender The control that sends a button press event. + * + * \ingroup button_event_handlers + */ + typedef void (Control::*press_event_handler)( Button& sender ); + + /*! + * Defines the prototype of a button check event handler. + * + * A button check event is generated when a checkable button control changes + * its check state, either by clicking it with the mouse, or by activating + * it with the keyboard. + * + * \param sender The control that sends a button press event. + * \param state The current check state of the sender button. + * + * \ingroup button_event_handlers + */ + typedef void (Control::*check_event_handler)( Button& sender, Button::check_state state ); + + /*! + * Sets the button click event handler for this button. + * + * \param handler The button click event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive click events from this + * button. + * + * \ingroup button_event_handlers + */ + void OnClick( click_event_handler handler, Control& receiver ); + + /*! + * Sets the button press event handler for this button. + * + * \param handler The button press event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive press events from this + * button. + * + * \ingroup button_event_handlers + */ + void OnPress( press_event_handler handler, Control& receiver ); + + /*! + * Sets the button release event handler for this button. + * + * \param handler The button release event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive release events from this + * button. + * + * \ingroup button_event_handlers + */ + void OnRelease( press_event_handler handler, Control& receiver ); + + /*! + * Sets the button check event handler for this button. + * + * \param handler The button check event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive check events from this + * button. + * + * \ingroup button_event_handlers + */ + void OnCheck( check_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + click_event_handler onClick = nullptr; + press_event_handler onPress = nullptr; + press_event_handler onRelease = nullptr; + check_event_handler onCheck = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + +protected: + + /*! + * \internal + */ + Button( void* h ) : Control( h ) + { + } + + friend class ButtonEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Button_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Button.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ButtonCodes.h b/3rdparty/include/pcl/ButtonCodes.h new file mode 100644 index 0000000..884b680 --- /dev/null +++ b/3rdparty/include/pcl/ButtonCodes.h @@ -0,0 +1,135 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ButtonCodes.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ButtonCodes_h +#define __PCL_ButtonCodes_h + +/// \file pcl/ButtonCodes.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::MouseButton + * \brief Defines PCL mouse button codes + * + * + * + * + * + * + * + * + *
MouseButton::Left Primary mouse button
MouseButton::Right Secondary mouse button
MouseButton::Middle Middle mouse button
MouseButton::X1 First X button
MouseButton::X2 Second X button
MouseButton::Unknown Unknown/unsupported mouse button
+ */ +namespace MouseButton +{ + enum mask_type + { + Left = 0x01, // Primary mouse button + Right = 0x02, // Secondary mouse button + Middle = 0x04, // Middle mouse button + X1 = 0x10, // First X button + X2 = 0x20, // Second X button + Unknown = 0 // Unknown/unsupported mouse button + }; +} + +/*! + * A combination of mouse button codes. + */ +typedef Flags MouseButtons; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::KeyModifier + * \brief Defines PCL keyboard modifiers + * + * + * + * + * + * + * + *
KeyModifier::Shift Shift key
KeyModifier::Control Control key (Command key on macOS)
KeyModifier::Alt Alt key
KeyModifier::SpaceBar Space bar
KeyModifier::Meta Meta key (Control key on macOS)
+ */ +namespace KeyModifier +{ + enum mask_type + { + Shift = 0x01, // Shift key + Control = 0x02, // Control key (= Command on macOS) + Alt = 0x04, // Alt key + SpaceBar = 0x08, // Space bar + Meta = 0x10 // Meta key (= Control on macOS) + }; +} + +/*! + * A combination of keyboard modifiers. + */ +typedef Flags KeyModifiers; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ButtonCodes_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ButtonCodes.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ByteArray.h b/3rdparty/include/pcl/ByteArray.h new file mode 100644 index 0000000..16cb525 --- /dev/null +++ b/3rdparty/include/pcl/ByteArray.h @@ -0,0 +1,100 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ByteArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ByteArray_h +#define __PCL_ByteArray_h + +/// \file pcl/ByteArray.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup byte_arrays Byte Array Classes + */ + +/*! + * \class pcl::ByteArray + * \brief Dynamic array of 8-bit unsigned integers + * + * %ByteArray is a template instantiation of Array for \c uint8. + * + * \ingroup byte_arrays + * \ingroup dynamic_arrays + */ +typedef Array ByteArray; + +/*! + * \class pcl::SortedByteArray + * \brief Dynamic sorted array of 8-bit unsigned integers + * + * %SortedByteArray is a template instantiation of SortedArray for \c uint8. + * + * \ingroup byte_arrays + * \ingroup dynamic_arrays + */ +typedef SortedArray SortedByteArray; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ByteArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ByteArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CUDADevice.h b/3rdparty/include/pcl/CUDADevice.h new file mode 100644 index 0000000..a5e70ad --- /dev/null +++ b/3rdparty/include/pcl/CUDADevice.h @@ -0,0 +1,131 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CUDADevice.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CUDADevice_h +#define __PCL_CUDADevice_h + +/// \file pcl/CUDADevice.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class CUDADevice + * \brief Access to core CUDA device services + * + * ### TODO: Write description. + */ +class PCL_CLASS CUDADevice +{ +public: + + /*! + * Default constructor - deleted, not an instantiable class. + */ + CUDADevice() = delete; + + /*! + * Copy constructor - deleted, not an instantiable class. + */ + CUDADevice( const CUDADevice& ) = delete; + + /*! + * Copy assignment operator - deleted, not an instantiable class. + */ + CUDADevice& operator =( CUDADevice& ) = delete; + + /*! + * Returns true iff a valid and operational CUDA device is currently + * available on the running PixInsight platform. + */ + static bool IsAvailable() noexcept; + + /*! + * Returns the identifying name of the active CUDA device, or an empty + * string if there is no valid CUDA device available on the running + * PixInsight platform. + */ + static IsoString Name(); + + /*! + * Returns the total global memory available on the active CUDA device in + * bytes, or zero if no valid CUDA device is available. + */ + static size_type TotalGlobalMemory() noexcept; + + /*! + * Returns the total shared memory available per block on the active CUDA + * device in bytes, or zero if no valid CUDA device is available. + */ + static size_type SharedMemoryPerBlock() noexcept; + + /*! + * Returns the maximum number of threads per block available in the active + * CUDA device, or zero if no valid CUDA device is available. + */ + static int MaxThreadsPerBlock() noexcept; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_CUDADevice_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CUDADevice.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CanvasColor.h b/3rdparty/include/pcl/CanvasColor.h new file mode 100644 index 0000000..ff73e0c --- /dev/null +++ b/3rdparty/include/pcl/CanvasColor.h @@ -0,0 +1,190 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CanvasColor.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CanvasColor_h +#define __PCL_CanvasColor_h + +/// \file pcl/CanvasColor.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class CanvasColor + * \brief A set of color values used to fill free or unused areas of images + * + * Some geometric image transformations, such as rotations and translations for + * example, generate images with uncovered regions. %CanvasColor defines a set + * of color components to initialize pixels on such unused areas. + * + * %CanvasColor stores pixel values in a normalized floating-point format + * suitable to be used for any pixel sample data type. When using %CanvasColor + * with integer-sampled images, color components should be kept normalized in + * the normalized [0,1] range. + */ +class PCL_CLASS CanvasColor +{ +public: + + /*! + * Constructs a %CanvasColor object with zero (black) color components. + */ + CanvasColor() = default; + + /*! + * Copy constructor. + */ + CanvasColor( const CanvasColor& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + CanvasColor& operator =( const CanvasColor& ) = default; + + /*! + * Retrieves the current RGB sample values in this %CanvasColor object. + * + * \param[out] v0,v1,v2 References to variables that will receive current + * sample values for the red/gray, green and blue + * channels, respectively. + */ + void GetCanvasColor( float& v0, float& v1, float& v2 ) const + { + v0 = canvasColor[0]; v1 = canvasColor[1]; v2 = canvasColor[2]; + } + + /*! + * Retrieves the current RGBA sample values in this %CanvasColor object. + * + * \param[out] v0,v1,v2,v3 References to variables that will receive + * current sample values for the red/gray, green, blue and + * alpha channels, respectively. + */ + void GetCanvasColor( float& v0, float& v1, float& v2, float& v3 ) const + { + v0 = canvasColor[0]; v1 = canvasColor[1]; v2 = canvasColor[2]; v3 = canvasColor[3]; + } + + /*! + * Retrieves the current sample values in this %CanvasColor object. + * + * \param[out] v Starting address of an array where current sample values + * will be copied. This array must provide storage for at + * least four elements. + */ + void GetCanvasColor( float* v ) const + { + v[0] = canvasColor[0]; v[1] = canvasColor[1]; v[2] = canvasColor[2]; v[3] = canvasColor[3]; + } + + /*! + * Sets current RGB sample values for this %CanvasColor object. + * + * \param v0,v1,v2 New red/gray, green and blue sample values. + * + * \note The alpha component will be set to one (white, opaque). + */ + void SetCanvasColor( float v0, float v1, float v2 ) + { + canvasColor[0] = v0; canvasColor[1] = v1; canvasColor[2] = v2; canvasColor[3] = 1; + } + + /*! + * Sets current RGB sample values for this %CanvasColor object. + * + * \param v0,v1,v2,v3 New red/gray, green, blue and alpha sample values. + * + * \note The alpha component will be set to one (white, opaque). + */ + void SetCanvasColor( float v0, float v1, float v2, float v3 ) + { + canvasColor[0] = v0; canvasColor[1] = v1; canvasColor[2] = v2; canvasColor[3] = v3; + } + + /*! + * Sets current sample values for this %CanvasColor object. + * + * \param v Starting address of an array from which new sample values + * will be obtained. At least four elements are required. + */ + void SetCanvasColor( const float* v ) + { + canvasColor[0] = v[0]; canvasColor[1] = v[1]; canvasColor[2] = v[2]; canvasColor[3] = v[3]; + } + + /*! + * Sets all sample values of this %CanvasColor object equal to an specified + * value \a v. + */ + void SetCanvasColor( float v ) + { + canvasColor[0] = canvasColor[1] = canvasColor[2] = canvasColor[3] = v; + } + +protected: + + // Normalized floating-point sample values. Note that to the purpose of this + // structure float provides enough accuracy, even for DImage. + float canvasColor[ 4 ] = {}; // red/gray, green, blue, alpha +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_CanvasColor_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CanvasColor.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CharTraits.h b/3rdparty/include/pcl/CharTraits.h new file mode 100644 index 0000000..312bee6 --- /dev/null +++ b/3rdparty/include/pcl/CharTraits.h @@ -0,0 +1,1453 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CharTraits.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CharTraits_h +#define __PCL_CharTraits_h + +/// \file pcl/CharTraits.h + +#include +#include + +#include + +#include +#include +#include + +#ifdef __PCL_WINDOWS +# include +#else // POSIX +# include +# include +#endif // !__PCL_WINDOWS + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +char16_type PCL_FUNC PCL_ToCaseFolded( char16_type ); +char16_type PCL_FUNC PCL_ToLowercase( char16_type ); +char16_type PCL_FUNC PCL_ToUppercase( char16_type ); + +extern const uint8* PCL_DATA PCL_toLowercaseLatin1; +extern const uint8* PCL_DATA PCL_toUppercaseLatin1; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup char_trait_classes Character Traits Classes + * + * A character traits class characterizes a data type to represent a + * single element of a string, or \e character. For example, a char traits + * class must provide primitive routines to copy, compare and classify + * characters and sequences of characters. Those primitives are then used as + * the building blocks of more complex structures such as character strings and + * other text-oriented containers. + */ + +// ---------------------------------------------------------------------------- + +#define PCL_COMPARE_CODE_POINTS() \ + PCL_PRECONDITION( n1 == 0 || n2 == 0 || s1 != nullptr && s2 != nullptr ) \ + if ( caseSensitive ) \ + { \ + for ( size_type n = pcl::Min( n1, n2 ); n > 0; --n, ++s1, ++s2 ) \ + if ( *s1 != *s2 ) \ + return (*s1 < *s2) ? -1 : +1; \ + } \ + else \ + { \ + for ( size_type n = pcl::Min( n1, n2 ); n > 0; --n, ++s1, ++s2 ) \ + { \ + char_type c1 = ToCaseFolded( *s1 ), c2 = ToCaseFolded( *s2 ); \ + if ( c1 != c2 ) \ + return (c1 < c2) ? -1 : +1; \ + } \ + } \ + return (n1 == n2) ? 0 : ((n1 < n2) ? -1 : +1) + +// ---------------------------------------------------------------------------- + +/* + * Wildcard string matching algorithm adapted from: + * + * Kirk J. Krauss (2014): Matching Wildcards: An Empirical Way to Tame an + * Algorithm, Dr. Dobb's Magazine, October 7, 2014. + * + * http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123 + */ + +template inline +bool WildMatch( const Tt* t, size_type nt, const Tp* p, size_type np ) +{ + PCL_PRECONDITION( nt == 0 || np == 0 || t != nullptr && p != nullptr ) + + if ( nt == 0 || np == 0 ) + return false; + + const Tt* et = t + nt; + const Tp* ep = p + np; + const Tt* bt = nullptr; + const Tp* bp = nullptr; + + for ( ;; ) + { + Tp c = *p; + + if ( c == Tp( '*' ) ) + { + do + if ( ++p == ep ) + return true; + while ( (c = *p) == Tp( '*' ) ); + + if ( c != Tp( '?' ) ) + while ( Tt( c ) != *t ) + if ( ++t == et ) + return false; + + bp = p; + bt = t; + } + else if ( Tt( c ) != *t && c != Tp( '?' ) ) + { + if ( bp != nullptr ) + { + if ( p != bp ) + { + p = bp; + + if ( Tt( *p ) != *t ) + { + t = ++bt; + continue; + } + + ++p; + } + + if ( t < et ) + { + ++t; + continue; + } + } + + return false; + } + + ++t; + ++p; + + if ( t == et ) + { + if ( p == ep ) + return true; + + while ( *p == Tp( '*' ) ) + if ( ++p == ep ) + return true; + + return false; + } + } +} + +template inline +bool WildMatchIC( const Tt* t, size_type nt, const Tp* p, size_type np, Ut ut, Up up ) +{ + PCL_PRECONDITION( nt == 0 || np == 0 || t != nullptr && p != nullptr && ut != nullptr && up != nullptr ) + + if ( nt == 0 || np == 0 ) + return false; + + const Tt* et = t + nt; + const Tp* ep = p + np; + const Tt* bt = nullptr; + const Tp* bp = nullptr; + + for ( ;; ) + { + Tp c = *p; + + if ( c == Tp( '*' ) ) + { + do + if ( ++p == ep ) + return true; + while ( (c = *p) == Tp( '*' ) ); + + if ( c != Tp( '?' ) ) + { + c = up( c ); + while ( Tt( c ) != ut( *t ) ) + if ( ++t == et ) + return false; + } + + bp = p; + bt = t; + } + else if ( c != Tp( '?' ) ) + { + Tt ft = ut( *t ); + + if ( Tt( up( c ) ) != ft ) + { + if ( bp != nullptr ) + { + if ( p != bp ) + { + p = bp; + + if ( Tt( up( *p ) ) != ft ) + { + t = ++bt; + continue; + } + + ++p; + } + + if ( t < et ) + { + ++t; + continue; + } + } + + return false; + } + } + + ++t; + ++p; + + if ( t == et ) + { + if ( p == ep ) + return true; + + while ( *p == Tp( '*' ) ) + if ( ++p == ep ) + return true; + + return false; + } + } +} + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericCharTraits + * \brief Generic base class of character traits classes + * + * %GenericCharTraits defines fundamental properties and functionality common + * to all character types. + * + * The purpose of a character traits class is to characterize a data + * type to represent a single element of a string, or \e character. For + * example, a char traits class must provide primitive routines to copy, + * compare and classify characters and sequences of characters. + * + * %GenericCharTraits is a template class that must be instantiated for + * suitable data types. Two instantiations of %GenericCharTraits, namely for + * \c char and \c char16_type, originate the IsoString and String fundamental + * PCL classes, respectively. The versatile interface provided by + * %GenericCharTraits makes it possible to implement string classes virtually + * for any data type with default and copy constructor semantics. + * + * \ingroup char_trait_classes + * \sa CharTraits, IsoCharTraits, String, IsoString + */ +template +class PCL_CLASS GenericCharTraits +{ +public: + + /*! + * Represents the character data type used by this traits class. + */ + typedef T char_type; + + /*! + * Number of bytes per character. + */ + static constexpr size_type BytesPerChar() noexcept + { + return sizeof( char_type ); + } + + /*! + * Returns the length of a null-terminated string in characters (\e not + * bytes). + * + * The returned value is the length of the initial contiguous sequence of + * characters that are not equal to Null(). + */ + static size_type Length( const char_type* s ) noexcept + { + const char_type* __restrict__ t = s; + if ( s != nullptr ) + for ( ; *t != Null(); ++t ) {} + return size_type( t - s ); + } + + /*! + * Fills a contiguous region of characters with a constant value. + * + * \param s Initial address of a character sequence. + * \param c Constant value to fill with. + * \param n Number of characters to fill. + */ + static void Fill( char_type* __restrict__ s, char_type c, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n ) + *s++ = c; + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions do not overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + * + * If the source and destination regions overlap, this routine will produce + * an unpredictable result. CopyOverlapped() should be used in these cases. + */ + static void Copy( char_type* __restrict__ dst, const char_type* __restrict__ src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memcpy( dst, src, n*sizeof( char_type ) ); + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions may safely overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + */ + static void CopyOverlapped( char_type* dst, const char_type* src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memmove( dst, src, n*sizeof( char_type ) ); + } + + /*! + * Compares numeric character values between two strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + * + * This function compares the numerical values of string characters. For + * case-insensitive comparisons, this generic routine is only valid for the + * ISO/IEC 8859-1 character set: characters in the ranges 0x41-0x5A, + * 0xC0-0xD6 and 0xD8-0xDE are considered identical to its counterparts in + * the ranges 0x61-0x7A, 0xE0-0xF6 and 0xF8-0xFE, respectively. + */ + static int CompareCodePoints( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true ) noexcept + { + PCL_COMPARE_CODE_POINTS(); + } + + /*! + * Lexicographical comparison between two generic strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * \param localeAware This parameter is ignored by GenericCharTraits. + * For locale-aware string comparisons, see the + * reimplementations of this static function in the + * IsoCharTraits and CharTraits template class + * instantiations. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + * + * This default implementation simply calls CompareCodePoints() to compare + * the numerical values of string characters, so it cannot be localized and + * can't be aware of user locale settings. For more comprehensive, + * locale-aware Unicode implementations of this static function, see the + * IsoCharTraits and CharTraits classes. + */ + static int Compare( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true, bool localeAware = true ) noexcept + { + return CompareCodePoints( s1, n1, s2, n2, caseSensitive ); + } + + /*! + * Wildcard string matching algorithm. + * + * \param t The string to be matched. + * + * \param nt Length of the string to be matched in characters. + * + * \param p The pattern string. May contain multiple instances of the + * wildcard characters '*' and '?'. + * + * \param np Length of the pattern string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns true iff the string \a t matches the specified pattern \a p. If + * one of the strings is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + static bool WildMatch( const char_type* __restrict__ t, size_type nt, + const char_type* __restrict__ p, size_type np, bool caseSensitive = true ) noexcept + { + if ( caseSensitive ) + return pcl::WildMatch( t, nt, p, np ); + return pcl::WildMatchIC( t, nt, p, np, ToCaseFolded, ToCaseFolded ); + } + + /*! + * Returns the \e case \e folded equivalent character for the specified + * code point \a c. + * + * Case folding elimitates case differences, which is useful for + * case-insensitive string comparisons. + * + * This default implementation is only valid for the ISO/IEC-8859-1 + * character set. For a comprehensive Unicode implementation see the + * CharTraits class. + */ + static char_type ToCaseFolded( char_type c ) noexcept + { + return ToLowercase( c ); + } + + /*! + * Returns the lowercase equivalent character for the specified code point. + * + * This default implementation is only valid for the ISO/IEC-8859-1 + * character set. For a comprehensive Unicode implementation see the + * CharTraits class. + */ + static constexpr char_type ToLowercase( char_type c ) noexcept + { + return (c >= char_type( 65 ) && c <= char_type( 90 ) + || c >= char_type( 192 ) && c <= char_type( 214 ) + || c >= char_type( 216 ) && c <= char_type( 222 )) ? c + 32 : c; + } + + /*! + * Returns the uppercase equivalent character for the specified code point. + * + * This default implementation is only valid for the ISO/IEC-8859-1 + * character set. For a comprehensive Unicode implementation see the + * CharTraits class. + */ + static constexpr char_type ToUppercase( char_type c ) noexcept + { + return (c >= char_type( 97 ) && c <= char_type( 122 ) + || c >= char_type( 224 ) && c <= char_type( 246 ) + || c >= char_type( 248 ) && c <= char_type( 254 )) ? c - 32 : c; + } + + /*! + * Transforms a string to lower case. + * + * This default implementation is only valid for the ISO/IEC-8859-1 + * character set. For a comprehensive Unicode implementation see the + * CharTraits class. + */ + static void ToLowercase( char_type* __restrict__ s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToLowercase( *s ); + } + + /*! + * Transforms a string to upper case. + * + * This default implementation is only valid for the ISO/IEC-8859-1 + * character set. For a comprehensive Unicode implementation see the + * CharTraits class. + */ + static void ToUppercase( char_type* __restrict__ s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToUppercase( *s ); + } + + /*! + * Returns the null string termination character '\\0'. + */ + static constexpr char_type Null() noexcept + { + return char_type( 0 ); + } + + /*! + * Returns the blank space character (white space). + */ + static constexpr char_type Blank() noexcept + { + return char_type( ' ' ); + } + + /*! + * Returns the horizontal tab control character '\\t'. + */ + static constexpr char_type Tab() noexcept + { + return char_type( '\t' ); + } + + /*! + * Returns the carriage return control character '\\r'. + */ + static constexpr char_type CR() noexcept + { + return char_type( '\r' ); + } + + /*! + * Returns the line feed control character '\\n'. + */ + static constexpr char_type LF() noexcept + { + return char_type( '\n' ); + } + + /*! + * Returns the comma punctuator character ','. + */ + static constexpr char_type Comma() noexcept + { + return char_type( ',' ); + } + + /*! + * Returns the colon punctuator character ':'. + */ + static constexpr char_type Colon() noexcept + { + return char_type( ':' ); + } + + /*! + * Returns the semicolon punctuator character ';'. + */ + static constexpr char_type Semicolon() noexcept + { + return char_type( ';' ); + } + + /*! + * Returns the hyphen punctuator character '-'. + */ + static constexpr char_type Hyphen() noexcept + { + return char_type( '-' ); + } + + /*! + * Returns the plus sign character '+'. + */ + static constexpr char_type PlusSign() noexcept + { + return char_type( '+' ); + } + + /*! + * Returns the minus sign character '-'. + */ + static constexpr char_type MinusSign() noexcept + { + return char_type( '-' ); + } + + /*! + * Returns the decimal separator character '.'. + */ + static constexpr char_type DecimalSeparator() noexcept + { + return char_type( '.' ); + } + + /*! + * Returns the exponent delimiter character 'e'. + */ + static constexpr char_type ExponentDelimiter() noexcept + { + return char_type( 'e' ); + } + + /*! + * Returns the underscore character '_'. + */ + static constexpr char_type Underscore() noexcept + { + return char_type( '_' ); + } + + /*! + * Returns the single quote character "'". + */ + static constexpr char_type SingleQuote() noexcept + { + return char_type( '\'' ); + } + + /*! + * Returns the double quote character '"'. + */ + static constexpr char_type DoubleQuote() noexcept + { + return char_type( '\"' ); + } + + /*! + * Returns true iff a character \a c is a null string terminator. + */ + static constexpr bool IsNull( char_type c ) noexcept + { + return c == Null(); + } + + /*! + * Returns true iff a character \a c is a white space character. + */ + static constexpr bool IsSpace( char_type c ) noexcept + { + return c == Blank() || c == Tab() || c == CR() || c == LF(); + } + + /*! + * Returns true iff a character \a c is a trimable character. Generally + * equivalent to IsSpace(). + */ + static constexpr bool IsTrimable( char_type c ) noexcept + { + return IsSpace( c ); + } + + /*! + * Returns true iff a character \a c is a decimal digit. Decimal digits are + * in the range [0-9]. + */ + static constexpr bool IsDigit( char_type c ) noexcept + { + return c >= char_type( '0' ) && c <= char_type( '9' ); + } + + /*! + * Returns true iff a character \a c is an hexadecimal digit. Hexadecimal + * digits are in the range [a-fA-F]. + */ + static constexpr bool IsHexDigit( char_type c ) noexcept + { + return IsDigit( c ) || c >= char_type( 'A' ) && c <= char_type( 'F' ) || + c >= char_type( 'a' ) && c <= char_type( 'f' ); + } + + /*! + * Returns true iff a character \a c is in the range [a-zA-Z]. + */ + static constexpr bool IsAlpha( char_type c ) noexcept + { + return IsLowercaseAlpha( c ) || IsUppercaseAlpha( c ); + } + + /*! + * Returns true iff a character \a c is in the range [a-z]. + */ + static constexpr bool IsLowercaseAlpha( char_type c ) noexcept + { + return c >= char_type( 'a' ) && c <= char_type( 'z' ); + } + + /*! + * Returns true iff a character \a c is in the range [A-Z]. + */ + static constexpr bool IsUppercaseAlpha( char_type c ) noexcept + { + return c >= char_type( 'A' ) && c <= char_type( 'Z' ); + } + + /*! + * Returns true iff a character \a c is the underscore character '_'. + */ + static constexpr bool IsUnderscore( char_type c ) noexcept + { + return c == Underscore(); + } + + /*! + * Returns true iff a character \a c is a valid symbol element. Symbol digits + * are in the range [a-zA-Z0-9_]. + */ + static constexpr bool IsSymbolDigit( char_type c ) noexcept + { + return IsAlpha( c ) || IsDigit( c ) || IsUnderscore( c ); + } + + /*! + * Returns true iff a character \a c is a valid starting symbol digit. A + * starting symbol digit is in the range [a-zA-Z_]. + */ + static constexpr bool IsStartingSymbolDigit( char_type c ) noexcept + { + return IsAlpha( c ) || IsUnderscore( c ); + } + + /*! + * Returns true iff a character \a c is a numerical sign, either '+' or '-'. + */ + static constexpr bool IsSign( char_type c ) noexcept + { + return c == MinusSign() || c == PlusSign(); + } + + /*! + * Returns true iff a character \a c is the decimal separator '.'. + */ + static constexpr bool IsDecimalSeparator( char_type c ) noexcept + { + return c == DecimalSeparator(); + } + + /*! + * Returns true iff a character \a c is an exponent delimiter. Exponent + * delimiters are in the range [eEdD]. The [dD] pair allows for FORTRAN + * compatibility. + */ + static constexpr bool IsExponentDelimiter( char_type c ) noexcept + { + return c == char_type( 'e' ) || c == char_type( 'E' ) || c == char_type( 'd' ) || c == char_type( 'D' ); + } + + /*! + * Returns true iff a character \a c is a wildcard. The wildcards are the + * asterisk '*' and question mark '?' characters. + */ + static constexpr bool IsWildcard( char_type c ) noexcept + { + return c == char_type( '*' ) || c == char_type( '?' ); + } + + /*! + * Returns a pointer to the first non-trimmable character in the sequence of + * contiguous characters defined by the range [i,j) of pointers. + */ + template + static Ptr1 SearchTrimLeft( Ptr1 i, Ptr2 j ) noexcept + { + for ( ; i < j && IsTrimable( *i ); ++i ) {} + return i; + } + + /*! + * Returns a pointer to the character \e after the last non-trimmable + * character in the sequence of contiguous characters defined by the range + * [i,j) of pointers. + * + * If there are no trimmable characters in the specified sequence, this + * function returns the ending pointer \a j. + */ + template + static Ptr2 SearchTrimRight( Ptr1 i, Ptr2 j ) noexcept + { + for ( ; i < j && IsTrimable( *(j-1) ); --j ) {} + return j; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IsoCharTraits + * \brief A template instantiation of GenericCharTraits for the \c char type. + * + * %IsoCharTraits is the char traits class used by IsoString. + * + * \ingroup char_trait_classes + */ +class PCL_CLASS IsoCharTraits : public GenericCharTraits +{ +public: + + /*! + * Base class of this char traits class. + */ + typedef GenericCharTraits traits_base; + + /*! + * Represents the character data type used by this traits class. + */ + typedef traits_base::char_type char_type; + + /*! + * Returns the length of a null-terminated 8-bit string in characters + * (\e not bytes). + * + * The returned value is the length of the initial contiguous sequence of + * characters that are not equal to Null(). + */ + static constexpr size_type Length( const char_type* __restrict__ s ) noexcept + { + return (s != nullptr) ? ::strlen( s ) : 0; + } + + /*! + * Fills a contiguous region of characters with a constant value. + * + * \param s Initial address of a character sequence. + * \param c Constant value to fill with. + * \param n Number of characters to fill. + */ + static void Fill( char_type* __restrict__ s, char_type c, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + ::memset( s, c, n ); + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions do not overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + * + * If the source and destination regions overlap, this routine will produce + * an unpredictable result. CopyOverlapped() should be used in these cases. + */ + static void Copy( char_type* __restrict__ dst, const char_type* __restrict__ src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memcpy( dst, src, n ); + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions may safely overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + */ + static void CopyOverlapped( char_type* dst, const char_type* src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memmove( dst, src, n ); + } + + /*! + * Compares numeric character values between two 8-bit strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + */ + static int CompareCodePoints( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true ) noexcept + { + PCL_COMPARE_CODE_POINTS(); + } + + /*! + * Lexicographical comparison between two 8-bit strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters (as defined by the current locale). + * The default value of this parameter is true. + * + * \param localeAware When true, a locale-aware comparison is + * performed which takes into account the currently + * selected user locale (language and variants). + * When false, an invariant comparison is carried + * out by comparing Unicode code points (which may + * be faster). The default value is true. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + * + * On OS X and Windows platforms this function invokes system API routines + * to perform locale-aware string comparisons. + * + * On X11 (FreeBSD and Linux platforms), when the \a localeAware + * parameter is true, the comparison uses the current locale as reported by + * calling the setlocale POSIX function: + * + * \code + * setlocale( LC_COLLATE, 0 ); + * \endcode + * + * In PixInsight on X11 platforms, the default user collation and case + * comparison locales are used. A module can change them \e temporarily to + * a custom locale by calling: + * + * \code + * setlocale( LC_COLLATE, "" ); + * setlocale( LC_CTYPE, "" ); + * \endcode + * + * and then, after the necessary work has been done with the custom locales, + * restore the default settings: + * + * \code + * setlocale( LC_COLLATE, "" ); + * setlocale( LC_CTYPE, "" ); + * \endcode + */ + static int Compare( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true, bool localeAware = true ) noexcept; + + /*! + * Wildcard string matching algorithm. + * + * \param t The string to be matched. + * + * \param nt Length of the string to be matched in characters. + * + * \param p The pattern string. May contain multiple instances of the + * wildcard characters '*' and '?'. + * + * \param np Length of the pattern string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns true iff the string \a t matches the specified pattern \a p. If + * one of the strings is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + static bool WildMatch( const char_type* __restrict__ t, size_type nt, + const char_type* __restrict__ p, size_type np, bool caseSensitive = true ) noexcept + { + if ( caseSensitive ) + return pcl::WildMatch( t, nt, p, np ); + return pcl::WildMatchIC( t, nt, p, np, + []( char_type c ) { return ToCaseFolded( c ); }, + []( char_type c ) { return ToCaseFolded( c ); } ); + } + + /*! + * Returns the \e case \e folded equivalent character for the specified + * ISO/IEC-8859-1 code point \a c. + * + * Case folding elimitates case differences, which is useful for + * case-insensitive string comparisons. + * + * For more information on case folding, see Section 3.13 Default Case + * Algorithms in The Unicode Standard. + */ + static char_type ToCaseFolded( char_type c ) noexcept + { + return ToLowercase( c ); + } + + /*! + * Returns the lowercase equivalent character for the specified + * ISO/IEC-8859-1 code point \a c. + */ + static char_type ToLowercase( char_type c ) noexcept + { + return char_type( PCL_toLowercaseLatin1[uint8( c )] ); + } + + /*! + * Returns the uppercase equivalent character for the specified + * ISO/IEC-8859-1 code point \a c. + */ + static char_type ToUppercase( char_type c ) noexcept + { + return char_type( PCL_toUppercaseLatin1[uint8( c )] ); + } + + /*! + * Transforms a string to case folded. + */ + static void ToCaseFolded( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToCaseFolded( *s ); + } + + /*! + * Transforms a string to lowercase. + */ + static void ToLowercase( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToLowercase( *s ); + } + + /*! + * Transforms a string to uppercase. + */ + static void ToUppercase( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToUppercase( *s ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class CharTraits + * \brief A template instantiation of GenericCharTraits for \c char16_type. + * + * %CharTraits is the char traits class used by String. + * + * \ingroup char_trait_classes + */ +class PCL_CLASS CharTraits : public GenericCharTraits +{ +public: + + /*! + * Base class of this char traits class. + */ + typedef GenericCharTraits traits_base; + + /*! + * Represents the character data type used by this traits class. + */ + typedef traits_base::char_type char_type; + + /*! + * Returns the length of a null-terminated UTF-16 string in characters + * (\e not bytes). + * + * The returned value is the length of the initial contiguous sequence of + * characters that are not equal to Null(). + */ + static size_type Length( const char_type* __restrict__ s ) noexcept + { +#ifdef __PCL_WINDOWS + return (s != nullptr) ? ::wcslen( reinterpret_cast( s ) ) : 0u; +#else + return traits_base::Length( s ); +#endif + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions do not overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + * + * If the source and destination regions overlap, this routine will produce + * an unpredictable result. CopyOverlapped() should be used in these cases. + */ + static void Copy( char_type* __restrict__ dst, const char_type* __restrict__ src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memcpy( dst, src, n << 1 ); + } + + /*! + * Copies a contiguous sequence of characters to a specified location. The + * source and destination regions may safely overlap. + * + * \param dst Destination location where characters will be copied. + * \param src Initial address of the sequence of source characters. + * \param n Number of characters to copy. + */ + static void CopyOverlapped( char_type* dst, const char_type* src, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || dst != nullptr && src != nullptr ) + ::memmove( dst, src, n << 1 ); + } + + /*! + * Compares numeric character values between two Unicode strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + */ + static int CompareCodePoints( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true ) noexcept + { + PCL_COMPARE_CODE_POINTS(); + } + + /*! + * Lexicographical comparison between two Unicode strings. + * + * \param s1 First string. + * \param n1 Length of the first string in characters. + * \param s2 Second string. + * \param n2 Length of the second string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters (as defined by the selected locale). + * The default value of this parameter is true. + * + * \param localeAware When true, a locale-aware comparison is + * performed which takes into account the currently + * selected user locale (language and variants). + * When false, an invariant comparison is carried + * out by comparing Unicode code points (which may + * be faster). The default value is true. + * + * Returns an integer code representing the comparison result: + * + * \li 0 if \a s1 and \a s2 are equal + * \li -1 if \a s1 is less than \a s2 + * \li +1 if \a s1 is greater than \a s2 + * + * On OS X and Windows platforms this function invokes system API routines + * to perform locale-aware string comparisons. + * + * On X11 (FreeBSD and Linux platforms), when the \a localeAware + * parameter is true, the comparison uses the current locale as reported by + * calling the setlocale POSIX function: + * + * \code + * setlocale( LC_COLLATE, 0 ); + * \endcode + * + * In PixInsight on X11 platforms, the default user collation and case + * comparison locales are used. A module can change them \e temporarily to + * a custom locale by calling: + * + * \code + * setlocale( LC_COLLATE, "" ); + * setlocale( LC_CTYPE, "" ); + * \endcode + * + * and then, after the necessary work has been done with the custom locales, + * restore the default settings: + * + * \code + * setlocale( LC_COLLATE, "" ); + * setlocale( LC_CTYPE, "" ); + * \endcode + */ + static int Compare( const char_type* __restrict__ s1, size_type n1, + const char_type* __restrict__ s2, size_type n2, bool caseSensitive = true, bool localeAware = true ) noexcept; + + /*! + * Wildcard string matching algorithm. + * + * \param t The string to be matched. + * + * \param nt Length of the string to be matched in characters. + * + * \param p The pattern string. May contain multiple instances of the + * wildcard characters '*' and '?'. + * + * \param np Length of the pattern string in characters. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Returns true iff the string \a t matches the specified pattern \a p. If + * one of the strings is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + static bool WildMatch( const char_type* __restrict__ t, size_type nt, + const char_type* __restrict__ p, size_type np, bool caseSensitive = true ) noexcept + { + if ( caseSensitive ) + return pcl::WildMatch( t, nt, p, np ); + return pcl::WildMatchIC( t, nt, p, np, + []( char_type c ) { return ToCaseFolded( c ); }, + []( char_type c ) { return ToCaseFolded( c ); } ); + } + + /*! + * Wildcard string matching algorithm - overloaded version with 8-bit + * pattern string. + */ + static bool WildMatch( const char_type* __restrict__ t, size_type nt, + const char* __restrict__ p, size_type np, bool caseSensitive = true ) noexcept + { + if ( caseSensitive ) + return pcl::WildMatch( t, nt, p, np ); + return pcl::WildMatchIC( t, nt, p, np, + []( char_type c ) { return ToCaseFolded( c ); }, + []( char c ) { return IsoCharTraits::ToCaseFolded( c ); } ); + } + + /*! + * Returns the \e case \e folded equivalent character for the specified + * UTF-16 code point \a c. + * + * Case folding elimitates case differences, which is useful for + * case-insensitive string comparisons. + * + * We implement the \e simple \e case \e folding Unicode algorithm + * exclusively. For more information on case folding, see Section 3.13 + * Default Case Algorithms in The Unicode Standard. + */ + static char_type ToCaseFolded( char_type c ) noexcept + { + if ( c < 256 ) + { + if ( c >= 65 && c <= 90 || c >= 192 && c <= 214 || c >= 216 && c <= 222 ) + return c + 32; + return c; + } + return PCL_ToCaseFolded( c ); + } + + /*! + * Returns the lowercase equivalent character for the specified UTF-16 code + * point \a c. + */ + static char_type ToLowercase( char_type c ) noexcept + { + if ( c < 256 ) + { + if ( c >= 65 && c <= 90 || c >= 192 && c <= 214 || c >= 216 && c <= 222 ) + return c + 32; + return c; + } + return PCL_ToLowercase( c ); + } + + /*! + * Returns the uppercase equivalent character for the specified UTF-16 code + * point \a c. + */ + static char_type ToUppercase( char_type c ) noexcept + { + if ( c < 256 ) + { + if ( c >= 97 && c <= 122 || c >= 224 && c <= 246 || c >= 248 && c <= 254 ) + return c - 32; + return c; + } + return PCL_ToUppercase( c ); + } + + /*! + * Transforms a string to case folded. + */ + static void ToCaseFolded( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToCaseFolded( *s ); + } + + /*! + * Transforms a string to lowercase. + */ + static void ToLowercase( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToLowercase( *s ); + } + + /*! + * Transforms a string to uppercase. + */ + static void ToUppercase( char_type* s, size_type n ) noexcept + { + PCL_PRECONDITION( n == 0 || s != nullptr ) + for ( ; n > 0; --n, ++s ) + *s = ToUppercase( *s ); + } + + /*! + * Returns true iff the specified UTF-16 character is a high + * surrogate (the most significant word of a surrogate pair + * forming a UTF-32 code point). High surrogates have values between 0xD800 + * and 0xDBFF. + */ + static constexpr bool IsHighSurrogate( char_type c16 ) noexcept + { + return (c16 & 0xFC00) == 0xD800; + } + + /*! + * Returns the high surrogate word of a UTF-32 code point. The + * specified UTF-32 code must be in the range from 0x010000 to 0x10FFFF, + * since surrogates only exist outside the Basic Multilingual Plane of + * Unicode. + */ + static constexpr char_type HighSurrogate( char32_type c32 ) noexcept + { + return char_type( (c32 >> 10) + 0xD7C0 ); + } + + /*! + * Returns true iff the specified UTF-16 character is a low + * surrogate (the least significant word of a surrogate pair + * forming a UTF-32 code point). Low surrogates have values between 0xDC00 + * and 0xDFFF. + */ + static constexpr bool IsLowSurrogate( char_type c16 ) noexcept + { + return (c16 & 0xFC00) == 0xDC00; + } + + /*! + * Returns the low surrogate word of a UTF-32 code point. The + * specified UTF-32 code must be in the range from 0x010000 to 0x10FFFF, + * since surrogates only exist outside the Basic Multilingual Plane of + * Unicode. + */ + static constexpr char_type LowSurrogate( char32_type c32 ) noexcept + { + return char_type( (c32%0x400) + 0xDC00 ); + } + + /*! + * Returns a UTF-32 code point from its surrogate pair. The + * specified surrogate words must pertain to a valid Unicode code point + * outside the Basic Multilingual Plane (from 0x010000 to 0x10FFFF). + */ + static constexpr char32_type SurrogatePairToUTF32( char_type high, char_type low ) noexcept + { + return (char32_type( high ) << 10) + low - 0x035FDC00; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_CharTraits_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CharTraits.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ChebyshevFit.h b/3rdparty/include/pcl/ChebyshevFit.h new file mode 100644 index 0000000..2c4c2db --- /dev/null +++ b/3rdparty/include/pcl/ChebyshevFit.h @@ -0,0 +1,945 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ChebyshevFit.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ChebyshevFit_h +#define __PCL_ChebyshevFit_h + +/// \file pcl/ChebyshevFit.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +template class GenericScalarChebyshevFit; + +/*! + * \class GenericChebyshevFit + * \brief Approximation of vector-valued functions by Chebyshev polynomial + * expansions. + * + * %GenericChebyshevFit approximates a smooth, vector-valued function f(x) in a + * given interval [a,b] by expansion with a set of truncated series of + * Chebyshev polynomials. As is well known, the Chebyshev expansion: + * + * T(x) = Sum_i( ci*Ti(x) ), + * + * where i belongs to [0,∞), Ti(x) is the Chebyshev polynomial of the ith + * degree, and the ci's are polynomial coefficients, is very close to the + * optimal approximating polynomial that minimizes the error |T(x) - f(x)|, + * where x varies over the fitting interval [a,b]. + * + * For functions converging strongly after a given series length n, one can + * truncate the Chebyshev series to a smaller length m < n to obtain an + * approximating polynomial with a maximum error close to |Tm+1(x)|. + * + * In addition to Chebyshev expansion, truncation and approximation, this class + * also implements generation of Chebyshev polynomials to approximate the + * first derivative and indefinite integral of the fitted function. + * + * The template argument Tx represents the type of the independent variable, or + * the type of the argument x of the fitted function y = f(x). The template + * argument Ty represents the type of a component of the value y of the fitted + * function. + */ +template +class GenericChebyshevFit +{ +public: + + /*! + * Represents an ordered list of Chebyshev polynomial coefficients. + */ + typedef GenericVector coefficients; + + /*! + * Represents a set of ordered lists of Chebyshev polynomial coefficients. + */ + typedef GenericMultiVector coefficient_series; + + /*! + * Represents a function value. + */ + typedef GenericVector function_value; + + /*! + * Represents a set of function values. + */ + typedef GenericMultiVector function_values; + + /*! + * Constructs a truncated Chebyshev polynomial expansion with \a n + * coefficients to approximate the specified N-dimensional, vector-valued + * function \a f in the interval [\a x1,\a x2] of the independent variable. + * + * The function \a f will be called \a n times and should have the following + * prototype (or equivalent by means of suitable type conversions and/or + * default arguments): + * + * GenericVector<Ty> f( Tx ) + * + * where the length of a returned vector must be equal to \a N. + * + * The expansion process will compute n^2 + n cosines, which may dominate the + * complexity of the process if the function \a f is comparatively fast. + * + * The interval [\a x1,\a x2] must not be empty or insignificant with + * respect to the machine epsilon. If that happens, this constructor will + * throw an appropriate Error exception. The interval bounds can be + * specified in any order, that is, \a x2 can legally be < \a x1; in such + * case the bounds will be implicitly swapped by this constructor. + * + * The interval [\a x1,\a x2] will be also the valid range of evaluation for + * this object, which can be retrieved with LowerBound() and UpperBound(). + * See also the Evaluate() member function. + * + * The length \a n of the polynomial coefficient series should be ≥ 2. If + * \a n ≤ 1, the specified value will be ignored and \a n = 2 will be + * forced. Typically, a relatively large series length should be used, say + * between 30 and 100 coefficients, depending on the rate and amplitude of + * function variations within the fitting interval. The polynomial expansion + * can be further truncated to approximate the function to the desired error + * bound. See the Truncate() and Evaluate() member functions for details. + */ + template + GenericChebyshevFit( F f, Tx x1, Tx x2, int N, int n ) + : dx( Abs( x2 - x1 ) ) + , x0( (x1 + x2)/2 ) + , m( Max( 2, n ), Max( 1, N ) ) + { + PCL_PRECONDITION( N > 0 ) + PCL_PRECONDITION( n > 1 ) + if ( 1 + dx == 1 ) + throw Error( "GenericChebyshevFit: Empty or insignificant function evaluation interval." ); + N = m.Length(); + n = m[0]; + Tx dx2 = dx/2; + function_values y( n, N ); + for ( int j = 0; j < n; ++j ) + y[j] = f( x0 + Cos( Const::pi()*(j + 0.5)/n )*dx2 ); + c = coefficient_series( N, n ); + Ty k = 2.0/n; + for ( int i = 0; i < N; ++i ) + for ( int j = 0; j < n; ++j ) + { + Ty s = Ty( 0 ); + for ( int k = 0; k < n; ++k ) + s += y[k][i] * Cos( Const::pi()*j*(k + 0.5)/n ); + c[i][j] = k*s; + } + } + + /*! + * Constructs a truncated Chebyshev polynomial expansion from the specified + * coefficient series \a ck to approximate a vector-valued function in the + * interval [\a x1,\a x2] of the independent variable. The dimension of the + * approximated function and the coefficient series lengths are acquired + * from the specified container \a ck. + * + * This constructor performs basic coherence and structural integrity checks + * on the specified parameters, and throws the appropriate Error exception + * if it detects any problem. However, the validity of polynomial expansion + * coefficients cannot be verified; ensuring it is the responsibility of the + * caller. + */ + GenericChebyshevFit( const coefficient_series& ck, Tx x1, Tx x2 ) + : dx( Abs( x2 - x1 ) ) + , x0( (x1 + x2)/2 ) + , c( ck ) + , m( int( ck.Length() ) ) + { + if ( 1 + dx == 1 ) + throw Error( "GenericChebyshevFit: Empty or insignificant function evaluation interval." ); + if ( c.IsEmpty() ) + throw Error( "GenericChebyshevFit: Empty polynomial expansion." ); + for ( int i = 0; i < m.Length(); ++i ) + if ( (m[i] = c[i].Length()) < 1 ) + throw Error( "GenericChebyshevFit: Invalid coefficient series for dimension " + String( i ) + '.' ); + } + + /*! + * Default constructor. + * + * Constructs an invalid, uninitialized object that cannot be used to + * perform function evaluations. A default-constructed %GenericChebyshevFit + * object should be assigned with an already initialized instance in order + * to become operative. + * + * \sa IsValid() + */ + GenericChebyshevFit() = default; + + /*! + * Copy constructor. + */ + GenericChebyshevFit( const GenericChebyshevFit& ) = default; + + /*! + * Move constructor. + */ + GenericChebyshevFit( GenericChebyshevFit&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + GenericChebyshevFit& operator =( const GenericChebyshevFit& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GenericChebyshevFit& operator =( GenericChebyshevFit&& ) = default; + + /*! + * Returns true if this object has been correctly initialized and can be + * used to perform function evaluations. Returns false if this is an + * uninitialized, default-constructed object + */ + bool IsValid() const + { + return !c.IsEmpty(); + } + + /*! + * Returns the lower bound of this Chebyshev fit. This is the smallest value + * of the independent variable for which the function has been fitted, and + * hence the smallest value for which this object can be legally evaluated + * for function approximation. + * + * \sa UpperBound() + */ + Tx LowerBound() const + { + return x0 - dx/2; + } + + /*! + * Returns the upper bound of this Chebyshev fit. This is the largest value + * of the independent variable for which the function has been fitted, and + * hence the largest value for which this object can be legally evaluated + * for function approximation. + * + * \sa LowerBound() + */ + Tx UpperBound() const + { + return x0 + dx/2; + } + + /*! + * Returns the number of components in the (vector-valued) dependent + * variable. This is the number of vector components in a fitted or + * approximated function value. + */ + int NumberOfComponents() const + { + return m.Length(); + } + + /*! + * Returns the number of coefficients in the generated Chebyshev polynomial + * expansion for the specified zero-based vector component index \a i. This + * is the number of coefficients that was specified or acquired in a class + * constructor. + * + * \sa TruncatedLength() + */ + int Length( int i = 0 ) const + { + PCL_PRECONDITION( i >= 0 && i < NumberOfComponents() ) + return c[i].Length(); + } + + /*! + * Returns the number of coefficients in the truncated Chebyshev polynomial + * expansion for the specified zero-based vector component index \a i. + * + * If \a i < 0, returns the largest number of polynomial coefficients among + * all vector components. + * + * \sa Truncate(), Length() + */ + int TruncatedLength( int i = -1 ) const + { + PCL_PRECONDITION( i < 0 || i < NumberOfComponents() ) + if ( i < 0 ) + return m.MaxComponent(); + return m[i]; + } + + /*! + * Returns the total number of coefficients in this Chebyshev polynomial + * expansion, or the sum of computed coefficients for all vector components. + * + * \sa NumberOfTruncatedCoefficients() + */ + int NumberOfCoefficients() const + { + int N = 0; + for ( int i = 0; i < NumberOfComponents(); ++i ) + N += c[i].Length(); + return N; + } + + /*! + * Returns the total number of coefficients in the truncated Chebyshev + * polynomial expansion, or the sum of the lengths of the truncated + * coefficients series for all vector components. + * + * \sa NumberOfCoefficients() + */ + int NumberOfTruncatedCoefficients() const + { + return m.Sum(); + } + + /*! + * Returns true iff the Chebyshev polynomial expansion has been truncated + * for the specified zero-based vector component index \a i. + * + * If \a i < 0, returns true iff the expansions have been truncated for all + * vector components. + * + * \sa Truncate(), TruncatedLength() + */ + bool IsTruncated( int i = -1 ) const + { + PCL_PRECONDITION( i < 0 || i < NumberOfComponents() ) + if ( i < 0 ) + return m.MaxComponent() < Length(); + return m[i] < c[i].Length(); + } + + /*! + * Returns an estimate of the maximum error in the truncated Chebyshev + * polynomial expansion for the specified zero-based vector component index + * \a i. + * + * If \a i < 0, returns the largest expansion error estimate among all + * vector components. + * + * \sa Truncate() + */ + Ty TruncationError( int i = -1 ) const + { + PCL_PRECONDITION( i < 0 || i < NumberOfComponents() ) + if ( i < 0 ) + { + int N = NumberOfComponents(); + function_value e( N ); + for ( int j = 0; j < N; ++j ) + e[j] = TruncationError( j ); + return e.MaxComponent(); + } + if ( m[i] < c[i].Length() ) + { + Ty e = Ty( 0 ); + for ( int j = c[i].Length(); --j >= m[i]; ) + e += Abs( c[i][j] ); + return e; + } + return Abs( c[i][c[i].Length()-1] ); + } + + /*! + * Attempts to truncate the Chebyshev polynomial expansion for the specified + * maximum error \a e. Returns \c true iff the expansion could be truncated + * successfully for all vector components of the fitted function. + * + * If n is the length of a fitted polynomial series, this function finds a + * truncated length 1 < m ≤ n such that: + * + * Sum_i( |ci| ) < e + * + * where ci is a polynomial coefficient and the zero-based subindex i is in + * the interval [m,n-1]. + * + * The truncated Chebyshev expansion will approximate the fitted function + * component with a maximum error close to ±|e| within the fitting + * interval. + * + * The optional parameter \a mmin is the minimum allowed length of a + * coefficient series. The value of this parameter is 2 by default, which is + * the minimum number of Chebyshev coefficients in a series expansion. + * Specifying a value greater than 2 can be useful sometimes to impose + * stricter accuracy constraints on the truncated series. + * + * This member function does not remove any polynomial coefficients, so the + * original polynomial expansion remains intact. This means that the fitted + * polynomials can be truncated successively to achieve different error + * bounds, as required. + * + * If the polynomial series cannot be truncated to achieve the required + * tolerance in all function components (that is, if either all coefficients + * for a given component are larger than \a e in absolute value, or n = 2), + * this function forces m = n for the components where the requested + * truncation is not feasible, yielding the original, untruncated Chebyshev + * polynomials for those components. In such case this function returns + * \c false. + */ + bool Truncate( Ty e, int mmin = 2 ) + { + e = Abs( e ); + mmin = Max( 2, mmin ); + int N = NumberOfComponents(); + int tc = 0; + for ( int i = 0; i < N; ++i ) + { + Ty s = Ty( 0 ); + for ( m[i] = c[i].Length(); m[i] > mmin; --m[i] ) + if ( (s += Abs( c[i][m[i]-1] )) >= e ) + break; + if ( m[i] < c[i].Length() ) + ++tc; + } + return tc == N; + } + + /*! + * Returns a reference to the immutable set of Chebyshev polynomial + * expansion coefficients in this object. + */ + const coefficient_series& Coefficients() const + { + return c; + } + + /*! + * Evaluates the truncated Chebyshev polynomial expansion for the specified + * value \a x of the independent variable, and returns the approximated + * function value. + * + * The specified evaluation point \a x must lie within the fitting interval, + * given by LowerBound() and UpperBound(), which was specified as the \a x1 + * and \a x2 arguments when the function was initially fitted by the class + * constructor. For performance reasons, this precondition is not verified + * by this member function. If an out-of-range evaluation point is + * specified, this function will return an unpredictable result. + * + * If the polynomial series has been truncated by calling Truncate(), this + * function evaluates the current truncated Chebyshev expansions instead of + * the original ones. + * + * \sa operator ()() + */ + function_value Evaluate( Tx x ) const + { + PCL_PRECONDITION( x >= LowerBound() ) + PCL_PRECONDITION( x <= UpperBound() ) + const Ty y0 = Ty( 2*(x - x0)/dx ); + const Ty y2 = 2*y0; + function_value y( NumberOfComponents() ); + for ( int i = 0; i < y.Length(); ++i ) + { + Ty d0 = Ty( 0 ); + Ty d1 = Ty( 0 ); + const Ty* k = c[i].At( m[i] ); + for ( int j = m[i]; --j > 0; ) + { + Ty d = d1; + d1 = y2*d1 - d0 + *--k; + d0 = d; + } + y[i] = y0*d1 - d0 + *--k/2; + } + return y; + } + + /*! + * A synonym for Evaluate(). + */ + function_value operator ()( Tx x ) const + { + return Evaluate( x ); + } + + /*! + * Returns a %GenericChebyshevFit object that approximates the derivative of + * the function fitted by this object. + * + * The returned object can be used to evaluate the derivative within the + * fitting interval of this object, defined by LowerBound() and + * UpperBound(). + * + * The returned object will always own Chebyshev polynomials with the length + * of the originally fitted series, \e not of the current truncated lengths, + * if the polynomial expansions have been truncated. + * + * \sa Integral() + */ + GenericChebyshevFit Derivative() const + { + int N = NumberOfComponents(); + GenericChebyshevFit ch1; + ch1.dx = dx; + ch1.x0 = x0; + ch1.c = coefficient_series( N ); + ch1.m = IVector( N ); + for ( int i = 0; i < N; ++i ) + { + int n = Max( 1, c[i].Length()-1 ); + ch1.c[i] = coefficients( n ); + ch1.m[i] = n; + if ( n > 1 ) + { + ch1.c[i][n-1] = 2*n*c[i][n]; + ch1.c[i][n-2] = 2*(n-1)*c[i][n-1]; + for ( int j = n-3; j >= 0; --j ) + ch1.c[i][j] = ch1.c[i][j+2] + 2*(j+1)*c[i][j+1]; + ch1.c[i] *= Ty( 2 )/dx; + } + else + ch1.c[i] = Ty( 0 ); + } + return ch1; + } + + /*! + * Returns a %GenericChebyshevFit object that approximates the indefinite + * integral of the function fitted by this object. + * + * The returned object can be used to evaluate the integral within the + * fitting interval of this object, as defined by LowerBound() and + * UpperBound(). The constant of integration is set to a value such that the + * integral is zero at the lower fitting bound. + * + * The returned object will always own Chebyshev polynomials with the length + * of the originally fitted series, \e not of the current truncated lengths, + * if the polynomial expansions have been truncated. + * + * \sa Derivative() + */ + GenericChebyshevFit Integral() const + { + int N = NumberOfComponents(); + GenericChebyshevFit ch; + ch.dx = dx; + ch.x0 = x0; + ch.c = coefficient_series( N ); + ch.m = IVector( N ); + for ( int i = 0; i < N; ++i ) + { + int n = c[i].Length(); + ch.c[i] = coefficients( n ); + ch.m[i] = n; + if ( n > 1 ) + { + const Ty k = Ty( dx )/4; + Ty s = Ty( 0 ); + int f = 1; + for ( int j = 1; j < n-1; ++j, f = -f ) + s += f*(ch.c[i][j] = k*(c[i][j-1] - c[i][j+1])/j); + ch.c[i][0] = 2*(s + f*(ch.c[i][n-1] = k*c[i][n-2]/(n-1))); + } + else + ch.c[i] = Ty( 0 ); + } + return ch; + } + +private: + + Tx dx; // x2 - x1 + Tx x0; // (x1 + x2)/2 + coefficient_series c; // Chebyshev polynomial coefficients + IVector m; // length of the truncated coefficient series + + friend class GenericScalarChebyshevFit; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericScalarChebyshevFit + * \brief Approximation of scalar-valued functions by Chebyshev polynomial + * expansion. + * + * %GenericScalarChebyshevFit approximates a smooth, scalar-valued function + * f(x) in a given interval [a,b] by expansion with a single truncated series + * of Chebyshev polynomials. %GenericScalarChebyshevFit is a convenient + * specialization of GenericChebyshevFit for functions returning a single + * value; refer to the parent class for complete information. + */ +template +class GenericScalarChebyshevFit : public GenericChebyshevFit +{ +public: + + /*! + * Constructs a truncated Chebyshev polynomial expansion with \a n + * coefficients to approximate the specified N-dimensional, scalar-valued + * function \a f in the interval [\a x1,\a x2] of the independent variable. + * + * See GenericChebyshevFit::GenericChebyshevFit() for detailed information. + */ + template + GenericScalarChebyshevFit( F f, Tx x1, Tx x2, int n ) + : GenericChebyshevFit( [f]( Tx x ){ return GenericVector( f( x ), 1 ); }, x1, x2, 1, n ) + { + } + + /*! + * Default constructor. + * + * Constructs an invalid, uninitialized object that cannot be used to + * perform function evaluations. A default-constructed + * %GenericScalarChebyshevFit object should be assigned with an already + * initialized instance in order to become operative. + * + * \sa IsValid() + */ + GenericScalarChebyshevFit() = default; + + /*! + * Copy constructor. + */ + GenericScalarChebyshevFit( const GenericScalarChebyshevFit& ) = default; + + /*! + * Move constructor. + */ + GenericScalarChebyshevFit( GenericScalarChebyshevFit&& ) = default; + + /*! + * Copy assignment operator. + */ + GenericScalarChebyshevFit& operator =( const GenericScalarChebyshevFit& ) = default; + + /*! + * Move assignment operator. + */ + GenericScalarChebyshevFit& operator =( GenericScalarChebyshevFit&& ) = default; + + /*! + * Returns the number of coefficients in the truncated Chebyshev polynomial + * expansion. + * + * \sa Truncate(), Length() + */ + int TruncatedLength() const + { + return GenericChebyshevFit::TruncatedLength( 0 ); + } + + /*! + * Returns true iff the Chebyshev polynomial expansion has been truncated. + * + * \sa Truncate(), TruncatedLength() + */ + bool IsTruncated() const + { + return GenericChebyshevFit::IsTruncated( 0 ); + } + + /*! + * Returns an estimate of the maximum error in the truncated Chebyshev + * polynomial expansion. + * + * \sa Truncate() + */ + Ty TruncationError() const + { + return GenericChebyshevFit::TruncationError( 0 ); + } + + /*! + * Evaluates the truncated Chebyshev polynomial expansion for the specified + * value \a x of the independent variable, and returns the approximated + * function value. + * + * \sa operator ()() + */ + Ty Evaluate( Tx x ) const + { + return GenericChebyshevFit::Evaluate( x )[0]; + } + + /*! + * A synonym for Evaluate(). + */ + Ty operator ()( Tx x ) const + { + return Evaluate( x ); + } + + /*! + * Returns a %GenericChebyshevFit object that approximates the derivative of + * the function fitted by this object. + * + * See GenericChebyshevFit::Derivative() for detailed information. + * + * \sa Integral() + */ + GenericScalarChebyshevFit Derivative() const + { + return GenericChebyshevFit::Derivative(); + } + + /*! + * Returns a %GenericChebyshevFit object that approximates the indefinite + * integral of the function fitted by this object. + * + * See GenericChebyshevFit::Integral() for detailed information. + * + * \sa Derivative() + */ + GenericScalarChebyshevFit Integral() const + { + return GenericChebyshevFit::Integral(); + } + +private: + + /*! + * \internal + * Private constructor from the base class. + */ + GenericScalarChebyshevFit( const GenericChebyshevFit& T ) + : GenericChebyshevFit() + { + this->dx = T.dx; + this->x0 = T.x0; + this->c = typename GenericChebyshevFit::coefficient_series( 1 ); + this->c[0] = T.c[0]; + this->m = IVector( 1 ); + this->m[0] = T.m[0]; + } +}; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_CHEBYSHEV_FIT_INSTANTIATE + +/*! + * \defgroup chebyshev_fit_types Chebyshev Fit Types + */ + +/*! + * \class pcl::F32ChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 32-bit floating point Chebyshev function approximation. + * + * %F32ChebyshevFit is a template instantiation of GenericChebyshevFit for the + * \c float type. + */ +typedef GenericChebyshevFit F32ChebyshevFit; + +/*! + * \class pcl::FChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 32-bit floating point Chebyshev function approximation. + * + * %FChebyshevFit is an alias for F32ChebyshevFit. It is a template + * instantiation of GenericChebyshevFit for the \c float type. + */ +typedef F32ChebyshevFit FChebyshevFit; + +/*! + * \class pcl::F64ChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point Chebyshev function approximation. + * + * %F64ChebyshevFit is a template instantiation of GenericChebyshevFit for the + * \c double type. + */ +typedef GenericChebyshevFit F64ChebyshevFit; + +/*! + * \class pcl::DChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point Chebyshev function approximation. + * + * %DChebyshevFit is an alias for F64ChebyshevFit. It is a template + * instantiation of GenericChebyshevFit for the \c double type. + */ +typedef F64ChebyshevFit DChebyshevFit; + +/*! + * \class pcl::ChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point Chebyshev function approximation. + * + * %ChebyshevFit is an alias for DChebyshevFit. It is a template instantiation + * of GenericChebyshevFit for the \c double type. + */ +typedef DChebyshevFit ChebyshevFit; + +#ifndef _MSC_VER + +/*! + * \class pcl::F80ChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 80-bit extended precision floating point Chebyshev function + * approximation. + * + * %F80ChebyshevFit is a template instantiation of GenericChebyshevFit for the + * \c long \c double type. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef GenericChebyshevFit F80ChebyshevFit; + +/*! + * \class pcl::LDChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 80-bit extended precision floating point Chebyshev function + * approximation. + * + * %LDChebyshevFit is an alias for F80ChebyshevFit. It is a template + * instantiation of GenericChebyshevFit for the \c long \c double type. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef F80ChebyshevFit LDChebyshevFit; + +#endif // !_MSC_VER + +/*! + * \class pcl::F32ScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 32-bit floating point scalar Chebyshev function approximation. + * + * %F32ScalarChebyshevFit is a template instantiation of + * GenericScalarChebyshevFit for the \c float type. + */ +typedef GenericScalarChebyshevFit F32ScalarChebyshevFit; + +/*! + * \class pcl::FScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 32-bit floating point scalar Chebyshev function approximation. + * + * %FScalarChebyshevFit is an alias for F32ScalarChebyshevFit. It is a template + * instantiation of GenericScalarChebyshevFit for the \c float type. + */ +typedef F32ScalarChebyshevFit FScalarChebyshevFit; + +/*! + * \class pcl::F64ScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point scalar Chebyshev function approximation. + * + * %F64ScalarChebyshevFit is a template instantiation of + * GenericScalarChebyshevFit for the \c double type. + */ +typedef GenericScalarChebyshevFit F64ScalarChebyshevFit; + +/*! + * \class pcl::DScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point scalar Chebyshev function approximation. + * + * %DScalarChebyshevFit is an alias for F64ScalarChebyshevFit. It is a template + * instantiation of GenericScalarChebyshevFit for the \c double type. + */ +typedef F64ScalarChebyshevFit DScalarChebyshevFit; + +/*! + * \class pcl::ScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 64-bit floating point scalar Chebyshev function approximation. + * + * %ScalarChebyshevFit is an alias for DScalarChebyshevFit. It is a template + * instantiation of GenericScalarChebyshevFit for the \c double type. + */ +typedef DScalarChebyshevFit ScalarChebyshevFit; + +#ifndef _MSC_VER + +/*! + * \class pcl::F80ScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 80-bit extended precision floating point scalar Chebyshev function + * approximation. + * + * %F80ScalarChebyshevFit is a template instantiation of + * GenericScalarChebyshevFit for the \c long \c double type. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef GenericScalarChebyshevFit F80ScalarChebyshevFit; + +/*! + * \class pcl::LDScalarChebyshevFit + * \ingroup chebyshev_fit_types + * \brief 80-bit extended precision floating point scalar Chebyshev function + * approximation. + * + * %LDScalarChebyshevFit is an alias for F80ScalarChebyshevFit. It is a + * template instantiation of GenericScalarChebyshevFit for the \c long + * \c double type. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef F80ScalarChebyshevFit LDScalarChebyshevFit; + +#endif // !_MSC_VER + +#endif // !__PCL_NO_CHEBYSHEV_FIT_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ChebyshevFit_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ChebyshevFit.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CheckBox.h b/3rdparty/include/pcl/CheckBox.h new file mode 100644 index 0000000..1287c3c --- /dev/null +++ b/3rdparty/include/pcl/CheckBox.h @@ -0,0 +1,129 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CheckBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CheckBox_h +#define __PCL_CheckBox_h + +/// \file pcl/CheckBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class CheckBox + * \brief Client-side interface to a PixInsight %CheckBox control + * + * ### TODO: Write a detailed description for %CheckBox + */ +class PCL_CLASS CheckBox : public Button +{ +public: + + /*! + * Constructs a %CheckBox with the specified \a text, as a child control of + * \a parent. + */ + CheckBox( const String& text = String(), Control& parent = Control::Null() ); + + /*! + * Destroys a %CheckBox control. + */ + virtual ~CheckBox() + { + } + + /*! + * Returns \c false, since check boxes are not pushable buttons. + */ + bool IsPushable() const override + { + return false; + } + + /*! + * Returns \c true, since check boxes are checkable buttons. + */ + bool IsCheckable() const override + { + return true; + } + + /*! + * Returns \c true only if this check box can have three states. + */ + bool IsTristateMode() const; + + /*! + * Enables or disables \e tristate \e mode. In tristate mode, a check box + * can have three states: checked, unchecked, and \e semi-checked (also + * called \e third \e state). + */ + void SetTristateMode( bool = true ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_CheckBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CheckBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Checksum.h b/3rdparty/include/pcl/Checksum.h new file mode 100644 index 0000000..451ed3f --- /dev/null +++ b/3rdparty/include/pcl/Checksum.h @@ -0,0 +1,161 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Checksum.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Checksum_h +#define __PCL_Checksum_h + +/// \file pcl/Checksum.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup checksum_functions Checksum Calculation Functions + */ + +/*! + * Returns the standard checksum value calculated for a data sequence. + * The returned value is the total number of bits set in the sequence of input + * data bytes. + * + * \param data Address of the first byte in the data sequence. + * \param length Length in bytes of the data sequence. + * + * \ingroup checksum_functions + * \sa Checksum( const C& ) + */ +size_type PCL_FUNC inline Checksum( const void* data, size_type length ) +{ + PCL_PRECONDITION( data != nullptr ) + size_type S = 0; + for ( const uint8* p = (const uint8*)data, * p1 = p+length; p < p1; ++p ) + { + uint8 b = *p; + if ( b & 0x01 ) ++S; + if ( b & 0x02 ) ++S; + if ( b & 0x04 ) ++S; + if ( b & 0x08 ) ++S; + if ( b & 0x10 ) ++S; + if ( b & 0x20 ) ++S; + if ( b & 0x40 ) ++S; + if ( b & 0x80 ) ++S; + } + return S; +} + +/*! + * Returns the standard checksum value for a container. + * + * \param data Reference to a container whose standard checksum will be + * calculated. The checksum number will be generated for the + * current data bytes in this container instance. + * + * \ingroup checksum_functions + * \sa Checksum( const void*, size_type ) + */ +template inline +uint32 Checksum( const C& data ) +{ + return Checksum( data.Begin(), sizeof( *(data.Begin()) )*data.Length() ); +} + +/*! + * Returns the CRC-32 error-detecting code calculated for a data sequence. + * + * \param data Address of the first byte in the data sequence. + * \param length Length in bytes of the data sequence. + * + * \b References + * + * CRC calculation routine based on original code by Michael Barr. The employed + * code requires the following copyright notice: + * + * Copyright (c) 2000 by Michael Barr. This software is placed into the + * public domain and may be used for any purpose. However, this notice must + * not be changed or removed and no warranty is either expressed or implied by + * its publication or distribution. + * + * \ingroup checksum_functions + * \sa CRC32( const C& ) + */ +uint32 PCL_FUNC CRC32( const void* data, size_type length ); + +/*! + * Returns the CRC-32 error-detecting code for a container. + * + * \param data Reference to a container whose CRC-32 checksum will be + * calculated. The checksum code will be generated for the + * current data bytes in this container instance. + * + * \ingroup checksum_functions + * \sa CRC32( const void*, size_type ) + */ +template inline +uint32 CRC32( const C& data ) +{ + return CRC32( data.Begin(), sizeof( *(data.Begin()) )*data.Length() ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Checksum_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Checksum.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CodeEditor.h b/3rdparty/include/pcl/CodeEditor.h new file mode 100644 index 0000000..d44dc29 --- /dev/null +++ b/3rdparty/include/pcl/CodeEditor.h @@ -0,0 +1,894 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CodeEditor.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CodeEditor_h +#define __PCL_CodeEditor_h + +/// \file pcl/CodeEditor.h + +#include + +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FindMode + * \brief Flags to control text find and replacement operations. + * + * + * + * + * + * + * + * + * + *
FindMode::RegExp Search with a regular expression instead of a literal substring.
FindMode::Backward Search toward the beginning of the document.
FindMode::CaseSensitive Perform a case-sensitive search.
FindMode::WholeWords Search for whole words only.
FindMode::SelectionOnly Search and replace within the current text selection only
FindMode::Incremental Perform an incremental text find operation. The search begins after a previously matched text block.
FindMode::Default The default text find mode, equal to FindMode::CaseSensitive|FindMode::WholeWords.
+ */ +namespace FindMode +{ + enum mask_type + { + RegExp = 0x00000001, // Search with a regular expression + Backward = 0x00000010, // Search toward the beginning of text + CaseSensitive = 0x00000020, // Case-sensitive search + WholeWords = 0x00000040, // Search for whole words + SelectionOnly = 0x00000100, // Replace within the current selection + Incremental = 0x00000200, // Perform an incremental find operation + Default = CaseSensitive|WholeWords + }; +} + +/*! + * A combination of text find and replacement mode flags. + */ +typedef Flags FindModes; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class CodeEditor + * \brief Client-side interface to a PixInsight %CodeEditor control. + * + * ### TODO: Write a detailed description for %CodeEditor. + */ +class PCL_CLASS CodeEditor : public Control +{ +public: + + /*! + * Constructs a %CodeEditor control. + * + * \param parent The parent control of this object. The default value is + * a null control. + */ + CodeEditor( Control& parent = Control::Null() ); + + /*! + * Destroys a %CodeEditor control. + */ + virtual ~CodeEditor() + { + } + + /*! + * Returns a reference to a line numbers control for this code + * editor. + * + * A line numbers control provides a visual index of the text lines + * currently displayed by a code editor. Typically, a code editor and its + * line numbers control are packed side by side in a HorizontalSizer. + */ + Control& LineNumbersControl(); + + /*! + * Returns the absolute file path associated with this code editor, or an + * empty string if this object has not been associated with a file. + */ + String FilePath() const; + + /*! + * Sets the file path associated with this code editor. + * + * If the specified \a path includes a file name suffix (also known as file + * name \e extension), the control will use it to identify a programming + * language to perform automatic syntax highlighting of the text in the + * editor. Currently the following file suffixes and source code languages + * are supported: + * + * + * + * + * + * + * + * + * + *
.js .jsh JavaScript source files
.scp Command-line script files
.cpp .h .cxx .hpp .hxx .c .cc C/C++ source files
.py Python source files
.xml .xhtml .html .xosm .xpsm (among others) XML source files
.pidoc PixInsight documentation source files
.pm .pmath PixelMath source files
+ * + * Unrecognized (or absent) file suffixes effectively disable the automatic + * syntax highlighting feature. The default value of this parameter is an + * empty string. + */ + void SetFilePath( const String& path ); + + /*! + * Returns the current text in this code editor in UTF-16 format. + */ + String Text() const; + + /*! + * Sets the current text in this code editor in UTF-16 format. + */ + void SetText( const String& text ); + + /*! + * Returns an encoded 8-bit representation of the text in this code editor. + * + * \param encoding The desired text encoding. Currently only the "UTF-8" + * and "ISO-8859-1" encodings are supported. The default + * value is "UTF-8". + */ + IsoString EncodedText( const IsoString& encoding = "UTF-8" ) const; + + /*! + * Returns the text in this code editor encoded in UTF-8 format. + * + * This is a convenience function, equivalent to: + * + * \code EncodedText( "UTF-8" ); \endcode + */ + IsoString TextUTF8() const + { + return EncodedText( "UTF-8" ); + } + + /*! + * Returns the text in this code editor encoded in ISO 8859-1 format. + * + * This is a convenience function, equivalent to: + * + * \code EncodedText( "ISO-8859-1" ); \endcode + */ + IsoString TextISO88591() const + { + return EncodedText( "ISO-8859-1" ); + } + + /*! + * Sets the current text in this code editor, encoded in an 8-bit format. + * + * \param text The encoded 8-bit text. + * + * \param encoding The text encoding. Currently only the "UTF-8" and + * "ISO-8859-1" encodings are supported. The default value + * is "UTF-8". + */ + void SetEncodedText( const IsoString& text, const IsoString& encoding = "UTF-8" ); + + /*! + * Sets the current text in this code editor, encoded in UTF-8 format. + * + * This is a convenience function, equivalent to: + * + * \code SetEncodedText( text, "UTF-8" ); \endcode + */ + void SetTextUTF8( const IsoString& text ) + { + SetEncodedText( text, "UTF-8" ); + } + + /*! + * Sets the current text in this code editor, encoded in ISO 8859-1 format. + * + * This is a convenience function, equivalent to: + * + * \code SetEncodedText( text, "ISO-8859-1" ); \endcode + */ + void SetTextISO88591( const IsoString& text ) + { + SetEncodedText( text, "ISO-8859-1" ); + } + + /*! + * Clears all the text in this code editor. Also clears all undo/redo + * buffers, so this action is irreversible. + */ + void ClearText(); + + /*! + * Returns true iff this code editor is in read-only mode. A + * read-only editor does not allow any command that can modify its text + * contents as a result of a direct user interaction. The text can only be + * changed programmatically for a read-only code editor. + */ + bool IsReadOnly() const; + + /*! + * Enables the read-only mode for this code editor. A read-only editor does + * not allow any command that can modify its text contents as a result of a + * direct user interaction. The text can only be changed programmatically + * for a read-only code editor. + * + * \param readOnly Whether to enable or disable the read-only mode for + * this code editor. + */ + void SetReadOnly( bool readOnly = true ); + + /*! + * Writes the text in this code editor to the specified file, encoded in an + * 8-bit format. + * + * \param filePath Path to the destination file. + * + * \param encoding The desired text encoding. Currently only the "UTF-8" + * and "ISO-8859-1" encodings are supported. The default + * value is "UTF-8". + * + * Returns true if the file was successfully written; false in the event of + * error. + * + * \warning Upon successful completion, this function will overwrite an + * existing file at the specified path, whose previous contents will be + * lost. + */ + bool Save( const String& filePath, const IsoString& encoding = "UTF-8" ); + + /*! + * Writes the text in this code editor to the specified file, encoded in + * UTF-8 format. + * + * This is a convenience function, equivalent to: + * + * \code Save( filePath, "UTF-8" ); \endcode + */ + bool SaveUTF8( const String& filePath ) + { + return Save( filePath, "UTF-8" ); + } + + /*! + * Writes the text in this code editor to the specified file, encoded in + * ISO 8859-1 format. + * + * This is a convenience function, equivalent to: + * + * \code Save( filePath, "ISO-8859-1" ); \endcode + */ + bool SaveISO88591( const String& filePath ) + { + return Save( filePath, "ISO-8859-1" ); + } + + /*! + * Reads an encoded 8-bit text file and loads it in this code editor. + * + * \param filePath Path to the source file. + * + * \param encoding The text encoding. Currently only the "UTF-8" and + * "ISO-8859-1" encodings are supported. The default + * value is "UTF-8". + * + * Returns true if the file was successfully read; false in the event of + * error. + */ + bool Load( const String& filePath, const IsoString& encoding = "UTF-8" ); + + /*! + * Reads a text file encoded in UTF-8 format, and loads it in this code + * editor. + * + * This is a convenience function, equivalent to: + * + * \code Load( filePath, "UTF-8" ); \endcode + */ + bool LoadUTF8( const String& filePath ) + { + return Load( filePath, "UTF-8" ); + } + + /*! + * Reads a text file encoded in ISO 8859-1 format, and loads it in this code + * editor. + * + * This is a convenience function, equivalent to: + * + * \code Load( filePath, "ISO-8859-1" ); \endcode + */ + bool LoadISO88591( const String& filePath ) + { + return Load( filePath, "ISO-8859-1" ); + } + + /*! + * Returns the number of text lines (including empty lines) in this code + * editor. + */ + int NumberOfLines() const; + + /*! + * Returns the total number of characters in the current text of this code + * editor. + */ + int NumberOfCharacters() const; + + /*! + * Returns the current cursor position in visual coordinates. The returned + * object stores the current line and column of the cursor in its Point::y + * and Point::x public data members, respectively. + * + * Line and column coordinates are counted from zero. Line numbers range + * from zero to the number of existing text lines minus one. There is no + * specific limit for the number of text characters in a text line. + */ + Point CursorPosition() const; + + /*! + * Returns the line number of the current cursor position. + */ + int CursorLine() const + { + return CursorPosition().y; + } + + /*! + * Returns the column number of the current cursor position. + */ + int CursorColumn() const + { + return CursorPosition().x; + } + + /*! + * Sets the current cursor position in this code editor to the specified + * \a line and \a column. See CursorPosition() for more information on + * visual text coordinates. + */ + void SetCursorPosition( int line, int column ); + + /*! + * Sets the current cursor position in this code editor through the + * coordinates of a Point object. The new cursor line will be set to + * \a pos.y and the new cursor column to \a pos.x, respectively. + */ + void SetCursorPosition( const Point& pos ) + { + SetCursorPosition( pos.y, pos.x ); + } + + /*! + * Returns true iff this code editor is in insert text mode. Returns + * false if the editor is in replace text mode. + * + * In insert mode, newly generated text by direct user interaction is + * inserted at the current cursor location. In replace mode, newly generated + * text replaces existing characters starting at the current cursor + * location. The insert text mode is always enabled by default. + */ + bool IsInsertMode() const; + + /*! + * Enables the insert text mode for this code editor. + * + * \param insert Whether to enable the insert text mode (if true) or the + * replace text mode (if false). The default value is true. + */ + void SetInsertMode( bool insert = true ); + + /*! + * Enables the replace text mode for this code editor. + * + * \param replace Whether to enable the replace text mode (if true) or the + * insert text mode (if false). The default value is true. + */ + void SetReplaceMode( bool replace = true ) + { + SetInsertMode( !replace ); + } + + /*! + * Returns true iff this code editor is in block selection mode; + * false if it is in line selection mode. + * + * In block selection mode, the user can select rectangular areas of text + * across multiple text lines. In line selection mode, text + * selections can only include entire text lines except for the first and + * last lines in a selection. The line selection mode is always enabled by + * default. + */ + bool IsBlockSelectionMode() const; + + /*! + * Enables the block selection mode for this code editor. + * + * \param blockMode Whether to enable the block selection mode (if true) or + * the line selection mode (if false). The default value + * is true. + */ + void SetBlockSelectionMode( bool blockMode = true ); + + /*! + * Enables the line selection mode for this code editor. + * + * \param lineMode Whether to enable the line selection mode (if true) or + * the block selection mode (if false). The default value + * is true. + */ + void SetLineSelectionMode( bool lineMode = true ) + { + SetBlockSelectionMode( !lineMode ); + } + + /*! + * Returns true iff this code editor is in dynamic word wrap mode. + * + * In dynamic word wrap mode, long text lines extending beyond the visible + * width of the editor's viewport are automatically truncated and continued + * on successive editor lines, so that the user can always see the entire + * contents of all text lines, and a horizontal scroll bar is never shown. + * + * When the dynamic word wrap mode is disabled, long text lines are never + * truncated and the editor shows a horizontal scroll bar when necessary. + * The dynamic word wrap mode is always disabled by default. + */ + bool IsDynamicWordWrapMode() const; + + /*! + * Enables the dynamic word wrap mode for this code editor. + * + * \param wrapMode Whether to enable the dynamic word wrap mode. + */ + void SetDynamicWordWrapMode( bool wrapMode = true ); + + /*! + * Returns the number of \e undo steps available for this code editor. + */ + int UndoSteps() const; + + /*! + * Returns the number of \e redo steps available for this code editor. + */ + int RedoSteps() const; + + /*! + * Returns true iff this code editor has a text selection defined. + */ + bool HasSelection() const; + + /*! + * Returns the visual coordinates of the current selection in this code + * editor. The selection coordinates are stored in the returned rectangle as + * follows: + * + * \li Rect::y0 - Starting line of the current text selection. + * \li Rect::x0 - Starting column of the current text selection. + * \li Rect::y1 - Ending line of the current text selection. + * \li Rect::x1 - Ending column of the current text selection. + */ + Rect Selection() const; + + /*! + * Sets a new text selection defined by its visual coordinates. + * + * \param fromLine Starting line of the new text selection. + * \param fromCol Starting column of the new text selection. + * \param toLine Ending line of the new text selection. + * \param toCol Ending column of the new text selection. + */ + void SetSelection( int fromLine, int fromCol, int toLine, int toCol ); + + /*! + * Sets a new text selection defined by its visual coordinates. + * + * This is a convenience function, equivalent to: + * + * \code SetSelection( r.y0, r.x0, r.y1, r.x1 ); \endcode + */ + void SetSelection( const Rect& r ) + { + SetSelection( r.y0, r.x0, r.y1, r.x1 ); + } + + /*! + * Returns the currently selected text in this code editor, or an empty + * string if this editor has no selection currently defined. + */ + String SelectedText() const; + + /*! + * Inserts the specified \a text at the current cursor location. + * + * If there is a selection defined, the selected text is replaced with the + * inserted \a text. + */ + void InsertText( const String& text ); + + /*! + * Undoes the last editor action. If no action can be undone, this function + * has no effect. + */ + void Undo(); + + /*! + * Redoes the last editor action. If no action can be redone, this function + * has no effect. + */ + void Redo(); + + /*! + * Copies the current text selection to the clipboard and removes the + * selected text. If no selection is defined, this function has no effect. + */ + void Cut(); + + /*! + * Copies the current text selection to the clipboard. If no selection is + * defined, this function has no effect. + */ + void Copy(); + + /*! + * Inserts the contents of the clipboard at the current cursor location. If + * the clipboard is empty, or if its contents cannot be converted to plain + * text, this function has no effect. + */ + void Paste(); + + /*! + * Removes the currently selected text. If there is no text selection + * defined, this function has no effect. + */ + void Delete(); + + /*! + * Selects all the text in this code editor. + */ + void SelectAll(); + + /*! + * Clears the current text selection, if any. This function simply unselects + * the text; it does not remove the selected text. + */ + void Unselect(); + + /*! + * If the cursor points to a bracket or parenthesis character, look for a + * matching pair and move the cursor to the corresponding location. + * + * Returns true iff a matching pair could be found. If there is no bracket or + * parenthesis at the current cursor location, or if a matched pair couldn't + * be found, this function returns false and the cursor is not moved. + */ + bool GotoMatchedParenthesis(); + + /*! + * Highlights all occurrences of a literal text string or a regular + * expression. + * + * \param toFind The text or regular expression to search for, depending on + * the specified \a mode flags. + * + * \param mode An OR'ed combination of flags to control the text find + * operation. Valid flags are enumerated in the pcl::FindMode + * namespace. + * + * The operation takes place on the whole text document, ignoring the + * FindMode::Backward and FindMode::SelectionOnly flags. Returns the number + * of matches found. + */ + int HighlightAllMatches( const String& toFind, FindModes mode ); + + /*! + * Clears all text highlightings. This function does not remove the + * highlighted text; it simply clears the visual highlight indications. + */ + void ClearMatches(); + + /*! + * Finds an occurrence of a literal text string or a regular expression. + * + * \param toFind The text or regular expression to search for, depending on + * the specified \a mode flags. + * + * \param mode An OR'ed combination of flags to control the text find + * operation. Valid flags are enumerated in the pcl::FindMode + * namespace. + * + * Returns true iff a match was found. + */ + bool Find( const String& toFind, FindModes mode ); + + /*! + * Replaces the current selection with the specified text. + * + * \param replaceWith The text that will replace the current selection. + * Can be an empty string (to delete the current + * selection). + * + * If there is some text selected in this editor, this function returns + * true after performing the replacement operation. If there is no text + * currently selected, this function is ignored and false is returned. + */ + bool ReplaceSelection( const String& replaceWith ); + + /*! + * Replaces all occurrences of a literal text string or a regular + * expression with the specified text. + * + * \param toFind The text or regular expression to search for, depending on + * the specified \a mode flags. + * + * \param replaceWith The text that will replace all matches found. Can be + * an empty string (to delete all matched occurrences). + * + * \param mode An OR'ed combination of flags to control the text find and + * replace operation. Valid flags are enumerated in the + * pcl::FindMode namespace. + * + * Returns the number of matches found and replaced. + * + */ + int ReplaceAll( const String& toFind, const String& replaceWith, FindModes mode ); + + /*! + * \defgroup code_editor_event_handlers CodeEditor Event Handlers + */ + + /*! + * Defines the prototype of an editor event handler. + * + * An editor event is generated when a %CodeEditor instance changes its + * state or contents due to direct user interaction. + * + * \param sender The control that sends an editor event. + * + * \ingroup code_editor_event_handlers + */ + typedef void (Control::*editor_event_handler)( CodeEditor& sender ); + + /*! + * Defines the prototype of a cursor event handler. + * + * A cursor event is generated when the cursor position changes in a + * %CodeEditor instance due to direct user interaction. + * + * \param sender The control that sends a cursor event. + * + * \param line Line number of the new cursor position (>= 0). + * + * \param col Column number of the new cursor position (>= 0). + * + * \ingroup code_editor_event_handlers + */ + typedef void (Control::*cursor_event_handler)( CodeEditor& sender, int line, int col ); + + /*! + * Defines the prototype of a selection event handler. + * + * A selection event is generated when the text selection changes in a + * %CodeEditor instance due to direct user interaction. + * + * \param sender The control that sends a selection event. + * + * \param fromLine Line number of the starting position of the new text + * selection. + * + * \param fromCol Column number of the starting position of the new text + * selection. + * + * \param toLine Line number of the ending position of the new text + * selection. + * + * \param toCol Column number of the ending position of the new text + * selection. + * + * \ingroup code_editor_event_handlers + */ + typedef void (Control::*selection_event_handler)( CodeEditor& sender, int fromLine, int fromCol, int toLine, int toCol ); + + /*! + * Defines the prototype of a state event handler. + * + * A state event is generated when a Boolean property changes in a + * %CodeEditor instance due to direct user interaction. + * + * \param sender The control that sends a cursor event. + * + * \param state New property state. + * + * \ingroup code_editor_event_handlers + */ + typedef void (Control::*state_event_handler)( CodeEditor& sender, bool state ); + + /*! + * Sets the handler for text updated events generated by this code + * editor. A text updated event is generated each time the text changes in + * this editor as a result of a direct user interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive text updated events from + * this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnTextUpdated( editor_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for cursor position updated events generated by + * this code editor. A cursor position updated event is generated each time + * the text cursor (also known as \e caret) moves in this editor as a result + * of a direct user interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive cursor position updated + * events from this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnCursorPositionUpdated( cursor_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for selection updated events generated by this + * code editor. A selection updated event is generated each time the text + * selection is changed in this editor as a result of a direct user + * interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive selection updated events + * from this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnSelectionUpdated( selection_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for overwrite mode updated events generated by + * this code editor. An overwrite mode updated event is generated each time + * the overwrite mode is enabled or disabled in this editor (i.e., from + * overwrite mode to replace mode or vice-versa) as a result of a direct + * user interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive overwrite mode updated + * events from this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnOverwriteModeUpdated( state_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for selection mode updated events generated by + * this code editor. A selection mode updated event is generated each time + * the selection mode is changed in this editor (i.e., from line selection + * mode to block selection mode or vice-versa) as a result of a direct user + * interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive selection mode updated + * events from this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnSelectionModeUpdated( state_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for dynamic word wrap mode updated events + * generated by this code editor. A dynamic word wrap mode updated event is + * generated each time the dynamic word wrap mode is enabled or disabled in + * this editor as a result of a direct user interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive dynamic word wrap mode + * updated events from this code editor. + * + * \ingroup code_editor_event_handlers + */ + void OnDynamicWordWrapModeUpdated( state_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + editor_event_handler onTextUpdated = nullptr; + cursor_event_handler onCursorPositionUpdated = nullptr; + selection_event_handler onSelectionUpdated = nullptr; + state_event_handler onOverwriteModeUpdated = nullptr; + state_event_handler onSelectionModeUpdated = nullptr; + state_event_handler onDynamicWordWrapModeUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + Control m_lineNumbers; + + friend class CodeEditorEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_CodeEditor_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CodeEditor.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Color.h b/3rdparty/include/pcl/Color.h new file mode 100644 index 0000000..bd7f510 --- /dev/null +++ b/3rdparty/include/pcl/Color.h @@ -0,0 +1,412 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Color.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Color_h +#define __PCL_Color_h + +/// \file pcl/Color.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup rgba_utility_functions RGBA Color Utility Functions + */ + +/*! + * Defines a 32-bit RGBA pixel value. + * + * A %RGBA pixel value is encoded as follows: + * + * AARRGGBB + * + * where each letter represents a 4-bit hexadecimal digit (from 0 to F). Each + * 8-bit pair represents a pixel component in the range from 0 to 255: + * + * + * + * + * + * + *
AA Alpha value, or pixel transparency: + * 0 means completely transparent, 255 corresponds to an + * opaque pixel.
RR Red pixel color component.
GG Green pixel color component.
BB Blue pixel color component.
+ * + * \ingroup rgba_utility_functions + */ +typedef uint32 RGBA; + +/*! + * Returns the alpha (transparency) component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline uint8 Alpha( RGBA rgba ) +{ + return uint8( rgba >> 24 ); +} + +/*! + * Returns the red color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline uint8 Red( RGBA rgba ) +{ + return uint8( rgba >> 16 ); +} + +/*! + * Returns the green color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline uint8 Green( RGBA rgba ) +{ + return uint8( rgba >> 8 ); +} + +/*! + * Returns the blue color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline uint8 Blue( RGBA rgba ) +{ + return uint8( rgba ); +} + +/*! + * Clears (sets to zero) the alpha (transparency) component of an RGBA pixel + * value. + * + * \ingroup rgba_utility_functions + */ +inline void ClearAlpha( RGBA& rgba ) +{ + rgba &= 0x00fffffful; +} + +/*! + * Clears (sets to zero) the red color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void ClearRed( RGBA& rgba ) +{ + rgba &= 0xff00fffful; +} + +/*! + * Clears (sets to zero) the green color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void ClearGreen( RGBA& rgba ) +{ + rgba &= 0xffff00fful; +} + +/*! + * Clears (sets to zero) the blue color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void ClearBlue( RGBA& rgba ) +{ + rgba &= 0xffffff00ul; +} + +/*! + * Sets the alpha (transparency) component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void SetAlpha( RGBA& rgba, uint8 a ) +{ + ClearAlpha( rgba ); rgba |= uint32( a ) << 24; +} + +/*! + * Sets the red color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void SetRed( RGBA& rgba, uint8 r ) +{ + ClearRed( rgba ); rgba |= uint32( r ) << 16; +} + +/*! + * Sets the green color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void SetGreen( RGBA& rgba, uint8 g ) +{ + ClearGreen( rgba ); rgba |= uint32( g ) << 8; +} + +/*! + * Sets the blue color component of an RGBA pixel value. + * + * \ingroup rgba_utility_functions + */ +inline void SetBlue( RGBA& rgba, uint8 b ) +{ + ClearBlue( rgba ); rgba |= uint32( b ); +} + +/*! + * Returns an RGBA pixel value for the specified separate alpha and color + * component integer values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * \param a Alpha (transparency) + * + * All components must be in the range [0,255]. + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( int r, int g, int b, int a ) +{ + return (uint32( a ) << 24) | (uint32( r ) << 16) | (uint32( g ) << 8) | uint32( b ); +} + +/*! + * Returns an opaque RGBA pixel value for the specified separate color + * component integer values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * + * All components must be in the range [0,255]. The returned RGBA value has its + * alpha component equal to 255 (opaque). + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( int r, int g, int b ) +{ + return 0xff000000ul | (uint32( r ) << 16) | (uint32( g ) << 8) | uint32( b ); +} + +/*! + * Returns an RGBA pixel value for the specified separate alpha and color + * component real values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * \param a Alpha (transparency) + * + * All components must be in the normalized range [0,1]. + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( double r, double g, double b, double a ) +{ + return RGBAColor( RoundInt( 255*r ), RoundInt( 255*g ), RoundInt( 255*b ), RoundInt( 255*a ) ); +} + +/*! + * Returns an RGBA pixel value for the specified separate alpha and color + * component real values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * \param a Alpha (transparency) + * + * All components must be in the normalized range [0,1]. + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( float r, float g, float b, float a ) +{ + return RGBAColor( double( r ), double( g ), double( b ), double( a ) ); +} + +/*! + * Returns an opaque RGBA pixel value for the specified separate color + * component real values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * + * All components must be in the normalized range [0,1]. The returned RGBA + * value has its alpha component equal to 255 (opaque). + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( double r, double g, double b ) +{ + return RGBAColor( RoundInt( 255*r ), RoundInt( 255*g ), RoundInt( 255*b ) ); +} + +/*! + * Returns an opaque RGBA pixel value for the specified separate color + * component real values. + * + * \param r Red color component + * \param g Green color component + * \param b Blue color component + * + * All components must be in the normalized range [0,1]. The returned RGBA + * value has its alpha component equal to 255 (opaque). + * + * \ingroup rgba_utility_functions + */ +inline RGBA RGBAColor( float r, float g, float b ) +{ + return RGBAColor( double( r ), double( g ), double( b ) ); +} + +/*! + * Returns an RGBA pixel value corresponding to a CSS color specification + * string. + * + * The string can be an hex-encoded color value in one of two valid formats: + * + * "#RRGGBB" + * "#RRGGBBAA" + * + * or a valid CSS color name like "white", "black", "red", "orange", and so on. + * + * CSS color names are case-insensitive, and are returned with their alpha + * components equal to 0xFF (opaque), except "transparent", which is returned + * as 0x00000000 (also known as "transparent black"). + * + * If the string cannot be converted to a valid color value, this function + * silently ignores the error and returns zero. + * + * \ingroup rgba_utility_functions + */ +RGBA PCL_FUNC RGBAColor( const IsoString& colorNameOrHex ); + +inline RGBA RGBAColor( const IsoString::ustring_base& colorNameOrHex ) +{ + return RGBAColor( IsoString( colorNameOrHex ) ); +} + +/*! + * An alias to RGBAColor( const IsoString& ). + * + * \ingroup rgba_utility_functions + */ +inline RGBA StringToRGBAColor( const IsoString& colorNameOrHex ) +{ + return RGBAColor( colorNameOrHex ); +} + +inline RGBA StringToRGBAColor( const IsoString::ustring_base& colorNameOrHex ) +{ + return StringToRGBAColor( IsoString( colorNameOrHex ) ); +} + +/*! + * Returns an hex-encoded string representation of an RGBA pixel value, + * ignoring the alpha component. + * + * The returned string has the format "#RRGGBB". + * + * \ingroup rgba_utility_functions + */ +inline IsoString RGBColorToHexString( RGBA c ) +{ + IsoString s; + s.Format( "#%02X%02X%02X", Red( c ), Green( c ), Blue( c ) ); + return s; +} + +/*! + * Returns an hex-encoded string representation of an RGBA pixel value. + * + * The returned string has the format "#RRGGBBAA". + * + * \ingroup rgba_utility_functions + */ +inline IsoString RGBAColorToHexString( RGBA c ) +{ + IsoString s; + s.Format( "#%02X%02X%02X%02X", Red( c ), Green( c ), Blue( c ), Alpha( c ) ); + return s; +} + +/*! + * Returns the CSS color name corresponding to an RGBA pixel value. + * + * The alpha component is ignored, except for the special value 0x00000000, + * which is returned as "Transparent". If the value does not have a CSS named + * color counterpart, this function returns an empty string. + * + * \ingroup rgba_utility_functions + */ +IsoString PCL_FUNC CSSColorName( RGBA ); + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Color_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Color.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ColorComboBox.h b/3rdparty/include/pcl/ColorComboBox.h new file mode 100644 index 0000000..f10e15c --- /dev/null +++ b/3rdparty/include/pcl/ColorComboBox.h @@ -0,0 +1,269 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ColorComboBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ColorComboBox_h +#define __PCL_ColorComboBox_h + +/// \file pcl/ColorComboBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ColorComboBox + * \brief A %ComboBox descendant class to select RGB colors. + * + * %ColorComboBox is a utility class that provides a simple list with the full + * set of CSS3 standard colors. This includes 143 %ComboBox items that are + * automatically shared by all existing %ColorComboBox instances. Thanks to + * this implicit sharing mechanism, a module can define a large number of + * %ColorComboBox controls without consuming too much resources on any + * supported platform. + * + * The list of items corresponding to CSS3 colors is sorted by \e hue value (in + * the HSV or HSI color ordering systems). This makes it much easier the task + * of selecting colors since similar hues are grouped visually. + * + * In addition to CSS3 standard colors, a single custom color item can be + * defined for a %ColorComboBox object. The custom color item is automatically + * managed by %ColorComboBox and appended to the end of standard items. + * + * \sa pcl/Color.h, ComboBox + */ +class PCL_CLASS ColorComboBox : public ComboBox +{ +public: + + /*! + * Constructs a %ColorComboBox as a child control of \a parent. + * + * A standard set of %ComboBox items is created for the full set of CSS3 + * colors. This includes 143 color items. + */ + ColorComboBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %ColorComboBox control. + */ + virtual ~ColorComboBox() + { + } + + /*! + * Returns the RGB color value that corresponds to the currently selected + * %ComboBox item, or zero if no item is currently selected. + * + * \sa SetCurrentColor(), CustomColor(), HasCustomColor() + */ + RGBA CurrentColor() const; + + /*! + * Selects a %ComboBox item corresponding to the specified \a color. + * + * If the specified \a color doesn't correspond to a standard CSS color, it + * replaces the existing custom color item in this %ColorComboBox, + * or a new one is created if there is no custom color item yet. + * + * \note The alpha (transparency) component of the specified \a color is + * always ignored. %ColorComboBox only includes opaque colors (alpha=0xff). + * + * \sa CurrentColor(), CustomColor(), HasCustomColor() + */ + void SetCurrentColor( RGBA color ); + + /*! + * Returns the current custom color in this %ColorComboBox, or zero + * if no custom color has been defined. + * + * To set a new custom color, call SetCurrentColor() with the desired custom + * color value. + * + * \sa HasCustomColor(), CurrentColor(), SetCurrentColor() + */ + RGBA CustomColor() const + { + return m_customColor; + } + + /*! + * Returns true iff a custom color item has been defined in this + * %ColorComboBox control. + * + * This is a convenience member function, equivalent to: + * CustomColor() != 0. + * + * \sa CustomColor(), CurrentColor(), SetCurrentColor() + */ + bool HasCustomColor() const + { + return CustomColor() != 0; + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnColorSelected( ColorComboBox& sender, RGBA color ); + // void OnColorHighlighted( ColorComboBox& sender, RGBA color ); + // void OnCustomColorDefined( ColorComboBox& sender, RGBA color ); + + /*! + * \defgroup colorcombobox_event_handlers ColorComboBox Event Handlers + */ + + /*! + * Defines the prototype of a color combo box event handler. + * + * A color combo box event is generated when an item is selected or + * highlighted in a color combo box, or when a new custom color has + * been defined. + * + * \param sender The %ColorComboBox control that sends a color combo box + * event. + * + * \param color The RGBA value of the color that has been selected or + * highlighted in the \a sender color combo box. + * + * \ingroup colorcombobox_event_handlers + */ + typedef void (Control::*color_event_handler)( ColorComboBox& sender, RGBA color ); + + /*! + * Sets the color selected event handler for this color combo box. + * + * \param handler The color combo box event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever a color is selected in this + * color combo box control. + * + * \param receiver The control that will receive color selected + * events from this color combo box. + * + * \ingroup colorcombobox_event_handlers + */ + void OnColorSelected( color_event_handler handler, Control& receiver ); + + /*! + * Sets the color highlighted event handler for this color combo + * box control. + * + * \param handler The color combo box event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever a color is highlighted in this + * color combo box control. + * + * \param receiver The control that will receive color + * highlighted events from this color combo box. + * + * \ingroup colorcombobox_event_handlers + */ + void OnColorHighlighted( color_event_handler handler, Control& receiver ); + + /*! + * Sets the custom color defined event handler for this color combo + * box control. + * + * \param handler The color combo box event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever a new custom color is defined + * in this color combo box control. + * + * \param receiver The control that will receive custom color + * defined events from this color combo box. + * + * \ingroup colorcombobox_event_handlers + */ + void OnCustomColorDefined( color_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + color_event_handler onColorSelected = nullptr; + Control* onColorSelectedReceiver = nullptr; + + color_event_handler onColorHighlighted = nullptr; + Control* onColorHighlightedReceiver = nullptr; + + color_event_handler onCustomColorDefined = nullptr; + Control* onCustomColorDefinedReceiver = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + RGBA m_customColor; + + void ItemSelected( ComboBox&, int ); + void ItemHighlighted( ComboBox&, int ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ColorComboBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ColorComboBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ColorDialog.h b/3rdparty/include/pcl/ColorDialog.h new file mode 100644 index 0000000..6d3ab2b --- /dev/null +++ b/3rdparty/include/pcl/ColorDialog.h @@ -0,0 +1,196 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ColorDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ColorDialog_h +#define __PCL_ColorDialog_h + +/// \file pcl/ColorDialog.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * ### TODO: Implement a fully-functional color dialog box in PCL. + */ + +// ---------------------------------------------------------------------------- + +class PCL_INTERNAL SimpleColorDialogPrivate; + +/*! + * \class SimpleColorDialog + * \brief A simple color selection dialog + * + * %SimpleColorDialog is a simplified color selection dialog box. This class is + * suitable to implement quick definition of 32-bit RGBA color items as part of + * a user preferences definition interface. It implements optional support for + * an alpha (transparency) component. Color components are specified in the + * eight-bit range [0,255]. + * + * \sa Dialog + */ +class PCL_CLASS SimpleColorDialog : public Dialog +{ +public: + + enum + { + AlphaEnabled = 0x0080, //!< Enable definition of the alpha (transparency) component. + Grayscale = 0x0020 //!< Define a grayscale AARRGGBB color, where RR=GG=BB. + }; + + /*! + * Constructs a %SimpleColorDialog object. + * + * \param color Address of a 32-bit unsigned integer variable (a RGBA + * color value). If a non-null pointer is specified, when the + * user accepts the dialog the selected color value will be + * written to the specified variable. + * + * \param flags A combination of flags that define the behavior of the + * color selection dialog. Currently the following flags are + * supported:\n + * \n + * SimpleColorDialog::AlphaEnabled: Enable definition of the + * alpha (transparency) component\n + * \n + * SimpleColorDialog::Grayscale: Define a grayscale AARRGGBB + * color, where RR=GG=BB. + */ + SimpleColorDialog( RGBA* color = nullptr, uint32 flags = 0 ); + + /*! + * Destroys a %SimpleColorDialog object. + */ + virtual ~SimpleColorDialog() + { + } + + /*! + * Sets the current RGBA color value. + * + * This function can be called before executing the dialog to set an initial + * color value, as an alternative to passing a non-null pointer to the + * constructor. + */ + void SetColor( RGBA color ); + + /*! + * Returns the RGBA color value that has been defined by the user. + * + * If a non-null pointer was passed to the constructor, this function + * returns the same color value that will be (or has been) written to the + * corresponding variable. + */ + RGBA Color() const + { + return m_workingColor; + } + + /*! + * Returns true iff this dialog allows definition of an alpha (transparency) + * color component. + */ + bool IsAlphaEnabled() const + { + return (m_flags & AlphaEnabled) != 0; + } + + /*! + * Returns true iff this dialog defines a grayscale color, where the three + * individual RGB components are equal. + */ + bool IsGrayscale() const + { + return (m_flags & Grayscale) != 0; + } + +protected: + + RGBA* m_color; + RGBA m_workingColor; + uint32 m_flags; + + VerticalSizer Global_Sizer; + HorizontalSizer Color_Sizer; + VerticalSizer Sliders_Sizer; + NumericControl V0_NumericControl; + NumericControl V1_NumericControl; + NumericControl V2_NumericControl; + NumericControl V3_NumericControl; + Control ColorSample_Control; + HorizontalSizer Buttons_Sizer; + PushButton OK_PushButton; + PushButton Cancel_PushButton; + + void Color_ValueUpdated( NumericEdit& sender, double value ); + void ColorSample_Paint( Control& sender, const Rect& updateRect ); + void Done_Click( Button& sender, bool checked ); + void Dialog_Return( Dialog& sender, int retVal ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ColorDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ColorDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ColorFilterArray.h b/3rdparty/include/pcl/ColorFilterArray.h new file mode 100644 index 0000000..c3a8957 --- /dev/null +++ b/3rdparty/include/pcl/ColorFilterArray.h @@ -0,0 +1,348 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ColorFilterArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ColorFilterArray_h +#define __PCL_ColorFilterArray_h + +/// \file pcl/ColorFilterArray.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup cfa_classes Color Filter Array (CFA) Descriptive Classes + */ + +/*! + * \class ColorFilterArray + * \brief Color filter array (CFA) structure. + * + * %ColorFilterArray describes a color filter array (CFA), such as one of the + * Bayer filters typically used in raw digital camera images. + * + * \ingroup cfa_classes + * \sa BayerFilterBGGR, BayerFilterGBRG, BayerFilterGRBG, BayerFilterRGGB + */ +class PCL_CLASS ColorFilterArray +{ +public: + + /*! + * Constructs a %ColorFilterArray object. + * + * \param pattern A sequence of ASCII characters defining a CFA matrix. + * Each string character represents an element of the CFA + * matrix, which can be one of:\n + * \n + * + * + * + * + * + * + * + * + * + *
0 A nonexistent or undefined CFA element.
R Red
G Green
B Blue
W White or panchromatic
C Cyan
M Magenta
Y Yellow
\n + * \n + * The length of this string must be equal to the product + * of \a width by \a height. Otherwise an Error exception + * will be thrown. An exception will also be thrown if one + * or more invalid CFA elements are found in \a pattern. + * + * \param width Horizontal dimension of the CFA matrix in pixels. + * + * \param height Vertical dimension of the CFA matrix in pixels. + * + * \param name An optional string identifying the type or model of CFA + * that is being described by this object. + */ + ColorFilterArray( const IsoString& pattern, int width, int height, const String& name = String() ) + : m_pattern( pattern.Uppercase() ) + , m_width( width ) + , m_height( height ) + , m_name( name ) + { + if ( m_width < 1 || m_height < 1 || size_type( NumberOfElements() ) != m_pattern.Length() ) + throw Error( "Malformed CFA pattern" ); + for ( auto element : m_pattern ) + if ( !IsValidCFAElement( element ) ) + throw Error( "Invalid CFA pattern \'" + m_pattern + "\'" ); + } + + /*! + * Constructs an empty %ColorFilterArray object. An empty CFA has no pattern + * and zero dimensions. + */ + ColorFilterArray() = default; + + /*! + * Copy constructor. + */ + ColorFilterArray( const ColorFilterArray& ) = default; + + /*! + * Move constructor. + */ + ColorFilterArray( ColorFilterArray&& ) = default; + + /*! + * Copy assignment operator. + */ + ColorFilterArray& operator =( const ColorFilterArray& ) = default; + + /*! + * Move assignment operator. + */ + ColorFilterArray& operator =( ColorFilterArray&& ) = default; + + /*! + * Returns a reference to the CFA pattern in this object. + */ + const IsoString& Pattern() const + { + return m_pattern; + } + + /*! + * Returns the horizontal dimension of this CFA structure in pixels. + */ + int Width() const + { + return m_width; + } + + /*! + * Returns the vertical dimension of this CFA structure in pixels. + */ + int Height() const + { + return m_height; + } + + /*! + * Returns the total number of elements (or pixels) in this CFA structure. + */ + int NumberOfElements() const + { + return int( m_pattern.Length() ); + } + + /*! + * Returns true only if this is an empty %ColorFilterArray object. An empty + * CFA has no pattern and zero dimensions. + */ + bool IsEmpty() const + { + return m_pattern.IsEmpty(); + } + + /*! + * Returns a reference to the name of this CFA structure. + */ + const String& Name() const + { + return m_name; + } + + /*! + * Returns true only if this object describes an RGB Bayer filter: BGGR, + * GRBG, GBRG, or RGGB. + */ + bool IsBayerFilter() const + { + return m_pattern == "BGGR" || m_pattern == "GRBG" || m_pattern == "GBRG" || m_pattern == "RGGB"; + } + + /*! + * Returns a copy of the CFA element at the specified \a x and \a y + * coordinates (pixel column and row, respectively). The top-left corner of + * the CFA is by convention located at coordinates x=y=0. + * + * For a description of valid CFA elements, see the class constructor. + */ + char Element( int x, int y ) const + { + size_type i = y*m_width + x; + if ( i < m_pattern.Length() ) + return m_pattern[i]; + return '\0'; + } + + /* + * Clears all internal structures to yield an empty CFA. + */ + void Clear() + { + m_pattern.Clear(); + m_width = m_height = 0; + m_name.Clear(); + } + + /*! + * Returns true iff this object represents the same CFA structure as another + * object \a x. This operator ignores the Name() components of both objects. + */ + bool operator ==( const ColorFilterArray& x ) const + { + return m_pattern == x.m_pattern && m_width == x.m_width && m_height == x.m_height; + } + + /*! + * Returns true only if this %ColorFilterArray object precedes another + * object \a x. This is a lexicographic comparison performed exclusively on + * the CFA patterns, ignoring matrix dimensions and filter names. + */ + bool operator <( const ColorFilterArray& x ) const + { + return m_pattern < x.m_pattern; + } + + /*! + * Returns true only if the specified character is a valid element of a CFA + * pattern specification. For a description of valid CFA elements, see the + * class constructor. + */ + static bool IsValidCFAElement( char element ) + { + return strchr( "0RGBWCMY", element ) != nullptr; + } + +private: + + IsoString m_pattern; + int m_width = 0; + int m_height = 0; + String m_name; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BayerFilterRGGB + * \brief RGGB Bayer filter representation. + * \ingroup cfa_classes + * \sa ColorFilterArray, BayerFilterBGGR, BayerFilterGBRG, BayerFilterGRBG + */ +class PCL_CLASS BayerFilterRGGB : public ColorFilterArray +{ +public: + + BayerFilterRGGB() + : ColorFilterArray( "RGGB", 2, 2, "RGGB Bayer Filter" ) + { + } +}; + +/*! + * \class BayerFilterBGGR + * \brief BGGR Bayer filter representation. + * \ingroup cfa_classes + * \sa ColorFilterArray, BayerFilterGBRG, BayerFilterGRBG, BayerFilterRGGB + */ +class PCL_CLASS BayerFilterBGGR : public ColorFilterArray +{ +public: + + BayerFilterBGGR() + : ColorFilterArray( "BGGR", 2, 2, "BGGR Bayer Filter" ) + { + } +}; + +/*! + * \class BayerFilterGBRG + * \brief GBRG Bayer filter representation. + * \ingroup cfa_classes + * \sa ColorFilterArray, BayerFilterBGGR, BayerFilterGRBG, BayerFilterRGGB + */ +class PCL_CLASS BayerFilterGBRG : public ColorFilterArray +{ +public: + + BayerFilterGBRG() + : ColorFilterArray( "GBRG", 2, 2, "GBRG Bayer Filter" ) + { + } +}; + +/*! + * \class BayerFilterGRBG + * \brief GRBG Bayer filter representation. + * \ingroup cfa_classes + * \sa ColorFilterArray, BayerFilterBGGR, BayerFilterGBRG, BayerFilterRGGB + */ +class PCL_CLASS BayerFilterGRBG : public ColorFilterArray +{ +public: + + BayerFilterGRBG() + : ColorFilterArray( "GRBG", 2, 2, "GRBG Bayer Filter" ) + { + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ColorFilterArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ColorFilterArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ColorSpace.h b/3rdparty/include/pcl/ColorSpace.h new file mode 100644 index 0000000..d63f65c --- /dev/null +++ b/3rdparty/include/pcl/ColorSpace.h @@ -0,0 +1,133 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ColorSpace.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ColorSpace_h +#define __PCL_ColorSpace_h + +/// \file pcl/ColorSpace.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ColorSpace + * \brief Supported color spaces + * + * Current versions of the PixInsight platform support the following color + * spaces for images: + * + * + * + * + * + * + * + * + * + * + *
ColorSpace::Unknown Corresponds to an unknown or unsupported color space
ColorSpace::Gray Grayscale monochrome space
ColorSpace::RGB RGB color space
ColorSpace::CIEXYZ CIE XYZ color space
ColorSpace::CIELab CIE L*a*b* color space
ColorSpace::CIELch CIE L*c*h* color space
ColorSpace::HSV HSV color space: Hue, Saturation, Value
ColorSpace::HSI HSI color space: Hue, Saturation, Intensity
+ */ +namespace ColorSpace +{ + enum value_type + { + Unknown = -1, // Corresponds to an unknown or unsupported color space + Gray = 0, // Grayscale monochrome space + RGB, // RGB color space + CIEXYZ, // CIE XYZ color space + CIELab, // CIE L*a*b* color space + CIELch, // CIE L*c*h* color space + HSV, // HSV color space: Hue, Saturation, Value + HSI, // HSI color space: Hue, Saturation, Intensity + NumberOfColorSpaces + }; + + /*! + * Returns the number of nominal channels in the specified color space. + */ + inline int NumberOfNominalChannels( int colorSpace ) + { + return (colorSpace == Gray) ? 1 : 3; + } + + /*! + * Returns a string representing the name of a color space. + * + * \param colorSpace A supported color space, identified by its + * corresponding symbolic constant. + */ + String Name( int colorSpace ); + + /*! + * Returns the identifier of a nominal channel in a specified color space. + * + * \param colorSpace A supported color space, identified by its + * corresponding symbolic constant. + * + * \param channel The index >= 0 of a nominal channel or component. + */ + String ChannelId( int colorSpace, int channel ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ColorSpace_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ColorSpace.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ComboBox.h b/3rdparty/include/pcl/ComboBox.h new file mode 100644 index 0000000..e1d456f --- /dev/null +++ b/3rdparty/include/pcl/ComboBox.h @@ -0,0 +1,567 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ComboBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ComboBox_h +#define __PCL_ComboBox_h + +/// \file pcl/ComboBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ComboBox + * \brief Client-side interface to a PixInsight %ComboBox control + * + * ### TODO: Write a detailed description for %ComboBox + */ +class PCL_CLASS ComboBox : public Control +{ +public: + + /*! + * Constructs a %ComboBox as a child control of \a parent. + */ + ComboBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %ComboBox control. + */ + virtual ~ComboBox() + { + } + + /*! + * Returns the total number of items in this %ComboBox control. + */ + int NumberOfItems() const; + + /*! + * Returns the index of the current item in this combo box, or -1 if no item + * is currently selected in this combo box. + */ + int CurrentItem() const; + + /*! + * Selects a combo box item with the specified \a index. + */ + void SetCurrentItem( int index ); + + /*! + * Finds an item in this combo box. Returns the index of the item found, or + * -1 if no item was found that matches the specified criteria. + * + * \param text Text to find. + * + * \param fromIdx Starting index from which the search will begin. + * + * \param exactMatch Whether the search will succeed only if an exact + * match is found, or a partial match is sufficient. + * + * \param caseSensitive True for a case-sensitive search. + */ + int FindItem( const String& text, int fromIdx = 0, bool exactMatch = false, bool caseSensitive = false ) const; + + /*! + * Inserts a new item in this combo box. + * + * \param index Insertion point. If an index greater than or equal to the + * current length is specified, the new item is appended to + * the end of the current set of items. If the index is less + * than or equal to zero, the new item will be prepended to + * the current list of items. + * + * \param text Text for the new item. + * + * \param icon Item icon. + */ + void InsertItem( int index, const String& text, const Bitmap& icon = Bitmap::Null() ); + + /*! + * Adds a new item at the end of this combo box. + * + * This is a convenience function, equivalent to: + * InsertItem( NumberOfItems(), text, icon ) + */ + void AddItem( const String& text, const Bitmap& icon = Bitmap::Null() ) + { + InsertItem( NumberOfItems(), text, icon ); + } + + /*! + * Inserts a list of combo box items. + * + * \param index Insertion point. If an index greater than or equal to the + * current length is specified, the new items are appended to + * the end of the current set of items. If the index is less + * than or equal to zero, the new items will be prepended to + * the current list of items. + * + * \param i,j Two forward iterators defining a range of contiguous + * strings that correspond to the texts of the newly created + * items. + */ + template + void InsertItems( int index, FI i, FI j ) + { + if ( i != j ) + { + DisableUpdates(); + do + InsertItem( index++, *i ); + while ( ++i != j ); + EnableUpdates(); + Update(); + } + } + + /*! + * Appends a list of combo box items. + * + * This is a convenience function, equivalent to: + * InsertItems( NumberOfItems(), i, j ) + */ + template + void AddItems( FI i, FI j ) + { + InsertItems( NumberOfItems(), i, j ); + } + + /*! + * Inserts a list of combo box items from a container. + * + * \param index Insertion point. If an index greater than or equal to the + * current length is specified, the new items are appended to + * the end of the current set of items. If the index is less + * than or equal to zero, the new items will be prepended to + * the current list of items. + * + * \param c A reference to a container with the list of strings that + * will be assigned to newly created items. + * + * This is a convenience function, equivalent to: + * InsertItems( index, c.Begin(), c.End() ) + */ + template + void InsertItems( int index, const C& c ) + { + InsertItems( index, c.Begin(), c.End() ); + } + + /*! + * Appends a list of combo box items from a container. + * + * \param c A reference to a container with the list of strings that will + * be used for newly created items. + * + * This is a convenience function, equivalent to: + * InsertItems( NumberOfItems(), c ); + */ + template + void AddItems( const C& c ) + { + InsertItems( NumberOfItems(), c ); + } + + /*! + * Removes the item at the specified \a index. If the specified index is + * greater than or equal to the current length, or less than zero,, no items + * are removed. + */ + void RemoveItem( int index ); + + /*! + * Removes all existing items in this combo box. + */ + void Clear(); + + /*! + * Returns the current text of the combo box item at the specified \a index. + */ + String ItemText( int index ) const; + + /*! + * Sets the current text of the combo box item at the specified \a index. + */ + void SetItemText( int index, const String& ); + + /*! + * Empties the text of the combo box item at the specified \a index. + */ + void ClearItemText( int index ) + { + SetItemText( index, String() ); + } + + /*! + * Returns the current icon of the combo box item at the specified \a index. + */ + Bitmap ItemIcon( int index ) const; + + /*! + * Changes the icon of the combo box item at the specified \a index. If a + * null bitmap is specified, the combo box item will have no associated icon. + */ + void SetItemIcon( int index, const Bitmap& ); + + /*! + * Clears the icon of the combo box item at the specified \a index. + * + * This is a convenience function, equivalent to: + * SetItemIcon( index, Bitmap::Null() ) + */ + void ClearItemIcon( int index ) + { + SetItemIcon( index, Bitmap::Null() ); + } + + /*! + * Returns true iff this combo box is editable. Editable combo boxes allow + * the user to edit the text of the currently selected item. + */ + bool IsEditEnabled() const; + + /*! + * Enables or disables the editable state of this combo box control. + */ + void EnableEdit( bool = true ); + + /*! + * Disables or enables the editable state of this combo box control. + * + * This is a convenience function, equivalent to: + * EnableEdit( !disable ) + */ + void DisableEdit( bool disable = true ) + { + EnableEdit( !disable ); + } + + /*! + * Returns the current text of the editable part of this combo box control. + */ + String EditText() const; + + /*! + * Sets the text contents of the editable part of this combo box control. + */ + void SetEditText( const String& ); + + /*! + * Empties the editable part of this combo box control. + */ + void ClearEditText() + { + SetEditText( String() ); + } + + /*! + * Returns true iff auto completion is currently enabled for this combo box + * control. + */ + bool IsAutoCompletionEnabled() const; + + /*! + * Enables or disables auto completion for this combo box control. + */ + void EnableAutoCompletion( bool = true ); + + /*! + * Disables or enables auto completion for this combo box control. + * + * This is a convenience function, equivalent to: + * EnableAutoCompletion( !disable ) + */ + void DisableAutoCompletion( bool disable = true ) + { + EnableAutoCompletion( !disable ); + } + + /*! + * Provides the current icon dimensions for this combo box control. + * + * \param[out] width,height Icon dimensions in pixels. + */ + void GetIconSize( int& width, int& height ) const; + + /*! + * Returns the current icon width in pixels for this combo box control. + */ + int IconWidth() const + { + int w, dum; GetIconSize( w, dum ); return w; + } + + /*! + * Returns the current icon height in pixels for this combo box control. + */ + int IconHeight() const + { + int dum, h; GetIconSize( dum, h ); return h; + } + + /*! + * Sets the icon dimensions in pixels for this combo box control. + */ + void SetIconSize( int width, int height ); + + /*! + * Sets the icon size in pixels for this combo box control. + * + * This is a convenience function, equivalent to: + * SetIconSize( size, size ) + */ + void SetIconSize( int size ) + { + SetIconSize( size, size ); + } + + /*! # + */ + void GetScaledIconSize( int& width, int& height ) const + { + GetIconSize( width, height ); width = PhysicalPixelsToLogical( width ); height = PhysicalPixelsToLogical( height ); + } + + /*! # + */ + int ScaledIconWidth() const + { + int width, dum; GetIconSize( width, dum ); return PhysicalPixelsToLogical( width ); + } + + /*! # + */ + int ScaledIconHeight() const + { + int dum, height; GetIconSize( dum, height ); return PhysicalPixelsToLogical( height ); + } + + /*! # + */ + void SetScaledIconSize( int width, int height ) + { + SetIconSize( LogicalPixelsToPhysical( width ), LogicalPixelsToPhysical( height ) ); + } + + /*! # + */ + void SetScaledIconSize( int size ) + { + size = LogicalPixelsToPhysical( size ); + SetIconSize( size, size ); + } + + /*! + * Returns the maximum number of items that can be visible when this combo + * box control is dropped down, or 0 is no specific limit has been set. + */ + int MaxVisibleItemCount() const; + + /*! + * Sets the maximum number of items that can be visible when this combo + * box control is dropped down. If zero is specified, the combo box control + * will show a convenient number of items automatically in drop-down state. + */ + void SetMaxVisibleItemCount( int ); + + /*! + * Returns the minimum number of characters that fit in this combo box + * control, or zero if no specific limit has been set. + */ + int MinItemCharWidth() const; + + /*! + * Sets the minimum number of characters that must fit in this combo box + * control. If zero is specified, the combo box control will adapt its + * size automatically to its initial contents. + */ + void SetMinItemCharWidth( int ); + + // + // Drop-down items list + // + + /*! + * Forces this combo box control to enter the drop-down state. The list of + * existing items is shown on a pop-up panel where they can be browsed and + * selected. + */ + void ShowList(); + + /*! + * Forces this combo box control to exit the drop-down state. The list of + * items will be hidden, if it is currently visible. + */ + void HideList(); + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnItemSelected( ComboBox& sender, int itemIndex ); + // void OnItemHighlighted( ComboBox& sender, int itemIndex ); + // void OnEditTextUpdated( ComboBox& sender ); + + /*! + * \defgroup combobox_event_handlers ComboBox Event Handlers + */ + + /*! + * Defines the prototype of a combo box item event handler. + * + * A combo box item event is generated when an item is selected or + * highlighted in a combo box. + * + * \param sender The ComboBox control that sends a combo box item event. + * + * \param itemIndex The index of the combo box item where the event + * originated, in the range from zero to the number of + * existing combo box items minus one. + * + * \ingroup combobox_event_handlers + */ + typedef void (Control::*item_event_handler)( ComboBox& sender, int itemIndex ); + + /*! + * Defines the prototype of a combo box edit event handler. + * + * A combo box edit event is generated when the text in the editable part of + * a combo box is changed by the user. + * + * \param sender The ComboBox control that sends a combo box edit event. + * + * \ingroup combobox_event_handlers + */ + typedef void (Control::*edit_event_handler)( ComboBox& sender ); + + /*! + * Sets the item selected event handler for this combo box. + * + * \param handler The combo box item event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever an item is selected in this + * combo box control. + * + * \param receiver The control that will receive item selected + * events from this combo box. + * + * \ingroup combobox_event_handlers + */ + void OnItemSelected( item_event_handler handler, Control& receiver ); + + /*! + * Sets the item highlighted event handler for this combo box. + * + * \param handler The combo box item event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever an item is highlighted in this + * combo box control. + * + * \param receiver The control that will receive item highlighted + * events from this combo box. + * + * \ingroup combobox_event_handlers + */ + void OnItemHighlighted( item_event_handler handler, Control& receiver ); + + /*! + * Sets the edit updated event handler for this combo box. + * + * \param handler The combo box edit event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever the text changes in the + * editable part of combo box control. + * + * \param receiver The control that will receive edit updated + * events from this combo box. + * + * \ingroup combobox_event_handlers + */ + void OnEditTextUpdated( edit_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + item_event_handler onItemSelected = nullptr; + item_event_handler onItemHighlighted = nullptr; + edit_event_handler onEditTextUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class ComboBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ComboBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ComboBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Complex.h b/3rdparty/include/pcl/Complex.h new file mode 100644 index 0000000..3b06458 --- /dev/null +++ b/3rdparty/include/pcl/Complex.h @@ -0,0 +1,1110 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Complex.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Complex_h +#define __PCL_Complex_h + +/// \file pcl/Complex.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define real C[0] +#define imag C[1] + +/*! + * \class Complex + * \brief Generic complex number + * + * %Complex is a careful implementation of complex numbers, including efficient + * computations of complex arithmetic and transcendental functions. + * + * When instantiated for the \c double and \c float types, the generated + * classes are binary-compatible with the C99 complex standard structure. + */ +template +class PCL_CLASS Complex +{ +public: + + /*! + * Represents a component of a complex number: real or imaginary part. + */ + typedef T component; + + /*! + * Constructs an uninitialized complex number. The real and imaginary + * components will have unpredictable values. + */ + Complex() = default; + + /*! + * Constructs a complex number with the specified real and imaginary parts. + */ + Complex( T r, T i = 0 ) noexcept + { + real = r; + imag = i; + } + + /*! + * Nontrivial copy constructor. + */ + template + Complex( const Complex& c ) noexcept + { + real = T( c.Real() ); + imag = T( c.Imag() ); + } + + /*! + * Returns a copy of the real component of this complex number. + */ + constexpr T Real() const noexcept + { + return real; + } + + /*! + * Returns a reference to the real component of this complex number. + */ + T& Real() noexcept + { + return real; + } + + /*! + * Returns a copy of the imaginary component of this complex number. + */ + constexpr T Imag() const noexcept + { + return imag; + } + + /*! + * Returns a reference to the imaginary component of this complex number. + */ + T& Imag() noexcept + { + return imag; + } + + /*! + * Returns true iff the imaginary part of this complex number is zero. + */ + constexpr bool IsReal() const noexcept + { + return imag == 0; + } + + /*! + * Assignment operator. Returns a reference to this complex number. + */ + template + Complex& operator =( const Complex& c ) noexcept + { + real = T( c.Real() ), imag = T( c.Imag() ); + return *this; + } + + /*! + * Assignment/sum operator. Adds the specified complex number \a c to this. + * Returns a reference to this complex number. + */ + template + Complex& operator +=( const Complex& c ) noexcept + { + real += c.Real(), imag += c.Imag(); + return *this; + } + + /*! + * Assignment/subtract operator. Subtracts the specified complex number \a c + * from this. Returns a reference to this complex number. + */ + template + Complex& operator -=( const Complex& c ) noexcept + { + real -= c.Real(), imag -= c.Imag(); + return *this; + } + + /*! + * Assignment/multiply operator. Multiplies this complex number by the + * specified complex \a c. Returns a reference to this complex number. + */ + template + Complex& operator *=( const Complex& c ) noexcept + { + T t = T( real*c.Real() - imag*c.Imag() ); + imag = T( imag*c.Real() + real*c.Imag() ); + real = t; + return *this; + } + + /*! + * Assignment/divide operator. Divides this complex number by the specified + * complex \a c. Returns a reference to this complex number. + */ + template + Complex& operator /=( const Complex& c ) noexcept + { + T r, d, t; + if ( pcl::Abs( c.Real() ) >= pcl::Abs( c.Imag() ) ) + { + PCL_PRECONDITION( c.Real() != 0 ) + r = T( c.Imag()/c.Real() ); + d = T( c.Real() + r*c.Imag() ); + t = T( (real + r*imag)/d ); + imag = (imag - r*real)/d; + } + else + { + PCL_PRECONDITION( c.Imag() != 0 ) + r = T( c.Real()/c.Imag() ); + d = T( c.Imag() + r*c.Real() ); + t = T( (real*r + imag)/d ); + imag = (imag*r - real)/d; + } + real = t; + return *this; + } + + /*! + * Assigns a real number to this complex number. The specified scalar \a x + * is assigned to the real component, and the imaginary component is set to + * zero. Returns a reference to this complex number. + */ + template + Complex& operator =( T1 x ) noexcept + { + real = x, imag = 0; + return *this; + } + + /*! + * Adds a real number to this complex number. The specified scalar \a x is + * added to the real component. Returns a reference to this complex number. + */ + template + Complex& operator +=( T1 x ) noexcept + { + real += x; + return *this; + } + + /*! + * Subtracts a real number from this complex number. The specified scalar \a x + * is subtracted from the real component. Returns a reference to this + * complex number. + */ + template + Complex& operator -=( T1 x ) noexcept + { + real -= x; + return *this; + } + + /*! + * Multiplies this complex number by a real number. The real component is + * multiplied by the specified scalar \a x. Returns a reference to this + * complex number. + */ + template + Complex& operator *=( T1 x ) noexcept + { + real *= x, imag *= x; + return *this; + } + + /*! + * Divides this complex number by a real number. The real component is + * divided by the specified scalar \a x. Returns a reference to this complex + * number. + */ + template + Complex& operator /=( T1 x ) noexcept + { + PCL_PRECONDITION( x != 0 ) + real /= x, imag /= x; + return *this; + } + + /*! + * Unary plus operator. Returns a copy of this complex number. + */ + Complex operator +() const noexcept + { + return *this; + } + + /*! + * Unary minus operator. Returns a complex number symmetric to this. + * + * This function is equivalent to: + * Complex( -Real(), -Imag() ) + */ + Complex operator -() const noexcept + { + return Complex( -real, -imag ); + } + + /*! + * Complex conjugate. This function is equivalent to: + * Complex( Real(), -Imag() ) + */ + Complex Conj() const noexcept + { + return Complex( real, -imag ); + } + + /*! + * Complex conjugate. This operator is a synonym for Conj(). + */ + Complex operator ~() const noexcept + { + return Conj(); + } + + /*! + * Assigns to this complex number its complex conjugate. This function + * changes the sign of the imaginary part of this complex number. + */ + void SetConj() noexcept + { + imag = -imag; + } + + /*! + * Complex magnitude (modulus). + * + * Accurate results are guaranteed even for large ratios between the real + * and complex components. + */ + T Mag() const noexcept + { + T r = pcl::Abs( real ); + T i = pcl::Abs( imag ); + T m; + if ( r == 0 ) + m = i; + else if ( i == 0 ) + m = r; + else + { + bool q = r < i; + m = q ? r/i : i/r; + m = (q ? i : r) * pcl::Sqrt( 1 + m*m ); + } + return m; + } + + /*! + * Explicit conversion operator to double. + * + * Returns the complex magnitude or modulus of this complex number, so this + * operator is equivalent to Mag() const. + */ + explicit operator double() const noexcept + { + return double( Mag() ); + } + + /*! + * Complex norm. + * This function is equivalent to: Real()*Real() + Imag()*Imag(). + */ + constexpr T Norm() const noexcept + { + return real*real + imag*imag; + } + + /*! + * Complex argument. + * Returns the arc whose tangent is Imag()/Real(). When both real and + * imaginary components are zero, this function returns zero. + */ + constexpr T Arg() const noexcept + { + // Degenerate cases (real=0) are correctly handled by real ArcTan(). For + // the undefined case real=imag=0, we silently return zero. Should we + // throw an exception instead? + return (real != 0 || imag != 0) ? pcl::ArcTan( imag, real ) : 0; + } + +private: + + /* + * C99 binary-compatible complex components. + */ + T C[ 2 ]; // C[0] = real, C[1] = imaginary +}; + +#undef real +#undef imag + +/* + * ### N.B.: Template class Complex cannot have virtual member functions. + * This is because sizeof( Complex ) _must_ be equal to 2*sizeof( T ). + */ +template +struct PCL_AssertComplexSize +{ + static_assert( sizeof( Complex ) == 2*sizeof( T ), "Invalid sizeof( Complex<> )" ); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup complex_arithmetic_ops Complex Arithmetic Operators + */ + +/*! + * \defgroup complex_basic_functions Complex Basic Functions + */ + +/*! + * Complex absolute value. This function returns the complex magnitude of the + * specified complex number \a c. + * \ingroup complex_basic_functions + */ +template inline +T Abs( const Complex& c ) noexcept +{ + return c.Mag(); +} + +/*! + * Returns a complex number from its polar coordinates: radial distance \a r + * and polar angle theta. The polar angle theta is given by its sine and + * cosine, \a stheta and \a ctheta, respectively. + * \ingroup complex_basic_functions + */ +template inline +Complex Polar( T r, T stheta, T ctheta ) noexcept +{ + return Complex( r*ctheta, r*stheta ); +} + +/*! + * Returns a complex number from its polar coordinates: radial distance \a r + * and polar angle \a theta. The polar angle is specified in radians. + * \ingroup complex_basic_functions + */ +template inline +Complex Polar( T r, T theta ) noexcept +{ + return Polar( r, pcl::Sin( theta ), pcl::Cos( theta ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Complex addition. Returns the sum of two complex numbers \a c1 and \a c2. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator +( const Complex& c1, const Complex& c2 ) noexcept +{ + return Complex( T1( c1.Real() + c2.Real() ), + T1( c1.Imag() + c2.Imag() ) ); +} + +/*! + * Complex addition. Returns the sum of a complex number \a c and a real \a x. + * + * \note The commutativity of complex-real addition is implemented by the + * existence of this function along with operator +( T1, const Complex& ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator +( const Complex& c, T2 x ) noexcept +{ + return Complex( T1( c.Real()+x ), c.Imag() ); +} + +/*! + * Complex addition. Returns the sum of a real number \a x and a complex \a c. + * + * \note The commutativity of complex-real addition is implemented by the + * existence of this function along with operator +( const Complex&, T2 ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator +( T1 x, const Complex& c ) noexcept +{ + return c + x; +} + +/*! + * Complex subtraction. Returns the difference between two complex numbers + * \a c1 and \a c2. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator -( const Complex& c1, const Complex& c2 ) noexcept +{ + return Complex( T1( c1.Real() - c2.Real() ), + T1( c1.Imag() - c2.Imag() ) ); +} + +/*! + * Complex subtraction. Returns the difference between a complex number \a c + * and a real \a x. + * + * \note The noncommutativity of complex-real subtraction is implemented by + * the existence of this function along with + * operator -( T1, const Complex& ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator -( const Complex& c, T2 x ) noexcept +{ + return Complex( T1( c.Real()-x ), c.Imag() ); +} + +/*! + * Complex subtraction. Returns the difference between a real number \a x + * and a complex \a c. + * + * \note The noncommutativity of complex-real subtraction is implemented by + * the existence of this function along with + * operator -( const Complex&, T2 ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator -( T1 x, const Complex& c ) noexcept +{ + return Complex( T2( x-c.Real() ), -c.Imag() ); +} + +/*! + * Complex multiplication. Returns the multiplication of two complex numbers + * \a c1 and \a c2. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator *( const Complex& c1, const Complex& c2 ) noexcept +{ + return Complex( T1( c1.Real()*c2.Real() - c1.Imag()*c2.Imag() ), + T1( c1.Imag()*c2.Real() + c1.Real()*c2.Imag() ) ); +} + +/*! + * Complex multiplication. Returns the multiplication of a complex number \a c + * and a real \a x. + * + * \note The commutativity of complex-real multiplication is implemented by the + * existence of this function along with + * operator *( T1, const Complex& ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator *( const Complex& c, T2 x ) noexcept +{ + return Complex( T1( c.Real()*x ), c.Imag()*x ); +} + +/*! + * Complex multiplication. Returns the multiplication of a real number \a x and + * a complex \a c. + * + * \note The commutativity of complex-real multiplication is implemented by the + * existence of this function along with + * operator *( const Complex&, T2 ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator *( T1 x, const Complex& c ) noexcept +{ + return c * x; +} + +/*! + * Complex division. Returns the division between two complex numbers + * \a c1 and \a c2. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator /( const Complex& c1, const Complex& c2 ) noexcept +{ + Complex c; + T2 r, d; + if ( pcl::Abs( c2.Real() ) >= pcl::Abs( c2.Imag() ) ) + { + PCL_PRECONDITION( c2.Real() != 0 ) + r = c2.Imag() / c2.Real(); + d = c2.Real() + r*c2.Imag(); + c.Real() = T1( (c1.Real() + r*c1.Imag())/d ); + c.Imag() = T1( (c1.Imag() - r*c1.Real())/d ); + } + else + { + PCL_PRECONDITION( c2.Imag() != 0 ) + r = c2.Real() / c2.Imag(); + d = c2.Imag() + r*c2.Real(); + c.Real() = T1( (c1.Real()*r + c1.Imag())/d ); + c.Imag() = T1( (c1.Imag()*r - c1.Real())/d ); + } + return c; +} + +/*! + * Complex division. Returns the division of a complex number \a c + * by a real \a x. + * + * \note The noncommutativity of complex-real division is implemented by the + * existence of this function along with + * operator /( T1, const Complex& ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator /( const Complex& c, T2 x ) noexcept +{ + PCL_PRECONDITION( x != 0 ) + return Complex( T1( c.Real()/x ), T1( c.Imag()/x ) ); +} + +/*! + * Complex division. Returns the division of a real number \a x and a + * complex \a c. + * + * \note The noncommutativity of complex-real division is implemented by the + * existence of this function along with + * operator /( const Complex&, T2 ). + * + * \ingroup complex_arithmetic_ops + */ +template inline +Complex operator /( T1 x, const Complex& c ) noexcept +{ + // return Complex( x, 0 )/c; + Complex c3; + T2 r, d; + if ( pcl::Abs( c.Real() ) >= pcl::Abs( c.Imag() ) ) + { + PCL_PRECONDITION( c.Real() != 0 ) + r = c.Imag()/c.Real(); + d = c.Real() + r*c.Imag(); + c3.Real() = T2( x/d ); + c3.Imag() = T2( -((r*x)/d) ); + } + else + { + PCL_PRECONDITION( c.Imag() != 0 ) + r = c.Real()/c.Imag(); + d = c.Imag() + r*c.Real(); + c3.Real() = T2( (r*x)/d ); + c3.Imag() = T2( -(x/d) ); + } + return c3; +} + +// ---------------------------------------------------------------------------- + +/*! + * Complex square root. + * \ingroup complex_basic_functions + */ +template inline +Complex Sqrt( const Complex& c ) noexcept +{ + if ( c.Real() == 0 && c.Imag() == 0 ) + return Complex( 0 ); + + Complex c1; + T m, r = pcl::Abs( c.Real() ), i = pcl::Abs( c.Imag() ); + + if ( r >= i ) + { + PCL_PRECONDITION( r != 0 ) + T t = i/r; + m = pcl::Sqrt( r ) * pcl::Sqrt( (1 + pcl::Sqrt( 1 + t*t ))/2 ); + } + else + { + PCL_PRECONDITION( i != 0 ) + T t = r/i; + m = pcl::Sqrt( i ) * pcl::Sqrt( (t + pcl::Sqrt( 1 + t*t ))/2 ); + } + + if ( c.Real() >= 0 ) + { + c1.Real() = m; + c1.Imag() = c.Imag()/(m+m); + } + else + { + c1.Imag() = (c.Imag() >= 0) ? m : -m; + c1.Real() = c.Imag()/(c1.Imag()+c1.Imag()); + } + + return c1; +} + +/*! + * Complex exponential function. + * \ingroup complex_basic_functions + */ +template inline +Complex Exp( const Complex& c ) noexcept +{ + T x = pcl::Exp( c.Real() ); + return Complex( x*pcl::Cos( c.Imag() ), x*pcl::Sin( c.Imag() ) ); +} + +/*! + * Complex natural (base e) logarithm. + * \ingroup complex_basic_functions + */ +template inline +Complex Ln( const Complex& c ) noexcept +{ + return Complex( pcl::Ln( c.Mag() ), c.Arg() ); +} + +/*! + * Complex base 10 logarithm. + * \ingroup complex_basic_functions + */ +template inline +Complex Log( const Complex& c ) noexcept +{ + return pcl::Const::log10e() * pcl::Ln( c ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Complex exponentiation. Returns a complex number \a c raised to a real \a x. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex Pow( const Complex& c, T2 x ) noexcept +{ + if ( c.Imag() == 0 ) + return Complex( pcl::Pow( c.Real(), T1( x ) ) ); + else + return pcl::Exp( T1( x )*pcl::Ln( c ) ); +} + +/*! + * Complex exponentiation. Returns a real number \a x raised to a complex \a c. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex Pow( T1 x, const Complex& c ) noexcept +{ + if ( c.Imag() == 0 ) + return Complex( pcl::Pow( T2( x ), c.Real() ) ); + else + return pcl::Exp( c*pcl::Ln( T2( x ) ) ); +} + +/*! + * Complex exponentiation. Returns a complex number \a c1 raised to a + * complex \a c2. + * \ingroup complex_arithmetic_ops + */ +template inline +Complex Pow( const Complex& c1, const Complex& c2 ) noexcept +{ + if ( c2.Imag() == 0 ) + return pcl::Pow( c1, c2.Real() ); + else if ( c1.Imag() == 0 ) + return Complex( pcl::Pow( c1.Real(), c2 ) ); + else + return pcl::Exp( c2*pcl::Ln( c1 ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup complex_transcendental_ops Complex Transcendental Functions + */ + +/*! + * Complex sine. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Sin( const Complex& c ) noexcept +{ + return Complex( pcl::Sin( c.Real() )*pcl::Cosh( c.Imag() ), + pcl::Cos( c.Real() )*pcl::Sinh( c.Imag() ) ); +} + +/*! + * Complex cosine. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Cos( const Complex& c ) noexcept +{ + return Complex( pcl::Cos( c.Real() )*pcl::Cosh( c.Imag() ), + -pcl::Sin( c.Real() )*pcl::Sinh( c.Imag() ) ); +} + +/*! + * Complex tangent. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Tan( const Complex& c ) noexcept +{ + return pcl::Sin( c )/pcl::Cos( c ); +} + +/*! + * Complex hyperbolic sine. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Sinh( const Complex& c ) noexcept +{ + return Complex( pcl::Sinh( c.Real() )*pcl::Cos( c.Imag() ), + pcl::Cosh( c.Real() )*pcl::Sin( c.Imag() ) ); +} + +/*! + * Complex hyperbolic cosine. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Cosh( const Complex& c ) noexcept +{ + return Complex( pcl::Cosh( c.Real() )*pcl::Cos( c.Imag() ), + pcl::Sinh( c.Real() )*pcl::Sin( c.Imag() ) ); +} + +/*! + * Complex hyperbolic tangent. + * \ingroup complex_transcendental_ops + */ +template inline +Complex Tanh( const Complex& c ) noexcept +{ + return pcl::Sinh( c )/pcl::Cosh( c ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup complex_relational_ops Complex Relational Operators + * + * The elements of the complex plane don't follow any particular "natural" + * order. Of course, our definitions of the <, <=, > and >= operators for + * complex numbers are completely arbitrary: we just compare complex + * magnitudes. This effectively sorts complex numbers by concentric circles + * around the origin. + */ + +/*! + * Returns true iff two complex numbers \a c1 and \a c2 are equal. + * \ingroup complex_relational_ops + */ +template inline +bool operator ==( const Complex& c1, const Complex& c2 ) noexcept +{ + return c1.Real() == c2.Real() && c1.Imag() == c2.Imag(); +} + +/*! + * Returns true iff a complex number \a c is equal to a real \a x. + * \ingroup complex_relational_ops + */ +template inline +bool operator ==( const Complex& c, T2 x ) noexcept +{ + return c.Real() == x && c.Imag() == T1( 0 ); +} + +/*! + * Returns true iff a real number \a x is equal to a complex \a c. + * \ingroup complex_relational_ops + */ +template inline +bool operator ==( T1 x, const Complex& c ) noexcept +{ + return c == x; +} + +/*! + * Returns true iff a complex number \a c1 is less than other complex \a c2. + * \ingroup complex_relational_ops + */ +template inline +bool operator <( const Complex& c1, const Complex& c2 ) noexcept +{ + return c1.Mag() < c2.Mag(); +} + +/*! + * Returns true iff a complex number \a c is less than a real number \a x. + * \ingroup complex_relational_ops + */ +template inline +bool operator <( const Complex& c, T2 x ) noexcept +{ + return c.Mag() < pcl::Abs( x ); +} + +/*! + * Returns true iff a real number \a x is less than a complex number \a c. + * \ingroup complex_relational_ops + */ +template inline +bool operator <( T1 x, const Complex& c ) noexcept +{ + return pcl::Abs( x ) < c.Mag(); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup complex_rounding_functions Complex Rounding Functions + */ + +/*! + * Complex rounding. Returns a complex number whose components are the + * components of a specified complex \a c rounded to their nearest integers. + * \ingroup complex_rounding_functions + */ +template inline +Complex Round( const Complex& c ) noexcept +{ + return Complex( pcl::Round( c.Real() ), pcl::Round( c.Imag() ) ); +} + +/*! + * Complex rounding. Returns a complex number whose components are the + * components of a specified complex \a c rounded to the specified number of + * decimal digits \a n. + * \ingroup complex_rounding_functions + */ +template inline +Complex Round( const Complex& c, int n ) noexcept +{ + PCL_PRECONDITION( n >= 0 ) + return Complex( pcl::Round( c.Real(), n ), pcl::Round( c.Imag(), n ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup phase_matrices Phase Matrices Computation Algorithms + */ + +/*! + * Phase correlation matrix. + * + * \param[out] i Address of the first element in the output phase + * correlation matrix. + * + * \param j Address of the ending element in the output phase + * correlation matrix. + * + * \param a Address of the first element in the first operand matrix. + * + * \param b Address of the first element in the second operand matrix. + * + * This routine will compute and store the set of contiguous matrix elements at + * i, i+1, ..., j-1. The total number of computed elements in the output phase + * correlation matrix is equal to j-i. The \a i, \a a and \a b matrices must + * provide storage for at least j-i complex numbers. + * + * \ingroup phase_matrices + */ +template inline +void PhaseCorrelationMatrix( Complex* __restrict__ i, const Complex* __restrict__ j, + const Complex* __restrict__ a, const Complex* __restrict__ b ) noexcept +{ + const T tiny = T( 1.0e-20 ); + for ( ; i < j; ++i, ++a, ++b ) + { + Complex n = *a * ~*b; + *i = n/Max( tiny, Abs( n ) ); + } +} + +/*! + * Cross power spectrum matrix. + * + * \param[out] i Address of the first element in the output cross power + * spectrum matrix. + * + * \param j Address of the ending element in the output cross power + * spectrum matrix. + * + * \param a Address of the first element in the first operand matrix. + * + * \param b Address of the first element in the second operand matrix. + * + * This routine will compute and store the set of contiguous matrix elements at + * i, i+1, ..., j-1. The total number of computed elements in the output cross + * power spectrum matrix is equal to j-i. The \a i, \a a and \a b matrices must + * provide storage for at least j-i complex numbers. + * + * \ingroup phase_matrices + */ +template inline +void CrossPowerSpectrumMatrix( Complex* __restrict__ i, const Complex* __restrict__ j, + const Complex* __restrict__ a, const Complex* __restrict__ b ) noexcept +{ + const T tiny = T( 1.0e-20 ); + for ( ; i < j; ++i, ++a, ++b ) + *i = (*b * ~*a)/Max( tiny, Abs( *a ) * Abs( *b ) ); +} + +// +// Stream extraction/insertion. +// +/* ### PCL 2.x: Add these along with pcl::DataStream, etc... +template inline +S& operator >>( S& s, Complex& c ) +{ + return s >> c.Real() >> c.Imag(); +} + +template inline +S& operator <<( S& s, const Complex& c ) +{ + return s << c.Real() << c.Imag(); +} + */ + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_COMPLEX_INSTANTIATE + +/*! + * \defgroup complex_types Complex Number Types + */ + +/*! + * \class pcl::Complex32 + * \ingroup complex_types + * \brief A complex number whose components are 32-bit floating point real + * numbers. + * + * Complex32 is a template instantiation of Complex for the \c float type. + */ +typedef Complex Complex32; + +/*! + * \class pcl::fcomplex + * \ingroup complex_types + * \brief A complex number whose components are 32-bit floating point real + * numbers. + * + * fcomplex is an alias for Complex32. It is a template instantiation of + * Complex for the \c float type. + */ +typedef Complex32 fcomplex; + +/*! + * \class pcl::Complex64 + * \ingroup complex_types + * \brief A complex number whose components are 64-bit floating point real + * numbers. + * + * Complex64 is a template instantiation of Complex for the \c double type. + */ +typedef Complex Complex64; + +/*! + * \class pcl::dcomplex + * \ingroup complex_types + * \brief A complex number whose components are 64-bit floating point real + * numbers. + * + * dcomplex is an alias for Complex64. It is a template instantiation of + * Complex for the \c double type. + */ +typedef Complex64 dcomplex; + +/*! + * \class pcl::complex + * \ingroup complex_types + * \brief A complex number whose components are 64-bit floating point real + * numbers. + * + * complex is an alias for dcomplex. It is a template instantiation of Complex + * for the \c double type. + */ +typedef dcomplex complex; + +#endif // __PCL_NO_COMPLEX_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Complex_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Complex.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Compression.h b/3rdparty/include/pcl/Compression.h new file mode 100644 index 0000000..45c211f --- /dev/null +++ b/3rdparty/include/pcl/Compression.h @@ -0,0 +1,809 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Compression.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Compression_h +#define __PCL_Compression_h + +/// \file pcl/Compression.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup compression_classes Data Compression Classes + */ + +/*! + * \class Compression + * \brief Abstract base class of data compression algorithm implementations. + * + * %Compression defines a common interface for compression algorithms such as + * Zlib/deflate, LZ4, LZMA, etc. + * + * \ingroup compression_classes + * \sa ZLibCompression, LZ4Compression, LZ4HCCompression, BloscLZCompression + */ +class PCL_CLASS Compression : public ParallelProcess +{ +public: + + /*! + * \struct pcl::Compression::Subblock + * \brief Compression subblock data. + */ + struct Subblock + { + ByteArray compressedData; //!< Sub-block compressed data. + size_type uncompressedSize = 0; //!< size in bytes of the uncompressed subblock. + uint64 checksum = 0; //!< If non-zero, 64-bit non-cryptographic checksum of the compressed data. + }; + + /*! + * \struct pcl::Compression::Performance + * \brief Compression/decompression performance measurements. + */ + struct Performance + { + float sizeReduction = 0; //!< Relative size reduction, e.g.: 0.25 for a 25% size reduction. + double throughput = 0; //!< Compression/decompression rate in MiB per second. + int numberOfThreads = 0; //!< Number of parallel threads used. + }; + + /*! + * A dynamic, ordered list of compression subblocks. + */ + typedef Array subblock_list; + + /*! + * Default constructor. This object will be initialized with the following + * parameters: + * + * \li Compression level: Use an algorithm-dependent default level to + * achieve a good compromise between running speed and compression ratio. + * + * \li Byte shuffling: Enabled. + * + * \li Item size: One byte (which inhibits shuffling). + * + * \li Sub-block checksums: Enabled. + * + * \li Sub-block size: Use the maximum possible subblock size for each + * compression algorithm. + * + * \li Parallel processing: Enabled to use the maximum possible number of + * processors. + */ + Compression() = default; + + /*! + * Copy constructor. + */ + Compression( const Compression& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Compression& operator =( const Compression& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~Compression() + { + } + + /*! + * Returns the name of this data compression algorithm. + */ + virtual String AlgorithmName() const = 0; + + /*! + * Returns the maximum compression optimization level supported by this + * algorithm. Higher levels tend to provide higher compression ratios at the + * cost of more computational work. + */ + virtual int MaxCompressionLevel() const = 0; + + /*! + * Returns the default compression optimization level for this algorithm. + * The returned value represents a good compromise between execution speed + * and compression ratio. + */ + virtual int DefaultCompressionLevel() const = 0; + + /*! + * Returns the current compression optimization level. + * + * See SetCompressionLevel() for more information. + */ + int CompressionLevel() const + { + return m_compressionLevel; + } + + /*! + * Sets an algorithm-dependent compression optimization level. + * + * Higher levels tend to provide higher compression ratios at the cost of + * more computational work. If zero or a negative value is specified, the + * compression routines will select a default level automatically to achieve + * a good compromise between speed and compression ratio for each + * compression algorithm. + */ + void SetCompressionLevel( int level ) + { + m_compressionLevel = Range( level, 0, MaxCompressionLevel() ); + } + + /*! + * Sets the default compression optimization level for this compression + * algorithm. + * + * This function is a shortcut for SetCompressionLevel( 0 ). The default + * compression level attempts to achieve a good compromise between speed and + * compression ratio for each compression algorithm. + */ + void SetDefaultCompressionLevel() + { + SetCompressionLevel( 0 ); + } + + /*! + * Returns true iff byte shuffling is currently enabled for this + * %Compression object. + * + * See EnableByteShuffling() for more information. + */ + bool ByteShufflingEnabled() const + { + return m_byteShuffle; + } + + /*! + * Enables byte shuffling for this %Compression object. + * + * Enable this option to pre-process the data with a byte shuffling routine + * before compression. The byte shuffle algorithm reorganizes the data in a + * clever way that can greatly improve compression ratios, especially for + * data with high \e locality (or data containing similar values close + * together), such as most scientific and observational data. This option + * can be particularly efficient for compression of data structured as + * contiguous sequences of 16-bit, 32-bit and 64-bit numbers, such as most + * images processed with PixInsight. For 8-bit data, byte shuffling is a + * no-op and is hence ignored. Byte shuffling is enabled by default. + */ + void EnableByteShuffling( bool enable = true ) + { + m_byteShuffle = enable; + } + + /*! + * Disables byte shuffling for this %Compression object. + * + * Equivalent to EnableByteShuffling( !disable ). + */ + void DisableByteShuffling( bool disable = true ) + { + EnableByteShuffling( !disable ); + } + + /*! + * Returns the current item size for shuffling. + * + * This is the length in bytes of an element in the uncompressed data, used + * by the byte shuffling algorithm. See EnableByteShuffling() for more + * information. + */ + size_type ItemSize() const + { + return m_itemSize; + } + + /*! + * Sets the item size for shuffling. + * + * \a itemSize is the length in bytes of a data item for the byte shuffling + * algorithm. See EnableByteShuffling() for more information. + */ + void SetItemSize( size_type itemSize ) + { + m_itemSize = uint8( Range( itemSize, size_type( 1 ), size_type( 128 ) ) ); + } + + /*! + * Returns the current compression subblock size in bytes. + * + * See SetSubblockSize() for more information. + */ + size_type SubblockSize() const + { + return m_subblockSize; + } + + /*! + * Sets the compression subblock size. + * + * The specified \a size is the length in bytes of a compression subblock. + * If a value of zero is specified, the effective block size will be the + * maximum possible for this compression algorithm (for example, slightly + * less than 4 GiB for zlib/deflate and slightly less than 2 GiB for LZ4 and + * BloscLZ). The number of elements in the arrays returned by the Compress() + * family of functions will depend on this value. + */ + void SetSubblockSize( size_type size ) + { + m_subblockSize = Range( size, size_type( 0 ), MaxBlockSize() ); + } + + /*! + * Returns true iff subblock checksums are currently enabled for this + * %Compression object. + * + * See EnableChecksums() for more information. + */ + bool ChecksumsEnabled() const + { + return m_checksums; + } + + /*! + * Enables subblock checksums for this %Compression object. + * + * When this option is enabled, a non-cryptographic checksum is computed for + * each compressed subblock and stored along with the subblock data. These + * checksums are computed again before decompression and compared with the + * stored values. This guarantees that the compressed data have not been + * altered. + * + * In current versions of PixInsight, the xxHash algorithm (64-bit version) + * is used for compressed subblock checksums. xxHash is an extremely fast + * hashing function, so its impact on compression/decompression speed is + * negligible. See the pcl::Hash64() function for details. + */ + void EnableChecksums( bool enable = true ) + { + m_checksums = enable; + } + + /*! + * Disables subblock checksums for this %Compression object. + * + * Equivalent to EnableChecksums( !disable ). + */ + void DisableChecksums( bool disable = true ) + { + EnableChecksums( !disable ); + } + + /*! + * Compresses a data block. + * + * \param data Starting address of the data block to be compressed. + * + * \param size Length in bytes of the data block to be compressed. + * + * \param perf If non-null, pointer to a Performance structure where + * performance data will be provided. + * + * Returns a dynamic array of compressed subblocks. Each array element is a + * Subblock structure with the compressed data, the uncompressed length in + * bytes, and an optional checksum. If compression succeeds, the returned + * array will have at least one element. + * + * If the specified \a size is zero, or if one or more subblocks are not + * compressible with this algorithm, this function returns an empty array. + * + * This function can only throw an exception if the specified \a data + * pointer is null, or in the event of an out-of-memory condition. + */ + subblock_list Compress( const void* data, size_type size, Performance* perf = nullptr ) const; + + /*! + * Compression of a direct container with contiguous storage. + * + * \param data Reference to a direct container with contiguous storage + * and PCL container semantics. Meaningful Begin() and Size() + * member functions are required. Typically, the ByteArray + * class is used, although any array-like direct container + * class is appropriate, including Array, String, Vector and + * Matrix, among others. + * + * \param perf If non-null, pointer to a Performance structure where + * performance data will be provided. + * + * Returns a dynamic array of compressed subblocks. Each array element is a + * Subblock structure with the compressed data, the uncompressed length in + * bytes, and an optional checksum. If compression succeeds, the returned + * array will have at least one element. + * + * If the specified container is empty, or if one or more subblocks are not + * compressible with this algorithm, this function returns an empty array. + * + * This function can only throw an exception in the event of an + * out-of-memory condition. + */ + template + subblock_list Compress( const C& data, Performance* perf = nullptr ) const + { + return Compress( data.Begin(), data.Size(), perf ); + } + + /*! + * Decompression of a set of compressed subblocks. + * + * \param data Starting address of the output uncompressed data block. + * + * \param maxSize Maximum space in bytes available at \a data. Must be + * equal to or larger than the total uncompressed size. + * + * \param subblocks Reference to a dynamic array of compressed subblocks. + * The specified array should be the result of a previous + * call to one of the Compress() functions for this + * algorithm. This object must have coherent ItemSize() + * and ByteShufflingEnabled() properties to match the ones + * used when the data was compressed. + * + * \param perf If non-null, pointer to a Performance structure where + * performance data will be provided. + * + * Upon successful completion, the uncompressed data will be available in + * the specified output \a data block, and the function will return the + * length in bytes of the uncompressed data (necessarily smaller than or + * equal to \a maxSize). + * + * In the event of errors, such as invalid or corrupted data, uncompressed + * block or subblock size mismatch, or an out-of-memory condition, this + * function throws an Error exception. In such case the data possibly stored + * in the output \a data buffer will be invalid. + */ + size_type Uncompress( void* data, size_type maxSize, + const subblock_list& subblocks, Performance* perf = nullptr ) const; + + /*! + * Decompression of a set of compressed subblocks. + * + * \param subblocks Reference to a dynamic array of compressed subblocks. + * The specified array should be the result of a previous + * call to one of the Compress() functions for this + * algorithm. This object must have coherent ItemSize() + * and ByteShufflingEnabled() properties to match the ones + * used when the data was compressed. + * + * \param perf If non-null, pointer to a Performance structure where + * performance data will be provided. + * + * Returns the uncompressed data as a ByteArray object. + * + * In the event of errors, such as invalid or corrupted data, uncompressed + * block or subblock size mismatch, or an out-of-memory condition, this + * function throws an Error exception. + */ + ByteArray Uncompress( const subblock_list& subblocks, Performance* perf = nullptr ) const + { + size_type uncompressedSize = 0; + for ( const Subblock& subblock : subblocks ) + uncompressedSize += subblock.uncompressedSize; + ByteArray data( uncompressedSize ); + (void)Uncompress( data.Begin(), uncompressedSize, subblocks, perf ); + return data; + } + + /*! + * Decompression of a compressed data block stored in a ByteArray object. + * Returns the uncompressed data as a ByteArray. + * + * See the Uncompress( const subblock_list&, Performance* ) const member + * function for more information. + */ + ByteArray Uncompress( const ByteArray& compressedData, + size_type uncompressedSize, Performance* perf = nullptr ) const + { + Subblock subblock; + subblock.compressedData = compressedData; + subblock.uncompressedSize = uncompressedSize; + return Uncompress( subblock_list() << subblock, perf ); + } + +private: + + int m_compressionLevel = 0; // 0 = use codec's default + size_type m_subblockSize = 0; // 0 = use largest possible subblocks + uint8 m_itemSize = 1; + bool m_byteShuffle = true; + bool m_checksums = true; + +protected: + + /*! + * Returns the length in bytes of the smallest contiguous data block that + * can be compressed with this algorithm. + */ + virtual size_type MinBlockSize() const = 0; + + /*! + * Returns the length in bytes of the largest contiguous data block that can + * be compressed with this algorithm. + */ + virtual size_type MaxBlockSize() const = 0; + + /*! + * Returns the maximum length in bytes of the contiguous block necessary to + * compress a contiguous block of the specified \a size in bytes. + */ + virtual size_type MaxCompressedBlockSize( size_type size ) const = 0; + + /*! + * Compression of a contiguous block starting at \a inputData with + * \a inputSize length in bytes, using the specified compression \a level. + * The compressed data will be written as a contiguous block starting at + * \a outputData, with length smaller than or equal to \a outputSize. + * Returns the number of bytes written to \a outputData, or zero if the data + * are not compressible. + */ + virtual size_type CompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize, int level ) const = 0; + + /*! + * Decompression of a contiguous compressed block starting at \a inputData + * with \a inputSize length in bytes. The uncompressed data will be written + * as a contiguous block starting at \a outputData, with length equal to + * \a outputSize. Returns the number of bytes written to \a outputData, + * which should be equal to \a outputSize, or smaller in the event of error. + */ + virtual size_type UncompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize ) const = 0; + + /*! + * Byte shuffling algorithm applied to \a size bytes starting at \a data, + * with element length \a itemSize in bytes. Returns the shuffled data as a + * ByteArray object. + */ + static ByteArray Shuffle( const uint8* data, size_type size, size_type itemSize ) + { + ByteArray shuffled( size ); + if ( size > 0 && data != nullptr ) + { + size_type numberOfItems = size / itemSize; + ByteArray::iterator s = shuffled.Begin(); + for ( size_type j = 0; j < itemSize; ++j ) + { + ByteArray::const_iterator u = data + j; + for ( size_type i = 0; i < numberOfItems; ++i, ++s, u += itemSize ) + *s = *u; + } + ::memcpy( s, data + numberOfItems*itemSize, size % itemSize ); + } + return shuffled; + } + + /*! + * Reverse byte shuffling algorithm (or \e unshuffling) applied to \a size + * bytes starting at \a data, with element length \a itemSize in bytes. + * Returns the unshuffled data as a ByteArray object. + */ + static ByteArray Unshuffle( const uint8* data, size_type size, size_type itemSize ) + { + ByteArray unshuffled( size ); + if ( size > 0 && data != nullptr ) + { + size_type numberOfItems = size / itemSize; + ByteArray::const_iterator s = data; + for ( size_type j = 0; j < itemSize; ++j ) + { + ByteArray::iterator u = unshuffled.At( j ); + for ( size_type i = 0; i < numberOfItems; ++i, ++s, u += itemSize ) + *u = *s; + } + ::memcpy( unshuffled.At( numberOfItems*itemSize ), s, size % itemSize ); + } + return unshuffled; + } + + /*! + * In-place reverse byte shuffling algorithm (or \e unshuffling) applied to + * \a size bytes starting at \a data, with element length \a itemSize in + * bytes. + */ + static void InPlaceUnshuffle( uint8* data, size_type size, size_type itemSize ) + { + if ( size > 0 && data != nullptr ) + { + const ByteArray shuffled( data, data+size ); + size_type numberOfItems = size / itemSize; + ByteArray::const_iterator s = shuffled.Begin(); + for ( size_type j = 0; j < itemSize; ++j ) + { + ByteArray::iterator u = data + j; + for ( size_type i = 0; i < numberOfItems; ++i, ++s, u += itemSize ) + *u = *s; + } + } + } + + /*! + * Helper function to throw an error message with inclusion of the algorithm + * name. + */ + void Throw( const String& errorMessage ) const; + + friend class PCL_CompressionEngine; + friend class PCL_DecompressionEngine; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ZLibCompression + * \brief Implementation of the ZLib/Deflate compression algorithm. + * + * This class implements the deflate lossless compression algorithm in the + * standard zlib format. This is the default PixInsight/XISF compression codec. + * + * The underlying implementation in the PixInsight core application is the + * well-known zlib library written by Jean-Loup Gailly and Mark Adler. + * + * \b References + * + * \li Jean-Loup Gailly, L. Peter Deutsch (1996), RFC 1950: ZLIB Compressed + * Data Format Specification version 3.3 + * + * \li Jean-Loup Gailly, L. Peter Deutsch (1996), RFC 1951: DEFLATE + * Compressed Data Format Specification version 1.3 + * + * \li Greg Roelofs, Mark Adler, Zlib Home Site: http://www.zlib.net/ + * + * \ingroup compression_classes + * \sa Compression, LZ4Compression, LZ4HCCompression, BloscLZCompression + */ +class PCL_CLASS ZLibCompression : public Compression +{ +public: + + /*! + * Returns the name of this data compression algorithm (ZLib). + */ + String AlgorithmName() const override + { + return "ZLib"; + } + + /*! + */ + int MaxCompressionLevel() const override; + + /*! + */ + int DefaultCompressionLevel() const override; + + +private: + + /*! + */ + size_type MinBlockSize() const override; + + /*! + */ + size_type MaxBlockSize() const override; + + /*! + */ + size_type MaxCompressedBlockSize( size_type size ) const override; + + /*! + */ + size_type CompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize, int level ) const override; + + /*! + */ + size_type UncompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class LZ4Compression + * \brief Implementation of the LZ4 compression algorithm. + * + * This class implements the LZ4 compression algorithm by Yann Collet. + * + * LZ4 is a lossless data compression algorithm focused on compression and + * decompression speed. + * + * The underlying implementation in the PixInsight core application is the + * reference implementation by Yann Collet, which has been released under a New + * BSD license. + * + * \b References + * + * \li LZ4 source code repository: https://github.com/Cyan4973/lz4 + * + * \li LZ4 website: http://cyan4973.github.io/lz4/ + * + * \ingroup compression_classes + * \sa Compression, LZ4HCCompression, ZLibCompression, BloscLZCompression + */ +class PCL_CLASS LZ4Compression : public Compression +{ +public: + + /*! + * Returns the name of this data compression algorithm (LZ4-HC). + */ + String AlgorithmName() const override + { + return "LZ4"; + } + + /*! + */ + int MaxCompressionLevel() const override; + + /*! + */ + int DefaultCompressionLevel() const override; + + +private: + + /*! + */ + size_type MinBlockSize() const override; + + /*! + */ + size_type MaxBlockSize() const override; + + /*! + */ + size_type MaxCompressedBlockSize( size_type size ) const override; + + /*! + */ + size_type CompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize, int level ) const override; + + /*! + */ + size_type UncompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class LZ4HCCompression + * \brief Implementation of the LZ4-HC compression algorithm. + * + * This class implements the LZ4 compression algorithm (high compression + * variant) by Yann Collet. + * + * LZ4 is a lossless data compression algorithm focused on compression and + * decompression speed. + * + * The underlying implementation in the PixInsight core application is the + * reference implementation by Yann Collet, which has been released under a New + * BSD license. + * + * \b References + * + * \li LZ4 source code repository: https://github.com/Cyan4973/lz4 + * + * \li LZ4 website: http://cyan4973.github.io/lz4/ + * + * \ingroup compression_classes + * \sa Compression, LZ4Compression, ZLibCompression, BloscLZCompression + */ +class PCL_CLASS LZ4HCCompression : public Compression +{ +public: + + /*! + * Returns the name of this data compression algorithm (LZ4-HC). + */ + String AlgorithmName() const override + { + return "LZ4-HC"; + } + + /*! + */ + int MaxCompressionLevel() const override; + + /*! + */ + int DefaultCompressionLevel() const override; + + +private: + + /*! + */ + size_type MinBlockSize() const override; + + /*! + */ + size_type MaxBlockSize() const override; + + /*! + */ + size_type MaxCompressedBlockSize( size_type size ) const override; + + /*! + */ + size_type CompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize, int level ) const override; + + /*! + */ + size_type UncompressBlock( void* outputData, size_type outputSize, + const void* inputData, size_type inputSize ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Compression_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Compression.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Console.h b/3rdparty/include/pcl/Console.h new file mode 100644 index 0000000..265d402 --- /dev/null +++ b/3rdparty/include/pcl/Console.h @@ -0,0 +1,829 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Console.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Console_h +#define __PCL_Console_h + +/// \file pcl/Console.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS View; + +/*! + * \class Console + * \brief A high-level interface to a PixInsight processing console. + * + * The PixInsight platform provides three different user interfaces implemented + * in the PixInsight core application: a graphical user interface (GUI), a + * scripting interface (the PixInsight JavaScript runtime), and a command-line + * interface. The %Console class is a high-level abstraction that represents + * the %Process %Console window of the PixInsight core application, which + * implements the entire command-line and console text input/output + * functionality in PixInsight. + * + * A module can instantiate %Console to perform direct text input/output + * operations. %Console objects are often used to display information about + * ongoing processes, to let the user abort a process, or to put a process in a + * wait state to perform a modal user interface operation (e.g., showing a + * message box) in a thread-safe way. + * + * From the module developer perspective, each module has an associated + * console. Such associations between modules and consoles are managed + * automatically by internal core and PCL routines: module developers just need + * to instantiate the %Console class and use its member functions. + * + * For example, writing a message to the console can be as simple as: + * + * \code + * Console().WriteLn( "Hello, PixInsight" ); + * \endcode + * + * Stream-style console insertion and extraction operators are also available. + * For example, this is equivalent to the above code: + * + * \code + * Console() << "Hello, PixInsight" << '\n'; + * \endcode + * + * When you need to output formatted data, you can use the String::Format() + * family of functions. These functions are similar to the standard printf() C + * runtime function: + * + * \code + * Console console; + * console.WriteLn( String().Format( "Radius = %.6f, Angle = %+.2f°", r, Deg( a ) ) ); + * \endcode + * + * PixInsight consoles can understand and reproduce the full set of ISO-8859-1 + * HTML entities. You see an example on the code fragment above: the \c "°" + * entity prints a degree symbol on the console. + * + * PixInsight consoles can also interpret a number of \e tags, similar to HTML, + * to perform special actions and formatting operations. For example: + * + * \code + * Console() << "This is bold and this is italics
"; + * \endcode + * + * In this example, the "" tag moves the cursor after the last character + * in the console, then the "" tag (conditional break) generates + * a new line only if the current line is not empty. This ensures that + * subsequent text output will start on an empty line at the end of the current + * console contents. The "" and "" tags write text in a bold type face, + * and the "" and "" pair write text in italics. This is just a minimal + * fraction of the rich set of tags understood by PixInsight consoles. + * + * As we describe in detail below, PixInsight consoles support standard ANSI + * escape codes, and can also be used to render inline HTML contents. + * + * It must be pointed out that the entire text output functionality of %Console + * is also available for TextBox controls. A module can instantiate a %TextBox + * control to provide rich text-based output as a process log, the output of an + * external process, or an information panel based on HTML tables, just to name + * a few possibilities implemented frequently. + * + *

%Console Tags

+ * + * Here is a comprehensive list of supported console tags at the time of + * publishing this documentation. New functionality implemented through console + * tags will be documented here as new versions are released. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
\\ Enables/disables bold text.
\\ Enables/disables italics text.
\\ Enables/disables underlined text.
\\ Enables/disables overlined text.
\\ Enables/disables subscript text.
\\ Enables/disables superscript text.
\ Line break.
\
Line break, XML compliant (same as \).
\ Conditional line break: sends a line break if the cursor is not at the beginning of an empty line.
\ Conditional line break, XML compliant (same as \).
\ Backspace: deletes the previous character and moves the cursor one step left, only if it is not at the beginning of a line.
\ Moves the cursor to the end of the console.
\ Moves the cursor to the beginning of the console.
\ Moves the cursor to the previous character, only if it is not at the beginning of a line.
\ Moves the cursor to the next character, only if it is not at the end of a line.
\ Moves the cursor to the end of the current line.
\ Moves the cursor to the beginning of the current line.
\ Moves the cursor to the previous line, if it is not already at the first line.
\ Moves the cursor to the next line, if it is not already at the last line.
\ Clears the console. Avoid issuing this tag arbitrarily - please see the documentation for Console::Clear() for more information.
\ Deletes the text from the current cursor position (included) to the end of the current line.
\ Deletes the text from the current cursor position (included) to the beginning of the current line.
\ Deletes the text from the current cursor position (included) to the end of the console.
\ Deletes the text from the current cursor position (included) to the beginning of the console. Avoid issuing this tag arbitrarily - please see the documentation for Console::Clear() for more information.
\\ Disables/enables word wrapping of text lines.
\\ Disables/enables tag interpretation, except the \ tag, which is always interpreted.
\\ Disables/enables interpretation of ISO-8859-1 entities.
\\ Disables/enables interpretation of tags, except the \ tag, and ISO-8859-1 entities. \ is equivalent to (but faster than) \\.
\\ Equivalent to \\. Useful to show source code fragments.
\ Selects a platform-dependent, monospaced font.
\ Selects a platform-dependent, sans-serif font.
\ Selects a platform-dependent, serif font.
\ Selects the Courier font, or the nearest available monspaced font, depending on the platform.
\ Selects the Helvetica font, or the nearest available sans-serif font, depending on the platform.
\ Selects the Times font, or the nearest available serif font, depending on the platform.
\ Selects the default console font (usually a monospaced font; but user-selectable through preferences).
\ Resets all text settings and styles to default values.
\ If this console corresponds to the processing console window, shows it if it's currently hidden and docked in the PixInsight core application window; otherwise this tag is ignored. Equivalent to calling the Console::Show() member function.
\ If this console corresponds to the processing console window, hides it if it's currently visible and docked in the PixInsight core application window; otherwise this tag is ignored. Equivalent to calling the Console::Hide() member function.
\ Causes any pending data to be written immediately to the console. If there is no unwritten data for this console, this tag has no effect. Equivalent to calling the Console::Flush() member function.
\\ Enables/disables HTML mode. In HTML mode, the console interprets and renders a comprehensive set of HTML 4 tags, including full support of tables, as well as a significant part of Level 2 CSS (Cascading Style Sheets) directives. In HTML mode, PixInsight console tags are either ignored or interpreted with their corresponding meaning in HTML 4.
+ * + * In addition, the \\n, \\r and \\b escape characters can be used in place of + * the \, \ and \ tags, respectively. + * + *

Character Entities

+ * + * PixInsight consoles fully recognize and interpret the whole set of + * HTML 4 character entities, including all ISO 8859-1 characters and all + * character entities for symbols, mathematical symbols, Greek letters, + * markup-significant and internationalization characters. + * + * Character entities are of the form: + * + * \; + * + * where \ is one of the references included in the + * following W3C Recommendation document: + * + * http://www.w3.org/TR/REC-html40/sgml/entities.html + * + *

HTML Mode

+ * + * The \ tag allows you to put a PixInsight console in HTML + * mode. In this mode you can embed HTML 4 contents directly. For example, + * this code: + * + * \code + * Console console; + * console.Write( "" + * "" + * "" + * "" + * "
If this is foo and this is bar,
then this can only be foo bar.
" + * "" ); \endcode + * + * generates an HTML table with two rows and two columns. PixInsight consoles + * support most of the HTML 4 specification, including a subset of CSS2. For + * detaled information, this document describes HTML support in Qt, which is + * the underlying implementation in current versions of PixInsight: + * + * http://qt-project.org/doc/qt-4.8/richtext-html-subset.html + * + * In HTML mode, that is, within a pair of \\ tags, no + * PixInsight console tags or ANSI escape codes are recognized or interpreted. + * + *

ANSI Escape Codes

+ * + * Since version 1.8.1 of the PixInsight core application, PixInsight consoles + * support a large set of ANSI CSI (Control Sequence Introducer) codes. For a + * detailed description of ANSI escape codes, refer to the following documents: + * + * http://en.wikipedia.org/wiki/ANSI_escape_code + * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html + * + * The following table describes the supported CSI codes in the current version + * of PixInsight. ESC represents the escape control character, whose ASCII code + * is 2710 = 1B16. The CSI sequence is ESC followed by + * the left square bracket character, represented as the ESC[ sequence. See the + * examples given at the end of the table. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ESC[ n A %Cursor up n Times (default n=1) (CUU)
ESC[ n B %Cursor down n Times (default n=1) (CUD)
ESC[ n C %Cursor forward n Times (default n=1) (CUF)
ESC[ n D %Cursor backward n Times (default n=1) (CUB)
ESC[ n E %Cursor to next line n Times (default n=1) (CNL)
ESC[ n F %Cursor to preceding line n Times (default n=1) (CPL)
ESC[ n G %Cursor to character absolute column n (default n=1) (CHA)
ESC[ n;m H %Cursor position to row n and column m (default n=m=1) (CUP)
ESC[ n;m f Horizontal & Vertical Position (HVP). Same as H.
ESC[ n J Erase in Display (ED)
+ * + * + * + * + *
n = 0 Erase below up to the end of text. This is the default if no n is specified.
n = 1 Erase above up to the start of text.
n = 2 Erase all (entire console).
ESC[ n K Erase in Line (EL)
+ * + * + * + * + *
n = 0 Erase to right up to the end of line. This is the default if no n is specified.
n = 1 Erase to left up to the start of line.
n = 2 Erase the whole line.
ESC[ n L Insert n line(s) (default n=1) (IL)
ESC[ n M Delete n line(s) (default n=1) (DL)
ESC[ n P Delete n character(s) (default n=1) (DCH)
ESC[ ... m Set graphics rendition (SGR)
+ * The ellipsis represents a list of one or more integer arguments separated by semi-colons. The following arguments are recognized:
+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
0 Reset all font and color properties to default values.
1 Bold font
2 Faint (decreased intensity) - ignored (not implemented)
3 Italic font
4 Underline font
5 Blink (slow) - reinterpreted - selects a bold font.
6 Blink (fast) - reinterpreted - selects a bold font.
7 Inverse colors (swap default foreground and background)
8 Invisible - ignored (not implemented)
9 Strike out font
21 Bold font: disable
22 Normal color - ignored (not implemented)
23 Italic font: disable
24 Underline font: disable
25 Blink: disable - reinterpreted - disables bold font (same as 21).
27 Inverse colors: disable
28 Visible - ignored (not implemented)
29 Strike out font: disable
30 ... 37 Set foreground color to n-30: 0=black, 1=red, 2=green, 3=yellow, 4=blue, 5=magenta, 6=cyan, 7=white.
38 KDE's Konsole extended 24-bit color space: Set foreground color (see note below).
39 Default foreground color.
40 ... 47 Set background color to n-40. Colors are the same as for 30 ... 37.
48 KDE's Konsole extended 24-bit color space: Set background color (see note below).
49 Default background color.
53 Overline font
55 Overline font: disable
ESC[s Save %Cursor Position (SCP)
ESC[u Restore %Cursor Position (RCP)
+ * + * KDE Konsole 24-bit colors use the following format: + * + * Select RGB foreground color: ESC[ ... 38;2;r;g;b ... m
+ * Select RGB background color: ESC[ ... 48;2;r;g;b ... m + * + * where r, g and b are the red, green and blue components in the [0,255] + * range. For detailed information on these codes, see the following document: + * + * https://projects.kde.org/projects/kde/applications/konsole/repository/revisions/master/entry/doc/user/README.moreColors + * + * Examples + * + * Write a text line using a bold font: + * + * \code + * Console().WriteLn( "\x1b[1mThis is bold text\x1b[21m" ); \endcode + * + * Write a text line in orange color using an italic font: + * + * \code + * String programName; + * Console().WriteLn( "
\x1b[3;38;2;255;128;0m" + programName + "\x1b[39;23m" ); \endcode + * + * Write some text at the beginning of the current line, removing any previous + * contents: + * + * \code + * Console().Write( "\x1b[2KThis text replaces the whole line" ); \endcode + * + * \sa StatusMonitor, StandardStatus, SpinStatus, MuteStatus, Thread + */ +class PCL_CLASS Console +{ +public: + + /*! + * Constructs a %Console object. + */ + Console(); + + /*! + * Copy constructor, disabled because %Console instances represent unique + * objects that cannot be copied. + */ + Console( const Console& ) = delete; + + /*! + * Move constructor. + */ + Console( Console&& x ) + : m_handle( x.m_handle ) + , m_thread( x.m_thread ) + { + x.m_handle = x.m_thread = nullptr; + } + + /*! + * Copy assignment operator, disabled because %Console instances represent + * unique objects that cannot be copied. + */ + Console& operator =( const Console& ) = delete; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Console& operator =( Console&& x ) + { + if ( &x != this ) + { + m_handle = x.m_handle; + m_thread = x.m_thread; + x.m_handle = x.m_thread = nullptr; + } + return *this; + } + + /*! + * Destroys a %Console object. + */ + virtual ~Console(); + + /*! + * Writes an Unicode string \a s to this console. + */ + void Write( const String& s ); + + /*! + * Writes an Unicode string \a s to this console and appends a newline + * escape character ('\\n'). + * + * Note that this function is faster than appending a newline character to + * the string, such as a call to Write( s + '\\n' ). + */ + void WriteLn( const String& s ); + + /*! + * Sends a single newline escape character ('\\n') to the console. + * + * Note that this function is faster than writing a newline directly with a + * call to Write( '\\n' ). + */ + void WriteLn(); + + /*! + * Writes an informative note message to this console. + * + * This function writes the specified Unicode string \a s using standard + * ANSI terminal color number 2 (green in the default palette). The + * implementation of this member function uses ANSI escape codes. + */ + void Note( const String& s ) + { + Write( "\x1b[32m" + s + "\x1b[39m" ); + } + + /*! + * Writes an informative note message to this console and appends a newline + * escape character ('\\n'). + * + * See the description of Note( const String& ). + */ + void NoteLn( const String& s ) + { + WriteLn( "\x1b[32m" + s + "\x1b[39m" ); + } + + /*! + * Writes a warning message to this console. + * + * This function writes the specified Unicode string \a s using standard + * ANSI terminal color number 5 (magenta in the default palette). The + * implementation of this member function uses ANSI escape codes. + */ + void Warning( const String& s ) + { + Write( "\x1b[35m" + s + "\x1b[39m" ); + } + + /*! + * Writes a warning message to this console and appends a newline escape + * character ('\\n'). + * + * See the description of Warning( const String& ). + */ + void WarningLn( const String& s ) + { + WriteLn( "\x1b[35m" + s + "\x1b[39m" ); + } + + /*! + * Writes a critical error message to this console. + * + * This function writes the specified Unicode string \a s using standard + * ANSI terminal color number 1 (red in the default palette). The + * implementation of this member function uses ANSI escape codes. + */ + void Critical( const String& s ) + { + Write( "\x1b[31m" + s + "\x1b[39m" ); + } + + /*! + * Writes a critical error message to this console and appends a newline + * escape character ('\\n'). + * + * See the description of Critical( const String& ). + */ + void CriticalLn( const String& s ) + { + WriteLn( "\x1b[31m" + s + "\x1b[39m" ); + } + + /*! + * Reads a single character from this console and returns it. + * + * This function puts the current thread in wait state, then waits until a + * character can be obtained in the core application's GUI thread. This + * usually involves waiting for a keyboard event. + * + * \note This member function has not been implemented in the current PCL + * version. Calling it has not effect, and zero is always returned. + */ + int ReadChar(); + + /*! + * Reads a string from this console and returns it. + * + * This function puts the current thread in wait state, then opens a simple + * modal dialog box with a single-line edit control, where the user may + * enter a string. If the user cancels the input dialog, an empty string is + * returned. + * + * \note This member function has not been implemented in the current PCL + * version. Calling it has not effect, and an empty string is always + * returned. + */ + String ReadString(); + + /*! + * Returns true iff the current processing thread has been suspended by the + * PixInsight core application. + */ + bool Suspended() const; + + /*! + * Returns true iff the current processing thread is in wait state. + */ + bool Waiting() const; + + /*! + * Returns true iff the current processing thread can be aborted by the user. + */ + bool AbortEnabled() const; + + /*! + * Returns true iff the user has requested to abort execution of the current + * processing thread. + */ + bool AbortRequested() const; + + /*! + * Resets the current processing thread status. + * + * This function is useful to ignore an abort request for the current + * processing thread. For example, if the user requests to abort execution, + * a module may ask if she or he really wants to cancel, and if the user + * answers 'No', then this member function can be called to clear the + * existing abort request condition. + * + * \note This function must only be called when there is an active process + * running in the current module. It can only be called from the thread + * where either a reimplemented ProcessImplementation::ExecuteOn() or + * ProcessImplementation::ExecuteGlobal() member function has been invoked. + * An Error exception will be thrown otherwise. + */ + void ResetStatus(); + + /*! + * Enables abort requests for the current processing thread. + * + * \note This function must only be called when there is an active process + * running in the current module. It can only be called from the thread + * where either a reimplemented ProcessImplementation::ExecuteOn() or + * ProcessImplementation::ExecuteGlobal() member function has been invoked. + * An Error exception will be thrown otherwise. + */ + void EnableAbort(); + + /*! + * Disables abort requests for the current processing thread. + * + * \note This function must only be called when there is an active process + * running in the current module. It can only be called from the thread + * where either a reimplemented ProcessImplementation::ExecuteOn() or + * ProcessImplementation::ExecuteGlobal() member function has been invoked. + * An Error exception will be thrown otherwise. + */ + void DisableAbort(); + + /*! + * Accepts a pending abort request. + * + * \note This function must only be called when there is an active process + * running in the current module. It can only be called from the thread + * where either a reimplemented ProcessImplementation::ExecuteOn() or + * ProcessImplementation::ExecuteGlobal() member function has been invoked. + * An Error exception will be thrown otherwise. + */ + void Abort(); + + /*! + * Returns true iff this is a valid console object associated to an active + * processing thread. + */ + bool IsValid() const; + + /*! + * Returns true iff this console is valid and has been created by the + * calling thread; either by the root thread or by a running Thread object. + */ + bool IsCurrentThreadConsole() const; + + /*! + * Causes any pending data to be written immediately to this console. If + * there is no unwritten data for this console, this function has no effect. + */ + void Flush(); + + /*! + * Shows the %Process %Console window in the PixInsight core application. + * + * The visibility of a console can only be controlled if it is the process + * console window. Furthermore, a module cannot show or hide the console if + * it is not owned by a docked window; the visibility of a floating window + * cannot be changed programmatically from a module. + * + * This function returns true if the console could be shown (or hidden) + * successfully. Unlike most interface operations, console hide/show + * operations are not cached, so if this function returns true then you know + * that the %Process %Console window is currently visible. + * + * \note Calling this function from a running thread has no effect. Console + * visibility can only be changed from the root thread. + */ + bool Show( bool show = true ); + + /*! + * Hides the %Process %Console window in the PixInsight core application. + * + * This is a convenience function, equivalent to: Show( !hide ) + * + * Returns true iff the console could be hidden (or shown) successfully. + * Refer to the Show() member function for more information. + * + * \note Calling this function from a running thread has no effect. Console + * visibility can only be changed from the root thread. + */ + bool Hide( bool hide = true ) + { + return Show( !hide ); + } + + /*! + * Clears the console. This is a convenience function that simply writes the + * \ tag to the console. + * + * \note Calling this function from a running thread has no effect. The + * console output text of a Thread object cannot be erased by this function. + * + * \note In general, call this function only as a result of an explicit user + * request to clear the console. Clearing the console arbitrarily, without + * having an extremely good reason, is considered bad practice and can be + * a good argument to deny certification of a module. + */ + void Clear(); + + /*! + * + */ + void ExecuteCommand( const String& command ); + + /*! + * Executes a script file. + * + * \param filePath Path to the script file that will be executed. Must be + * a path to an existing script on the local filesystem. + * + * \param arguments A dynamic array, possibly empty, of StringKeyValue + * objects. Each object in this array represents a script + * argument. The key member is the parameter name, and the + * value member is the corresponding parameter value. + * + * The core application will load, parse, authorize and execute the + * specified script file. The scripting language will be detected + * automatically from the file name suffix in \a filePath. Currently the + * .scp and .js suffixes are interpreted for command-line shell scripts and + * JavaScript scripts, respectively. Future versions may accept more + * languages and apply language detection heuristics besides file suffixes. + * + * This member function returns normally if the script was loaded and + * executed. In the event of error, for example if the specified file does + * not exist or can't be accessed, or in the event of security errors or + * failure to authorize script execution from the calling module, this + * member function throws an Error exception. + * + * Note that command-line or JavaScript runtime execution errors cannot be + * reported by this function. That means that this function knows nothing + * about whether the script worked or not correctly, or if it did what was + * expected. + * + * For execution of JavaScript scripts, this function is equivalent to + * ExecuteScriptGlobal(), that is, JavaScript scripts are always executed in + * the global context by default. When executed, the JavaScript script will + * see the following static properties of the %Parameters JS runtime object: + * + * \c Parameters.isGlobalTarget will be set to true. \n + * \c Parameters.isViewTarget will be set to false. \n + * \c Parameters.targetView will be set to \c undefined. + * + * See ExecuteScriptOn() for execution of scripts in view contexts. + * + * \note If this function is called from a running thread, an Error + * exception will be thrown and nothing will be executed. In current + * versions of the PixInsight platform, scripts can only be executed from + * the root thread. The main reason for this limitation is that the + * JavaScript and command-line execution engines are not reentrant. + */ + void ExecuteScript( const String& filePath, const StringKeyValueList& arguments = StringKeyValueList() ); + + /*! + * Executes a script file in the global context. This is the default + * execution execution mode for all scripts. + * + * When a JavaScript script is executed through this member function, the + * following static properties of the %Parameters runtime object will be + * defined as described below: + * + * \c Parameters.isGlobalTarget will be set to true. \n + * \c Parameters.isViewTarget will be set to false. \n + * \c Parameters.targetView will be set to \c undefined. + * + * See ExecuteScript() for a detailed description of script execution from + * PCL/C++ code. + */ + void ExecuteScriptGlobal( const String& filePath, const StringKeyValueList& arguments = StringKeyValueList() ); + + /*! + * Executes a script file in the context of the specified \a view. + * + * When a JavaScript script is executed through this member function, the + * following static properties of the %Parameters runtime object will be + * defined as described below: + * + * \c Parameters.isGlobalTarget will be set to false. \n + * \c Parameters.isViewTarget will be set to true. \n + * \c Parameters.targetView will reference the specified \a view. + * + * See ExecuteScript() for a detailed description of script execution from + * PCL/C++ code. + */ + void ExecuteScriptOn( const View& view, const String& filePath, const StringKeyValueList& arguments = StringKeyValueList() ); + +protected: + + void* m_handle = nullptr; + +private: + + void* m_thread = nullptr; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup console_operators Console Insertion and Extraction Operators + */ + +/*! + * Writes an object \a t to the console \a o. The type T must have + * convert-to-string semantics. Returns a reference to the console \a o. + * \ingroup console_operators + */ +template +inline Console& operator <<( Console& o, T t ) +{ + o.Write( String( t ) ); + return o; +} + +/*! + * Writes a null-terminated string \a s to the console \a o. + * Returns a reference to the console \a o. + * \ingroup console_operators + */ +inline Console& operator <<( Console& o, const char* s ) +{ + o.Write( s ); + return o; +} + +/*! + * Writes a string \a s to the console \a o. + * Returns a reference to the console \a o. + * \ingroup console_operators + */ +inline Console& operator <<( Console& o, const String& s ) +{ + o.Write( s ); + return o; +} + +/*! + * Reads a character \a c from the console \a o. + * Returns a reference to the console \a o. + * \ingroup console_operators + */ +inline Console& operator >>( Console& o, char& c ) +{ + c = o.ReadChar(); + return o; +} + +/*! + * Reads a string \a s from the console \a o. + * Returns a reference to the console \a o. + * \ingroup console_operators + */ +inline Console& operator >>( Console& o, String& s ) +{ + s = o.ReadString(); + return o; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Console_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Console.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Constants.h b/3rdparty/include/pcl/Constants.h new file mode 100644 index 0000000..9c51ad2 --- /dev/null +++ b/3rdparty/include/pcl/Constants.h @@ -0,0 +1,199 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Constants.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Constants_h +#define __PCL_Constants_h + +/// \file pcl/Constants.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Const + * \brief Fundamental numeric constants + * + * Specialize this class to obtain constants of the appropriate floating-point + * types. For example: Const::pi() + */ +template +class PCL_CLASS Const +{ +public: + + /*! + * pi/4 (45 degrees) + */ + static constexpr T pi4 () { return T( 0.785398163397448309615660845819875725e+00L ); } + + /*! + * pi/2 (90 degrees) + */ + static constexpr T pi2 () { return T( 0.157079632679489661923132169163975145e+01L ); } + + /*! + * 3*pi/4 (135 degrees) + */ + static constexpr T _3pi4 () { return T( 0.2356194490192344928846982537459627175e+01L ); } + + /*! + * The pi constant (180 degrees) + */ + static constexpr T pi () { return T( 0.31415926535897932384626433832795029e+01L ); } + + /*! + * 5*pi/4 (225 degrees) + */ + static constexpr T _5pi4 () { return T( 0.3926990816987241548078304229099378625e+01L ); } + + /*! + * 3*pi/2 (270 degrees) + */ + static constexpr T _3pi2 () { return T( 0.471238898038468985769396507491925435e+01L ); } + + /*! + * 7*pi/4 (315 degrees) + */ + static constexpr T _7pi4 () { return T( 0.5497787143782138167309625920739130075e+01L ); } + + /*! + * 2*pi (360 degrees) + */ + static constexpr T _2pi () { return T( 0.62831853071795864769252867665590058e+01L ); } + + /*! + * 1/pi + */ + static constexpr T _1_pi () { return T( 0.3183098861837906715377675267450287224677e+00L ); } + + /*! + * 2/pi + */ + static constexpr T _2_pi () { return T( 0.6366197723675813430755350534900574449355e+00L ); } + + /*! + * 2/sqrt( pi ) + */ + static constexpr T _2_sqrtpi () { return T( 0.11283791670955125738961589031215451688501e+01L ); } + + /*! + * 180/pi - the radians-to-degrees conversion factor. + */ + static constexpr T deg () { return T( 0.572957795130823208767981548141051700441964e+02L ); } + + /*! + * Pi/180 - the degrees-to-radians conversion factor. + */ + static constexpr T rad () { return T( 0.174532925199432957692369076848861272222e-01L ); } + + /*! + * The Euler constant e. + */ + static constexpr T e () { return T( 0.27182818284590452353602874713526625e+01L ); } + + /*! + * log2( e ) + */ + static constexpr T log2e () { return T( 0.14426950408889634073599246810018920709799e+01L ); } + + /*! + * log2( 10 ) + */ + static constexpr T log210 () { return T( 0.33219280948873623478703194294893900118996e+01L ); } + + /*! + * log10( e ) + */ + static constexpr T log10e () { return T( 0.4342944819032518276511289189166050837280e+00L ); } + + /*! + * log10( 2 ) + */ + static constexpr T log102 () { return T( 0.3010299956639811952137388947244930416265e+00L ); } + + /*! + * ln( 2 ) + */ + static constexpr T ln2 () { return T( 0.6931471805599453094172321214581766e+00L ); } + + /*! + * ln( 10 ) + */ + static constexpr T ln10 () { return T( 0.23025850929940456840179914546843642e+01L ); } + + /*! + * sqrt( 2 ) + */ + static constexpr T sqrt2 () { return T( 0.14142135623730950488016887242096980785696e+01L ); } + + /*! + * 1/sqrt( 2 ) = sqrt( 2 )/2 + */ + static constexpr T _1_sqrt2 () { return T( 0.7071067811865475244008443621048490392848e+00L ); } + + /*! + * sqrt( 2 )/2 = 1/sqrt( 2 ) + */ + static constexpr T sqrt2_2 () { return T( 0.7071067811865475244008443621048490392848e+00L ); } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Constants_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Constants.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Container.h b/3rdparty/include/pcl/Container.h new file mode 100644 index 0000000..9ec34ab --- /dev/null +++ b/3rdparty/include/pcl/Container.h @@ -0,0 +1,134 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Container.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Container_h +#define __PCL_Container_h + +/// \file pcl/Container.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Container + * \brief Root base class of all PCL containers. + */ +class PCL_CLASS Container +{ +}; + +/*! + * \class DirectContainer + * \brief Root base class of all PCL containers of objects. + */ +template +class PCL_CLASS DirectContainer : public Container +{ +public: + + typedef T item_type; +}; + +/*! + * \class IndirectContainer + * \brief Root base class of all PCL containers of pointers to objects. + */ +template +class PCL_CLASS IndirectContainer : public Container +{ +public: + + typedef T* item_type; +}; + +/*! + * \class DirectSortedContainer + * \brief Root base class of all PCL sorted containers of objects. + */ +template +class PCL_CLASS DirectSortedContainer: public DirectContainer +{ +}; + +/*! + * \class IndirectSortedContainer + * \brief Root base class of all PCL sorted containers of pointers to objects. + */ +template +class PCL_CLASS IndirectSortedContainer : public IndirectContainer +{ +}; + +#define PCL_ASSERT_DIRECT_CONTAINER( C, T ) \ + static_assert( std::is_base_of, C>::value, \ + "Argument type must derive from DirectContainer." ) + +#define PCL_ASSERT_INDIRECT_CONTAINER( C, T ) \ + static_assert( std::is_base_of, C>::value, \ + "Argument type must derive from IndirectContainer." ) + +#define PCL_ASSERT_CONTAINER( C, T ) \ + static_assert( std::is_base_of, C>::value \ + || std::is_base_of, C>::value, \ + "Argument type must derive from DirectContainer or IndirectContainer." ) + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Container_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Container.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Control.h b/3rdparty/include/pcl/Control.h new file mode 100644 index 0000000..965dd3c --- /dev/null +++ b/3rdparty/include/pcl/Control.h @@ -0,0 +1,1869 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Control.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Control_h +#define __PCL_Control_h + +/// \file pcl/Control.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FocusStyle + * \brief Control focus styles + * + * Focus styles refer to the way a control can gain the keyboard focus. + * + * + * + * + * + * + * + *
FocusStyle::NoFocus The control does not accept the keyboard focus
FocusStyle::Tab The control can be focused by pressing the tab key
FocusStyle::Click The control can be focused by clicking on it with the mouse
FocusStyle::Wheel The control can be focused with the mouse wheel
FocusStyle::TextListTab Special mode reserved for macOS
+ */ +namespace FocusStyle +{ + enum mask_type + { + NoFocus = 0x00, // The control doesn't accept focus + Tab = 0x01, // Can focus control by pressing the tab key + Click = 0x02, // Can focus control by mouse clicking + Wheel = 0x04, // Can focus control with the mouse wheel + TextListTab = 0x08 // macOS only + }; +} + +/*! + * A combination of focus styles. + */ +typedef Flags FocusStyles; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +class PCL_CLASS View; + +/*! + * \class Control + * \brief Client-side interface to a PixInsight %Control object + * + * ### TODO: Write a detailed description for %Control. + */ +class PCL_CLASS Control : public UIObject +{ +public: + + /*! + * Constructs a control as a child of \a parent. If no non-null parent is + * specified, the control will be an independent object not associated (in + * the hierarchical sense) to any graphical interface element. + * + * The second \c uint32 argument is not used; it is reserved for future + * extensions, and must be zero in current PCL versions. + */ + Control( Control& parent = Null(), uint32 = 0 ); + + /*! + * Destroys a %Control object. + */ + virtual ~Control() + { + } + + /*! + * Copy constructor. Copy and move semantics are disabled for UI controls + * because of client/server parent-children and event handling relations. + */ + Control( const Control& ) = delete; + + /*! + * Copy assignment. Copy and move semantics are disabled for UI controls + * because of client/server parent-children and event handling relations. + */ + Control& operator =( const Control& ) = delete; + + /*! + * Move constructor. Copy and move semantics are disabled for UI controls + * because of client/server parent-children and event handling relations. + */ + Control( Control&& ) = delete; + + /*! + * Move assignment. Copy and move semantics are disabled for UI controls + * because of client/server parent-children and event handling relations. + */ + Control& operator =( Control&& ) = delete; + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since server-side controls are unique objects, calling this member + * function has no effect. + */ + void EnsureUnique() override + { + } + + /*! + * Returns a reference to a null %Control instance. A null %Control does not + * correspond to an existing control in the PixInsight core application. + */ + static Control& Null(); + + /*! + * Returns the frame rectangle of this control. + */ + pcl::Rect FrameRect() const; + + /*! + * Returns the frame width of this control in pixels. + */ + int FrameWidth() const + { + return FrameRect().Width(); + } + + /*! + * Returns the frame height of this control in pixels. + */ + int FrameHeight() const + { + return FrameRect().Height(); + } + + /*! + * Returns the client rectangle of this control in parent coordinates. + */ + pcl::Rect ClientRect() const; + + /*! + * Returns the width in pixels of the client area of this control. + */ + int ClientWidth() const + { + return ClientRect().Width(); + } + + /*! + * A convenient synonym for ClientWidth(). + */ + int Width() const + { + return ClientWidth(); + } + + /*! + * Returns the height in pixels of the client area of this control. + */ + int ClientHeight() const + { + return ClientRect().Height(); + } + + /*! + * A convenient synonym for ClientHeight(). + */ + int Height() const + { + return ClientHeight(); + } + + /*! + * Returns the client rectangle of this control in client coordinates. + * This function is equivalent to: + * Rect( 0, 0, ClientWidth(), ClientHeight() ) + */ + pcl::Rect BoundsRect() const + { + pcl::Rect r( ClientRect() ); + return pcl::Rect( r.Width(), r.Height() ); + } + + /*! # + */ + void SetClientRect( const pcl::Rect& r ) + { + SetClientRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void SetClientRect( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void Resize( int w, int h ); + + /*! # + */ + void AdjustToContents(); + + /*! + * Returns the minimum width in pixels of the client rectangle. + */ + int MinWidth() const + { + int w, dum; GetMinSize( w, dum ); return w; + } + + /*! + * Returns the minimum height in pixels of the client rectangle. + */ + int MinHeight() const + { + int dum, h; GetMinSize( dum, h ); return h; + } + + /*! # + */ + void GetMinSize( int& w, int& h ) const; + + /*! # + */ + void SetMinWidth( int w ) + { + SetMinSize( w, -1 ); + } + + /*! # + */ + void SetMinWidth() + { + SetMinWidth( Width() ); + } + + /*! # + */ + void SetMinHeight( int h ) + { + SetMinSize( -1, h ); + } + + /*! # + */ + void SetMinHeight() + { + SetMinHeight( Height() ); + } + + /*! # + */ + void SetMinSize( int w, int h ); + + /*! # + */ + void SetMinSize() + { + SetMinSize( Width(), Height() ); + } + + /*! + * Returns the maximum width in pixels of the client rectangle. + */ + int MaxWidth() const + { + int w, dum; GetMaxSize( w, dum ); return w; + } + + /*! + * Returns the maximum height in pixels of the client rectangle. + */ + int MaxHeight() const + { + int dum, h; GetMaxSize( dum, h ); return h; + } + + /*! # + */ + void GetMaxSize( int& w, int& h ) const; + + /*! # + */ + void SetMaxWidth( int w ) + { + SetMaxSize( w, -1 ); + } + + /*! # + */ + void SetMaxWidth() + { + SetMaxWidth( Width() ); + } + + /*! # + */ + void SetMaxHeight( int h ) + { + SetMaxSize( -1, h ); + } + + /*! # + */ + void SetMaxHeight() + { + SetMaxHeight( Height() ); + } + + /*! # + */ + void SetMaxSize( int w, int h ); + + /*! # + */ + void SetMaxSize() + { + SetMaxSize( Width(), Height() ); + } + + /*! # + */ + void SetFixedWidth( int w ) + { + SetFixedSize( w, -1 ); + } + + /*! # + */ + void SetFixedWidth() + { + SetFixedWidth( Width() ); + } + + /*! # + */ + void SetFixedHeight( int h ) + { + SetFixedSize( -1, h ); + } + + /*! # + */ + void SetFixedHeight() + { + SetFixedHeight( Height() ); + } + + /*! # + */ + void SetFixedSize( int w, int h ); + + /*! # + */ + void SetFixedSize() + { + SetFixedSize( Width(), Height() ); + } + + /*! # + */ + bool IsFixedWidth() const + { + return MinWidth() == MaxWidth(); + } + + /*! # + */ + bool IsFixedHeight() const + { + return MinHeight() == MaxHeight(); + } + + /*! # + */ + void SetVariableSize() + { + SetMinSize( 0, 0 ); + SetMaxSize( int_max, int_max ); + } + + /*! # + */ + void SetVariableWidth() + { + SetMinWidth( 0 ); + SetMaxWidth( int_max ); + } + + /*! # + */ + void SetVariableHeight() + { + SetMinHeight( 0 ); + SetMaxHeight( int_max ); + } + + /*! + * Returns the minimum width in pixels of the client rectangle. + */ + int ScaledMinWidth() const + { + int w, dum; GetMinSize( w, dum ); return PhysicalPixelsToLogical( w ); + } + + /*! + * Returns the minimum height in pixels of the client rectangle. + */ + int ScaledMinHeight() const + { + int dum, h; GetMinSize( dum, h ); return PhysicalPixelsToLogical( h ); + } + + /*! # + */ + void GetScaledMinSize( int& w, int& h ) const + { + GetMinSize( w, h ); w = PhysicalPixelsToLogical( w ); h = PhysicalPixelsToLogical( h ); + } + + /*! # + */ + void SetScaledMinWidth( int w ) + { + SetMinSize( LogicalPixelsToPhysical( w ), -1 ); + } + + /*! # + */ + void SetScaledMinHeight( int h ) + { + SetMinSize( -1, LogicalPixelsToPhysical( h ) ); + } + + /*! # + */ + void SetScaledMinSize( int w, int h ) + { + SetMinSize( LogicalPixelsToPhysical( w ), LogicalPixelsToPhysical( h ) ); + } + + /*! + * Returns the maximum width in pixels of the client rectangle. + */ + int ScaledMaxWidth() const + { + int w, dum; GetMaxSize( w, dum ); return PhysicalPixelsToLogical( w ); + } + + /*! + * Returns the maximum height in pixels of the client rectangle. + */ + int ScaledMaxHeight() const + { + int dum, h; GetMaxSize( dum, h ); return PhysicalPixelsToLogical( h ); + } + + /*! # + */ + void GetScaledMaxSize( int& w, int& h ) const + { + GetMaxSize( w, h ); w = PhysicalPixelsToLogical( w ); h = PhysicalPixelsToLogical( h ); + } + + /*! # + */ + void SetScaledMaxWidth( int w ) + { + SetMaxSize( LogicalPixelsToPhysical( w ), -1 ); + } + + /*! # + */ + void SetScaledMaxHeight( int h ) + { + SetMaxSize( -1, LogicalPixelsToPhysical( h ) ); + } + + /*! # + */ + void SetScaledMaxSize( int w, int h ) + { + SetMaxSize( LogicalPixelsToPhysical( w ), LogicalPixelsToPhysical( h ) ); + } + + /*! # + */ + void SetScaledFixedWidth( int w ) + { + SetFixedSize( LogicalPixelsToPhysical( w ), -1 ); + } + + /*! # + */ + void SetScaledFixedHeight( int h ) + { + SetFixedSize( -1, LogicalPixelsToPhysical( h ) ); + } + + /*! # + */ + void SetScaledFixedSize( int w, int h ) + { + SetFixedSize( LogicalPixelsToPhysical( w ), LogicalPixelsToPhysical( h ) ); + } + + /*! # + */ + bool IsHorizontalExpansionEnabled() const; + + /*! # + */ + bool IsVerticalExpansionEnabled() const; + + /*! # + */ + void EnableExpansion( bool horzEnable = true, bool vertEnable = true ); + + /*! # + */ + void DisableExpansion( bool horzDisable = true, bool vertDisable = true ) + { + EnableExpansion( !horzDisable, !vertDisable ); + } + + /*! + * Returns the current position of this control in parent coordinates. + * + * The position of a control refers to the upper left corner of its frame + * rectangle. + * + * \sa X(), Y() + */ + pcl::Point Position() const; + + /*! + * Returns the horizontal position of this control in parent coordinates. + * + * \sa Y(), Position() + */ + int X() const + { + return Position().x; + } + + /*! + * Returns the horizontal position of this control in parent coordinates. + * + * \sa X(), Position() + */ + int Y() const + { + return Position().y; + } + + /*! # + */ + void Move( const pcl::Point& p ) + { + Move( p.x, p.y ); + } + + /*! # + */ + void Move( int x, int y ); + + /*! + Returns true if the mouse cursor is over this control. + */ + bool IsUnderMouse() const; + + /*! # + */ + void BringToFront(); + + /*! # + */ + void SendToBack(); + + /*! # + */ + void StackUnder( Control& ); + + /*! # + */ + pcl::Sizer Sizer() const; + + /*! # + * \deprecated Use Control::Sizer() in newly produced code. + */ + pcl::Sizer GetSizer() const + { + return this->Sizer(); + } + + /*! # + */ + void SetSizer( pcl::Sizer& ); + + /*! # + */ + pcl::Point GlobalToLocal( const pcl::Point& p ) const + { + pcl::Point p1 = p; GlobalToLocal( p1.x, p1.y ); return p1; + } + + /*! # + */ + void GlobalToLocal( int& x, int& y ) const; + + /*! # + */ + pcl::Point LocalToGlobal( const pcl::Point& p ) const + { + pcl::Point p1 = p; LocalToGlobal( p1.x, p1.y ); return p1; + } + + /*! # + */ + void LocalToGlobal( int& x, int& y ) const; + + /*! # + */ + pcl::Point ParentToLocal( const pcl::Point& p ) const + { + pcl::Point p1 = p; ParentToLocal( p1.x, p1.y ); return p1; + } + + /*! # + */ + void ParentToLocal( int& x, int& y ) const; + + /*! # + */ + pcl::Point LocalToParent( const pcl::Point& p ) const + { + pcl::Point p1 = p; LocalToParent( p1.x, p1.y ); return p1; + } + + /*! # + */ + void LocalToParent( int& x, int& y ) const; + + /*! # + */ + pcl::Point ControlToLocal( const Control& w, const pcl::Point& p ) const + { + pcl::Point p1 = p; ControlToLocal( w, p1.x, p1.y ); return p1; + } + + /*! # + */ + void ControlToLocal( const Control&, int& x, int& y ) const; + + /*! # + */ + pcl::Point LocalToControl( const Control& w, const pcl::Point& p ) const + { + pcl::Point p1 = p; LocalToControl( w, p1.x, p1.y ); return p1; + } + + /*! # + */ + void LocalToControl( const Control&, int& x, int& y ) const; + + /*! # + */ + Control& ChildByPos( const pcl::Point& p ) const + { + return ChildByPos( p.x, p.y ); + } + + /*! # + */ + Control& ChildByPos( int x, int y ) const; + + /*! # + */ + pcl::Rect ChildrenRect() const; + + /*! # + */ + bool IsAncestorOf( const Control& ) const; + + /*! + * Returns a reference to the parent control, or Control::Null() if this + * control has no parent. + */ + Control& Parent() const; + + /*! # + */ + void SetParent( Control& ); + + /*! + * Returns a reference to the top-level window that owns this control, + * either directly or through its parent. + */ + Control& Window() const; + + /*! # + */ + virtual bool IsEnabled() const; + + /*! # + */ + virtual void Enable( bool enabled = true ); + + /*! # + */ + void Disable( bool disabled = true ) + { + Enable( !disabled ); + } + + /*! # + */ + bool IsMouseTrackingEnabled() const; + + /*! # + */ + void EnableMouseTracking( bool = true ); + + /*! # + */ + void DisableMouseTracking( bool disable = true ) + { + EnableMouseTracking( !disable ); + } + + /*! # + */ + bool IsVisible() const; + + /*! # + */ + void SetVisible( bool visible ) + { + if ( visible ) + Show(); + else + Hide(); + } + + /*! # + */ + void Show(); + + /*! # + */ + pcl::Rect VisibleRect() const; + + /*! # + */ + bool IsHidden() const + { + return !IsVisible(); + } + + /*! # + */ + void Hide(); + + /*! # + */ + bool IsMaximized() const; + + /*! # + */ + bool IsMinimized() const; + + /*! # + */ + bool IsModal() const; + + /*! # + */ + bool IsWindow() const; + + /*! # + */ + bool IsActiveWindow() const; + + /*! # + */ + void ActivateWindow(); + + /*! # + */ + bool IsFocused() const; + + /*! # + */ + void Focus( bool focus = true ); + + /*! # + */ + void Unfocus() + { + Focus( false ); + } + + /*! # + */ + FocusStyles FocusStyle() const; + + /*! # + */ + void SetFocusStyle( FocusStyles ); + + /*! # + */ + Control& FocusedChild() const; + + /*! # + */ + Control& ChildToFocus() const; + + /*! # + */ + void SetChildToFocus( Control& ); + + /*! # + */ + Control& NextSiblingToFocus() const; + + /*! # + */ + void SetNextSiblingToFocus( Control& ); + + /*! # + */ + bool CanUpdate() const; + + /*! # + */ + void EnableUpdates( bool enable = true ); + + /*! # + */ + void DisableUpdates( bool disable = true ) + { + EnableUpdates( !disable ); + } + + /*! # + */ + void Update(); + + /*! # + */ + void Update( const pcl::Rect& r ) + { + Update( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void Update( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void Repaint(); + + /*! # + */ + void Repaint( const pcl::Rect& r ) + { + Repaint( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void Repaint( int x0, int y0, int x1, int y1 ); + + /*! + * Recomputes all style properties for this control: colors, fonts, + * spacings, margings, etc. + * + * Call this function to ensure that the screen rendition of this control + * applies all current settings; for example, after setting a new CSS style + * sheet with SetStyleSheet(). + */ + void Restyle(); + + /*! + * Make sure the control has valid geometry and layout, even if it has never + * been shown on the screen. + * + * Control layouts and geometries are not computed, in general, until the + * control has been shown on the screen, either explicitly or implicitly. By + * calling this member function one can ensure that the control has computed + * a valid layout, including all of its child controls, even if it has never + * been shown, so for example a subsequent call to Width() or ClientRect() + * will provide actual values. + * + * This function can be quite slow, especially for complex controls such as + * process interfaces, so it should only be used when necessary, never on a + * regular basis. Calling this member function for a control that is already + * visible on the screen has no effect. + */ + void EnsureLayoutUpdated(); + + /*! # + */ + void Scroll( const pcl::Point& d ) + { + Scroll( d.x, d.y ); + } + + /*! # + */ + void Scroll( int dx, int dy ); + + /*! # + */ + void Scroll( const pcl::Point& d, const pcl::Rect& r ) + { + Scroll( d.x, d.y, r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void Scroll( int dx, int dy, int x0, int y0, int x1, int y1 ); + + /*! # + */ + pcl::Cursor Cursor() const; + + /*! # + * \deprecated Use Control::Cursor() in newly produced code. + */ + pcl::Cursor GetCursor() const + { + return this->Cursor(); + } + + /*! # + */ + void SetCursor( const pcl::Cursor& ); + + /*! # + */ + void SetCursorToParent(); + + /*! # + */ + String StyleSheet() const; + + /*! # + */ + void SetStyleSheet( const String& css ); + + /*! # + */ + RGBA BackgroundColor() const; + + /*! # + */ + void SetBackgroundColor( RGBA ); + + /*! # + */ + RGBA ForegroundColor() const; + + /*! # + */ + void SetForegroundColor( RGBA ); + + /*! # + */ + RGBA CanvasColor(); + + /*! # + */ + void SetCanvasColor( RGBA ); + + /*! # + */ + RGBA AlternateCanvasColor() const; + + /*! # + */ + void SetAlternateCanvasColor( RGBA ); + + /*! # + */ + RGBA TextColor() const; + + /*! # + */ + void SetTextColor( RGBA ); + + /*! # + */ + RGBA ButtonColor() const; + + /*! # + */ + void SetButtonColor( RGBA ); + + /*! # + */ + RGBA ButtonTextColor() const; + + /*! # + */ + void SetButtonTextColor( RGBA ); + + /*! # + */ + RGBA HighlightColor() const; + + /*! # + */ + void SetHighlightColor( RGBA ); + + /*! # + */ + RGBA HighlightedTextColor() const; + + /*! # + */ + void SetHighlightedTextColor( RGBA ); + + /*! # + */ + pcl::Font Font() const; + + /*! + * \deprecated Use Control::Font() in newly produced code. + */ + pcl::Font GetFont() const + { + return this->Font(); + } + + /*! # + */ + void SetFont( const pcl::Font& ); + + /*! # + */ + double WindowOpacity() const; + + /*! # + */ + void SetWindowOpacity( double ); + + /*! # + */ + String WindowTitle() const; + + /*! # + */ + void SetWindowTitle( const String& ); + + /* + * Information areas on processing interface control bars. + */ + + /*! # + */ + String InfoText() const; + + /*! # + */ + void SetInfoText( const String& ); + + /*! # + */ + void ClearInfoText() + { + SetInfoText( String() ); + } + + /* + * Track View check boxes on processing interface control bars. + */ + + /*! # + */ + bool IsTrackViewActive() const; + + /*! # + */ + void SetTrackViewActive( bool = true ); + + /*! # + */ + void ActivateTrackView() + { + SetTrackViewActive( true ); + } + + /*! # + */ + void DeactivateTrackView() + { + SetTrackViewActive( false ); + } + + /* + * Real-Time Preview check boxes on processing interface control bars. + */ + + /*! # + */ + bool IsRealTimePreviewActive() const; + + /*! # + */ + void SetRealTimePreviewActive( bool = true ); + + /*! # + */ + void ActivateRealTimePreview() + { + SetRealTimePreviewActive( true ); + } + + /*! # + */ + void DeactivateRealTimePreview() + { + SetRealTimePreviewActive( false ); + } + + // + + /*! # + */ + String ToolTip() const; + + /*! # + */ + void SetToolTip( const String& ); + + /*! + * Shows a new tool tip window. + * + * \param x,y Position (horizontal, vertical) of the new tool tip + * window in global coordinates. + * + * \param text Tool tip text. Can be either a plain text string or + * include HTML tags with CSS style properties. If this is an + * empty string the tool tip window will be hidden, if already + * visible. + * + * \param control If this is not a null control, the tool tip window will + * be hidden as soon as the cursor moves out of the control + * boundaries or, if specified, out of the \a rect rectangle in + * local coordinates. + * + * \param rect If a non-void rectangle is specified, the tool tip + * window will be hidden as soon as the cursor moves out of it. + * If a non-null \a control is specified, the coordinates of + * \a rect are local to it; otherwise global coordinates are + * assumed. + * + * The new tool tip window will be shown (or hidden if an empty text is + * specified) immediately. + */ + static void ShowToolTip( int x, int y, const String& text, + const Control& control = Control::Null(), const Rect& rect = Rect( 0 ) ); + + /*! + * Shows a new tool tip window. + * + * This function is equivalent to + * ShowToolTip( pos.x, pos.y, text, control, rect ). + */ + static void ShowToolTip( const Point& pos, const String& text, + const Control& control = Control::Null(), const Rect& rect = Rect( 0 ) ) + { + ShowToolTip( pos.x, pos.y, text, control, rect ); + } + + /*! + * Hides the tool tip window, if one is currently visible. + */ + static void HideToolTip(); + + /*! + * Returns the tool tip window's text, if a tool tip window is currently + * visible. + */ + static String ToolTipText(); + + // + + /*! + * Returns the ratio between physical screen pixels and device-independent + * logical screen units for the parent top-level window of this %Control + * object. This ratio is used as a scaling factor by the + * LogicalPixelsToPhysical() and PhysicalPixelsToLogical() functions, which + * are used internally by automatic size scaling member functions + * such as SetScaledFixedSize(), ScaledMinWidth(), etc. + * + * The returned value is greater than or equal to one. Typical pixel ratios + * are 1.5 and 2.0 for high-density displays such as 4K and 5K monitors, + * respectively, or 1.0 for normal 96 dpi monitors. + * + * On macOS, this function normally returns 1.0 for Retina displays working + * in high-dpi modes, since the operating system performs the conversion + * from logical to physical pixels automatically. The ResourcePixelRatio() + * member function returns the actual ratio between physical and logical + * screen pixels on macOS. + * + * \ingroup ui_scaling_functions + * \sa LogicalPixelsToPhysical(), PhysicalPixelsToLogical(), + * ResourcePixelRatio() + */ + double DisplayPixelRatio() const; + + /*! + * Returns the ratio between physical screen pixels and pixels of + * device-independent image resources reproduced on the parent top-level + * window of this %Control object. This ratio is used as a scaling factor by + * the ScaledResource() member function. + * + * The returned value is greater than or equal to one. Typical resource + * pixel ratios are 1.5 and 2.0 for high-density displays such as 4K and 5K + * monitors, respectively, 2.0 for Retina displays, or 1.0 for normal 96 dpi + * monitors. + * + * On macOS with Retina monitors working in high-dpi modes, this function + * returns a value greater than one (typically 2.0), while + * DisplayPixelRatio() normally returns one by default. This is because in + * high-dpi modes, macOS works in logical display coordinates to represent + * text, control sizes and distances. However, image resources must be + * provided with pixel data in the physical screen resolution. On X11 and + * Windows platforms, where no automatic display scaling is performed, this + * member function is equivalent to DisplayPixelRatio(). + * + * Portable code should use the value returned by this member function to + * scale image resources drawn on controls, such as icons and bitmaps. The + * ScaledResource() function can be used to select the appropriate file + * paths from PixInsight core resources. The LogicalPixelsToResource() + * function can be used to calculate scaled dimensions of graphical elements + * generated dynamically from scalable resources, e.g. with + * Bitmap::FromSVGFile() and similar routines. + * + * \ingroup ui_scaling_functions + * \sa LogicalPixelsToResource(), ResourcePixelsToLogical(), + * ScaledResource(), DisplayPixelRatio(), + */ + double ResourcePixelRatio() const; + + /*! + * Returns the specified bitmap \a resource path adapted to be represented + * with the physical display pixel ratio of this control. Calling this + * function is equivalent to: + * + * \code pcl::UIScaledResource( ResourcePixelRatio(), resource ); \endcode + * + * Example: + * + * \code + * Dialog dlg; + * Bitmap bmp( dlg.ScaledResource( ":/browser/enabled.png" ) ); + * \endcode + * + * \ingroup ui_scaling_functions + * \sa ResourcePixelRatio() + */ + template + String ScaledResource( R resource ) const + { + return UIScaledResource( ResourcePixelRatio(), resource ); + } + + /*! + * Returns a CSS source code fragment transformed with scaled dimensions in + * pixels and scaled resource file paths, and optionally point sizes + * converted to scaled pixel sizes. + * + * \param cssCode A string containing the input CSS source code. The + * function will return a transformed version of this + * string. + * + * \param fontDPI If greater than zero, this is the font resolution, in + * dots per inch (dpi), for transformation of point sizes + * to scaled pixel sizes. If this parameter is zero (the + * default value), this routine will use the font + * resolution currently selected in core user preferences + * (which is the value of the "Application/FontResolution" + * global integer variable; see PixInsightSettings). If + * this parameter is a negative integer, no point-to-pixel + * conversions will be applied. + * + * Calling this function is equivalent to: + * + * \code + * pcl::UIScaledStyleSheet( DisplayPixelRatio(), ResourcePixelRatio(), cssCode, fontDPI ); + * \endcode + * + * Example: + * + * \code + * Data_TreeBox.SetStyleSheet( ScaledStyleSheet( + * "QTreeView {" + * " font-family: DejaVu Sans Mono, Monospace;" + * " font-size: 10pt;" + * " background-image: url(:/image-window/transparent.png);" + * "}" + * "QTreeView::item {" + * " padding: 4px 8px 4px 8px;" + * "}" + * "QHeaderView::section {" + * " padding: 2px 8px 2px 8px;" + * "}" + * ) ); + * \endcode + * + * If the display and resource pixel ratios of \c Data_TreeBox were 1.5 (for + * example, on a 4K monitor), and the current font resolution were 100 dpi, + * the code above would be equivalent to: + * + * \code + * Data_TreeBox.SetStyleSheet( + * "QTreeView {" + * " font-family: DejaVu Sans Mono, Monospace;" + * " font-size: 21px;" + * " background-image: url(:/image-window/1.5/transparent.png);" + * "}" + * "QTreeView::item {" + * " padding: 6px 12px 6px 12px;" + * "}" + * "QHeaderView::section {" + * " padding: 3px 12px 3px 12px;" + * "}" + * ); + * \endcode + * + * \ingroup ui_scaling_functions + * \sa DisplayPixelRatio(), ResourcePixelRatio(), ScaledResource() + */ + template + String ScaledStyleSheet( S cssCode, int fontDPI = 0 ) const + { + return UIScaledStyleSheet( DisplayPixelRatio(), ResourcePixelRatio(), cssCode, fontDPI ); + } + + /*! + * Returns a cursor hot spot point with coordinates scaled according to the + * physical display pixel ratio of this control. + * + * Standard cursor images in PixInsight are scaled in a special way to + * guarantee that cursors always have a unique central pixel, irrespective + * of the applied display pixel ratios. This is functionally equivalent to + * ensure that cursors always have odd dimensions. + * + * According to this rule, a standard cursor is a square image with the + * following dimensions in pixels: + * + * 21, 33, 43, 53, 63, 75, 85 + * + * respectively for the standard scaling ratios 1.0, 1.5, 2.0, 2.5, 3.0, 3.5 + * and 4.0. For dynamic cursors this function must be used to calculate + * scaled cursor hot spot coordinates, instead of simply scaling by + * multiplication with ResourcePixelRatio() and rounding. This also + * guarantees source code compatibility with future versions of PixInsight, + * where standard cursor dimensions might change. + * + * \ingroup ui_scaling_functions + * \sa ResourcePixelRatio(); + */ + Point ScaledCursorHotSpot( int xHot, int yHot ) const + { + double r = ResourcePixelRatio(); + return Point( RoundInt( r*(xHot + 0.499) ), RoundInt( r*(yHot + 0.499) ) ); + } + + /*! + * Returns a cursor hot spot point with coordinates scaled according to the + * physical display pixel ratio of this control. + * + * This function is equivalent to: + * + * \code ScaledCursorHotSpot( hotSpot.x, hotSpot.y ); \endcode + * + * \ingroup ui_scaling_functions + */ + Point ScaledCursorHotSpot( const Point& hotSpot ) const + { + return ScaledCursorHotSpot( hotSpot.x, hotSpot.y ); + } + + /*! + * Returns the specified \a size in logical device-independent pixel units + * converted to physical device pixels. + * + * \ingroup ui_scaling_functions + * \sa DisplayPixelRatio(), PhysicalPixelsToLogical(), + * LogicalPixelsToResource() + */ + int LogicalPixelsToPhysical( int size ) const + { + return RoundInt( DisplayPixelRatio()*size ); + } + + /*! + * Returns the specified \a size in physical device pixels converted to + * logical device-independent pixel units. + * + * \ingroup ui_scaling_functions + * \sa DisplayPixelRatio(), LogicalPixelsToPhysical(), + * ResourcePixelsToLogical() + */ + int PhysicalPixelsToLogical( int size ) const + { + return RoundInt( size/DisplayPixelRatio() ); + } + + /*! + * Returns the specified \a size in logical device-independent pixel units + * converted to resource pixel units. + * + * The returned value corresponds to physical display device pixels on all + * supported operating systems and desktop managers. + * + * \ingroup ui_scaling_functions + * \sa ResourcePixelRatio(), ResourcePixelsToLogical(), + * LogicalPixelsToPhysical() + */ + int LogicalPixelsToResource( int size ) const + { + return RoundInt( ResourcePixelRatio()*size ); + } + + /*! + * Returns the specified \a size in resource pixel units converted to + * logical device-independent pixel units. + * + * \ingroup ui_scaling_functions + * \sa ResourcePixelRatio(), LogicalPixelsToResource(), + * PhysicalPixelsToLogical() + */ + int ResourcePixelsToLogical( int size ) const + { + return RoundInt( size/ResourcePixelRatio() ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnDestroy( Control& sender ); + // void OnShow( Control& sender ); + // void OnHide( Control& sender ); + // void OnGetFocus( Control& sender ); + // void OnLoseFocus( Control& sender ); + // void OnEnter( Control& sender ); + // void OnLeave( Control& sender ); + // void OnMove( Control& sender, const pcl::Point& newPos, const pcl::Point& oldPos ); + // void OnResize( Control& sender, int newWidth, int newHeight, int oldWidth, int oldHeight ); + // void OnPaint( Control& sender, const pcl::Rect& updateRect ); + // void OnKeyPress( Control& sender, int key, unsigned modifiers, bool& wantsKey ); + // void OnKeyRelease( Control& sender, int key, unsigned modifiers, bool& wantsKey ); + // void OnMouseMove( Control& sender, const pcl::Point& pos, unsigned buttons, unsigned modifiers ); + // void OnMouseDoubleClick( Control& sender, const pcl::Point& pos, unsigned buttons, unsigned modifiers ); + // void OnMousePress( Control& sender, const pcl::Point& pos, int button, unsigned buttons, unsigned modifiers ); + // void OnMouseRelease( Control& sender, const pcl::Point& pos, int button, unsigned buttons, unsigned modifiers ); + // void OnMouseWheel( Control& sender, const pcl::Point& pos, int delta, unsigned buttons, unsigned modifiers ); + // void OnFileDrag( Control& sender, const pcl::Point& pos, const StringList& files, unsigned modifiers, bool& wantsFiles ) + // void OnFileDrop( Control& sender, const pcl::Point& pos, const StringList& files, unsigned modifiers ) + // void OnViewDrag( Control& sender, const pcl::Point& pos, const View& view, unsigned modifiers, bool& wantsView ) + // void OnViewDrop( Control& sender, const pcl::Point& pos, const View& view, unsigned modifiers ) + // void OnChildCreate( Control& sender, Control& child ); + // void OnChildDestroy( Control& sender, Control& child ); + + /*! + * \defgroup control_event_handlers Control Event Handlers + */ + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*event_handler)( Control& sender ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*close_event_handler)( Control& sender, bool& allowClose ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*move_event_handler)( Control& sender, const pcl::Point& newPos, const pcl::Point& oldPos ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*resize_event_handler)( Control& sender, int newWidth, int newHeight, int oldWidth, int oldHeight ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*paint_event_handler)( Control& sender, const pcl::Rect& updateRect ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*keyboard_event_handler)( Control& sender, int key, unsigned modifiers, bool& wantsKey ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*mouse_event_handler)( Control& sender, const pcl::Point& pos, unsigned buttons, unsigned modifiers ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*mouse_button_event_handler)( Control& sender, const pcl::Point& pos, int button, unsigned buttons, unsigned modifiers ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*mouse_wheel_event_handler)( Control& sender, const pcl::Point& pos, int delta, unsigned buttons, unsigned modifiers ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*file_drag_event_handler)( Control& sender, const pcl::Point& pos, const StringList& files, unsigned modifiers, bool& wantsFiles ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*file_drop_event_handler)( Control& sender, const pcl::Point& pos, const StringList& files, unsigned modifiers ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*view_drag_event_handler)( Control& sender, const pcl::Point& pos, const View& view, unsigned modifiers, bool& wantsView ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*view_drop_event_handler)( Control& sender, const pcl::Point& pos, const View& view, unsigned modifiers ); + + /*! # + * \ingroup control_event_handlers + */ + typedef void (Control::*child_event_handler)( Control& sender, Control& child ); + + /*! # + * \ingroup control_event_handlers + */ + void OnDestroy( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnShow( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnHide( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnClose( close_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnGetFocus( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnLoseFocus( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnEnter( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnLeave( event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMove( move_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnResize( resize_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnPaint( paint_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnKeyPress( keyboard_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnKeyRelease( keyboard_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMouseMove( mouse_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMouseDoubleClick( mouse_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMousePress( mouse_button_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMouseRelease( mouse_button_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnMouseWheel( mouse_wheel_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnFileDrag( file_drag_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnFileDrop( file_drop_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnViewDrag( view_drag_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnViewDrop( view_drop_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnChildCreate( child_event_handler, Control& ); + + /*! # + * \ingroup control_event_handlers + */ + void OnChildDestroy( child_event_handler, Control& ); + + // ------------------------------------------------------------------------- + +private: + + struct EventHandlers + { + event_handler onDestroy = nullptr; + event_handler onShow = nullptr; + event_handler onHide = nullptr; + close_event_handler onClose = nullptr; + event_handler onGetFocus = nullptr; + event_handler onLoseFocus = nullptr; + event_handler onEnter = nullptr; + event_handler onLeave = nullptr; + move_event_handler onMove = nullptr; + resize_event_handler onResize = nullptr; + paint_event_handler onPaint = nullptr; + keyboard_event_handler onKeyPress = nullptr; + keyboard_event_handler onKeyRelease = nullptr; + mouse_event_handler onMouseMove = nullptr; + mouse_event_handler onMouseDoubleClick = nullptr; + mouse_button_event_handler onMousePress = nullptr; + mouse_button_event_handler onMouseRelease = nullptr; + mouse_wheel_event_handler onMouseWheel = nullptr; + file_drag_event_handler onFileDrag = nullptr; + file_drop_event_handler onFileDrop = nullptr; + view_drag_event_handler onViewDrag = nullptr; + view_drop_event_handler onViewDrop = nullptr; + child_event_handler onChildCreate = nullptr; + child_event_handler onChildDestroy = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + +protected: + + /*! + * \internal + * Private constructor from a low-level opaque server handle. + */ + Control( void* h ) : UIObject( h ) + { + } + + /*! + * \internal + * Reimplemented from UIObject. Throws an Error exception because Control + * objects are unique, and hence cannot be duplicated. + */ + void* CloneHandle() const override; + + friend class BitmapBox; + friend class CheckBox; + friend class CodeEditor; + friend class ComboBox; + friend class ControlEventDispatcher; + friend class Dialog; + friend class Edit; + friend class Frame; + friend class GraphicsContextBase; + friend class GroupBox; + friend class ImageView; + friend class Label; + friend class PushButton; + friend class RadioButton; + friend class ScrollBox; + friend class Sizer; + friend class Slider; + friend class SpinBox; + friend class TabBox; + friend class TextBox; + friend class ToolButton; + friend class TreeBox; + friend class ViewList; + friend class WebView; +}; + +// ---------------------------------------------------------------------------- + +template inline +int CanonicalControlHeightImplementation() +{ + Control container; + VerticalSizer sizer; + C control; + + sizer.Add( control ); + container.SetSizer( sizer ); + container.Restyle(); + container.AdjustToContents(); + container.SetFixedSize(); + return container.Height(); +} + +/*! + * \defgroup aux_control_functions_and_classes Control Helper Functions and Classes + */ + +/*! + * \def CanonicalControlHeight( control_type ) + * \brief Returns the canonical height in pixels for a specified control type. + * + * The canonical height is the height in pixels that a control of the specified + * type would have once adjusted into a VerticalSizer container and a parent + * control object. This macro is useful to calculate the height of a control in + * advance, before actually creating its component sub-controls. + * + * \ingroup aux_control_functions_and_classes + */ +#define CanonicalControlHeight( control_type ) \ + CanonicalControlHeightImplementation() + +// ---------------------------------------------------------------------------- + +#define __PCL_NO_ALIAS_HANDLERS \ + if ( IsAlias() ) \ + throw Error( "Aliased controls cannot set event handlers." ) + +// ---------------------------------------------------------------------------- + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Control_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Control.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Convolution.h b/3rdparty/include/pcl/Convolution.h new file mode 100644 index 0000000..e73ac9d --- /dev/null +++ b/3rdparty/include/pcl/Convolution.h @@ -0,0 +1,359 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Convolution.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Convolution_h +#define __PCL_Convolution_h + +/// \file pcl/Convolution.h + +#include +#include + +#include +#include +#include +#include +#include + +#define __PCL_CONVOLUTION_TINY_WEIGHT 1.0e-20 + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Convolution + * \brief Discrete two-dimensional nonseparable convolution in the spatial + * domain + * + * %Convolution implements a fully multithreaded, two-dimensional discrete + * nonseparable convolution algorithm. It performs automatic fixing of + * border artifacts by applying Neumann boundary conditions (mirroring). + * + * \note ImageTransformation is a virtual base class of %Convolution. + * + * \sa SeparableConvolution, FFTConvolution, KernelFilter + */ +class PCL_CLASS Convolution : public InterlacedTransformation, + public ThresholdedTransformation, + public ParallelProcess +{ // NB: ImageTransformation is a virtual base class +public: + + /*! + * Default constructor. + * + * \note This constructor yields an uninitialized instance that cannot be + * used before explicit association with a KernelFilter instance. + */ + Convolution() = default; + + /*! + * Constructs a %Convolution instance with the specified filter. + * + * \param filter Response function, or convolution filter. The + * specified object does not have to remain valid while this + * instance is actively used, since %Convolution owns a + * private copy of the filter (note that KernelFilter is a + * reference-counted class). + */ + Convolution( const KernelFilter& filter ) + { + SetFilter( filter ); + } + + /*! + * Copy constructor. + */ + Convolution( const Convolution& x ) + : InterlacedTransformation( x ) + , ThresholdedTransformation( x ) + , ParallelProcess( x ) + , m_weight( x.m_weight ) + , m_highPass( x.m_highPass ) + , m_rawHighPass( x.m_rawHighPass ) + , m_rescaleHighPass( x.m_rescaleHighPass ) + { + if ( !x.m_filter.IsNull() ) + m_filter = x.m_filter->Clone(); + } + + /*! + * Move constructor. + */ + Convolution( Convolution&& ) = default; + + /*! + * Destroys this %Convolution object. + */ + virtual ~Convolution() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Convolution& operator =( const Convolution& x ) + { + if ( &x != this ) + { + (void)InterlacedTransformation::operator =( x ); + (void)ThresholdedTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + if ( x.m_filter.IsNull() ) + m_filter.Destroy(); + else + m_filter = x.m_filter->Clone(); + m_weight = x.m_weight; + m_highPass = x.m_highPass; + m_rawHighPass = x.m_rawHighPass; + m_rescaleHighPass = x.m_rescaleHighPass; + } + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Convolution& operator =( Convolution&& ) = default; + + /*! + * Returns a reference to the kernel filter currently associated with this + * %Convolution object. + * + * If this object has not been initialized, this member function returns an + * empty kernel filter. + */ + const KernelFilter& Filter() const + { + PCL_PRECONDITION( !m_filter.IsNull() ) + return *m_filter; + } + + /*! + * Sets a new kernel \a filter to be applied by this %Convolution object. + */ + void SetFilter( const KernelFilter& filter ) + { + m_filter = filter.Clone(); + CacheFilterProperties(); + } + + /*! + * Returns the current filter weight. The filter weight is computed each + * time a kernel filter is associated with this object. It is only + * applied for low-pass filters as a normalization factor. For more + * information, see the documentation for KernelFilter::Weight(). + * + * The filter weight and other filter properties are cached in private data + * members for quick reference. + */ + double FilterWeight() const + { + return m_weight; + } + + /*! + * Returns true if the kernel filter currently associated with this + * %Convolution object is a high-pass filter; false if it is a low-pass + * filter. For more information, see the documentation for + * kernelFilter::IsHighPassFilter(). + * + * Each time a kernel filter is associated with this object, its high-pass + * nature is checked and stored, along with other filter properties, in + * private data members. This allows for quick lookup of critical filter + * characteristics without degrading performance. + */ + bool IsHighPassFilter() const + { + return m_highPass; + } + + /*! + * Returns true iff out-of-range values will be rescaled for normalization of + * images after convolution with a high-pass filter. + * + * A high-pass filter has negative coefficients. As a result, some pixels in + * the convolved image may have negative values. Saturated pixels (values + * above one) can also result, depending on the filter coefficients. The + * standard behavior is to truncate out-of-range pixel values to the [0,1] + * range, which preserves the dynamics of the convolved image, so high-pass + * rescaling is disabled by default. When high-pass rescaling is enabled, + * the resulting image is \e normalized (that is, rescaled to [0,1] only if + * there are out-of-range values) and hence all the data after convolution + * are preserved at the cost of reducing the overall contrast of the image. + * Finally, if raw high-pass convolution has been enabled, + * out-of-range values are neither truncated nor rescaled irrespective of + * the value returned by this function. See the documentation for + * IsRawHighPassEnabled() for more information. + */ + bool IsHighPassRescalingEnabled() const + { + return m_rescaleHighPass; + } + + /*! + * Enables (or disables) high-pass rescaling of out-of-range convolved pixel + * values. See the documentation for IsHighPassRescalingEnabled() for more + * information. + */ + void EnableHighPassRescaling( bool enable = true ) + { + m_rescaleHighPass = enable; + } + + /*! + * Disables (or enables) high-pass rescaling of out-of-range convolved pixel + * values. See the documentation for IsHighPassRescalingEnabled() for more + * information. + */ + void DisableHighPassRescaling( bool disable = true ) + { + EnableHighPassRescaling( !disable ); + } + + /*! + * Returns true iff raw high-pass convolution is enabled. When raw + * high-pass convolution is enabled, out-of-range values after convolution + * with a high-pass filter are neither truncated nor normalized. Note that + * this is only relevant to convolution of floating point data. + * + * Raw high-pass convolution is disabled by default. For more information on + * out-of-range convolution results, refer to the documentation for + * IsHighPassRescalingEnabled(). + */ + bool IsRawHighPassEnabled() const + { + return m_rawHighPass; + } + + /*! + * Enables (or disables) raw high-pass convolution. See the documentation + * for IsRawHighPassEnabled() for more information. + */ + void EnableRawHighPass( bool enable = true ) + { + m_rawHighPass = enable; + } + + /*! + * Disables (or enables) raw high-pass convolution. See the documentation + * for IsRawHighPassEnabled() for more information. + */ + void DisableRawHighPass( bool disable = true ) + { + EnableRawHighPass( !disable ); + } + + /*! + * Returns the length in pixels of the overlapping regions between adjacent + * areas processed by parallel execution threads. The overlapping distance + * is a function of the filter size and the interlacing distance. + */ + int OverlappingDistance() const + { + PCL_PRECONDITION( !m_filter.IsNull() ) + return m_filter->Size() + (m_filter->Size() - 1)*(InterlacingDistance() - 1); + } + +protected: + + /* + * The response function for convolution is defined as a kernel filter. + */ + AutoPointer m_filter; + + /* + * Cached filter properties. + */ + double m_weight = 0; // filter weight for low-pass normalization + bool m_highPass = false; // true if this is a high-pass filter + + /* + * User-selectable options + */ + bool m_rawHighPass = false; // neither truncate nor normalize out-of-range values + bool m_rescaleHighPass = false; // truncate out-of-range values instead of normalize + + /* + * In-place 2-D nonseparable convolution algorithm in the spatial domain. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + +private: + + void CacheFilterProperties() + { + PCL_PRECONDITION( !m_filter.IsNull() ) + PCL_PRECONDITION( !m_filter->IsEmpty() ) + ValidateFilter(); + m_highPass = m_filter->IsHighPassFilter(); + m_weight = m_filter->Weight(); + if ( pcl::Abs( m_weight ) < __PCL_CONVOLUTION_TINY_WEIGHT ) + m_weight = 1; + } + + void ValidateFilter() const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Convolution_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Convolution.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Crop.h b/3rdparty/include/pcl/Crop.h new file mode 100644 index 0000000..67afd52 --- /dev/null +++ b/3rdparty/include/pcl/Crop.h @@ -0,0 +1,261 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Crop.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Crop_h +#define __PCL_Crop_h + +/// \file pcl/Crop.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + \namespace pcl::CropMode + \brief Image cropping modes for the Crop geometric transformation + + + + + + +
CropMode::RelativeMargins Cropping margins are relative to current image dimensions
CropMode::AbsolutePixels Absolute cropping margins in pixels
CropMode::AbsoluteCentimeters Absolute cropping margins in centimeters
CropMode::AbsoluteInches Absolute cropping margins in inches
+*/ +namespace CropMode +{ + enum value_type + { + RelativeMargins, // Cropping margins are relative to current image dimensions + AbsolutePixels, // Absolute cropping margins in pixels + AbsoluteCentimeters, // Absolute cropping margins in centimeters + AbsoluteInches // Absolute cropping margins in inches + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Crop + * \brief %Image cropping/expansion algorithm + * + * %Crop is a noninterpolating geometric transformation class that allows + * cropping an image or expanding it by specifying separate cropping margins + * for each side. When a cropping margin is negative the image is cropped, and + * when it is positive, the image is expanded. + */ +class PCL_CLASS Crop : public GeometricTransformation, + public ImageResolution +{ +public: + + /*! + * Represents a cropping mode. + */ + typedef CropMode::value_type crop_mode; + + /*! + * Constructs a %Crop object with the specified cropping margins for + * the \a left, \a top, \a right and \a bottom sides. + */ + Crop( double left = 0, double top = 0, double right = 0, double bottom = 0 ) + : m_margins( left, top, right, bottom ) + , m_mode( CropMode::RelativeMargins ) + { + } + + /*! + * Constructs a %Crop object whose cropping margins are defined by the + * components of a rectangle \a r. + */ + template + Crop( const GenericRectangle& r ) + : m_margins( r ) + , m_mode( CropMode::RelativeMargins ) + { + } + + /*! + * Copy constructor. + */ + Crop( const Crop& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Crop& operator =( const Crop& ) = default; + + /*! + * Returns a rectangle whose components correspond to the current cropping + * margins of this %Crop object. + */ + DRect Margins() const + { + return m_margins; + } + + /*! + * Sets the cropping margins equal to the components of a specified + * rectangle \a r. + */ + template + void SetMargins( const GenericRectangle& r ) + { + m_margins = r; + } + + /*! + * Sets the specified \a left, \a top, \a right and \a bottom cropping + * margins. + */ + void SetMargins( int left, int top, int right, int bottom ) + { + m_margins = Rect( left, top, right, bottom ); + } + + /*! + * Returns the current cropping mode of this %Crop object. + */ + crop_mode Mode() const + { + return m_mode; + } + + /*! + * Returns true iff this %Crop object interprets its cropping margins + * relative to current image dimensions. Returns false if cropping margins + * are interpreted as absolute increments. + */ + bool IsRelative() const + { + return m_mode == CropMode::RelativeMargins; + } + + /*! + * Returns true iff this %Crop object interprets its cropping margins as + * absolute increments. Returns false if cropping margins are interpreted + * relative to current image dimensions. + */ + bool IsAbsolute() const + { + return !IsRelative(); + } + + /*! + * Sets the cropping \a mode for this %Crop object. + */ + void SetMode( crop_mode mode ) + { + m_mode = mode; + } + + /*! + * Returns the current vector of per-channel filling values for uncovered + * image regions. + * + * See the documentation for SetFillValues() for more information. + */ + const DVector& FillValues() const + { + return m_fillValues; + } + + /*! + * Sets a vector of per-channel filling values for uncovered image regions. + * + * Uncovered regions result when a %Crop instance extends an image due to + * positive cropping margins. + * + * By default, there are no filling values defined (and hence the returned + * vector is empty by default). When the %Crop instance is executed and a + * filling value is not defined for a channel of the target image, uncovered + * regions are filled with the minimum sample value in the native range of + * the image (usually zero). + */ + void SetFillValues( const DVector& fillValues ) + { + m_fillValues = fillValues; + } + + /*! + */ + void GetNewSizes( int& width, int& height ) const override; + +protected: + + DRect m_margins; + crop_mode m_mode; + DVector m_fillValues; + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Crop_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Crop.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Cryptography.h b/3rdparty/include/pcl/Cryptography.h new file mode 100644 index 0000000..9bca685 --- /dev/null +++ b/3rdparty/include/pcl/Cryptography.h @@ -0,0 +1,1103 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Cryptography.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Cryptography_h +#define __PCL_Cryptography_h + +/// \file pcl/Cryptography.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup cryptography_classes Cryptographic Hashing and Encryption Classes + */ + +/*! + * \class CryptographicHash + * \brief Abstract base class for cryptographic hashing algorithm + * implementations + * + * %CryptographicHash defines a common interface for implementations of + * cryptographic hashing algorithms such as MD-5, SHA-1 or SHA-256. + * + * \ingroup cryptography_classes + * \sa MD5, SHA1, SHA224, SHA256, SHA384, SHA512, CryptographicHashFactory + */ +class PCL_CLASS CryptographicHash +{ +public: + + /*! + * Default constructor. + */ + CryptographicHash() = default; + + /*! + * Destroys a %CryptographicHash object. + */ + virtual ~CryptographicHash() + { + } + + /*! + * Copy constructor. This constructor is disabled because %CryptographicHash + * objects are unique. + */ + CryptographicHash( const CryptographicHash& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %CryptographicHash + * objects are unique. + */ + CryptographicHash& operator =( const CryptographicHash& ) = delete; + + /*! + * Returns the name of this cryptographic hashing algorithm. + */ + virtual String AlgorithmName() const = 0; + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + */ + virtual size_type HashLength() const = 0; + + /*! + * Initializes this cryptographic hash generator. + */ + virtual void Initialize() = 0; + + /*! + * Updates the hash generator with a new \a data chunk of the specified + * \a length in bytes. + */ + virtual void Update( const void* data, size_type length ) = 0; + + /*! + * Updates the hash generator with data from a container with contiguous + * storage. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + */ + template + void Update( const C& data ) + { + Update( data.Begin(), data.Size() ); + } + + /*! + * Terminates hash generation and returns the computed message digest + * as a ByteArray instance. + */ + ByteArray Finalize() + { + ByteArray hash( HashLength() ); + Finalize( hash.Begin() ); + return hash; + } + + /*! + * Returns the hash sequence (message digest) corresponding to a \a data + * block of the specified \a length in bytes, stored in the specified + * \a hash array. The specified array must provide room for at least + * HashLength() bytes, that is, the length in bytes of the message digest + * produced by this hashing algorithm. + */ + void Hash( uint8* hash, const void* data, size_type length ) + { + Initialize(); + Update( data, length ); + Finalize( hash ); + } + + /*! + * Returns the hash sequence (message digest) corresponding to a \a data + * block of the specified \a length in bytes, as a ByteArray instance. + */ + ByteArray Hash( const void* data, size_type length ) + { + ByteArray hash( HashLength() ); + Hash( hash.Begin(), data, length ); + return hash; + } + + /*! + * Returns the hash sequence (message digest) corresponding to a container + * \a data with contiguous storage as a ByteArray instance. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + */ + template + ByteArray Hash( const C& data ) + { + return Hash( data.Begin(), data.Size() ); + } + +protected: + + /*! + * Terminates hash generation and returns the computed message digest + * (hash value) stored in the specified \a hash array. The specified array + * must provide room for at least HashLength() bytes, that is, the length in + * bytes of the message digest produced by this hashing algorithm. + */ + virtual void Finalize( void* hash ) = 0; + + friend class CryptographicHashFactory; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MD5 + * \brief Implementation of the %MD5 cryptographic hashing algorithm + * + * \b References + * + * Message Digest algorithm 5 (%MD5) was designed by Ronald Rivest in 1991. + * %MD5 is a widely-used Internet standard published as RFC-1321 by RSA: + * + * http://tools.ietf.org/html/rfc1321 + * + * An %MD5 message digest (or %MD5 hash value) is 128 bits (16 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, SHA1, SHA224, SHA256, SHA384, SHA512, + * CryptographicHashFactory + */ +class PCL_CLASS MD5 : public CryptographicHash +{ +public: + + /*! + * Constructs an %MD5 hash generator. + */ + MD5() = default; + + /*! + * Destroys an %MD5 hash generator. + */ + virtual ~MD5(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "MD5". + */ + String AlgorithmName() const override + { + return "MD5"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %MD5, this function returns 16, the length in bytes + * of an %MD5 digest. + */ + size_type HashLength() const override + { + return 16; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SHA1 + * \brief Implementation of the SHA-1 cryptographic hashing algorithm + * + * \b References + * + * The initial Secure Hash Algorithm (SHA) was published by NIST in 1993 as the + * Secure Hash Standard, FIPS PUB 180. The SHA-1 algorithm was defined in a + * revised version published in 1995, FIPS PUB 180-1. The latest specification + * has been released in FIPS PUB 180-4: + * + * http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + * + * An SHA-1 message digest (or SHA-1 hash value) is 160 bits (20 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA224, SHA256, SHA384, SHA512, + * CryptographicHashFactory + */ +class PCL_CLASS SHA1 : public CryptographicHash +{ +public: + + /*! + * Constructs an SHA-1 hash generator. + */ + SHA1() = default; + + /*! + * Destroys an SHA-1 hash generator. + */ + virtual ~SHA1(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "SHA1". + */ + String AlgorithmName() const override + { + return "SHA1"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %SHA1, this function returns 20, the length in bytes + * of an SHA-1 digest. + */ + size_type HashLength() const override + { + return 20; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; // RFC4634 + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SHA224 + * \brief Implementation of the SHA-224 cryptographic hashing algorithm + * + * \b References + * + * The SHA-2 family of secure hash functions (SHA-256, SHA-384, and SHA-512) + * was specified by NIST in 2002 with the publication of FIPS PUB 180-2. The + * SHA-224 variant was released in a change notice for FIPS PUB 180-2 in 2004. + * FIPS PUB 180-2 has been superseded by FIPS PUB 180-3 and FIPS PUB 180-4: + * + * http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + * + * An SHA-224 message digest is 224 bits (28 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA1, SHA256, SHA384, SHA512, + * CryptographicHashFactory + */ +class PCL_CLASS SHA224 : public CryptographicHash +{ +public: + + /*! + * Constructs an SHA-224 hash generator. + */ + SHA224() = default; + + /*! + * Destroys an SHA-224 hash generator. + */ + virtual ~SHA224(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "SHA224". + */ + String AlgorithmName() const override + { + return "SHA224"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %SHA224, this function returns 28, the length in + * bytes of an SHA-224 digest. + */ + size_type HashLength() const override + { + return 28; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; // RFC4634 + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SHA256 + * \brief Implementation of the SHA-256 cryptographic hashing algorithm + * + * \b References + * + * The SHA-2 family of secure hash functions (SHA-256, SHA-384, and SHA-512) + * was specified by NIST in 2002 with the publication of FIPS PUB 180-2. FIPS + * PUB 180-2 has been superseded by FIPS PUB 180-3 and FIPS PUB 180-4: + * + * http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + * + * An SHA-256 message digest is 256 bits (32 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA1, SHA224, SHA384, SHA512, + * CryptographicHashFactory + */ +class PCL_CLASS SHA256 : public CryptographicHash +{ +public: + + /*! + * Constructs an SHA-256 hash generator. + */ + SHA256() = default; + + /*! + * Destroys an SHA-256 hash generator. + */ + virtual ~SHA256(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "SHA256". + */ + String AlgorithmName() const override + { + return "SHA256"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %SHA256, this function returns 32, the length in + * bytes of an SHA-256 digest. + */ + size_type HashLength() const override + { + return 32; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; // RFC4634 + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SHA384 + * \brief Implementation of the SHA-384 cryptographic hashing algorithm + * + * \b References + * + * The SHA-2 family of secure hash functions (SHA-384, SHA-384, and SHA-512) + * was specified by NIST in 2002 with the publication of FIPS PUB 180-2. FIPS + * PUB 180-2 has been superseded by FIPS PUB 180-3 and FIPS PUB 180-4: + * + * http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + * + * An SHA-384 message digest is 384 bits (48 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA1, SHA224, SHA256, SHA512, + * CryptographicHashFactory + */ +class PCL_CLASS SHA384 : public CryptographicHash +{ +public: + + /*! + * Constructs an SHA-384 hash generator. + */ + SHA384() = default; + + /*! + * Destroys an SHA-384 hash generator. + */ + virtual ~SHA384(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "SHA384". + */ + String AlgorithmName() const override + { + return "SHA384"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %SHA384, this function returns 48, the length in + * bytes of an SHA-384 digest. + */ + size_type HashLength() const override + { + return 48; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; // RFC4634 + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SHA512 + * \brief Implementation of the SHA-512 cryptographic hashing algorithm + * + * \b References + * + * The SHA-2 family of secure hash functions (SHA-384, SHA-384, and SHA-512) + * was specified by NIST in 2002 with the publication of FIPS PUB 180-2. FIPS + * PUB 180-2 has been superseded by FIPS PUB 180-3 and FIPS PUB 180-4: + * + * http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + * + * An SHA-512 message digest is 512 bits (64 bytes) long. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA1, SHA224, SHA256, SHA384, + * CryptographicHashFactory + */ +class PCL_CLASS SHA512 : public CryptographicHash +{ +public: + + /*! + * Constructs an SHA-512 hash generator. + */ + SHA512() = default; + + /*! + * Destroys an SHA-512 hash generator. + */ + virtual ~SHA512(); + + /*! + * Returns the name of this cryptographic hashing algorithm: "SHA512". + */ + String AlgorithmName() const override + { + return "SHA512"; + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + * + * As reimplemented in %SHA512, this function returns 64, the length in + * bytes of an SHA-512 digest. + */ + size_type HashLength() const override + { + return 64; + } + + /*! + */ + void Initialize() override; + + /*! + */ + void Update( const void* data, size_type length ) override; + +private: + + void* m_context = nullptr; // RFC4634 + + /*! + */ + void Finalize( void* hash ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class CryptographicHashFactory + * \brief Selectable cryptographic hashing algorithm + * + * %CryptographicHashFactory implements a cryptographic hashing algorithm that + * can be selected upon construction among all of the algorithms implemented in + * the PixInsight/PCL platform. This currently includes MD-5, SHA-1, SHA-224, + * SHA-256, SHA-384, and SHA-512. + * + * \ingroup cryptography_classes + * \sa CryptographicHash, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 + */ +class PCL_CLASS CryptographicHashFactory : public CryptographicHash +{ +public: + + /*! + * Constructs a %CryptographicHashFactory object to implement the specified + * hashing algorithm. + * + * \param algorithmName Name of a supported cryptographic hashing algorithm. + * Currently this parameter can be one of: "md5", + * "sha1", "sha224", "sha256", "sha384", and "sha512". + * Comparisons are performed on trimmed strings and + * case-insensitive. + * + * If an invalid or unsupported algorithm name is specified, this + * constructor throws an Error exception. + */ + CryptographicHashFactory( const IsoString& algorithmName ) + { + switch ( algorithmName.Trimmed().CaseFolded().Hash32() ) + { + case 0x445dd715: m_hash = new MD5; break; + case 0x3cac24af: m_hash = new SHA1; break; + case 0x7e50b015: m_hash = new SHA224; break; + case 0xcbbce793: m_hash = new SHA256; break; + case 0x858a0d3d: m_hash = new SHA384; break; + case 0xb24dfd53: m_hash = new SHA512; break; + default: + throw Error( "CryptographicHashFactory: Unknown/unsupported algorithm \'" + algorithmName + '\'' ); + } + } + + CryptographicHashFactory( const IsoString::ustring_base& algorithmName ) + : CryptographicHashFactory( IsoString( algorithmName ) ) + { + } + + /*! + * Destroys a %CryptographicHashFactory object. + */ + virtual ~CryptographicHashFactory() + { + } + + /*! + * Returns the name of this cryptographic hashing algorithm. + */ + String AlgorithmName() const override + { + return m_hash->AlgorithmName(); + } + + /*! + * Returns the length in bytes of a hash sequence (or message digest) + * calculated with this cryptographic hashing algorithm. + */ + size_type HashLength() const override + { + return m_hash->HashLength(); + } + + /*! + * Initializes this cryptographic hash generator. + */ + void Initialize() override + { + m_hash->Initialize(); + } + + /*! + * Updates the hash generator with a new \a data chunk of the specified + * \a length in bytes. + */ + void Update( const void* data, size_type length ) override + { + m_hash->Update( data, length ); + } + +private: + + AutoPointer m_hash; + + void Finalize( void* hash ) override + { + m_hash->Finalize( hash ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Cipher + * \brief Abstract base class for cipher algorithm implementations + * + * %Cipher defines a common interface for implementations of algorithms + * performing encryption and decryption of generic data. + * + * Currently we have implemented the AES-256 cipher with CBC/ECB encryption and + * decryption on the PixInsight platform, available as the AES256 class. + * + * \ingroup cryptography_classes + * \sa AES256 + */ +class PCL_CLASS Cipher +{ +public: + + /*! + * Default constructor. + */ + Cipher() = default; + + /*! + * Copy constructor. + */ + Cipher( const Cipher& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Cipher& operator =( const Cipher& ) = default; + + /*! + * Destroys a %Cipher object. + */ + virtual ~Cipher() + { + } + + /*! + * Returns the name of this cipher algorithm. + */ + virtual String AlgorithmName() const = 0; + + /*! + * Returns the length in bytes of a key in this cipher algorithm. + */ + virtual size_type KeyLength() const = 0; + + /*! + * Buffer encryption. + * + * \param[out] output Starting address of the output buffer, where the + * encrypted data (or cipher text) will be stored. + * + * \param input Starting address of the input buffer, where the original + * data (or plain text) is stored. + * + * \param length The buffer length in bytes. + */ + virtual void Encrypt( void* output, const void* input, size_type length ) const = 0; + + /*! + * Buffer decryption. + * + * \param[out] output Starting address of the output buffer, where the + * decrypted data (or plain text) will be stored. + * + * \param input Starting address of the input buffer, where the encrypted + * data (or cipher text) is stored. + * + * \param length The buffer length in bytes. + */ + virtual void Decrypt( void* output, const void* input, size_type length ) const = 0; + + /*! + * Container encryption. + * + * \param[out] output Starting address of the output buffer, where the + * encrypted data (or cipher text) will be stored. + * + * \param input Reference to a container where the original data (or + * plain text) is stored as a contiguous block. The + * input container will be treated as a contiguous sequence + * of bytes, ignoring the data type of the items contained. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + */ + template + void Encrypt( void* output, const C& input ) const + { + Encrypt( output, input.Begin(), input.Size() ); + } + + /*! + * Out-of-place container encryption. + * + * \param input Reference to a container where the original data (or + * plain text) is stored as a contiguous block. The + * input container will be treated as a contiguous sequence + * of bytes, ignoring the data type of the items contained. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + * + * Returns a ByteArray object with the encrypted data, or cipher + * text. The returned object can be used to decrypt the data with the + * Decrypt() member function. + */ + template + ByteArray Encrypt( const C& input ) const + { + ByteArray output( input.Size() ); + Encrypt( output.Begin(), input.Begin(), input.Size() ); + return output; + } + + /*! + * Container decryption. + * + * \param[out] output Starting address of the output buffer, where the + * decrypted data (or plain text) will be stored. + * + * \param input Reference to a container where the encrypted data (or + * cipher text) is stored as a contiguous block. The + * input container will be treated as a contiguous sequence + * of bytes, ignoring the data type of the items contained. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + */ + template + void Decrypt( void* output, const C& input ) const + { + Decrypt( output, input.Begin(), input.Size() ); + } + + /*! + * Out-of-place container decryption. + * + * \param input Reference to a container where the encrypted data (or + * cipher text) is stored as a contiguous block. The + * input container will be treated as a contiguous sequence + * of bytes, ignoring the data type of the items contained. + * + * The \c C template argument must be a class with PCL container semantics + * (the Begin() and Size() member functions are required). Typically the + * ByteArray class is used, although any array-like class with contiguous + * storage is appropriate, including Array, String, Vector and Matrix. + * + * Returns a ByteArray object with the decrypted data, or plain + * text), as a contiguous sequence of bytes. + */ + template + ByteArray Decrypt( const C& input ) const + { + ByteArray output( input.Size() ); + Decrypt( output.Begin(), input.Begin(), input.Size() ); + return output; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class AES256 + * \brief AES-256 cipher + * + * The %AES256 class is a FIPS-197 compliant implementation of the Advanced + * Encryption Standard (AES) cipher using 256-bit keys. + * + * \b References + * + * The AES (Advanced Encryption Standard) block cipher algorithm (originally + * called \e Rijndael) was designed by Vincent Rijmen and Joan Daemen: + * + * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf + * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + * + * \ingroup cryptography_classes + */ +class PCL_CLASS AES256 : public Cipher +{ +public: + + enum { key_length = 32, block_length = 16 }; + + /*! + * Represents a 256-bit cipher key for the AES-256 algorithm. + */ + typedef uint8 key_type[ key_length ]; + + /*! + * Represents a 16-byte ECB encryption/decription block for the AES-256 + * algorithm. + */ + typedef uint8 block_type[ block_length ]; + + /*! + * Constructs an AES-256 cipher object. + * + * \param key Starting address of a contiguous block of 32 bytes, which + * will be treated as the 256-bit cipher key. The first 32 + * bytes stored at this address will be wiped out (replaced + * with zeros) by this constructor. + * + * \note For enhanced security, this constructor wipes out the specified + * cipher \a key, filling it with 32 zero bytes. If you want to preserve the + * key (which in general is a bad idea for security reasons), make + * a safe copy before invoking this constructor. + */ + AES256( void* key ) + { + SetKey( key ); + } + + /*! + * Constructs an AES-256 cipher object. + * + * \param key 256-bit cipher key specified as an 8-bit string. The + * contents of this string Will be wiped out (filled with + * null characters) by this constructor. + * + * The AES-256 cipher key will be initialized with the lowercase hexadecimal + * representation of 20 successive MD5 checksum operations applied to the + * specified \a key string (note that an %MD5 checksum is a sequence of 16 + * bytes, whose hexadecimal representation has 32 characters, or 256 bits). + * + * \note For enhanced security, this constructor wipes out the specified + * cipher \a key string, filling it with null characters. If you want to + * preserve the original key (which in general is a bad idea for + * security reasons), make a copy and ensure it references its string data + * uniquely before invoking this constructor. + */ + AES256( IsoString& key ) + { + ByteArray h = MD5().Hash( key ); + key.SecureFill(); + for ( int i = 1; i < 20; ++i ) + h = MD5().Hash( h ); + IsoString k = IsoString::ToHex( h ); + h.Fill( uint8( 0 ) ); + SetKey( k.Begin() ); + } + + /*! + * Copy constructor. + */ + AES256( const AES256& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + AES256& operator =( const AES256& ) = default; + + /*! + * Destroys an AES-256 cipher object. + */ + virtual ~AES256() + { + } + + /*! + * Returns "AES256", the name of this cipher algorithm. + */ + String AlgorithmName() const override + { + return "AES256"; + } + + /*! + * Returns 32, the length in bytes of a key in the AES-256 cipher algorithm. + */ + size_type KeyLength() const override + { + return 32; + } + + /*! + * AES-256 buffer encryption (CBC mode). + * + * \param[out] output Starting address of the output buffer, where the + * encrypted data (or cipher text) will be stored. + * + * \param input Starting address of the input buffer, where the original + * data (or plain text) is stored. + * + * \param length The buffer length in bytes. Must be an integer multiple of + * 16 bytes. + * + * If the specified \a length is not an integer multiple of 16 bytes, this + * function throws an Error exception. If necessary, the source data must + * be padded with zeros or spaces, as required to achieve a valid length. + */ + void Encrypt( void* output, const void* input, size_type length ) const override; + + /*! + * AES buffer decryption (CBC mode). + * + * \param[out] output Starting address of the output buffer, where the + * decrypted data (or plain text) will be stored. + * + * \param input Starting address of the input buffer, where the encrypted + * data (or cipher text) is stored. + * + * \param length The buffer length in bytes. Must be an integer multiple of + * 16 bytes. + * + * If the specified \a length is not an integer multiple of 16 bytes, this + * function throws an Error exception. + */ + void Decrypt( void* output, const void* input, size_type length ) const override; + + /*! + * AES block encryption (ECB mode). + * + * \param[out] output Starting address of the encrypted 16-byte block. + * + * \param input Starting address of the input 16-byte block. + */ + void EncryptBlock( void* output, const void* input ) const; + + /*! + * AES block decryption (ECB mode). + * + * \param[out] output Starting address of the decrypted 16-byte block. + * + * \param input Starting address of the input 16-byte block. + */ + void DecryptBlock( void* output, const void* input ) const; + +private: + + uint32 m_erk[ 60 ]; // encryption round keys, 4*(Nr+1) elements + uint32 m_drk[ 60 ]; // decryption round keys, 4*(Nr+1) elements + + /*! + * \internal + * Sets a new encryption/decryption key. Generates the round key tables and + * wipes out 32 contiguous bytes starting at \a key. + */ + void SetKey( void* key ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Cryptography_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Cryptography.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/CubicSplineInterpolation.h b/3rdparty/include/pcl/CubicSplineInterpolation.h new file mode 100644 index 0000000..a698935 --- /dev/null +++ b/3rdparty/include/pcl/CubicSplineInterpolation.h @@ -0,0 +1,357 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/CubicSplineInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_CubicSplineInterpolation_h +#define __PCL_CubicSplineInterpolation_h + +/// \file pcl/CubicSplineInterpolation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_x this->m_x +#define m_y this->m_y + +/*! + * \class CubicSplineInterpolation + * \brief Generic interpolating cubic spline + * + * Interpolation with piecewise cubic polynomials. Spline interpolation is + * usually preferred to interpolation with high-degree polynomials, which are + * subject to oscillations caused by the Runge's phenomenon. + * + * \sa AkimaInterpolation, LinearInterpolation + */ +template +class PCL_CLASS CubicSplineInterpolation : public UnidimensionalInterpolation +{ +public: + + typedef typename UnidimensionalInterpolation::vector_type vector_type; + + /*! + * Constructs an empty %CubicSplineInterpolation instance, which cannot be + * used for interpolation prior to initialization. + */ + CubicSplineInterpolation() = default; + + /*! + * Copy constructor. + */ + CubicSplineInterpolation( const CubicSplineInterpolation& ) = default; + + /*! + * Move constructor. + */ + CubicSplineInterpolation( CubicSplineInterpolation&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~CubicSplineInterpolation() + { + } + + /*! + * Gets the boundary conditions of this interpolating cubic spline. + * + * \param[out] y1 First derivative of the interpolating cubic spline at + * the first data point x[0]. + * + * \param[out] yn First derivative of the interpolating cubic spline at + * the last data point x[n-1]. + */ + void GetBoundaryConditions( double& y1, double& yn ) const + { + y1 = m_dy1; + yn = m_dyn; + } + + /*! + * Sets the boundary conditions of this interpolating cubic spline. + * + * \param y1 First derivative of the interpolating cubic spline at the + * first data point x[0]. + * + * \param yn First derivative of the interpolating cubic spline at the + * last data point x[n-1]. + */ + void SetBoundaryConditions( double y1, double yn ) + { + Clear(); + m_dy1 = y1; + m_dyn = yn; + } + + /*! + * Generation of an interpolating cubic spline. + * + * \param x %Vector of x-values:\n + * \n + * \li If \a x is not empty: Must be a vector of monotonically + * increasing, distinct values: x[0] < x[1] < ... < x[n-1].\n + * \li If \a x is empty: This function will generate a natural cubic + * spline with implicit x[i] = i for i = {0,1,...,n-1}. + * + * \param y %Vector of function values for i = {0,1,...,n-1}. + * + * When \a x is an empty vector, a natural spline is always + * generated: boundary conditions are ignored and taken as zero at both ends + * of the data sequence. + * + * The length of the \a y vector (and also the length of a nonempty \a x + * vector) must be \e n >= 2. + */ + void Initialize( const vector_type& x, const vector_type& y ) override + { + if ( y.Length() < 2 ) + throw Error( "CubicSplineInterpolation::Initialize(): Less than two data points specified." ); + + try + { + Clear(); + UnidimensionalInterpolation::Initialize( x, y ); + + int n = this->Length(); + m_dy2 = DVector( n ); + m_current = -1; // prepare for 1st interpolation + DVector w( n ); // working vector + + if ( m_x ) + { + /* + * Cubic splines with explicit x[i] for i = {0,...,n-1}. + */ + if ( m_dy1 == 0 && m_dyn == 0 ) + { + /* + * Natural cubic spline. + */ + m_dy2[0] = m_dy2[n-1] = w[0] = 0; + + for ( int i = 1; i < n-1; ++i ) + { + double s = (double( m_x[i] ) - double( m_x[i-1] )) / (double( m_x[i+1] ) - double( m_x[i-1] )); + double p = s*m_dy2[i-1] + 2; + m_dy2[i] = (s - 1)/p; + w[i] = (double( m_y[i+1] ) - double( m_y[i ] )) / (double( m_x[i+1] ) - double( m_x[i ] )) + - (double( m_y[i ] ) - double( m_y[i-1] )) / (double( m_x[i ] ) - double( m_x[i-1] )); + w[i] = (6*w[i]/(double( m_x[i+1] ) - double( m_x[i-1] )) - s*w[i-1])/p; + } + + for ( int i = n-2; i > 0; --i ) // N.B. w[0] is not defined + m_dy2[i] = m_dy2[i]*m_dy2[i+1] + w[i]; + } + else + { + /* + * Cubic spline with prescribed end point derivatives. + */ + w[0] = 3/(double( m_x[1] ) - double( m_x[0] )) + * ((double( m_y[1] ) - double( m_y[0] ))/(double( m_x[1] ) - double( m_x[0] )) - m_dy1); + + m_dy2[0] = -0.5; + + for ( int i = 1; i < n-1; ++i ) + { + double s = (double( m_x[i] ) - double( m_x[i-1] )) / (double( m_x[i+1] ) - double( m_x[i-1] )); + double p = s*m_dy2[i-1] + 2; + m_dy2[i] = (s - 1)/p; + w[i] = (double( m_y[i+1] ) - double( m_y[i ] )) / (double( m_x[i+1] ) - double( m_x[i ] )) + - (double( m_y[i ] ) - double( m_y[i-1] )) / (double( m_x[i ] ) - double( m_x[i-1] )); + w[i] = (6*w[i]/(double( m_x[i+1] ) - double( m_x[i-1] )) - s*w[i-1])/p; + } + + m_dy2[n-1] = (3/(double( m_x[n-1] ) - double( m_x[n-2] )) + * (m_dyn - (double( m_y[n-1] ) - double( m_y[n-2] ))/(double( m_x[n-1] ) - double( m_x[n-2] ))) - w[n-2]/2) + / (1 + m_dy2[n-2]/2); + + for ( int i = n-2; i >= 0; --i ) + m_dy2[i] = m_dy2[i]*m_dy2[i+1] + w[i]; + } + } + else + { + /* + * Natural cubic spline with + * implicit x[i] = i for i = {0,1,...,n-1}. + */ + m_dy2[0] = m_dy2[n-1] = w[0] = 0; + + for ( int i = 1; i < n-1; ++i ) + { + double p = m_dy2[i-1]/2 + 2; + m_dy2[i] = -0.5/p; + w[i] = double( m_y[i+1] ) - 2*double( m_y[i] ) + double( m_y[i-1] ); + w[i] = (3*w[i] - w[i-1]/2)/p; + } + + for ( int i = n-2; i > 0; --i ) // N.B. w[0] is not defined + m_dy2[i] = m_dy2[i]*m_dy2[i+1] + w[i]; + } + } + catch ( ... ) + { + Clear(); + throw; + } + } + + /*! + * Cubic spline interpolation. Returns an interpolated value at the + * specified point \a x. + */ + double operator()( double x ) const override + { + PCL_PRECONDITION( IsValid() ) + + int n = this->Length(); + + if ( m_x ) + { + /* + * Cubic spline with explicit x[i] for i = {0,...,n-1}. + */ + + /* + * Bracket the evaluation point x by binary search of the closest + * pair of data points, if needed. m_current < 0 signals first-time + * evaluation since initialization. + */ + int j0 = m_current, j1; + if ( j0 < 0 || x < m_x[j0] || m_x[j0+1] < x ) + for ( j0 = 0, j1 = n-1; j1-j0 > 1; ) + { + int m = (j0 + j1) >> 1; + if ( x < m_x[m] ) + j1 = m; + else + j0 = m; + } + else + j1 = j0 + 1; + m_current = j0; + + /* + * Distance h between the closest neighbors. Will be zero (or + * insignificant) if two or more x values are equal with respect to + * the machine epsilon for type T. + */ + double h = double( m_x[j1] ) - double( m_x[j0] ); + if ( 1 + h == 1 ) + return 0.5*(double( m_y[j0] ) + double( m_y[j1] )); + + double a = (double( m_x[j1] ) - x)/h; + double b = (x - double( m_x[j0] ))/h; + return a*double( m_y[j0] ) + + b*double( m_y[j1] ) + + ((a*a*a - a)*m_dy2[j0] + (b*b*b - b)*m_dy2[j1])*h*h/6; + } + else + { + /* + * Natural cubic spline with implicit x[i] = i for i = {0,1,...,n-1}. + */ + int j0 = pcl::Range( pcl::TruncInt( x ), 0, n-1 ); + int j1 = pcl::Min( n-1, j0+1 ); + double a = j1 - x; + double b = x - j0; + return a*double( m_y[j0] ) + + b*double( m_y[j1] ) + + ((a*a*a - a)*m_dy2[j0] + (b*b*b - b)*m_dy2[j1])/6; + } + } + + /*! + * Resets this cubic spline interpolation, deallocating all internal + * working structures. + */ + void Clear() override + { + UnidimensionalInterpolation::Clear(); + m_dy2.Clear(); + } + + /*! + * Returns true iff this interpolation is valid, i.e. if it has been + * correctly initialized and is ready to interpolate function values. + */ + bool IsValid() const override + { + return m_dy2; + } + +private: + + double m_dy1 = 0; // 1st derivative of spline at the first data point + double m_dyn = 0; // 1st derivative of spline at the last data point + DVector m_dy2; // second derivatives of the interpolating function at x[i] + mutable int m_current = -1; // index of the current interpolation segment +}; + +#undef m_x +#undef m_y + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_CubicSplineInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/CubicSplineInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Cursor.h b/3rdparty/include/pcl/Cursor.h new file mode 100644 index 0000000..fb13a65 --- /dev/null +++ b/3rdparty/include/pcl/Cursor.h @@ -0,0 +1,297 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Cursor.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Cursor_h +#define __PCL_Cursor_h + +/// \file pcl/Cursor.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::StdCursor + * \brief Standard cursor shapes available in the PixInsight core application + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
StdCursor::NoCursor No cursor is shown
StdCursor::Arrow Standard arrow cursor (pointing left)
StdCursor::InvArrow Inverted arrow cursor (pointing right)
StdCursor::UpArrow Upwards arrow
StdCursor::DownArrow Downwards arrow
StdCursor::LeftArrow Leftwards arrow
StdCursor::RightArrow Rightwards arrow
StdCursor::Checkmark Checkmark (ok) cursor
StdCursor::Crossmark Crossmark (cancel) cursor
StdCursor::Accept Arrow + checkmark
StdCursor::Reject Arrow + crossmark
StdCursor::Add Arrow + plus sign
StdCursor::Copy Arrow + square
StdCursor::Cross Crosshair
StdCursor::Hourglass Hourglass (native Windows wait cursor)
StdCursor::Watch Watch (native Macintosh wait cursor)
StdCursor::Wait Default wait cursor (same as StdCursor::Watch)
StdCursor::ArrowWait Arrow + hourglass/watch
StdCursor::ArrowQuestion Arrow + question mark
StdCursor::IBeam I-beam cursor (text edition)
StdCursor::VerticalSize Vertical resize
StdCursor::HorizontalSize Horizontal resize
StdCursor::ForwardDiagonalSize Forward diagonal resize (/)
StdCursor::BackwardDiagonalSize Backward diagonal resize (\\)
StdCursor::SizeAll Resize in all directions
StdCursor::VerticalSplit Split vertical
StdCursor::HorizontalSplit Split horizontal
StdCursor::Hand Pointing hand cursor
StdCursor::PointingHand Pointing hand cursor (same as StdCursor::Hand)
StdCursor::OpenHand Open hand cursor (used to inform about dragging operations)
StdCursor::ClosedHand Closed hand cursor (used during active dragging operations)
StdCursor::SquarePlus Plus sign into a square (used for zooming in)
StdCursor::SquareMinus Minus sign into a square (used for zooming out)
StdCursor::CirclePlus Plus sign into a circle (used for zooming in)
StdCursor::CircleMinus Minus sign into a circle (used for zooming out)
StdCursor::Forbidden Stop cursor
+ */ +namespace StdCursor +{ + enum value_type + { + NoCursor, // no cursor is shown + Arrow, // standard arrow cursor (pointing left) + InvArrow, // inverted arrow cursor (pointing right) + UpArrow, // upwards arrow + DownArrow, // downwards arrow + LeftArrow, // leftwards arrow + RightArrow, // rightwards arrow + Checkmark, // checkmark (ok) cursor + Crossmark, // crossmark (cancel) cursor + Accept, // arrow + checkmark + Reject, // arrow + crossmark + Add, // arrow + plus sign + Copy, // arrow + square + Cross, // crosshair + Hourglass, // hourglass (native Windows wait cursor) + Watch, // watch (native Macintosh wait cursor) + Wait = Watch, // wait cursor: we like the watch! :) + ArrowWait, // arrow + hourglass/watch + ArrowQuestion, // arrow + question mark + IBeam, // I-beam cursor (text edition) + VerticalSize, // vertical resize + HorizontalSize, // horizontal resize + ForwardDiagonalSize, // forward diagonal resize (/) + BackwardDiagonalSize, // backward diagonal resize (\) + SizeAll, // resize in all directions + VerticalSplit, // split vertical + HorizontalSplit, // split horizontal + Hand, // pointing hand cursor + PointingHand = Hand, // pointing hand cursor (same as Hand) + OpenHand, // open hand cursor + ClosedHand, // closed hand cursor + SquarePlus, // plus sign into a square (used for zoom in) + SquareMinus, // minus sign into a square (used for zoom out) + CirclePlus, // plus sign into a circle (used for zoom in) + CircleMinus, // minus sign into a circle (used for zoom out) + Forbidden // stop cursor + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class Bitmap; + +// ---------------------------------------------------------------------------- + +/*! + * \class Cursor + * \brief Client-side interface to a PixInsight %Cursor object + * + * ### TODO: Write a detailed description for %Cursor. + */ +class PCL_CLASS Cursor : public UIObject +{ +public: + + /*! + * Represents a standard cursor shape. + */ + typedef StdCursor::value_type std_cursor; + + /*! + * Constructs a %Cursor object with the specified standard cursor \a shape. + */ + Cursor( std_cursor shape = StdCursor::Arrow ); + + /*! + * Constructs a %Cursor object with the specified \a bmp shape and + * hot spot coordinates \a hotSpot. + */ + Cursor( const Bitmap& bmp, const pcl::Point& hotSpot ); + + /*! + * Constructs a %Cursor object with the specified \a bmp shape and + * hot spot coordinates \a hotSpotX and \a hotSpotY. + */ + Cursor( const Bitmap& bmp, int hotSpotX = 0, int hotSpotY = 0 ); + + /*! + * Copy constructor. This object will reference the same server-side cursor + * as the specified instance \a c. + */ + Cursor( const Cursor& c ) : UIObject( c ) + { + } + + /*! + * Move constructor. + */ + Cursor( Cursor&& x ) : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a %Cursor object. If this object references an existing cursor + * in the PixInsight core application, its reference count is decremented. + * If it becomes unreferenced, it will be garbage-collected. + */ + virtual ~Cursor() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side cursor as the specified + * instance \a c. If the previous cursor becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + Cursor& operator =( const Cursor& c ) + { + SetHandle( c.handle ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Cursor& operator =( Cursor&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null cursor. A null %Cursor object does + * not correspond to an existing cursor object in the PixInsight core + * application. + */ + static Cursor& Null(); + + /*! + * Returns the hot spot coordinates of this %Cursor object. + * + * The hot spot is the active point of the cursor. It is used by + * the operating system to calculate the current cursor position. Hot spot + * coordinates are given relative to the upper left corner of the cursor's + * shape bitmap. + */ + pcl::Point HotSpot() const; + + /*! + * Returns the current cursor position in global coordinates. + */ + static pcl::Point Position(); + + /*! + * Sets the current cursor position to the specified \a x and \a y global + * coordinates. + */ + static void SetPosition( int x, int y ); + + /*! + * Sets the current cursor position in global coordinates. + * + * This function is equivalent to SetPosition( pos.x, pos.y ). + */ + static void SetPosition( const pcl::Point& pos ) + { + SetPosition( pos.x, pos.y ); + } + +private: + + Cursor( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class Control; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Cursor_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Cursor.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Defs.h b/3rdparty/include/pcl/Defs.h new file mode 100644 index 0000000..444fe85 --- /dev/null +++ b/3rdparty/include/pcl/Defs.h @@ -0,0 +1,1206 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Defs.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Defs_h +#define __PCL_Defs_h + +/// \file pcl/Defs.h + +/*! + * \mainpage notitle + * + *
+ *

+ * PixInsight Class Library + *

+ *

+ * Reference Documentation + *

+ *

+ * Copyright (c) 2003-2021, The PixInsight Development Team. + * All Rights Reserved + *

+ *
+ *
+ *

+ * PixInsight is an advanced image + * processing software platform designed specifically for astronomical + * applications and other technical imaging fields. PixInsight is a + * modular, open-architecture system where the entire processing and file + * handling capabilities are implemented as external installable modules. + *

+ *

+ * The PixInsight core application provides the infrastructure on top of + * which external modules can implement processes, image file formats, + * and their associated user interfaces. The + * PixInsight Class + * Library (PCL) is a C++ development framework to build PixInsight + * modules. + *

+ *

+ * PixInsight modules are special shared libraries (.so files on FreeBSD + * and Linux; .dylib under macOS; .dll files on Windows) that communicate + * with the PixInsight core application through a high-level API provided + * by PCL. Along with a core communication API, PCL includes a + * comprehensive set of image processing algorithms, ranging from + * geometrical transformations to multiscale analysis algorithms, most of + * them available as multithreaded parallel implementations. PCL provides + * also rigorous and efficient implementations of essential astronomical + * algorithms, including state-of-the-art solar system ephemerides, + * vector astrometry, and reduction of positions of solar system and + * stellar objects. + *

+ *

+ * PCL is highly portable code. As of writing this document, it is + * available on the same platforms supported by the PixInsight core + * application: 64-bit FreeBSD, Linux, Mac OS X, and Windows. PixInsight + * modules written around PCL are directly portable to all supported + * platforms without changing a single line of source code. This + * is possible because PCL is a high-level framework. PCL isolates your + * module from platform-specific implementation details: all + * platform-dependent complexities are handled behind the scenes by the + * PixInsight core application and internal PCL routines. + *

+ *

+ * Starting from version 2.0, which was published in December of 2012, + * PCL is an open-source library released under the + * PixInsight + * Class Library License (PCLL). In essence, PCLL is a liberal + * BSD-like license that allows you to develop open-source and + * closed-source, free and commercial PixInsight modules without + * restrictions. As long as you observe all PCLL terms, you can modify + * PCL and use your modified version with or without releasing your + * source code. + *

+ *

+ * The entire source code of PCL, along with all PixInsight modules + * released as open-source products, are available in the + * official PixInsight + * repositories at GitLab. Open-source modules are a good starting + * point for developing new PixInsight modules. PixInsight and PCL are + * supported by a vibrant community on + * PixInsight Forum, which also + * includes a software development section. + *

+ *
+ */ + +/*! + * \namespace pcl + * \brief PCL root namespace. + * + * pcl is the main namespace of the PixInsight Class Library (PCL), where all + * public PCL classes, functions and data are defined. + */ + +// ---------------------------------------------------------------------------- +// General definitions used by all PixInsight modules and programs. +// Included directly by PCL API and PixInsight source modules. +// ---------------------------------------------------------------------------- + +/* + * One and only one platform selection macro has to be defined. + */ +#ifndef __PCL_FREEBSD +# ifndef __PCL_LINUX +# ifndef __PCL_MACOS +# ifndef __PCL_MACOSX +# ifndef __PCL_WINDOWS +# error No platform selection macro has been defined. +# endif +# endif +# endif +# endif +#endif + +/* + * __PCL_MACOS and __PCL_MACOSX are synonyms and both always defined on macOS. + */ +#ifdef __PCL_MACOS +# ifndef __PCL_MACOSX +# define __PCL_MACOSX +# endif +#endif +#ifdef __PCL_MACOSX +# ifndef __PCL_MACOS +# define __PCL_MACOS +# endif +#endif + +/* + * Check for conflicting platform selection macros. + */ +#ifdef __PCL_FREEBSD +# if defined( __PCL_LINUX ) || defined( __PCL_MACOSX ) || defined( __PCL_WINDOWS ) +# error Multiple platform selection macros have been defined. +# endif +#endif +#ifdef __PCL_LINUX +# if defined( __PCL_FREEBSD ) || defined( __PCL_MACOSX ) || defined( __PCL_WINDOWS ) +# error Multiple platform selection macros have been defined. +# endif +#endif +#ifdef __PCL_MACOSX +# if defined( __PCL_FREEBSD ) || defined( __PCL_LINUX ) || defined( __PCL_WINDOWS ) +# error Multiple platform selection macros have been defined. +# endif +#endif +#ifdef __PCL_WINDOWS +# if defined( __PCL_FREEBSD ) || defined( __PCL_LINUX ) || defined( __PCL_MACOSX ) +# error Multiple platform selection macros have been defined. +# endif +#endif + +/* + * __PCL_UNIX is always defined on FreeBSD, Linux and macOS platforms. + */ +#if defined( __PCL_LINUX ) || defined( __PCL_FREEBSD ) || defined( __PCL_MACOSX ) +# ifndef __PCL_UNIX +# define __PCL_UNIX +# endif +#endif + +/* + * __PCL_X11 is always defined on FreeBSD and Linux platforms. + */ +#if defined( __PCL_LINUX ) || defined( __PCL_FREEBSD ) +# ifndef __PCL_X11 +# define __PCL_X11 +# endif +#endif + +/* + * Platform architecture requirements: + * + * - x86_64 / EM64T / AMD64 architecture. + */ +#ifndef __x86_64__ +# ifndef __x86_64 +# ifndef __amd64__ +# ifndef __amd64 +# ifndef _M_X64 +# ifndef _M_AMD64 +# error This version of PCL requires an x86_64 / EM64T / AMD64 architecture. +# endif +# endif +# endif +# endif +# endif +#endif +#ifndef __PCL_X64 +# define __PCL_X64 +#endif + +/* + * Compiler requirements: + * + * - GCC >= 7 on UNIX/Linux + * - Clang >= 5 on UNIX/Linux + * - MSVC++ >= 15.0 / Visual Studio 2017 on Windows + */ +#ifdef __PCL_WINDOWS +# ifdef _MSC_VER +# if _MSC_VER < 1910 +# error This version of PCL requires MSVC++ 15.0 / Visual Studio 2017 or higher on MS Windows platforms. +# endif +# elif __MINGW32__ +# else +# error Unsupported C++ compiler on MS Windows platform. +# endif +#else +# ifdef _MSC_VER +# error _MSC_VER should not be #defined on UNIX/Linux platforms. +# else +# ifdef __clang__ +# if ( __clang_major__ < 5 ) +# error This version of PCL requires Clang 5 or higher on UNIX/Linux platforms. +# endif +# else +# ifdef __GNUC__ +# if ( __GNUC__ < 7 ) +# error This version of PCL requires GCC 7 or higher on UNIX/Linux platforms. +# endif +# else +# error Unsupported C++ compiler on UNIX/Linux platform. +# endif +# endif +# endif +#endif + +/* + * Brain-damaged compilers emit particularly useless warning messages. + * N.B.: This must be done *before* including windows.h + */ +#ifndef __PCL_NO_WARNING_MUTE_PRAGMAS +# ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 // Deal with MS's attempt at deprecating C standard runtime functions +# pragma warning( disable: 4996 ) // ... +# pragma warning( disable: 4018 ) // '<' : signed/unsigned mismatch +# pragma warning( disable: 4049 ) // More than 64k source lines +# pragma warning( disable: 4150 ) // Deletion of pointer to incomplete type 'type'; no destructor called +# pragma warning( disable: 4244 ) // Conversion from 'type1' to 'type2', possible loss of data +# pragma warning( disable: 4345 ) // Behavior change: an object of POD type constructed... +# pragma warning( disable: 4355 ) // 'this' : used in base member initializer list +# pragma warning( disable: 4521 ) // Multiple copy constructors defined +# pragma warning( disable: 4522 ) // Multiple assignment operators defined +# pragma warning( disable: 4710 ) // Function not inlined +# pragma warning( disable: 4723 ) // Potential divide by 0 +# pragma warning( disable: 4800 ) // 'boolean' : forcing value to bool 'true' or 'false' (performance warning) +# endif +#endif + +/* + * Compiler warning management macros + */ +#ifdef _MSC_VER +# define PCL_WARNINGS_PUSH \ + __pragma(warning(push)) +#else +# define PCL_WARNINGS_PUSH \ + _Pragma("GCC diagnostic push") +#endif + +#ifdef _MSC_VER +# define PCL_WARNINGS_POP \ + __pragma(warning(pop)) +#else +# define PCL_WARNINGS_POP \ + _Pragma("GCC diagnostic pop") +#endif + +#ifdef _MSC_VER +# define PCL_WARNINGS_DISABLE_UNINITIALIZED_VARIABLE \ + __pragma(warning( disable: 6001 )) \ + __pragma(warning( disable: 4700 )) +#else +# define PCL_WARNINGS_DISABLE_UNINITIALIZED_VARIABLE \ + _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +#endif + +// Disable C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data +#ifdef _MSC_VER +# define PCL_WARNINGS_DISABLE_SIZE_T_TO_INT_LOSS \ + __pragma(warning( disable: 4267 )) +#endif + +/* + * Disable unused variable warnings. This solution is portable for all + * compilers supporting C++11 or newer. The function call should be optimized + * away by any reasonable compiler (including MSVC :). + */ +template inline void __pcl_unused__( Args&&... ) {} +#define PCL_UNUSED( x ) __pcl_unused__( x ); + +/* + * Code optimization with unlikely/likely macros: Help the compiler to optimize + * for execution paths that are more likely to run. + */ +#ifndef __PCL_NO_BRANCH_OPTIMIZATION_MACROS +# if defined( __GNUC__ ) || defined( __clang__ ) +# define unlikely( expr ) __builtin_expect( !!(expr), 0 ) +# define likely( expr ) __builtin_expect( !!(expr), 1 ) +# else +# define unlikely( expr ) (expr) +# define likely( expr ) (expr) +# endif +#endif + +/* + * On Windows/MSVC++, _CRT_RAND_S must be #defined for rand_s() to work: + * http://msdn.microsoft.com/en-us/library/sxtz2fa8.aspx + */ +#ifdef _MSC_VER +# define _CRT_RAND_S +#endif + +/* + * C standard definitions. + */ +#ifndef __stddef_h +# include +# ifndef __stddef_h +# define __stddef_h +# endif +#endif + +/* + * C++11: Utility functions. + */ +#ifndef __utility_h +# include +# ifndef __utility_h +# define __utility_h +# endif +#endif + +/* + * C++11: Compile-time type information classes. + */ +#ifndef __type_traits_h +# include +# ifndef __type_traits_h +# define __type_traits_h +# endif +#endif + +/* + * C++11: std::initializer_list. + */ +#ifndef __initializer_list_h +# include +# ifndef __initializer_list_h +# define __initializer_list_h +# endif +#endif + +/* + * Macros that control global symbol visibility. + * + * On UNIX/Linux, compilation with -fvisibility=hidden is required for PCL and + * all PixInsight modules and applications. + */ +#ifdef _MSC_VER // Windows +# define PCL_EXPORT __declspec(dllexport) +# define PCL_MODULE_EXPORT extern "C" PCL_EXPORT +# define PCL_IMPORT __declspec(dllimport) +# define PCL_LOCAL +# define PCL_BEGIN_LOCAL +# define PCL_END_LOCAL +# define PCL_INTERNAL +# define PCL_BEGIN_INTERNAL +# define PCL_END_INTERNAL +#else // Linux/X11, FreeBSD/X11 and Mac OS X +# define PCL_EXPORT __attribute__((visibility ("default"))) +# if defined( __clang__ ) // Clang does not have the "externally_visible" attribute +# define PCL_MODULE_EXPORT extern "C" __attribute__((visibility ("default"))) +# else +# define PCL_MODULE_EXPORT extern "C" __attribute__((visibility ("default"), externally_visible)) +# endif +# define PCL_IMPORT __attribute__((visibility ("default"))) +# define PCL_LOCAL __attribute__((visibility ("hidden"))) +# define PCL_BEGIN_LOCAL _Pragma ( "GCC visibility push( hidden )" ) +# define PCL_END_LOCAL _Pragma ( "GCC visibility pop" ) +# define PCL_INTERNAL __attribute__((visibility ("internal"))) +# define PCL_BEGIN_INTERNAL _Pragma ( "GCC visibility push( internal )" ) +# define PCL_END_INTERNAL _Pragma ( "GCC visibility pop" ) +#endif +#ifdef __PCL_DSO // Using PCL as a dynamic shared object - ### untested/experimental +# ifdef __PCL_BUILDING_PCL_DSO // building the PCL DSO +# define PCL_PUBLIC PCL_EXPORT +# else // linking against the PCL DSO +# define PCL_PUBLIC PCL_IMPORT +# endif +#else // Using PCL as a static library +# define PCL_PUBLIC +#endif + +/* + * The PCL_CLASS, PCL_FUNC and PCL_DATA macros allow us to modify attributes in + * all declarations of PCL API classes, functions and data items, respectively. + */ +#define PCL_CLASS PCL_PUBLIC +#define PCL_FUNC PCL_PUBLIC +#define PCL_DATA PCL_PUBLIC + +/* + * Stringification of macro-expanded arguments needs two levels of macros. + */ +#define PCL_STRINGIFY( x ) #x + +/* + * Fastcall calling convention. + */ +#ifndef __PCL_NO_FASTCALL +# ifdef _MSC_VER +# define PCL_FASTCALL __fastcall +# else +# define PCL_FASTCALL __attribute__((fastcall)) +# endif +#else +# define PCL_FASTCALL +#endif + +/* + * Always inline functions. + */ +#ifndef __PCL_NO_FORCE_INLINE +# ifdef _MSC_VER // Visual Studio +# define PCL_FORCE_INLINE __forceinline +# else +# define PCL_FORCE_INLINE inline __attribute__((always_inline)) +# endif +#else +# define PCL_FORCE_INLINE +#endif + +/* + * Special GCC function optimizations. + */ +#ifndef __PCL_NO_HOT_FUNCTIONS +# ifdef _MSC_VER +# define PCL_HOT_FUNCTION +# else +# define PCL_HOT_FUNCTION __attribute__((hot)) +# endif +#else +# define PCL_HOT_FUNCTION +#endif + +/* + * Aligned memory allocation functions. + */ +#ifdef _MSC_VER +# define PCL_ALIGNED_MALLOC _aligned_malloc +# define PCL_ALIGNED_FREE _aligned_free +#else +# define PCL_ALIGNED_MALLOC _mm_malloc +# define PCL_ALIGNED_FREE _mm_free +#endif + +/* + * 16/32-byte aligned blocks for automatic vectorization. + */ +#ifdef _MSC_VER // Windows +# define PCL_ALIGNED_16 __declspec(align(16)) +# define PCL_ASSUME_ALIGNED_16( x ) x +# define PCL_ALIGNED_32 __declspec(align(32)) +# define PCL_ASSUME_ALIGNED_32( x ) x +#else // GCC and Clang +# define PCL_ALIGNED_16 __attribute__((aligned(16))) +# define PCL_ASSUME_ALIGNED_16( x ) __builtin_assume_aligned( x, 16 ) +# define PCL_ALIGNED_32 __attribute__((aligned(32))) +# define PCL_ASSUME_ALIGNED_32( x ) __builtin_assume_aligned( x, 32 ) +#endif + +/* + * Let the restrict type qualifier be the same for all supported C++ compilers. + */ +#ifdef _MSC_VER +# define __restrict__ __restrict +#endif + +/* + * Compiler pragmas to assume iteration independence for vectorization. + */ +#ifdef _MSC_VER +# define PCL_IVDEP __pragma(loop( ivdep )) +#else +# ifdef __clang__ +# define PCL_IVDEP +# else +# ifdef __GNUC__ +# define PCL_IVDEP _Pragma("GCC ivdep") +# endif +# endif +#endif + +/* + * Loop unrolling pragmas. + */ +#define PCL_PRAGMA( x ) _Pragma( #x ) +#ifdef _MSC_VER +# define PCL_UNROLL( n ) +#else +# ifdef __clang__ +# define PCL_UNROLL( n ) PCL_PRAGMA( clang loop unroll_count( n ) ) +# else +# ifdef __GNUC__ +# define PCL_UNROLL( n ) PCL_PRAGMA( GCC unroll n ) +# endif +# endif +#endif + +/* + * Current function name. + */ +#ifdef _MSC_VER +# define PCL_FUNCTION_NAME __FUNCTION__ +#else +# define PCL_FUNCTION_NAME __func__ +#endif + +/* + * MSVC defines 'max' and 'min' macros that conflict with several standard + * library functions, such as std::numeric_limits<>::max(). + */ +#ifdef _MSC_VER +# ifndef NOMINMAX +# define NOMINMAX 1 // needs to be defined before #include windows.h +# endif +# ifdef max +# undef max +# endif +# ifdef min +# undef min +# endif +#endif + +/* + * Minimum Win32 versions supported. + */ +#ifdef __PCL_WINDOWS +# ifndef __PCL_NO_WIN32_MINIMUM_VERSIONS +# define WINVER 0x0601 // Windows 7 +# define _WIN32_WINNT 0x0601 +# endif +#endif + +/* + * Size and distance types. + */ +#ifndef __PCL_NO_SIZE_AND_DISTANCE_TYPES + +namespace pcl +{ +/*! + * \defgroup size_distance_types Size and Distance Types + */ + +/*! + * A type used to represent block sizes, lengths and absolute positions. + * \ingroup size_distance_types + */ +typedef size_t size_type; + +/*! + * A type used to represent distances and relative positions. + * \ingroup size_distance_types + */ +typedef ptrdiff_t distance_type; + +} // pcl + +#endif // !__PCL_NO_SIZE_AND_DISTANCE_TYPES + +/* + * Portable integer types + */ +#ifndef __PCL_NO_PORTABLE_INTEGER_TYPES + +namespace pcl +{ +/*! + * \defgroup portable_integer_types Portable Integer Types + */ + +/*! + * Signed two's complement 8-bit integer type. + * \ingroup portable_integer_types + */ +typedef signed char int8; + +/*! + * Unsigned 8-bit integer type. + * \ingroup portable_integer_types + */ +typedef unsigned char uint8; + +/*! + * Signed two's complement 16-bit integer type. + * \ingroup portable_integer_types + */ +typedef signed short int16; + +/*! + * Unsigned 16-bit integer type. + * \ingroup portable_integer_types + */ +typedef unsigned short uint16; + +/*! + * Signed two's complement 32-bit integer type. + * \ingroup portable_integer_types + */ +typedef signed int int32; + +/*! + * Unsigned 32-bit integer type. + * \ingroup portable_integer_types + */ +typedef unsigned int uint32; + +#ifdef _MSC_VER // Valid for MS Visual C++ +typedef signed __int64 int64; +typedef unsigned __int64 uint64; +#else // Valid for gcc +/*! + * Signed two's complement 64-bit integer type. + * \ingroup portable_integer_types + */ +typedef signed long long int64; + +/*! + * Unsigned 64-bit integer type. + * \ingroup portable_integer_types + */ +typedef unsigned long long uint64; +#endif // _MSC_VER + +struct PCL_AssertScalarSizes +{ + static_assert( sizeof( int8 ) == 1, "Invalid sizeof( int8 )" ); + static_assert( sizeof( uint8 ) == 1, "Invalid sizeof( uint8 )" ); + static_assert( sizeof( int16 ) == 2, "Invalid sizeof( int16 )" ); + static_assert( sizeof( uint16 ) == 2, "Invalid sizeof( uint16 )" ); + static_assert( sizeof( int32 ) == 4, "Invalid sizeof( int32 )" ); + static_assert( sizeof( uint32 ) == 4, "Invalid sizeof( uint32 )" ); + static_assert( sizeof( int64 ) == 8, "Invalid sizeof( int64 )" ); + static_assert( sizeof( uint64 ) == 8, "Invalid sizeof( uint64 )" ); + static_assert( sizeof( float ) == sizeof( uint32 ), "Invalid sizeof( float )" ); + static_assert( sizeof( double ) == sizeof( uint64 ), "Invalid sizeof( double )" ); +}; + +} // pcl + +/* + * Integer limits + */ +#ifndef __PCL_NO_INTEGER_LIMITS + +/*! + * \defgroup integer_limits Integer Limits + */ + +/*! + * \defgroup integer_conversion_factors Integer Conversion Factors + */ + +#ifdef _MSC_VER // Valid for MS Visual C++ + +#define int8_min (-127i8-1) +#define int8_max 127i8 +#define int8_ofs 128ui8 +#define char_min int8_min +#define char_max int8_max + +#define uint8_max 0xffui8 + +#define int16_min (-32767i16-1) +#define int16_max 32767i16 +#define int16_ofs 32768ui16 +#define short_min int16_min +#define short_max int16_max + +#define uint16_max 0xffffui16 +#define ushort_max uint16_max + +#define uint20_max 0xfffffui32 + +#define uint22_max 0x3fffffui32 + +#define uint24_max 0xffffffui32 + +#define int32_min (-2147483647i32-1) +#define int32_max 2147483647i32 +#define int32_ofs 2147483648ui32 +#define int_min int32_min +#define int_max int32_max + +#define uint32_max 0xffffffffui32 +#define uint_max uint32_max + +#define int64_min (-9223372036854775807i64-1) +#define int64_max 9223372036854775807i64 +#define int64_ofs 9223372036854775808ui64 +#define longlong_min int64_min +#define longlong_max int64_max + +#define uint64_max 0xffffffffffffffffui64 +#define ulonglong_max uint64_max + +#define uint8_to_uint16 257ui16 +#define uint8_to_uint20 4.1120588235294117647058823529412e+03 +#define uint8_to_uint24 65793ui32 +#define uint8_to_uint32 16843009ui32 +#define uint8_to_uint64 72340172838076673ui64 + +#define uint16_to_uint8 3.8910505836575875486381322957198e-03 +#define uint16_to_uint20 1.6000228885328450446326390478370e+01 +#define uint16_to_uint24 2.5600389105058365758754863813230e+02 +#define uint16_to_uint32 65537ui32 +#define uint16_to_uint64 281479271743489ui64 + +#define uint20_to_uint8 2.4318718260496387955081896860024e-04 +#define uint20_to_uint16 6.2499105929475717044560474930262e-02 +#define uint20_to_uint24 1.6000014305128388527287032401116e+01 +#define uint20_to_uint32 4.0960039053000500679493598455046e+03 +#define uint20_to_uint64 1.7592202821648000014305128388527e+13 + +#define uint24_to_uint8 1.5199185323666651467481343000015e-05 +#define uint24_to_uint16 3.9061906281823294271427051510039e-03 +#define uint24_to_uint20 6.2499944120642192402016663671533e-02 +#define uint24_to_uint32 2.5600001519918532366665146748134e+02 +#define uint24_to_uint64 1.0995116933120039061906281823294e+12 + +#define uint32_to_uint8 5.9371814145560333073502484027646e-08 +#define uint32_to_uint16 1.5258556235409005599890138395105e-05 +#define uint32_to_uint20 2.4414039222619971079430536152662e-04 +#define uint32_to_uint24 3.9062497680788509939049489316309e-03 +#define uint32_to_uint64 4294967297ui64 + +#define uint64_to_uint8 1.3823577699190181534344400859741e-17 +#define uint64_to_uint16 3.5526594686918766543265110209534e-15 +#define uint64_to_uint20 5.6843364650699390597549726005894e-14 +#define uint64_to_uint24 9.0949464756281961368912116576494e-13 +#define uint64_to_uint32 2.3283064359965952029459655278022e-10 + +#else // Non-MS C++, i.e. GCC or compatible + +/*! + * The smallest 8-bit signed integer. + * \ingroup integer_limits + */ +#define int8_min (-int8( 127 )-1) + +/*! + * The largest 8-bit signed integer. + * \ingroup integer_limits + */ +#define int8_max int8( 127 ) +#define int8_ofs uint8( 128u ) +#define char_min int8_min +#define char_max int8_max + +/*! + * The largest 8-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint8_max uint8( 0xffu ) + +/*! + * The smallest 16-bit signed integer. + * \ingroup integer_limits + */ +#define int16_min (-int16( 32767 )-1) + +/*! + * The largest 16-bit signed integer. + * \ingroup integer_limits + */ +#define int16_max int16( 32767 ) +#define int16_ofs uint16( 32768u ) +#define short_min int16_min +#define short_max int16_max + +/*! + * The largest 16-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint16_max uint16( 0xffffu ) +#define ushort_max uint16_max + +/*! + * The largest 20-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint20_max uint32( 0xfffffu ) + +/*! + * The largest 22-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint22_max uint32( 0x3fffffu ) + +/*! + * The largest 24-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint24_max uint32( 0xffffffu ) + +/*! + * The smallest 32-bit signed integer. + * \ingroup integer_limits + */ +#define int32_min (-int32( 2147483647 )-1) + +/*! + * The largest 32-bit signed integer. + * \ingroup integer_limits + */ +#define int32_max int32( 2147483647 ) +#define int32_ofs uint32( 2147483648u ) +#define int_min int32_min +#define int_max int32_max + +/*! + * The largest 32-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint32_max uint32( 0xffffffffu ) +#define uint_max uint32_max + +/*! + * The smallest 64-bit signed integer. + * \ingroup integer_limits + */ +#define int64_min (-int64( 9223372036854775807ll )-1) + +/*! + * The largest 64-bit signed integer. + * \ingroup integer_limits + */ +#define int64_max int64( 9223372036854775807ll ) +#define int64_ofs uint64( 9223372036854775808ull ) +#define longlong_min int64_min +#define longlong_max int64_max + +/*! + * The largest 64-bit unsigned integer. + * \ingroup integer_limits + */ +#define uint64_max uint64( 0xffffffffffffffffull ) +#define ulonglong_max uint64_max + +/*! + * Conversion factor from 8-bit unsigned integer to 16-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint8_to_uint16 uint16( 257u ) + +/*! + * Conversion factor from 8-bit unsigned integer to 20-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint8_to_uint20 4.1120588235294117647058823529412e+03 + +/*! + * Conversion factor from 8-bit unsigned integer to 24-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint8_to_uint24 uint32( 65793u ) + +/*! + * Conversion factor from 8-bit unsigned integer to 32-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint8_to_uint32 uint32( 16843009u ) + +/*! + * Conversion factor from 8-bit unsigned integer to 64-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint8_to_uint64 uint64( 72340172838076673ull ) + +/*! + * Conversion factor from 16-bit unsigned integer to 8-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint16_to_uint8 3.8910505836575875486381322957198e-03 + +/*! + * Conversion factor from 16-bit unsigned integer to 20-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint16_to_uint20 1.6000228885328450446326390478370e+01 + +/*! + * Conversion factor from 16-bit unsigned integer to 24-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint16_to_uint24 2.5600389105058365758754863813230e+02 + +/*! + * Conversion factor from 16-bit unsigned integer to 32-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint16_to_uint32 uint32( 65537u ) + +/*! + * Conversion factor from 16-bit unsigned integer to 64-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint16_to_uint64 uint64( 281479271743489ull ) + +/*! + * Conversion factor from 20-bit unsigned integer to 8-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint20_to_uint8 2.4318718260496387955081896860024e-04 + +/*! + * Conversion factor from 20-bit unsigned integer to 16-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint20_to_uint16 6.2499105929475717044560474930262e-02 + +/*! + * Conversion factor from 20-bit unsigned integer to 24-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint20_to_uint24 1.6000014305128388527287032401116e+01 + +/*! + * Conversion factor from 20-bit unsigned integer to 32-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint20_to_uint32 4.0960039053000500679493598455046e+03 + +/*! + * Conversion factor from 20-bit unsigned integer to 64-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint20_to_uint64 1.7592202821648000014305128388527e+13 + +/*! + * Conversion factor from 24-bit unsigned integer to 8-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint24_to_uint8 1.5199185323666651467481343000015e-05 + +/*! + * Conversion factor from 24-bit unsigned integer to 16-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint24_to_uint16 3.9061906281823294271427051510039e-03 + +/*! + * Conversion factor from 24-bit unsigned integer to 20-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint24_to_uint20 6.2499944120642192402016663671533e-02 + +/*! + * Conversion factor from 24-bit unsigned integer to 32-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint24_to_uint32 2.5600001519918532366665146748134e+02 + +/*! + * Conversion factor from 24-bit unsigned integer to 64-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint24_to_uint64 1.0995116933120039061906281823294e+12 + +/*! + * Conversion factor from 32-bit unsigned integer to 8-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint32_to_uint8 5.9371814145560333073502484027646e-08 + +/*! + * Conversion factor from 32-bit unsigned integer to 16-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint32_to_uint16 1.5258556235409005599890138395105e-05 + +/*! + * Conversion factor from 32-bit unsigned integer to 20-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint32_to_uint20 2.4414039222619971079430536152662e-04 + +/*! + * Conversion factor from 32-bit unsigned integer to 24-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint32_to_uint24 3.9062497680788509939049489316309e-03 + +/*! + * Conversion factor from 32-bit unsigned integer to 64-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint32_to_uint64 uint64( 4294967297ull ) + +/*! + * Conversion factor from 64-bit unsigned integer to 8-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint64_to_uint8 1.3823577699190181534344400859741e-17 + +/*! + * Conversion factor from 64-bit unsigned integer to 16-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint64_to_uint16 3.5526594686918766543265110209534e-15 + +/*! + * Conversion factor from 64-bit unsigned integer to 20-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint64_to_uint20 5.6843364650699390597549726005894e-14 + +/*! + * Conversion factor from 64-bit unsigned integer to 24-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint64_to_uint24 9.0949464756281961368912116576494e-13 + +/*! + * Conversion factor from 64-bit unsigned integer to 32-bit unsigned integer. + * \ingroup integer_conversion_factors + */ +#define uint64_to_uint32 2.3283064359965952029459655278022e-10 + +#endif // _MSC_VER + +namespace pcl +{ + +inline double BitMin( int n ) +{ + switch ( n ) + { + case 8: return double( int8_min ); + case 16: return double( int16_min ); + case 32: return double( int32_min ); + case 64: return double( int64_min ); + default: return -double( (uint64( 1 ) << n) >> 1 ); + } +} + +inline double BitMax( int n ) +{ + switch ( n ) + { + case 8: return double( int8_max ); + case 16: return double( int16_max ); + case 32: return double( int32_max ); + case 64: return double( int64_max ); + default: return double( ((uint64( 1 ) << n) >> 1) - 1 ); + } +} + +inline double UBitMax( int n ) +{ + switch ( n ) + { + case 8: return double( uint8_max ); + case 16: return double( uint16_max ); + case 32: return double( uint32_max ); + case 64: return double( uint64_max ); + default: return double( (uint64( 1 ) << n) - 1 ); + } +} + +} // pcl + +#endif // !__PCL_NO_INTEGER_LIMITS + +/* + * Unicode character types. + */ +#ifndef __PCL_NO_UNICODE_CHARACTER_TYPES + +namespace pcl +{ + +/*! + * \defgroup unicode_char_types Unicode Character Types + */ + +/*! + * 16-bit Unicode character (UTF-16) + * \ingroup unicode_char_types + */ +typedef uint16 char16_type; + +/*! + * 32-bit Unicode character (UTF-32) + * \ingroup unicode_char_types + */ +typedef uint32 char32_type; + +} // pcl + +#endif // !__PCL_NO_UNICODE_CHARACTER_TYPES + +/* + * File size and position types. + */ +#ifndef __PCL_NO_FILE_SIZE_AND_POSITION_TYPES + +#ifndef __PCL_WINDOWS +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +# define _LARGEFILE64_SOURCE 1 +#endif + +namespace pcl +{ + +/*! + * \defgroup file_size_and_pos_types File Size and Position Types + * + * File positions are always signed numbers. We support 64-bit file systems. + */ + +/*! + * A type used to store a byte position or a byte offset in a file. + * \ingroup file_size_and_pos_types + */ +typedef int64 fpos_type; + +/*! + * A type used to store the length of a file in bytes. + * \ingroup file_size_and_pos_types + */ +typedef int64 fsize_type; + +} // pcl + +#endif // !__PCL_NO_FILE_SIZE_AND_POSITION_TYPES + +#endif // !__PCL_NO_PORTABLE_INTEGER_TYPES + +/* + * Maximum number of processors allowed. + */ +#define PCL_MAX_PROCESSORS 1023 +#define PCL_MAX_PROCESSORS_BITCOUNT 10 + +// ---------------------------------------------------------------------------- + +#endif // __PCL_Defs_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Defs.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Diagnostics.h b/3rdparty/include/pcl/Diagnostics.h new file mode 100644 index 0000000..91a54ac --- /dev/null +++ b/3rdparty/include/pcl/Diagnostics.h @@ -0,0 +1,130 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Diagnostics.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Diagnostics_h +#define __PCL_Diagnostics_h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- +// Definitions and macros for implementation of diagnostics code. +// ---------------------------------------------------------------------------- +// ###### THIS HEADER IS FOR INTERNAL USE EXCLUSIVELY - PLEASE IGNORE IT ###### +// ---------------------------------------------------------------------------- + +bool PCL_FUNC IsConsoleDiagnostics(); + +void PCL_FUNC SetConsoleDiagnostics( bool set = true ); + +inline void SetGUIDiagnostics( bool set = true ) +{ + SetConsoleDiagnostics( !set ); +} + +} // pcl + +extern "C" void PCL_FUNC __PCLAssertFail( int, const char*, const char*, int ); + +#define __PCL_ASSERTION 0 +#define __PCL_PRECONDITION 1 +#define __PCL_CHECK 2 + +// ---------------------------------------------------------------------------- +// The value of __PCL_DIAGNOSTICS_LEVEL controls generation of diagnostics +// code, as follows: +// 0 = no diagnostics code is generated (the default value) +// 1 = CHECK code only +// 2 = both CHECK and PRECONDITION code +// ---------------------------------------------------------------------------- + +#ifndef __PCL_DIAGNOSTICS_LEVEL +#define __PCL_DIAGNOSTICS_LEVEL 0 +#endif + +// ---------------------------------------------------------------------------- +// Precondition diagnostics macro. +// This macro must be used when the arguments of a function are required to +// satisfy a given condition p. The default behavior, under diagnostics mode, +// is to terminate program execution if p doesn't hold. +// ---------------------------------------------------------------------------- + +#if __PCL_DIAGNOSTICS_LEVEL > 1 +#define PCL_PRECONDITION( __p ) \ + ((__p) ? (void)0 : \ + (void)__PCLAssertFail( __PCL_PRECONDITION, #__p, __FILE__, __LINE__ )); +#else +#define PCL_PRECONDITION( __p ) +#endif + +// ---------------------------------------------------------------------------- +// Check diagnostics macro. +// This macro should be used at any point where execution cannot continue if a +// given condition p is not satisfied, except when a precondition applies. The +// default behavior is to terminate program execution if p doesn't hold. +// ---------------------------------------------------------------------------- + +#if __PCL_DIAGNOSTICS_LEVEL > 0 +#define PCL_CHECK( __p ) \ + ((__p) ? (void)0 : \ + (void)__PCLAssertFail( __PCL_CHECK, #__p, __FILE__, __LINE__ )); +#else +#define PCL_CHECK( __p ) +#endif + +// ---------------------------------------------------------------------------- + +#endif // __PCL_Diagnostics_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Diagnostics.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Dialog.h b/3rdparty/include/pcl/Dialog.h new file mode 100644 index 0000000..9a91267 --- /dev/null +++ b/3rdparty/include/pcl/Dialog.h @@ -0,0 +1,309 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Dialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Dialog_h +#define __PCL_Dialog_h + +/// \file pcl/Dialog.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::StdDialogCode + * \brief Standard dialog return codes + * + * + * + * + *
StdDialogCode::Ok The dialog has been accepted (e.g., by clicking the OK button)
StdDialogCode::Cancel The dialog has been rejected (e.g., by clicking the Cancel button)
+ */ +namespace StdDialogCode +{ + enum value_type + { + Cancel = 0, // The dialog has been rejected (e.g., by clicking the Cancel button) + Ok = 1 // The dialog has been accepted (e.g., by clicking the OK button) + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Dialog + * \brief Client-side interface to a PixInsight modal dialog + * + * Dialogs are top-level windows that execute modally relative to the main + * window of the PixInsight core application. + */ +class PCL_CLASS Dialog : public Control +{ +public: + + /*! + * Represents a standard dialog return code. + */ + typedef StdDialogCode::value_type std_code; + + /*! + * Constructs a %Dialog object. + * + * If the specified \a parent control is a non-null control, the dialog will + * be shown centered over its parent. Otherwise the dialog window will be + * shown centered on the current workspace. Note that specifying a dialog + * parent does not change the dialog's \e modality: all dialog windows are + * application-modal in PixInsight. See the Execute() and Open() member + * functions for more information. + */ + Dialog( Control& parent = Control::Null() ); + + /*! + * Destroys a %Dialog object. + */ + virtual ~Dialog() + { + } + + /*! + * Shows a modal dialog and executes a separate event loop. + * + * This function creates a new event loop and does not return until the loop + * has exited and the dialog has been closed. During the event loop, the + * dialog behaves as an application modal window: Only the dialog + * window allows user interaction while the rest of the GUI is blocked in + * the PixInsight core application. To exit the modal event loop, the Ok() + * and Cancel() member functions can be used to return the standard dialog + * exit codes StdDialogCode::Ok and StdDialogCode::Cancel, respectively. + * + * This function returns a dialog return code. Although dialog + * return codes are arbitrary (they can be forced to any integer value with + * the Return() member function), dialogs with standard OK and Cancel + * buttons should always return a standard code, as defined in the + * StdDialogCode namespace. + * + * For a non-blocking alternative to use dialog windows, see the Open() + * member function. + * + * \sa Ok(), Cancel(), Return(), Open() + */ + int Execute(); + + /*! + * Shows a modal dialog window. + * + * This function opens the dialog window and returns immediately, allowing + * normal execution to continue without entering a separate event loop. As + * happens with Dialog::Execute(), this member function creates a modal + * dialog that blocks the rest of the PixInsight core application for GUI + * user interaction. The essential difference between both member functions + * is that Open() does not enter a new event loop. Typically, this function + * is used to provide feedback to the user during long procedures, as well + * as the possibility to interrupt or pause those procedures. For example, + * a progress dialog can be shown as a modal window during a file + * copy operation, or while a long calculation routine is being executed. + * + * \sa Execute() + */ + void Open(); + + /*! + * Closes this modal dialog and forces a return value \a retCode for the + * Execute() member function. + */ + void Return( int retCode ); + + /*! + * This is a convenience member function equivalent to:\n + * Return( StdDialogCode::Ok ) + */ + void Ok() + { + Return( StdDialogCode::Ok ); + } + + /*! + * This is a convenience member function equivalent to:\n + * Return( StdDialogCode::Cancel ) + */ + void Cancel() + { + Return( StdDialogCode::Cancel ); + } + + /*! + * Returns true iff this dialog is user-resizable. User-resizable dialogs can + * be resized interactively with the mouse and standard window controls. + */ + bool IsUserResizable() const; + + /*! + * Enables or disables user resizing for this dialog. + */ + void EnableUserResizing( bool = true ); + + /*! + * Disables or enables user resizing for this dialog. + * + * This is a convenience member function, equivalent to: + * EnableUserResizing( !disable ) + */ + void DisableUserResizing( bool disable = true ) + { + EnableUserResizing( !disable ); + } + + /*! + * Processes pending user interface events. + * + * This member function is a convenience wrapper with the same functionality + * as ProcessInterface::ProcessEvents(). + */ + static void ProcessEvents( bool excludeUserInputEvents = false ); + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnExecute( Dialog& sender ); + // void OnReturn( Dialog& sender, int retVal ); + + /*! + * \defgroup dialog_event_handlers Dialog Event Handlers + */ + + /*! + * Defines the prototype of a dialog execution event handler. + * + * A dialog execution event is generated when a dialog control is executed + * by invoking its Execute() member function. + * + * \param sender The dialog that sends an execution event. + * + * \ingroup dialog_event_handlers + */ + typedef void (Control::*execute_event_handler)( Dialog& sender ); + + /*! + * Defines the prototype of a dialog return event handler. + * + * A dialog return event is generated when a dialog control terminates + * execution by invoking its Return() member function. + * + * \param sender The dialog that sends a return event. + * + * \param retCode Return code passed to the Return() member function. This + * is also the return value of Execute(). + * + * \ingroup dialog_event_handlers + */ + typedef void (Control::*return_event_handler)( Dialog& sender, int retCode ); + + /*! + * Sets the execution event handler for this dialog. + * + * \param handler The dialog execution event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive execution events from + * this dialog. + * + * \ingroup dialog_event_handlers + */ + void OnExecute( execute_event_handler handler, Control& receiver ); + + /*! + * Sets the return event handler for this dialog. + * + * \param handler The dialog return event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive return events from this + * dialog. + * + * \ingroup dialog_event_handlers + */ + void OnReturn( return_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + execute_event_handler onExecute = nullptr; + return_event_handler onReturn = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class DialogEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Dialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Dialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/DisplayFunction.h b/3rdparty/include/pcl/DisplayFunction.h new file mode 100644 index 0000000..99cfcb7 --- /dev/null +++ b/3rdparty/include/pcl/DisplayFunction.h @@ -0,0 +1,463 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/DisplayFunction.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_DisplayFunction_h +#define __PCL_DisplayFunction_h + +/// \file pcl/DisplayFunction.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * Default clipping increment in sigma units. + */ +#define __PCL_AUTOSTRETCH_DEFAULT_CLIP -2.80 + +/* + * Default target mean background in the [0,1] range. + */ +#define __PCL_AUTOSTRETCH_DEFAULT_TBGD 0.25 + +/* + * Whether to apply a single transformation to nominal RGB channels, or + * separate per-channel transformations. + */ +#define __PCL_AUTOSTRETCH_DEFAULT_LINK false + +// ---------------------------------------------------------------------------- + +/*! + * \class DisplayFunction + * \brief Adaptive histogram transformations for image visualization. + * + * %DisplayFunction implements a set of histogram transformations for + * visualization of linear images. + */ +class PCL_CLASS DisplayFunction : public ImageTransformation +{ +public: + + /*! + * Default constructor. Constructs an identity display function. + */ + DisplayFunction() + : m_m( 4 ), m_s( 4 ), m_h( 4 ), m_l( 4 ), m_r( 4 ) + { + Reset(); + } + + /*! + * Constructs a display function with the specified parameters. + * + * \param m Vector of midtones balance parameters. + * \param s Vector of shadows clipping point parameters. + * \param h Vector of highlights clipping point parameters. + * \param l Vector of shadows dynamic range expansion parameters. + * \param r Vector of highlights dynamic range expansion parameters. + * + * Each argument vector can have from zero to four components (additional + * vector components are ignored, and missing components are replaced with + * default identity transformation parameters). Vector indices 0, 1, 2 and 3 + * correspond to the red/gray, green, blue and lightness components for + * histogram transformations. + * + * For detailed information on parameter values and valid ranges, see the + * HistogramTransformation class. + */ + template + DisplayFunction( const V& m, const V& s, const V& h, const V& l = V(), const V& r = V() ) + : m_m( 4 ), m_s( 4 ), m_h( 4 ), m_l( 4 ), m_r( 4 ) + { + Reset(); + for ( int i = 0; i < 4 && i < int( m.Length() ); ++i ) m_m[i] = Range( double( m[i] ), 0.0, 1.0 ); + for ( int i = 0; i < 4 && i < int( s.Length() ); ++i ) m_s[i] = Range( double( s[i] ), 0.0, 1.0 ); + for ( int i = 0; i < 4 && i < int( h.Length() ); ++i ) m_h[i] = Range( double( h[i] ), 0.0, 1.0 ); + for ( int i = 0; i < 4 && i < int( l.Length() ); ++i ) m_l[i] = Max( 0.0, double( l[i] ) ); + for ( int i = 0; i < 4 && i < int( r.Length() ); ++i ) m_r[i] = Min( 1.0, double( r[i] ) ); + for ( int i = 0; i < 4; ++i ) + if ( m_h[i] < m_s[i] ) + pcl::Swap( m_s[i], m_h[i] ); + } + + /*! + * Copy constructor. + */ + DisplayFunction( const DisplayFunction& ) = default; + + /*! + * Move constructor. + */ + DisplayFunction( DisplayFunction&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + DisplayFunction& operator =( const DisplayFunction& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + DisplayFunction& operator =( DisplayFunction&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~DisplayFunction() + { + } + + /*! + * Array subscript operator. Returns an histogram transformation for the + * specified channel index \a i, which must be in the range [0,3]. + * + * Channel indices 0, 1, 2 and 3 correspond to the red/gray, green, blue and + * lightness components, respectively. If an out-of-range channel index is + * specified, this operator returns an identity histogram transformation. + */ + HistogramTransformation operator []( int i ) const + { + PCL_PRECONDITION( 0 <= i && i < 4 ) + PCL_CHECK( m_m.Length() == 4 && m_s.Length() == 4 && m_h.Length() == 4 && m_l.Length() == 4 && m_r.Length() == 4 ) + if ( i >= 0 && i < 4 ) + return HistogramTransformation( m_m[i], m_s[i], m_h[i], m_l[i], m_r[i] ); + return HistogramTransformation(); + } + + /*! + * Returns a dynamic array of histogram transformations. + * + * The returned object contains four HistogramTransformation instances, + * where array indexes 0, 1, 2 and 3 correspond to the red/gray, green, blue + * and lightness components, respectively. + */ + Array HistogramTransformations() const + { + return Array() << operator[]( 0 ) + << operator[]( 1 ) + << operator[]( 2 ) + << operator[]( 3 ); + } + + /*! + * Gets a copy of all display function parameters in the specified vectors. + * + * \param[out] m Vector of midtones balance parameters. + * \param[out] s Vector of shadows clipping point parameters. + * \param[out] h Vector of highlights clipping point parameters. + * \param[out] l Vector of shadows dynamic range expansion parameters. + * \param[out] r Vector of highlights dynamic range expansion parameters. + * + * On output, each vector will have four components with the histogram + * transformation parameters for the red/gray, green, blue and lightness + * image components at vector indexes 0, 1, 2 and 3, respectively. + */ + template + void GetDisplayFunctionParameters( V& m, V& s, V& h, V& l, V& r ) const + { + m = m_m; s = m_s; h = m_h; l = m_l; r = m_r; + } + + /*! + * Returns true only if this object defines an identity display function for + * the specified channel index \a i. + * + * An identity display function is a no-op: it does not alter the pixel data + * or properties of the target images to which it is applied. + */ + bool IsIdentityTransformation( int i ) const + { + PCL_PRECONDITION( 0 <= i && i < 4 ) + PCL_CHECK( m_m.Length() == 4 && m_s.Length() == 4 && m_h.Length() == 4 && m_l.Length() == 4 && m_r.Length() == 4 ) + return i >= 0 && i < 4 && m_m[i] == 0.5 && m_s[i] == 0 && m_h[i] == 1 && m_l[i] == 0 && m_r[i] == 1; + } + + /*! + * Returns true iff this is an identity display function for the four + * image components (red/gray, green, blue and lightness). + * + * An identity display function is a no-op: it does not alter the pixel data + * or properties of the target images to which it is applied. + */ + bool IsIdentityTransformation() const + { + return IsIdentityTransformation( 0 ) + && IsIdentityTransformation( 1 ) + && IsIdentityTransformation( 2 ) + && IsIdentityTransformation( 3 ); + } + + /*! + * Returns the clipping point parameter of this transformation, in sigma + * units from the central value. + */ + double ClippingPoint() const + { + return m_clip; + } + + /*! + * Sets the clipping point parameter of this transformation, in sigma units + * from the central value. The default clipping point is -2.8. + */ + void SetClippingPoint( double clip ) + { + m_clip = clip; + } + + /*! + * Returns the target background parameter of this transformation in the + * normalized [0,1] range. + */ + double TargetBackground() const + { + return m_tbkg; + } + + /* + * Sets the target background parameter of this transformation in the + * normalized [0,1] range. The default target background is 0.25. + */ + void SetTargetBackground( double tbkg ) + { + m_tbkg = Range( tbkg, 0.0, 1.0 ); + } + + /*! + * Returns true iff this transformation will compute a single adaptive + * histogram transformation for the nominal channels of an RGB color image. + * Returns false if adaptive per-channel transformations will be calculated + * separately. + */ + bool LinkedRGB() const + { + return m_link; + } + + /*! + * Sets the 'linked RGB' parameter of this transformation. When this + * parameter is true, a single adaptive histogram transformation will be + * computed for the nominal channels of an RGB color image. When this + * parameter is false, separate adaptive transformations will be calculated + * for each channel. + */ + void SetLinkedRGB( bool link = true ) + { + m_link = link; + } + + /*! + * Computes adaptive display functions, also known as auto-stretch + * functions, based on statistical estimates of scale and location. + * + * \param sigma Vector of scale estimates. This is typically a vector of + * normalized MAD values (median absolute deviation from the + * median) or similar robust dispersion estimates. + * + * \param center Vector of location estimates. Typically the median is used + * as a robust estimator of central tendency. + * + * Both vectors must have one or three components, respectively for a + * monochrome (grayscale) or RGB color image. Avoid using non-robust + * statistical estimators such as the standard deviation or the mean, which + * can easily lead to completely wrong results. + * + * To obtain results coherent with other implementations, scale estimates + * should be normalized to be consistent with the standard deviation of a + * normal distribution. For example, if MAD values are used, they should be + * multiplied by 1.4826 before calling this function. + */ + template + void ComputeAutoStretch( const V& sigma, const V& center ) + { + PCL_CHECK( m_m.Length() == 4 && m_s.Length() == 4 && m_h.Length() == 4 && m_l.Length() == 4 && m_r.Length() == 4 ) + + if ( sigma.IsEmpty() || center.IsEmpty() ) + { + Reset(); + return; + } + + int n = (sigma.Length() < 3 || center.Length() < 3) ? 1 : 3; + + if ( m_link ) + { + /* + * Try to find out how many channels look like channels of an inverted + * image. + * + * We know a channel is inverted because the main histogram peak is + * located over the right-hand half of the histogram. Seems simplistic + * but this is consistent with most real-world images. + */ + int invertedChannels = 0; + for ( int i = 0; i < n; ++i ) + if ( center[i] > 0.5 ) + ++invertedChannels; + + double c = 0, m = 0; + if ( invertedChannels < n ) + { + // Noninverted image + for ( int i = 0; i < n; ++i ) + { + if ( 1 + sigma[i] != 1 ) + c += center[i] + m_clip * sigma[i]; + m += center[i]; + } + m_s[0] = m_s[1] = m_s[2] = Range( c/n, 0.0, 1.0 ); + m_m[0] = m_m[1] = m_m[2] = HistogramTransformation::MTF( m_tbkg, m/n - m_s[0] ); + m_l[0] = m_l[1] = m_l[2] = 0.0; + m_h[0] = m_h[1] = m_h[2] = m_r[0] = m_r[1] = m_r[2] = 1.0; + } + else + { + // Inverted image + for ( int i = 0; i < n; ++i ) + { + c += (1 + sigma[i] != 1) ? center[i] - m_clip * sigma[i] : 1.0; + m += center[i]; + } + m_h[0] = m_h[1] = m_h[2] = Range( c/n, 0.0, 1.0 ); + m_m[0] = m_m[1] = m_m[2] = HistogramTransformation::MTF( m_h[0] - m/n, m_tbkg ); + m_s[0] = m_s[1] = m_s[2] = m_l[0] = m_l[1] = m_l[2] = 0.0; + m_r[0] = m_r[1] = m_r[2] = 1.0; + } + } + else + { + /* + * Unlinked RGB/K channnels: Compute automatic stretch functions for + * individual RGB/K channels separately. + */ + for ( int i = 0; i < n; ++i ) + if ( center[i] < 0.5 ) + { + // Noninverted channel + m_s[i] = (1 + sigma[i] != 1) ? Range( center[i] + m_clip * sigma[i], 0.0, 1.0 ) : 0.0; + m_m[i] = HistogramTransformation::MTF( m_tbkg, center[i] - m_s[i] ); + m_l[i] = 0.0; + m_h[i] = m_r[i] = 1.0; + } + else + { + // Inverted channel + m_h[i] = (1 + sigma[i] != 1) ? Range( center[i] - m_clip * sigma[i], 0.0, 1.0 ) : 1.0; + m_m[i] = HistogramTransformation::MTF( m_h[i] - center[i], m_tbkg ); + m_s[i] = m_l[i] = 0.0; + m_r[i] = 1.0; + } + } + } + + /*! + * Resets all display function parameters to yield an identity + * transformation. + */ + void Reset() + { + m_m = 0.5; + m_s = m_l = 0.0; + m_h = m_r = 1.0; + } + + /*! + * Exchanges two %DisplayFunction objects. + */ + friend void Swap( DisplayFunction& x, DisplayFunction& y ) + { + pcl::Swap( x.m_m, y.m_m ); + pcl::Swap( x.m_s, y.m_s ); + pcl::Swap( x.m_h, y.m_h ); + pcl::Swap( x.m_l, y.m_l ); + pcl::Swap( x.m_r, y.m_r ); + pcl::Swap( x.m_clip, y.m_clip ); + pcl::Swap( x.m_tbkg, y.m_tbkg ); + pcl::Swap( x.m_link, y.m_link ); + } + +private: + + DVector m_m; // midtones balance + DVector m_s; // shadows clipping point + DVector m_h; // highlights clipping point + DVector m_l; // shadows dynamic range expansion + DVector m_r; // highlights dynamic range expansion + double m_clip = __PCL_AUTOSTRETCH_DEFAULT_CLIP; // auto-stretch clipping point + double m_tbkg = __PCL_AUTOSTRETCH_DEFAULT_TBGD; // auto-stretch target background + bool m_link = __PCL_AUTOSTRETCH_DEFAULT_LINK; // auto-stretch linked RGB + + /* + * Display function transformation. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_DisplayFunction_h + +// ---------------------------------------------------------------------------- +// EOF pcl/DisplayFunction.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/DrizzleData.h b/3rdparty/include/pcl/DrizzleData.h new file mode 100644 index 0000000..19fda5c --- /dev/null +++ b/3rdparty/include/pcl/DrizzleData.h @@ -0,0 +1,1496 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/DrizzleData.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_DrizzleData_h +#define __PCL_DrizzleData_h + +/// \file pcl/DrizzleData.h + +#include + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS XMLDocument; +class PCL_CLASS XMLElement; + +/*! + * \class DrizzleData + * \brief Drizzle integration data parser and generator + * + * %DrizzleData implements support for the %XML drizzle data format (XDRZ + * format, .xdrz file suffix). + * + * A drizzle image integration process has been formalized as the following + * chain of subtasks on the PixInsight/PCL platform: + * + * \li 1. Demosaicing. Only required if the input data set has been mosaiced + * with a color filter array (CFA), such as a Bayer or X-Trans filter. + * + * \li 2. Image registration. Generates image alignment information in the form + * of alignment matrices (projective transformations) and/or two-dimensional + * surface splines (for arbitrary distortion correction, global and local + * distortion correction models). + * + * \li 3. Image integration. Generates statistical data for each channel of the + * integrated image. This includes estimates of location and scale, statistical + * weights and pixel rejection data. + * + * \li 4. Drizzle integration. The input data for the drizzle algorithm is the + * input image for subtasks 1 (CFA drizzle) or 2 (normal drizzle). The + * information generated by subtasks 2 and 3 is used to perform a drizzle image + * integration process by inverse coordinate projection with image weighting, + * image normalization, and pixel rejection. + * + * An XDRZ file stores all of the data generated by the above drizzle + * integration subtasks as an %XML document. The %DrizzleData class is a + * high-level interface for parsing and generation of these special files. + * + * This class also implements an internal read-only compatibility layer with + * the old plain text drizzle data format (.drz file suffix) used by versions + * of PixInsight before the 1.8.5 standard distribution. By using the class + * constructor or the Parse() member function to load and parse an existing + * file, the correct file format is detected automatically. + * + * \sa NormalizationData + */ +class PCL_CLASS DrizzleData +{ +public: + + /*! + * Represents a vector surface spline interpolation/approximation in two + * dimensions. This class is used to implement image alignment with + * arbitrary distortion correction. + */ + typedef PointSurfaceSpline vector_spline; + + /*! + * Represents a coordinate interpolating/approximating surface spline used + * for image registration with arbitrary distortion correction. + */ + typedef vector_spline::spline spline; + + /*! + * An ordered list of image coordinates. Used to store reference image + * coordinates or image displacements in local distortion models. Also used + * to store interpolation node coordinates for adaptive normalization. + */ + typedef Array point_list; + + /*! + * An ordered list of statistical weights corresponding to points in a local + * distortion model. + */ + typedef Array weight_vector; + + /*! + * A list of coordinates corresponding to pixels rejected by an image + * integration task. + */ + typedef Array rejection_coordinates; + + /*! + * A set of per-channel pixel rejection coordinates. + */ + typedef Array rejection_data; + + /*! + * Default constructor. Constructs an empty %DrizzleData object. + */ + DrizzleData() = default; + + /*! + * Copy constructor. + */ + DrizzleData( const DrizzleData& ) = default; + + /*! + * Move constructor. + */ + DrizzleData( DrizzleData&& ) = default; + + /*! + * Constructs a new %DrizzleData instance by loading and parsing a file. + * + * \param filePath Path to an existing file that will be parsed. The file + * contents can be in %XML drizzle data format (normally, + * a file with the .xdrz suffix), or in old plain text + * format (typically with the .drz suffix). This + * constructor will detect the format in use from the + * first bytes of the file, and will decode it + * correspondingly. + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * This constructor validates the data retrieved from the specified file. It + * throws the appropriate Error exceptions in the event of parsing errors or + * invalid data. + */ + DrizzleData( const String& filePath, bool ignoreIntegrationData = false ) + { + Parse( filePath, ignoreIntegrationData ); + } + + /*! + * Constructs a new %DrizzleData instance by parsing a well-formed %XML + * document. + * + * \param xml Reference to the source %XML document. This constructor + * expects an %XML document in valid %XML drizzle data + * format (.xdrz). + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * This constructor validates the data retrieved from the specified %XML + * document. It throws an Error exception in the event of an invalid + * document or invalid data. + */ + DrizzleData( const XMLDocument& xml, bool ignoreIntegrationData = false ) + { + Parse( xml, ignoreIntegrationData ); + } + + /*! + * Constructs a new %DrizzleData instance by parsing an %XML element. + * + * \param element Reference to the source %XML element. This constructor + * expects an %XML document tree in valid %XML drizzle + * data format (.xdrz) rooted at this element. + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * This constructor validates the data retrieved from the specified %XML + * element. It throws an Error exception in the event of invalid data. + */ + DrizzleData( const XMLElement& element, bool ignoreIntegrationData = false ) + { + Parse( element, ignoreIntegrationData ); + } + + /*! + * Virtual destructor. + */ + virtual ~DrizzleData() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + DrizzleData& operator =( const DrizzleData& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + DrizzleData& operator =( DrizzleData&& ) = default; + + /*! + * Returns the full path to the unregistered image file corresponding to the + * drizzle source image represented by this instance. + * + * The file identified by this function stores the input image of the image + * registration task. This file can be used as input for a drizzle + * integration task. + * + * \sa SetSourceFilePath() + */ + const String& SourceFilePath() const + { + return m_sourceFilePath; + } + + /*! + * Sets the path to the unregistered image file corresponding to the drizzle + * image represented by this instance. + * + * \sa SourceFilePath() + */ + void SetSourceFilePath( const String& filePath ) + { + m_sourceFilePath = File::FullPath( filePath ); + } + + /*! + * Returns the full path to the mosaiced/unregistered image file + * corresponding to the drizzle source image represented by this instance. + * + * The file identified by this function stores the input image of the image + * demosaicing task. This file can be used as input for a CFA drizzle + * integration task. + * + * \sa SetCFASourceFilePath(), CFASourcePattern(), CFASourceChannel() + */ + const String& CFASourceFilePath() const + { + return m_cfaSourceFilePath; + } + + /*! + * Sets the path to the mosaiced/unregistered image file corresponding t + * the drizzle source image represented by this instance. + * + * \sa CFASourceFilePath(), SetCFASourcePattern(), SetCFASourceChannel() + */ + void SetCFASourceFilePath( const String& filePath ) + { + m_cfaSourceFilePath = File::FullPath( filePath ); + } + + /*! + * Returns a string representation of the color filter array (CFA) used by + * the mosaiced/unregistered image file corresponding to the drizzle source + * image represented by this instance. + * + * The CFA corresponds to the file represented by CFASourceFilePath(). For + * the standard Bayer filters, this function returns "RGGB", "BGGR", "GBRG", + * and "GRBG". + * + * \sa SetCFASourcePattern(), CFASourceChannel(), CFASourceFilePath() + */ + const String& CFASourcePattern() const + { + return m_cfaSourcePattern; + } + + /*! + * Defines the color filter array (CFA) used by the mosaiced/unregistered + * image file corresponding to the drizzle source image represented by this + * instance. + * + * See CFASourcePattern() for more information on CFA representations. + * + * \sa CFASourcePattern(), SetCFASourceChannel(), SetCFASourceFilePath() + */ + void SetCFASourcePattern( const String& cfaPattern ) + { + m_cfaSourcePattern = cfaPattern; + } + + /*! + * Returns the channel index selected for the CFA mosaiced/unregistered + * image file corresponding to the drizzle source image represented by this + * instance. + * + * The returned value is the zero-based index of an image channel in a color + * filter array (CFA) source frame, where typically 0 corresponds to red, 1 + * to green and 2 to blue. This member function returns a value < 0 if no + * channel index has been defined. + * + * The CFA channel index can be defined for drizzle integration of separate + * color components working with color filter array (CFA) images. This is + * useful for correction of non-isotropic channel misalignments, such as + * those caused by chromatic aberration or atmospheric dispersion, by + * computing image registration transformations with distortion corrections + * among color components for each source frame. When a channel index has + * been defined, the final CFA drizzle integration generates a monochrome + * single-channel image instead of an RGB image. + * + * \sa SetCFASourceChannel(), CFASourceFilePath(), CFASourcePattern() + */ + int CFASourceChannel() const + { + return m_cfaSourceChannel; + } + + /*! + * Defines the channel index selected for the CFA mosaiced/unregistered + * image file corresponding to the drizzle source image represented by this + * instance. + * + * The specified \a channel can be < 0 to disable the CFA channel index + * feature. See CFASourceChannel() for more information on CFA channel + * indexes and their role for CFA drizzle integrations. + * + * \sa CFASourceChannel(), SetCFASourceFilePath(), SetCFASourcePattern() + */ + void SetCFASourceChannel( int channel ) + { + m_cfaSourceChannel = Range( channel, -1, int( int32_max ) ); + } + + /*! + * Returns the full path to the registered image file corresponding to the + * drizzle source image represented by this instance, or an empty string if + * that file path is not available. + * + * The file identified by this function stores the output image of the image + * registration task. This file can be used as input for a regular + * (non-drizzle) integration task. + * + * \note This file should not be used as input for drizzle + * integration, since it has already been registered and interpolated. Use + * SourceFilePath() or CFASourceFilePath() as input for drizzle or CFA + * drizzle, respectively. + * + * \sa SetAlignmentTargetFilePath() + */ + const String& AlignmentTargetFilePath() const + { + return m_alignTargetFilePath; + } + + /*! + * Sets the path to the registered image file corresponding to the drizzle + * image represented by this instance. + * + * \sa AlignmentTargetFilePath() + */ + void SetAlignmentTargetFilePath( const String& filePath ) + { + m_alignTargetFilePath = File::FullPath( filePath ); + } + + /*! + * Returns the width in pixels of the registration reference image. + * + * \sa ReferenceHeight(), SetReferenceDimensions() + */ + int ReferenceWidth() const + { + return m_referenceWidth; + } + + /*! + * Returns the height in pixels of the registration reference image. + * + * \sa ReferenceWidth(), SetReferenceDimensions() + */ + int ReferenceHeight() const + { + return m_referenceHeight; + } + + /*! + * Sets new registration reference image dimensions in pixels, \a width and + * \a height, respectively. + * + * \sa ReferenceWidth(), ReferenceHeight() + */ + void SetReferenceDimensions( int width, int height ) + { + m_referenceWidth = width; + m_referenceHeight = height; + } + + /*! + * Returns the number of channels or pixel sample planes in the image + * represented by this instance. + */ + int NumberOfChannels() const + { + return m_location.Length(); + } + + /*! + * Returns the origin of image alignment coordinates. The returned point + * corresponds to image coordinates {0,0} in the coordinate system used for + * image registration. + * + * \sa SetAlignmentOrigin() + */ + const DPoint& AlignmentOrigin() const + { + return m_alignmentOrigin; + } + + /*! + * Defines the origin of image alignment coordinates. This function is + * reserved for image registration tasks involved in drizzle integration + * processes. + * + * \note The default alignment origin coordinates are {0.5,0.5}, that is, + * the center of the top-left pixel in the image coordinate system. These + * coordinates ensure compatibility with old versions of drizzle data + * serializations and standard image registration tools on the PixInsight + * platform. + */ + void SetAlignmentOrigin( const DPoint& p0 ) + { + m_alignmentOrigin = p0; + } + + /*! + * Returns the 3x3 alignment matrix for the drizzle source image represented + * by this instance. The returned matrix defines a projective geometric + * transformation, also known as \e homography. + * + * \sa SetAlignmentMatrix() + */ + const Matrix& AlignmentMatrix() const + { + return m_H; + } + + /*! + * Defines a new 3x3 alignment matrix. This function is reserved for image + * registration tasks involved in drizzle integration processes. + * + * \sa AlignmentMatrix() + */ + void SetAlignmentMatrix( const Matrix& H ) + { + m_H = H; + } + + /*! + * Returns true iff this instance defines a 3x3 alignment matrix for the + * projective image registration transformation. + * + * \sa AlignmentMatrix(), HasAlignmentSplines() + */ + bool HasAlignmentMatrix() const + { + return !m_H.IsEmpty(); + } + + /*! + * Returns the vector surface spline interpolation/approximation device in + * two dimensions for the drizzle source image represented by this instance. + * These splines define an image registration transformation with + * corrections for arbitrary distortions. + * + * \sa SetAlignmentSplines(), SetAlignmentInverseSplines() + */ + const vector_spline& AlignmentSplines() const + { + return m_S; + } + + /*! + * Sets a new vector surface spline interpolation/approximation device. This + * member function is reserved for image registration tasks involved in + * drizzle integration processes. + * + * \sa AlignmentSplines(), AlignmentInverseSplines() + */ + void SetAlignmentSplines( const vector_spline& S ) + { + m_S = S; + } + + /*! + * Returns true iff this instance defines a vector surface spline + * interpolation/approximation device. + * + * \sa AlignmentSplines(), HasAlignmentInverseSplines(), + * HasAlignmentMatrix() + */ + bool HasAlignmentSplines() const + { + return m_S.IsValid(); + } + + /*! + * Returns the inverse vector surface spline interpolation/approximation + * device in two dimensions for the drizzle source image represented by this + * instance. These splines define an inverse image registration + * transformation with corrections for arbitrary distortions. + * + * \sa SetAlignmentInverseSplines(), SetAlignmentSplines() + */ + const vector_spline& AlignmentInverseSplines() const + { + return m_Sinv; + } + + /*! + * Sets a new inverse vector surface spline interpolation/approximation + * device. This member function is reserved for image registration tasks + * involved in drizzle integration processes. + * + * \sa AlignmentInverseSplines(), AlignmentSplines() + */ + void SetAlignmentInverseSplines( const vector_spline& Sinv ) + { + m_Sinv = Sinv; + } + + /*! + * Returns true iff this instance defines an inverse vector surface spline + * interpolation/approximation device. + * + * \sa AlignmentInverseSplines(), HasAlignmentSplines(), + * HasAlignmentMatrix() + */ + bool HasAlignmentInverseSplines() const + { + return m_Sinv.IsValid(); + } + + /*! + * Stores a copy of the local distortion model in the specified arrays. + * + * \param[out] P1 Reference to an array of points where the function will + * store a copy of the reference image coordinates of the + * local distortion model. + * + * \param[out] D2 Reference to an array of points where the function will + * store a copy of the set of pixels displacements of the + * local distortion model. + * + * \param[out] P2 Reference to an array of points where the function will + * store a copy of the reference image coordinates of the + * inverse local distortion model. + * + * \param[out] D1 Reference to an array of points where the function will + * store a copy of the set of pixels displacements of the + * inverse local distortion model. + * + * \param[out] W Reference to an array of scalars where the function + * will store a copy of the set of statistical weights + * associated with the local distortion model. This array + * can be empty if the local distortion model is + * unweighted. + * + * \param order Reference to a variable that will be assigned the + * derivability order for surface interpolation + * generation. Normally this is a surface spline + * derivative order. + * + * \param regularization Reference to a variable that will be assigned the + * recommended regularization factor for surface + * interpolation generation. Normally this is a thin plate + * spline smoothness factor. + * + * \param extrapolate Reference to a variable that will be assigned true + * if the local distortion model has to be extrapolated + * over the entire reference image; false if the model can + * only be interpolated within the containing rectangle of + * the set \a P. + * + * If this instance does not transport a valid local distortion model, the + * specified arrays \a P1, \a D2, \a P2 and \a D1 will be empty after + * calling this function. + * + * \sa SetLocalDistortionModel(), HasLocalDistortionModel() + */ + void GetLocalDistortionModel( point_list& P1, point_list& D2, + point_list& P2, point_list& D1, + weight_vector& W, + int& order, float& regularization, bool& extrapolate ) + { + P1 = m_LP1; + D2 = m_LD2; + P2 = m_LP2; + D1 = m_LD1; + W = m_LW; + order = m_localDistortionOrder; + regularization = m_localDistortionRegularization; + extrapolate = m_localDistortionExtrapolation; + } + + /*! + * Defines a new local distortion model. This function is reserved for + * image registration tasks involved in drizzle integration processes. + * + * \param P1 Reference to an array of points in reference image + * coordinates. + * + * \param D2 Reference to an array of point displacements in taget image + * coordinates. + * + * \param P2 Reference to an array of points in target image coordinates. + * + * \param D1 Reference to an array of point displacements in reference + * image coordinates. + * + * \param W Reference to an array of statistical weights associated with + * the points in the local distortion model. This array can be + * empty if the local distortion model is unweighted. If + * nonempty, this array must have the same length as \a P1. + * + * \param order Derivability order for surface interpolation generation. + * Normally this is a surface spline derivative order. The + * default value is 2, which is the usual choice for generation + * of thin plate splines. + * + * \param regularization The regularization factor for surface + * interpolation generation, which should be ≥ 0. Normally + * this is a thin plate spline smoothness factor. Set to zero to + * disable surface spline regularization. The default value is + * 0.01 for regularization at the centipixel level. + * + * \param extrapolate True if the local distortion model has to be + * extrapolated over the entire reference image; false if the + * model can only be interpolated within the containing + * rectangle of the set \a P. Extrapolation is enabled by + * default. + * + * Each point in the reference array \a P1 must have a counterpart in the + * array \a D2. Point displacements are intended to be applied to projected + * reference coordinates on the registration target image. The same applies + * to the inverse local distortion model \a P2 and \a D1, but points in + * \a P2 are target image coordinates and points in \a D1 are projected + * displacements in reference image coordinates. + * + * \sa GetLocalDistortionModel(), HasLocalDistortionModel() + */ + void SetLocalDistortionModel( const point_list& P1, const point_list& D2, + const point_list& P2, const point_list& D1, + const weight_vector& W, + int order = 2, float regularization = 0.01F, bool extrapolate = true ) + { + PCL_PRECONDITION( P1.Length() == D2.Length() ) + PCL_PRECONDITION( P2.Length() == D1.Length() ) + PCL_PRECONDITION( W.IsEmpty() || W.Length() >= P1.Length() ) + m_LP1 = P1; + m_LD2 = D2; + m_LP2 = P2; + m_LD1 = D1; + m_LW = W; + m_localDistortionOrder = Max( 2, order ); + m_localDistortionRegularization = Max( .0F, regularization ); + m_localDistortionExtrapolation = extrapolate; + } + + /*! + * Returns true iff this instance defines a local distortion model + * consisting of a list of reference points and their corresponding pixel + * displacements in image coordinates. + */ + bool HasLocalDistortionModel() const + { + return !m_LP1.IsEmpty(); + } + + /*! + * Returns a string serialization of metadata items corresponding to the + * drizzle source image represented by this instance. Metadata items are + * normally generated and serialized by a regular integration task. + * + * \sa SetMetadata() + */ + const String& Metadata() const + { + return m_metadata; + } + + /*! + * Defines a string serialization of metadata items for the drizzle source + * image represented by this instance. + * + * \sa Metadata() + */ + void SetMetadata( const String& metadata ) + { + m_metadata = metadata.Trimmed(); + } + + /*! + * Returns the vector of per-channel robust estimates of location for the + * drizzle source image represented by this instance. + * + * See Scale() for a description of the output normalization procedure. + * + * Typically, the components of the vector returned by this function are + * median values, or similar robust estimates of location, computed for each + * channel of the image identified by AlignmentTargetFilePath(). These + * estimates are normally generated by a regular integration task. + * + * \sa SetLocation(), ReferenceLocation(), Scale(), AdaptiveNormalizationLocation() + */ + const DVector& Location() const + { + return m_location; + } + + /*! + * Sets a new vector of per-channel robust estimates of location for the + * drizzle source image represented by this instance. This function is + * reserved for image integration tasks involved in drizzle integration + * processes. + * + * \sa Location(), ReferenceLocation(), SetScale(), SetAdaptiveNormalizationLocation() + */ + void SetLocation( const DVector& v ) + { + m_location = v; + } + + /*! + * Returns the vector of per-channel robust estimates of location for the + * reference integration image associated with the drizzle source image + * represented by this instance. + * + * See Scale() for a description of the output normalization procedure. + * + * Typically, the components of the vector returned by this function are + * median values, or similar robust estimates of location, computed for each + * channel of an image used as reference by a regular integration task. + * + * \sa SetLocation(), ReferenceLocation(), Scale(), + * ReferenceAdaptiveNormalizationLocation() + */ + const DVector& ReferenceLocation() const + { + return m_referenceLocation; + } + + /*! + * Sets a new vector of per-channel robust estimates of location for the + * reference integration image. This function is reserved for image + * integration tasks involved in drizzle integration processes. + * + * \sa ReferenceLocation(), Location(), SetScale(), + * SetReferenceAdaptiveNormalizationLocation() + */ + void SetReferenceLocation( const DVector& v ) + { + m_referenceLocation = v; + } + + /*! + * Returns the vector of per-channel scaling factors for the drizzle source + * image represented by this instance. + * + * For normalization of output pixel samples in a channel c of the drizzle + * image, the following equation should be implemented: + * + * vc' = (vc - Lc)*Sc + L0c + * + * where vc is the source pixel sample, Lc is the location estimate given by + * Location()[c], Sc is the scaling factor given by Scale()[c], L0c is the + * reference location estimate given by ReferenceLocation()[c], and vc' is + * the normalized pixel sample value. + * + * Typically, the components of the vector returned by this function are the + * result of dividing reference scale estimates by robust estimates of + * dispersion, such as MAD or the square root of the biweight midvariance, + * among many others, computed for each channel of the image identified by + * AlignmentTargetFilePath(). Scaling factors are normally generated by a + * regular integration task. + * + * \sa SetScale(), Location(), ReferenceLocation(), + * GetAdaptiveNormalizationScaleVectors() + */ + const DVector& Scale() const + { + if ( !m_scale.IsEmpty() ) + return m_scale; + if ( m_unitScale.IsEmpty() ) + m_unitScale = DVector( 1.0, NumberOfChannels() ); + return m_unitScale; + } + + /*! + * Sets a new vector of per-channel scaling factors for the drizzle source + * image represented by this instance. This function is reserved for image + * integration tasks involved in drizzle integration processes. + * + * \sa Scale(), SetLocation(), SetAdaptiveNormalizationScaleVectors() + */ + void SetScale( const DVector& v ) + { + m_scale = v; + } + + /*! + * Returns the vector of adaptive normalization node coordinates. + * + * Adaptive normalization is based on surface interpolation of location and + * scale estimates computed for regions of interest distributed over source + * and reference images. This function returns the list of 2-D interpolation + * node coordinates. See GetAdaptiveNormalizationScaleVectors() for a + * complete description of the adaptive output normalization procedure. + * + * \sa SetAdaptiveNormalizationCoordinates() + */ + const point_list& AdaptiveNormalizationCoordinates() const + { + return m_adaptiveCoordinates; + } + + /*! + * Sets the vector of adaptive normalization node coordinates. This function + * is reserved for image integration tasks involved in drizzle integration + * processes. + * + * \sa AdaptiveNormalizationCoordinates() + */ + void SetAdaptiveNormalizationCoordinates( const point_list& points ) + { + m_adaptiveCoordinates = points; + } + + /*! + * Returns the vectors of per-channel adaptive estimates of location for the + * drizzle source image represented by this instance. + * + * See GetAdaptiveNormalizationScaleVectors() for a complete description of + * the adaptive output normalization procedure. + * + * Typically, the components of the multivector structure returned by this + * function are median values, or similar robust estimates of location, + * computed on a regular grid for each channel of the image identified by + * AlignmentTargetFilePath(). These estimates are normally generated by a + * regular integration task. + * + * \sa SetAdaptiveNormalizationLocationVectors() + */ + const MultiVector& AdaptiveNormalizationLocationVectors() const + { + return m_adaptiveLocation; + } + + /*! + * Sets new vectors of per-channel adaptive estimates of location for the + * drizzle source image represented by this instance. This function is + * reserved for image integration tasks involved in drizzle integration + * processes. + * + * \sa AdaptiveNormalizationLocationVectors() + */ + void SetAdaptiveNormalizationLocationVectors( const MultiVector& m ) + { + m_adaptiveLocation = m; + } + + /*! + * Provides the vectors of per-channel adaptive scale factors for the + * drizzle source image represented by this instance. + * + * \param[out] sLow Reference to a multivector where a copy of the + * current set of low adaptive scale factor vectors + * will be stored. + * + * \param[out] sHigh Reference to a multivector where a copy of the + * current set of high adaptive scale factor vectors + * will be stored. + * + * For a channel index c and position vector i on a given input drizzle + * integration image, the adaptive normalization function is given by: + * + *
+    * v'(c,i) = v(c,i) * (a*U(S0(c,i)) + (1-a)*U(S1(c,i)))
+    *                  + (a*U(Z0(c,i)) + (1-a)*U(Z1(c,i)))
+    * 
+ * + * where: + * + * S0 is a matrix of low adaptive scale factors,\n + * S1 is a matrix of high adaptive scale factors,\n + * Z0 is a matrix of low adaptive zero offset coefficients,\n + * Z1 is a matrix of high adaptive zero offset coefficients,\n + * U is a scale-dependent interpolation functional,\n + * v is the source pixel value,\n + * v' is the resulting normalized pixel value,\n + * a is an indicator function given by: + * + *
+    * a = 1   if v(c,i) ≤ U(L(c,i))
+    * a = 0   if v(c,i) > U(L(c,i))
+    * 
+ * + * and L is a matrix of adaptive location estimates. + * + * Typically, the components of the multivector structures provided by this + * function are the result of dividing reference scale estimates by robust + * estimates of dispersion, such as MAD or the square root of the biweight + * midvariance, among many others, computed for each channel of the image + * identified by AlignmentTargetFilePath(). Scale factors are normally + * generated by a regular integration task. + * + * \sa SetAdaptiveNormalizationScaleVectors() + */ + void GetAdaptiveNormalizationScaleVectors( MultiVector& sLow, MultiVector& sHigh ) const + { + sLow = m_adaptiveScaleLow; + sHigh = m_adaptiveScaleHigh; + } + + /*! + * Sets new vectors of per-channel adaptive scaling factors for the drizzle + * source image represented by this instance. This function is reserved for + * image integration tasks involved in drizzle integration processes. + * + * \sa GetAdaptiveNormalizationScaleVectors() + */ + void SetAdaptiveNormalizationScaleVectors( const MultiVector& sLow, const MultiVector& sHigh ) + { + m_adaptiveScaleLow = sLow; + m_adaptiveScaleHigh = sHigh; + } + + /*! + * Provides the vectors of per-channel adaptive zero offset coefficients for + * the drizzle source image represented by this instance. + * + * \param[out] mLow Reference to a multivector where a copy of the + * current set of low adaptive zero offset coefficient + * vectors will be stored. + * + * \param[out] mHigh Reference to a multivector where a copy of the + * current set of high adaptive zero offset coefficient + * vectors will be stored. + * + * See GetAdaptiveNormalizationScaleVectors() for a complete description of + * the output adaptive normalization procedure. + * + * \sa SetAdaptiveNormalizationZeroOffsetVectors() + */ + void GetAdaptiveNormalizationZeroOffsetVectors( MultiVector& mLow, MultiVector& mHigh ) const + { + mLow = m_adaptiveZeroOffsetLow; + mHigh = m_adaptiveZeroOffsetHigh; + } + + /*! + * Sets new vectors of per-channel adaptive zero offsets for the drizzle + * source image represented by this instance. This function is reserved for + * image integration tasks involved in drizzle integration processes. + * + * \sa GetAdaptiveNormalizationZeroOffsetVectors() + */ + void SetAdaptiveNormalizationZeroOffsetVectors( const MultiVector& mLow, const MultiVector& mHigh ) + { + m_adaptiveZeroOffsetLow = mLow; + m_adaptiveZeroOffsetHigh = mHigh; + } + + /*! + * Returns true iff this instance transports adaptive normalization data, + * i.e. vectors of adaptive normalization coordinates and multivectors of + * adaptive normalization location estimates, scale factors and zero offset + * coefficients. + */ + bool HasAdaptiveNormalizationData() const + { + return !m_adaptiveCoordinates.IsEmpty() && + !m_adaptiveLocation.IsEmpty() && + !m_adaptiveScaleLow.IsEmpty() && + !m_adaptiveScaleHigh.IsEmpty() && + !m_adaptiveZeroOffsetLow.IsEmpty() && + !m_adaptiveZeroOffsetHigh.IsEmpty(); + } + + /*! + * Returns a positive value in the range [0,1] to be subtracted from the + * image represented by this instance. + */ + double Pedestal() const + { + return m_pedestal; + } + + /*! + * Defines a positive value in the range [0,1] to be subtracted from the + * image represented by this instance. This function is reserved for image + * integration tasks involved in drizzle integration processes. + */ + void SetPedestal( double p ) + { + m_pedestal = Range( p, 0.0, 1.0 ); + } + + /*! + * Returns the vector of per-channel statistical weights for the drizzle + * image represented by this instance. + * + * Typically, the components of the returned vector are efficient + * statistical weights computed for each channel of the image identified by + * AlignmentTargetFilePath(). These weights are normally generated by a + * regular integration task. + * + * \sa SetWeight(), Location(), ReferenceLocation(), Scale() + */ + const DVector& Weight() const + { + if ( !m_weight.IsEmpty() ) + return m_weight; + if ( m_unitWeight.IsEmpty() ) + m_unitWeight = DVector( 1.0, NumberOfChannels() ); + return m_unitWeight; + } + + /*! + * Sets a new vector of per-channel statistical weights for the drizzle + * image represented by this instance. This function is reserved for image + * integration tasks involved in drizzle integration processes. + * + * \sa Weight(), SetLocation(), SetReferenceLocation(), SetScale() + */ + void SetWeight( const DVector& v ) + { + m_weight = v; + } + + /*! + * Returns true iff this %DrizzleData object transports image integration + * data for normalization and image combination. This includes at least + * location and reference location estimates, and optionally (but usually + * present) scaling factors and statistical image weights. + */ + bool HasIntegrationData() const + { + return !m_location.IsEmpty(); + } + + /*! + * Returns true iff this %DrizzleData object transports per-channel + * statistical image weights. If no weight information is available, the + * Weight() member function will return a reference to an internal vector + * with all components set to one. + */ + bool HasImageWeightsData() const + { + return !m_weight.IsEmpty(); + } + + /*! + * Returns the vector of per-channel low pixel rejection counts for the + * drizzle source image represented by this instance. + * + * The components of the returned vector are the total amounts of rejected + * low pixels for each channel of the image identified by + * AlignmentTargetFilePath(). Pixel rejection counts are normally generated + * by a regular image integration task. + * + * \sa RejectionHighCount(), RejectionMap() + */ + const UI64Vector& RejectionLowCount() const + { + return m_rejectionLowCount; + } + + /*! + * Returns the vector of per-channel high pixel rejection counts for the + * drizzle source image represented by this instance. + * + * The components of the returned vector are the total amounts of rejected + * high pixels for each channel of the image identified by + * AlignmentTargetFilePath(). Pixel rejection counts are normally generated + * by a regular image integration task. + * + * \sa RejectionLowCount(), RejectionMap() + */ + const UI64Vector& RejectionHighCount() const + { + return m_rejectionHighCount; + } + + /*! + * Returns a reference to a pixel rejection map generated for the drizzle + * image represented by this instance. + * + * This member function returns a reference to an 8-bit unsigned integer + * image known as drizzle rejection map. Each channel of the + * rejection map corresponds to the same channel of the image represented by + * this object. For a channel index c, a pixel sample of a rejection map can + * have the following values: + * + * \li 0 (no bit set): The corresponding pixel has not been rejected for + * image channel c. + * + * \li Bit 0 set: High statistical rejection: The pixel has been rejected + * above the estimated central value of its pixel integration stack using a + * statistical rejection algorithm (such as sigma clipping). + * + * \li Bit 1 set: Low statistical rejection: The pixel has been rejected + * below the estimated central value of its pixel integration stack using a + * statistical rejection algorithm (such as sigma clipping). + * + * \li Bit 2 set: High range rejection: The pixel has been rejected because + * its value is greater than or equal to a prescribed upper limit. + * + * \li Bit 3 set: Low range rejection: The pixel has been rejected because + * its value is smaller than or equal to a prescribed lower limit. + * + * \li Bit 4 set: High large-scale rejection: The pixel belongs to a bright + * large-scale image structure that has been rejected using multiscale + * analysis techniques. + * + * \li Bit 5 set: Low large-scale rejection: The pixel belongs to a dark + * large-scale image structure that has been rejected using multiscale + * analysis techniques. + * + * Bits 6 and 7 are reserved for future extensions and should be zero in the + * current implementation. + * + * Rejection maps are automatically generated from pixel rejection data + * stored in .xdrz files. Pixel rejection data are normally generated by a + * regular image integration task. + * + * If no pixel rejection information is available in this instance, this + * function returns a reference to an empty image. + * + * \sa SetRejectionMap(), HasRejectionData(), IsRejected() + */ + const UInt8Image& RejectionMap() const + { + return m_rejectionMap; + } + + /*! + * Returns true iff the pixel at the specified pixel coordinates has been + * rejected for the drizzle source image represented by this instance. + * + * \sa RejectionMap(), HasRejectionData() + */ + bool IsRejected( const Point& position, int channel = 0 ) const + { + return m_rejectionMap.Includes( position ) + && m_rejectionMap.IsValidChannelIndex( channel ) + && (m_rejectionMap( position, channel ) & 0x3F) != 0; + } + + /*! + * Defines per-channel pixel rejection data for the drizzle source image + * represented by this instance. The specified \a map image is a drizzle + * rejection map as described in RejectionMap(). + * + * \sa RejectionMap(), HasRejectionData() + */ + void SetRejectionMap( const UInt8Image& map ) + { + m_rejectionMap = map; + } + + /*! + * Returns true iff pixel rejection information is available for the drizzle + * image represented by this instance. + */ + bool HasRejectionData() const + { + return !m_rejectionMap.IsEmpty(); + } + + /*! + * Returns the UTC time this drizzle data was created, or an invalid + * TimePoint instance if creation time information is not available. + */ + TimePoint CreationTime() const + { + return m_creationTime; + } + + /*! + * Clears all of the drizzle integration data transported by this instance, + * yielding an empty %DrizzleData object. + */ + void Clear(); + + /*! + * Clears the image integration data transported by this instance. This + * includes statistical location and scale estimates for image + * normalization, image weights, pixel rejection data, and adaptive + * normalization data. + */ + void ClearIntegrationData(); + + /*! + * Loads and parses a drizzle data file. + * + * \param filePath Path to an existing file that will be parsed. The file + * contents can be in %XML drizzle data format (normally, + * a file with the .xdrz suffix), or in old plain text + * format (typically with the .drz suffix). This function + * will detect the format in use from the first bytes read + * from the file, and will decode it correspondingly. + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified file. + * + * This function validates the data retrieved from the specified file. It + * throws an Error exception in the event of parsing errors or invalid data. + */ + void Parse( const String& filePath, bool ignoreIntegrationData = false ); + + /*! + * Parses a well-formed %XML document. + * + * \param xml Reference to the source %XML document. This member + * function expects an %XML document in valid %XML + * drizzle data format (.xdrz). + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified %XML contents. + * + * This function validates the data retrieved from the specified %XML + * document. It throws an Error exception in the event of an invalid + * document or invalid data. + */ + void Parse( const XMLDocument& xml, bool ignoreIntegrationData = false ); + + /*! + * Parses an %XML element. + * + * \param element Reference to the source %XML element. This member + * function expects an %XML document tree in valid %XML + * drizzle data format (.xdrz) rooted at this element. + * + * \param ignoreIntegrationData If true, all drizzle data relative to the + * image integration task will be ignored. This includes + * statistical location and scale estimates for image + * normalization, image weights, and pixel rejection data. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified %XML contents. + * + * This function validates the data retrieved from the specified %XML + * element. It throws an Error exception in the event of invalid data. + */ + void Parse( const XMLElement& element, bool ignoreIntegrationData = false ); + + /*! + * Returns true if drizzle data compression is enabled for serializations + * performed with this object. + * + * Drizzle data compression is enabled by default for newly constructed + * %DrizzleData objects. Currently the LZ4 compression codec is applied for + * serialization of pixel rejection data. + * + * \sa EnableCompression(), DisableCompression() + */ + bool IsCompressionEnabled() const + { + return m_compressionEnabled; + } + + /*! + * Enables compression of serialized drizzle data. + * + * \sa IsCompressionEnabled(), DisableCompression() + */ + void EnableCompression( bool enable = true ) + { + m_compressionEnabled = enable; + } + + /*! + * Disables compression of serialized drizzle data. + * + * \sa IsCompressionEnabled(), EnableCompression() + */ + void DisableCompression( bool disable = true ) + { + EnableCompression( !disable ); + } + + /*! + * Serializes the drizzle integration data transported by this object as a + * new %XML document in .xdrz format. + * + * The returned XMLDocument object has been allocated dynamically. The + * caller is responsible for destroying and deallocating it as appropriate. + */ + XMLDocument* Serialize() const; + + /*! + * Serializes the drizzle integration data transported by this object as a + * new %XML document file in .xdrz format. The file will be newly created at + * the specified file \a path. + * + * \warning If a file already exists at the specified \a path, its previous + * contents will be lost after calling this function. + */ + void SerializeToFile( const String& path ) const; + +private: + + String m_sourceFilePath; + String m_cfaSourceFilePath; + String m_cfaSourcePattern; + int m_cfaSourceChannel = -1; + String m_alignTargetFilePath; + int m_referenceWidth = -1; + int m_referenceHeight = -1; + DPoint m_alignmentOrigin = 0.5; + Matrix m_H; + vector_spline m_S; + vector_spline m_Sinv; + point_list m_LP1; + point_list m_LD2; + point_list m_LP2; + point_list m_LD1; + weight_vector m_LW; + int m_localDistortionOrder = 2; + float m_localDistortionRegularization = 0.01F; + bool m_localDistortionExtrapolation = true; + String m_metadata; + double m_pedestal = 0.0; + Vector m_location; + Vector m_referenceLocation; + Vector m_scale; + mutable Vector m_unitScale; + Vector m_weight; + mutable Vector m_unitWeight; + point_list m_adaptiveCoordinates; + MultiVector m_adaptiveLocation; + MultiVector m_adaptiveScaleLow; + MultiVector m_adaptiveScaleHigh; + MultiVector m_adaptiveZeroOffsetLow; + MultiVector m_adaptiveZeroOffsetHigh; + UI64Vector m_rejectionLowCount; + UI64Vector m_rejectionHighCount; + UInt8Image m_rejectionMap; + TimePoint m_creationTime; + bool m_compressionEnabled = true; + + // Working data for spline deserialization. + spline m_Sx; + spline m_Sy; + spline m_Sxinv; + spline m_Syinv; + + // Working data for old text format compatibility. + rejection_data m_rejectLowData; + rejection_data m_rejectHighData; + + void ParseRejectionMap( const XMLElement& ); + void SerializeRejectionMap( XMLElement* ) const; + + static void ParseSpline( spline&, const XMLElement& ); + static void SerializeSpline( XMLElement*, const spline& ); + + static point_list ParsePoints( const XMLElement& ); + void SerializePoints( XMLElement*, const point_list& ) const; + + static weight_vector ParseDistortionWeights( const XMLElement& ); + void SerializeDistortionWeights( XMLElement*, const weight_vector& ) const; + + static ByteArray ParseMaybeCompressedData( const XMLElement& ); + void SerializeMaybeCompressedData( XMLElement* root, + const void* data, size_type size, size_type itemSize = 1 ) const; + + /*! + * \internal + * \class DrizzleData::PlainTextDecoder + * \brief Read-only compatibility with old plain text .drz files + */ + class PlainTextDecoder + { + public: + + PlainTextDecoder( DrizzleData* data, bool ignoreIntegrationData ) + : m_data( data ) + , m_ignoreIntegrationData( ignoreIntegrationData ) + { + } + + virtual ~PlainTextDecoder() + { + } + + void Decode( IsoString&, size_type start = 0, size_type end = 0 ); + + protected: + + PlainTextDecoder() = default; + + private: + + DrizzleData* m_data = nullptr; + bool m_ignoreIntegrationData = false; + + virtual void ProcessBlock( IsoString&, const IsoString&, size_type, size_type ); + + static rejection_coordinates ParseRejectionCoordinates( IsoString&, size_type, size_type ); + static rejection_data ParseRejectionData( IsoString&, size_type, size_type ); + static spline ParseSurfaceSpline( IsoString&, size_type, size_type ); + }; + + class PlainTextSplineDecoder : public PlainTextDecoder + { + public: + + PlainTextSplineDecoder( spline& S ) + : m_S( S ) + { + } + + virtual ~PlainTextSplineDecoder() + { + } + + private: + + spline& m_S; + + void ProcessBlock( IsoString&, const IsoString&, size_type, size_type ) override; + }; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_DrizzleData_h + +// ---------------------------------------------------------------------------- +// EOF pcl/DrizzleData.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Edit.h b/3rdparty/include/pcl/Edit.h new file mode 100644 index 0000000..5b0a589 --- /dev/null +++ b/3rdparty/include/pcl/Edit.h @@ -0,0 +1,391 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Edit.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Edit_h +#define __PCL_Edit_h + +/// \file pcl/Edit.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Edit + * \brief Client-side interface to a PixInsight %Edit control + * + * %Edit controls are single-line plain text edit controls. + */ +class PCL_CLASS Edit : public Frame +{ +public: + + /*! + * Constructs an %Edit object with the specified \a text, as a child control + * of \a parent. + */ + Edit( const String& text = String(), Control& parent = Control::Null() ); + + /*! + * Destroys an %Edit control. + */ + virtual ~Edit() + { + } + + /*! + * Returns the current edit text. + */ + String Text() const; + + /*! + * Sets the current button text. + */ + void SetText( const String& ); + + /*! + * Removes all the text in this %edit control. + */ + void Clear() + { + SetText( String() ); + } + + /*! + * Returns true iff this %Edit control is in read-only mode. + */ + bool IsReadOnly() const; + + /*! + * Enables or disables the read-only mode for this %Edit control. + */ + void SetReadOnly( bool = true ); + + /*! + * Disables or enables the read-only mode for this %Edit control. + * + * This is a convenience member function, equivalent to: + * SetReadOnly( !rw ) + */ + void SetReadWrite( bool rw = true ) + { + SetReadOnly( !rw ); + } + + /*! + * Returns true iff the text in this %Edit control has been modified. + */ + bool IsModified() const; + + /*! + * Sets or clears the modified status for this %Edit control. + */ + void SetModified( bool = true ); + + /*! + * Clears or sets the modified status for this %Edit control. + * + * This is a convenience member function, equivalent to: + * SetModified( !clear ) + */ + void ClearModified( bool clear = true ) + { + SetModified( !clear ); + } + + /*! + * Returns true iff this %Edit control is in password display mode. + * + * In password mode, the text in an edit control is always displayed as a + * sequence of asterisks. This does not affect the actual text; the password + * mode only changes the way characters are displayed. + * + * \sa EnablePasswordMode(), DisablePasswordMode() + */ + bool IsPasswordMode() const; + + /*! + * Enables the password display mode for this %Edit control. + * + * \sa IsPasswordMode(), DisablePasswordMode() + */ + void EnablePasswordMode( bool = true ); + + /*! + * Disables the password display mode for this %Edit control. + * + * This is a convenience member function, equivalent to: + * EnablePasswordMode( !disable ) + * + * \sa IsPasswordMode(), EnablePasswordMode() + */ + void DisablePasswordMode( bool disable = true ) + { + EnablePasswordMode( !disable ); + } + + /*! + * Returns the maximum allowed length for the text in this %Edit control. + */ + int MaxLength() const; + + /*! + * Sets the maximum allowed length for the text in this %Edit control. + * + * The default length limit is \c int_max, which in practice represents no + * length limit. + */ + void SetMaxLength( int ); + + /*! + * Enables unlimited length for the text in this %Edit control. + * + * This is a convenience member function, equivalent to: + * SetMaxLength( int_max ) + */ + void SetUnlimitedLength() + { + SetMaxLength( int_max ); + } + + /*! + * Selects all the text in this %edit control. + */ + void SelectAll( bool = true ); + + /*! + * Clears the existing selection, if any, in this %edit control. + * + * \note This member function does not delete the selected text; it only + * removes the selection. + */ + void Unselect( bool unsel = true ) + { + SelectAll( !unsel ); + } + + /*! + * Gets the limits of the current selection in this %Edit control. + * + * \param[out] selStart The index of the first selected character. + * \param[out] selEnd The index of the last selected character plus one. + * + * When \a selStart is equal to \a selEnd, there is no selection in this + * edit control. + */ + void GetSelection( int& selStart, int& selEnd ) const; + + /*! + * Sets the limits of the current selection in this %Edit control. + * + * \param selStart The index of the first selected character. + * \param selEnd The index of the last selected character plus one. + * + * When \a selStart is equal to \a selEnd, there is no selection in this + * edit control. + */ + void SetSelection( int selStart, int selEnd ); + + /*! + * Returns true iff there are one or more selected characters in this %Edit + * control. + */ + bool HasSelection() const + { + int s0, s1; + GetSelection( s0, s1 ); + return s0 != s1; + } + + /*! + * Returns the currently selected text, or an empty string if there is no + * selection in this %Edit control. + */ + String SelectedText() const; + + /*! + * Returns the current caret position in this %Edit control. + */ + int CaretPosition() const; + + /*! + * Sets the current caret position in this %Edit control. + */ + void SetCaretPosition( int ); + + /*! + * Moves the caret to the beginning of the text line in this %Edit control. + */ + void Home() + { + SetCaretPosition( 0 ); + } + + /*! + * Moves the caret to the end of the text line in this %Edit control. + */ + void End() + { + SetCaretPosition( int_max ); + } + + /*! + * Returns true iff the text in this %Edit control is right-aligned. + */ + bool IsRightAligned() const; + + /*! + * Returns true iff the text in this %Edit control is left-aligned. + */ + bool IsLeftAligned() const + { + return !IsRightAligned(); + } + + /*! + * Enables or disables right-alignment for the text in this %edit control. + */ + void SetRightAlignment( bool right = true ); + + /*! + * Disables or enables right-alignment for the text in this %edit control. + * + * This is a convenience member function, equivalent to: + * SetRightAlignment( !left ) + */ + void SetLeftAlignment( bool left = true ) + { + SetRightAlignment( !left ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnEditCompleted( Edit& sender ); + // void OnReturnPressed( Edit& sender ); + // void OnTextUpdated( Edit& sender, const String& text ); + // void OnCaretPositionUpdated( Edit& sender, int oldPos, int newPos ); + // void OnSelectionUpdated( Edit& sender, int newStart, int newEnd ); + + /*! # + */ + typedef void (Control::*edit_event_handler)( Edit& sender ); + + /*! # + */ + typedef void (Control::*text_event_handler)( Edit& sender, const String& ); + + /*! # + */ + typedef void (Control::*caret_event_handler)( Edit& sender, int oldPos, int newPos ); + + /*! # + */ + typedef void (Control::*selection_event_handler)( Edit& sender, int newStart, int newEnd ); + + /*! # + */ + void OnEditCompleted( edit_event_handler, Control& ); + + /*! # + */ + void OnReturnPressed( edit_event_handler, Control& ); + + /*! # + */ + void OnTextUpdated( text_event_handler, Control& ); + + /*! # + */ + void OnCaretPositionUpdated( caret_event_handler, Control& ); + + /*! # + */ + void OnSelectionUpdated( selection_event_handler, Control& ); + +private: + + struct EventHandlers + { + edit_event_handler onEditCompleted = nullptr; + edit_event_handler onReturnPressed = nullptr; + text_event_handler onTextUpdated = nullptr; + caret_event_handler onCaretPositionUpdated = nullptr; + selection_event_handler onSelectionUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class EditEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Edit_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Edit.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ElapsedTime.h b/3rdparty/include/pcl/ElapsedTime.h new file mode 100644 index 0000000..89f813b --- /dev/null +++ b/3rdparty/include/pcl/ElapsedTime.h @@ -0,0 +1,401 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ElapsedTime.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ElapsedTime_h +#define __PCL_ElapsedTime_h + +/// \file pcl/ElapsedTime.h + +#include +#include + +#include + +#if !defined( __PCL_LINUX ) && !defined( __PCL_FREEBSD ) +# include +# include +# define PCL_CLOCK_ID 0 +#endif + +#ifdef __PCL_LINUX +# include +# ifdef CLOCK_MONOTONIC_RAW // since kernel 2.6.28 +# define PCL_CLOCK_ID CLOCK_MONOTONIC_RAW +# else +# define PCL_CLOCK_ID CLOCK_MONOTONIC +# endif +#endif + +#ifdef __PCL_FREEBSD +# include +# ifdef CLOCK_MONOTONIC_PRECISE // since FreeBSD 10.1 +# define PCL_CLOCK_ID CLOCK_MONOTONIC_PRECISE +# else +# define PCL_CLOCK_ID CLOCK_MONOTONIC +# endif +#endif + +#ifdef __PCL_MACOSX +# include +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ElapsedTime + * \brief High-resolution time stamp. + * + * %ElapsedTime is a platform-independent, monotonically nondecreasing + * high-resolution time stamp based on hardware time resources that are + * independent on any external time reference. The underlying implementation + * uses monotonic clock services on Linux and FreeBSD (via clock_gettime() + * system calls), performance counters on Windows, and Mach absolute time + * system services on macOS. + * + * Example of use: + * + * \code + * ElapsedTime T; + * for ( int i = 0; i < 100000; ++i ) + * foo(); + * double t1 = T(); + * T.Reset(); + * for ( int i = 0; i < 100000; ++i ) + * bar(); + * double t2 = T(); + * Console out; + * out.WriteLn( "Execution times (100K function calls): ); + * out.WriteLn( "foo(): " + ElapsedTime::ToString( t1 ) ); + * out.WriteLn( "bar(): " + ElapsedTime::ToString( t2 ) ); + * \endcode + * + * Timing resolution should be better than one microsecond on all platforms, + * but the actual resolution achieved is hardware and system dependent. + * + * This class is thread-safe: it can be instantiated and its member functions + * can be safely invoked from multiple running threads. + */ +class PCL_CLASS ElapsedTime +{ +public: + + /*! + * Constructs a new %ElapsedTime object and initializes it with the current + * system time, which will be the starting point of subsequent time interval + * evaluations. + */ + ElapsedTime() + { + Reset(); + } + + /*! + * Copy constructor. + */ + ElapsedTime( const ElapsedTime& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ElapsedTime& operator =( const ElapsedTime& ) = default; + + /*! + * Returns the time interval elapsed since the last object initialization, + * expressed in seconds. An %ElapsedTime object is initialized either when + * it is constructed, or through a subsequent call to the Reset() member + * function. + */ + double operator ()() const + { + return TimeStamp() - m_start; + } + + /*! + * Initializes this %ElapsedTime object with a new time stamp, which will be + * the starting point of subsequent time interval evaluations. + */ + void Reset() + { + m_start = TimeStamp(); + } + + /*! + * Returns an 8-bit string representation of the time interval elapsed since + * the last object initialization. See operator()() and + * ToIsoString( double ) for detailed information. + */ + IsoString ToIsoString() const + { + return ToIsoString( operator()() ); + } + + /*! + * Returns a Unicode string representation of the time interval elapsed + * since the last object initialization. See operator()() and + * ToIsoString( double ) for detailed information. + */ + String ToString() const + { + return ToString( operator()() ); + } + + /*! + * IsoString conversion operator. Equivalent to ToIsoString(). + */ + operator IsoString() const + { + return ToIsoString(); + } + + /*! + * String conversion operator. Equivalent to ToString(). + */ + operator String() const + { + return ToString(); + } + + /*! + * Returns a 64-bit, monotonically nondecreasing time stamp. + * + * The returned value is the time elapsed in seconds since an arbitrary, + * platform-dependent starting time that will remain invariant during the + * current execution of the calling module. + * + * With the current implementation, accuracy of timestamps should be better + * than one microsecond on all supported platforms. + */ + static double TimeStamp() + { +#if defined( __PCL_LINUX ) || defined( __PCL_FREEBSD ) + + /* + * Linux/FreeBSD implementation based on clock_gettime(). + */ + timespec ts; + (void)clock_gettime( PCL_CLOCK_ID, &ts ); + return ts.tv_sec + ts.tv_nsec*1.0e-09; + +#endif // __PCL_LINUX || __PCL_FREEBSD + +#ifdef __PCL_MACOSX + + /* + * macOS implementation based on Mach absolute time system services. + * + * https://developer.apple.com/library/mac/qa/qa1398/_index.html + * http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x + */ + static Mutex mutex; + static AtomicInt initialized; + static double absoluteToSeconds; + static uint64 offset; + + if ( !initialized ) + { + volatile AutoLock lock( mutex ); + if ( initialized.Load() == 0 ) + { + mach_timebase_info_data_t timeBase = { 0 }; + mach_timebase_info( &timeBase ); + absoluteToSeconds = 1.0e-09*(double( timeBase.numer )/timeBase.denom); + offset = mach_absolute_time(); + initialized.Store( 1 ); + } + } + + uint64 t = mach_absolute_time(); + return (t - offset)*absoluteToSeconds; + +#endif // __PCL_MACOSX + +#ifdef __PCL_WINDOWS + + /* + * Windows implementation based on Win32 performance counters. + * + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms644905%28v=vs.85%29.aspx + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904%28v=vs.85%29.aspx + * http://stackoverflow.com/questions/5404277/porting-clock-gettime-to-windows + * http://stackoverflow.com/questions/1676036/what-should-i-use-to-replace-gettimeofday-on-windows + */ + static Mutex mutex; + static AtomicInt initialized; + static double countsToSeconds; + static uint64 offset; + + if ( !initialized ) + { + volatile AutoLock lock( mutex ); + if ( initialized.Load() == 0 ) + { + uint64 performanceFrequency; + QueryPerformanceFrequency( (LARGE_INTEGER*)&performanceFrequency ); + countsToSeconds = 1.0/performanceFrequency; + QueryPerformanceCounter( (LARGE_INTEGER*)&offset ); + initialized.Store( 1 ); + } + } + + uint64 t; + QueryPerformanceCounter( (LARGE_INTEGER*)&t ); + return (t - offset)*countsToSeconds; + +#endif // __PCL_WINDOWS + } + + /*! + * Returns an 8-bit string representation of the specified time interval + * in seconds. + * + * The returned string has one of the following formats: + * + * + * + * + * + * + * + * + *
(1) u.uuu us u.uuu is the time t in microseconds if t < 0.001 s
(2) m.mmm ms m.mmm is the time t in milliseconds if t < 1.0 s
(3) s.sss s s.sss is the time t in seconds if t < 60.0 s
(4) mm:ss.ss Zero-padded minutes and seconds if t < 3600 s
(5) hh:mm:ss.s Same as (4) with zero-padded hours if t < 86400 s
(6) d:hh:mm:ss Same as (5) with elapsed days if t >= 86400
+ * + * If \a width > 0 and t ≤ 60, the integer part of the represented + * microseconds, milliseconds or seconds will be right-padded in a field of + * \a width space characters. + * + * The output format is chosen automatically to generate the most + * significant representation. If the specified interval is negative (toward + * the past), a minus sign is prepended to the returned string. + */ + static IsoString ToIsoString( double seconds, int width = 0 ) + { + return ToString( seconds, width, (IsoString*)0 ); + } + + /*! + * Returns a Unicode string representation of the specified time interval + * \a s in seconds. See ToIsoString( double ) for information on the + * representation format. + */ + static String ToString( double s, int width = 0 ) + { + return ToString( s, width, (String*)0 ); + } + + /*! + * Returns the time interval in seconds elapsed between the starting points + * of two %ElapsedTime objects \a t1 and \a t2. The result is positive if + * \a t2 precedes \a t1, negative if \a t1 precedes \a t2, zero if and only + * if either \a t1 and \a t2 are references to the same instance, or if one + * of the objects has been constructed as a copy of the other. + */ + friend double operator -( const ElapsedTime& t1, const ElapsedTime& t2 ) + { + return t1.m_start - t2.m_start; + } + +private: + + double m_start; // timestamp in seconds + + template + static S ToString( double s, int w, S* ) + { + if ( s < 0.001 ) + return S().Format( "%*.3f us", Max( 5, w+4 ), s*1000000 ); + + if ( s < 1 ) + return S().Format( "%*.3f ms", Max( 5, w+4 ), s*1000 ); + + if ( s < 60 ) + return S().Format( "%*.3f s", Max( 5, w+4 ), s ); + + int sign = (s < 0) ? -1 : +1; + s = Abs( s ); + + if ( s < 3600 ) + { + int m = TruncInt( s/60 ); + s -= m*60; + return S().Format( "%02d:%05.2f", m*sign, s ); + } + + if ( s < 86400 ) + { + int h = TruncInt( s/3600 ); + s -= h*3600; + int m = TruncInt( s/60 ); + s -= m*60; + return S().Format( "%02d:%02d:%04.1f", h*sign, m, s ); + } + + int d = TruncInt( s/86400 ); + s -= d*86400; + int h = TruncInt( s/3600 ); + s -= h*3600; + int m = TruncInt( s/60 ); + s -= m*60; + return S().Format( "%d:%02d:%02d:%02d", d*sign, h, m, RoundInt( s ) ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ElapsedTime_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ElapsedTime.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/EndianConversions.h b/3rdparty/include/pcl/EndianConversions.h new file mode 100644 index 0000000..bb9fb9e --- /dev/null +++ b/3rdparty/include/pcl/EndianConversions.h @@ -0,0 +1,168 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/EndianConversions.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_EndianConversions_h +#define __PCL_EndianConversions_h + +/// \file pcl/EndianConversions.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup endianness_conversion_and_detection Endianness Conversion and Detection Functions + */ + +/*! + * Converts a 16-bit unsigned integer from big endian to little endian byte + * storage order. + * + * \ingroup endianness_conversion_and_detection + */ +inline uint16 BigToLittleEndian( uint16 x ) +{ + return (x << 8) | (x >> 8); +} + +/*! + * Converts a 32-bit unsigned integer from big endian to little endian byte + * storage order. + * + * \ingroup endianness_conversion_and_detection + */ +inline uint32 BigToLittleEndian( uint32 x ) +{ + return (RotL( x, 8 ) & 0x00ff00ffu) | (RotR( x, 8 ) & 0xff00ff00u); + +} + +/*! + * Converts a 64-bit unsigned integer from big endian to little endian byte + * storage order. + * + * \ingroup endianness_conversion_and_detection + */ +inline uint64 BigToLittleEndian( uint64 x ) +{ + return (uint64( BigToLittleEndian( uint32( x ) ) ) << 32) | uint64( BigToLittleEndian( uint32( x >> 32 ) ) ); +} + +/*! + * A convenience synonym function for little-to-big endian conversions, which + * we define for the sake of code legibility. It is obviously equivalent to + * BigToLittleEndian( x ). + * + * \ingroup endianness_conversion_and_detection + */ +template inline T LittleToBigEndian( T x ) +{ + return BigToLittleEndian( x ); +} + +// ---------------------------------------------------------------------------- + +union __pcl_endian_check__ { uint32 w; uint8 b[ sizeof( uint32 ) ]; }; + +constexpr __pcl_endian_check__ __pcl_endian_check_sample__ = { 0xdeadbeef }; + +#ifdef __clang__ + +inline bool IsLittleEndianMachine() +{ + return __pcl_endian_check_sample__.b[0] == 0xef; +} + +inline bool IsBigEndianMachine() +{ + return __pcl_endian_check_sample__.b[0] == 0xde; +} + +#else + +// Clang fails here with "read of member 'b' of union with active member 'w' is +// not allowed in a constant expression". + +/*! + * Returns true iff the caller is running on a little-endian architecture. + * + * \ingroup endianness_conversion_and_detection + */ +constexpr bool IsLittleEndianMachine() +{ + return __pcl_endian_check_sample__.b[0] == 0xef; +} + +/*! + * Returns true iff the caller is running on a big-endian architecture. + * + * \ingroup endianness_conversion_and_detection + */ +constexpr bool IsBigEndianMachine() +{ + return __pcl_endian_check_sample__.b[0] == 0xde; +} + +#endif // __clang__ + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_EndianConversions_h + +// ---------------------------------------------------------------------------- +// EOF pcl/EndianConversions.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/EphemerisFile.h b/3rdparty/include/pcl/EphemerisFile.h new file mode 100644 index 0000000..8c33149 --- /dev/null +++ b/3rdparty/include/pcl/EphemerisFile.h @@ -0,0 +1,2304 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/EphemerisFile.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_EphemerisFile_h +#define __PCL_EphemerisFile_h + +/// \file pcl/EphemerisFile.h + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ + class JSEphemerisFileObject; + class JSEphemerisHandleObject; +} +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS XMLElement; + +// ---------------------------------------------------------------------------- + +/*! + * \struct EphemerisMetadata + * \brief %Metadata items available in ephemeris files (XEPH format). + * + * This structure holds metadata items that can be stored in ephemeris files + * (current XEPH format version 1.0). For an existing ephemeris file, available + * metadata are extracted directly from %XML file headers. Currently all items + * are optional, so all data members of this structure can be empty strings. + * + * For generation of new XEPH files, the creationTime and creatorOS members of + * this structure will be ignored, since the corresponding metadata items will + * always be defined automatically by the EphemerisFile::Serialize() routine. + * The specified creatorApplication member, if empty, will be replaced in the + * same routine with a default value identifying the current PCL version. + * + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS EphemerisMetadata +{ + TimePoint creationTime; //!< The date this file was created. + String creatorOS; //!< The operating system on which this file was created. + String creatorApplication; //!< The software application or program that created this file. + String title; //!< A title that represents or identifies this XEPH file. + String briefDescription; //!< A brief (single-line) description of this XEPH file. + String description; //!< A full description of the data stored in this XEPH file. + String organizationName; //!< The name of the organization responsible for this file. + String authors; //!< The names of one or more persons or groups that have created the data in this file. + String copyright; //!< Copyright information applicable to the data stored in this XEPH file. +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct EphemerisConstant + * \brief A numerical constant defined in an ephemeris file (XEPH format). + * + * This structure implements a simple name/value pair used to store and + * manipulate numerical constants defined in ephemeris files (current XEPH + * format version 1.0). These constants are primarily intended to support JPL + * DE/LE fundamental ephemerides, where we need access to the set of numerical + * integration constants defined by JPL. + * + * Comparisons between %EphemerisConstant instances are performed on the their + * names and are case-insensitive. + * + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS EphemerisConstant +{ + IsoString name; //!< The constant name (case-insensitive). + double value; //!< The constant value. + + /*! + * Memberwise constructor. + */ + EphemerisConstant( const IsoString& n = IsoString(), double v = 0 ) + : name( n ) + , value( v ) + { + } + + /*! + * Copy constructor. + */ + EphemerisConstant( const EphemerisConstant& ) = default; + + /*! + * Move constructor. + */ + EphemerisConstant( EphemerisConstant&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + EphemerisConstant& operator =( const EphemerisConstant& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + EphemerisConstant& operator =( EphemerisConstant&& ) = default; + + /*! + * Equality operator. Returns the result of the case-insensitive equality + * operator applied to the \a name members. + */ + bool operator ==( const EphemerisConstant& x ) const + { + return name.CompareIC( x.name ) == 0; + } + + /*! + * Less-than relational operator. Returns the result of the case-insensitive + * less-than operator applied to the \a name members of this object and the + * specified instance \a x. + */ + bool operator <( const EphemerisConstant& x ) const + { + return name.CompareIC( x.name ) < 0; + } +}; + +/*! + * \class pcl::EphemerisConstantList + * \brief Dynamic list of ephemeris numerical constants. + * + * %EphemerisConstantList is used as the internal implementation of numerical + * constants associated with an %EphemerisFile instance, that is, with an + * ephemeris file in the XEPH format. %EphemerisConstantList is a template + * instantiation of Array\<\> for the EphemerisConstant class. + * + * \ingroup solar_system_ephemerides + */ +typedef Array EphemerisConstantList; + +// ---------------------------------------------------------------------------- + +/*! + * \struct SerializableEphemerisData + * \brief Chebyshev polynomial expansion coefficients for ephemeris serialization. + * + * This structure holds (possibly truncated) Chebyshev polynomial expansions + * suitable for generation of an ephemeris file in XEPH format with the + * EphemerisFile::Serialize() static member function. + * + * In an ephemeris file, the complete time span covered by the file is usually + * subdivided into many small chunks or subspans, each of them with a + * relatively short polynomial expansion. The duration of each subspan is + * defined in a way such that the movement of the object for which positions + * are being calculated within the time subspan is sufficiently smooth to be + * fitted by truncated Chebyshev polynomials with relatively few coefficients + * (typically in the range of 15 to 30 coefficients) to achieve a prescribed + * accuracy. + * + * \sa EphemerisFile::Serialize() + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS SerializableEphemerisData +{ + /*! + * Starting point of the time span covered by this Chebyshev polynomial + * expansion. + */ + TimePoint startTime; + + /*! + * Chebyshev polynomial expansion. If the coefficient series has been + * truncated, only the truncated series will be stored in the XEPH file, + * that is, truncated coefficients will be ignored. + * + * \sa ChebyshevFit::Truncate() + */ + ChebyshevFit expansion; + + /*! + * Memberwise constructor. + */ + SerializableEphemerisData( TimePoint t, const ChebyshevFit& T ) + : startTime( t ) + , expansion( T ) + { + } + + /*! + * Copy constructor. + */ + SerializableEphemerisData( const SerializableEphemerisData& ) = default; + + /*! + * Move constructor. + */ + SerializableEphemerisData( SerializableEphemerisData&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SerializableEphemerisData& operator =( const SerializableEphemerisData& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SerializableEphemerisData& operator =( SerializableEphemerisData&& ) = default; +}; + +/*! + * \class pcl::SerializableEphemerisDataList + * \brief Dynamic list of Chebyshev polynomial expansions for ephemeris serialization. + * + * %SerializableEphemerisDataList is a dynamic list of + * SerializableEphemerisData instances to cover the entire time span of an + * ephemeris file being serialized. Each instance in the list must cover a time + * subspan in ascending time order without gaps. The value of the \a startTime + * member of the first instance in the list must be equal to the lower bound of + * the time span covered by the file, and the \a startTime member of each + * subsequent instance in the list is equal to the upper bound of the subspan + * covered by the previous instance. These conditions are enforced by the + * EphemerisFile::Serialize() static member function, which is the standard + * resource for generation of ephemeris files in XEPH format. + * + * \ingroup solar_system_ephemerides + */ +typedef Array SerializableEphemerisDataList; + +// ---------------------------------------------------------------------------- + +/*! + * \struct SerializableEphemerisObjectData + * \brief A set of Chebyshev polynomial expansions and associated ancillary + * data for ephemeris serialization. + * + * This structure associates a unique pair of object and origin identifiers, an + * optional object name, an optional descriptive text, and one or two ordered + * sequences of Chebyshev polynomial expansions for calculation of ephemerides + * within a prescribed time span. These data are suitable for generation of an + * ephemeris file in XEPH format with the EphemerisFile::Serialize() static + * member function. + * + * The first sequence of Chebyshev polynomial expansions is mandatory for + * calculation of ephemeris function values (typically, the components of a + * position vector as a function of time). An additional sequence of expansions + * for the first derivative (typically, the components of a velocity vector) is + * optional. Derivative expansions should be used when the velocity of an + * object is known very accurately upon ephemeris generation, and this high + * accuracy must be preserved. + * + * All ephemeris data stored in XEPH files must be referred to the + * International Celestial Reference System (ICRS/J2000.0). + * + * \sa EphemerisFile::Serialize() + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS SerializableEphemerisObjectData +{ + /*! + * Unique identifier of the object or item for which ephemeris data have + * been generated. This should be a short string to uniquely identify the + * object in the context of the ephemeris file being serialized. For + * example, standard XEPH files serializing JPL DE/LE ephemerides use a + * two/three letter convention for object identifiers: 'Me', 'Ve', 'EMB', + * 'Ea', 'Ma', etc, respectively for Mercury, Venus, Earth-Moon barycenter, + * Earth, Mars, etc. Object identifiers are considered as case-sensitive in + * XEPH files. + */ + IsoString objectId; + + /*! + * Identifier of the origin of coordinates (case-sensitive). This can be the + * unique identifier of a solar system object, or the identifier of an + * arbitrary object or location, which will be treated as + * implementation-specific, that is, specific to the data being serialized + * and to the procedures employed to generate them. + * + * For example, if the ephemeris data being serialized are geocentric, this + * member should be "Ea", which is the unique identifier of the Earth's + * center in standard fundamental ephemerides files. Similarly, if the + * ephemerides are heliocentric, this member should be "Sn". If the + * ephemeris data are with respect to the solar system barycenter, this + * member must be "SSB", also for coherence with fundamental ephemerides. + */ + IsoString originId; + + /*! + * Optional Name of the object or item for which ephemeris data have been + * generated. This can be an arbitrary string, such as 'Saturn', 'Iris', or + * 'C/1996 B2'. However, bear in mind that ephemeris data can be accessed + * both by object identifiers and object names, so there should be no + * duplicate names. Object names are considered as case-insensitive in XEPH + * files, so all of 'Jupiter', 'jupiter' and 'JUPITER' are equivalent. + */ + String objectName; + + /*! + * Optional information about the object and/or the ephemeris data being + * serialized. + */ + String description; + + /*! + * Two dynamic lists of Chebyshev polynomial expansions. The first list is + * mandatory for approximation of function values (typically, the components + * of a position vector). The second list is optional for approximation of + * first derivatives (typically, the components of a velocity vector). Both + * sequences must cover the entire ephemeris time span with arbitrary + * subspans in ascending time order without any gaps. + */ + SerializableEphemerisDataList data[ 2 ]; + + /* + * Absolute magnitude. H is the visual magnitude of the object as seen at 1 + * au of the Earth, 1 au from the Sun, and with a phase angle of 0 degrees. + * + * References + * + * E. Bowell et al., Asteroids II, R. P. Binzel et al. (eds.), The + * University of Arizona Press, Tucson, 1989, pp. 549-554. + * + * Urban, Sean E., Kenneth Seidelmann, P., ed. (2013), The Explanatory + * Supplement to the Astronomical Almanac 3rd Edition, Section 10.4.3. + */ + Optional H; + + /* + * Slope parameter. See the H data member for references. + */ + Optional G; + + /* + * Color index B-V in magnitudes. + */ + Optional B_V; + + /* + * Diameter of the object in km. + */ + Optional D; + + /*! + * Memberwise constructor. + */ + SerializableEphemerisObjectData( const IsoString& id, + const IsoString& origin, + const String& name = String(), + const String& desc = String() ) + : objectId( id.Trimmed() ) + , originId( origin.Trimmed() ) + , objectName( name.Trimmed() ) + , description( desc ) + { + } + + /*! + * Copy constructor. + */ + SerializableEphemerisObjectData( const SerializableEphemerisObjectData& ) = default; + + /*! + * Move constructor. + */ + SerializableEphemerisObjectData( SerializableEphemerisObjectData&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SerializableEphemerisObjectData& operator =( const SerializableEphemerisObjectData& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SerializableEphemerisObjectData& operator =( SerializableEphemerisObjectData&& ) = default; +}; + +/*! + * \class pcl::SerializableEphemerisObjectDataList + * \brief Dynamic list of per-object data for ephemeris serialization. + * \ingroup solar_system_ephemerides + */ +typedef Array SerializableEphemerisObjectDataList; + +// ---------------------------------------------------------------------------- + +/*! + * \struct EphemerisObject + * \brief Identifiers and descriptive data of an object available in an + * ephemeris file. + * + * This structure associates the unique identifier, origin identifier, name and + * description of an object or item available for ephemeris calculations. All + * of the data members in this structure are specific to a particular ephemeris + * file. A dynamic list of %EphemerisObject instances (EphemerisObjectList) is + * returned by the EphemerisFile::Objects() member function. + * + * \sa EphemerisFile::Objects() + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS EphemerisObject +{ + /*! + * Unique identifier of an object or item for which ephemeris data are + * available. This is a short string that uniquely identifies the object in + * the context of an ephemeris file. + * + * For example, standard XEPH files serializing JPL DE/LE ephemerides use a + * two/three letter convention for object identifiers: 'Me', 'Ve', 'EMB', + * 'Ea', 'Ma', etc, respectively for Mercury, Venus, Earth-Moon barycenter, + * Earth, Mars, etc. Object identifiers are considered as case-sensitive in + * XEPH files. + */ + IsoString objectId; + + /*! + * Identifier of the origin of coordinates (case-sensitive). This can be the + * unique identifier of a solar system object, or the identifier of an + * arbitrary object or location, specific to a particular ephemeris file. + * + * For example, if the object provides geocentric coordinates, this member + * should be "Ea", which is the unique identifier of the Earth's center in + * standard fundamental ephemerides files. Similarly, if the ephemerides are + * heliocentric, this member should be "Sn". If the ephemeris data are with + * respect to the solar system barycenter, this member must be "SSB", also + * for coherence with fundamental ephemerides. + */ + IsoString originId; + + /*! + * Optional Name of the object or item for which ephemeris data are + * available. This can be an arbitrary string, such as 'Saturn', 'Iris', or + * 'C/1996 B2'. Object names are considered as case-insensitive in XEPH + * files, so all of 'Jupiter', 'jupiter' and 'JUPITER' are equivalent. + */ + String objectName; + + /*! + * Optional information about the object and/or the ephemeris data. + */ + String objectDescription; + + /*! + * Absolute magnitude. H is the visual magnitude of the object as seen at 1 + * au of the Earth, 1 au from the Sun, and with a phase angle of 0 degrees. + * + * References + * + * E. Bowell et al., Asteroids II, R. P. Binzel et al. (eds.), The + * University of Arizona Press, Tucson, 1989, pp. 549-554. + * + * Urban, Sean E., Kenneth Seidelmann, P., ed. (2013), The Explanatory + * Supplement to the Astronomical Almanac 3rd Edition, Section 10.4.3. + */ + Optional H; + + /*! + * Slope parameter. See the H data member for references. + */ + Optional G; + + /*! + * Color index B-V in magnitudes. + */ + Optional B_V; + + /*! + * Diameter of the object in km. + */ + Optional D; + + /*! + * Memberwise constructor. + */ + EphemerisObject( const IsoString& objectId_, + const IsoString& originId_, + const String& objectName_ = String(), + const String& objectDescription_ = String(), + Optional H_ = Optional(), + Optional G_ = Optional(), + Optional B_V_ = Optional(), + Optional D_ = Optional() ) + : objectId( objectId_ ) + , originId( originId_ ) + , objectName( objectName_ ) + , objectDescription( objectDescription_ ) + , H( H_ ) + , G( G_ ) + , B_V( B_V_ ) + , D( D_ ) + { + } + + /*! + * Copy constructor. + */ + EphemerisObject( const EphemerisObject& ) = default; + + /*! + * Move constructor. + */ + EphemerisObject( EphemerisObject&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + EphemerisObject& operator =( const EphemerisObject& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + EphemerisObject& operator =( EphemerisObject&& ) = default; +}; + +/*! + * \class pcl::EphemerisObjectList + * \brief Dynamic list of object identifiers and descriptions. + * \ingroup solar_system_ephemerides + */ +typedef Array EphemerisObjectList; + +// ---------------------------------------------------------------------------- + +/*! + * \class EphemerisFile + * \brief Solar system ephemerides from XEPH files. + * + * This class implements ephemerides of solar system bodies computed from data + * stored in XEPH (Extensible Ephemeris Data format) files. It also implements + * serialization of ephemeris data in the XEPH file format. + * + * On the PixInsight/PCL platform, the XEPH file format allows for efficient + * ephemeris calculations through Chebyshev polynomial expansions stored as raw + * binary data. An XEPH file stores multiple arrays of Chebyshev coefficient + * series accessible by means of fast indexed file search algorithms and + * structures, along with auxiliary data and metadata required for ephemeris + * calculations. + * + * Calculation of state vectors (such as position and velocity vectors) for + * specific objects is performed through a dedicated client subclass, namely + * EphemerisFile::Handle. This class implements transparent file seek and read + * operations, as well as fast, lock-free multithreaded evaluation of Chebyshev + * polynomials. + * + * XEPH ephemeris files allow for calculation of rectangular coordinates + * referred to the axes of the International Celestial Reference System + * (ICRS/J2000.0). Positions are given in au and velocities in au/day for all + * solar system objects, except planetocentric coordinates of natural + * satellites, including the geocentric Moon, for which positions and + * velocities are given in kilometers and km/day, respectively. Angles + * (nutations and librations) are given in radians, and time differences (such + * as TT-TDB) in seconds. + * + * An XEPH file storing up-to-date JPL DE/LE ephemeris data is part of all + * standard PixInsight distributions since 1.8.5 versions released Fall 2018. + * As of writing this documentation, the standard XEPH file provides the + * complete JPL DE440/LE440 ephemerides. See the + * EphemerisFile::FundamentalEphemerides() static member function for detailed + * information. + * + * \ingroup solar_system_ephemerides + */ +class PCL_CLASS EphemerisFile +{ +public: + + /*! + * Default constructor. + * + * Constructs an invalid instance that cannot be used until initialized by + * calling the Open() member function. + */ + EphemerisFile() = default; + + /*! + * Constructs an &EphemerisFile instance initialized from the specified + * ephemeris data file in XEPH format. + * + * In the event of errors or invalid data, this constructor will throw the + * appropriate Error exception. + */ + EphemerisFile( const String& filePath ) + { + Open( filePath ); + } + + /*! + * Move constructor. + */ + EphemerisFile( EphemerisFile&& x ) + : m_file( std::move( x.m_file ) ) + , m_startTime( x.m_startTime ) + , m_endTime( x.m_endTime ) + , m_constants( std::move( x.m_constants ) ) + , m_index( std::move( x.m_index ) ) + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + EphemerisFile& operator =( EphemerisFile&& x ) + { + m_file = std::move( x.m_file ); + m_startTime = x.m_startTime; + m_endTime = x.m_endTime; + m_constants = std::move( x.m_constants ); + m_index = std::move( x.m_index ); + return *this; + } + + /*! + * Deleted copy constructor. %EphemerisFile instances are unique, hence + * cannot be copied. + */ + EphemerisFile( const EphemerisFile& ) = delete; + + /*! + * Deleted copy assignment operator. %EphemerisFile instances are unique, + * hence cannot be copied. + */ + EphemerisFile& operator =( const EphemerisFile& ) = delete; + + /*! + * Virtual destructor. + */ + virtual ~EphemerisFile() noexcept( false ); + + /*! + * Initializes this object to give access to the specified ephemeris data + * file in XEPH format. + * + * This member function opens an existing file at the specified \a filePath, + * loads and parses its XML header, and loads the file indexes ready for + * fast access to ephemeris data. The file will remain open until this + * object is destroyed, or until a new call to this function is made. + * + * If a previous file was already opened by this instance, it will be closed + * and all associated control and file indexing structures will be destroyed + * and deallocated, before accessing the new file. + * + * \warning If this object has active ephemeris calculation handles, no + * action will be taken and an Error exception will be thrown. See + * EphemerisFile::Handle and NumberOfHandles(). + */ + void Open( const String& filePath ); + + /*! + * Closes the ephemeris file represented by this object and resets all + * internal structures to a default, uninitialized state. + * + * If a previous file was already opened by this instance, it will be closed + * and all associated control and file indexing structures will be destroyed + * and deallocated. If no file is currently open, calling this member has no + * effect. + * + * \warning If this object has active ephemeris calculation handles, no + * action will be taken and an Error exception will be thrown. See + * EphemerisFile::Handle and NumberOfHandles(). + */ + void Close(); + + /*! + * Returns true iff this object has an open ephemeris file and is ready for + * ephemeris data retrieval. + */ + bool IsOpen() const + { + return m_file.IsOpen(); + } + + /*! + * Returns the path of the ephemeris file represented by this object. + * Returned file paths are always absolute, full file paths. + */ + const String& FilePath() const + { + return m_file.FilePath(); + } + + /*! + * Starting point of the time span covered by this ephemeris, or the + * earliest time point for which ephemerides can be calculated using this + * object. + */ + TimePoint StartTime() const + { + return m_startTime; + } + + /*! + * Ending point of the time span covered by this ephemeris, or the latest + * time point for which ephemerides can be calculated using this object. + */ + TimePoint EndTime() const + { + return m_endTime; + } + + /*! + * Returns a reference to the dynamic list of constants stored in the + * ephemeris data file represented by this object. These constants are + * name/value pairs, where keys are 8-bit strings and values are double + * precision floating point numbers. + * + * Typically, for XEPH files that store fundamental JPL DE/LE ephemerides + * this member function returns the list of constants used by the + * corresponding DE/LE numerical integration. + * + * The returned list is sorted by constant name in ascending order. + */ + const EphemerisConstantList& Constants() const + { + return m_constants; + } + + /*! + * Returns true iff this instance knows a numerical constant with the + * specified \a name. + */ + bool IsConstantAvailable( const IsoString& name ) const + { + return BinarySearch( m_constants.Begin(), m_constants.End(), + EphemerisConstant( name ) ) != m_constants.End(); + } + + /*! + * Returns the value of an ephemeris constant given by its \a name. + * + * If no constant is available with the specified \a name + * (case-insensitive) in the XEPH file represented by this object, this + * function throws an Error exception. + */ + double ConstantValue( const IsoString& name ) const + { + EphemerisConstantList::const_iterator i = + BinarySearch( m_constants.Begin(), m_constants.End(), EphemerisConstant( name ) ); + if ( i == m_constants.End() ) + throw Error( "Undefined ephemeris constant '" + name + '\'' ); + return i->value; + } + + /*! + * Returns a dynamic list of EphemerisObject instances describing all of the + * objects available in this file for ephemeris calculations. + * + * The returned list is sorted by object and origin identifiers (in that + * order of precedence) in ascending order. + */ + EphemerisObjectList Objects() const + { + EphemerisObjectList objects; + for ( const Index& ix : m_index ) + objects << EphemerisObject( ix.objectId, ix.originId, + ix.objectName, ix.objectDescription, + ix.H, ix.G, ix.B_V, ix.D ); + return objects; + } + + /*! + * Returns true iff this instance contains ephemeris data for the specified + * \a object, given by its identifier or name, with respect to the specified + * \a origin. + * + * The specified \a object string can be either an object identifier + * (case-sensitive), or an object name (case-insensitive) encoded as UTF-8. + * For example, all of 'Ju', 'Jupiter', 'jupiter' and 'JUPITER' refer to + * Jupiter in a standard XEPH file storing fundamental JPL DE/LE + * ephemerides. In this example, 'Ju' is a case-sensitive object identifier, + * thus 'ju' and 'JU' are not valid and this function would return false for + * both of them. + * + * \a origin is the identifier of an origin of coordinates. If an empty + * string is specified (which is the default parameter value), this function + * will return true if the file contains any ephemeris data for the + * specified \a object, irrespective of the origin. Otherwise an exact match + * of the \a origin identifier will be required. + * + * See the FundamentalEphemerides() static member function for information + * about the objects supported by standard XEPH files storing fundamental + * ephemerides. + */ + bool IsObjectAvailable( const IsoString& object, const IsoString& origin = IsoString() ) const + { + Array::const_iterator i = BinarySearch( m_index.Begin(), m_index.End(), Index( object, origin ) ); + if ( i != m_index.End() ) + return true; + String name = object.UTF8ToUTF16(); + for ( const Index& index : m_index ) + if ( index.objectName.CompareIC( name ) == 0 ) + if ( origin.IsEmpty() || index.originId == origin ) + return true; + return false; + } + + /*! + * Returns the name of the specified \a object, with respect to the + * specified \a origin. + * + * Both \a object and \a origin must be object identifiers. If \a origin is + * an empty string (which is the default parameter value), this function + * will return the name of the first object found with the specified + * identifier, irrespective of the origin. Otherwise an exact match of the + * \a origin identifier will be required. + * + * If no object with the required conditions is available in this ephemeris + * file, this function returns an empty string. + */ + String ObjectName( const IsoString& object, const IsoString& origin = IsoString() ) const + { + Array::const_iterator i = BinarySearch( m_index.Begin(), m_index.End(), Index( object, origin ) ); + if ( i != m_index.End() ) + return i->objectName; + return String(); + } + + /*! + * Returns a reference to the (immutable) metadata items available in the + * ephemeris data file loaded by this object. + */ + const EphemerisMetadata& Metadata() const + { + return m_metadata; + } + + /*! + * Returns the number of handles currently active for this ephemeris file. + * + * If an %EphemerisFile object has active handles, also known as \e child + * \e handles, destroying it will most likely lead to a crash, since any + * activity performed by a child handle will make reference to a nonexistent + * parent object. + * + * This function is thread-safe. + * + * \sa pcl::EphemerisFile::Handle + */ + int NumberOfHandles() const + { + return m_handleCount.Load(); + } + + /*! + * Generates a file to store solar system ephemeris data in XEPH format. + * + * \param filePath Path to the file that will be generated in the local + * filesystem. The file name should carry the '.xeph' + * suffix. + * + * \param startTime Lower bound of the entire time span for which the + * ephemeris data being serialized is valid. + * + * \param endTime Upper bound of the entire time span for which the + * ephemeris data being serialized is valid. + * + * \param data Reference to an array of per-object ephemeris data, + * including Chebyshev polynomial expansions for the + * ephemeris function (such as position) and, + * optionally, for its first derivative (such as + * velocity), as well as object identifiers and object + * names. + * + * \param metadata Reference to an EphemerisMetadata structure with + * optional metadata information that will be included + * in the generated XEPH file. + * + * \param constants Reference to an array of name/value pairs used to + * represent a set of numerical constants relevant to + * the ephemerides being serialized If an empty array + * is specified (as the default parameter value), no + * numerical constant will be included in the generated + * XEPH file. + * + * The entire time span covered by an ephemeris file, from \a startTime to + * \a endTime, is usually subdivided into many small chunks or subspans, + * each of them with a relatively short polynomial expansion. The duration + * of each subspan is defined in a way such that the motion of the object + * for which positions are being calculated is sufficiently smooth to be + * fitted within the time subspan by truncated Chebyshev polynomials with + * relatively few coefficients (typically in the range of 15 to 30 + * coefficients) to achieve a prescribed accuracy. The faster and more + * perturbed the object's motion is, the more and shorter subspans are + * necessary to fit an accurate representation of the object's orbit. + * + * In the event of invalid, incongruent or malformed data, or if an I/O + * error occurs, this function will throw an Error exception. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void Serialize( const String& filePath, + TimePoint startTime, TimePoint endTime, + const SerializableEphemerisObjectDataList& data, + const EphemerisMetadata& metadata = EphemerisMetadata(), + const EphemerisConstantList& constants = EphemerisConstantList() ); + + /*! + * Returns a reference to the global fundamental ephemerides file currently + * defined by the running PixInsight platform. + * + * Under normal running conditions, the returned object provides ephemeris + * data for at least the following objects: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IdentifierName
MeMercury
VeVenus
EMBEarth-Moon barycenter
MaMars' barycenter
JuJupiter's barycenter
SaSaturn's barycenter
UrUranus' barycenter
NeNeptune's barycenter
PlPluto's barycenter
MnMoon's geometric center with respect to Earth's center.
SnSun's geometric center
EaEarth's geometric center
+ * + * With the only exception of the Moon ("Mn" identifier), ephemeris data for + * all of the objects above are provided relative to the solar system + * barycenter ("SSB" identifier). + * + * Additional items may also be available, depending on specific file + * versions and compilations: + * + * + * + * + * + * + *
IdentifierName
LbrLunar librations (Euler angles) in radians
NutNutation angles in radians
TT_TDBTT-TDB difference at the geocenter in seconds.
+ * + * As of writing this documentation, the standard fundamental ephemeris file + * provides the complete JPL's DE440/LE440 ephemerides, but nutations, + * librations and time differences are not included. + * + * The fundamental ephemeris file can be overridden by the caller module. + * See the OverrideFundamentalEphemerides() member function for more + * information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& FundamentalEphemerides(); + + /*! + * Returns a reference to the global short-term fundamental ephemerides file + * currently defined by the running PixInsight platform. + * + * See the FundamentalEphemerides() static member function for information + * on fundamental ephemerides and their status in current versions of + * PixInsight. + * + * Under normal running conditions, the returned object should be a + * shortened version (that is, covering a shorter time span) of the standard + * fundamental ephemerides file. As of writing this documentation, the + * standard short-term fundamental ephemeris file provides DE440/LE440 + * ephemerides for the period from 1850 January 1.0 to 2150 December 32.0. + * + * The short-term fundamental ephemeris file can be overridden by the caller + * module. See the OverrideShortTermFundamentalEphemerides() member function + * for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& ShortTermFundamentalEphemerides(); + + /*! + * Returns a reference to the global asteroid ephemerides file currently + * defined by the running PixInsight platform. + * + * Under normal running conditions, the returned object provides ephemeris + * data for a set of asteroids with relevant masses. In a standard asteroid + * ephemeris file, object identifiers are asteroid numbers and object names + * are asteroid designations; for example: + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IdentifierName
1Ceres
2Pallas
3Juno
4Vesta
5Astraea
......
702Alauda
703Noemi
704Interamnia
......
+ * + * Asteroid ephemeris data are provided relative to the solar system + * barycenter ("SSB" identifier), with position and velocity coordinates + * coherent with global fundamental ephemerides. + * + * As of writing this documentation, the standard asteroid ephemeris file + * provides the complete set of 343 asteroids used for the numerical + * integration of DE430 ephemerides, with barycentric coordinates coherent + * with DE440. + * + * The asteroid ephemeris file can be overridden by the caller module. See + * the OverrideAsteroidEphemerides() member function for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& AsteroidEphemerides(); + + /*! + * Returns a reference to the global short-term asteroid ephemerides file + * currently defined by the running PixInsight platform. + * + * See the AsteroidEphemerides() static member function for information + * on asteroid ephemerides and their status in current versions of + * PixInsight. + * + * Under normal running conditions, the returned object should be a + * shortened version (that is, covering a shorter time span) of the standard + * asteroid ephemerides file. As of writing this documentation, the + * standard short-term asteroid ephemeris file covers the period from 1950 + * January 1.0 to 2100 January 32.0. + * + * The short-term asteroid ephemeris file can be overridden by the caller + * module. See the OverrideShortTermAsteroidEphemerides() member function + * for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& ShortTermAsteroidEphemerides(); + + /*! + * Returns a reference to the global Kuiper belt objects (KBOs) ephemerides + * file currently defined by the running PixInsight platform. + * + * As of writing this documentation (March 2021), the default KBO + * ephemerides file includes the set of 30 most massive known + * trans-Neptunian objects used in JPL's DE440 numerical integration: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IdentifierName
19521Chaos
20000Varuna
28978Ixion
423012001 UR163
50000Quaoar
555652002 AW197
556372002 UX25
845222002 TC302
90377Sedna
90482Orcus
905682004 GV9
120347Salacia
136108Haumea
136199Eris
136472Makemake
1454522005 RN43
174567Varda
2089962003 AZ84
225088Gonggong
2309652004 XA192
2783612007 JJ43
3072612002 MS4
4555022003 UZ413
5236392010 RE64
5283812008 ST291
2004 XR190
2006 QH181
2010 FX86
2010 KZ39
2010 RF43
+ * + * KBO ephemeris data are provided relative to the solar system barycenter + * ("SSB" identifier), with position and velocity coordinates coherent with + * global fundamental ephemerides. These ephemerides have been generated by + * numerical integration with starting state vectors provided by official + * NASA/JPL asteroid databases. + * + * The KBO ephemeris file can be overridden by the caller module. See the + * OverrideKBOEphemerides() member function for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& KBOEphemerides(); + + /*! + * Returns a reference to the global short-term Kuiper belt objects (KBOs) + * ephemerides file currently defined by the running PixInsight platform. + * + * See the KBOEphemerides() static member function for information on + * asteroid ephemerides and their status in current versions of PixInsight. + * + * Under normal running conditions, the returned object should be a + * shortened version (that is, covering a shorter time span) of the standard + * KBO ephemerides file. As of writing this documentation, the standard + * short-term asteroid ephemeris file covers the period from 1950 January + * 1.0 to 2100 January 32.0. + * + * The short-term KBO ephemeris file can be overridden by the caller module. + * See the OverrideShortTermKBOEphemerides() member function for more + * information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& ShortTermKBOEphemerides(); + + /*! + * Returns a reference to the global nutation model ephemeris file currently + * defined by the running PixInsight platform. + * + * Under normal running conditions, the returned object provides Chebyshev + * polynomial expansions for the current IAU nutation model. As of writing + * this documentation, the standard nutation model file provides the IAU + * 2006/2000A_R nutation model (MHB2000 luni-solar and planetary nutation + * with adjustments to match the IAU 2006 precession). + * + * The returned object should provide at least one object with the "IAUNut" + * identifier, which can be used to approximate the implemented nutation + * theory with a child EphemerisFile::Handle object. + * + * The nutation model ephemeris file can be overridden by the caller module. + * See the OverrideNutationModel() member function for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& NutationModel(); + + /*! + * Returns a reference to the global short-term nutation model ephemeris + * file currently defined by the running PixInsight platform. + * + * See the NutationModel() static member function for information on + * nutation model ephemerides and their status in current versions of + * PixInsight. + * + * Under normal running conditions, the returned object should be a + * shortened version (that is, covering a shorter time span) of the standard + * nutation model ephemerides file. As of writing this documentation, the + * standard short-term nutation model file provides the IAU 2006/2000A_R + * nutation model for the period from 1850 January 1.0 to 2150 December + * 32.0. + * + * The returned object should provide at least one object with the "IAUNut" + * identifier, which can be used to approximate the implemented nutation + * theory with a child EphemerisFile::Handle object. + * + * The short-term nutation model ephemeris file can be overridden by the + * caller module. See the OverrideShortTermNutationModel() member function + * for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + */ + static const EphemerisFile& ShortTermNutationModel(); + + /*! + * Returns the path to the global database file of observed Delta T values. + * + * Delta T is the difference TT-UT1 in seconds. In current versions of + * PixInsight the Delta T database is a plain text file generated with values + * taken from the following online references: + * + * For the period 1657-1973.0:\n + * http://maia.usno.navy.mil/ser7/historic_deltat.data + * + * For the period 1973 Feb 1 to the beginning of the current year:\n + * http://maia.usno.navy.mil/ser7/deltat.data + * + * For predicted Delta T values until 2025 approximately (as of writing this + * documentation, October 2018):\n + * http://maia.usno.navy.mil/ser7/deltat.preds + * + * Delta T data files are expected to follow a simple format where each text + * line provides a TT/DeltaT pair. The exact format is described at the top + * of the corresponding file included in the current PixInsight + * distribution. + * + * Outside of the period from 1657 to the current year, the current + * PixInsight/PCL implementation uses polynomial expressions taken from + * Five Millennium Canon of Solar Eclipses, by Fred Espenak and + * Jean Meeus (NASA/TP–2006–214141, Revision 1.0, 2007). + * + * The Delta T database file can be overridden by the caller module. See the + * OverrideDeltaTDataFilePath() member function for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + * + * \sa TimePoint::DeltaT() + */ + static String DeltaTDataFilePath(); + + /*! + * Returns the path to the global database file of Delta AT values. + * + * Delta AT is the difference TAI-UTC in seconds. In current versions of + * PixInsight the Delta AT database is a plain text file generated with + * values taken from the following online reference: + * + * http://maia.usno.navy.mil/ser7/tai-utc.dat + * + * Delta AT data files are expected to follow a simple format where each + * text line provides a UTC/DeltaAT pair. The exact format is described at + * the top of the corresponding file included in the current PixInsight + * distribution. + * + * The Delta AT database file can be overridden by the caller module. See + * the OverrideDeltaATDataFilePath() member function for more information. + * + * This static member function is thread-safe. It can be called safely from + * multiple execution threads running concurrently. + * + * \sa TimePoint::DeltaAT() + */ + static String DeltaATDataFilePath(); + + /*! + * Returns the path to the global database file of CIP positions referred to + * the ITRS. + * + * The position of the Celestial Intermediate Pole (CIP) in the + * International Terrestrial Reference System (ITRS) is necessary to compute + * polar motion corrections applied to topocentric coordinates of solar + * system bodies. These corrections are relevant for the topocentric + * position of the Moon at the milliarcsecond level. + * + * In current versions of PixInsight the CIP_ITRS database is a plain text + * file generated with values provided by the IERS Rapid Service/Prediction + * Center. As of writing this documentation, the main online reference is: + * + * http://hpiers.obspm.fr/iers/eop/eopc01/eopc01.iau2000.1846-now + */ + static String CIP_ITRSDataFilePath(); + + /*! + * Override the default fundamental ephemerides file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide fundamental solar system ephemerides. See + * the FundamentalEphemerides() member function for a comprehensive + * description. + * + * After calling this member function, all fundamental ephemerides will be + * calculated using the specified XEPH file, which will be installed + * automatically upon the first call to FundamentalEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideFundamentalEphemerides( const String& filePath ); + + /*! + * Override the default short-term fundamental ephemerides file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide fundamental solar system ephemerides. See + * the FundamentalEphemerides() member function for a comprehensive + * description. + * + * After calling this member function, all short-term fundamental + * ephemerides will be calculated using the specified XEPH file, which will + * be installed automatically upon the first call to + * ShortTermFundamentalEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideShortTermFundamentalEphemerides( const String& filePath ); + + /*! + * Override the default asteroid ephemerides file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide asteroid ephemerides coherent with the + * global fundamental ephemerides being used. See the AsteroidEphemerides() + * member function for a more comprehensive description. + * + * After calling this member function, all asteroid ephemerides will be + * calculated using the specified XEPH file, which will be installed + * automatically upon the first call to AsteroidEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideAsteroidEphemerides( const String& filePath ); + + /*! + * Override the default short-term asteroid ephemerides file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide asteroid ephemerides coherent with the + * global fundamental ephemerides being used. See the AsteroidEphemerides() + * member function for a more comprehensive description. + * + * After calling this member function, all short-term asteroid ephemerides + * will be calculated using the specified XEPH file, which will be installed + * automatically upon the first call to ShortTermAsteroidEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideShortTermAsteroidEphemerides( const String& filePath ); + + /*! + * Override the default Kuiper belt objects (KBOs) ephemerides file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide KBO ephemerides coherent with the global + * fundamental ephemerides being used. See the KBOEphemerides() member + * function for a more comprehensive description. + * + * After calling this member function, all KBO ephemerides will be + * calculated using the specified XEPH file, which will be installed + * automatically upon the first call to KBOEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideKBOEphemerides( const String& filePath ); + + /*! + * Override the default short-term Kuiper belt objects (KBOs) ephemerides + * file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide KBO ephemerides coherent with the global + * fundamental ephemerides being used. See the KBOEphemerides() member + * function for a more comprehensive description. + * + * After calling this member function, short-term KBO ephemerides will be + * calculated using the specified XEPH file, which will be installed + * automatically upon the first call to ShortTermKBOEphemerides(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideShortTermKBOEphemerides( const String& filePath ); + + /*! + * Override the global nutation model ephemeris file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide estimates of nutation angles compliant + * with the current IAU nutation model. See the NutationModel() member + * function for more details. + * + * After calling this member function, the nutation model used for ephemeris + * calculations will be provided by the specified XEPH file, which will + * be installed automatically upon the first call to NutationModel(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideNutationModel( const String& filePath ); + + /*! + * Override the global short-term nutation model ephemeris file. + * + * The specified \a filePath must be a valid path to an existing file in + * XEPH format, which must provide estimates of nutation angles compliant + * with the current IAU nutation model. See the NutationModel() member + * function for more details. + * + * After calling this member function, the nutation model used for + * short-term ephemeris calculations will be provided by the specified XEPH + * file, which will be installed automatically upon the first call to + * ShortTermNutationModel(). + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideShortTermNutationModel( const String& filePath ); + + /*! + * Override the global Delta T database. + * + * The specified \a filePath must be a valid path to an existing file in a + * plain text database format compatible with the standard Delta T database + * included in PixInsight distributions. See the DeltaTDataFilePath() member + * function for more details. + * + * After calling this member function, Delta T values will be calculated by + * interpolation from the data provided by the specified file, which will be + * loaded and parsed automatically upon the first call (explicit or + * implicit) to TimePoint::DeltaT(). However, for performance and + * modularization reasons, once a Delta T database has been loaded there is + * no way to change it, so calling this function again will have no effect. + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideDeltaTDataFilePath( const String& filePath ); + + /*! + * Override the global Delta AT database. + * + * The specified \a filePath must be a valid path to an existing file in a + * plain text database format compatible with the standard Delta AT database + * included in PixInsight distributions. See the DeltaATDataFilePath() + * member function for more details. + * + * After calling this member function, Delta AT values will be calculated by + * interpolation from the data provided by the specified file, which will be + * loaded and parsed automatically upon the first call (explicit or + * implicit) to TimePoint::DeltaAT(). However, for performance and + * modularization reasons, once a Delta AT database has been loaded there is + * no way to change it, so calling this function again will have no effect. + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideDeltaATDataFilePath( const String& filePath ); + + /*! + * Override the global database of CIP positions in the ITRS. + * + * The specified \a filePath must be a valid path to an existing file in a + * plain text database format compatible with the standard CIP_ITRS database + * included in PixInsight distributions. See the CIP_ITRSDataFilePath() + * member function for more details. + * + * After calling this member function, CIP coordinates in the ITRS will be + * calculated by interpolation from the data provided by the specified file, + * which will be loaded and parsed automatically upon the first call + * (explicit or implicit) to Position::CIP_ITRS(). However, for performance + * and modularization reasons, once a CIP_ITRS database has been loaded + * there is no way to change it, so calling this function again will have no + * effect. + * + * This function is useful to build standalone applications that don't + * depend on a running PixInsight core application, which is necessary to + * retrieve the default file names and directories from global settings. + */ + static void OverrideCIP_ITRSDataFilePath( const String& filePath ); + +private: + + /*! + * \internal + * Expansion index node structure. + */ + struct IndexNode + { + int32 jdi = 0; // Starting point of time span covered by this expansion, int( JD ). + float jdf = 0; // Ditto, frac( JD ). + uint8 n[ 4 ] = {}; // For each component: number of Chebyshev coefficients in this expansion. + int64 position = 0; // File byte position of first Chebyshev coefficient. + + constexpr bool operator ==( const IndexNode& n ) const + { + return jdi == n.jdi && jdf == n.jdf; + } + + constexpr bool operator <( const IndexNode& n ) const + { + return jdi < n.jdi || jdi == n.jdi && jdf < n.jdf; + } + + constexpr int NumberOfComponents() const + { + return (n[0] > 0) ? ((n[1] > 0) ? ((n[2] > 0) ? ((n[3] > 0) ? 4 : 3) : 2) : 1) : 0; + } + + constexpr int NumberOfCoefficients() const + { + return n[0] + n[1] + n[2] + n[3]; + } + + TimePoint StartTime() const + { + return TimePoint( jdi, jdf ); + } + }; + + /*! + * \internal + * Expansion index structure. + */ + struct Index + { + IsoString objectId; // Object identifier (mandatory, case-sensitive). + IsoString originId; // Identifier of the origin of coordinates (mandatory, case-sensitive). + String objectName; // Object name (optional, case-insensitive). + String objectDescription; // Object description (optional, arbitrary) + Optional H; // Absolute magnitude. + Optional G; // Slope parameter. + Optional B_V; // Color index B-V in magnitudes. + Optional D; // Diameter of the object in km. + Array nodes[ 2 ]; // Expansion indexes: 0=function 1=derivative. + + Index( const IsoString& objectId_, + const IsoString& originId_ = IsoString(), + const String& objectName_ = String(), + const String& objectDescription_ = String() ) + : objectId( objectId_.Trimmed() ) + , originId( originId_.Trimmed() ) + , objectName( objectName_.Trimmed() ) + , objectDescription( objectDescription_.Trimmed() ) + { + } + + bool operator ==( const Index& x ) const + { + return objectId == x.objectId && originId == x.originId; + } + + bool operator <( const Index& x ) const + { + return (objectId != x.objectId) ? objectId < x.objectId : originId < x.originId; + } + + bool HasDerivative() const + { + return !nodes[1].IsEmpty(); + } + }; + + mutable File m_file; + mutable AtomicInt m_handleCount; + mutable Mutex m_mutex; + TimePoint m_startTime; + TimePoint m_endTime; + EphemerisMetadata m_metadata; + EphemerisConstantList m_constants; + Array m_index; + + // Current data files. + // If empty, i.e. if not overridden, use platform defaults. + static String s_ephFilePath; + static String s_ephFilePath_s; + static String s_astFilePath; + static String s_astFilePath_s; + static String s_kboFilePath; + static String s_kboFilePath_s; + static String s_nutFilePath; + static String s_nutFilePath_s; + static String s_deltaTFilePath; + static String s_deltaATFilePath; + static String s_cipITRSFilePath; + + /*! + * \internal + * Returns a pointer to an Index structure for the specified object + * identifier or name, with respect to the specified origin of coordinates. + */ + const Index* FindObject( const IsoString& object, const IsoString& origin ) const + { + if ( origin.IsEmpty() ) + { + for ( const Index& index : m_index ) + if ( index.objectId == object ) + return &index; + } + else + { + Array::const_iterator i = BinarySearch( m_index.Begin(), m_index.End(), Index( object, origin ) ); + if ( i != m_index.End() ) + return i; + } + String name = object.UTF8ToUTF16(); + for ( const Index& index : m_index ) + if ( index.objectName.CompareIC( name ) == 0 ) + if ( origin.IsEmpty() || index.originId == origin ) + return &index; + throw Error( "Unavailable object '" + name + "\' with origin '" + String( origin ) + "'." ); + } + +public: + + /*! + * \class pcl::EphemerisFile::Handle + * \brief Calculation of ephemerides from data stored in XEPH files. + * + * This subclass provides access to ephemeris data for a specific object + * available in an ephemeris file. It can perform basic ephemeris + * calculations, including state vectors and its first derivatives (such as + * position and velocity), and performs all the low-level file seek and read + * operations transparently and efficiently. + * + * Data stored in an XEPH ephemeris file generates rectangular coordinates + * referred to the axes of the International Celestial Reference System + * (ICRS/J2000.0). Positions are given in au and velocities in au/day for + * all solar system objects, except planetocentric coordinates of natural + * satellites, including the geocentric Moon, for which positions and + * velocities are given in kilometers and km/day, respectively. Angles + * (nutations and librations) are given in radians, and time differences + * (such as TT-TDB) in seconds. + * + * For performance reasons, this class is not thread-safe. However, as far + * as a given instance is never used concurrently from two or more threads, + * multiple instances of this class can be used from different running + * threads, including instances constructed to calculate ephemerides for the + * same object. This allows for the implementation of performance-intensive, + * lock-free multithreaded ephemeris calculation tasks. + */ + class PCL_CLASS Handle + { + public: + + /*! + * Constructs a new %Handle object. + * + * \param parent Reference to an open EphemerisFile object providing + * access to an ephemeris data file in XEPH format. + * + * \param object The identifier or name of the object for which this + * instance will compute ephemerides. + * + * \param origin The identifier of the origin of coordinates. If an + * empty string is specified (which is the default + * parameter value), this object will be created for the + * first occurrence of ephemeris data available for + * \a object in the \a parent file, irrespective of the + * origin. In such case, if \a parent is a standard + * fundamental ephemerides file, the origin is the solar + * system barycenter (identified as "SSB"). + * + * For a detailed description of object names and identifiers, see + * EphemerisFile::IsObjectAvailable(). + * + * If the specified \a parent ephemeris file is not open, or if no + * ephemeris data are available for the specified \a object and \a origin + * in the \a parent ephemeris file, this constructor will throw an Error + * exception. + */ + Handle( const EphemerisFile& parent, const IsoString& object, const IsoString& origin = IsoString() ) + { + if ( !parent.IsOpen() ) + throw Error( "Cannot create a handle to a closed ephemeris file." ); + m_parent = &parent; + m_parent->m_handleCount.Increment(); + m_index = m_parent->FindObject( object, origin ); + } + + /*! + * Copy constructor. + */ + Handle( const Handle& x ) + { + m_parent = x.m_parent; + m_index = x.m_index; + m_node[0] = x.m_node[0]; + m_node[1] = x.m_node[1]; + m_node[2] = x.m_node[2]; + if ( m_parent != nullptr ) + m_parent->m_handleCount.Increment(); + } + + /*! + * Move constructor. + */ + Handle( Handle&& x ) + { + m_parent = x.m_parent; + x.m_parent = nullptr; + m_index = x.m_index; + m_node[0] = x.m_node[0]; + m_node[1] = x.m_node[1]; + m_node[2] = x.m_node[2]; + } + + /*! + * virtual destructor. + */ + virtual ~Handle() + { + if ( m_parent != nullptr ) + m_parent->m_handleCount.Decrement(); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Handle& operator =( const Handle& x ) + { + if ( m_parent != nullptr ) + m_parent->m_handleCount.Decrement(); + m_parent = x.m_parent; + m_index = x.m_index; + m_node[0] = x.m_node[0]; + m_node[1] = x.m_node[1]; + m_node[2] = x.m_node[2]; + if ( m_parent != nullptr ) + m_parent->m_handleCount.Increment(); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Handle& operator =( Handle&& x ) + { + if ( m_parent != nullptr ) + m_parent->m_handleCount.Decrement(); + m_parent = x.m_parent; + x.m_parent = nullptr; + m_index = x.m_index; + m_node[0] = x.m_node[0]; + m_node[1] = x.m_node[1]; + m_node[2] = x.m_node[2]; + return *this; + } + + /*! + * Computes a state vector for the specified time point \a t. + * + * \param[out] p Reference to a vector where the components of the + * computed state will be stored. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Rectangular coordinates for position are provided in au, except for + * the geocentric Moon, for which positions are provided in km. + * + * Angles are provided in radians. + * + * TT-TDB differences are provided in seconds. + * + * The reference system is ICRS/J2000.0. + * + * If \a t is either an invalid (uninitialized) TimePoint instance, or a + * time point outside the time span available from the parent ephemeris + * file, this member function throws an Error exception. + */ + void ComputeState( Vector& p, TimePoint t ) + { + Update( t, 0 ); + p = m_node[0].expansion( t - m_node[0].startTime ); + } + + /*! + * Computes a state vector and its first derivative for the specified + * time point \a t. + * + * \param[out] p Reference to a vector where the components of the + * computed state will be stored. + * + * \param[out] v Reference to a vector where the components of the + * computed first derivative will be stored. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Rectangular coordinates for position and velocity are provided in au + * and au/day, respectively, except for the geocentric Moon, for which + * position and velocity are provided in km and km/day, respectively. + * + * Angles and their variations are provided in radians and radians/day. + * + * Time differences (such as TT-TDB) and their variations are provided in + * seconds and seconds/day. + * + * The reference system is ICRS/J2000.0. + * + * If the parent ephemeris file provides Chebyshev expansions of state + * vector derivatives for the object being calculated, the components of + * \a v will be calculated directly from these expansions. Otherwise the + * components of \a v will be approximated by numerical differentiation + * of the Chebyshev expansions for state vectors. + * + * If \a t is either an invalid (uninitialized) TimePoint instance, or a + * time point outside the time span available from the parent ephemeris + * file, this member function throws an Error exception. + */ + void ComputeState( Vector& p, Vector& v, TimePoint t ) + { + ComputeState( p, t ); + ComputeFirstDerivative( v, t ); + } + + /*! + * Computes the first derivative of the state vector for the specified + * time point \a t. + * + * \param[out] v Reference to a vector where the components of the + * computed first derivative will be stored. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Rectangular coordinates for velocity are provided in au/day, except + * for the geocentric Moon, for which velocity is provided in km/day. + * + * Angle variations are provided in radians/day. + * + * Time difference variations are provided in seconds/day. + * + * The reference system is ICRS/J2000.0. + * + * If the parent ephemeris file provides Chebyshev expansions of state + * vector derivatives for the object being calculated, the components of + * \a v will be calculated directly from these expansions. Otherwise the + * components of \a v will be approximated by numerical differentiation + * of the Chebyshev expansions for state vectors. + * + * If \a t is either an invalid (uninitialized) TimePoint instance, or a + * time point outside the time span available from the parent ephemeris + * file, this member function throws an Error exception. + */ + void ComputeFirstDerivative( Vector& v, TimePoint t ) + { + if ( HasDerivative() ) + Update( t, 1 ); + else if ( m_node[1].current != m_node[0].current ) + { + m_node[1].current = m_node[0].current; + m_node[1].startTime = m_node[0].startTime; + m_node[1].endTime = m_node[0].endTime; + m_node[1].expansion = m_node[0].expansion.Derivative(); + } + v = m_node[1].expansion( t - m_node[1].startTime ); + } + + /*! + * Computes the second derivative of the state vector for the specified + * time point \a t. + * + * \param[out] a Reference to a vector where the components of the + * computed second derivative will be stored. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Rectangular coordinates for acceleration are provided in au/day^2, + * except for the geocentric Moon, for which acceleration is provided in + * km/day^2. + * + * Angular second derivatives are provided in radians/day^2. + * + * Time second derivatives are provided in seconds/day^2. + * + * The reference system is ICRS/J2000.0. + * + * The components of the second derivative will be approximated by + * numerical differentiation of the Chebyshev expansions for the first + * derivative. The latter can be either provided directly by the parent + * ephemeris file, or also approximated by numerical differentiation. + * + * If \a t is either an invalid (uninitialized) TimePoint instance, or a + * time point outside the time span available from the parent ephemeris + * file, this member function throws an Error exception. + */ + void ComputeSecondDerivative( Vector& a, TimePoint t ) + { + if ( HasDerivative() ) + Update( t, 1 ); + else if ( m_node[1].current != m_node[0].current ) + { + m_node[1].current = m_node[0].current; + m_node[1].startTime = m_node[0].startTime; + m_node[1].endTime = m_node[0].endTime; + m_node[1].expansion = m_node[0].expansion.Derivative(); + } + if ( m_node[2].current != m_node[0].current ) + { + m_node[2].current = m_node[0].current; + m_node[2].startTime = m_node[0].startTime; + m_node[2].endTime = m_node[0].endTime; + m_node[2].expansion = m_node[1].expansion.Derivative(); + } + a = m_node[2].expansion( t - m_node[2].startTime ); + } + + /*! + * Computes a state vector for the specified time point \a t. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Returns the computed state function value. + * + * See ComputeState( Vector&, TimePoint ) for complete information. + */ + Vector StateVector( TimePoint t ) + { + Vector p; + ComputeState( p, t ); + return p; + } + + /*! + * Computes a state vector and its first derivative for the specified + * time point \a t. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Returns a two-component multivector, where the first component vector + * is the state function's value and the second is its first derivative. + * + * See ComputeState( Vector&, Vector&, TimePoint ) for complete + * information. + */ + MultiVector StateVectors( TimePoint t ) + { + Vector p, v; + ComputeState( p, v, t ); + return MultiVector( p, v ); + } + + /*! + * Computes the first derivative of a state vector for the specified time + * point \a t. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Returns the computed first derivative vector. + * + * See ComputeFirstDerivative( Vector&, TimePoint ) for complete + * information. + */ + Vector FirstDerivative( TimePoint t ) + { + Vector v; + ComputeFirstDerivative( v, t ); + return v; + } + + /*! + * Computes the second derivative of a state vector for the specified + * time point \a t. + * + * \param t The requested time point in the TDB time scale + * (rigorously, this is Teph as defined by JPL, but is + * equivalent to TDB or TT for all practical purposes). + * + * Returns the computed second derivative vector. + * + * See ComputeSecondDerivative( Vector&, TimePoint ) for complete + * information. + */ + Vector SecondDerivative( TimePoint t ) + { + Vector v; + ComputeSecondDerivative( v, t ); + return v; + } + + /*! + * Returns a reference to the parent ephemeris file object. The parent + * object was specified upon construction. + */ + const EphemerisFile& ParentFile() const + { + return *m_parent; + } + + /*! + * Returns the unique identifier of the object for which this handle can + * compute ephemerides. + */ + const IsoString& ObjectId() const + { + return m_index->objectId; + } + + /*! + * Returns the unique identifier of the origin of the coordinates + * computed by this object. For example, if this member function returns + * "Ea" or "Sn", the computed coordinates are geocentric or heliocentric, + * respectively. If this function returns "SSB", the origin of + * coordinates is the solar system barycenter. This happens, for example, + * with all standard XEPH files providing fundamental ephemerides. + */ + const IsoString& OriginId() const + { + return m_index->originId; + } + + /*! + * Returns the name of the object for which this handle can compute + * ephemerides. The returned value can be an empty string if no + * information about the object name is available in the parent ephemeris + * file. + */ + const String& ObjectName() const + { + return m_index->objectName; + } + + /*! + * Returns the lower bound of the time span for which this instance can + * calculate ephemerides using the ephemeris data already available. If + * a time point outside this span is requested, new file seek and read + * operations must be performed. + * + * \param i Expansion index: 0 to select function values (such as + * position), 1 to select function derivatives (such as + * velocity). + */ + TimePoint StartTime( int i = 0 ) const + { + return m_node[Range( i, 0, 1 )].startTime; + } + + /*! + * Returns the upper bound of the time span for which this instance can + * calculate ephemerides using the ephemeris data already available. If + * a time point outside this span is requested, new file seek and read + * operations must be performed. + * + * \param i Expansion index: 0 to select function values (such as + * position), 1 to select function derivatives (such as + * velocity). + */ + TimePoint EndTime( int i = 0 ) const + { + return m_node[Range( i, 0, 1 )].endTime; + } + + /*! + * Returns true iff the parent ephemeris file provides Chebyshev + * expansions of state vector derivatives for the object for which this + * handle computes ephemerides. + * + * When no expansions for derivatives are available, derivatives are + * approximated by numerical differentiation of the Chebyshev expansions + * for state vectors. + */ + bool HasDerivative() const + { + return m_index->HasDerivative(); + } + + /*! + * Returns the absolute magnitude of the object. H is the visual + * magnitude of the object as seen at 1 au of the Earth, 1 au from the + * Sun, and with a phase angle of 0 degrees. + * + * References + * + * E. Bowell et al., Asteroids II, R. P. Binzel et al. (eds.), + * The University of Arizona Press, Tucson, 1989, pp. 549-554. + * + * Urban, Sean E., Kenneth Seidelmann, P., ed. (2013), The + * Explanatory Supplement to the Astronomical Almanac 3rd Edition, + * Section 10.4.3. + */ + const Optional& H() const + { + return m_index->H; + } + + /*! + * Slope parameter. See H() for references. + */ + const Optional& G() const + { + return m_index->G; + } + + /*! + * Color index B-V, in magnitudes. + */ + const Optional& B_V() const + { + return m_index->B_V; + } + + /*! + * Diameter of the object in km. When available, this is normally an IRAS + * diameter for an asteroid. + */ + const Optional& D() const + { + return m_index->D; + } + + private: + + struct NodeInfo + { + int current = -1; + TimePoint startTime; + TimePoint endTime; + ChebyshevFit expansion; + }; + + const EphemerisFile* m_parent = nullptr; + const EphemerisFile::Index* m_index = nullptr; + NodeInfo m_node[ 3 ]; + uint64 m_uniqueId = UniqueId(); + + static uint64 UniqueId(); + + /*! + * \internal + * Updates internal data for the specified time point \a t and function + * index \a i. Performs file seek and read operations only when required + * to load a new set of Chebyshev polynomial coefficients. + */ + void Update( TimePoint t, int index ) + { + if ( !t.IsValid() ) + throw Error( "Invalid time point." ); + if ( t < m_parent->StartTime() || t > m_parent->EndTime() ) + throw Error( "Time point out of range." ); + + const Array& nodes = m_index->nodes[index]; + NodeInfo& info = m_node[index]; + + for ( int N = int( nodes.Length() ), l = 0, r = N-1; ; ) + { + int m = (l + r) >> 1; + const IndexNode& node = nodes[m]; + TimePoint t0 = node.StartTime(); + if ( t < t0 ) + r = m; + else + { + if ( m == N-1 || t < nodes[m+1].StartTime() ) + { + if ( m != info.current ) + { + ChebyshevFit::coefficient_series coefficients; + { + volatile AutoLock lock( m_parent->m_mutex ); + m_parent->m_file.SetPosition( node.position ); + for ( int i = 0, n = node.NumberOfComponents(); i < n; ++i ) + { + Vector c( node.n[i] ); + m_parent->m_file.Read( reinterpret_cast( c.Begin() ), c.Size() ); + coefficients << c; + } + } + info.current = m; + info.startTime = t0; + info.endTime = (m < N-1) ? nodes[m+1].StartTime() : m_parent->EndTime(); + info.expansion = ChebyshevFit( coefficients, 0, info.endTime - info.startTime ); + } + break; + } + + l = m + 1; + } + } + } + + friend class PCL_CLASS Position; + }; + +private: + +#if defined( __clang__ ) +# pragma GCC diagnostic ignored "-Wunused-private-field" +#endif + + /* + * For the core JavaScript engine we need garbage-collector-safe + * asynchronous destruction of these objects. + */ + mutable bool m_finalized = false; + + /* + * In the core JavaScript engine we must identify static objects that can be + * shared and must never be destroyed. This includes fundamental + * ephemerides, nutation, etc. + */ + mutable bool m_internal = false; + +#if defined( __clang__ ) +# pragma GCC diagnostic warning "-Wunused-private-field" +#endif + + class DeserializeObjectThread : public Thread + { + public: + + DeserializeObjectThread( const Array& elements + , File& file, fsize_type fileSize, fsize_type minPos + , int startIndex, int endIndex ) + : m_elements( elements ) + , m_startIndex( startIndex ) + , m_endIndex( endIndex ) + , m_file( file ) + , m_fileSize( fileSize ) + , m_minPos( minPos ) + { + } + + void Run() override; + + const Array& Objects() const + { + return m_index; + } + + bool Succeeded() const + { + return m_success; + } + + const Exception* ExceptionThrown() const + { + return m_exception.Ptr(); + } + + private: + + const Array& m_elements; + int m_startIndex, m_endIndex; + File& m_file; + fsize_type m_fileSize, m_minPos; + Array m_index; + AutoPointer m_exception; + bool m_success = false; + }; + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + friend class pi::JSEphemerisFileObject; + friend class pi::JSEphemerisHandleObject; +#endif +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_EphemerisFile_h + +// ---------------------------------------------------------------------------- +// EOF pcl/EphemerisFile.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ErrorHandler.h b/3rdparty/include/pcl/ErrorHandler.h new file mode 100644 index 0000000..261de0d --- /dev/null +++ b/3rdparty/include/pcl/ErrorHandler.h @@ -0,0 +1,184 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ErrorHandler.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ErrorHandler_h +#define __PCL_ErrorHandler_h + +/// \file pcl/ErrorHandler.h + +#include + +#include + +#include // std::bad_alloc + +// ---------------------------------------------------------------------------- + +#ifdef __PCL_SILENTLY_REPLACE_USER_ERROR_MACROS + +#undef ERROR_HANDLER +#undef ERROR_CLEANUP + +#else + +#ifdef ERROR_HANDLER +#error ERROR_HANDLER macro: Already defined! +#endif + +#ifdef ERROR_CLEANUP +#error ERROR_CLEANUP macro: Already defined! +#endif + +#endif + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup error_handling_macros Error Handling Macros + */ + +// ---------------------------------------------------------------------------- + +/*! + * \def ERROR_HANDLER + * \brief Standard PCL error handler macro + * + * Use the ERROR_HANDLER macro after try blocks in all PCL programs and + * modules. + * + * \ingroup error_handling_macros + */ +#define ERROR_HANDLER \ + catch ( pcl::FatalError& ) \ + { \ + /* Launch fatal errors to the hyperspace... */ \ + throw; \ + } \ + catch ( pcl::ProcessAborted& ) \ + { \ + /* Abort process: Let the PI application do the GUI output */ \ + } \ + catch ( pcl::CaughtException& ) \ + { \ + /* Exceptions already caught and managed: simply ignore them */ \ + } \ + catch ( pcl::Exception& x ) \ + { \ + /* Other PCL exceptions */ \ + x.Show(); \ + } \ + catch ( pcl::String& s ) \ + { \ + /* Nonstandard ways of throwing things... */ \ + try \ + { \ + throw pcl::Error( s ); \ + } \ + catch ( pcl::Exception& x ) \ + { \ + x.Show(); \ + } \ + } \ + catch ( std::bad_alloc& ) \ + { \ + /* Standard bad allocation exception */ \ + try \ + { \ + throw pcl::Error( "Out of memory" ); \ + } \ + catch ( pcl::Exception& x ) \ + { \ + x.Show(); \ + } \ + } \ + catch ( ... ) \ + { \ + /* Catch-all */ \ + try \ + { \ + throw pcl::Error( "Unknown exception" ); \ + } \ + catch ( pcl::Exception& x ) \ + { \ + x.Show(); \ + } \ + } + +// ---------------------------------------------------------------------------- + +/*! + * \def ERROR_CLEANUP + * \brief Standard PCL error handler macro with cleanup code + * + * Use ERROR_CLEANUP in the same way as the ERROR_HANDLER macro, when you need + * to specify a local clean up code, e.g. to delete dynamically allocated local + * variables. + * + * \ingroup error_handling_macros + */ +#define ERROR_CLEANUP( cleanup_code ) \ + catch ( ... ) \ + { \ + cleanup_code; \ + \ + try \ + { \ + throw; \ + } \ + ERROR_HANDLER \ + } + +// ---------------------------------------------------------------------------- + +#endif // __PCL_ErrorHandler_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ErrorHandler.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Exception.h b/3rdparty/include/pcl/Exception.h new file mode 100644 index 0000000..6a8015a --- /dev/null +++ b/3rdparty/include/pcl/Exception.h @@ -0,0 +1,671 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Exception.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Exception_h +#define __PCL_Exception_h + +/// \file pcl/Exception.h + +#include + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup standard_exception_classes Standard Exception Classes + */ + +/*! + * \class Exception + * \brief Root base class for all PCL exception classes + * + * All exceptions thrown by PCL classes and functions are descendants of the + * %Exception class. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS Exception +{ +public: + + /*! + * Constructs an %Exception object. + */ + Exception() = default; + + /*! + * Copy constructor. + */ + Exception( const pcl::Exception& ) = default; + + /*! + * Destroys an %Exception object. + */ + virtual ~Exception() + { + } + + /*! + * Returns an error class for this exception. + */ + virtual String ExceptionClass() const + { + return String(); + } + + /*! + * Returns an error or warning message corresponding to this exception. + */ + virtual String Message() const + { + return String(); + } + + /*! + * Returns a formatted representation of the information transported by this + * %Exception object. + */ + virtual String FormatInfo() const; + + /*! + * Returns a caption text suitable to represent the information in this + * %Exception object. + */ + virtual String Caption() const; + + /*! + * Shows a representation of the information transported by this exception. + * + * Exception information can be shown as text on the platform console or + * using graphical interfaces, depending on a global setting controlled with + * the EnableConsoleOutput() and EnableGUIOutput() static member functions. + * + * \sa IsConsoleOutputEnabled(), IsGUIOutputEnabled() + */ + virtual void Show() const; + + /*! + * Prints a representation of the information transported by this exception + * exclusively as plain text on the platform console. + * + * This function ignores current settings defined through previous calls to + * EnableConsoleOutput() and EnableGUIOutput(). + */ + PCL_FORCE_INLINE void ShowOnConsole() const + { + /* + * N.B.: This function must always be expanded inline. Otherwise, neither + * UNIX synchronous signal handlers nor Win32 structured exception + * handlers can throw C++ exceptions. + */ + bool wasConsoleOutput = IsConsoleOutputEnabled(); + bool wasGUIOutput = IsGUIOutputEnabled(); + EnableConsoleOutput(); + DisableGUIOutput(); + + Exception::Show(); + + EnableConsoleOutput( wasConsoleOutput ); + EnableGUIOutput( wasGUIOutput ); + } + + /*! + * Returns true iff console text output is enabled for %Exception. + * + * When console output is enabled, exception information is presented as + * text on the PixInsight core application's console. Console exception + * output is always enabled by default. + * + * \sa IsGUIOutputEnabled(), EnableConsoleOutput(), EnableGUIOutput() + */ + static bool IsConsoleOutputEnabled(); + + /*! + * Enables console output for %Exception. + * + * \sa IsConsoleOutputEnabled(), DisableConsoleOutput(), + * IsGUIOutputEnabled(), EnableGUIOutput() + */ + static void EnableConsoleOutput( bool = true ); + + /*! + * Disables console output for %Exception. + * + * \sa IsConsoleOutputEnabled(), EnableConsoleOutput(), + * IsGUIOutputEnabled(), EnableGUIOutput() + */ + static void DisableConsoleOutput( bool disable = true ) + { + EnableConsoleOutput( !disable ); + } + + /*! + * Returns true iff GUI output is enabled for %Exception. + * + * When GUI output is enabled, exception information is presented through + * message boxes and other modal, graphical interface elements. GUI + * exception output is always disabled by default. + * + * \sa IsConsoleOutputEnabled(), EnableConsoleOutput(), EnableGUIOutput() + */ + static bool IsGUIOutputEnabled(); + + /*! + * Enables GUI output for %Exception. + * + * \sa IsGUIOutputEnabled(), DisableGUIOutput(), IsConsoleOutputEnabled(), + * EnableConsoleOutput() + */ + static void EnableGUIOutput( bool = true ); + + /*! + * Disables GUI output for %Exception. + * + * \sa IsGUIOutputEnabled(), EnableGUIOutput(), IsConsoleOutputEnabled(), + * EnableConsoleOutput() + */ + static void DisableGUIOutput( bool disable = true ) + { + EnableGUIOutput( !disable ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Error + * \brief A simple exception with an associated error message. + * + * %Error is a general exception message very frequently used by PCL classes + * and functions. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS Error : public pcl::Exception +{ +public: + + /*! + * Constructs an %Error object with an empty error message. + */ + Error() = default; + + /*! + * Copy constructor. + */ + Error( const Error& ) = default; + + /*! + * Constructs an %Error object with the specified error \a message. + */ + Error( const String& message ) + : m_message( message ) + { + } + + /*! + * Returns descriptive information for this %Error object. The default + * implementation returns the message specified upon construction. A derived + * class can reimplement this function to provide additional information + * items such as file names, object identifiers, source code positions, date + * and time representations, etc. + */ + String Message() const override + { + return m_message; + } + + /*! + */ + String Caption() const override + { + return "Error"; + } + +protected: + + String m_message; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class FatalError + * \brief Errors that cause immediate program termination + * + * %FatalError indicates an error situation that cannot be resumed and requires + * immediate program termination. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS FatalError : public Error +{ +public: + + /*! + * Constructs a %FatalError object with an empty message. + */ + FatalError() = default; + + /*! + * Constructs a %FatalError object with the specified \a message. + */ + FatalError( const String& message ) + : Error( message ) + { + } + + /*! + * "Promote" any exception to have "fatal consequences". + */ + FatalError( const pcl::Exception& x ) + : Error( x.Message() ) + { + } + + /*! + * Copy constructor. + */ + FatalError( const pcl::FatalError& ) = default; + + /*! + */ + String Caption() const override + { + return "Fatal Error"; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class NotImplemented + * \brief An exception that indicates an unsupported feature + * + * Throw one of these when you have an object that can't do something. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS NotImplemented : public Error +{ +public: + + /*! + * Constructs a %NotImplemented instance. + * + * \param object The object that does not implement something + * + * \param notImplemented A description of what \a object does not + * implement. + */ + template + NotImplemented( const T& object, const String& notImplemented ) + : Error( String( IsoString( typeid( object ).name() ) +#ifdef __PCL_WINDOWS + .MBSToWCS() +#else + .UTF8ToUTF16() +#endif + ) + ": Not implemented: " + notImplemented ) + { + } + + /*! + * Copy constructor. + */ + NotImplemented( const NotImplemented& ) = default; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ParseError + * \brief Base class for exceptions thrown by parsing routines + * + * A %ParseError indicates an syntactic or semantic error found while + * interpreting some code or trying to translate some text into an object. + * + * For example, String and IsoString throw %ParseError exceptions to indicate + * syntax errors while converting strings to numbers. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS ParseError : public Error +{ +public: + + /*! + * Constructs an empty %ParseError object: no error message and no position + * information. + */ + ParseError() = default; + + /*! + * Copy constructor. + */ + ParseError( const ParseError& ) = default; + + /*! + * Constructs a %ParseError object. + * + * \param message The error message. HTML entities are not interpreted as + * ISO 8859-1 characters, and console tags are ignored, even if + * the exception is to be represented on a PixInsight console. + * HTML entities and console tags are always written literally. + * This limitation is necessary to ensure representativeness of + * source code fragments shown in exception messages. + * + * \param beingParsed The string being parsed, or an empty string if the + * error is not associated to a particular source code string. + * + * \param errorPosition The position >= 0 of the first offending character + * in the string \a beingParsed, or < 0 if no specific position + * can be associated with the error. + */ + ParseError( const String& message, const String& beingParsed = String(), int errorPosition = -1 ) + : Error( message ) + , m_beingParsed( beingParsed ) + , m_errorPosition( errorPosition ) + { + } + + /*! + */ + String Message() const override; + + /*! + */ + void Show() const override; + +protected: + + String m_beingParsed; + int m_errorPosition = -1; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SourceCodeError + * \brief Base class for exceptions thrown by source code interpreters + * + * A %SourceCodeError represents a syntax error thrown by a source code parser + * or interpreter, such as a scripting engine or an XML decoder. + * + * %SourceCodeError provides an error message string associated to a line + * number and a column number that locate the error in the source code text + * being processed. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS SourceCodeError : public Error +{ +public: + + /*! + * Constructs an empty %SourceCodeError object: no error message and no + * source code location information. + */ + SourceCodeError() = default; + + /*! + * Copy constructor. + */ + SourceCodeError( const SourceCodeError& ) = default; + + /*! + * Constructs a %SourceCodeError object. + * + * \param message The error message. HTML entities are not interpreted as + * ISO 8859-1 characters, and console tags are ignored, even if + * the exception is to be represented on a PixInsight console. + * HTML entities and console tags are always written literally. + * This limitation is necessary to ensure representativeness of + * source code fragments in exception messages. + * + * \param line The line number (starting from 1) corresponding to the + * position of this error in the source code text, or <= 0 if no + * specific source code line can be associated with this error. + * The default value is -1, meaning that no line number is + * specified by default. + * + * \param column The column number (starting from 1) corresponding to + * the position of this error in the source code text, or <= 0 + * if no specific source code column can be associated with this + * error. The default value is -1, meaning that no column number + * is specified by default. + */ + template + SourceCodeError( const String& message, T1 line = -1, T1 column = -1 ) + : Error( message ) + , m_lineNumber( Range( int( line ), -1, int_max ) ) + , m_columnNumber( Range( int( column ), -1, int_max ) ) + { + } + + /*! + * Returns the line number in the source code text being processed, + * corresponding to this exception. + * + * If a valid source code line can be associated with this exception, the + * returned value should be >= 1. Otherwise, if no text line can be + * determined for this exception, -1 is returned. + * + * \sa ColumnNumber() + */ + int LineNumber() const + { + return m_lineNumber; + } + + /*! + * Returns the column number in the source code text being processed, + * corresponding to this exception. + * + * If a valid source code column can be associated with this exception, the + * returned value should be >= 1. Otherwise, if no text column can be + * determined for this exception, -1 is returned. + * + * \sa LineNumber() + */ + int ColumnNumber() const + { + return m_columnNumber; + } + + /*! + * Sets the source code \a line number and \a column (optional) for this + * exception. + * + * Valid (meaningful) source code coordinates must be >= 1. When a value < 0 + * is specified, the corresponding coordinate is interpreted to be + * unavailable for the current exception. + * + * This member function is useful when nested sections of a source code + * block are being processed recursively; for example in XML decoders. + * + * \sa AddToPosition() + */ + template + void SetPosition( T1 line, T1 column = -1 ) + { + m_lineNumber = Range( int( line ), -1, int_max ); + m_columnNumber = Range( int( column ), -1, int_max ); + } + + /*! + * Adds the specified \a lines and \a columns (optional) increments to the + * source code coordinates for this exception. + * + * Valid (meaningful) source code coordinates must be >= 1. When a value + * <= 0 results from a call to this function, the corresponding coordinate + * is interpreted to be unavailable for the current exception. + * + * This member function is useful when nested sections of a source code + * block are being processed recursively; for example in XML decoders. + * + * \sa SetPosition() + */ + template + void AddToPosition( T1 lines, T1 columns = 0 ) + { + SetPosition( m_lineNumber+int( lines ), m_columnNumber+int( columns ) ); + } + + /*! + */ + String Message() const override; + + /*! + */ + void Show() const override; + +protected: + + int m_lineNumber = -1; + int m_columnNumber = -1; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class CaughtException + * \brief An exception that has already been handled + * + * %CaughtException is used to signal exceptions requiring no additional + * processing. %CaughtException is useful to terminate a process (by branching + * execution to a catch() block) without causing generation of further error + * messages. + * + * \ingroup standard_exception_classes + */ +class PCL_CLASS CaughtException : public pcl::Exception +{ +public: + + /*! + * Constructs a %CaughtException object. + */ + CaughtException() = default; + + /*! + * Copy constructor. + */ + CaughtException( const pcl::CaughtException& ) = default; +}; + +} // pcl + +// ---------------------------------------------------------------------------- + +/*! + * \def PCL_DECLARE_EXCEPTION_CLASS + * \brief A macro to implement simple exception classes derived from Exception + * + * \param className The identifier of the exception class. + * + * \param exceptionClass The name of the exception class, as presented in + * formatted representations. + * + * \param message The error message shown for this exception class. + * + * Use this macro to define and implement exceptions classes that show + * constant error or warning messages. + * + * In many cases using the %Error exception class is preferable to create new + * exception classes with this macro. + * + * \ingroup standard_exception_classes + */ +#define PCL_DECLARE_EXCEPTION_CLASS( className, exceptionClass, message ) \ + class PCL_CLASS className : public pcl::Exception \ + { \ + public: \ + className() = default; \ + className( const className& ) = default; \ + pcl::String ExceptionClass() const override \ + { \ + return exceptionClass; \ + } \ + pcl::String Message() const override \ + { \ + return message; \ + } \ + } + +// ---------------------------------------------------------------------------- + +namespace pcl +{ + +/*! + * \class pcl::ProcessAborted + * \brief An exception class signaling the interruption of a process + * + * %ProcessAborted is thrown by processes that have been aborted by the user. + * + * \ingroup standard_exception_classes + */ + +PCL_DECLARE_EXCEPTION_CLASS( ProcessAborted, "Process aborted", String() ); + +} // pcl + +#endif // __PCL_Exception_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Exception.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ExternalProcess.h b/3rdparty/include/pcl/ExternalProcess.h new file mode 100644 index 0000000..d1e4218 --- /dev/null +++ b/3rdparty/include/pcl/ExternalProcess.h @@ -0,0 +1,852 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ExternalProcess.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ExternalProcess_h +#define __PCL_ExternalProcess_h + +/// \file pcl/ExternalProcess.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ExternalProcessError + * \brief External process error conditions. + * + * + * + * + * + * + * + * + *
ExternalProcessError::FailedToStart The external process failed to start.
ExternalProcessError::Crashed The external process crashed.
ExternalProcessError::TimedOut A wait operation timed out.
ExternalProcessError::ReadError An error occurred while trying to read data from a process' stdout or stderr streams.
ExternalProcessError::WriteError An error occurred while trying to write data to a process' stdin stream.
ExternalProcessError::UnknownError An unknown error occurred trying to execute or communicate with an external process.
+ */ +namespace ExternalProcessError +{ + enum value_type + { + FailedToStart, + Crashed, + TimedOut, + ReadError, + WriteError, + UnknownError + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class ExternalProcess + * \brief Execution of external programs. + * + * %ExternalProcess is essentially a PCL wrapper to Qt's QProcess class, which + * the PixInsight core application uses as the underlying implementation for + * management of external processes on the PixInsight platform. + * + * ### TODO: Write a detailed description for %ExternalProcess. + */ +class PCL_CLASS ExternalProcess : public UIObject +{ +public: + +#ifndef __PCL_WINDOWS + /*! + * The type of a platform-dependent Process Identifier (PID). + * + * On Linux/UNIX (Linux, FreeBSD and Mac OS X), a PID is a 64-bit integer. + * + * On Windows platforms, a PID is a pointer to a _PROCESS_INFORMATION + * structure (hence, on 64-bit Windows platforms a PID is also a 64-bit + * integer number). + */ + typedef int64 pid_type; +#else + typedef void* pid_type; +#endif + + /*! + * The type used to represent error conditions in external processes. + */ + typedef ExternalProcessError::value_type error_code; + + /*! + * Constructs an %ExternalProcess object. + */ + ExternalProcess(); + + /*! + * Destroys the client-side %ExternalProcess instance and dereferences the + * server-side object. If the server-side object becomes unreferenced, it + * will be garbage-collected and eventually destroyed by the core + * application. + */ + virtual ~ExternalProcess() + { + } + + /*! + * Copy constructor. Copy semantics are disabled for %ExternalProcess + * because this class represents unique server-side objects. + */ + ExternalProcess( const ExternalProcess& ) = delete; + + /*! + * Copy assignment. Copy semantics are disabled for %ExternalProcess because + * this class represents unique server-side objects. + */ + ExternalProcess& operator =( const ExternalProcess& ) = delete; + + /*! + * Move constructor. Move semantics are disabled for %ExternalProcess + * because of parent-child server-side object relations. + */ + ExternalProcess( ExternalProcess&& ) = delete; + + /*! + * Move assignment. Move semantics are disabled for %ExternalProcess because + * of parent-child server-side object relations. + */ + ExternalProcess& operator =( ExternalProcess&& ) = delete; + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since external processes are unique objects, calling this member function + * has no effect. + */ + void EnsureUnique() override + { + } + + /*! + * Returns a reference to a null %ExternalProcess instance. A null + * %ExternalProcess does not correspond to an existing external process in + * the PixInsight core application. + */ + static ExternalProcess& Null(); + + /*! + * Attempts to execute an external process. + * + * \param program Path to the executable file. + * + * \param arguments Optional list of command-line arguments that will be + * passed to the executable. Arguments containing spaces + * will be enclosed by quotes automatically. The default + * value is an empty list. + * + * If the specified \a program cannot be executed for some reason (for + * example, because the specified \a program does not exist, or because the + * calling process doesn't have enough privileges), this function throws an + * Error exception. + * + * This function implicitly opens the standard input, output and error I/O + * streams (stdin, stdout and stderr, respectively) of the running process. + * You can read from and write to the process using the Read() and Write() + * member functions of %ExternalProcess, respectively. You can also close + * the I/O streams using the CloseXX() member functions. + */ + void Start( const String& program, const StringList& arguments = StringList() ); + + /*! + * Waits for the process to start execution. + * + * \param ms Maximum waiting time in milliseconds. If a negative + * value is specified, this function will never time out. + * The default waiting time is 6000 ms (six seconds). + * + * This function suspends the calling task for at most the specified time, + * or forever if a negative time value is specified. Returns true if the + * process started before the specified time elapsed. Returns false if the + * process timed out. In the latter case, this function can be called again + * to continue waiting for the process to start. + * + * \warning When called from the root thread, this function can freeze the + * entire PixInsight graphical interface. For asynchronous external process + * execution, consider calling WaitForXX() functions from a separate thread. + * Be aware that if you specify a large waiting time or a negative value, + * this function may crash the calling thread. + */ + bool WaitForStarted( int ms = 6000 ); + + /*! + * Waits for the running process to finish execution. + * + * \param ms Maximum waiting time in milliseconds. If a negative + * value is specified, this function will never time out. + * The default waiting time is 6000 ms (six seconds). + * + * This function suspends the calling task for at most the specified time, + * or forever if a negative time value is specified. Returns true if the + * process finished its execution before the specified time elapsed. Returns + * false if the process timed out. In the latter case, this function can be + * called again to continue waiting for the process to finish. + * + * \warning When called from the root thread, this function can freeze the + * entire PixInsight graphical interface. For asynchronous external process + * execution, consider calling WaitForXX() functions from a separate thread. + * Be aware that if you specify a large waiting time or a negative value, + * this function may crash the calling thread. + */ + bool WaitForFinished( int ms = 6000 ); + + /*! + * Waits for the running process to send data. + * + * \param ms Maximum waiting time in milliseconds. If a negative + * value is specified, this function will never time out. + * The default waiting time is 6000 ms (six seconds). + * + * This function suspends the calling task for at most the specified time, + * or forever if a negative time value is specified. Returns true if the + * process sent some data through one of its output streams (standard output + * or standard error) before the specified time elapsed. Returns false if + * the process timed out. In the latter case, this function can be called + * again to continue waiting for the process to generate output data. When + * new output data is available from the process, it can be read immediately + * by calling one of the Read() member functions. + * + * \warning When called from the root thread, this function can freeze the + * entire PixInsight graphical interface. For asynchronous external process + * execution, consider calling WaitForXX() functions from a separate thread. + * Be aware that if you specify a large waiting time or a negative value, + * this function may crash the calling thread. + */ + bool WaitForDataAvailable( int ms = 6000 ); + + /*! + * Waits for the running process to receive data. + * + * \param ms Maximum waiting time in milliseconds. If a negative + * value is specified, this function will never time out. + * The default waiting time is 6000 ms (six seconds). + * + * This function suspends the calling task for at most the specified time, + * or forever if a negative time value is specified. Returns true if the + * process received the data sent previously through its input stream (the + * process' standard input) before the specified time elapsed. + * Returns false if the process timed out. In the latter case, this function + * can be called again to continue waiting for the process to fetch its + * input data. Data can be sent to a running process by calling one of the + * Write() member functions. + * + * \warning When called from the root thread, this function can freeze the + * entire PixInsight graphical interface. For asynchronous external process + * execution, consider calling WaitForXX() functions from a separate thread. + * Be aware that if you specify a large waiting time or a negative value, + * this function may crash the calling thread. + */ + bool WaitForDataWritten( int ms = 6000 ); + + /*! + * Attempts to terminate the running process. + * + * On Linux/UNIX platforms (Linux, FreeBSD and Mac OS X) a SIGTERM signal is + * sent to the process. + * + * On Windows, this function sends WM_CLOSE messages to all top-level + * windows owned by the process and to its main thread. Console Windows + * applications that don't have a message loop, or GUI Windows applications + * that don't process WM_CLOSE messages adequately, cannot be terminated by + * calling this member function. In these cases, the only way to terminate + * the running process is by calling Kill(). + * + * \note Note that there is no guarantee that the running process will + * terminate after calling this function. + */ + void Terminate(); + + /*! + * Forces termination of the running process. + * + * On Linux/UNIX platforms (Linux, FreeBSD and Mac OS X) a SIGKILL signal is + * sent to the process. + * + * On Windows, the TerminateProcess() API function is called to force + * process termination. + * + * \warning Unconditional termination of processes is always risky and + * should be avoided. For example, the running program wil not have an + * opportunity to close open files or save modified data. This function + * should only be used as a last resort to terminate a process. + */ + void Kill(); + + /*! + * Closes the standard input stream (stdin) of the running process. + * + * After calling this function, you no longer can write to the process using + * one of the Write() member functions (doing so will always throw an Error + * exception due to an I/O error). + * + * There are programs that require you to close the input stream explicitly. + * An example is the 'cat' UNIX utility. For example, if you enter the 'cat' + * command from a UNIX terminal, the program starts reading data from its + * stdin stream (which is the terminal in this example) until you press the + * "Ctrl+D" combination to close it. + * + * \note This function can only be called for a running process. If the + * process is not running, an Error exception is thrown. + */ + void CloseStandardInput(); + + /*! + * Closes the standard output stream (stdout) of the running process. + * + * After calling this function, you no longer can read data from the process + * through its stdin stream. Calling this function can be useful to save + * memory for processes that generate large amounts of output data, or if a + * running process starts producing loads of data that you don't want to + * process anymore. + * + * \note This function can only be called for a running process. If the + * process is not running, an Error exception is thrown. + */ + void CloseStandardOutput(); + + /*! + * Closes the standard error stream (stderr) of the running process. + * + * After calling this function, you no longer can read data from the process + * through its stderr stream. Calling this function can be useful to save + * memory for processes that generate large amounts of output data, or if a + * running process starts producing loads of data that you don't want to + * process anymore. + * + * \note This function can only be called for a running process. If the + * process is not running, an Error exception is thrown. + */ + void CloseStandardError(); + + /*! + * Redirects the standard output stream (stdout) of the process to the + * specified file. + * + * \param filePath Path to the file where the process will write its + * standard output data. + * + * \param append If true and the specified file already exists, its + * contents will be preserved and newly generated data + * will be appended. If false, the existing file will be + * overwritten and its previous contents will be lost. The + * default value is false (overwrite). + * + * Example: + * + * \code + * ExternalProcess p1, p2; + * p1.RedirectStandardOutput( "/tmp/foo.txt" ); + * p1.Start( "ls", StringList() << "-la" << "*.bar" ); + * \endcode + * + * The above code snippet is equivalent to this command: + * + * ls -la *.bar >/tmp/foo.txt + * + * \note This member function can only be called before running the process, + * i.e. before calling Start(). Otherwise an Error exception is thrown. + */ + void RedirectStandardOutput( const String& filePath, bool append = false ); + + /*! + * Redirects the standard output stream (stdout) of the process to the + * specified process. + * + * \param process Reference to a process where this process will write + * its standard output data. + * + * This function can be used to build a \e pipe between two programs. For + * example: + * + * \code + * ExternalProcess p1, p2; + * p1.RedirectStandardOutput( p2 ); + * p1.Start( "cat", StringList() << "*.bar" ); + * p2.Start( "grep", StringList() << "\'foo\'" ); + * \endcode + * + * would produce the same result as this command: + * + * cat *.bar |grep 'foo' + * + * \note This member function can only be called before running both + * processes, i.e. before calling Start() for this process \e and the + * specified \a process. Otherwise an Error exception is thrown. + */ + void RedirectStandardOutput( ExternalProcess& process ); + + /*! + * Redirects the standard error output stream (stderr) of the process to the + * specified file. + * + * \param filePath Path to the file where the process will write its + * standard error data. + * + * \param append If true and the specified file already exists, its + * contents will be preserved and newly generated data + * will be appended. If false, the existing file will be + * overwritten and its previous contents will be lost. The + * default value is false (overwrite). + * + * For more information on redirection of process output, see the + * RedirectStandardOutput() functions. + */ + void RedirectStandardError( const String& filePath, bool append = false ); + + /*! + * Redirects the standard input stream (stdin) of the process from the + * specified file. + * + * \param filePath Path to an existing file from which the process will + * read its standard input data. The current contents of + * the file won't be modified or affected in any way by + * calling this function. + * + * Example: + * + * \code + * ExternalProcess p; + * p.RedirectStandardInput( "/tmp/foo.txt" ); + * p.Start( "grep", StringList() << "\'bar\'" ); + * \endcode + * + * The above code snippet is equivalent to this command: + * + * grep 'bar' \ + * + * \note This member function can only be called before running the process, + * i.e. before calling Start(). Otherwise an Error exception is thrown. + */ + void RedirectStandardInput( const String& filePath ); + + /*! + * Returns the working directory (aka folder) of this process. + */ + String WorkingDirectory() const; + + /*! + * Sets the working directory for this process. + * + * \param dirPath Path to an existing directory, which will be the + * working directory of the process when it is started. + * + * \note This member function can only be called before running the process, + * i.e. before calling Start(). Otherwise an Error exception is thrown. + */ + void SetWorkingDirectory( const String& dirPath ); + + /*! + * Returns true iff the process is running. An %ExternalProcess object + * represents a running process briefly (usually) after calling its Start() + * member function, when the IsStarting() function returns false, and just + * before an OnStarted() event is generated. + */ + bool IsRunning() const; + + /*! + * Returns true iff the process is starting. An %ExternalProcess object + * enters the starting state after calling its Start() member function, but + * before the actual process is running. + */ + bool IsStarting() const; + + /*! + * Returns true iff the running process has crashed. + */ + bool HasCrashed() const; + + /*! + * Returns the platform-dependent Process Identifier (PID) of the running + * process. See the ExternalProcess::pid_type type definition for more + * information. + * + * If the process is not running this member function returns zero. + */ + pid_type PID() const; + + /*! + * Returns the exit code of the finished process. This is normally the + * return value of the process' main() function. + */ + int ExitCode() const; + + /*! + * Returns the number of bytes waiting to be read from this running process. + * If the process is not running, this member function returns zero. + * + * When this function returns a nonzero value, the available data can be + * read by calling one of the Read() member functions. + */ + size_type BytesAvailable() const; + + /*! + * Returns the number of bytes pending to be written to this running + * process. If the process is not running, this function returns zero. + * + * If this function returns a nonzero value, it is because one of the + * Write() member functions has been called previously for this process with + * nonempty data. + */ + size_type BytesToWrite() const; + + /*! + * Reads all the data available from the standard output stream (stdout) of + * this process, and returns them as a ByteArray object. + * + * If the process has not sent any new data through its stdout stream, or if + * the process is not running, an empty %ByteArray is returned. Note that + * after the reading operation the stdout stream is cleared, i.e. the data + * can only be read once. + */ + ByteArray StandardOutput(); + + /*! + * Reads all the data available from the standard error stream (stderr) of + * this process, and returns them as a ByteArray object. + * + * If the process has not sent any new data through its stderr stream, or if + * the process is not running, an empty %ByteArray is returned. Note that + * after the reading operation the stderr stream is cleared, i.e. the data + * can only be read once. + */ + ByteArray StandardError(); + + /*! + * Reads all the data available from the standard output and standard error + * streams (stdout and stderr, respectively) of this process, and returns + * them as a ByteArray object. + * + * If the process has not sent any new data through its output streams, or + * if the process is not running, an empty %ByteArray is returned. Note that + * after the reading operation, both stdout and stderr streams are cleared, + * i.e. the data can only be read once. + * + * \note In the returned %ByteArray, the data from both stdout and stderr + * streams will be mixed because they are gathered as they are generated. If + * you need the data from both streams separately, call the StandardOutput() + * and StandardError() member functions as appropriate. + */ + ByteArray Read(); + + /*! + * Writes the specified \a data to the standard input stream (stdin) of this + * process. + */ + void Write( const ByteArray& data ); + + /*! + * Writes the specified \a text to the standard input stream (stdin) of this + * process. The specified UTF-16 string will be treated as a sequence of + * bytes, and the terminating null character of the string (two bytes) will + * be excluded. + */ + void Write( const String& text ); + + /*! + * Writes the specified \a text to the standard input stream (stdin) of this + * process. The specified 8-bit string will be treated as a sequence of + * bytes, and the terminating null character of the string will be excluded. + */ + void Write( const IsoString& text ); + + /*! + * Writes the specified \a text to the standard input stream (stdin) of this + * process. The specified 8-bit string will be treated as a sequence of + * bytes, and the terminating null character of the string will be excluded. + */ + void Write( const char* text ); + + /*! + * Writes \a count contiguous bytes starting at the specified \a data + * location to the standard input stream (stdin) of this process. + */ + void Write( const void* data, size_type count ); + + /*! + * Returns the list of environment variables for this process. Environment + * variables are 'name=value' items that most programs can interpret to + * modify their functionality. + * + * If no environment has been set for this process, an empty list is + * returned. + */ + StringList Environment() const; + + /*! + * Sets the \a environment for this process. + * + * The environment is a list of 'name=value' elements, knwon as + * environment variables, that most programs can interpret to + * modify their functionality. + * + * If no environment is explicitly set for a process, it will inherit the + * environment of the calling process. + * + * \note This member function can only be called before running the process, + * i.e. before calling Start(). Otherwise an Error exception is thrown. + */ + void SetEnvironment( const StringList& environment ); + + /*! + * \defgroup external_process_event_handlers ExternalProcess Event Handlers + */ + + /*! + * Defines the prototype of a process event handler. + * + * A process event is generated when an %ExternalProcess instance changes + * its state, or generates a simple notification. + * + * \param sender The object that sends a process event. + * + * \ingroup external_process_event_handlers + */ + typedef void (Control::*process_event_handler)( ExternalProcess& sender ); + + /*! + * Defines the prototype of a process exit event handler. + * + * A process exit event is generated when an %ExternalProcess instance + * notifies that a running process has finished execution. + * + * \param sender The object that sends a process exit event. + * + * \param exitCode The process' exit code. Typically, this is the return + * value of the main() function in the process. + * + * \param exitOk True if the process finished execution normally. False + * if the process crashed. + * + * \ingroup external_process_event_handlers + */ + typedef void (Control::*process_exit_event_handler)( ExternalProcess& sender, int exitCode, bool exitOk ); + + /*! + * Defines the prototype of a process error event handler. + * + * A process error event is generated when an %ExternalProcess instance + * reports an error condition, such as an I/O error, a nonexistent + * executable file or lack of execution permissions. + * + * \param sender The object that sends a process error event. + * + * \param error Identifies the error condition that generated the event. + * + * \ingroup external_process_event_handlers + */ + typedef void (Control::*process_error_event_handler)( ExternalProcess& sender, error_code error ); + + /*! + * Sets the handler for process started events generated by this + * %ExternalProcess object. A process started event is generated when the + * process has just started and is running. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive process started events + * from this object. + * + * \ingroup external_process_event_handlers + */ + void OnStarted( process_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for process finished events generated by this + * %ExternalProcess object. A process finished event is generated when the + * running process has just finished execution. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive process finished events + * from this object. + * + * \ingroup external_process_event_handlers + */ + void OnFinished( process_exit_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for stdout data available events generated by + * this %ExternalProcess object. These events are generated when the running + * process sends data through its standard output stream, and the data is + * ready to be read. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive stdout data available + * events from this object. + * + * \ingroup external_process_event_handlers + */ + void OnStandardOutputDataAvailable( process_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for stderr data available events generated by + * this %ExternalProcess object. These events are generated when the running + * process sends data through its standard error stream, and the data is + * ready to be read. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive stderr data available + * events from this object. + * + * \ingroup external_process_event_handlers + */ + void OnStandardErrorDataAvailable( process_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for process error events generated by this + * %ExternalProcess object. A process error event is generated when the + * process reports an error condition. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive process error events + * from this object. + * + * \ingroup external_process_event_handlers + */ + void OnError( process_error_event_handler handler, Control& receiver ); + + /*! + * Executes a program as a child process and waits for it to terminate. + * + * \param program Path to an existing executable file. + * + * \param arguments Optional list of command-line arguments that will be + * passed to the executable. Arguments containing spaces + * will be enclosed by quotes automatically. The default + * value is an empty list. + * + * Returns the program's exit code. If the specified \a program cannot be + * executed, this member function throws an Error exception. + */ + static int ExecuteProgram( const String& program, const StringList& arguments = StringList() ); + + /*! + * Executes a program as an independent process. + * + * \param program Path to an existing executable file. + * + * \param arguments Optional list of command-line arguments that will be + * passed to the executable. Arguments containing spaces + * will be enclosed by quotes automatically. The default + * value is an empty list. + * + * \param workingDirectory Path to an existing directory, which will be the + * working directory of the process. The default value is + * an empty string. + * + * The program is executed as a standalone process, also known as a + * \e daemon on Linux/UNIX. It can continue running after the calling + * application terminates. + * + * Returns the platform-dependent process identifier (PID) of the running + * process. If the specified \a program cannot be executed, this member + * function throws an Error exception. + */ + static pid_type StartProgram( const String& program, + const StringList& arguments = StringList(), + const String& workingDirectory = String() ); + +private: + + struct EventHandlers + { + process_event_handler onStarted = nullptr; + process_exit_event_handler onFinished = nullptr; + process_event_handler onStandardOutputDataAvailable = nullptr; + process_event_handler onStandardErrorDataAvailable = nullptr; + process_error_event_handler onError = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + ExternalProcess( void* ); + void* CloneHandle() const override; + + friend class ExternalProcessPrivate; + friend class ExternalProcessEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ExternalProcess_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ExternalProcess.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FFT1D.h b/3rdparty/include/pcl/FFT1D.h new file mode 100644 index 0000000..c6f84bb --- /dev/null +++ b/3rdparty/include/pcl/FFT1D.h @@ -0,0 +1,838 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FFT1D.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FFT1D_h +#define __PCL_FFT1D_h + +/// \file pcl/FFT1D.h + +/* + * The FFT routines used in this PCL version are based on the KISS FFT library + * by Mark Borgerding: http://sourceforge.net/projects/kissfft/ + * + * KISS FFT LICENSE INFORMATION + * ============================ + * + * Copyright (c) 2003-2013 Mark Borgerding + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the author nor the names of any contributors may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class FFT1DBase +{ +protected: + + static int OptimizedLength( int, fcomplex* ); + static int OptimizedLength( int, dcomplex* ); + static int OptimizedLength( int, float* ); + static int OptimizedLength( int, double* ); + + static void* Create( int, fcomplex* ); + static void* Create( int, dcomplex* ); + static void* Create( int, float* ); + static void* Create( int, double* ); + + static void* CreateInv( int, fcomplex* ); + static void* CreateInv( int, dcomplex* ); + static void* CreateInv( int, float* ); + static void* CreateInv( int, double* ); + + static void Destroy( void* ); + + static void Transform( void*, fcomplex*, const fcomplex* ); + static void Transform( void*, dcomplex*, const dcomplex* ); + static void Transform( void*, fcomplex*, const float* ); + static void Transform( void*, dcomplex*, const double* ); + static void Transform( void*, float*, const fcomplex* ); + static void Transform( void*, double*, const dcomplex* ); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fft_1d Fast Fourier Transform Direction Specifiers + */ + +/*! + * \def PCL_FFT_FORWARD + * \brief Indicates a Fourier transform. + * \ingroup fft_1d + */ +#define PCL_FFT_FORWARD -1 + +/*! + * \def PCL_FFT_BACKWARD + * \brief Indicates an inverse Fourier transform. + * \ingroup fft_1d + */ +#define PCL_FFT_BACKWARD +1 + +// ---------------------------------------------------------------------------- + +/*! + * \class AbstractFFT + * \brief Abstract base class of all fast Fourier transform classes + * + * The %AbstractFFT template class implements basic properties and functions + * shared by all %FFT PCL classes. + * + * \sa GenericFFT, GenericRealFFT + */ +template +class PCL_CLASS AbstractFFT : public FFT1DBase +{ +public: + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef T scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef Complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef GenericVector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef GenericVector complex_vector; + + /*! + * Represents the container type used to store an out-of-place discrete + * Fourier transform. + */ + typedef complex_vector transform; + + /*! + * Constructs an %AbstractFFT object of the specified \a length. + */ + AbstractFFT( int length ) + : m_length( length ) + { + } + + /*! + * Virtual destructor. + * + * Destroys all internal control structures in this %AbstractFFT object, + * including the current discrete Fourier transform, if it exists. + */ + virtual ~AbstractFFT() + { + Release(); + } + + /*! + * Returns the transform length of this %AbstractFFT object. The length is + * the number of data items that can be transformed, and is specified in the + * constructors of all %FFT classes. + */ + int Length() const + { + return m_length; + } + + /*! + * Returns a duplicate of the current discrete Fourier transform as a vector + * of complex values. + * + * For complex FFTs, the returned vector has Length() elements. For real + * transforms, the returned vector has Length()/2 + 1 elements. + * + * If no %FFT has been performed on this object, this function returns an + * empty vector. + */ + transform DFT() const + { + return m_dft; + } + + /*! + * Returns a reference to the mutable current discrete Fourier transform in + * this object. The transform is a vector of complex values. + * + * For complex FFTs, the returned vector has Length() elements. For real + * transforms, the returned vector has Length()/2 + 1 elements. + * + * If no %FFT has been performed on this object, this function returns a + * reference to an empty vector. + */ + transform& DFT() + { + return m_dft; + } + + /*! + * Returns a pointer to the immutable first element in the current discrete + * Fourier transform. The transform is a set of consecutive complex numbers + * stored at the address returned by this member function. + * + * For complex FFTs, the transform is a sequence of Length() elements. For + * real transforms, there are only Length()/2 + 1 elements. + * + * If no %FFT has been performed on this object, this member function + * returns zero. + */ + const complex* operator *() const + { + return *m_dft; + } + + /*! + * Returns a pointer to the mutable first element in the current discrete + * Fourier transform. The transform is a set of consecutive complex numbers + * stored at the address returned by this member function. + * + * For complex FFTs, the transform is a sequence of Length() elements. For + * real transforms, there are only Length()/2 + 1 elements. + * + * If no %FFT has been performed on this object, this member function + * returns zero. + */ + complex* operator *() + { + return *m_dft; + } + + /*! + * Destroys all internal control structures in this %AbstractFFT object, + * including the current discrete Fourier transform, if it exists. + */ + virtual void Release() + { + if ( m_handle != nullptr ) + this->Destroy( m_handle ), m_handle = nullptr; + if ( m_handleInv != nullptr ) + this->Destroy( m_handleInv ), m_handleInv = nullptr; + m_dft = transform(); + } + +private: + + int m_length; + +protected: + + mutable void* m_handle = nullptr; // Opaque pointers to internal control structures + mutable void* m_handleInv = nullptr; + transform m_dft; // DFT of complex or real data +}; + +// ---------------------------------------------------------------------------- + +#define m_handle this->m_handle +#define m_handleInv this->m_handleInv +#define m_dft this->m_dft +#define m_length this->Length() + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericFFT + * \brief Generic fast Fourier transform of complex data + * + * The %GenericFFT template class performs forward and inverse, out-of-place + * fast Fourier transforms of complex data. + * + * For fast Fourier transforms of real-valued data, see the GenericRealFFT + * template class. + * + * \sa AbstractFFT, GenericRealFFT + */ +template +class PCL_CLASS GenericFFT : public AbstractFFT +{ +public: + + /*! + * Identifies the base class of this %FFT class. + */ + typedef AbstractFFT base; + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef typename base::scalar scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef typename base::complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef typename base::vector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef typename base::complex_vector complex_vector; + + /*! + * Represents the container type used to store an out-of-place discrete + * Fourier transform. + */ + typedef typename base::transform transform; + + /*! + * Constructs a %GenericFFT object of the specified length \a n. + * + * The current PCL implementation supports FFTs of arbitrary length, but the + * underlying routines have been optimized for performance when the length + * of the input vector can be factorized as follows: + * + * n = 2^n2 * 3^n3 * 4^n4 * 5^n5 + * + * where n2, n3, n4, and n5 are arbitrary positive integers. For best + * performance, you should call GenericFFT::OptimizedLength() to get the + * smallest optimal length for your data, then place them on an array of the + * obtained length, padded with zeros. + */ + GenericFFT( int n ) + : base( n ) + { + } + + /*! + * Virtual destructor. + */ + virtual ~GenericFFT() + { + } + + /*! + * Fast Fourier transform. Performs the %FFT of the specified vector of + * complex values. + * + * The argument \a x must be the starting address of a contiguous block of + * at least Length() elements. + * + * Returns a reference to this object. + */ + GenericFFT& operator <<( const complex* x ) + { + if ( m_dft.IsEmpty() ) + m_dft = transform( m_length ); + if ( m_handle == nullptr ) + m_handle = this->Create( m_length, static_cast( nullptr ) ); + this->Transform( m_handle, *m_dft, x ); + return *this; + } + + /*! + * Inverse fast Fourier transform. Performs the inverse %FFT and stores the + * result in the specified vector of complex values. + * + * The argument \a y must be the starting address of a contiguous block of + * at least Length() elements. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericFFT& operator >>( complex* y ) const + { + if ( m_dft.IsEmpty() ) + throw Error( "Invalid out-of-place inverse FFT: No FFT has been performed." ); + if ( m_handleInv == nullptr ) + m_handleInv = this->CreateInv( m_length, static_cast( nullptr ) ); + this->Transform( m_handleInv, y, *m_dft ); + return *this; + } + + /*! + * Fast Fourier transform. Performs the %FFT of a vector of complex values. + * + * The specified vector \a x must have at least Length() elements. Otherwise + * an Error exception will be thrown. + * + * Returns a reference to this object. + */ + GenericFFT& operator <<( const complex_vector& x ) + { + PCL_PRECONDITION( x.Length() >= m_length ) + if ( x.Length() < m_length ) + throw Error( "Invalid FFT input vector length." ); + return operator <<( *x ); + } + + /*! + * Inverse fast Fourier transform. Performs the inverse %FFT and stores the + * result in a vector of complex values. + * + * The specified vector \a y must have at least Length() elements. Otherwise + * an Error exception will be thrown. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericFFT& operator >>( complex_vector& y ) const + { + if ( y.Length() < m_length ) + throw Error( "Invalid FFT output vector length." ); + return operator >>( *y ); + } + + /*! + * Performs the forward or inverse %FFT of an input vector of complex + * values, and stores the result in a caller-supplied output vector. + * + * \param[in] x Input vector. Must be the starting address of a contiguous + * sequence of at least Length() complex numbers. + * + * \param[out] y Output vector, where the result of the transform will be + * stored. Must be the starting address of a contiguous + * sequence of at least Length() complex numbers. + * + * \param dir Indicates the direction of the Fourier transform:\n + * \n + * + * + * + *
PCL_FFT_FORWARD The direct FFT is calculated.
PCL_FFT_BACKWARD The inverse FFT is calculated.
\n + * \n + * This parameter is optional; the default value is + * PCL_FFT_FORWARD. + * + * The specified arguments \a x and \a y must be the starting addresses of + * two different, non-overlapping contiguous blocks of at least Length() + * elements. + * + * This member function does not change the current Fourier transform in + * this object, if it exists. + * + * Returns a reference to this object. + */ + GenericFFT& operator()( complex* y, const complex* x, int dir = PCL_FFT_FORWARD ) const + { + if ( dir == PCL_FFT_BACKWARD ) + { + if ( m_handleInv == nullptr ) + m_handleInv = this->CreateInv( m_length, static_cast( nullptr ) ); + this->Transform( m_handleInv, y, x ); + } + else + { + if ( m_handle == nullptr ) + m_handle = this->Create( m_length, static_cast( nullptr ) ); + this->Transform( m_handle, y, x ); + } + return const_cast( *this ); + } + + /*! + * Returns the optimized complex %FFT length larger than or equal to + * a given length \a n. The returned length will be optimal to perform a + * %FFT of complex data with the current PCL implementation. The optimized + * length can be used as the argument to the constructor of any %FFT class for + * complex data transforms. + */ + static int OptimizedLength( int n ) + { + return FFT1DBase::OptimizedLength( n, static_cast( nullptr ) ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericRealFFT + * \brief Generic fast Fourier transform of real data + * + * The %GenericRealFFT template class performs forward and inverse, + * out-of-place fast Fourier transforms of real-valued data. For real data in + * the time domain, this class performs nearly twice as fast as Fourier + * transform classes for complex data. + * + * For fast Fourier transforms of complex-valued data, see the GenericFFT + * template class. + * + * \sa AbstractFFT, GenericFFT + */ +template +class PCL_CLASS GenericRealFFT : public AbstractFFT +{ +public: + + /*! + * Identifies the base class of this %FFT class. + */ + typedef AbstractFFT base; + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef typename base::scalar scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef typename base::complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef typename base::vector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef typename base::complex_vector complex_vector; + + /*! + * Represents the container type used to store an out-of-place discrete + * Fourier transform. + */ + typedef typename base::transform transform; + + /*! + * Constructs a %GenericRealFFT object of the specified \a length. + * + * The current PCL implementation supports FFTs for real data of any even + * length, but the underlying routines have been optimized for performance + * when the length of the input vector can be factorized as follows: + * + * n = 2^n2 * 3^n3 * 4^n4 * 5^n5 + * + * where n2, n3, n4, and n5 are arbitrary positive integers, and n is an + * even integer. For best performance, you should call + * GenericRealFFT::OptimizedLength() to get the smallest optimal length for + * your real data, then place them on an array of the obtained length, + * padded with zeros. + * + * \note We stress the fact that the specified \a length must be an \e even + * integer. + */ + GenericRealFFT( int length ) + : base( length ) + { + PCL_PRECONDITION( (length & 1) == 0 ) + } + + /*! + * Virtual destructor. + */ + virtual ~GenericRealFFT() + { + } + + /*! + * Fast Fourier transform. Performs the %FFT of the specified vector of + * real numbers. + * + * The argument \a x must be the starting address of a contiguous block of + * at least Length() scalars. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator <<( const scalar* x ) + { + if ( m_dft.IsEmpty() ) + m_dft = transform( m_length/2 + 1 ); + if ( m_handle == nullptr ) + m_handle = this->Create( m_length, static_cast( nullptr ) ); + this->Transform( m_handle, *m_dft, x ); + return *this; + } + + /*! + * Inverse fast Fourier transform. Performs the inverse %FFT and stores the + * result in the specified vector of real values. + * + * The value of \a y must be the starting address of a contiguous block of + * at least Length() elements. + * + * If no %FFT has been performed for this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator >>( scalar* y ) const + { + if ( m_dft.IsEmpty() ) + throw Error( "Invalid out-of-place inverse FFT: No FFT has been performed." ); + if ( m_handleInv == nullptr ) + m_handleInv = this->CreateInv( m_length, static_cast( nullptr ) ); + this->Transform( m_handleInv, y, *m_dft ); + return *this; + } + + /*! + * Fast Fourier transform. Performs the %FFT of a vector of real numbers. + * + * The specified vector \a x must have at least Length() elements. Otherwise + * an Error exception will be thrown. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator <<( const vector& x ) + { + if ( x.Length() < m_length ) + throw Error( "Invalid FFT input vector length." ); + return operator <<( *x ); + } + + /*! + * Inverse fast Fourier transform. Performs the inverse %FFT and stores the + * result in the specified vector of real values. + * + * The specified vector \a y must have at least Length() elements. Otherwise + * an Error exception will be thrown. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator >>( vector& y ) const + { + if ( y.Length() < m_length ) + throw Error( "Invalid FFT output vector length." ); + return operator >>( *y ); + } + + /*! + * Performs the %FFT of an input vector of real numbers, and stores the + * result in a caller-supplied output vector of complex values. + * + * \param[in] x Input vector. Must be the starting address of a contiguous + * sequence of at least Length() scalars. + * + * \param[out] y Output vector, where the result of the transform will be + * stored. Must be the starting address of a contiguous + * sequence of at least Length()/2 + 1 complex numbers. + * + * The specified arguments \a x and \a y must be the starting addresses of + * two different, non-overlapping contiguous blocks of data. The output + * transform will be a sequence of Length()/2 + 1 complex numbers. + * + * This member function does not change the current Fourier transform in + * this object, if any. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator()( complex* y, const scalar* x ) const + { + if ( m_handle == nullptr ) + m_handle = this->Create( m_length, static_cast( nullptr ) ); + this->Transform( m_handle, y, x ); + return const_cast( *this ); + } + + /*! + * Performs the inverse %FFT of an input vector of complex numbers, and + * stores the result in a caller-supplied output vector of real values. + * + * \param[in] x Input vector. Must be the starting address of a contiguous + * sequence of at least Length()/2 + 1 complex numbers, + * corresponding to a discrete real Fourier transform of + * length Length(). + * + * \param[out] y Output vector, where the result of the inverse transform + * will be stored. Must be the starting address of a + * contiguous sequence of at least Length() real numbers. + * + * The specified arguments \a x and \a y must be the starting addresses of + * two different, non-overlapping contiguous blocks of data. The input + * transform must be a sequence of Length()/2 + 1 complex numbers. The + * output inverse transform will be a sequence of Length() real numbers. + * + * This member function does not change the current Fourier transform in + * this object, if any. + * + * Returns a reference to this object. + */ + GenericRealFFT& operator()( scalar* y, const complex* x ) const + { + if ( m_handleInv == nullptr ) + m_handleInv = this->CreateInv( m_length, static_cast( nullptr ) ); + this->Transform( m_handleInv, y, x ); + return const_cast( *this ); + } + + /*! + * Returns the optimized real %FFT length larger than or equal to a + * given length \a n. The returned length will be optimal to perform a %FFT + * of real data with the current PCL implementation. The optimized length + * can be used as the argument to the constructor of any %FFT class for + * real data transforms. + */ + static int OptimizedLength( int n ) + { + return FFT1DBase::OptimizedLength( n, static_cast( nullptr ) ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_handle +#undef m_handleInv +#undef m_dft +#undef m_length + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_FFT1D_INSTANTIATE + +/*! + * \defgroup fft_types_1d Fast Fourier Transforms + */ + +/*! + * \class pcl::FFFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 32-bit floating point complex data. + * + * %FFFT is a template instantiation of GenericFFT for the \c float type. + */ +typedef GenericFFT FFFT; + +/*! + * \class pcl::DFFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 64-bit floating point complex data. + * + * %DFFT is a template instantiation of GenericFFT for the \c double type. + */ +typedef GenericFFT DFFT; + +/*! + * \class pcl::FRealFFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 32-bit floating point real data. + * + * %FRealFFT is a template instantiation of GenericRealFFT for \c float. + */ +typedef GenericRealFFT FRealFFT; + +/*! + * \class pcl::DRealFFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 64-bit floating point real data. + * + * %DRealFFT is a template instantiation of GenericRealFFT for \c double. + */ +typedef GenericRealFFT DRealFFT; + +/*! + * \class pcl::FFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 32-bit floating point complex data. + * + * %FFT is an alias for FFFT. It is a template instantiation of GenericFFT for + * the \c float type. + */ +typedef FFFT FFT; + +/*! + * \class pcl::RealFFT + * \ingroup fft_types_1d + * \brief Fast Fourier transform of 32-bit floating point real data. + * + * %RealFFT is an alias for FRealFFT. It is a template instantiation of + * GenericRealFFT for the \c float type. + */ +typedef FRealFFT RealFFT; + +#endif // __PCL_NO_FFT1D_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FFT1D_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FFT1D.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FFT2D.h b/3rdparty/include/pcl/FFT2D.h new file mode 100644 index 0000000..abe35fa --- /dev/null +++ b/3rdparty/include/pcl/FFT2D.h @@ -0,0 +1,869 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FFT2D.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FFT2D_h +#define __PCL_FFT2D_h + +/// \file pcl/FFT2D.h + +/* + * The FFT routines used in this PCL version are based on the KISS FFT library + * by Mark Borgerding: http://sourceforge.net/projects/kissfft/ + * + * KISS FFT LICENSE INFORMATION + * ============================ + * + * Copyright (c) 2003-2009 Mark Borgerding + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the author nor the names of any contributors may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class FFT2DBase +{ +protected: + + static void Transform( int, int, fcomplex*, const fcomplex*, int, StatusMonitor*, bool, int ); + static void Transform( int, int, dcomplex*, const dcomplex*, int, StatusMonitor*, bool, int ); + static void Transform( int, int, fcomplex*, const float*, StatusMonitor*, bool, int ); + static void Transform( int, int, dcomplex*, const double*, StatusMonitor*, bool, int ); + static void Transform( int, int, float*, const fcomplex*, StatusMonitor*, bool, int ); + static void Transform( int, int, double*, const dcomplex*, StatusMonitor*, bool, int ); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class AbstractFFT2D + * \brief Abstract base class of all two-dimensional fast Fourier transform classes + * + * The %AbstractFFT2D template class implements basic properties and functions + * shared by all 2-D %FFT PCL classes. + * + * \sa GenericFFT2D, GenericRealFFT2D + */ +template +class PCL_CLASS AbstractFFT2D : public FFT2DBase, public ParallelProcess +{ +public: + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef T scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef Complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef GenericVector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef GenericVector complex_vector; + + /*! + * Represents a real matrix. + */ + typedef GenericMatrix matrix; + + /*! + * Represents a complex matrix. + */ + typedef GenericMatrix complex_matrix; + + /*! + * Represents a discrete Fourier transform matrix. + */ + typedef complex_matrix transform; + + /*! + * Constructs an %AbstractFFT2D object of the specified dimensions + * \a rows and \a cols. + */ + AbstractFFT2D( int rows, int cols ) + : m_rows( rows ) + , m_cols( cols ) + { + } + + /*! + * Constructs an %AbstractFFT2D object of the specified dimensions + * \a rows and \a cols, using the specified status \a monitor object. + * + * On each transform performed with this object, the status monitor will be + * incremented by the sum of transform dimensions: \a rows + \a cols. + */ + AbstractFFT2D( int rows, int cols, StatusMonitor& monitor ) + : m_rows( rows ) + , m_cols( cols ) + , m_monitor( &monitor ) + { + } + + /*! + * Virtual destructor. + * + * Destroys all internal control structures in this %AbstractFFT2D object, + * including the current discrete Fourier transform, if exists. + */ + virtual ~AbstractFFT2D() + { + Release(); + } + + /*! + * Returns the number of rows in the 2-D transform of this %AbstractFFT2D + * object. Transform dimensions are specified in the constructors of all 2-D + * %FFT classes. + */ + int Rows() const + { + return m_rows; + } + + /*! + * Returns the number of columns in the 2-D transform of this %AbstractFFT2D + * object. Transform dimensions are specified in the constructors of all 2-D + * %FFT classes. + */ + int Cols() const + { + return m_cols; + } + + /*! + * Returns the total number of matrix elements in the 2-D data set of this + * %AbstractFFT2D object, or Rows() multiplied by Cols(). The dimensions are + * specified in the constructors of all 2-D %FFT classes. + */ + int NumberOfElements() const + { + return m_rows*m_cols; + } + + /*! + * Returns a duplicate of the current discrete Fourier transform as a matrix + * of complex values. + * + * For complex data transforms, the returned matrix has Rows()*Cols() + * elements. For real data, the returned matrix has Rows()*(Cols()/2 + 1) + * elements. + * + * If no %FFT has been performed on this object, this function returns an + * empty matrix. + */ + transform DFT() const + { + return m_dft; + } + + /*! + * Returns a non-const reference to the current discrete Fourier transform + * in this object. The transform is a matrix of complex values. + * + * For complex data transforms, the returned matrix has Rows()*Cols() + * elements. For real data, the returned matrix has Rows()*(Cols()/2 + 1) + * elements. + * + * If no %FFT has been performed on this object, this function returns a + * reference to an empty matrix. + */ + transform& DFT() + { + return m_dft; + } + + /*! + * Destroys all internal control structures in this %FFT object, including + * the current Fourier transform, if exists. + */ + virtual void Release() + { + m_dft = transform(); + } + +private: + + // Transform dimensions + int m_rows; + int m_cols; + +protected: + + transform m_dft; // DFT of complex or real data + StatusMonitor* m_monitor = nullptr; +}; + +// ---------------------------------------------------------------------------- + +#define m_dft this->m_dft +#define m_rows this->Rows() +#define m_cols this->Cols() +#define m_monitor this->m_monitor +#define m_parallel this->m_parallel +#define m_maxProcessors this->m_maxProcessors + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericFFT2D + * \brief Generic two-dimensional fast Fourier transform of complex data + * + * The %GenericFFT2D template class performs two-dimensional forward and + * inverse, out-of-place fast Fourier transforms of complex data. + * + * For fast Fourier transforms of 2-D real-valued data, see the + * GenericRealFFT2D template class. + * + * \sa AbstractFFT2D, GenericRealFFT2D + */ +template +class PCL_CLASS GenericFFT2D : public AbstractFFT2D +{ +public: + + /*! + * Identifies the base class of this %FFT class. + */ + typedef AbstractFFT2D base; + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef typename base::scalar scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef typename base::complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef typename base::vector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef typename base::complex_vector complex_vector; + + /*! + * Represents a real matrix. + */ + typedef typename base::matrix matrix; + + /*! + * Represents a complex matrix. + */ + typedef typename base::complex_matrix complex_matrix; + + /*! + * Represents a discrete Fourier transform matrix. + */ + typedef typename base::transform transform; + + /*! + * Constructs a %GenericFFT2D object of the specified dimensions \a rows and + * \a cols. + * + * The current PCL implementation supports FFTs of arbitrary length, but the + * underlying routines have been optimized for performance when the length + * of the input vector can be factorized as follows: + * + * n = 2^n2 * 3^n3 * 4^n4 * 5^n5 + * + * where n2, n3, n4, and n5 are arbitrary positive integers. For best + * performance, you should call GenericFFT2D::OptimizedLength() to get the + * smallest optimal dimensions for your data, then place them on a matrix of + * the obtained dimensions, padded with zeros. + */ + GenericFFT2D( int rows, int cols ) + : base( rows, cols ) + { + } + + /*! + * Constructs a %GenericFFT2D object of the specified dimensions \a rows and + * \a cols, using the specified status monitoring object \a status. + * + * On each transform performed with this object, the status m_monitor will be + * incremented by the sum of transform dimensions: \a rows + \a cols. + * + * See the GenericFFT2D( int, int ) constructor for more information. + */ + GenericFFT2D( int rows, int cols, StatusMonitor& status ) + : base( rows, cols, status ) + { + } + + /*! + * Virtual destructor. + */ + virtual ~GenericFFT2D() + { + } + + /*! + * Fast Fourier transform. Performs the two-dimensional %FFT of the + * specified matrix of complex values. + * + * The argument \a x must be the starting address of a contiguous block of + * at least NumberOfElements() elements, stored in row order: all elements + * of the first matrix row followed by all elements of the second row, and + * so on. + * + * Returns a reference to this object. + */ + GenericFFT2D& operator <<( const complex* x ) + { + if ( m_dft.IsEmpty() ) + m_dft = transform( m_rows, m_cols ); + this->Transform( m_rows, m_cols, *m_dft, x, PCL_FFT_FORWARD, m_monitor, m_parallel, m_maxProcessors ); + return *this; + } + + /*! + * Inverse fast Fourier transform. Performs the two-dimensional inverse %FFT + * and stores the result in the specified matrix of complex values. + * + * The argument \a y must be the starting address of a contiguous block of + * at least NumberOfElements() elements. The result matrix will be stored in + * row order: all elements of the first matrix row followed by all elements + * of the second row, and so on. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericFFT2D& operator >>( complex* y ) const + { + if ( m_dft.IsEmpty() ) + throw Error( "Invalid out-of-place inverse FFT: No FFT has been performed." ); + this->Transform( m_rows, m_cols, y, *m_dft, PCL_FFT_BACKWARD, m_monitor, m_parallel, m_maxProcessors ); + return *this; + } + + /*! + * Fast Fourier transform. Performs the two-dimensional %FFT of a matrix of + * complex values. + * + * The specified matrix \a x must have Rows() and Cols() dimensions. + * Otherwise an Error exception will be thrown. + * + * Returns a reference to this object. + */ + GenericFFT2D& operator <<( const complex_matrix& x ) + { + PCL_PRECONDITION( x.Rows() == m_rows ) + PCL_PRECONDITION( x.Cols() == m_cols ) + if ( x.Rows() != m_rows || x.Cols() != m_cols ) + throw Error( "Invalid FFT input matrix dimensions." ); + return operator <<( *x ); + } + + /*! + * Inverse fast Fourier transform. Performs the two-dimensional inverse %FFT + * and stores the result in a matrix of complex values. + * + * The specified matrix \a y must have Rows() and Cols() dimensions. + * Otherwise an Error exception will be thrown. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericFFT2D& operator >>( complex_matrix& y ) const + { + PCL_PRECONDITION( y.Rows() == m_rows ) + PCL_PRECONDITION( y.Cols() == m_cols ) + if ( y.Rows() != m_rows || y.Cols() != m_cols ) + throw Error( "Invalid FFT output matrix dimensions." ); + return operator >>( *y ); + } + + /*! + * Performs the forward or inverse two-dimensional %FFT of an input matrix + * of complex values, and stores the result in a caller-supplied output + * matrix. + * + * \param[in] x Input matrix. Must be the starting address of a contiguous + * sequence of at least NumberOfElements() complex numbers, + * stored in row order: all elements of the first row + * followed by all elements of the second row, and so on. + * + * \param[out] y Output matrix, where the result of the transform will be + * stored. Must be the starting address of a contiguous + * sequence of at least NumberOfElements() complex numbers. + * The result will be stored in row order: all elements of + * the first row followed by all elements of the second row, + * and so on. + * + * \param dir Indicates the direction of the Fourier transform:\n + * \n + * + * + * + *
PCL_FFT_FORWARD The FFT is calculated.
PCL_FFT_BACKWARD The inverse FFT is calculated.
\n + * \n + * This parameter is optional; the default value is + * PCL_FFT_FORWARD. + * + * This member function does not change the current Fourier transform in + * this object, if it exists. + * + * Returns a reference to this object. + */ + GenericFFT2D& operator ()( complex* y, const complex* x, int dir = PCL_FFT_FORWARD ) const + { + this->Transform( m_rows, m_cols, y, x, dir, m_monitor, m_parallel, m_maxProcessors ); + return const_cast( *this ); + } + + /*! + * Returns the optimized complex %FFT length larger than or equal to + * a given length \a n. The returned length will be optimal to perform a + * %FFT of complex data with the current PCL implementation. The optimized + * length can be used as the \a rows or \a cols argument to the constructor + * of any two-dimensional %FFT class for complex data transforms. + */ + static int OptimizedLength( int n ) + { + return GenericFFT::OptimizedLength( n ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericRealFFT2D + * \brief Generic two-dimensional fast Fourier transform of real data + * + * The %GenericRealFFT2D template class performs forward and inverse, + * out-of-place fast two-dimensional Fourier transforms of real-valued data. + * For real data in the time domain, this class performs nearly twice as fast + * as Fourier transform classes for complex data. + * + * For two-dimensional fast Fourier transforms of complex-valued data, see the + * GenericFFT2D template class. + * + * \sa AbstractFFT2D, GenericFFT2D + */ +template +class PCL_CLASS GenericRealFFT2D : public AbstractFFT2D +{ +public: + + /*! + * Identifies the base class of this %FFT class. + */ + typedef AbstractFFT2D base; + + /*! + * Represents a scalar in the context of this %FFT class. + */ + typedef typename base::scalar scalar; + + /*! + * Represents a complex number in the context of this %FFT class. + */ + typedef typename base::complex complex; + + /*! + * Represents a vector of real numbers. + */ + typedef typename base::vector vector; + + /*! + * Represents a vector of complex numbers. + */ + typedef typename base::complex_vector complex_vector; + + /*! + * Represents a real matrix. + */ + typedef typename base::matrix matrix; + + /*! + * Represents a complex matrix. + */ + typedef typename base::complex_matrix complex_matrix; + + /*! + * Represents a discrete Fourier transform matrix. + */ + typedef typename base::transform transform; + + /*! + * Constructs a %GenericRealFFT2D object of the specified dimensions \a rows + * and \a cols. + * + * The current PCL implementation supports FFTs for real data of any even + * length, but the underlying routines have been optimized for performance + * when the length of the input vector can be factorized as follows: + * + * n = 2^n2 * 3^n3 * 4^n4 * 5^n5 + * + * where n2, n3, n4, and n5 are arbitrary positive integers, and n is an + * even integer. For best performance, you should call + * GenericRealFFT2D::OptimizedLength() to get the smallest optimal + * dimensions for your real-valued data, then place them on a matrix of the + * obtained dimensions, padded with zeros. + * + * \note We stress the fact that the specified dimensions \a rows and + * \a cols must be \e even integer numbers. + */ + GenericRealFFT2D( int rows, int cols ) + : base( rows, cols ) + { + } + + /*! + * Constructs a %GenericRealFFT2D object of the specified dimensions \a rows + * and \a cols, using the specified status monitoring object \a status. + * + * On each transform performed with this object, the status m_monitor will be + * incremented by the sum of transform dimensions: \a rows + \a cols. + * + * See the GenericRealFFT2D( int, int ) constructor for more information. + */ + GenericRealFFT2D( int rows, int cols, StatusMonitor& status ) + : base( rows, cols, status ) + { + } + + /*! + * Virtual destructor. + */ + virtual ~GenericRealFFT2D() + { + } + + /*! + * Fast Fourier transform. Performs the two-dimensional %FFT of the + * specified matrix of real values. + * + * The argument \a x must be the starting address of a contiguous block of + * at least NumberOfElements() elements, stored in row order: all elements + * of the first matrix row followed by all elements of the second row, and + * so on. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator <<( const scalar* x ) + { + if ( m_dft.IsEmpty() ) + m_dft = transform( m_rows, m_cols/2 + 1 ); + this->Transform( m_rows, m_cols, *m_dft, x, m_monitor, m_parallel, m_maxProcessors ); + return *this; + } + + /*! + * Inverse fast Fourier transform. Performs the two-dimensional inverse %FFT + * and stores the result in the specified matrix of real values. + * + * The argument \a y must be the starting address of a contiguous block of + * at least NumberOfElements() elements. The result matrix will be stored in + * row order: all elements of the first matrix row followed by all elements + * of the second row, and so on. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator >>( scalar* y ) const + { + if ( m_dft.IsEmpty() ) + throw Error( "Invalid out-of-place inverse FFT: No FFT has been performed." ); + this->Transform( m_rows, m_cols, y, *m_dft, m_monitor, m_parallel, m_maxProcessors ); + return *this; + } + + /*! + * Fast Fourier transform. Performs the two-dimensional %FFT of a matrix of + * real numbers. + * + * The specified matrix \a x must have Rows() and Cols() dimensions. + * Otherwise an Error exception will be thrown. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator <<( const matrix& x ) + { + PCL_PRECONDITION( x.Rows() == m_rows ) + PCL_PRECONDITION( x.Cols() == m_cols ) + if ( x.Rows() != m_rows || x.Cols() != m_cols ) + throw Error( "Invalid FFT input matrix dimensions." ); + return operator <<( *x ); + } + + /*! + * Inverse fast Fourier transform. Performs the two-dimensional inverse %FFT + * and stores the result in a matrix of real numbers. + * + * The specified matrix \a y must have Rows() and Cols() dimensions. + * Otherwise an Error exception will be thrown. + * + * If no %FFT has been performed on this object (by a previous call to + * operator <<()), this member function throws an Error exception. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator >>( matrix& y ) const + { + PCL_PRECONDITION( y.Rows() == m_rows ) + PCL_PRECONDITION( y.Cols() == m_cols ) + if ( y.Rows() != m_rows || y.Cols() != m_cols ) + throw Error( "Invalid FFT output matrix dimensions." ); + return operator >>( *y ); + } + + /*! + * Performs the two-dimensional %FFT of an input matrix of real numbers, and + * stores the result in an output matrix of complex numbers. + * + * \param[in] x Input matrix. Must be the starting address of a contiguous + * sequence of at least NumberOfElements() real numbers, + * stored in row order: all elements of the first row + * followed by all elements of the second row, and so on. + * + * \param[out] y Output matrix, where the result of the transform will be + * stored. Must be the starting address of a contiguous + * sequence of at least Rows()*(Cols()/2 + 1) complex + * numbers. The result will be stored in row order: all + * elements of the first row followed by all elements of the + * second row, and so on, where each row has Cols()/2 + 1 + * complex numbers. + * + * The output matrix will have Rows() rows and Cols()/2 + 1 columns, stored + * in row order. + * + * This member function does not change the current Fourier transform in + * this object, if it exists. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator()( complex* y, const scalar* x ) const + { + this->Transform( m_rows, m_cols, y, x, m_monitor, m_parallel, m_maxProcessors ); + return const_cast( *this ); + } + + /*! + * Performs the inverse two-dimensional %FFT of an input matrix of complex + * numbers, and stores the result in an output matrix of real numbers. + * + * \param[in] x Input matrix. Must be the starting address of a contiguous + * sequence of at least Rows()*(Cols()/2 + 1) complex + * numbers, stored in row order: all elements of the first + * row followed by all elements of the second row, and so on, + * where each row must have Cols()/2 + 1 complex numbers. + * + * \param[out] y Output matrix, where the result of the transform will be + * stored. Must be the starting address of a contiguous + * sequence of at least NumberOfElements() real numbers. The + * result will be stored in row order: all elements of the + * first row followed by all elements of the second row, and + * so on. + * + * The input matrix must have Rows() rows and Cols()/2 + 1 columns, stored + * in row order. + * + * This member function does not change the current Fourier transform in + * this object, if it exists. + * + * Returns a reference to this object. + */ + GenericRealFFT2D& operator()( scalar* y, const complex* x ) const + { + this->Transform( m_rows, m_cols, y, x, m_monitor, m_parallel, m_maxProcessors ); + return const_cast( *this ); + } + + /*! + * Returns the optimized complex %FFT length larger than or equal to + * a given length \a n. The returned length will be optimal to perform a + * %FFT of real data with the current PCL implementation. The optimized + * length can be used as the \a rows or \a cols argument to the constructor + * of any two-dimensional %FFT class for real-valued data transforms. + */ + static int OptimizedLength( int n ) + { + return GenericFFT::OptimizedLength( n ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_dft +#undef m_rows +#undef m_cols +#undef m_monitor +#undef m_parallel +#undef m_maxProcessors + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fft_2d Two-Dimensional Fast Fourier Transforms + */ + +#ifndef __PCL_NO_FFT2D_INSTANTIATE + +/*! + * \class pcl::FFFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 32-bit floating point complex data. + * + * %FFFT2D is a template instantiation of GenericFFT2D for the \c float type. + */ +typedef GenericFFT2D FFFT2D; + +/*! + * \class pcl::DFFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 64-bit floating point complex data. + * + * %DFFT2D is a template instantiation of GenericFFT2D for the \c double type. + */ +typedef GenericFFT2D DFFT2D; + +/*! + * \class pcl::FRealFFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 32-bit floating point real data. + * + * %FRealFFT2D is a template instantiation of GenericRealFFT2DT for \c float. + */ +typedef GenericRealFFT2D FRealFFT2D; + +/*! + * \class pcl::DRealFFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 64-bit floating point real data. + * + * %DRealFFT2D is a template instantiation of GenericRealFFT2D for \c double. + */ +typedef GenericRealFFT2D DRealFFT2D; + +/*! + * \class pcl::FFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 32-bit floating point complex data. + * + * %FFT2D is an alias for FFFT2D. It is a template instantiation of + * GenericFFT2D for the \c float type. + */ +typedef FFFT2D FFT2D; + +/*! + * \class pcl::RealFFT2D + * \ingroup fft_2d + * \brief Fast Fourier transform of 32-bit floating point real data. + * + * %RealFFT2D is an alias for FRealFFT2D. It is a template instantiation of + * GenericRealFFT2D for the \c float type. + */ +typedef FRealFFT2D RealFFT2D; + +#endif // __PCL_NO_FFT2D_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FFT2D_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FFT2D.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FFTConvolution.h b/3rdparty/include/pcl/FFTConvolution.h new file mode 100644 index 0000000..f8c170a --- /dev/null +++ b/3rdparty/include/pcl/FFTConvolution.h @@ -0,0 +1,477 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FFTConvolution.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FFTConvolution_h +#define __PCL_FFTConvolution_h + +/// \file pcl/FFTConvolution.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup convolution_speed_limits Helper Functions for Selection of + * Convolution Algorithms + */ + +/*! + * \class FFTConvolution + * \brief Fourier-based two-dimensional convolution in the spatial domain + * + * %FFTConvolution implements a fully multithreaded, two-dimensional discrete + * convolution algorithm via fast Fourier transforms. It performs automatic + * fixing of border artifacts by applying Neumann boundary conditions + * (mirroring), and is able to convolve images and response functions of + * arbitrary sizes, only limited by the available memory. + * + * \sa Convolution, SeparableConvolution +*/ +class PCL_CLASS FFTConvolution : public ImageTransformation, public ParallelProcess +{ +public: + + /*! + * Default constructor. + * + * \note This constructor yields an uninitialized instance that cannot be + * used before explicit association with a response function, specified + * either as a KernelFilter object or as an ImageVariant. + */ + FFTConvolution() = default; + + /*! + * Constructs an %FFTConvolution instance with the specified kernel filter. + * + * \param filter Response function, or convolution filter. The + * specified object does not have to remain valid while this + * %FFTConvolution instance is actively used, since it owns a + * private copy of the filter (note that KernelFilter is a + * reference-counted class). + */ + FFTConvolution( const KernelFilter& filter ) + : m_filter( filter.Clone() ) + { + PCL_CHECK( bool( m_filter ) ) + } + + /*! + * Constructs an %FFTConvolution instance with the specified response + * function image. + * + * \param f A reference to an ImageVariant whose transported image is the + * response function, or convolution filter. + * The transported image must remain valid while this + * %FFTConvolution instance is actively used, or until a new + * response function is associated with this instance. The + * specified %ImageVariant doesn't have to remain valid, since a + * %FFTConvolution instance owns a private %ImageVariant that + * transports the response function image. + */ + FFTConvolution( const ImageVariant& f ) + : m_image( f ) + { + PCL_CHECK( bool( m_image ) ) + } + + /*! + * Copy constructor. + */ + FFTConvolution( const FFTConvolution& x ) + : ImageTransformation( x ) + , ParallelProcess( x ) + , m_image( x.m_image ) + , m_outputRealCmp( x.m_outputRealCmp ) + { + if ( x.m_filter ) + m_filter = x.m_filter->Clone(); + } + + /*! + * Move constructor. + */ + FFTConvolution( FFTConvolution&& ) = default; + + /*! + * Destroys this %FFTConvolution object. + */ + virtual ~FFTConvolution() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + FFTConvolution& operator =( const FFTConvolution& x ) + { + if ( &x != this ) + { + (void)ImageTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + DestroyFilter(); + if ( x.m_filter ) + m_filter = x.m_filter->Clone(); + else + m_image = x.m_image; + m_outputRealCmp = x.m_outputRealCmp; + } + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + FFTConvolution& operator =( FFTConvolution&& ) = default; + + /*! + * Returns true if this %FFTConvolution uses a KernelFilter object as its + * response function; false if it uses an image. + */ + bool UsingFilter() const + { + return m_filter; + } + + /*! + * Returns a reference to the kernel filter currently associated with this + * %FFTConvolution object. If this object does not use a kernel filter, + * either because it uses an image as its response function, or because this + * object has not been initialized, the returned filter is empty (i.e., it + * has no filter coefficients and zero dimensions). + */ + const KernelFilter& Filter() const + { + PCL_PRECONDITION( bool( m_filter ) ) + return *m_filter; + } + + /*! + * Returns a reference to the filter image currently associated with this + * %FFTConvolution object. The referenced ImageVariant object will transport + * no image if this object does not use a filter image, either because it + * uses a kernel filter as its response function, or because this object has + * not been initialized. + * + * The response function is actually the image transported by the returned + * ImageVariant. It can be an image of any supported data type. + */ + const ImageVariant& FilterImage() const + { + return m_image; + } + + /*! + * Sets a new kernel filter as the response function to be applied by this + * %FFTConvolution object. + * + * The specified object does not have to remain valid while this + * %FFTConvolution instance is actively used, since it owns a private copy + * of the filter (note that KernelFilter is a reference-counted class). + */ + void SetFilter( const KernelFilter& filter ) + { + DestroyFilter(); + m_filter = filter.Clone(); + PCL_CHECK( bool( m_filter ) ) + } + + /*! + * Sets a new filter image as the response function to be applied by this + * %FFTConvolution object. + * + * The image transported by the specified ImageVariant must remain valid + * while this %FFTConvolution instance is actively used, or until a new + * response function is associated with this instance. The %ImageVariant + * doesn't have to remain valid, since this object owns a private + * %ImageVariant that transports the response function image. + */ + void SetFilter( const ImageVariant& filter ) + { + DestroyFilter(); + m_image = filter; + PCL_CHECK( bool( m_image ) ) + } + + /*! + * Returns a pointer to the discrete Fourier transform (DFT) of the + * complex response function used internally by this + * %FFTConvolution object, or nullptr if the response function has not been + * created yet. + * + * The internal DFT of the response function is created and initialized the + * first time this %FFTConvolution object is used to perform a convolution. + * It is reused to save memory and CPU resources, as long as successive + * transformations apply to target images with the same dimensions, or + * otherwise it is re-created on the fly, as necessary. It is destroyed when + * a new filter is associated with this object. + * + * This function returns a pointer to a complex image that stores the DFT + * of the original filter after transforming it to wrap around + * order. This means that the original filter data has been splitted, + * mirrored, and redistributed to occupy the four corners of the complex 2-D + * matrix prior to calculating its DFT. + * + * If this object has not been initialized, the returned pointer is nullptr. + */ + const ComplexImage* ResponseFunctionDFT() const + { + return m_h; + } + + /*! + * Returns true if this object applies to real images by copying the real + * component of the complex convolved result. + * + * Returns false if this object applies to real images by storing the + * magnitude of the complex convolution result. This is the default + * behavior. + * + * \sa IsMagnitudeOutputEnabled(), EnableRealComponentOutput() + */ + bool IsRealComponentOutputEnabled() const + { + return m_outputRealCmp; + } + + /*! + * Returns true if this object applies to real images by storing the + * magnitude of the complex convolution result. This is the default + * behavior. + * + * Returns false if this object applies to real images by copying the real + * component of the complex convolved result. + * + * \sa IsRealComponentOutputEnabled(), EnableMagnitudeOutput() + */ + bool IsMagnitudeOutputEnabled() const + { + return !m_outputRealCmp; + } + + /*! + * Causes this object to apply to real images by copying the real component + * of the complex convolved result. + * + * \sa IsRealComponentOutputEnabled(), EnableMagnitudeOutput() + */ + void EnableRealComponentOutput( bool enable = true ) + { + m_outputRealCmp = enable; + } + + /*! + * Causes this object to apply to real images by storing the magnitude of + * the complex convolution result. This is the default behavior. + * + * \sa IsMagnitudeOutputEnabled(), EnableRealComponentOutput() + */ + void EnableMagnitudeOutput( bool enable = true ) + { + m_outputRealCmp = !enable; + } + + /*! + * Returns the minimum filter size in pixels for which FFT-based + * two-dimensional convolution is consistently faster than nonseparable + * convolution on the current PixInsight/PCL platform, for the specified + * number of parallel execution threads. + * + * The values returned by this function have been determined experimentally + * on reference hardware for optimized execution on machines and builds with + * and without AVX2/FMA3 processor instruction support. + * + * \ingroup convolution_speed_limits + */ + static constexpr int FasterThanNonseparableFilterSize( int numThreads ) + { +#ifdef __PCL_COMPATIBILITY + + // No vectorization + + if ( numThreads >= 32 ) + return 17; + if ( numThreads >= 24 ) + return 15; + if ( numThreads >= 12 ) + return 13; + if ( numThreads >= 8 ) + return 11; + return 9; + +#else + + // Vectorization with SSE4.2 / AVX2 and FMA instructions + + if ( numThreads >= 32 ) + return 29; + if ( numThreads >= 24 ) + return 27; + if ( numThreads >= 16 ) + return 25; + if ( numThreads >= 12 ) + return 21; + if ( numThreads >= 8 ) + return 19; + if ( numThreads >= 4 ) + return 17; + if ( numThreads >= 2 ) + return 15; + return 13; + +#endif + } + + /*! + * Returns the minimum filter size in pixels for which FFT-based + * two-dimensional convolution is consistently faster than separable + * convolution on the current PixInsight/PCL platform, for the specified + * number of parallel execution threads. + * + * The values returned by this function have been determined experimentally + * on reference hardware for optimized execution on machines and builds with + * and without AVX2/FMA3 processor instruction support. + * + * \ingroup convolution_speed_limits + */ + static constexpr int FasterThanSeparableFilterSize( int numThreads ) + { +#ifdef __PCL_COMPATIBILITY + + // No vectorization + + if ( numThreads >= 24 ) + return 191; + if ( numThreads >= 16 ) + return 141; + if ( numThreads >= 12 ) + return 135; + if ( numThreads >= 8 ) + return 95; + if ( numThreads >= 4 ) + return 75; + return 61; + +#else + + // Vectorization with SSE4.2 / AVX2 and FMA instructions + + if ( numThreads >= 16 ) + return 901; + if ( numThreads >= 12 ) + return 831; + if ( numThreads >= 8 ) + return 741; + return 395; + +#endif + } + +protected: + + /* + * The response function for convolution is defined as either a KernelFilter + * instance or as an image. In the latter case, the image transported by the + * ImageVariant must remain valid while this object is actively used. + */ + AutoPointer m_filter; + ImageVariant m_image; + bool m_outputRealCmp = false; + + /* + * Internal DFT of the response function. Initially zero. This matrix is + * generated/reused/regenerated as this object is applied to convolve + * different target images. It is destroyed when a new filter is specified. + */ + mutable AutoPointer m_h; + + /* + * In-place Fourier-based 2-D convolution algorithm. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + + friend class PCL_FFTConvolutionEngine; + +private: + + void DestroyFilter() + { + m_filter.Destroy(); + m_image.Free(); + m_h.Destroy(); + } + + void Validate() const; + void ValidateFilter() const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FFTConvolution_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FFTConvolution.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FFTRegistration.h b/3rdparty/include/pcl/FFTRegistration.h new file mode 100644 index 0000000..807656b --- /dev/null +++ b/3rdparty/include/pcl/FFTRegistration.h @@ -0,0 +1,611 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FFTRegistration.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FFTRegistration_h +#define __PCL_FFTRegistration_h + +/// \file pcl/FFTRegistration.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FFTRegistrationEngine + * \brief Base class of %FFT-based image registration algorithms + * + * Image registration based on phase correlation via fast Fourier transforms. + * + * References + * + * \li Araiza, R., Xie, H. & al., 2002. Automatic referencing of multi-spectral + * images. Proceedings of 15th IEEE Southwest Symposium on Image Analysis and + * Interpretation, Santa Fe, USA, 21-25. + * + * \li Xie, H. & al., 2000. Automatic image registration based on a %FFT + * algorithm and IDL/ENVI. Proceedings of the ICORG-2000 International + * Conference on Remote Sensing and GIS/GPS, Hyderabad, India, I-397~I-402. + * + * \li Harold S., Stone T. & al., 2003. Analysis of image registration noise + * due to rotationally dependent aliasing. Journal of Visual Communication and + * Image Representation 14, 114-135. + * + * \li DeCastro, E., Morandi, C., 1987. Registration of translated and rotated + * images using finite Fourier transforms. IEEE Transactions on Pattern + * Analysis and Machine Intelligence 95, 700-703. + */ +class PCL_CLASS FFTRegistrationEngine +{ +public: + + /*! + * Constructs an %FFTRegistrationEngine object. + */ + FFTRegistrationEngine() = default; + + /*! + * Copy constructor. + */ + FFTRegistrationEngine( const FFTRegistrationEngine& ) = default; + + /*! + * Move constructor. + */ + FFTRegistrationEngine( FFTRegistrationEngine&& x ) + : m_fftReference( std::move( x.m_fftReference ) ) + { + } + + /*! + * Destroys an %FFTRegistrationEngine object. + */ + virtual ~FFTRegistrationEngine() + { + } + + /*! + * Returns true iff this engine has been initialized. + */ + bool IsInitialized() const + { + return !m_fftReference.IsEmpty(); + } + + /*! + * Initializes this registration engine for the specified reference image + * \a image. + * + * Once initialized, subsequent calls to Evaluate() will compute + * registration parameters for target images referred to the same reference + * image, until a new initialization is performed, or until the Reset() + * member function is called. + */ + template + void Initialize( const pcl::GenericImage

& image ) + { + Reset(); + m_fftReference = DoInitialize( image ); + } + + /*! + * Initializes this registration engine for the specified reference + * \a image. + * + * This member function behaves like Initialize( const GenericImage

& ), + * except that it receives a reference to ImageVariant. The engine is + * initialized for the image transported by the ImageVariant object. + */ + void Initialize( const ImageVariant& image ) + { + Reset(); + if ( image ) + if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: m_fftReference = DoInitialize( static_cast( *image ) ); break; + case 64: m_fftReference = DoInitialize( static_cast( *image ) ); break; + } + else if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: m_fftReference = DoInitialize( static_cast( *image ) ); break; + case 64: m_fftReference = DoInitialize( static_cast( *image ) ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: m_fftReference = DoInitialize( static_cast( *image ) ); break; + case 16: m_fftReference = DoInitialize( static_cast( *image ) ); break; + case 32: m_fftReference = DoInitialize( static_cast( *image ) ); break; + } + } + + /*! + * Returns a reference to the discrete Fourier transform of the reference + * image. + * + * The reference image is the image specified in the last call to + * Initialize(). This function returns an empty image if this registration + * engine has not been initialized. + */ + const ComplexImage& DFTOfReferenceImage() const + { + return m_fftReference; + } + + /*! + * Resets this registration engine and deallocates all internal data + * structures. The engine will have to be initialized before performing new + * evaluations of registration parameters. + */ + void Reset() + { + m_fftReference.FreeData(); + } + + /*! + * Evaluates a target image \a image to compute registration parameters. + * + * Before calling this function, the engina must be initialized by calling + * Initialize() with a reference image. + */ + template + void Evaluate( const pcl::GenericImage

& image ) + { + PCL_PRECONDITION( IsInitialized() ) + if ( IsInitialized() ) + DoEvaluate( image ); + } + + /*! + * Evaluates a target image \a vimg to compute registration parameters. + * + * This member function behaves like Evaluate( const GenericImage

& ), + * except that it receives a reference to ImageVariant. The engine evaluates + * for the image transported by the ImageVariant object. + */ + void Evaluate( const ImageVariant& image ) + { + PCL_PRECONDITION( IsInitialized() ) + if ( IsInitialized() ) + if ( image ) + if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: DoEvaluate( static_cast( *image ) ); break; + case 64: DoEvaluate( static_cast( *image ) ); break; + } + else if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: DoEvaluate( static_cast( *image ) ); break; + case 64: DoEvaluate( static_cast( *image ) ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: DoEvaluate( static_cast( *image ) ); break; + case 16: DoEvaluate( static_cast( *image ) ); break; + case 32: DoEvaluate( static_cast( *image ) ); break; + } + } + +protected: + + // DFT of the reference image. + ComplexImage m_fftReference; + + virtual ComplexImage DoInitialize( const pcl::Image& ) = 0; + virtual ComplexImage DoInitialize( const pcl::DImage& ) = 0; + virtual ComplexImage DoInitialize( const pcl::ComplexImage& ) = 0; + virtual ComplexImage DoInitialize( const pcl::DComplexImage& ) = 0; + virtual ComplexImage DoInitialize( const pcl::UInt8Image& ) = 0; + virtual ComplexImage DoInitialize( const pcl::UInt16Image& ) = 0; + virtual ComplexImage DoInitialize( const pcl::UInt32Image& ) = 0; + + virtual void DoEvaluate( const pcl::Image& ) = 0; + virtual void DoEvaluate( const pcl::DImage& ) = 0; + virtual void DoEvaluate( const pcl::ComplexImage& ) = 0; + virtual void DoEvaluate( const pcl::DComplexImage& ) = 0; + virtual void DoEvaluate( const pcl::UInt8Image& ) = 0; + virtual void DoEvaluate( const pcl::UInt16Image& ) = 0; + virtual void DoEvaluate( const pcl::UInt32Image& ) = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fft_registration_functions FFT-Based Registration Operators + */ + +/*! + * Initializes a %FFT registration engine or evaluates a target image. + * + * \param R %FFT registration engine. + * \param image An image or ImageVariant for initialization or evaluation. + * + * If the engine has not still been initialized, it is initialized for the + * \e reference image \a image. Once the engine has been initialized, it + * evaluates registration parameters for the specified \e target image \a image. + * + * Returns a reference to the %FFT registration engine \a R. + * + * \sa FFTRegistrationEngine + * + * \ingroup fft_registration_functions + */ +template inline +FFTRegistrationEngine& operator <<( FFTRegistrationEngine& R, const O& image ) +{ + if ( !R.IsInitialized() ) + R.Initialize( image ); + else + R.Evaluate( image ); + return R; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class FFTTranslation + * \brief %FFT registration engine: translation + * + * %FFTTranslation evaluates translation image registration parameters. It + * computes the offsets \e dx and \e dy required to register a target image on + * a reference image, using an %FFT-based phase correlation algorithm. + * + * \sa FFTRotationAndScaling, FFTRegistrationEngine + */ +class PCL_CLASS FFTTranslation : public FFTRegistrationEngine +{ +public: + + /*! + * Constructs an %FFTTranslation object. + */ + FFTTranslation() = default; + + /*! + * Destroys an %FFTTranslation object. + */ + virtual ~FFTTranslation() + { + } + + /*! + * Returns true iff this registration engine can evaluate translations + * greater than or equal to one half of the largest dimension of the + * reference image. + * + * \sa EnableLargeTranslations(), DisableLargeTranslations() + */ + bool AreLargeTranslationsEnabled() const + { + return m_largeTranslations; + } + + /*! + * Enables or disables evaluation of large translations (>= one half of the + * reference image dimension). + * + * \warning When large translations are enabled, the engine needs to double + * the sizes of internal working matrices, which \e quadruplicates the + * amount of required memory. + * + * \sa DisableLargeTranslations(), AreLargeTranslationsEnabled() + */ + void EnableLargeTranslations( bool enable = true ) + { + if ( enable != m_largeTranslations ) + { + Reset(); + m_largeTranslations = enable; + } + } + + /*! + * Disables or enables evaluation of large translations (>= one half of the + * reference image dimension). + * + * This is a convenience member function, equivalent to + * EnableLargeTranslations( !disable ) + * + * \warning When large translations are enabled, the engine needs to double + * the sizes of internal working matrices, which \e quadruplicates the + * amount of required memory. + * + * \sa EnableLargeTranslations(), AreLargeTranslationsEnabled() + */ + void DisableLargeTranslations( bool disable = true ) + { + EnableLargeTranslations( !disable ); + } + + /*! + * Returns the evaluated translation increments in pixels. + * + * The returned Point object contains the required offsets in the X and Y + * directions to register the last evaluated target image on the reference + * image set upon initialization. + * + * \sa DeltaX(), DeltaY() + */ + const FPoint& Delta() const + { + return m_delta; + } + + /*! + * Returns the evaluated translation increment in the X direction, in + * pixels. + * + * \sa DeltaY(), Delta() + */ + float DeltaX() const + { + return m_delta.x; + } + + /*! + * Returns the evaluated translation increment in the Y direction, in + * pixels. + * + * \sa DeltaX(), Delta() + */ + float DeltaY() const + { + return m_delta.y; + } + + /*! + * Returns the peak value read from the phase matrix for the last evaluated + * target image. The peak value isn't normalized, that is, it doesn't + * necessarily have to be in the [0,1] range. + */ + float Peak() const + { + return m_peak; + } + +protected: + + // Allow translations > size/2. + // Warning: a lot of memory may be necessary --four times more. + bool m_largeTranslations = false; + + // Evaluation result. + FPoint m_delta = 0.0F; + + // Peak value detected in the phase matrix. + float m_peak = 0.0F; + + ComplexImage DoInitialize( const pcl::Image& ) override; + ComplexImage DoInitialize( const pcl::DImage& ) override; + ComplexImage DoInitialize( const pcl::ComplexImage& ) override; + ComplexImage DoInitialize( const pcl::DComplexImage& ) override; + ComplexImage DoInitialize( const pcl::UInt8Image& ) override; + ComplexImage DoInitialize( const pcl::UInt16Image& ) override; + ComplexImage DoInitialize( const pcl::UInt32Image& ) override; + + void DoEvaluate( const pcl::Image& ) override; + void DoEvaluate( const pcl::DImage& ) override; + void DoEvaluate( const pcl::ComplexImage& ) override; + void DoEvaluate( const pcl::DComplexImage& ) override; + void DoEvaluate( const pcl::UInt8Image& ) override; + void DoEvaluate( const pcl::UInt16Image& ) override; + void DoEvaluate( const pcl::UInt32Image& ) override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class FFTRotationAndScaling + * \brief %FFT registration engine: rotation and scaling + * + * %FFTRotationAndScaling evaluates rotation and scaling image registration + * parameters. It computes the rotation angle and scaling ratio required to + * register a target image on a reference image, using an algorithm based on + * the Fourier-Mellin transform. + * + * \warning This class is currently experimental. It is not guaranteed to + * provide reliable image registration parameters. + * + * \sa FFTTranslation, FFTRegistrationEngine + */ +class PCL_CLASS FFTRotationAndScaling : public FFTRegistrationEngine +{ +public: + + /*! + * Constructs a %FFTRotationAndScaling object. + * + * Scaling ratio evaluation (see EvaluatesScaling()) is disabled by default. + */ + FFTRotationAndScaling() = default; + + /*! + * Destroys a %FFTRotationAndScaling object. + */ + virtual ~FFTRotationAndScaling() + { + } + + /*! + * Returns true iff this engine evaluates scaling ratios. By default, scale + * evaluation is disabled. + */ + bool EvaluatesScaling() const + { + return m_evaluateScaling; + } + + /*! + * Enables evaluation of scaling ratios. + */ + void EnableScalingEvaluation( bool enable = true ) + { + if ( enable != m_evaluateScaling ) + { + Reset(); + m_evaluateScaling = enable; + } + } + + /*! + * Disables evaluation of scaling ratios. + * + * This is a convenience member function, equivalent to + * EnableScalingEvaluation( !disable ) + */ + void DisableScalingEvaluation( bool disable = true ) + { + EnableScalingEvaluation( !disable ); + } + + /*! + * Returns the current low frequency cutoff for this registration engine. + * + * See the documentation for SetLowFrequencyCutoff() for a detailed + * description of low-frequency cutoffs. + */ + float LowFrequencyCutoff() const + { + return m_lowFrequencyCutoff; + } + + /*! + * Returns true iff this engine uses a low-frequency cutoff to reduce the + * effects of rotational aliasing. + */ + bool HasLowFrequencyCutoff() const + { + return LowFrequencyCutoff() > 0; + } + + /*! + * Sets the radius of the low-frequency cutoff. + * + * The evaluation of rotation and scaling registration parameters can + * benefit from a simple low-frequency cutoff operation to reduce rotational + * aliasing on the computed DFTs. The value set by this function is the + * radius of the cutoff \e hole relative to the largest dimension of the + * reference image. The default value is 1/200. A value of zero disables the + * low-frequency cutoff feature. + */ + void SetLowFrequencyCutoff( float r ) + { + m_lowFrequencyCutoff = Range( r, 0.0F, 0.5F ); + } + + /*! + * Returns the evaluated rotation angle in radians. + * + * The returned value is the required rotation angle to register the last + * evaluated target image on the reference image set upon initialization. + */ + float RotationAngle() const + { + return m_rotationAngle; + } + + /*! + * Returns the evaluated scaling ratio. + * + * The returned value is the required scaling ratio to register the last + * evaluated target image on the reference image set upon initialization. + */ + float ScalingRatio() const + { + return m_scalingRatio; + } + +protected: + + // Evaluate rotation+scaling, or just rotation? + bool m_evaluateScaling = false; + + // Low-frequency cutoff, as a fraction of the DFT radius. + float m_lowFrequencyCutoff = 1.0F/200; + + // Evaluation result + float m_rotationAngle = 0.0F; // radians + float m_scalingRatio = 1.0F; // pixels + + ComplexImage DoInitialize( const pcl::Image& ) override; + ComplexImage DoInitialize( const pcl::DImage& ) override; + ComplexImage DoInitialize( const pcl::ComplexImage& ) override; + ComplexImage DoInitialize( const pcl::DComplexImage& ) override; + ComplexImage DoInitialize( const pcl::UInt8Image& ) override; + ComplexImage DoInitialize( const pcl::UInt16Image& ) override; + ComplexImage DoInitialize( const pcl::UInt32Image& ) override; + + void DoEvaluate( const pcl::Image& ) override; + void DoEvaluate( const pcl::DImage& ) override; + void DoEvaluate( const pcl::ComplexImage& ) override; + void DoEvaluate( const pcl::DComplexImage& ) override; + void DoEvaluate( const pcl::UInt8Image& ) override; + void DoEvaluate( const pcl::UInt16Image& ) override; + void DoEvaluate( const pcl::UInt32Image& ) override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FFTRegistration_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FFTRegistration.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FITSHeaderKeyword.h b/3rdparty/include/pcl/FITSHeaderKeyword.h new file mode 100644 index 0000000..e99336b --- /dev/null +++ b/3rdparty/include/pcl/FITSHeaderKeyword.h @@ -0,0 +1,290 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FITSHeaderKeyword.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FITSHeaderKeyword_h +#define __PCL_FITSHeaderKeyword_h + +/// \file pcl/FITSHeaderKeyword.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FITSHeaderKeyword + * \brief %FITS header keyword + */ +class PCL_CLASS FITSHeaderKeyword +{ +public: + + IsoString name; //!< Keyword name + IsoString value; //!< Keyword value + IsoString comment; //!< Keyword comment + + /*! + * Constructs a %FITSHeaderKeyword object with empty name, value and comment + * components. + */ + FITSHeaderKeyword() = default; + + /*! + * Copy constructor. + */ + FITSHeaderKeyword( const FITSHeaderKeyword& ) = default; + + /*! + * Move constructor. + */ + FITSHeaderKeyword( FITSHeaderKeyword&& ) = default; + + /*! + * Constructs a %FITSHeaderKeyword object with the specified name, value and + * comment components. + */ + FITSHeaderKeyword( const IsoString& a_name, + const IsoString& a_value = IsoString(), + const IsoString& a_comment = IsoString() ) + : name( a_name ) + , value( a_value ) + , comment( a_comment ) + { + Trim(); + } + + template + FITSHeaderKeyword( const S1& a_name, const S2& a_value, const S3& a_comment ) + : name( IsoString( a_name ) ) + , value( IsoString( a_value ) ) + , comment( IsoString( a_comment ) ) + { + Trim(); + } + + /*! + * Assignment operator. Returns a reference to this object. + */ + FITSHeaderKeyword& operator =( const FITSHeaderKeyword& ) = default; + + /*! + * Returns true iff this %FITS keyword has no %value (i.e., if the value + * member is an empty string). + */ + bool IsNull() const + { + return value.IsEmpty(); + } + + /*! + * Returns true iff this %FITS keyword has a string %value. + * + * A string %value is assumed if the value component begins with a single + * quote ('). + */ + bool IsString() const + { + return value.StartsWith( '\'' ); + } + + /*! + * Returns true iff this %FITS keyword has a boolean %value. + * + * A boolean %value is assumed if the value component is equal to 'T' or 'F' + * for \c true and \c false, respectively. + */ + bool IsBoolean() const + { + return value == 'T' || value == 'F'; + } + + /*! + * Returns true iff this %FITS keyword has a numeric %value. + * + * A numeric %value is assumed if the value component is a valid + * representation of an integer or floating point number. + */ + bool IsNumeric() const + { + return value.IsNumeral(); + } + + /*! + * Gets the numeric %value of this %FITS keyword in the specified variable + * \a v, or zero if this keyword has no numeric %value. + * + * Returns true iff this keyword has a valid numeric %value. This member + * function does not throw exceptions, even if the keyword's value contains + * an illegal numeric representation. + */ + bool GetNumericValue( double& v ) const + { + if ( value.TryToDouble( v ) ) + return true; + v = 0; + return false; + } + + /*! + * Returns the string %value of this %FITS header keyword (irrespective of + * its data type), with delimiters pulled off and leading/trailing + * whitespace trimmed out. + */ + IsoString StripValueDelimiters() const + { + IsoString stripped; + + if ( !value.IsEmpty() && *value == '\'' ) // leading delimiter ? + { + size_type n = value.Length()-1; + if ( value[n] == '\'' ) // trailing delimiter ? + --n; + stripped = value.Substring( 1, n ); + } + else + stripped = value; + + return stripped.Trimmed(); + } + + /*! + * If this keyword has a string value without leading and trailing quotes, + * this member function adds them, as required by the FITS standard. Returns + * true if the value was fixed, false if the value was not changed. + */ + bool FixValueDelimiters() + { + double dum; + if ( !IsNull() ) + if ( !IsString() ) + if ( !IsBoolean() ) + if ( !IsNumeric() || !value.TryToDouble( dum ) ) + { + value.EnsureSingleQuoted(); + return true; + } + return false; + } + + /*! + * Removes leading and trailing spaces in the name, value and comment + * components of this %FITS header keyword. + */ + void Trim() + { + name.Trim(); + value.Trim(); + comment.Trim(); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class pcl::FITSKeywordArray + * \brief Dynamic array of %FITS header keywords + * + * %FITSKeywordArray is a template instantiation of Array for + * FITSHeaderKeyword. + */ +typedef Array FITSKeywordArray; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fits_keyword_comparison FITS Keyword Comparison Functions + */ + +/*! + * Returns true iff two %FITS header keywords, \a h1 and \a h2, are equal. + * + * Two %FITS keywords are equal if their three components (name, value, + * comment) are equal. However, keyword name comparison is case-insensitive as + * per the %FITS standard. + * + * \ingroup fits_keyword_comparison + */ +inline bool operator ==( const FITSHeaderKeyword& h1, const FITSHeaderKeyword& h2 ) +{ + // Keyword name comparison is case-insensitive as per the FITS standard. + return h1.name.CompareIC( h2.name ) == 0 && h1.value == h2.value && h1.comment == h2.comment; +} + +/*! + * Returns true iff a %FITS header keyword \a h1 is less than other keyword + * \a h2. + * + * This function compares the components of both keywords. The precedence order + * is name, value and comment. Keyword name comparison is case-insensitive as + * per the %FITS standard. + * + * \ingroup fits_keyword_comparison + */ +inline bool operator <( const FITSHeaderKeyword& h1, const FITSHeaderKeyword& h2 ) +{ + int i = h1.name.CompareIC( h2.name ); + return i < 0 || i == 0 && (h1.value < h2.value || h1.value == h2.value && h1.comment < h2.comment); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FITSHeaderKeyword_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FITSHeaderKeyword.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FastRotation.h b/3rdparty/include/pcl/FastRotation.h new file mode 100644 index 0000000..76b8542 --- /dev/null +++ b/3rdparty/include/pcl/FastRotation.h @@ -0,0 +1,241 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FastRotation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FastRotation_h +#define __PCL_FastRotation_h + +/// \file pcl/FastRotation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fast_rotations Non-interpolating Rotations and Specular \ + * Transformations. + * + * Fast rotations are non-interpolating geometric transformations: + * they carry out image rotation and specular projection operations exclusively + * by copying and swapping pixels. + * + * Since no pixel interpolation is performed, there is absolutely no data + * degradation after an arbitrary number of consecutive fast rotations. + */ + +// ---------------------------------------------------------------------------- + +/*! + * \class Rotate180 + * \brief Rotates images by 180 degrees + * + * \ingroup fast_rotations + */ +class PCL_CLASS Rotate180 : public GeometricTransformation +{ +public: + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + // No change + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Rotate90CW + * \brief Rotates images by 90 degrees (clockwise) + * + * \ingroup fast_rotations + */ +class PCL_CLASS Rotate90CW : public GeometricTransformation +{ +public: + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + pcl::Swap( w, h ); // Permute + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Rotate90CCW + * \brief Rotates images by -90 degrees (counter-clockwise) + * + * \ingroup fast_rotations + */ +class PCL_CLASS Rotate90CCW : public GeometricTransformation +{ +public: + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + pcl::Swap( w, h ); // Permute + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class HorizontalMirror + * \brief Mirrors images horizontally + * + * \ingroup fast_rotations + */ +class PCL_CLASS HorizontalMirror : public GeometricTransformation +{ +public: + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + // No change + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class VerticalMirror + * \brief Mirrors images vertically + * + * \ingroup fast_rotations + */ +class PCL_CLASS VerticalMirror : public GeometricTransformation +{ +public: + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + // No change + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FastRotation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FastRotation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/File.h b/3rdparty/include/pcl/File.h new file mode 100644 index 0000000..d7ff397 --- /dev/null +++ b/3rdparty/include/pcl/File.h @@ -0,0 +1,2415 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/File.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_File_h +#define __PCL_File_h + +/// \file pcl/File.h + +#include +#include + +#include +#include +#include +#include + +#ifndef __PCL_FILE_DONT_REMOVE_PREVIOUS_DECLARATION + +/* + * Remove conflicting identifiers from Win32 SDK headers. + */ + +#ifdef CreateFile +#undef CreateFile +#endif + +#ifdef CopyFile +#undef CopyFile +#endif + +#ifdef MoveFile +#undef MoveFile +#endif + +#ifdef CreateDirectory +#undef CreateDirectory +#endif + +#ifdef RemoveDirectory +#undef RemoveDirectory +#endif + +#endif // !__PCL_FILE_DONT_REMOVE_PREVIOUS_DECLARATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup file_utilities File Support Classes and Functions + */ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FileMode + * \brief File access, share and opening/creation modes. + * + * + * + * + * + * + * + * + * + * + * + *
FileMode::Read Read access enabled
FileMode::Write Write access enabled
FileMode::AccessMode Mask to isolate read/write flags
FileMode::ShareRead (Windows only) Sharing for reading enabled
FileMode::ShareWrite (Windows only) Sharing for writing enabled
FileMode::ShareMode (Windows only) Mask to isolate share read/write flags
FileMode::Open Open an existing file
FileMode::Create Create a new file or truncate an existing file
FileMode::OpenMode Mask to isolate open/creation flags
+ * + * \ingroup file_utilities + */ +namespace FileMode +{ + enum mask_type + { + Zero = 0x00000000, + + /* + * Access mode + */ + Read = 0x00000001, + Write = 0x00000002, + AccessMode = 0x0000000F, + + /* + * Share mode (Windows only) + */ + ShareRead = 0x00000010, + ShareWrite = 0x00000020, + ShareMode = 0x000000F0, + + /* + * Open/create mode + */ + Open = 0x00000100, + Create = 0x00000200, + OpenMode = 0x00000F00 + }; +} + +/*! + * \class pcl::FileModes + * \brief A combination of file access, share and opening/creation mode flags + * \ingroup file_utilities + */ +typedef Flags FileModes; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::SeekMode + * \brief File seek modes. + * + * + * + * + * + *
SeekMode::FromBegin Move file pointer relative to the beginning of the file
SeekMode::FromCurrent Move file pointer from the current position
SeekMode::FromEnd Move file pointer relative to the end of the file
+ * + * \ingroup file_utilities + */ +namespace SeekMode +{ + enum value_type + { + FromBegin, // Move relative to the beginning of the file + FromCurrent, // Move from current position + FromEnd, // Move relative to the end of the file + NumberOfSeekModes + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FileAttribute + * \brief File attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
File type
FileAttribute::Block Block special
FileAttribute::Character Character special
FileAttribute::FIFO FIFO special
FileAttribute::Regular Regular file
FileAttribute::Directory Directory
FileAttribute::SymbolicLink Symbolic link
FileAttribute::Socket Socket
FileAttribute::FileType Mask to isolate file type flags
File attributes\n + * These are Windows-exclusive, except ReadOnly and Hidden, which we emulate on UNIX and Linux platforms.
FileAttribute::Archive File is archived
FileAttribute::Compressed File is compressed
FileAttribute::Encrypted File is encrypted
FileAttribute::Hidden File is hidden
FileAttribute::ReadOnly File is read-only
FileAttribute::System File is a system file
FileAttribute::Temporary File is a temporary file
FileAttribute::FileAttributes Mask to isolate file attributes flags
File permissions
FileAttribute::Read Owner can read
FileAttribute::Write Owner can write
FileAttribute::Execute Owner can execute/search
FileAttribute::ReadGroup Group can read
FileAttribute::WriteGroup Group can write
FileAttribute::ExecuteGroup Group can execute/search
FileAttribute::ReadOthers Others can read
FileAttribute::WriteOthers Others can write
FileAttribute::ExecuteOthers Others can execute/search
FileAttribute::FilePermissions Mask to isolate file permission flags
+ * + * \ingroup file_utilities + */ +namespace FileAttribute +{ + enum mask_type + { + /* + * File type. + */ + Block = 0x00000001, // Block special + Character = 0x00000002, // Character special + FIFO = 0x00000004, // FIFO special + Regular = 0x00000008, // Regular file + Directory = 0x00000010, // Directory + SymbolicLink = 0x00000020, // Symbolic link + Socket = 0x00000040, // Socket + FileType = 0x000000FF, + + /* + * File attributes. + * These are Windows-exclusive, except ReadOnly and Hidden, which we + * emulate on UNIX and Linux. + */ + Archive = 0x00001000, // File is archived + Compressed = 0x00002000, // File is compressed + Encrypted = 0x00004000, // File is encrypted + Hidden = 0x00008000, // File is hidden + ReadOnly = 0x00010000, // File is read-only + System = 0x00020000, // File is a system file + Temporary = 0x00040000, // File is a temporary file + FileAttributes = 0x000FF000, + + /* + * File permissions. + */ + Read = 0x00100000, // Owner can read + Write = 0x00200000, // Owner can write + Execute = 0x00400000, // Owner can execute/search + ReadGroup = 0x01000000, // Group can read + WriteGroup = 0x02000000, // Group can write + ExecuteGroup = 0x04000000, // Group can execute/search + ReadOthers = 0x10000000, // Others can read + WriteOthers = 0x20000000, // Others can write + ExecuteOthers = 0x40000000, // Others can execute/search + FilePermissions= 0xFFF00000 + }; +} + +/*! + * \class pcl::FileAttributes + * \brief A combination of file type, attribute and access mode flags + * \ingroup file_utilities + */ +typedef Flags FileAttributes; + +// ---------------------------------------------------------------------------- + +/*! + * \struct FileTime + * \brief File date and time + * + * %FileTime is used to represent the creation, last access and last + * modification times of a file or directory. On most file systems, this object + * represents a time point in the Coordinated Universal Time (UTC) time scale. + * \ingroup file_utilities + */ +struct FileTime +{ + uint16 year : 16; //!< Year + uint8 month : 4; //!< Month [1,12] + uint8 day : 5; //!< Day [1,31] + uint8 hour : 5; //!< Hour [0,23] + int : 2; + uint8 minute : 6; //!< Minute [0,59] + uint8 second : 6; //!< Second [0,59] + int : 4; + uint16 milliseconds : 10; //!< Milliseconds [0,999] + int : 6; + + /*! + * Returns true iff this file time is equal to another object \a t. + */ + bool operator ==( const FileTime& t ) const + { + return second == t.second && minute == t.minute && hour == t.hour && + day == t.day && month == t.month && year == t.year && + milliseconds == t.milliseconds; + } + + /*! + * Returns true iff this file time precedes another object \a t. + */ + bool operator <( const FileTime& t ) const + { + if ( year != t.year ) return year < t.year; + if ( month != t.month ) return month < t.month; + if ( day != t.day ) return day < t.day; + if ( hour != t.hour ) return hour < t.hour; + if ( minute != t.minute ) return minute < t.minute; + if ( second != t.second ) return second < t.second; + if ( milliseconds != t.milliseconds ) return milliseconds < t.milliseconds; + return false; + } + + /*! + * Returns this file date and time as a Julian day number. The returned + * value represents a time point in the UTC time scale on most file systems. + */ + double ToJD() const; + + /*! + * Returns the elapsed time in days since the standard UNIX epoch (1970 + * January 1.0 UTC). + */ + double DaysSinceEpoch() const + { + return ToJD() - 2440587.5; + } + + /*! + * Returns the elapsed time in seconds since the standard UNIX epoch (1970 + * January 1.0 UTC). + */ + double SecondsSinceEpoch() const + { + return 86400*DaysSinceEpoch(); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct FindFileInfo + * \brief %File information structure used by File::Find + * \ingroup file_utilities + * \sa pcl::File::Find + */ +struct FindFileInfo +{ + String name; //!< File or directory name, including the file name extension. + FileAttributes attributes; //!< Item attributes. + fsize_type size; //!< File size in bytes. + int numberOfLinks; //!< Number of existing hard links to this file. + int userId; //!< User id of the file owner. + int groupId; //!< Group id of the file owner. + FileTime created; //!< Creation time. + FileTime lastAccessed; //!< Time of last access. + FileTime lastModified; //!< Time of last change. + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a directory. + */ + bool IsDirectory() const + { + return attributes.IsFlagSet( FileAttribute::Directory ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::Archive attribute set. + */ + bool IsArchive() const + { + return attributes.IsFlagSet( FileAttribute::Archive ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::Compressed attribute set. + */ + bool IsCompressed() const + { + return attributes.IsFlagSet( FileAttribute::Compressed ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::Encrypted attribute set. + */ + bool IsEncrypted() const + { + return attributes.IsFlagSet( FileAttribute::Encrypted ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::Hidden attribute set. + */ + bool IsHidden() const + { + return attributes.IsFlagSet( FileAttribute::Hidden ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::ReadOnly attribute set. + */ + bool IsReadOnly() const + { + return attributes.IsFlagSet( FileAttribute::ReadOnly ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::System attribute set. + */ + bool IsSystem() const + { + return attributes.IsFlagSet( FileAttribute::System ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to a file with the + * FileAttribute::Temporary attribute set. + */ + bool IsTemporary() const + { + return attributes.IsFlagSet( FileAttribute::Temporary ); + } + + /*! + * Returns true iff this %FindFileInfo structure corresponds to an empty file. + */ + bool IsEmpty() const + { + return size == 0; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ReadTextOption + * \brief File text reading options. + * + * + * + * + * + * + *
RemoveEmptyLines Discard empty text lines (after trimming whitespace, when applicable).
TrimTrailingSpaces Delete trailing whitespace characters from input text lines.
TrimLeadingSpaces Delete leading whitespace characters from input text lines.
TrimSpaces Delete both leading and trailing whitespace characters from input text lines.
+ * + * \ingroup file_utilities + * \sa File::ReadLines(), File::ScanLines() + */ +namespace ReadTextOption +{ + enum mask_type + { + RemoveEmptyLines = 0x0001, + TrimTrailingSpaces = 0x0002, + TrimLeadingSpaces = 0x0004, + TrimSpaces = TrimTrailingSpaces | TrimLeadingSpaces + }; +} + +/*! + * \class pcl::ReadTextOptions + * \brief A combination of file text reading mode flags + * \ingroup file_utilities + * \sa File::ReadLines(), File::ScanLines() + */ +typedef Flags ReadTextOptions; + +// ---------------------------------------------------------------------------- + +/*! + * \struct UniqueFileChecks + * \brief A simple POD structure to hold file uniqueness and overwrite + * verification results. + * \ingroup file_utilities + * \sa File::EnsureNewUniqueFilePath() + */ +struct UniqueFileChecks +{ + bool exists = false; + bool overwrite = false; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class File + * \brief A platform-independent interface to the local file system + * + * ### TODO: Write a detailed description for %File. + * + * \ingroup file_utilities + */ +class PCL_CLASS File +{ +public: + + /*! + * Represents a low-level opaque handle to a file. + */ + typedef void* handle; + + /*! + * Represents a file seek mode. + */ + typedef SeekMode::value_type seek_mode; + + /*! + * \class pcl::File::Error + * \brief File I/O exception + * \ingroup file_utilities + */ + class PCL_CLASS Error : public pcl::Error + { + public: + + /*! + * Constructs a %File::Error object with the specified full file + * \a path and error \a message. + */ + Error( const String& filePath, const String& message ) + : pcl::Error( message ) + , m_filePath( filePath ) + { + } + + /*! + * Copy constructor. + */ + Error( const Error& ) = default; + + /*! + */ + String ExceptionClass() const override + { + return "File I/O Error"; + } + + /*! + * Returns the full file path associated to this file error. + */ + virtual String FilePath() const + { + return m_filePath; + } + + /*! + */ + virtual String ErrorMessage() const + { + return m_message; + } + + /*! + */ + String Message() const override + { + String filePath = FilePath(); + String message = m_message; + if ( !filePath.IsEmpty() ) + { + message += ": "; + message += filePath; + } + return message; + } + + private: + + String m_filePath; + }; + + /*! + * \class pcl::File::Find + * \brief Directory search operation + * + * This class can be used as an iterator to find all files and + * subdirectories within a directory tree. + * + * In the following example, the ProcessFiles function calls a functor + * object, specified as the \a processFile function argument, for each file + * found recursively in the specified \a dirPath directory. The functor's + * unique argument is the absolute file path of an existing file. + * + * \code + * template + * void ProcessFiles( const String& dirPath, F processFile ) + * { + * StringList directories; + * pcl::FindFileInfo info; + * for ( File::Find f( dirPath + '/' + '*' ); f.NextItem( info ); ) + * if ( info.IsDirectory() ) + * { + * if ( info.name != "." && info.name != ".." ) + * directories << info.name; + * } + * else if ( !info.attributes.IsFlagSet( FileAttribute::SymbolicLink ) ) + * { + * processFile( File::FullPath( dirPath + '/' + info.name ) ); + * } + * for ( const String& dir : directories ) + * ProcessFiles( dirPath + '/' + dir ); + * } + * \endcode + * + * \ingroup file_utilities + * \sa FindFileInfo + */ + class PCL_CLASS Find + { + public: + + /*! + * Constructs an inactive %File::Find object. + */ + Find() = default; + + /*! + * Constructs a %File::Find object and starts a new directory search + * operation for the specified \a path. + * + * The specified \a path can include wildcards to define a pattern to + * search for a set of directory items. + */ + Find( const String& path ) + { + Begin( path ); + } + + /*! + * Destroys a %File::Find object. If a directory search operation is + * currently active, it is finalized. + */ + ~Find() + { + End(); + } + + /*! + * Copy constructor. This constructor is disabled because %File::Find + * instances are unique. + */ + Find( const Find& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %File::Find + * instances are unique. + */ + Find& operator =( const Find& ) = delete; + + /*! + * Starts a new directory search operation for the specified \a path. + * + * The specified \a path can include wildcards to define a pattern to + * search for a set of directory items. + */ + void Begin( const String& path ); + + /*! + * Attempts to retrieve the next item in the current directory search + * operation. + * + * Returns true if a new item has been retrieved. In such case the + * \a info structure receives the data corresponding to the retrieved + * item. Returns false if there are no more items available, signaling + * the end of the current directory search operation, or if a search + * operation has not been initiated by a previous call to Begin(). In + * such case the \a info structure is not modified. + */ + bool NextItem( FindFileInfo& info ); + + /*! + * Finalizes the current directory search operation, if there is one + * active. + */ + void End(); + + /*! + * Returns the search path of the current directory search operation. + */ + String SearchPath() const + { + return m_searchPath; + } + + private: + + FindFileInfo m_info; + String m_searchPath; +#ifndef __PCL_WINDOWS + String m_searchDir; + String m_searchName; +#endif + void* m_handle = nullptr; + }; + + /*! + * \class pcl::File::Progress + * \brief Abstract base class of file progress objects + * + * The purpose of a file progress object is to provide feedback to the user + * during potentially long file tasks, such as copying, moving and deleting + * large files or file sets. The %File::Progress class provides a simple + * template with a text line, an increasing counter, and the possibility to + * abort a long operation. + * + * \ingroup file_utilities + * \sa File::CopyFile(), File::MoveFile() + */ + class PCL_CLASS Progress + { + public: + + /*! + * Constructs a %File::Progress object. + * + * \param total Total progress count (for example, the total size + * in bytes of a file being copied, or the total + * number of files being deleted). + * + * \param initialText Initial progress text. The default value is an + * empty string. + * + * \param initialValue Initial progress value. The default value is + * zero. + */ + Progress( fsize_type total, const String& initialText = String(), fsize_type initialValue = 0 ) + : m_total( Max( fsize_type( 0 ), total ) ) + , m_current( Range( initialValue, fsize_type( 0 ), m_total ) ) + , m_text( initialText ) + { + } + + /*! + * Destroys a %File::Progress object. + */ + virtual ~Progress() + { + } + + /*! + * Returns the total progress count. + */ + fsize_type Total() const + { + return m_total; + } + + /*! + * Returns the current progress count. + */ + fsize_type Value() const + { + return m_current; + } + + /*! + * Returns the current progress text. + */ + const String& Text() const + { + return m_text; + } + + /*! + * Sets the \a current progress count. + * + * This member function can abort the ongoing task. In such case, a + * ProcessAborted exception is thrown and the IsAborted() member function + * returns true. + */ + void SetValue( fsize_type current ) + { + if ( current >= m_current ) + { + m_current = current; + + if ( !ValueChanged() ) + { + m_abort = true; + throw ProcessAborted(); + } + } + } + + /*! + * Adds \a delta items to the current progress count. + * + * This member function can abort the ongoing task. In such case, a + * ProcessAborted exception is thrown and the IsAborted() member function + * returns true. + */ + void Add( fsize_type delta ) + { + if ( delta >= 0 ) + { + m_current += delta; + + if ( !ValueChanged() ) + { + m_abort = true; + throw ProcessAborted(); + } + } + } + + /*! + * Changes the current progress \a text. + * + * This member function can abort the ongoing task. In such case, a + * ProcessAborted exception is thrown and the IsAborted() member function + * returns true. + */ + void SetText( const String& text ) + { + m_text = text; + + if ( !TextChanged() ) + { + m_abort = true; + throw ProcessAborted(); + } + } + + /*! + * Returns true iff this object aborted a running task. + */ + bool IsAborted() const + { + return m_abort; + } + + protected: + + fsize_type m_total; + fsize_type m_current; + String m_text; + bool m_abort = false; + + /*! + * Function called when the current progress count has been changed. + * Returns true to continue the running task; false to abort. + * + * This is a pure virtual function that must be reimplemented by derived + * classes. + */ + virtual bool ValueChanged() = 0; + + /*! + * Function called when the current progress text has been changed. + * Returns true to continue the running task; false to abort. + * + * This is a pure virtual function that must be reimplemented by derived + * classes. + */ + virtual bool TextChanged() = 0; + }; + + // ------------------------------------------------------------------------- + + /*! + * Constructs a %File object that does not represent an existing file. + */ + File() + { + Initialize(); + } + + /*! + * Constructs a %File object that opens a file at a given \a path with the + * specified \a mode. + */ + File( const String& path, FileModes mode ) + { + PCL_PRECONDITION( !path.IsEmpty() ) + Initialize(); + Open( path, mode ); + } + + /*! + * Move constructor. + */ + File( File&& x ) + : m_fileHandle( x.m_fileHandle ) + , m_filePath( std::move( x.m_filePath ) ) + , m_fileMode( x.m_fileMode ) + { + x.m_fileHandle = s_invalidHandle; + x.m_fileMode = FileMode::Zero; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + File& operator =( File&& x ) + { + if ( &x != this ) + { + if ( IsOpen() ) + Close(); + m_fileHandle = x.m_fileHandle; + m_filePath = std::move( x.m_filePath ); + m_fileMode = x.m_fileMode; + x.m_fileHandle = s_invalidHandle; + x.m_fileMode = FileMode::Zero; + } + return *this; + } + + /*! + * Destroys a %File object. If this instance represents an open file, it is + * closed upon destruction. + */ + virtual ~File() + { + if ( IsOpen() ) + Close(); + } + + /*! + * Copy constructor. This constructor is disabled because files are unique + * objects. + */ + File( const File& ) = delete; + + /*! + * Copy assignment. This operator is disabled because files are unique + * objects. + */ + File& operator =( const File& ) = delete; + + /*! + * Returns true iff this %File object represents an open file. + */ + bool IsOpen() const + { + return IsValidHandle( m_fileHandle ); + } + + /*! + * Returns the path of the file represented by this %File object. + * Returned file paths are always absolute, full file paths. + */ + const String& FilePath() const + { + return m_filePath; + } + + /*! + * Returns the path of the file represented by this %File object. + * + * \deprecated This member function has been deprecated. Use FilePath() in + * newly produced code. + */ + const String& FileName() const + { + return FilePath(); + } + + /*! + * Returns the file mode for this %File object. + */ + FileModes Mode() const + { + return m_fileMode; + } + + /*! + * Returns true iff this file allows read access. + */ + virtual bool CanRead() const + { + return m_fileMode.IsFlagSet( FileMode::Read ); + } + + /*! + * Returns true iff this file allows write access. + */ + virtual bool CanWrite() const + { + return m_fileMode.IsFlagSet( FileMode::Write ); + } + + /*! + * Returns the current file position, relative to the beginning of the file + * represented by this %File object. + */ + virtual fpos_type Position() const; + + /*! + * Sets the file position relative to the file beginning. + */ + virtual void SetPosition( fpos_type pos ); + + /*! + * Moves the file pointer. Returns the resulting pointer position from the + * file beginning. + * + * \param dist Distance to move in bytes. + * \param mode Seek mode. See the SeekMode namespace for valid modes. + */ + fpos_type Seek( fpos_type dist, seek_mode mode = SeekMode::FromCurrent ); + + /*! + * Moves the file pointer after the end of the file. + * Returns the size of this file, that is, the absolute position of the last + * byte plus one. + * + * This is a convenience member function, equivalent to + * Seek( 0, SeekMode::FromEnd ) + */ + fpos_type SeekEnd() + { + return Seek( 0, SeekMode::FromEnd ); + } + + /*! + * Moves the file pointer to the beginning of this file. + * + * This is a convenience member function, equivalent to SetPosition( 0 ) + */ + void Rewind() + { + SetPosition( 0 ); + } + + /*! + * Returns true iff the file pointer has been moved beyond the end of the + * file. + */ + bool IsEOF() const + { + return Position() >= Size(); + } + + /*! + * Returns the length in bytes of this file. + */ + virtual fsize_type Size() const; + + /*! + * Truncates or extends this file to the specified \a length. + */ + virtual void Resize( fsize_type length ); + + /*! + * Reads a contiguous block of \a len bytes into the specified \a buffer. + */ + virtual void Read( void* buffer, fsize_type len ); + + /*! + * Reads an object \a x of type T. + */ + template + void Read( T& x ) + { + Read( (void*)&x, sizeof( T ) ); + } + + /*! + * Reads a set of \a n consecutive objects of type T into the array pointed + * to by \a a. + * + * This is a convenience member function, equivalent to + * Read( (void*)a, n*sizeof( T ) ) + */ + template + void ReadArray( T* a, size_type n ) + { + Read( (void*)a, n*sizeof( T ) ); + } + + /*! + * Reads a numeric variable as a 32-bit signed integer. + */ + template + void ReadI32( T& x ) + { + int32 i; Read( i ); x = T( i ); + } + + /*! + * Reads a numeric variable as a 32-bit unsigned integer. + */ + template + void ReadUI32( T& x ) + { + uint32 i; Read( i ); x = T( i ); + } + + /*! + * Reads a numeric variable as a 64-bit signed integer. + */ + template + void ReadI64( T& x ) + { + int64 i; Read( i ); x = T( i ); + } + + /*! + * Reads a numeric variable as a 64-bit unsigned integer. + */ + template + void ReadUI64( T& x ) + { + uint64 i; Read( i ); x = T( i ); + } + + /*! + * Writes a contiguous block of \a len bytes from the specified \a buffer. + */ + virtual void Write( const void* buffer, fsize_type len ); + + /*! + * Writes an object \a x of type T. + */ + template + void Write( const T& x ) + { + Write( (const void*)&x, sizeof( T ) ); + } + + /*! + * Writes a set of \a n consecutive objects of type T from the array pointed + * to by \a a. + * + * This is a convenience member function, equivalent to + * Write( (const void*)a, n*sizeof( T ) ) + */ + template + void WriteArray( const T* a, size_type n ) + { + Write( (const void*)a, n*sizeof( T ) ); + } + + /*! + * Writes a numeric variable as a 32-bit signed integer. + */ + template + void WriteI32( const T& x ) + { + Write( int32( x ) ); + } + + /*! + * Writes a numeric variable as a 32-bit unsigned integer. + */ + template + void WriteUI32( const T& x ) + { + Write( uint32( x ) ); + } + + /*! + * Writes a numeric variable as a 64-bit signed integer. + */ + template + void WriteI64( const T& x ) + { + Write( int64( x ) ); + } + + /*! + * Writes a numeric variable as a 64-bit unsigned integer. + */ + template + void WriteUI64( const T& x ) + { + Write( uint64( x ) ); + } + + /*! + * Reads a boolean variable. + * + * This function reads a 32-bit integer and assigns true to the variable + * \a b iff the read number is nonzero. + */ + void Read( bool& b ) + { + unsigned i; ReadUI32( i ); b = i != 0; + } + + /*! + * Writes a boolean variable. + * + * This function writes a 32-bit integer with a value of 1 (one) if the + * variable \a b is true, zero otherwise. + */ + void Write( const bool& b ) + { + WriteUI32( b ? 1 : 0 ); + } + + /*! + * Reads a dynamic 8-bit string stored as binary data. The data should have + * been generated by a previous call to Write( const IsoString& ) on the + * file being read. + */ + void Read( IsoString& s ); + + /*! + * Reads a dynamic UTF-16 string stored as binary data. The data should have + * been generated by a previous call to Write( const IsoString& ) on the + * file being read. + */ + void Read( String& s ); + + /*! + * Writes a sequence of 8-bit characters, defined by the range [i,j), as + * binary data. + */ + void Write( const char* i, const char* j ); + + /*! + * Writes a null-terminated 8-bit string as binary data. + */ + void Write( const char* s ) + { + Write( s, s + IsoCharTraits::Length( s ) ); + } + + /*! + * Writes a dynamic 8-bit string as binary data. + */ + void Write( const IsoString& s ) + { + Write( s.Begin(), s.End() ); + } + + /*! + * Writes a sequence of UTF-16 characters, defined by the range [i,j), as + * binary data. + */ + void Write( const char16_type* i, const char16_type* j ); + + /*! + * Writes a null-terminated string of UTF-16 characters as binary data. + */ + void Write( const char16_type* s ) + { + Write( s, s + CharTraits::Length( s ) ); + } + + /*! + * Writes a dynamic UTF-16 string as binary data. + */ + void Write( const String& s ) + { + Write( s.Begin(), s.End() ); + } + +#ifndef __PCL_NO_FLAGS_FILE_IO + + /*! + * Reads a set of flags \a f. + */ + template + static void Read( Flags& f ) + { + Read( f.m_flags ); + } + + /*! + * Reads a set of flags \a f as an unsigned 32-bit integer. + */ + template + static void ReadUI32( Flags& f ) + { + ReadUI32( f.m_flags ); + } + + /*! + * Writes a set of flags \a f. + */ + template + static void Write( Flags f ) + { + Write( f.m_flags ); + } + + /*! + * Writes a set of flags \a f as an unsigned 32-bit integer. + */ + template + static void WriteUI32( Flags f ) + { + WriteUI32( f.m_flags ); + } + +#endif + + /*! + * Writes a sequence of 8-bit characters, defined by the range [i,j), as + * plain text. + */ + void OutText( const char* i, const char* j ) + { + if ( i < j ) + Write( (const void*)i, fsize_type( j - i ) ); + } + + /*! + * Writes a null-terminated 8-bit string as plain text. + */ + void OutText( const char* s ) + { + OutText( s, s + IsoCharTraits::Length( s ) ); + } + + /*! + * Writes a dynamic 8-bit string as plain text. + */ + void OutText( const IsoString& s ) + { + OutText( s.Begin(), s.End() ); + } + + /*! + * Writes a sequence of UTF-16 characters, defined by the range [i,j), as + * plain text. + */ + void OutText( const char16_type* i, const char16_type* j ) + { + if ( i < j ) + Write( (const void*)i, fsize_type( j - i ) << 1 ); + } + + /*! + * Writes a null-terminated UTF-16 string as plain text. + */ + void OutText( const char16_type* s ) + { + OutText( s, s + CharTraits::Length( s ) ); + } + + /*! + * Writes a dynamic UTF16 string as plain text. + */ + void OutText( const String& s ) + { + OutText( s.Begin(), s.End() ); + } + + /*! + * Writes a sequence of 8-bit characters, defined by the range [i,j), as + * plain text. Then writes a newline character. + */ + void OutTextLn( const char* i, const char* j ) + { + OutText( i, j ); Write( '\n' ); + } + + /*! + * Writes a null-terminated 8-bit string as plain text and appends a newline + * character. + */ + void OutTextLn( const char* s ) + { + OutText( s ); Write( '\n' ); + } + + /*! + * Writes an 8-bit newline character ('\n'). + * + * \warning Do not use this member function if you are generating plain text + * encoded as UTF-16, for example in a sequence of calls to + * OutTextLn( const String& s ). In such case you can call:\n + * \n + * \code OutTextLn( String() ); \endcode \n + * \n + * to generate a newline in UTF-16 format. + */ + void OutTextLn() + { + Write( '\n' ); + } + + /*! + * Writes a dynamic 8-bit string as plain text and appends a newline + * character. + */ + void OutTextLn( const IsoString& s ) + { + OutText( s ); Write( '\n' ); + } + + /*! + * Writes a sequence of UTF-16 characters, defined by the range [i,j), as + * plain text. Then writes a newline character. + */ + void OutTextLn( const char16_type* i, const char16_type* j ) + { + OutText( i, j ); Write( char16_type( '\n' ) ); + } + + /*! + * Writes a null-terminated UTF-16 string as plain text and appends a + * newline character. + */ + void OutTextLn( const char16_type* s ) + { + OutText( s ); Write( char16_type( '\n' ) ); + } + + /*! + * Writes a dynamic UTF16 string as plain text and appends a newline + * character. + */ + void OutTextLn( const String& s ) + { + OutText( s ); Write( char16_type( '\n' ) ); + } + + /*! + * Commits any pending write operations. + */ + void Flush(); + + /*! + * Opens or creates a file. + * + * \param path The path to the file to be opened or created. + * + * \param mode Desired file access, share (Windows only) and + * opening/creation mode. By default, an existing file will + * be opened for (exclusive on Windows) read-only access. + */ + virtual void Open( const String& path, FileModes mode = FileMode::Read|FileMode::Open ); + + /*! + * Opens an existing file at the specified \a path. On Windows, the file is + * opened for shared read-only access (on UNIX and Linux, file access is + * handled automatically, so there is no need to define 'sharing modes'). + */ + virtual void OpenForReading( const String& path ) + { + Open( path, FileMode::Read|FileMode::Open|FileMode::ShareRead ); + } + + /*! + * Returns an open existing file at the specified \a path. On Windows, the + * file is opened for shared read-only access (on UNIX and Linux, file + * access is handled automatically, so there is no need to define 'sharing + * modes'). + */ + static File OpenFileForReading( const String& path ) + { + File f; + f.OpenForReading( path ); + return f; + } + + /*! + * Opens an existing file at \a path for exclusive read/write access. + */ + virtual void OpenForReadWrite( const String& path ) + { + Open( path, FileMode::Read|FileMode::Write|FileMode::Open ); + } + + /*! + * Returns an open existing file at the specified \a path, ready for + * exclusive read/write access. + */ + static File OpenFileForReadWrite( const String& path ) + { + File f; + f.OpenForReadWrite( path ); + return f; + } + + /*! + * Creates a file at the specified \a path for exclusive read/write access. + * If a file already exists at the same \a path, its contents will be + * truncated to zero length. + */ + virtual void Create( const String& path ) + { + Open( path, FileMode::Read|FileMode::Write|FileMode::Create ); + } + + /*! + * Returns a newly created file at the specified \a path, ready for + * exclusive read/write access. If a file already exists at the same + * \a path, its contents will be truncated to zero length. + */ + static File CreateFile( const String& path ) + { + File f; + f.Create( path ); + return f; + } + + /*! + * Creates a file at the specified \a path for exclusive write-only access. + * If a file already exists at the same \a path, its contents will be + * truncated to zero length. + */ + virtual void CreateForWriting( const String& path ) + { + Open( path, FileMode::Write|FileMode::Create ); + } + + /*! + * Returns a newly created file at the specified \a path, ready for + * exclusive write-only access. If a file already exists at the same + * \a path, its contents will be truncated to zero length. + */ + static File CreateFileForWriting( const String& path ) + { + File f; + f.CreateForWriting( path ); + return f; + } + + /*! + * Opens a file at the specified \a path if it exists, or creates it + * otherwise. The file will be opened in exclusive read/write mode. + */ + void OpenOrCreate( const String& path ) + { + Open( path, FileMode::Read|FileMode::Write|FileMode::Open|FileMode::Create ); + } + + /*! + * Returns an open file at the specified \a path if it already exists, or a + * newly created file otherwise, ready for exclusive read/write access. + */ + static File OpenOrCreateFile( const String& path ) + { + File f; + f.OpenOrCreate( path ); + return f; + } + + /*! + * Closes an open file. If this file has not been opened, calling this + * member function has no effect. + */ + virtual void Close(); + + /*! + * Removes an existing file at the specified \a filePath. + */ + static void Remove( const String& filePath ); + + /*! + * Creates a new directory at the specified \a dirPath. + * + * If \a createIntermediateDirectories is true (the default value) and + * \a dirPath specifies one or more parent directories that don't exist, + * they are created automatically. + */ + static void CreateDirectory( const String& dirPath, bool createIntermediateDirectories = true ); + + /*! + * Removes an existing \e empty directory at the specified \a dirPath. + * + * The specified directory must be empty, or this function will fail. + */ + static void RemoveDirectory( const String& dirPath ); + + /*! + * Moves and/or renames a file. + * + * \param filePath Current path of the file to move/rename + * + * \param newFilePath New path. If the directory in \a newFilePath is the + * same as in \a filePath, or if no directory is specified, the + * file is just renamed. If a different directory is specified, + * the file is also moved. + * + * \warning This function can only move or rename a file to stay in the same + * physical device. To move a file across devices, use the File::MoveFile() + * static member function. + */ + static void Move( const String& filePath, const String& newFilePath ); + + /*! + * Returns true iff a file at the specified \a filePath exists. + */ + static bool Exists( const String& filePath ); + + /*! + * Returns true iff a directory at the specified \a dirPath exists. + */ + static bool DirectoryExists( const String& dirPath ); + + /*! + * Ensures existence of a file on the local filesystem, guaranteeing that a + * newly created file cannot replace or overwrite an already existing file, + * or clash with an existing directory. + * + * \param[in,out] filePath Path to the file that must exist with + * guaranteed uniqueness. The value of the variable referenced + * by this parameter can be modified on output; see the + * \a canOverwrite parameter and the description below for + * further details. + * + * \param canOverwrite If this parameter is false and the specified + * \a filePath corresponds to an already existing file, the + * string referenced by \a filePath will be replaced on output + * with a new path on the same directory where the file name has + * been modified to guarantee that no file existed with the same + * name upon calling this function. If this parameter is true + * the \a filePath string won't be modified in any way. + * + * After calling this function, a file at the path specified by the output + * value of the \a filePath variable is guaranteed to exist, either because + * such file already existed when the function was called and the + * \a canOverwrite parameter was true, or because a new empty file has been + * created otherwise. Already existing files are never touched or modified + * in any way by this function (beyond the fact that they are accessed to + * verify their existence). + * + * Returns a UniqueFileChecks structure where the \a exists member indicates + * whether the specified \a filePath corresponds to an already existing file + * upon calling this function, and the \a overwrite member is true iff an + * existing file can be overwritten because the specified \a canOverwrite + * parameter is true. + * + * When the \a filePath string is altered to provide a unique file name, the + * file path is made unique by appending the literal representation of an + * unsigned integer, preceded by an underscore character, to the file name + * component. For example, if this function is called as follows when the + * specified file already exists: + * + * \code + * String filePath = "/path/to/foo.bar"; // this file exists + * EnsureNewUniqueFile( filePath ); + * \endcode + * + * then the \c filePath variable could have the value "/path/to/foo_1.bar", + * and a new, empty file would have been created at that path. Successive + * calls would set \c filePath equal to "/path/to/foo_2.bar", + * "/path/to/foo_3.bar", and so on, creating the corresponding new files. + * + * \note This static member function is thread-safe. It will provide + * coherent results when invoked from multiple threads running concurrently. + */ + static UniqueFileChecks EnsureNewUniqueFile( String& filePath, bool canOverwrite = false ); + + /*! + * Ensures existence of a directory on the local filesystem, guaranteeing + * that a new, empty directory will be created in case a file or directory + * at the specified path already existed when the function was called. + * + * \param[in,out] dirPath Path to the directory that must exist with + * guaranteed uniqueness. The value of the variable referenced + * by this parameter can be modified on output; see the + * description below for further details. + * + * After calling this function, a directory at the path specified by the + * output value of the \a dirPath variable is guaranteed to exist, either + * because such directory already existed when the function was called, or + * because a new empty directory has been created otherwise. Already + * existing directories or files are never touched or modified in any way by + * this function (beyond the fact that they are accessed to verify their + * existence). + * + * Returns a UniqueFileChecks structure where the \a exists member indicates + * whether the specified \a dirPath corresponds to an already existing + * directory upon calling this function, and the \a overwrite member is + * always false, reflecting the fact that a directory cannot be overwritten. + * + * If the specified directory already exists, the string referenced by + * \a dirPath will be altered to provide a unique directory name on the same + * parent directory. In such case the path is made unique by appending the + * literal representation of an unsigned integer, preceded by an underscore + * character, to the file name component. For example, if this function is + * called as follows when the specified directory already exists: + * + * \code + * String dirPath = "/path/to/foobar"; // this directory exists + * EnsureNewUniqueDirectory( dirPath ); + * \endcode + * + * then the \c dirPath variable could have the value "/path/to/foobar_1" and + * a new, empty directory would have been created at that path. Successive + * calls would set \c dirPath equal to "/path/to/foobar_2", + * "/path/to/foobar_3", and so on, creating the corresponding new + * directories. + * + * The string referenced by the specified \a dirPath variable can optionally + * end with a directory separator character, which will be preserved in case + * the string is modified. + * + * \note This static member function is thread-safe. It will provide + * coherent results when invoked from multiple threads running concurrently. + */ + static UniqueFileChecks EnsureNewUniqueDirectory( String& dirPath ); + + /*! + * Returns true iff the file at \a filePath exists and the current user has + * read-only access to it. + */ + static bool IsReadOnly( const String& filePath ); + + /*! + * Enables or disables read-only access to a file at the specified + * \a filePath. + */ + static void SetReadOnly( const String& filePath, bool rdOnly = true ); + + /*! + * Disables or enables read-only access to a file at the specified + * \a filePath. + * + * This is a convenience member function, equivalent to + * SetReadOnly( filePath, false ) + */ + static void SetReadWrite( const String& filePath ) + { + SetReadOnly( filePath, false ); + } + + /*! + * Reads the contents of a file at the specified \a filePath and returns + * them as a ByteArray object. + */ + static ByteArray ReadFile( const String& filePath ); + + /*! + * Creates a file with the specified contents. + * + * \param filePath Path to the file that will be created. + * + * \param contents Reference to a ByteArray object providing the contents + * that will be written to the newly created file. + * + * Typically this function is used along with File::ReadFile() to implement + * a file copying routine; for example: + * + * \code + * void CopyFile( const String& targetFilePath, const String& sourceFilePath ) + * { + * File::WriteFile( targetFilePath, File::ReadFile( sourceFilePath ) ); + * } + * \endcode + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void WriteFile( const String& filePath, const ByteArray& contents ); + + /*! + * Creates a file with a subset of a ByteArray container. + * + * \param filePath Path to the file that will be created. + * + * \param contents Reference to a ByteArray object providing the contents + * that will be written to the newly created file. + * + * \param start Zero-based index of the first byte to be written. + * + * \param size Number of bytes that will be written. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void WriteFile( const String& filePath, const ByteArray& contents, size_type start, size_type size ); + + /*! + * Creates a file with the specified contents. + * + * \param filePath Path to the file that will be created. + * + * \param data Pointer to the first byte to be written to the newly + * created file. + * + * \param size Number of contiguous bytes, starting from \a data, to + * be written. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void WriteFile( const String& filePath, const void* data, size_type size ); + + /*! + * Reads the contents of a file at the specified \a filePath and returns + * them as plain text stored in a dynamic 8-bit string. + * + * This function is useful to load document files encoded in UTF-8, + * ISO/IEC-8859-1 (or Latin-1), and other 8-bit encodings. + */ + static IsoString ReadTextFile( const String& filePath ); + + /*! + * Creates a file with the specified plain text content. + * + * \param filePath Path to the file that will be created. + * + * \param text Reference to an IsoString object providing the plain + * text that will be written to the newly created file. + * + * This function is useful to generate document files encoded in UTF-8, + * ISO/IEC-8859-1 (or Latin-1), and other 8-bit encodings. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void WriteTextFile( const String& filePath, const IsoString& text ); + + /*! + * Changes the access permissions of a file or directory. + * + * \param targetPath Path to the existing file or directory whose + * permissions will be modified. + * + * \param permissions An ORed combination of file permission flags. See + * the FilePermission namespace for contants. + * + * On UNIX and Linux platforms (FreeBSD, GNU Linux, Mac OS X), the read, + * write and execution permissions can be specified separately for the owner + * user, for the owner group, and for the rest of users. On Windows, only + * generic read and write permissions can be set, and there are no execution + * permissions. + */ + static void SetPermissions( const String& targetPath, FileAttributes permissions ); + + /*! + * Copies access and modification times and access permissions from one + * file or directory item to another. + * + * \param targetPath Path to the target item whose times and permissions + * will be changed. + * + * \param sourcePath Path to the source item whose times and permissions + * will be copied to the target item. + */ + static void CopyTimesAndPermissions( const String& targetPath, const String& sourcePath ); + +#ifndef __PCL_WINDOWS + /*! + * Copies a symbolic link. + * + * \param targetLinkPath Path to the target file. A new symbolic link will + * be created at this path, which will point to the + * same link target as the source link. + * + * \param sourceLinkPath Path to the source link, whose target will be + * copied to the target link. + * + * Note that this function creates a duplicate of the symbolic link itself, + * \e not of its pointed file. + * + * \note This static member function is only defined on UNIX and Linux + * platforms. It does not make sense on Windows, where POSIX symbolic links + * don't exist. + */ + static void CopyLink( const String& targetLinkPath, const String& sourceLinkPath ); +#endif // !__PCL_WINDOWS + + /*! + * Copies a single file. + * + * \param targetFilePath Path to the target file, which must \e not exist. + * If the specified file exists, an Error exception + * will be thrown. + * + * \param sourceFilePath Path to the source file. This file must exist and + * must be different from the specified target file. + * + * \param progress Pointer to an instance of (a derived class of) + * File::Progress. If a non-null pointer is + * specified, the object will be used to provide + * progress information and the possibility of + * aborting the file copy operation. The default + * value is \c nullptr. + * + * The file copy operation is implemented as an iterative block copying + * routine. This means that huge files can be copied with minimal + * consumption of memory resources and no specific file size limit. + * + * Along with the file contents, file access and modification times, as well + * as file access permissions, will also be copied by this function. + * + * This function does not follow symbolic links. It does not copy the file + * pointed to by a symbolic link, but the link itself. This is only relevant + * to platforms that support symbolic links (i.e., all of them but Windows). + * + * If a \a progress object is specified, it receives successive calls to + * File::Progress::Add() with increments in bytes. If the progress object + * aborts the file copy operation, this member function throws a + * ProcessAborted exception. + */ + static void CopyFile( const String& targetFilePath, const String& sourceFilePath, File::Progress* progress = nullptr ); + + /*! + * Moves a single file. + * + * \param targetFilePath Path to the target file, which must \e not exist. + * If the specified file exists, an Error exception + * will be thrown. + * + * \param sourceFilePath Path to the source file. This file must exist and + * must be different from the specified target file. + * + * \param progress Pointer to an instance of (a derived class of) + * File::Progress. If a non-null pointer is + * specified, the object will be used to provide + * progress information and the possibility of + * aborting the file copy operation. The default + * value is \c nullptr. + * + * For file move operations within the same physical device, this function + * implements a simple rename operation. In these cases, the \a progress + * object (if specified) receives a single call to File::Progress::Add() + * with the total file size in bytes. + * + * When a file is moved to a different device, this member function first + * copies the source file to the target location using a routine equivalent + * to Copy(). When the entire file contents have been transferred, the + * source file is removed. + * + * Along with the file contents, file access and modification times, as well + * as file access permissions, will be preserved by this function. + * + * This function does not follow symbolic links. It does not move the file + * pointed to by a symbolic link, but the link itself. This is only relevant + * to platforms that support symbolic links (i.e., all of them but Windows). + * + * If a \a progress object is specified and it aborts the file move + * operation, this member function throws a ProcessAborted exception. In + * such case the source file is guaranteed to remain intact. + */ + static void MoveFile( const String& targetFilePath, const String& sourceFilePath, File::Progress* progress = nullptr ); + + /*! + * Returns true iff two files or directories are mounted on the same physical + * device. + * + * This is relevant to some critical file operations. For example, moving a + * file on the same device is a simple and fast rename operation. However, + * moving a file across devices involves copying the entire file contents. + * + * This function does not follow symbolic links. It does not consider + * mounted devices for files pointed to by symbolic links, but for the links + * themselves. This is only relevant to platforms that support symbolic + * links (all of them but Windows). + */ + static bool SameDevice( const String& path1, const String& path2 ); + + /*! + * Returns true iff two file path specifications refer to the same file on + * the system. + * + * On UNIX and Linux platforms, this function compares the device and inode + * numbers reported by the st_dev and st_ino members of the stat structure, + * respectively. This pair of numbers uniquely identifies every file on the + * system, irrespective of file names. + * + * On Windows platforms, this function verifies the devices that support + * both files and, if they are the same, performs a case-insensitive + * comparison of the canonical absolute versions of the specified paths. + * + * This function does not follow symbolic links. It does not consider + * mounted devices for files pointed to by symbolic links, but for the links + * themselves. This is only relevant to platforms that support symbolic + * links (all of them but Windows). + */ + static bool SameFile( const String& path1, const String& path2 ); + + /*! + * Reads all existing text lines from a file as 8-bit strings (e.g., + * ISO 8859-1 or UTF-8 formats) and returns them as a string list. + * + * \param filePath Path to the source file from which text lines will + * be read. + * + * \param options Optional set of flags (ORed combination) that can be + * specified to control the way text lines are + * extracted and stored. Available flags are defined in + * the ReadTextOption namespace. + * + * Returns a string list (IsoStringList) with all existing lines in the + * specified file. If the file is empty, an empty string list is returned. + * + * This routine automatically detects and processes line ending sequences + * characteristic of all supported platforms: UNIX (LF = 0x0A), Windows + * (CR+LF = 0x0D+0x0A) and legacy Mac (CR = 0x0D). + */ + static IsoStringList ReadLines( const String& filePath, + ReadTextOptions options = ReadTextOptions() ); + + /*! + * Iterates a function through all existing text lines in a file. + * + * \param filePath Path to the source file from which text lines will + * be read. This file is assumed to store text as a + * sequence of 8-bit characters, e.g. ASCII, ISO 8859-1 + * or UTF-8. + * + * \param callback Callback function. This function will be invoked + * once for each text line. The function will receive + * two arguments: a char* with the starting address of + * an 8-bit null terminated string, and a void* which + * is the specified \a data argument. The function will + * return true if the process can continue for the next + * text line; false to stop the iteration. + * + * \param data A void* that will be passed to the callback function + * as its second argument on each call. The default + * value is \c nullptr. + * + * \param options Optional set of flags (ORed combination) that can be + * specified to control the way text lines are explored + * and passed to the callback function. Available flags + * are defined in the ReadTextOption namespace. + * + * Returns the number of text lines that have been scanned, i.e. the number + * of times the callback function has been invoked and has returned true. + * + * This routine avoids all the work associated with creating and storing new + * IsoString objects. When IsoString instances are not necessary to acquire + * the data being read, this routine can be much faster than ReadLines(), + * especially for vey large files. + * + * This routine automatically detects and processes line ending sequences + * characteristic of all supported platforms: UNIX (LF = 0x0A), Windows + * (CR+LF = 0x0D+0x0A) and legacy Mac (CR = 0x0D). + */ + static size_type ScanLines( const String& filePath, + bool (*callback)( char*, void* ), void* data = nullptr, + ReadTextOptions options = ReadTextOptions() ); + + /*! + * Returns the full, absolute local path to the specified \a path. + */ + static String FullPath( const String& path ); + + /*! + * Returns a valid URI with the "file" scheme corresponding to the specified + * local \a path. + * + * The returned URI is valid as specified by RFC 1738 and RFC 8089. The + * following characters will always be percent-encoded when present in the + * specified \a path: + * + * - Non-printable US-ASCII characters in the ranges [00-1F] and [7F-FF]. + * + * - Unsafe characters: ' ', '<', '>', '#', '"', '%', '{', '}', '|', '\\', + * '^', '~', '[', ']', '`' + * + * - Reserved characters: ';', '?', ':', '@', '=', '&'. + * + * The returned URI will include the specified path transformed to a full + * absolute local path with UNIX directory separators, encoded in UTF-8, + * percent-encoded as necessary, and prefixed with the "file://" scheme. + * + * On Windows, a drive letter will always be present, prefixed with a root + * directory specifier, and the colon separator will be used; for example: + * + * file:///c:/path/to/local%20file.txt + * + * \b References: + * + * https://tools.ietf.org/html/rfc1738 \n + * https://tools.ietf.org/html/rfc8089 \n + */ + static IsoString FileURI( const String& path ); + + /*! + * Returns the system temporary storage directory. + * + * On FreeBSD, Linux and macOS, this function returns the value of the + * TMPDIR environment variable if it is defined, nonempty, and is a valid + * path to an existing directory. Otherwise this function returns "/tmp". + * + * On Windows, this function returns the directory designated for storage of + * temporary files. Normally this is the value of the TMP or TEMP + * environment variable. If no valid directory can be retrieved this way + * (which is extremely weird), this function attempts to return the user's + * profile directory, as reported by the USERPROFILE variable. If that also + * fails, "C:/tmp" is returned if it exists, or the current working + * directory as a last resort. + */ + static String SystemTempDirectory(); + + /*! + * Returns the system cache storage directory. + * + * On FreeBSD, Linux and Windows, this function is equivalent to + * SystemTempDirectory(). + * + * On macOS, this function returns the user's local cache folder, namely + * "~/Library/Caches" if it exists (it must), or SystemTempDirectory() + * otherwise. + */ + static String SystemCacheDirectory(); + + /*! + * Returns the home directory of the current user. + * + * On FreeBSD, Linux and macOS, this function returns the value of the HOME + * environment variable if it is defined, nonempty, and is a valid path to + * an existing directory. In the extremely weird case this does not happen, + * the system root directory '/' is returned as a last resort. + * + * On Windows, this function returns the root directory of the current + * user's profile. This is normally the value of the USERPROFILE environment + * variable. In case this fails, the HOMEDRIVE, HOMEPATH and HOME variables + * are checked for validity. If everything fails, the SYSTEMDRIVE variable + * is checked and ultimately "C:/" is returned. + */ + static String HomeDirectory(); + + /*! + * Converts a path from Windows to UNIX syntax. Replaces all occurrences of + * the '\\' Windows separator with the '/' UNIX separator. + */ + static String WindowsPathToUnix( const String& path ); + + /*! + * Converts a path from UNIX to Windows. Replaces all occurrences of + * the '/' UNIX separator with the '\\' Windows separator. + */ + static String UnixPathToWindows( const String& path ); + + /*! + * Returns a nonexistent, randomly generated file name. + * + * \param directory Name of an existing directory where the generated file + * name is guaranteed to be unique. If empty or not + * specified, the current directory of the calling process + * will be used. + * + * \param n Number of random characters in the generated file name. + * Must be at least five characters. The default value is + * twelve characters. + * + * \param prefix An optional prefix that will be prepended to the + * generated file name. + * + * \param postfix An optional postfix that will be appended to the + * generated file name. + * + * This function returns the full absolute path of a nonexistent file name + * generated by concatenation of \a n random characters. For compatibility + * with case-insensitive file systems (FAT, NTFS), only uppercase characters + * and decimal digits are used in the generated file name. + * + * The returned file name is guaranteed to be unique on the specified + * directory (or on the current directory of the calling process if no + * directory is specified) just after this function returns. Note that since + * a high-quality random number generator is used to select file name + * characters, there is no practical chance for a race condition by calling + * this function from several threads concurrently. + */ + static String UniqueFileName( const String& directory = String(), int n = 12, + const String& prefix = String(), const String& postfix = String() ); + + /*! + * Retrieves the storage space available on the device that supports a + * specified directory. + * + * \param dirPath A path specification to an existing directory on the + * local filesystem. On Windows, UNC paths are fully + * supported. Symbolic links are supported on all + * platforms. If a symbolic link is specified, the + * returned values refer to the target device. + * + * \param[out] totalBytes If non-null, the address of a variable that + * receives the total capacity in bytes of the device that + * supports the specified directory. + * + * \param[out] freeBytes If non-null, the address of a variable that + * receives the total number of free bytes on the device + * that supports the specified directory. + * + * Returns the total number of bytes available on the device that supports + * the specified directory. The returned values take into account any disk + * quotas that might apply to the user associated with the calling process. + */ + static uint64 GetAvailableSpace( const String& dirPath, uint64* totalBytes = nullptr, uint64* freeBytes = nullptr ); + + /*! + * Finds a Windows drive specification in the specified \a path. + * + * Returns the character index position of the drive found, or + * String::notFound. + * + * This function only makes sense on Windows. On UNIX and Linux operating + * systems, this function always returns String::notFound. + */ + static size_type FindDrive( const String& path ); + + /*! + * Finds a file name in the specified \a path. + * + * Returns the character index position of the name found, or + * String::notFound. + * + * For example, in '/foo/bar.tar.gz' the file name is 'bar'. + */ + static size_type FindName( const String& path ); + + /*! + * Finds a file extension in the specified \a path. + * + * Returns the character index position of the extension found, or + * String::notFound. + * + * The file extension, or file suffix, is the rightmost substring of \a path + * starting with the last occurrence of a dot character. For example, in + * 'foo.tar.gz' the file extension is '.gz'. + * + * \sa FindCompleteSuffix() + */ + static size_type FindExtension( const String& path ); + + /*! + * A synonym for FindExtension(). + */ + static size_type FindSuffix( const String& path ) + { + return FindExtension( path ); + } + + /*! + * Finds the complete file suffix in the specified \a path. + * + * Returns the character index position of the complete suffix found, or + * String::notFound. + * + * The complete suffix is the rightmost substring of the \a path starting + * with the first occurrence of a dot character. For example, in + * 'foo.tar.gz' the complete suffix is '.tar.gz'. + * + * \sa FindSuffix() + */ + static size_type FindCompleteSuffix( const String& path ); + + /*! + * Extracts a Windows drive specification from the specified \a path. + * + * Returns the extracted drive specification as a new string, or an empty + * string if no drive was found. + * + * This function only makes sense on Windows. On UNIX and Linux operating + * systems, this function always returns an empty string. + */ + static String ExtractDrive( const String& path ); // always empty string on X + + /*! + * Extracts a directory specification from the specified \a path. + * + * Returns the extracted directory specification, or an empty string if no + * directory was found. On Windows, the drive element of the path is not + * included. + * + * Examples: + * + * In '/foo.tar.gz' the directory is '/'. + * In '/foo/bar.tar.gz' the directory is '/foo'. + * In 'foo/bar.tar.gz' the directory is 'foo'. + * In 'C:/Foo/Bar.txt' the directory is '/Foo'. + */ + static String ExtractDirectory( const String& path ); + + /*! + * Extracts a file name from the specified \a path. + * + * Returns the extracted name, or an empty string if no file name was found. + * The file extension or suffix is not included. + * + * Examples: + * + * In '/foo/bar.tar.gz' the name is 'bar.tar'. + * In 'C:/Foo/Bar.txt' the name is 'Bar'. + */ + static String ExtractName( const String& path ); + + /*! + * Extracts a file extension from the specified \a path. + * + * Returns the extracted extension, or an empty string if no file extension + * was found. The returned extension \e includes the initial dot separator. + * + * Examples: + * + * In '/foo/bar.tar.gz' the extension is '.gz'. + * In 'C:/Foo/Bar.txt' the extension is '.txt'. + * + * \sa ExtractCompleteSuffix() + */ + static String ExtractExtension( const String& path ); + + /*! + * A synonym for ExtractExtension(). + */ + static String ExtractSuffix( const String& path ) + { + return ExtractExtension( path ); + } + + /*! + * Extracts the complete file suffix from the specified \a path. + * + * Returns the extracted complete suffix, or an empty string if no file + * suffix was found. The returned string \e includes the initial dot + * separator. + * + * The complete suffix is the ending substring of the file identifier in the + * specified \a path, starting with the first occurrence of a dot character. + * For example, in 'foo.tar.gz' the complete suffix is '.tar.gz'. + * + * \sa ExtractSuffix() + */ + static String ExtractCompleteSuffix( const String& path ); + + /*! + * Extracts the file name and extension from the specified \a path. Calling + * this member function is functionally equivalent to: + * + * File::ExtractName( path ) + File::ExtractExtension( path ) + */ + static String ExtractNameAndExtension( const String& path ); + + /*! + * A synonym for ExtractNameAndExtension(). + */ + static String ExtractNameAndSuffix( const String& path ) + { + return ExtractNameAndExtension( path ); + } + + /*! + * Changes the current file extension in \a filePath to a new extension + * \a ext. If it is not an empty string, the specified extension \e must + * include the initial dot separator. + * + * If the specified new extension \a ext is an empty string, this function + * returns \a filePath with its extension (if any) removed. + * + * Returns the resulting path after changing the file extension to the + * specified value. + */ + static String ChangeExtension( const String& filePath, const String& ext ); + + /*! + * Appends a \a postfix string to the current file name in the specified + * \a filePath. Returns the resulting path. + */ + static String AppendToName( const String& filePath, const String& postfix ); + + /*! + * Prepends a \a prefix string to the current file name in the specified + * \a filePath. Returns the resulting path. + */ + static String PrependToName( const String& filePath, const String& prefix ); + + /*! + * Returns a readable textual representation of a file size with automatic + * units conversion. + * + * \param sizeInBytes The file size in bytes. + * + * \param precision The number of decimal digits used to represent + * floating point numbers. The default value is 3. + * + * \param alsoShowBytes Whether to add the size in bytes to the string + * representation, irrespective of the units used. The + * default value is false. + * + * Examples: + * + * \code + * String s1 = File::SizeAsString( 21771472 ); + * // s1 = "20.763 MiB" + * String s2 = File::SizeAsString( 21771472, 2, true ); + * // s2 = "20.76 MiB (21771472 bytes)" + * String s3 = File::SizeAsString( 4727, 4 ); + * // s3 = "4.6162 KiB" + * \endcode + */ + static String SizeAsString( fsize_type sizeInBytes, int precision = 3, bool alsoShowBytes = false ); + +protected: + + handle m_fileHandle; + String m_filePath; + FileModes m_fileMode; + + static const handle s_invalidHandle; + + void Initialize(); + virtual bool IsValidHandle( handle h ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_File_h + +// ---------------------------------------------------------------------------- +// EOF pcl/File.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileDataCache.h b/3rdparty/include/pcl/FileDataCache.h new file mode 100644 index 0000000..82e5f21 --- /dev/null +++ b/3rdparty/include/pcl/FileDataCache.h @@ -0,0 +1,549 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileDataCache.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileDataCache_h +#define __PCL_FileDataCache_h + +/// \file pcl/FileDataCache.h + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FileDataCacheItem + * \brief Element of a file data cache + * + * This class represents a file in a FileDataCache object. This is a basic + * cache item structure to transport a full file path and, the known time of + * last file modification, and the time of last cache access. + */ +class PCL_CLASS FileDataCacheItem +{ +public: + + String path; //!< Full path to the file represented by this item. + TimePoint time; //!< Cached file time. + TimePoint lastUsed; //!< Time this cache item was last used. + + /*! + * Virtual destructor. + */ + virtual ~FileDataCacheItem() + { + } + + /*! + * Assigns data from another cache \a item. + */ + void Assign( const FileDataCacheItem& item ) + { + path = item.path; + time = item.time; + lastUsed = item.lastUsed; + } + + /*! + * Returs true iff this object represents the same file as another cache + * \a item. + */ + bool operator ==( const FileDataCacheItem& item ) const + { + return path == item.path; + } + + /*! + * Returns true iff this object precedes another cache \a item. File cache + * items are sorted by full file paths in ascending order. + */ + bool operator <( const FileDataCacheItem& item ) const + { + return path < item.path; + } + + /*! + * Returns true iff the file represented by this cache item was last + * modified before the specified file time \a t. + * + * \note This member function ignores the milliseconds component of the + * specified FileTime instance, by setting it to zero. This is done to + * prevent wrong cache invalidations caused by unreliable file time + * milliseconds on Windows. + */ + bool ModifiedSince( FileTime t ) const + { + t.milliseconds = 0; + return time < TimePoint( t ); + } + + /*! + * Returns the amount of days elapsed since the time this cache item was + * last used. + */ + double DaysSinceLastUsed() const + { + return TimePoint::Now() - lastUsed; + } + +protected: + + /*! + * Assigns additional data stored in another file cache item. + * + * The default implementation does nothing. This virtual member function + * should be reimplemented by derived classes to ensure persistence of + * reimplementation-specific data. + */ + virtual void AssignData( const FileDataCacheItem& ) + { + } + + /*! + * Returns a string representation of additional data stored in this cache + * item. + * + * The default implementation returns an empty string. This virtual member + * function should be reimplemented by derived classes to allow access to + * reimplementation-specific data. + */ + virtual String DataToString() const + { + return String(); + } + + /*! + * Retrieves additional data from a list of string tokens. Returns true iff + * the data were successfully retrieved. + * + * The default implementation returns true. This virtual member function + * should be reimplemented by derived classes for retrieval of + * reimplementation-specific data. + */ + virtual bool GetDataFromTokens( const StringList& ) + { + return true; + } + + /*! + * Returns true iff the additional data stored in this cache item are valid. + * + * The default implementation returns true. This virtual member function + * should be reimplemented by derived classes for validation of + * reimplementation-specific data. + */ + virtual bool ValidateData() const + { + return true; + } + + /*! + * Returns a string serialization of a floating-point vector. The returned + * string can be deserialized with the GetVector() static member function. + */ + static String VectorToString( const DVector& ); + + /*! + * Deserializes a floating-point vector from the specified list of + * \a tokens, parsing the necessary tokens starting from the specified + * \a start iterator. + */ + static bool GetVector( DVector&, StringList::const_iterator& start, const StringList& tokens ); + + /*! + * Returns a string serialization of a floating-point matrix. The returned + * string can be deserialized with the GetMatrix() static member function. + */ + static String MatrixToString( const DMatrix& ); + + /*! + * Deserializes a floating-point matrix from the specified list of + * \a tokens, parsing the necessary tokens starting from the specified + * \a start iterator. + */ + static bool GetMatrix( DMatrix&, StringList::const_iterator& start, const StringList& tokens ); + + /*! + * Returns a string serialization of a floating-point multivector. The + * returned string can be deserialized with the GetMultiVector() static + * member function. + */ + static String MultiVectorToString( const DMultiVector& ); + + /*! + * Deserializes a floating-point vector from the specified list of + * \a tokens, parsing the necessary tokens starting from the specified + * \a start iterator. + */ + static bool GetMultiVector( DMultiVector&, StringList::const_iterator& start, const StringList& tokens ); + + /*! + * Returns a string serialization of an array of floating-point matrices. + * The returned string can be deserialized with the GetMatrices() static + * member function. + */ + static String MatricesToString( const Array& ); + + /*! + * Deserializes an array of floating-point matrices from the specified list + * of \a tokens, parsing the necessary tokens starting from the specified + * \a start iterator. + */ + static bool GetMatrices( Array&, StringList::const_iterator& start, const StringList& tokens ); + + /* + * Special constructor used for cache search operations. + */ + FileDataCacheItem( const String& p = String() ) : path( p ) + { + } + + /* + * Copy constructor. + */ + FileDataCacheItem( const FileDataCacheItem& ) = default; + +private: + + String ToString() const; + bool FromString( const String& s ); + + bool Load( const IsoString& keyPrefix, int index ); + void Save( const IsoString& keyPrefix, int index ) const; + + friend class FileDataCache; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class FileDataCache + * \brief Abstract base class of file data cache implementations. + * + * This class provides the necessary infrastructure to implement a file cache + * with persistent storage in module settings data. The main cache access + * functions provided by this class (to add, get and find cache items, as well + * as to clear the cache and query cache properties) are implemented as + * thread-safe routines. This supports applications performing parallel disk + * I/O operations. + * + * You'll find examples of use for this class in standard PixInsight modules + * such as ImageIntegration and SubframeSelector. + * + * \sa FileDataCacheItem, Settings + */ +class PCL_CLASS FileDataCache +{ +public: + + /*! + * Constructs a new file data cache with the specified settings \a key and + * maximum cache item duration in \a days. + * + * The specified \a key will be used to store all cache data structures + * associated with this object persistently in module settings data. See the + * Settings class for more information on module settings and settings keys. + * + * \warning If the specified number of \a days is ≤ 0, existing cache + * items will never expire. This is not recommended and can cause + * problems by increasing the size of stored core application settings + * indiscriminately. In general, the default maximum duration of 30 days is + * quite appropriate for most applications. + */ + FileDataCache( const IsoString& key, int days = 30 ); + + /*! + * Virtual destructor. + * + * Destroys and deallocates all file data cache items and internal + * structures associated with this object. Note that this refers to data + * currently stored in memory, not to persistent storage in module settings. + * To destroy data stored persistently, the Purge() member function must be + * called explicitly. + */ + virtual ~FileDataCache() + { + Clear(); + } + + /*! + * Returns an identifying name for this cache object. The default + * implementation returns "File Cache". Derived classes should reimplement + * this function to return more specific identifiers. + */ + virtual String CacheName() const + { + return "File Cache"; + } + + /*! + * Returns the current cache version. The default implementation returns 1. + * + * \sa MinSupportedVersion() + */ + virtual int Version() const + { + return 1; + } + + /*! + * Returns the minimum supported cache version. The default implementation + * returns 1. + * + * No items will be loaded from existing module settings data if their + * version is either less than the value returned by this function, or + * greater than the current cache version. This allows for a basic version + * control system with a range of valid cache versions. + * + * \sa Version() + */ + virtual int MinSupportedVersion() const + { + return 1; + } + + /*! + * Returns true iff this cache is currently enabled. A disabled cache does + * not load existing cache items when the Load() member function is invoked. + */ + bool IsEnabled() const + { + return m_enabled; + } + + /*! + * Enables this file data cache. + * + * Note that enabling a cache does not force a reload of existing cache + * items; the Load() member function must be called to perform that action. + * In the same way, disabling a cache does not remove any cache item, + * neither from existing internal data structures, nor from persistent + * settings storage. + */ + void Enable( bool enable ) + { + m_enabled = enable; + } + + /*! + * Returns the maximum duration in days of a valid cache item. + * + * Existing cache items that have not been accessed during a period larger + * than the value returned by this function will not be loaded from + * persistent settings data. + * + * \sa SetDuration(), NeverExpires() + */ + int Duration() const + { + return m_durationDays; + } + + /*! + * Sets a new maximum duration in days for valid cache items. + * + * \warning If the specified number of \a days is ≤ 0, existing cache + * items will never expire. This is not recommended and can cause + * problems by increasing the size of stored core application settings + * indiscriminately. In general, the default maximum duration of 30 days is + * quite appropriate for most applications. + * + * \sa Duration(), NeverExpires() + */ + void SetDuration( int days ) + { + m_durationDays = Max( 0, days ); + } + + /*! + * Returns true iff existing cache items associated with this object will + * never expire. + * + * \sa Duration(), SetDuration() + */ + bool NeverExpires() const + { + return m_durationDays <= 0; + } + + /*! + * Returns the total number of cache items associated with this object. + * + * The returned value corresponds to the number of cache items currently + * stored in internal data structures. This includes cache items loaded from + * existing module settings data as well as items newly created and possibly + * still not copied to persistent storage. + * + * \note This function is thread-safe. + */ + size_type NumberOfItems() const; + + /*! + * Returns true iff this cache is empty, i.e. if there are no cache items + * associated with this object. + * + * The returned value is the number of items currently stored in internal + * memory data structures. This does not necessarily equals the total number + * of items currently stored in persistent module settings. + * + * \note This function is thread-safe. + */ + bool IsEmpty() const; + + /*! + * Returns the address of a file cache item corresponding to the specified + * file \a path, or nullptr if no such cache item could be found. + * + * \note This function is thread-safe. + * + * \sa Get() + */ + const FileDataCacheItem* Find( const String& path ) const; + + /*! + * Destroys and removes all cache items currently associated with this + * object. + * + * Only items stored in internal memory data structures are removed by this + * function. Persistent storage in module settings data is not altered. + * + * \note This function is thread-safe. + */ + void Clear(); + + /*! + * Adds the specified \a item to this cache. + * + * The item will be stored in internal memory data structures, \e not in + * persistent module settings data. To store cache items persistently, the + * Save() member function must be called for this object. + * + * \note This function is thread-safe. + */ + void Add( const FileDataCacheItem& item ); + + /*! + * Retrieves a copy of the existing cache data corresponding to the + * specified file \a path in the specified \a item. + * + * Returns true iff a cache item for the specified \a path was found in + * internal memory data structures, and its data were copied. If false is + * returned, the specified \a item will not be modified in any way. + * + * \note This function is thread-safe. + * + * \sa Find() + */ + bool Get( FileDataCacheItem& item, const String& path ); + + /*! + * Loads existing cache items from persistent module settings data. + * + * All previously existing cache items stored in internal memory structures + * will be destroyed and deallocated before loading new data. + */ + virtual void Load(); + + /*! + * Writes all cache items associated with this object to persistent module + * settings data. + */ + virtual void Save() const; + + /*! + * Destroys and deallocates all existing cache items, including all items + * currently in internal memory data structures as well as all items stored + * in persistent module settings data. + */ + virtual void Purge() const; + +protected: + + /*! + * Allocates and constructs a new cache item. + * + * Returns a pointer to the newly created cache item. The new item will be + * owned by this object, which will destroy and deallocate it automatically + * when appropriate. + * + * This is a pure virtual member function that must be reimplemented by all + * derived classes. This is because the data transported by a cache item is + * application-specific and cannot be known in advance by this class. + */ + virtual FileDataCacheItem* NewItem() const = 0; + +private: + + typedef ReferenceSortedArray cache_index; + + mutable Mutex m_mutex; + cache_index m_cache; + IsoString m_keyPrefix; + int m_durationDays = 30; // <= 0 -> never expires + bool m_enabled = true; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FileDataCache_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileDataCache.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileDataCachePreferencesDialog.h b/3rdparty/include/pcl/FileDataCachePreferencesDialog.h new file mode 100644 index 0000000..6c57f16 --- /dev/null +++ b/3rdparty/include/pcl/FileDataCachePreferencesDialog.h @@ -0,0 +1,123 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileDataCachePreferencesDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileDataCachePreferencesDialog_h +#define __PCL_FileDataCachePreferencesDialog_h + +/// \file pcl/FileDataCache.h + +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS FileDataCache; + +/*! + * \class FileDataCachePreferencesDialog + * \brief A dialog to edit file data cache preferences settings + * + * This dialog allows to define persistence and maximum duration for file data + * cache items associated with a given FileDataCache instance. The dialog also + * allows to clear all cache items in memory and/or persistent storage. + */ +class PCL_CLASS FileDataCachePreferencesDialog : public Dialog +{ +public: + + /*! + * Constructs a new dialog to edit preferences settings for the specified + * \a cache object. + */ + FileDataCachePreferencesDialog( FileDataCache* cache ); + +private: + + FileDataCache* m_cache; + bool m_cacheEnabled; + int m_cacheDuration; + + VerticalSizer Global_Sizer; + HorizontalSizer PersistentCache_Sizer; + CheckBox PersistentCache_CheckBox; + HorizontalSizer CacheDuration_Sizer; + Label CacheDuration_Label; + SpinBox CacheDuration_SpinBox; + HorizontalSizer ClearCache_Sizer; + PushButton ClearCache_PushButton; + HorizontalSizer PurgeCache_Sizer; + PushButton PurgeCache_PushButton; + HorizontalSizer Buttons_Sizer; + PushButton OK_PushButton; + PushButton Cancel_PushButton; + + void Update(); + + void e_ValueUpdated( SpinBox& sender, int value ); + void e_Click( Button& sender, bool checked ); + void e_Return( Dialog& sender, int retVal ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FileDataCachePreferencesDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileDataCachePreferencesDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileDialog.h b/3rdparty/include/pcl/FileDialog.h new file mode 100644 index 0000000..857ce95 --- /dev/null +++ b/3rdparty/include/pcl/FileDialog.h @@ -0,0 +1,535 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileDialog_h +#define __PCL_FileDialog_h + +/// \file pcl/FileDialog.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class FileDialogPrivate; +class OpenFileDialogPrivate; +class SaveFileDialogPrivate; +class GetDirectoryDialogPrivate; + +// ---------------------------------------------------------------------------- + +/*! + * \class FileFilter + * \brief A description of a file type and its associated file extensions + * + * %FileFilter is a simple class to describe a file type and enumerate its + * associated file extensions. That information plays a key role in file + * dialogs as OpenFileDialog and SaveFileDialog. + * + * \sa FileDialog, GetDirectoryDialog, OpenFileDialog, SaveFileDialog + */ +class PCL_CLASS FileFilter +{ +public: + + /*! + * Constructs an empty %FileFilter object. + */ + FileFilter() = default; + + /*! + * Constructs a %FileFilter with the specified \a description and list of + * file \a extensions. + */ + FileFilter( const String& description, const StringList extensions ) + { + SetDescription( description ); + AddExtensions( extensions ); + } + + /*! + * Constructs a %FileFilter with the specified \a description and a single + * file \a extension. + */ + FileFilter( const String& description, const String& extension ) + { + SetDescription( description ); + AddExtension( extension ); + } + + /*! + * Copy constructor. + */ + FileFilter( const FileFilter& x ) = default; + + /*! + * Virtual destructor. + */ + virtual ~FileFilter() + { + } + + /*! + * Returns the description of the file type represented by this %FileFilter + * object. Example: "FITS Files". + */ + String Description() const + { + return m_description; + } + + /*! + * Sets the \a description of the file type represented by this %FileFilter + * object. + */ + void SetDescription( const String& description ) + { + m_description = description.Trimmed(); + } + + /*! + * Returns a list of file extensions associated to the file type represented + * by this %FileFilter object. Example: ".fit", ".fits", ".fts". + */ + const StringList& Extensions() const + { + return m_extensions; + } + + /*! + * Adds a file \a extension associated with the file type represented by + * this %FileFilter object. + */ + void AddExtension( const String& extension ); + + /*! + * Adds an ordered list of file \a extensions. + */ + void AddExtensions( const StringList& extensions ) + { + for ( const String& extension : extensions ) + AddExtension( extension ); + } + + /*! + * Clears the file type description and the list of file extensions. + */ + void Clear(); + +private: + + String m_description; + StringList m_extensions; + + String MakeAPIFilter() const; + + friend class FileDialogPrivate; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class FileDialog + * \brief Abstract base class of PCL file dialogs + * + * ### TODO: Write a detailed description for %FileDialog. + * + * \sa GetDirectoryDialog, OpenFileDialog, SaveFileDialog, FileFilter + */ +class PCL_CLASS FileDialog +{ +public: + + /*! + * A list of file filters describing file types and their associated file + * extensions. + */ + typedef Array filter_list; + + /*! + * Constructs a %FileDialog object. + */ + FileDialog(); + + /*! + * Destroys a %FileDialog object. + */ + virtual ~FileDialog(); + + /*! + * Returns the caption of this file dialog. + */ + String Caption() const; + + /*! + * Sets a new \a caption for this file dialog. If an empty caption is + * specified, the platform will assign a default caption depending on the + * type of dialog: "Open File", "Save File As", and so on. + */ + void SetCaption( const String& caption ); + + /*! + * Returns the initial path for this file dialog. + * + * If not empty, the initial directory is selected upon dialog execution. If + * the initial path points to a file, that file is set as the initial dialog + * selection, if appropriate. + */ + String InitialPath() const; + + /*! + * Sets the initial path for this file dialog. See InitialPath() + * for a full description. + */ + void SetInitialPath( const String& path ); + + /*! + * Returns a reference to the immutable list of file filters in this file + * dialog. + */ + const filter_list& Filters() const; + + /*! + * Defines the list of file \a filters to be used by this file dialog. + */ + void SetFilters( const filter_list& filters ); + + /*! + * Defines a unique file \a filter to be used by this file dialog. + */ + void SetFilter( const FileFilter& filter ) + { + SetFilters( filter_list() << filter ); + } + + /*! + * Adds a set of file \a filters to the list of filters used by this file + * dialog. + */ + void AddFilters( const filter_list& filters ); + + /*! + * Adds a file \a filter to the list of filters used by this file dialog. + */ + void AddFilter( const FileFilter& filter ) + { + AddFilters( filter_list() << filter ); + } + + /*! + * Returns a reference to the mutable list of file filters in this file + * dialog. + * + * \deprecated This member function has been deprecated. It is kept just to + * support existing code and must not be used in newly produced code. Use + * SetFilters() instead of this function. + */ + filter_list& Filters(); + + /*! + * Returns the selected file extension in this file dialog. + * + * If not empty, a file filter containing the specified file extension will + * be selected upon dialog execution. After an accepted call to Execute(), + * this property will store the extension of the first selected file. + */ + String SelectedFileExtension() const; + + /*! + * Sets the selected file extension for this file dialog. + * See SelectedFileExtension() for a full description. + */ + void SetSelectedFileExtension( const String& ); + + /*! + * Modal dialog execution. + * + * Returns true if the dialog has been accepted; false if the dialog has + * been cancelled. + */ + virtual bool Execute() = 0; + +protected: + + AutoPointer p; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class OpenFileDialog + * \brief A modal dialog box to select one or more existing files + * + * ### TODO: Write a detailed description for %FileDialog. + * + * \sa GetDirectoryDialog, FileDialog, SaveFileDialog, FileFilter + */ +class PCL_CLASS OpenFileDialog : public FileDialog +{ +public: + + /*! + * Constructs an %OpenFileDialog object. + */ + OpenFileDialog(); + + /*! + * Destroys an %OpenFileDialog object. + */ + virtual ~OpenFileDialog(); + + /*! + * Loads a set of file filters corresponding to all installed file formats + * that are able to read image files. + * + * The set of file filters loaded by this function will depend on the file + * format modules currently installed on the PixInsight platform. Typically + * it will include formats like FITS, TIFF, JPEG, JPEG2000, and DSLR RAW. + * In the unlikely event that no file format able to read files is installed + * on the platform, the filter set will be empty. + * + * Before the set of format-specific file filters, an additional filter is + * always included that comprises the whole set of reading-capable formats, + * i.e. a first "All known formats" filter is always present. + */ + void LoadImageFilters(); + + /*! + * Returns true iff this dialog accepts multiple selections. + * + * When multiple selections are enabled, the user can select a list of one + * or more existing files. When this mode is disabled, only a single + * existing file can be selected. + * + * \sa EnableMultipleSelections(), DisableMultipleSelections() + */ + bool AllowsMultipleSelections() const; + + /*! + * Enables or disables multiple file selections for this dialog. + * + * \sa DisableMultipleSelections(), AllowsMultipleSelections() + */ + void EnableMultipleSelections( bool enable = true ); + + /*! + * Disables or enables multiple file selections for this dialog. + * + * This is a convenience member function, equivalent to + * EnableMultipleSelections( !disable ). + * + * \sa DisableMultipleSelections(), AllowsMultipleSelections() + */ + void DisableMultipleSelections( bool disable = true ) + { + EnableMultipleSelections( !disable ); + } + + /*! + */ + bool Execute() override; + + /*! + * Returns a reference to the list of selected files. + * + * Each element in the returned list is a full path to a selected file. + * + * When multiple selections are enabled, the returned list may contain one + * or more file paths. + */ + const StringList& FileNames() const; + + /*! + * Returns the first selected file path. + * + * Use this member function to access a single file name, when multiple + * selections are disabled, or to the first file name of a multiple + * selection. + */ + String FileName() const; + +private: + + AutoPointer q; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SaveFileDialog + * \brief A modal dialog box to select a single file name for output + * + * ### TODO: Write a detailed description for %SaveFileDialog. + * + * \sa GetDirectoryDialog, OpenFileDialog, FileDialog, FileFilter + */ +class PCL_CLASS SaveFileDialog : public FileDialog +{ +public: + + /*! + * Constructs a %SaveFileDialog object + */ + SaveFileDialog(); + + /*! + * Destroys a %SaveFileDialog object + */ + virtual ~SaveFileDialog(); + + /*! + * Loads a set of file filters corresponding to all installed file formats + * that are able to write image files. + * + * The set of file filters loaded by this function will depend on the file + * format modules currently installed on the PixInsight platform. Typically + * it will include formats like FITS, TIFF, JPEG, and JPEG2000. In the + * (improbable) event that no file format able to write files is installed + * on the platform, the filter set will be empty. + */ + void LoadImageFilters(); + + /*! + * Returns true iff overwrite prompts are enabled for this dialog. + * + * When overwrite prompts are enabled, the dialog will request confirmation + * if an existing file is selected. + * + * \sa EnableOverwritePrompt(), DisableOverwritePrompt() + */ + bool IsOverwritePromptEnabled() const; + + /*! + * Enables or disables overwrite prompts for this dialog. + * + * \sa DisableOverwritePrompt(), IsOverwritePromptEnabled() + */ + void EnableOverwritePrompt( bool enable = true ); + + /*! + * Disables or enables overwrite prompts for this dialog. + * + * This is a convenience member function, equivalent to + * EnableOverwritePrompt( !disable ) + * + * \sa EnableOverwritePrompt(), IsOverwritePromptEnabled() + */ + void DisableOverwritePrompt( bool disable = true ) + { + EnableOverwritePrompt( !disable ); + } + + /*! + */ + bool Execute() override; + + /*! + * Returns the selected file path. A full file path is always returned. + */ + String FileName() const; + +private: + + AutoPointer q; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GetDirectoryDialog + * \brief A modal dialog box to select an existing directory + * + * ### TODO: Write a detailed description for %GetDirectoryDialog. + * + * \sa FileDialog, OpenFileDialog, SaveFileDialog + */ +class PCL_CLASS GetDirectoryDialog : public FileDialog +{ +public: + + /*! + * Constructs a %GetDirectoryDialog object + */ + GetDirectoryDialog(); + + /*! + * Destroys a %GetDirectoryDialog object + */ + virtual ~GetDirectoryDialog(); + + /*! + */ + bool Execute() override; + + /*! + * Returns the selected directory path. A full path is always returned. + */ + String Directory() const; + +private: + + AutoPointer q; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FileDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileFormat.h b/3rdparty/include/pcl/FileFormat.h new file mode 100644 index 0000000..77c5221 --- /dev/null +++ b/3rdparty/include/pcl/FileFormat.h @@ -0,0 +1,495 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileFormat.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileFormat_h +#define __PCL_FileFormat_h + +/// \file pcl/FileFormat.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class FileFormatPrivate; + +/*! + * \class FileFormat + * \brief High-level interface to an installed image file format. + * + * %FileFormat instances are high-level, managed objects that represent + * installed image file formats in the PixInsight platform. A module creates an + * instance of %FileFormat to gain access to an installed file format through + * intermodule communication. + * + * %FileFormat and %MetaFileFormat + * + * %FileFormat provides a description of the functionality and properties of an + * already installed image file format. Contrarily, by subclassing the + * MetaFileFormat class a module can define and implement a new image file + * format that can be installed in the PixInsight platform. %MetaFileFormat is + * a formal description of a file format, while %FileFormat describes an + * existing (and installed) file format. + * + * As a %MetaFileFormat subclass describes how a format can be instantiated, + * %FileFormat allows a module to create new instances of a file format that + * can be used to access actual image files. %FileFormat doesn't provide any + * file handling functionality; access to image files is provided by the + * FileFormatInstance class. + * + * \sa FileFormatBase, MetaFileFormat, FileFormatInstance + */ +class PCL_CLASS FileFormat : public FileFormatBase +{ +public: + + /*! + * Constructs a %FileFormat object. + * + * \param nameExtOrMime A format name, file suffix, or MIME type. This + * parameter determines how the PixInsight core + * application looks for an installed file format to which + * this %FileFormat instance will be an interface. + * + * \param toRead When a file suffix or MIME type is specified and this + * parameter is true, a %FileFormat instance will be + * created for an installed file format able to read files + * with the specified file suffix or corresponding to the + * specified MIME type. + * + * \param toWrite When a file suffix or MIME type is specified and this + * parameter is true, a %FileFormat instance will be + * created for an installed file format able to write + * files with the specified file suffix or corresponding + * to the specified MIME type. + * + * When a format name is used as the argument of this constructor, + * %FileFormat will provide access to an installed file format with the + * specified identifier, if there exists one. If the argument is a string + * starting with a dot character, then it is interpreted as a file suffix. + * If the argument has a slash character ('/'), it is interpreted as a MIME + * type specifier. In the latter two cases, the PixInsight core application + * will search for an installed file format able to handle image files with + * the specified file suffix or for the specified MIME type. + * + * In all cases, if no installed file format fits to the specified + * argument(s), this constructor throws an Error exception with the + * corresponding error message. Your code should guarantee that these + * exceptions will be caught and handled appropriately. + * + * When \a nameExtOrMime specifies a format name, the \a toRead and + * \a toWrite parameters are ignored. + * + * Example: + * + * \code + * try + * { + * // Find a format able to read XISF files + * FileFormat xisfFormat( ".xisf", true ); + * + * // Create a format instance + * FileFormatInstance myXISFFile( xisfFormat ); + * + * // Use the instance to open an existing file + * myXISFFile.Open( "/path/to/test.xisf" ); + * + * // Read an image in 32-bit floating point format + * Image img; + * myXISFFile.ReadImage( img ); + * // ... + * } + * catch ( Exception& x ) + * { + * // Handle errors ... + * } + * \endcode + * + * \note The \a toRead and \a toWrite parameters are false by default, which + * means that no access restrictions are applied by default when creating + * %FileFormat instances. + */ + FileFormat( const String& nameExtOrMime, bool toRead = false, bool toWrite = false ); + + /*! + * Copy constructor. Constructs an \e alias %FileFormat object that refers + * to the same image file format as the specified object \a fmt. + */ + FileFormat( const FileFormat& fmt ); + + /*! + * Destroys this %FileFormat object. + * + * \note This destructor does not destroy or uninstall the actual image file + * format it refers to, which is part of the PixInsight core application. + * Only the managed alias object living in the caller module is destroyed. + */ + virtual ~FileFormat(); + + /*! + */ + IsoString Name() const override; + + /*! + */ + StringList FileExtensions() const override; + + /*! + */ + IsoStringList MimeTypes() const override; + + /*! + */ + uint32 Version() const override; + + /*! + */ + String Description() const override; + + /*! + */ + String Implementation() const override; + + /*! + */ + String Status() const override; + + /*! + */ + Bitmap Icon() const override; + + /*! + */ + Bitmap SmallIcon() const override; + + /*! + */ + bool CanRead() const override; + + /*! + */ + bool CanWrite() const override; + + /*! + */ + bool CanReadIncrementally() const override; + + /*! + */ + bool CanWriteIncrementally() const override; + + /*! + */ + bool CanStore8Bit() const override; + + /*! + */ + bool CanStore16Bit() const override; + + /*! + */ + bool CanStore32Bit() const override; + + /*! + */ + bool CanStore64Bit() const override; + + /*! + */ + bool CanStoreFloat() const override; + + /*! + */ + bool CanStoreDouble() const override; + + /*! + */ + bool CanStoreComplex() const override; + + /*! + */ + bool CanStoreDComplex() const override; + + /*! + */ + bool CanStoreGrayscale() const override; + + /*! + */ + bool CanStoreRGBColor() const override; + + /*! + */ + bool CanStoreAlphaChannels() const override; + + /*! + */ + bool CanStoreResolution() const override; + + /*! + */ + bool CanStoreKeywords() const override; + + /*! + */ + bool CanStoreICCProfiles() const override; + + /*! + */ + bool CanStoreThumbnails() const override; + + /*! + */ + bool CanStoreProperties() const override; + + /*! + */ + bool CanStoreImageProperties() const override; + + /*! + */ + bool CanStoreRGBWS() const override; + + /*! + */ + bool CanStoreDisplayFunctions() const override; + + /*! + */ + bool CanStoreColorFilterArrays() const override; + + /*! + */ + bool SupportsCompression() const override; + + /*! + */ + bool SupportsMultipleImages() const override; + + /*! + */ + bool SupportsViewProperties() const override; + + /*! + */ + bool CanEditPreferences() const override; + + /*! + */ + bool UsesFormatSpecificData() const override; + + /*! + */ + bool IsDeprecated() const override; + + /*! + */ + bool ValidateFormatSpecificData( const void* data ) const override; + + /*! + */ + void DisposeFormatSpecificData( void* data ) const override; + + /*! + */ + bool EditPreferences() const override; + + /*! + * Returns a list with all installed file formats in the PixInsight core + * application. + */ + static Array AllFormats(); + + /*! + * Returns true iff the specified file suffix corresponds to an installed + * file format. + * + * \param path A file path including a file suffix identifying an + * image format, such as ".xisf", ".jpg", etc. This + * parameter is case-insensitive. Existence of an actual + * file at the specified path is not verified. + * + * \param toRead True to identify an installed file format module able + * to read files. + * + * \param toWrite True to identify an installed file format module able + * to write files. + * + * \note The \a toRead and \a toWrite parameters are false by default, which + * means that no access restrictions are applied by default. + */ + static bool IsSupportedFileFormatBySuffix( const String& path, bool toRead = false, bool toWrite = false ); + + /*! + * Returns a list with the full file paths of all supported image files in + * a given directory of the local filesystem. + * + * \param dirPath Path to an existing directory in the local filesystem, + * where supported image files will be looked for. + * + * \param toRead True to select files supported for read operations. + * + * \param toWrite True to select files supported for write operations. + * + * \param recursive True to search for files recursively throughout the + * entire subtree rooted at \a dirPath. False to restrict + * the file search operation to existing files on + * \a dirPath. This parameter is false by default. + * + * \param followLinks True to follow symbolic links to directories and + * files, on platforms supporting symbolic links. This is + * true by default. This parameter is ignored on Windows. + * + * \note The \a toRead and \a toWrite parameters are false by default, which + * means that no access restrictions are applied by default. + */ + static StringList SupportedImageFiles( const String& dirPath, bool toRead = false, bool toWrite = false, + bool recursive = false, bool followLinks = true ); + + /*! + * Returns a list with the full file paths of all local normalization data + * files in a given directory of the local filesystem. + * + * \param dirPath Path to an existing directory in the local filesystem, + * where local normalization data files will be looked + * for. + * + * \param recursive True to search for files recursively throughout the + * entire subtree rooted at \a dirPath. False to restrict + * the file search operation to existing files on + * \a dirPath. This parameter is false by default. + * + * \param followLinks True to follow symbolic links to directories and + * files, on platforms supporting symbolic links. This is + * true by default. This parameter is ignored on Windows. + * + * Currently this function looks for files with the .xnml suffix (XML local + * normalization data format, XNML). + * + * \sa LocalNormalizationData + */ + static StringList LocalNormalizationFiles( const String& dirPath, bool recursive = false, bool followLinks = true ); + + /*! + * Returns a list with the full file paths of all drizzle data files in a + * given directory of the local filesystem. + * + * \param dirPath Path to an existing directory in the local filesystem, + * where drizzle data files will be looked for. + * + * \param recursive True to search for files recursively throughout the + * entire subtree rooted at \a dirPath. False to restrict + * the file search operation to existing files on + * \a dirPath. This parameter is false by default. + * + * \param followLinks True to follow symbolic links to directories and + * files, on platforms supporting symbolic links. This is + * true by default. This parameter is ignored on Windows. + * + * Currently this function looks for files with the .drz (compatibility text + * drizzle format) and .xdrz (XML drizzle data format, XDRZ) suffixes. + * + * \sa DrizzleData + */ + static StringList DrizzleFiles( const String& dirPath, bool recursive = false, bool followLinks = true ); + + /*! + * Returns a list with the full file paths of all ephemeris data files in a + * given directory of the local filesystem. + * + * \param dirPath Path to an existing directory in the local filesystem, + * where ephemeris data files will be looked for. + * + * \param recursive True to search for files recursively throughout the + * entire subtree rooted at \a dirPath. False to restrict + * the file search operation to existing files on + * \a dirPath. This parameter is false by default. + * + * \param followLinks True to follow symbolic links to directories and + * files, on platforms supporting symbolic links. This is + * true by default. This parameter is ignored on Windows. + * + * Currently this function looks for files with the .xeph suffix (Extensible + * Ephemeris Data format, XEPH). + * + * \sa EphemerisFile + */ + static StringList EphemerisFiles( const String& dirPath, bool recursive = false, bool followLinks = true ); + +private: + + AutoPointer m_data; + + FileFormat( const void* ); + + const void* Handle() const; + + friend class FileFormatPrivate; + friend class FileFormatInstance; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_FileFormat_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileFormat.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileFormatBase.h b/3rdparty/include/pcl/FileFormatBase.h new file mode 100644 index 0000000..f1715b2 --- /dev/null +++ b/3rdparty/include/pcl/FileFormatBase.h @@ -0,0 +1,515 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileFormatBase.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileFormatBase_h +#define __PCL_FileFormatBase_h + +/// \file pcl/FileFormatBase.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FileFormatBase + * \brief Abstract base class for image file format descriptions. + * + * %FileFormatBase defines a number of descriptive properties of a file format + * in the PixInsight platform. + * + * %FileFormatBase is an abstract base class of the MetaFileFormat and + * FileFormat instantiable classes. %MetaFileFormat describes an installable + * file format, while the %FileFormat class provides direct access to an + * installed file format through intermodule communication. + * + * In more practical terms, modules defining new file formats must implement + * derived classes of %MetaFileFormat, while %FileFormat is used by modules + * requiring direct access to image files through installed file formats. + * + * Note that the %FileFormatBase, %MetaFileFormat, %FileFormat, + * FileFormatImplementation and FileFormatInstance classes are conceptually + * parallel to the ProcessBase, MetaProcess, Process, ProcessImplementation and + * ProcessInstance classes, respectively. This is just a reflection of the + * strong object orientation and modularity that characterize the PixInsight + * platform. + * + * \sa MetaFileFormat, FileFormat, FileFormatImplementation, FileFormatInstance + */ +class PCL_CLASS FileFormatBase +{ +public: + + /*! + * Constructs a %FileFormatBase object. + */ + FileFormatBase() + { + } + + /*! + * Destroys this %FileFormatBase object. + */ + virtual ~FileFormatBase() noexcept( false ) + { + } + + /*! + * Returns the identifier of this file format (also known as the + * format name). + * + * File format identifiers are unique, valid C identifiers. + * Examples: "FITS", "TIFF", "JPEG2000". + */ + virtual IsoString Name() const = 0; + + /*! + * Returns the list of file extensions associated to this file format. + * + * The returned list must be a sequence of ".xxx...x" strings in priority + * order. Examples: ".fit", ".fits", ".fts". + */ + virtual StringList FileExtensions() const = 0; + + /*! + * Returns a list of MIME types corresponding to the data supported by + * this file format. + * + * The returned list must be a sequence of "media_type/content_type" items + * approved by IANA (see http://www.iana.org/assignments/media-types/), for + * example: "image/fits", "application/fits". + * + * Providing a list of MIME types is not mandatory, but highly recommended + * for all format support modules implementing standard (i.e., recognized by + * IANA) image formats. + */ + virtual IsoStringList MimeTypes() const = 0; + + /*! + * Returns a version number for this file format, encoded as a hexadecimal + * number. + * + * For example, version 1.0.5 should be returned as 0x105, and version + * 3.11.5 as 0x3B5. The default return value is 0x100, corresponding to + * version 1.0.0. + */ + virtual uint32 Version() const = 0; + + /*! + * Returns a brief description text for this file format. + * + * This function should provide a simple, typically single-line, description + * of this image file format for quick reference. Example: "Flexible Image + * Transport System". The Implementation() member function has been designed + * to provide a more complete description of a format's functionality and + * capabilities. + */ + virtual String Description() const = 0; + + /*! + * Returns a descriptive text about this implementation of a particular + * image file format. + * + * This function must provide a brief but sufficiently informative + * description of this file format implementation. The returned description + * will appear on the Format Explorer window, and should provide information + * about how this format has been implemented in a module. Avoid too + * exhaustive descriptions that are better reserved for a technical manual. + * Avoid also describing a file format itself; the information given should + * not intend to replace an official/formal definition of an image format. + * + * Descriptions of file format implementations are always printed on + * PixInsight consoles. This means that the text output functionality of the + * Console class can be used to format the string returned by this function. + * Refer to that class and its documentation for further information. + */ + virtual String Implementation() const = 0; + + /*! + * Returns a description of the current status of this file format + * implementation. + * + * This function should return an empty string for normal file format + * implementations. Exceptions to this rule are obsolete or deprecated file + * formats (see the IsDeprecated() member function), deficient + * implementations, or other special cases where the user should be aware of + * important potential problems or limitations. + * + * The output of this function should be essentially plain text with basic + * HTML tags. No console tags should be used. + */ + virtual String Status() const = 0; + + /*! + * Returns a large icon image that identifies this format. + * + * The returned image is used to identify all instances of this format + * (e.g., images and files) in the core application's GUI. It is used on the + * Format Explorer window, on image icons of this format, and in general for + * every graphical item related to this format or to an instance of this + * format. + */ + virtual Bitmap Icon() const = 0; + + /*! + * Returns a small icon image that identifies this format. + * + * For details on format icon images, see the documentation for Icon(). + * + * Small icons are used on interface elements where screen space must be + * preserved. Two good examples are the Format Explorer window and the + * ImageContainer interface. + */ + virtual Bitmap SmallIcon() const = 0; + + /*! + * Returns true only if this file format implementation can read an entire + * image in a single operation. + */ + virtual bool CanRead() const = 0; + + /*! + * Returns true only if this file format implementation can write an entire + * image in a single operation. + */ + virtual bool CanWrite() const = 0; + + /*! + * Returns true only if this file format implementation supports + * incremental read operations on image files. + * + * Incremental read operations allow the PixInsight core application and + * other modules to load images by successive row strips. + */ + virtual bool CanReadIncrementally() const = 0; + + /*! + * Returns true only if this file format implementation supports + * incremental write operations on image files. + * + * Incremental write operations allow the PixInsight core application and + * other modules to write images by successive row strips. + */ + virtual bool CanWriteIncrementally() const = 0; + + /*! + * Returns true only if this file format implementation can read/write 8-bit + * unsigned integer images + */ + virtual bool CanStore8Bit() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 16-bit unsigned integer images + */ + virtual bool CanStore16Bit() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit unsigned integer images + */ + virtual bool CanStore32Bit() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit unsigned integer images + */ + virtual bool CanStore64Bit() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit floating point real images (IEEE 754 32-bit single + * precision format for pixel sample values). + */ + virtual bool CanStoreFloat() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit floating point real images (IEEE 754 64-bit double + * precision format for pixel sample values). + */ + virtual bool CanStoreDouble() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit complex floating point images (IEEE 754 32-bit single + * precision format for components of complex pixel sample values). + */ + virtual bool CanStoreComplex() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit complex floating point images (IEEE 754 64-bit double + * precision format for components of complex pixel sample values). + */ + virtual bool CanStoreDComplex() const = 0; + + /*! + * Returns true only if this file format implementation can read/write + * grayscale pixel data. + */ + virtual bool CanStoreGrayscale() const = 0; + + /*! + * Returns true only if this file format implementation can read/write RGB + * color pixel data. + */ + virtual bool CanStoreRGBColor() const = 0; + + /*! + * Returns true only if this file format implementation supports alpha + * channels. + */ + virtual bool CanStoreAlphaChannels() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * image resolution data. + */ + virtual bool CanStoreResolution() const = 0; + + /*! + * Returns true only if this file format implementation can embed/extract + * FITS header keyword collections. + */ + virtual bool CanStoreKeywords() const = 0; + + /*! + * Returns true only if this file format implementation can embed/extract + * ICC color profiles. + */ + virtual bool CanStoreICCProfiles() const = 0; + + /*! + * Returns true only if this file format implementation can embed/extract + * thumbnail images. + */ + virtual bool CanStoreThumbnails() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * data properties associated with format instances or image files. + * + * \note Don't confuse this member function with CanStoreImageProperties(). + * This function returns true if the implementation can store properties + * associated with an entire file or format instance, while + * CanStoreImageProperties() returns true if the implementation can store + * properties associated with individual images. + * + * \sa CanStoreImageProperties(), SupportsViewProperties() + */ + virtual bool CanStoreProperties() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * data properties associated with individual images. + * + * \sa CanStoreProperties(), SupportsViewProperties() + */ + virtual bool CanStoreImageProperties() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * RGB working space data. + */ + virtual bool CanStoreRGBWS() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * display function (aka screen transfer function, or STF) parameters. + */ + virtual bool CanStoreDisplayFunctions() const = 0; + + /*! + * Returns true only if this file format implementation can store/retrieve + * color filter array (CFA) descriptions. + */ + virtual bool CanStoreColorFilterArrays() const = 0; + + /*! + * Returns true only if this file format implementation supports compression + * of pixel data. + * + * This refers to compression of \e source pixels, not to native compression + * schemes used by some file formats. + * + * For example, the compression schemes employed in the JPEG and JPEG2000 + * formats must \e not cause this member function to return true. The + * optional ZIP and LZW compressions used in TIFF are the exact kind of + * compressions that must cause this member function to return true. + */ + virtual bool SupportsCompression() const = 0; + + /*! + * Returns true only if this file format implementation supports multiple + * images stored in a single file. + * + * For example, multiple images (e.g., taken with different filters) can be + * stored in FITS files by means of FITS image extensions, forming a + * data cube of several images with the same dimensions, or even a + * collection of independent images. + */ + virtual bool SupportsMultipleImages() const = 0; + + /*! + * Returns true only if this file format implementation supports data + * properties of different data types such as Float64, UI32Vector, String, + * Complex32, etc. + * + * If this member function returns true, a reimplementation of + * CanStoreProperties() and/or CanStoreImageProperties() (depending on + * format capabilities) must also return true, and the format must implement + * all property data types supported by View objects. For information on + * supported view property types, see the VTYPE_XXX predefined constants in + * PCL API headers. + * + * This function should return false if this format only supports storage of + * BLOB properties, represented as ByteArray objects, or a limited subset of + * view property types. + * + * \sa CanStoreProperties(), CanStoreImageProperties(), + * View::PropertyValue(), View::SetPropertyValue() + */ + virtual bool SupportsViewProperties() const = 0; + + /*! + * Returns true only if this file format implementation allows the user to + * edit specific format preferences. + * + * If this function returns true, then the EditPreferences() procedure must + * be reimplemented in a derived class of MetaFileFormat by the module that + * implements this format. + */ + virtual bool CanEditPreferences() const = 0; + + /*! + * Returns true only if this file format implementation uses + * format-specific data. + * + * Format-specific data are preserved on a per-instance (say per-file) basis + * by the PixInsight application, who actually knows nothing about them. + */ + virtual bool UsesFormatSpecificData() const = 0; + + /*! + * Returns true only if this file format has been deprecated or declared + * obsolete on the PixInsight platform. + * + * When this function returns true, the Status() member function should also + * return information about the current status of this file format, + * including an explanation of the reasons for deprecation. + */ + virtual bool IsDeprecated() const = 0; + + /*! + * Validates a format-specific data block. + * + * File formats that use format-specific data reimplement this function to + * validate format-specific data structures. If this function returns true, + * that means that the passed \a data block is a valid format-specific data + * structure for this file format implementation. + * + * This function will be called by the PixInsight core application for + * validation of the \a data block before calling + * FileFormatImplementation::SetFormatSpecificData() and + * DisposeFormatSpecificData(). + */ + virtual bool ValidateFormatSpecificData( const void* data ) const = 0; + + /*! + * Disposes a format-specific data block. + * + * File formats that use format-specific data reimplement this function to + * destroy and deallocate, as appropriate, their own format-specific data + * structures. + * + * This function will be called by the PixInsight core application with the + * \a data argument pointing to the beginning of a format-specific data + * block. This function will only be called after validation of the data + * block by ValidateFormatSpecificData(). + */ + virtual void DisposeFormatSpecificData( void* data ) const = 0; + + /*! + * Handles a request to edit format preferences. Returns true if the + * preferences were successfully edited. + * + * When implemented, this procedure should open a dialog box to let the + * user edit format-specific preferences and operating options. This + * function should only return true if the user accepts the new settings + * (e.g. by clicking the dialog's OK button). + * + * \note This member function will never be called if the + * CanEditPreferences() member function is not reimplemented to return true + * in a derived class of MetaFileFormat by the module that implements this + * file format. + */ + virtual bool EditPreferences() const = 0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_FileFormatBase_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileFormatBase.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileFormatImplementation.h b/3rdparty/include/pcl/FileFormatImplementation.h new file mode 100644 index 0000000..5a62977 --- /dev/null +++ b/3rdparty/include/pcl/FileFormatImplementation.h @@ -0,0 +1,903 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileFormatImplementation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileFormat_h +#define __PCL_FileFormat_h + +/// \file pcl/FileFormatImplementation.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +struct FileFormatImplementationPrivate; + +// ---------------------------------------------------------------------------- + +/*! + * \class FileFormatImplementation + * \brief Implementation of a PixInsight file format instance + * + * In the PixInsight/PCL framework, an image file format is formally + * defined as a descendant of the MetaFileFormat class. + * %FileFormatImplementation defines the behavior and functionality of a file + * format instance, which usually (although not necessarily) identifies an + * image file encoded in the corresponding file format. + * + * Note that %MetaFileFormat and %FileFormatImplementation describe and + * implement, respectively, an \e installable image file format in a PixInsight + * module. All installed file formats can be accessed and instantiated by means + * of the FileFormat and FileFormatInstance classes, respectively, through + * intermodule communication mechanisms. + * + * \sa MetaFileFormat, FileFormat, FileFormatInstance + */ +class PCL_CLASS FileFormatImplementation +{ +public: + + /*! + * Constructs a file format instance. + * + * \param m Pointer to a metaformat that identifies the file format class + * that this file instance belongs to. + */ + FileFormatImplementation( const MetaFileFormat* m ); + + /*! + * Destroys a file format instance. + */ + virtual ~FileFormatImplementation() noexcept( false ); + + /* + * FileFormatImplementation instances (e.g., image files) are unique. + */ + + /*! + * Copy constructor. This constructor is disabled because file format + * instances represent unique objects (e.g., files or I/O streams). + */ + FileFormatImplementation( const FileFormatImplementation& x ) = delete; + + /*! + * Copy assignment. This operator is disabled because file format instances + * represent unique objects (e.g., files or I/O streams). + */ + FileFormatImplementation& operator =( const FileFormatImplementation& ) = delete; + + /*! + * Returns a pointer to the \e metaformat of this file format instance. + * + * The metaformat defines the format class this instance belongs to. + */ + const MetaFileFormat* Meta() const + { + return meta; + } + + /*! + * Closes an image file (after Open() or Create()). + */ + virtual void Close(); + + /*! + * Returns true iff this file is currently open. + */ + virtual bool IsOpen() const; + + /*! + * Returns the current file path in this instance. If no file path has been + * set yet (by calling Open() or Create()), this member function should + * return an empty string. + */ + virtual String FilePath() const; + + // Reader functionality + + /*! + * Opens an image file for reading and/or information retrieval. + * + * \param filePath File path to a file that will be opened. The core + * PixInsight application always passes full file paths to existing + * files. However, other modules that may call this member function + * (through intermodule communication) may not behave in the same + * way. A module must be prepared to receive relative file path + * specifications, and even paths to files that don't exist, in + * this argument. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image file is opened and/or the + * way image data are to be read and decoded. A format module can + * simply ignore all of these hints, or just look for one or more + * hints that it recognizes and supports, ignoring others. When two + * or more hints are specified, they must be separated by space + * characters (0x20). Most standard file formats support hints. For + * example, the standard DSLR_RAW format recognizes the "raw" hint + * to force reading pure raw data (no deBayerization, no black + * pedestal subtraction, no white balancing) irrespective of the + * current DSLR RAW format settings. + * + * This function must return a dynamic array of ImageDescription structures + * that describes the image(s) stored in the opened image file. Each + * %ImageDescription structure contains ImageInfo and ImageOptions objects + * that describe both basic image parameters (as geometry and color space) + * and format-independent image options (pixel format, embedded data, etc). + * + * In the event of error, a reimplementation of this member function should + * throw a PCL exception. Thrown exceptions will be caught and processed by + * internal PCL code. + */ + virtual ImageDescriptionArray Open( const String& filePath, const IsoString& hints ); + + /*! + * Selects the image at the specified zero-based \a index in this file. + * + * This member function will only be called for file formats that support + * multiple images stored in a single file. It will never be called if the + * MetaFileFormat::SupportsMultipleImages() member function has not been + * reimplemented to return true in the metaformat class for this instance. + */ + virtual void SelectImage( int index ); + + /*! + * Returns the current zero-based image index in this file. + * + * This member function will only be called for file formats that support + * multiple images stored in a single file. It will never be called if the + * MetaFileFormat::SupportsMultipleImages() member function has not been + * reimplemented to return true in the metaformat class for this instance. + */ + virtual int SelectedImageIndex() const; + + /*! + * Returns a format-specific data block for the current image in + * this file, or nullptr if no such data have been retrieved. + * + * See SetFormatSpecificData() for a description of format specific data + * functionality in PCL. + */ + virtual void* FormatSpecificData() const; + + /*! + * Provides a human-readable summary of format-specific properties for the + * current image in this file. + * + * The returned string should include format-specific information, \e not + * generic image information. For example, don't include image dimensions, + * color space, and other things that the PixInsight core application + * already knows. + * + * \note The default implementation returns an empty string. + */ + virtual String ImageFormatInfo() const + { + return String(); + } + + /*! + * Extraction of the ICC color profile associated with the current image in + * this file. If no ICC color profile is defined for the current image, this + * function should return a null (empty) %ICCProfile object. + * + * This member function will never be called if the underlying file format + * does not support storage of ICC color profiles. See + * FileFormat::CanStoreICCProfiles(). + */ + virtual ICCProfile ReadICCProfile(); + + /*! + * Extraction of the RGB working space associated with the current image in + * this file. If no RGBWS is defined for the current image, this function + * should return a default RGBColorSystem object (see RGBColorSystem::sRGB). + * + * This member function will never be called if the underlying file format + * does not support storage of RGB working spaces. See + * FileFormat::CanStoreRGBWS(). + */ + virtual RGBColorSystem ReadRGBWorkingSpace(); + + /*! + * Extraction of the display function associated with the current image in + * this file. If no display function is defined for the current image, this + * function should return an identity display function (see + * DisplayFunction's default constructor). + * + * This member function will never be called if the underlying file format + * does not support storage of display functions. See + * FileFormat::CanStoreDisplayFunctions(). + */ + virtual DisplayFunction ReadDisplayFunction(); + + /*! + * Extraction of the color filter array (CFA) for the current image in this + * file. If no CFA is defined for the current image, this function should + * return an empty CFA (see ColorFilterArray's default constructor). + * + * This member function will never be called if the underlying file format + * does not support storage of color filter arrays. See + * FileFormat::CanStoreColorFilterArrays(). + */ + virtual ColorFilterArray ReadColorFilterArray(); + + /*! + * Extraction of the embedded thumbnail for the current image in this file. + * If the current image does not embed a thumbnail image, this function + * should return an empty 8-bit integer image. + */ + virtual UInt8Image ReadThumbnail(); + + /*! + * Extraction of the list of embedded %FITS keywords for the current image + * in this file. If the current image embeds no %FITS keywords, this + * function should return an empty array. + */ + virtual FITSKeywordArray ReadFITSKeywords(); + + /*! + * Returns a description of all data properties associated with this file. + * For each data property, the returned array provides information on the + * unique identifier of a property and its data type. + * + * Returns an empty array if there are no properties stored for this file. + * + * This member function will never be called if the underlying file format + * does not support data properties. See FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ImagePropertyDescriptions(). This + * function returns information on the properties of the \e whole image + * file, while %ImagePropertyDescriptions() provides the properties of the currently + * selected image. + */ + virtual PropertyDescriptionArray PropertyDescriptions(); + + /*! + * Extraction of a data property with the specified unique identifier. + * + * If no property with the specified identifier exists associated with this + * file, an invalid Variant object should be returned. + * + * This member function will never be called if the underlying file format + * does not support data properties. See FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ReadImageProperty(). This + * function returns the value of a given property of the \e whole image + * file, while %ReadImageProperty() returns the value of a property of the + * currently selected image. + */ + virtual Variant ReadProperty( const IsoString& property ); + + /*! + * Returns a description of all data properties associated with the current + * image in this file. For each data property, the returned array provides + * information on the unique identifier of a property and its data type. + * + * Returns an empty array if there are no properties stored for the current + * image in this file. + * + * This member function will never be called if the underlying file format + * does not support data properties for individual images. See + * FileFormat::CanStoreImageProperties(). + */ + virtual PropertyDescriptionArray ImagePropertyDescriptions(); + + /*! + * Extraction of a data property of the current image with the specified + * unique identifier. + * + * If no property with the specified identifier exists associated with the + * current image in this file, an invalid Variant object should be returned. + * + * This member function will never be called if the underlying file format + * does not support data properties for individual images. See + * FileFormat::CanStoreImageProperties(). + */ + virtual Variant ReadImageProperty( const IsoString& property ); + + /*! + * Reads the current image in 32-bit floating point format. + */ + virtual void ReadImage( pcl::Image& image ); + + /*! + * Reads the current image in 64-bit floating point format. + */ + virtual void ReadImage( pcl::DImage& image ); + + /*! + * Reads the current image in 8-bit unsigned integer format. + */ + virtual void ReadImage( UInt8Image& image ); + + /*! + * Reads the current image in 16-bit unsigned integer format. + */ + virtual void ReadImage( UInt16Image& image ); + + /*! + * Reads the current image in 32-bit unsigned integer format. + */ + virtual void ReadImage( UInt32Image& image ); + + /*! + * Returns true iff this instance can perform incremental read operations. + * + * The default implementation returns true. Do not confuse this member + * function with MetaFileFormat::CanReadIncrementally(), which tells the + * PixInsight core application if a given file format has the capability of + * performing incremental file reads in general. The value returned by this + * function refers specifically to the file format instance (e.g., a + * particular file) represented by this object. + */ + virtual bool CanReadIncrementally() const + { + return true; // allow incremental reads if the format supports them + } + + /*! + * Incremental read in 32-bit floating point sample format. + * + * \param[out] buffer Address of the destination sample buffer. + * + * \param startRow First pixel row to read. + * + * \param rowCount Number of pixel rows to read. + * + * \param channel Channel index to read. + * + * Incremental read operations allow the PixInsight core application and + * other modules to load images by successive row strips. + * + * To implement incremental reading, + * MetaFileFormat::CanReadIncrementally() must be reimplemented to return + * true in the metaformat class for this file instance; otherwise this + * member function will never be called. Furthermore, the + * FileFormatImplementation::CanReadIncrementally() member function must + * return true for the format instance represented by this object. + */ + virtual void ReadSamples( pcl::Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 64-bit floating point sample format. + * + * This is an overloaded member function for the DImage type; see + * ReadSamples( Image::sample*, int, int, int, int ) for a full description. + */ + virtual void ReadSamples( pcl::DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 8-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt8Image type; see + * ReadSamples( Image::sample*, int, int, int, int ) for a full description. + */ + virtual void ReadSamples( UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 16-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt16Image type; see + * ReadSamples( Image::sample*, int, int, int, int ) for a full description. + */ + virtual void ReadSamples( UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 32-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt32Image type; see + * ReadSamples( Image::sample*, int, int, int, int ) for a full description. + */ + virtual void ReadSamples( UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Returns true iff the last file read operation was \e inexact. + * + * The PixInsight application invokes this function just after successful + * completion of a call to ReadImage() or Read(). If a file format instance + * reads (or might read) source images inexactly, (e.g., by applying a + * rounding function to source sample values), then this function must be + * reimplemented to return true, as appropriate. + * + * \note The default implementation of this function returns false, so + * exact read operations are assumed by default. + */ + virtual bool WasInexactRead() const + { + return false; // exact read operations assumed by default + } + + // Writer functionality + + /*! + * Query image options and format-specific data before creating a new image + * file. Returns true if the file creation operation can continue; false if + * it should be aborted. + * + * \param[out] options Reference to a dynamic array of ImageOptions + * objects. On output, each of these objects must provide a general + * description of an image stored in a file instance of this file + * format. A file format module is responsible for setting the + * appropriate values in the passed structures, which will be used + * to generate a new file through a subsequent call to Create(). + * Formats that can store multiple images per file can receive more + * than one %ImageOptions structure stored in this array. Formats + * that don't support multiple images can safely ignore all + * structures but the first one in this array. + * + * \param[out] formatOptions Reference to a dynamic array of + * format-specific data blocks. Each void pointer in this + * array can be either zero or point to valid format-specific data + * for the format of this instance. This array can be empty if no + * format-specific data is being set. See the + * SetFormatSpecificData() member function for more information on + * format-specific data blocks. + * + * If the PixInsight application calls this function, it does so just before + * calling Create(). Typically, this happens as part of a File > Save + * As operation. Other modules can also invoke this function through + * intermodule communication. Format modules should open a dialog box to let + * the user modify some working options, as appropriate; then they should + * return true unless the user cancels the dialog. + * + * \note The default implementation of this function simply returns true + * without opening an options dialog. + */ + virtual bool QueryOptions( Array& options, Array& formatOptions ) + { + return true; + } + + /*! + * Creates an image file for writing. + * + * \param filePath Path to a file that will be created. If a file exists + * at the same path, it will be overwritten and its current + * contents will be lost. The PixInsight core application always + * passes full file paths to existing files. However, other modules + * that may call this member function (through intermodule + * communication) may not behave in the same way. A module must be + * prepared to receive relative file path specifications, and even + * invalid paths, in this argument. + * + * \param numberOfImages This is the number of images that will be written + * to the file after creation. It can be zero if an empty file is + * being created, and also less than zero if the number of images + * is unknown or cannot be defined at the point of creation. + * Although the PixInsight core application will always pass the + * exact number of images that will be written, other modules that + * can call this member function (through intermodule + * communication) might not behave so accurately. Therefore, format + * modules should be flexible enough as to not depend on an + * accurate count of images passed here. For a format that does not + * support empty files or multiple images stored in a single file, + * a reimplementation of this member function should throw an Error + * exception if this value is zero or not equal to one, + * respectively. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image file is generated and/or the + * way image data are to be encoded and written. A format module + * can simply ignore all of these hints, or just look for one or + * more hints that it recognizes and supports, ignoring others. + * When two or more hints are specified, they must be separated by + * space characters (0x20). Many standard file formats support some + * hints. For example, the standard JPEG format recognizes the + * "quality" hint to force generation of a JPEG image with a given + * quality level in the range 1 to 100, irrespective of the current + * JPEG format settings. + * + * In the event of error, a reimplementation of this member function should + * throw a PCL exception. Thrown exceptions will be caught and processed by + * internal PCL code. + */ + virtual void Create( const String& filePath, int numberOfImages, const IsoString& hints ); + + /*! + * Specifies an identifier for the next image that will be written or + * created in this file. + * + * \note Reimplementation of this member function is optional. The default + * implementation does nothing (ignores image identifiers). + */ + virtual void SetId( const IsoString& id ) + { + } + + /*! + * Specifies a set of format-independent image \a options for the next image + * that will be written or created in this file. + * + * \note Reimplementation of this member function is optional. The default + * implementation does nothing (ignores format-independent image options). + */ + virtual void SetOptions( const ImageOptions& options ) + { + } + + /*! + * Specifies a format-specific data block for the next image that + * will be written or created in this file. + * + * Format-specific data are arbitrary data blocks; the PixInsight core + * application knows nothing about them except that it passes them among + * instances, even instances of different file formats. + * + * Format-specific data are used by file formats that need working + * parameters that must persist across different file instances. In such + * cases, derived classes should implement suitable mechanisms to identify + * and validate their own data. + * + * For example, file formats that use variable compression schemes usually + * reimplement this member function, along with FormatSpecificData(), to + * keep track of a compression ratio, along with other private data items. + * + * To implement format-specific data support, + * MetaFileFormat::UsesFormatSpecificData() must be reimplemented to return + * true in the metaformat class for this file instance; otherwise this + * member function will never be called. + * + * Before calling this function, the PixInsight core application will call + * MetaFileFormat::ValidateFormatSpecificData() for the same \a data block. + * If the validation routine returns false, this function will not be called + * for the \a data block that failed the validation test. + */ + virtual void SetFormatSpecificData( const void* data ); + + /*! + * Specifies an ICC profile to be embedded in the next image written or + * created in this file. + */ + virtual void WriteICCProfile( const ICCProfile& icc ); + + /*! + * Specifies the parameters of an RGB working space that will be embedded in + * the next image written or created in this file. + */ + virtual void WriteRGBWorkingSpace( const RGBColorSystem& rgbws ); + + /*! + * Specifies a display function that will be embedded in the next image + * written or created in this file. + */ + virtual void WriteDisplayFunction( const DisplayFunction& df ); + + /*! + * Specifies a color filter array (CFA) that will be embedded in the next + * image written or created in this file. + */ + virtual void WriteColorFilterArray( const ColorFilterArray& cfa ); + + /*! + * Specifies a thumbnail \a image to be embedded in the next image written + * or created in this file. + */ + virtual void WriteThumbnail( const pcl::UInt8Image& image ); + + /*! + * Specifies a set of %FITS \a keywords to be embedded in the next image + * written or created in this file. + */ + virtual void WriteFITSKeywords( const FITSKeywordArray& keywords ); + + /*! + * Specifies a data property to be embedded in this file. + * + * \param property Unique identifier of the data property. + * + * \param value Property value. + * + * This member function will never be called if the underlying file format + * does not support data properties. See FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with WriteImageProperty(). This + * function defines a property for the \e whole file, while + * %WriteImageProperty() defines a property of the currently selected image. + */ + virtual void WriteProperty( const IsoString& property, const Variant& value ); + + /*! + * Specifies a data property to be embedded in the next image written or + * created in this file. + * + * \param property Unique identifier of the data property. + * + * \param value Property value. + * + * This member function will never be called if the underlying file format + * does not support data properties for individual images. See + * FileFormat::CanStoreImageProperties(). + */ + virtual void WriteImageProperty( const IsoString& property, const Variant& value ); + + /*! + * Writes a 32-bit floating point image to this file. + */ + virtual void WriteImage( const pcl::Image& image ); + + /*! + * Writes a 64-bit floating point image to this file. + */ + virtual void WriteImage( const pcl::DImage& image ); + + /*! + * Writes an 8-bit unsigned integer image to this file. + */ + virtual void WriteImage( const UInt8Image& image ); + + /*! + * Writes a 16-bit unsigned integer image to this file. + */ + virtual void WriteImage( const UInt16Image& image ); + + /*! + * Writes a 32-bit unsigned integer image to this file. + */ + virtual void WriteImage( const UInt32Image& image ); + + /*! + * Creates a new image with the geometry and color space as specified by an + * ImageInfo structure. The newly created image will be written by + * subsequent incremental write operations. + * + * The sample data type and other format-independent and format-specific + * image parameters have been specified by previous calls to SetOptions() + * and SetFormatSpecificData(). + * + * \note This member function must be reimplemented by all derived classes + * supporting incremental write operations. + */ + virtual void CreateImage( const ImageInfo& info ); + + /*! + * Closes the image that has been created by a previous call to + * CreateImage(). + * + * \note This member function must be reimplemented by all derived classes + * supporting incremental write operations. + */ + virtual void CloseImage(); + + /*! + * Returns true iff this instance can perform incremental write operations. + * + * The default implementation returns true. Do not confuse this member + * function with MetaFileFormat::CanWriteIncrementally(), which tells the + * PixInsight core application if a given file format has the capability of + * performing incremental file writes in general. The value returned by this + * function refers specifically to the file format instance (e.g., a + * particular file) represented by this object. + */ + virtual bool CanWriteIncrementally() const + { + return true; // allow incremental writes if the format supports them + } + + /*! + * Incremental write of 32-bit floating point pixel samples. + * + * \param buffer Address of the source sample buffer. + * + * \param startRow First pixel row to write. + * + * \param rowCount Number of pixel rows to write. + * + * \param channel Channel index to write. + * + * Incremental write operations allow the PixInsight core application and + * other modules to generate images by successive row strips. + * + * To implement incremental writing, + * MetaFileFormat::CanWriteIncrementally() must be reimplemented to return + * true in the metaformat class for this file instance; otherwise this + * member function will never be called. Furthermore, the + * FileFormatImplementation::CanWriteIncrementally() member function must + * return true for the format instance represented by this object. + */ + virtual void WriteSamples( const pcl::Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 64-bit floating point image. + * + * This is an overloaded member function for the DImage type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full description. + */ + virtual void WriteSamples( const pcl::DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of an 8-bit unsigned integer image. + * + * This is an overloaded member function for the UInt8Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full description. + */ + virtual void WriteSamples( const UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 16-bit unsigned integer image. + * + * This is an overloaded member function for the UInt16Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full description. + */ + virtual void WriteSamples( const UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 32-bit unsigned integer image. + * + * This is an overloaded member function for the UInt32Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full description. + */ + virtual void WriteSamples( const UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Returns true iff the last file write operation in this file was \e lossy. + * + * The PixInsight core application invokes this function just after + * successful completion of a call to WriteImage() or Write(). If a file + * format instance writes (or might write) lossy image data (e.g., by + * applying some lossy compression scheme), then this function must be + * reimplemented to return true, as appropriate. + * + * \note The default implementation of this function returns false, so + * lossless write operations are assumed by default. + */ + virtual bool WasLossyWrite() const + { + return false; // lossless write operations assumed by default + } + +protected: + + /* + * The file format to which this instance belongs. + */ + const MetaFileFormat* meta = nullptr; + +private: + + /* + * Internal stuff to automate low-level C API communication. + */ + AutoPointer m_data; + + ImageDescriptionArray m_description; // used exclusively by FileFormatDispatcher + + void BeginPrivate(); + + void BeginICCProfileExtraction(); + const ICCProfile& GetICCProfile() const; + void EndICCProfileExtraction(); + + void BeginRGBWSExtraction(); + const RGBColorSystem& GetRGBWS() const; + void EndRGBWSExtraction(); + + void BeginDisplayFunctionExtraction(); + const DisplayFunction& GetDisplayFunction() const; + void EndDisplayFunctionExtraction(); + + void BeginColorFilterArrayExtraction(); + const ColorFilterArray& GetColorFilterArray() const; + void EndColorFilterArrayExtraction(); + + void BeginThumbnailExtraction(); + const UInt8Image& GetThumbnail() const; + void EndThumbnailExtraction(); + + void BeginKeywordExtraction(); + size_type NumberOfKeywords() const; + bool GetNextKeyword( FITSHeaderKeyword& ) const; + void EndKeywordExtraction(); + + void BeginPropertyExtraction(); + const Variant& GetProperty( const IsoString& ); + void EndPropertyExtraction(); + + void BeginImagePropertyExtraction(); + const Variant& GetImageProperty( const IsoString& ); + void EndImagePropertyExtraction(); + + void BeginICCProfileEmbedding(); + void SetICCProfile( const ICCProfile& ); + void EndICCProfileEmbedding(); + + void BeginRGBWSEmbedding(); + void SetRGBWS( const RGBColorSystem& ); + void EndRGBWSEmbedding(); + + void BeginDisplayFunctionEmbedding(); + void SetDisplayFunction( const DisplayFunction& ); + void EndDisplayFunctionEmbedding(); + + void BeginColorFilterArrayEmbedding(); + void SetColorFilterArray( const ColorFilterArray& ); + void EndColorFilterArrayEmbedding(); + + void BeginThumbnailEmbedding(); + void SetThumbnail( const UInt8Image& ); + void EndThumbnailEmbedding(); + + void BeginKeywordEmbedding(); + void AddKeyword( const FITSHeaderKeyword& ); + void EndKeywordEmbedding(); + + void BeginPropertyEmbedding(); + void SetProperty( const IsoString&, const Variant& ); + void EndPropertyEmbedding(); + + void BeginImagePropertyEmbedding(); + void SetImageProperty( const IsoString&, const Variant& ); + void EndImagePropertyEmbedding(); + + friend class FileFormatDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_FileFormat_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileFormatImplementation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileFormatInstance.h b/3rdparty/include/pcl/FileFormatInstance.h new file mode 100644 index 0000000..b9a44a7 --- /dev/null +++ b/3rdparty/include/pcl/FileFormatInstance.h @@ -0,0 +1,1180 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileFormatInstance.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileFormatInstance_h +#define __PCL_FileFormatInstance_h + +/// \file pcl/FileFormatInstance.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS ColorFilterArray; +class PCL_CLASS DisplayFunction; +class PCL_CLASS FileFormat; +class PCL_CLASS ICCProfile; + +/*! + * \class FileFormatInstance + * \brief High-level interface to an image file format instance. + * + * %FileFormatInstance, along with %FileFormat, allows full access to any + * installed file format through intermodule communication. + * + * %FileFormatInstance represents a live instance of an installed image format; + * usually (but not necessarily) a disk file. + * + * \sa FileFormat + */ +class PCL_CLASS FileFormatInstance : public UIObject +{ +public: + + /*! + * Constructs a file format instance of the specified file format \a fmt. + */ + FileFormatInstance( const FileFormat& fmt ); + + /*! + * Move constructor. + */ + FileFormatInstance( FileFormatInstance&& x ) + : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a file format instance. + * + * After destruction of this instance, the server-side object is also + * destroyed if it is no longer referenced by other %FileFormatInstance + * objects. When the server-side object is destroyed, any open files are + * automatically flushed and closed, as necessary. + */ + virtual ~FileFormatInstance() + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + FileFormatInstance& operator =( FileFormatInstance&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since file format instances are unique objects, calling this member + * function has no effect. + */ + void EnsureUnique() override + { + } + + /*! + * Returns a reference to a null format instance. A null + * %FileFormatInstance object does not correspond to an existing image file + * format instance in the PixInsight core application. + */ + static FileFormatInstance& Null(); + + /*! + * Returns a FileFormat object that represents the installed file format + * that this instance belongs to. + */ + FileFormat Format() const; + + /*! + * Closes an image file (after Open() or Create()). + * + * Returns true iff the file was successfully closed. + */ + bool Close(); + + /*! + * Returns true iff this file is currently open. + */ + bool IsOpen() const; + + /*! + * Returns the absolute file path of this file format instance. If no file + * path has been set yet (by calling Open() or Create()), this member + * function returns an empty string. + */ + String FilePath() const; + + // Reader functionality + + /*! + * Opens an image file for reading and/or information retrieval. + * + * \param images Reference to a dynamic array of ImageDescription + * structures. On successful return, this array will describe the + * image(s) stored in this image file. Each %ImageDescription + * structure will contain ImageInfo and ImageOptions objects that + * describe both basic image parameters (as geometry and color + * space) and format-independent image options (pixel format, + * embedded data, etc). Descriptive information is provided by the + * underlying format module with data retrieved from the opened + * image file. + * + * \param filePath File path to an existing file that will be opened. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image file is opened and/or the + * way image data are to be read and decoded. A format module can + * simply ignore all of these hints, or just look for one or more + * hints that it recognizes and supports, ignoring others. When two + * or more hints are specified, they must be separated by space + * characters (0x20). Most standard file formats support hints. For + * example, the standard DSLR_RAW format recognizes the "raw" hint + * to force reading pure raw data (no deBayerization, no black + * pedestal subtraction, no white balancing) irrespective of the + * current DSLR RAW format settings. The default value is an empty + * string. + * + * This member function can provide an empty \a images array. If this + * happens, it means that the file is empty, that is, it contains no image. + * Although there is no standard file format module that supports empty + * image files as of writing this documentation, this is a possibility that + * must be taken into account by calling modules. + * + * Returns true if the file was successfully opened; false in the event of + * error. + */ + bool Open( ImageDescriptionArray& images, + const String& filePath, const IsoString& hints = IsoString() ); + + bool Open( ImageDescriptionArray& images, const String& filePath, const IsoString::ustring_base& hints ) + { + return Open( images, filePath, IsoString( hints ) ); + } + + /*! + * Selects the image at the specified zero-based \a index in this file. + * + * Returns true if the specified image was successfully selected; false in + * the event of error. + * + * This member function must only be called for file formats that support + * multiple images stored in a single file. It should not be called if the + * FileFormat::SupportsMultipleImages() member function returns false for + * the file format this instance belongs to. + */ + bool SelectImage( int index ); + + /*! + * Returns the current zero-based image index in this file. + * + * This member function must only be called for file formats that support + * multiple images stored in a single file. It should not be called if the + * FileFormat::SupportsMultipleImages() member function returns false for + * the file format this instance belongs to. + */ + int SelectedImageIndex() const; + + /*! + * Returns a format-specific data block for the current image in + * this file, or zero if no such data have been retrieved. + * + * See SetFormatSpecificData() for a description of format-specific data + * functionality in PCL. + * + * Format-specific data blocks do not pertain to the caller's heap, but to + * the underlying module that implements the file format. Therefore, all + * format-specific data blocks must be deallocated, when appropriate, by + * calling FileFormat::DisposeFormatSpecificData(). + */ + const void* FormatSpecificData() const; + + /*! + * Provides a human-readable summary of format-specific properties for the + * current image in this file. + * + * The returned string should include format-specific information, \e not + * generic image information. For example, it won't include image + * dimensions, color space, and other things that can be retrieved with the + * Open() member function. + */ + String ImageFormatInfo() const; + + /*! + * Extraction of the ICC color profile associated with the current image in + * this file. + * + * If the current image embeds an ICC profile, it will be assigned to the + * specified \a icc object. Otherwise, \a icc will be set to a null profile. + * + * Returns true iff the file access operation was successful, even if no + * ICC profile was extracted. Returns false in the event of error. + */ + bool ReadICCProfile( ICCProfile& icc ); + + /*! + * Extraction of the RGB working space associated with the current image in + * this file. + * + * Returns true iff the file access operation was successful, even if no + * RGBWS was extracted. Returns false in the event of error. + * + * If no RGBWS is defined for the current image, this function will assign a + * default-constructed RGBColorSystem object to \a rgbws (see + * RGBColorSystem::sRGB). + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting RGB working spaces. See + * FileFormat::CanStoreRGBWS(). + */ + bool ReadRGBWorkingSpace( RGBColorSystem& rgbws ); + + /*! + * Extraction of the display function associated with the current image in + * this file. + * + * Returns true iff the file access operation was successful, even if no + * display function was extracted. Returns false in the event of error. + * + * If no display function is defined for the current image, this function + * will assign an identity display function to \a df (see DisplayFunction's + * default constructor). + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting display functions. See + * FileFormat::CanStoreDisplayFunctions(). + */ + bool ReadDisplayFunction( DisplayFunction& df ); + + /*! + * Extraction of the color filter array (CFA) for the current image in this + * file. + * + * Returns true iff the file access operation was successful, even if no CFA + * was extracted. Returns false in the event of error. + * + * If no CFA is defined for the current image, this function will assign an + * empty CFA to \a cfa (see ColorFilterArray's default constructor). + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting color filter arrays. See + * FileFormat::CanStoreColorFilterArrays(). + */ + bool ReadColorFilterArray( ColorFilterArray& cfa ); + + /*! + * Extraction of an embedded thumbnail for the current image in this file. + * + * If the current image embeds a thumbnail image, it will be assigned to the + * specified \a thumbnail 8-bit integer image. Otherwise, a null image will + * be assigned to \a thumbnail. + * + * Returns true iff the file access operation was successful, even if no + * thumbnail image was extracted. Returns false in the event of error. + */ + bool ReadThumbnail( UInt8Image& thumbnail ); + + /*! + * Extraction of embedded keywords for the current image in this file. + * + * If the current image embeds FITS header keywords, they will be added + * to the specified \a keywords list. Otherwise the \a keywords list will be + * left empty. In any case, previous contents of the \a kwywords list will + * be destroyed. + * + * Returns true iff the file access operation was successful, even if no + * keyword was extracted. Returns false in the event of error. + */ + bool ReadFITSKeywords( FITSKeywordArray& keywords ); + + /*! + * Returns a description of all data properties associated with this file. + * For each data property, the returned array provides information on the + * unique identifier of a property and its data type. + * + * Returns an empty array if there are no properties associated with this + * file. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ImagePropertyDescriptions(). This + * function returns information on the properties of the \e whole file, + * while %ImagePropertyDescriptions() returns information on the properties of the + * currently selected image. + */ + PropertyDescriptionArray PropertyDescriptions(); + + /*! + * Returns true iff the specified property exists associated with this file. + * Returns false if no such property exists for this file. + * + * This is a convenience member function, equivalent to the following code: + * + * \code PropertyDescriptions().Contains( property ); \endcode + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with HasImageProperty(). This + * function returns true if a given property of the \e whole file exists, + * while %HasImageProperty() returns true if a property of the currently + * selected image exists. + */ + bool HasProperty( const IsoString& property ) + { + return PropertyDescriptions().Contains( property ); + } + + bool HasProperty( const IsoString::ustring_base& property ) + { + return HasProperty( IsoString( property ) ); + } + + /*! + * Returns a description (unique identifier and data type) of the specified + * data property associated with this file. If no such property exists, the + * returned PropertyDescription object specifies an invalid data type and + * an empty identifier. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ImagePropertyDescription(). + * This function describes a property of the \e whole file, while + * %ImagePropertyDescription() describes a property of the currently + * selected image. + */ + pcl::PropertyDescription PropertyDescription( const IsoString& property ) + { + PropertyDescriptionArray properties = PropertyDescriptions(); + PropertyDescriptionArray::const_iterator i = properties.Search( property ); + if ( i == properties.End() ) + return pcl::PropertyDescription(); + return *i; + } + + pcl::PropertyDescription PropertyDescription( const IsoString::ustring_base& property ) + { + return PropertyDescription( IsoString( property ) ); + } + + /*! + * Extraction of a data property associated with this file with the + * specified unique identifier. + * + * If no property with the specified identifier exists associated with this + * file, an invalid Variant object will be returned. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ReadImageProperty(). This + * function returns the value of a property of the \e whole file, while + * %ReadImageProperty() returns the value of a property of the currently + * selected image. + */ + Variant ReadProperty( const IsoString& property ); + + Variant ReadProperty( const IsoString::ustring_base& property ) + { + return ReadProperty( IsoString( property ) ); + } + + /*! + * Returns an array with all data properties associated with this file. + * + * Returns an empty array if there are no properties associated with this + * file. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with ReadImageProperties(). This + * function returns the properties of the \e whole file, while + * %ReadImageProperties() returns the properties of the currently selected + * image. + */ + PropertyArray ReadProperties(); + + /*! + * Returns a description of all data properties associated with the current + * image in this file. For each data property, the returned array provides + * information on the unique identifier of a property and its data type. + * + * Returns an empty array if there are no properties stored for the current + * image in this file. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + PropertyDescriptionArray ImagePropertyDescriptions(); + + /*! + * Returns true iff the specified property exists associated with the + * current image in this file. Returns false if no such property exists. + * + * This is a convenience member function, equivalent to the following code: + * + * \code ImagePropertyDescriptions().Contains( property ); \endcode + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + bool HasImageProperty( const IsoString& property ) + { + return ImagePropertyDescriptions().Contains( property ); + } + + bool HasImageProperty( const IsoString::ustring_base& property ) + { + return HasImageProperty( IsoString( property ) ); + } + + /*! + * Returns a description (unique identifier and data type) of the specified + * data property associated with the current image. If no such property + * exists, the returned PropertyDescription object specifies an + * invalid data type and empty identifier. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + pcl::PropertyDescription ImagePropertyDescription( const IsoString& property ) + { + PropertyDescriptionArray properties = ImagePropertyDescriptions(); + PropertyDescriptionArray::const_iterator i = properties.Search( property ); + if ( i == properties.End() ) + return pcl::PropertyDescription(); + return *i; + } + + pcl::PropertyDescription ImagePropertyDescription( const IsoString::ustring_base& property ) + { + return ImagePropertyDescription( IsoString( property ) ); + } + + /*! + * Extraction of a data property of the current image with the specified + * unique identifier. + * + * If no property with the specified identifier exists associated with the + * current image in this file, an invalid Variant object will be returned. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + Variant ReadImageProperty( const IsoString& property ); + + Variant ReadImageProperty( const IsoString::ustring_base& property ) + { + return ReadImageProperty( IsoString( property ) ); + } + + /*! + * Returns an array with all data properties of the current image. + * + * If no property exists associated with the current image in this file, an + * empty array will be returned. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + PropertyArray ReadImageProperties(); + + /*! + * Reads the current image in 32-bit floating point format. Returns true iff + * the image was successfully read. + */ + bool ReadImage( FImage& image ); + + /*! + * Reads the current image in 64-bit floating point format. Returns true iff + * the image was successfully read. + */ + bool ReadImage( DImage& image ); + + /*! + * Reads the current image in 8-bit unsigned integer format. Returns true + * iff the image was successfully read. + */ + bool ReadImage( UInt8Image& image ); + + /*! + * Reads the current image in 16-bit unsigned integer format. Returns true + * iff the image was successfully read. + */ + bool ReadImage( UInt16Image& image ); + + /*! + * Reads the current image in 32-bit unsigned integer format. Returns true + * iff the image was successfully read. + */ + bool ReadImage( UInt32Image& image ); + + /*! + * Reads the current image and stores it in the image transported by the + * specified ImageVariant object, using the pixel sample format of the + * transported image. Returns true iff the ImageVariant object transports a + * valid image and the image was successfully read. + */ + bool ReadImage( ImageVariant& image ) + { + if ( image ) + if ( !image.IsComplexSample() ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: return ReadImage( static_cast( *image ) ); + case 64: return ReadImage( static_cast( *image ) ); + } + else + switch ( image.BitsPerSample() ) + { + case 8: return ReadImage( static_cast( *image ) ); + case 16: return ReadImage( static_cast( *image ) ); + case 32: return ReadImage( static_cast( *image ) ); + } + return false; + } + + /*! + * Returns true iff this instance can perform incremental read operations. + * + * Do not confuse this member function with + * FileFormat::CanReadIncrementally(), which tells you if a given file + * format has the capability of performing incremental file reads in + * general. The value returned by this function refers specifically to this + * format instance (e.g., a particular file). + */ + bool CanReadIncrementally() const; + + /*! + * Incremental read in 32-bit floating point sample format. + * + * \param[out] buffer Address of the destination sample buffer. + * + * \param startRow First pixel row to read. + * + * \param rowCount Number of pixel rows to read. + * + * \param channel Channel index to read. + * + * Returns true if the specified pixel row(s) were successfully read; false + * in the event of error, or if the operation was cancelled. + * + * Incremental read operations allow loading images by successive pixel row + * strips. They are useful to manage very large files, or large sets of + * image files that don't fit in the available RAM. + * + * When a file format implements incremental reading, the corresponding + * FileFormat::CanReadIncrementally() returns true. Furthermore, the + * CanReadIncrementally() member function of this class should also return + * true for this object, allowing incremental reads for this particular + * format instance. Otherwise this function must not be invoked - it will + * throw an exception if called for a format that does not support + * incremental reads, and will fail unexpectedly if called for an instance + * that does not allow them. + */ + bool ReadSamples( FImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 64-bit floating point sample format. + * + * This is an overloaded member function for the DImage type; see + * ReadSamples( FImage::sample*, int, int, int, int ) for a full + * description. + */ + bool ReadSamples( DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 8-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt8Image type; see + * ReadSamples( FImage::sample*, int, int, int, int ) for a full + * description. + */ + bool ReadSamples( UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 16-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt16Image type; see + * ReadSamples( FImage::sample*, int, int, int, int ) for a full + * description. + */ + bool ReadSamples( UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental read in 32-bit unsigned integer sample format. + * + * This is an overloaded member function for the UInt32Image type; see + * ReadSamples( FImage::sample*, int, int, int, int ) for a full + * description. + */ + bool ReadSamples( UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Returns true iff the last file read operation was \e inexact. + * + * This function can be called just after a successful call to ReadImage() + * or Read(). If a file format instance reads source images inexactly, + * (e.g., by applying a rounding function to source sample values), then + * this function should return true. + */ + bool WasInexactRead() const; + + // Writer functionality + + /*! + * Queries image options and format-specific data before creating a new + * image file. Returns true if the file creation operation can continue; + * false if it should be aborted. + * + * \param[out] options Reference to a dynamic array of ImageOptions + * objects. Each of these objects provides a general description of + * an image stored in a file instance of this file format. The + * underlying file format module is responsible for setting the + * appropriate values in the passed structures. The returned + * options can be used to generate a new file through a subsequent + * call to Create(). Formats that support multiple images per file + * can receive more than one %ImageOptions structure stored in this + * array. Passing more than one %ImageOptions object to a format + * that doesn't support multiple images will be caught and blocked + * by the PixInsight core application. + * + * \param[out] formatOptions Reference to a dynamic array of + * format-specific data blocks. Each void pointer in this + * array can be either zero or point to valid format-specific data + * for the format of this instance. This array can be empty if no + * format-specific data is being set. See the + * SetFormatSpecificData() member function for more information on + * format-specific data blocks. + * + * A module should call this function just before calling Create(), as part + * of a File > Save As operation, or equivalent. Typically, the + * underlying format module will open a dialog box to let the user modify + * some working options. This function will return true unless the user + * cancels the format options dialog. + */ + bool QueryOptions( Array& options, Array& formatOptions ); + + /*! + * Creates an image file for writing. + * + * \param filePath Path to a file that will be created. If a file exists + * at the same path, it will be overwritten and its current + * contents will be lost. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image file is generated and/or the + * way image data are to be encoded and written. A format module + * can simply ignore all of these hints, or just look for one or + * more hints that it recognizes and supports, ignoring others. + * When two or more hints are specified, they must be separated by + * space characters (0x20). Many standard file formats support some + * hints. For example, the standard JPEG format recognizes the + * "quality <n>" hint to force generation of a JPEG image + * with a given quality level <n> in the range 1 to 100, + * irrespective of the current JPEG format settings. + * + * \param numberOfImages This is the number of images that will be written + * to the file after creation. It can be zero if an empty file is + * being created, and also less than zero if the number of images + * is unknown or cannot be defined at the point of creation. This + * parameter defaults to one. + * + * Returns true iff the file was successfully created. Returns false in the + * event of error. + */ + bool Create( const String& filePath, const IsoString& hints = IsoString(), int numberOfImages = 1 ); + + bool Create( const String& filePath, const IsoString::ustring_base& hints, int numberOfImages = 1 ) + { + return Create( filePath, IsoString( hints ), numberOfImages ); + } + + /*! + * Specifies an identifier for the next image that will be written or + * created in this file. + * + * Returns true iff the identifier was successfully assigned. Returns false + * in the event of error. + * + * \note Most file format implementations don't support image identifiers + * and simply ignore a call to this function, reporting success. + */ + bool SetId( const IsoString& id ); + + bool SetId( const IsoString::ustring_base& id ) + { + return SetId( IsoString( id ) ); + } + + /*! + * Specifies a set of format-independent image \a options for the next image + * that will be written or created in this file. + * + * Returns true iff the options were successfully assigned. Returns false in + * the event of error. + * + * \note A file format implementations may ignore any format-independent + * options set with a call to this function, reporting success. + */ + bool SetOptions( const ImageOptions& options ); + + /*! + * Specifies a format-specific data block for the next image that + * will be written or created in this file. + * + * Format-specific data are arbitrary data blocks; the PixInsight core + * application knows nothing about them except that it keeps them for all + * open image files and passes them among instances, even instances of + * different file formats. The core application deallocates format-specific + * data blocks when appropriate, by invoking the corresponding module + * deallocation routines. + * + * Format-specific data are often used by image file formats to store + * working data on a per-instance basis (which usually means on a + * per-file basis), such as compression modes and ratios, file + * organization modes, and many other critical working parameters that can + * persist across different file format instances. + * + * When a file format uses (or can use) format-specific data, the + * corresponding FileFormat::UsesFormatSpecificData() member function + * returns true. + * + * Returns true iff the specified data block was accepted by this instance. + * Returns false if the data block is invalid, or in the event of error. + * + * \a note A module should verify validity of a format-specific data block + * with FileFormat::ValidateFormatSpecificData() before calling this + * function to pass the block to an instance. + */ + bool SetFormatSpecificData( const void* data ); + + /*! + * Specifies an ICC profile to be embedded in the next image written or + * created in this file. + * + * Returns true if the specified ICC profile was successfully embedded in + * the image; false in the event of error. + */ + bool WriteICCProfile( const ICCProfile& icc ); + + /*! + * Specifies the parameters of an RGB working space that will be embedded in + * the next image written or created in this file. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting RGB working spaces. See + * FileFormat::CanStoreRGBWS(). + */ + bool WriteRGBWorkingSpace( const RGBColorSystem& rgbws ); + + /*! + * Specifies a display function that will be embedded in the next image + * written or created in this file. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting display functions. See + * FileFormat::CanStoreDisplayFunctions(). + */ + bool WriteDisplayFunction( const DisplayFunction& df ); + + /*! + * Specifies a color filter array (CFA) that will be embedded in the next + * image written or created in this file. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting color filter arrays. See + * FileFormat::CanStoreColorFilterArrays(). + */ + bool WriteColorFilterArray( const ColorFilterArray& cfa ); + + /*! + * Specifies a thumbnail \a image to be embedded in the next image written + * or created in this file. + * + * Returns true if the specified thumbnail \a image was successfully + * embedded in the image; false in the event of error. + */ + bool WriteThumbnail( const UInt8Image& image ); + + /*! + * Specifies a data property to be embedded in this file. + * + * \param property Unique identifier of the data property. + * + * \param value Property value. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with WriteImageProperty(). This + * function defines a property of the \e whole file, while + * %WriteImageProperty() defines a property of the currently selected image. + */ + bool WriteProperty( const IsoString& property, const Variant& value ); + + bool WriteProperty( const IsoString::ustring_base& property, const Variant& value ) + { + return WriteProperty( IsoString( property ), value ); + } + + /*! + * Specifies a data property to be embedded in this file. + * + * Calling this member function is equivalent to: + * + * \code WriteProperty( property.Id(), property.Value() ) \endcode + */ + bool WriteProperty( const Property& property ) + { + return WriteProperty( property.Id(), property.Value() ); + } + + /*! + * Specifies a set of data \a properties to be embedded in this file. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties. See + * FileFormat::CanStoreProperties(). + * + * \note Don't confuse this member function with WriteImageProperties(). + * This function defines a set of properties for the \e whole file, while + * %WriteImageProperties() defines properties for the currently selected + * image. + */ + bool WriteProperties( const PropertyArray& properties ); + + /*! + * Specifies a data property to be embedded in the next image written or + * created in this file. + * + * \param property Unique identifier of the data property. + * + * \param value Property value. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + bool WriteImageProperty( const IsoString& property, const Variant& value ); + + bool WriteImageProperty( const IsoString::ustring_base& property, const Variant& value ) + { + return WriteImageProperty( IsoString( property ), value ); + } + + /*! + * Specifies a data property to be embedded in the next image written or + * created in this file. + * + * Calling this member function is equivalent to: + * + * \code WriteImageProperty( property.Id(), property.Value() ) \endcode + */ + bool WriteImageProperty( const Property& property ) + { + return WriteImageProperty( property.Id(), property.Value() ); + } + + /*! + * Specifies a set of data \a properties to be embedded in the next image + * written or created in this file. + * + * Returns true only if the embedding operation was successful. + * + * To prevent runtime errors, you should only call this member function for + * instances of file formats supporting data properties for individual + * images. See FileFormat::CanStoreImageProperties(). + */ + bool WriteImageProperties( const PropertyArray& properties ); + + /*! + * Specifies a set of %FITS \a keywords to be embedded in the next image + * written or created in this file. + * + * Returns true if the specified \a keywords list was successfully embedded + * in the image; false in the event of error. + */ + bool WriteFITSKeywords( const FITSKeywordArray& keywords ); + + /*! + * Writes a 32-bit floating point image to this file. Returns true iff the + * image was successfully written. + */ + bool WriteImage( const FImage& image ); + + /*! + * Writes a 64-bit floating point image to this file. Returns true iff the + * image was successfully written. + */ + bool WriteImage( const DImage& image ); + + /*! + * Writes an 8-bit unsigned integer image to this file. Returns true iff the + * image was successfully written. + */ + bool WriteImage( const UInt8Image& image ); + + /*! + * Writes a 16-bit unsigned integer image to this file. Returns true iff the + * image was successfully written. + */ + bool WriteImage( const UInt16Image& image ); + + /*! + * Writes a 32-bit unsigned integer image to this file. Returns true iff the + * image was successfully written. + */ + bool WriteImage( const UInt32Image& image ); + + /*! + * Writes image transported by the specified ImageVariant object to this + * file, using the pixel sample format of the transported image. Returns + * true iff the ImageVariant object transports a valid image and the image + * was successfully written. + */ + bool WriteImage( const ImageVariant& image ) + { + if ( image ) + if ( !image.IsComplexSample() ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: return WriteImage( static_cast( *image ) ); + case 64: return WriteImage( static_cast( *image ) ); + } + else + switch ( image.BitsPerSample() ) + { + case 8: return WriteImage( static_cast( *image ) ); + case 16: return WriteImage( static_cast( *image ) ); + case 32: return WriteImage( static_cast( *image ) ); + } + return false; + } + + /*! + * Returns true iff this instance can perform incremental write operations. + * + * Do not confuse this member function with + * FileFormat::CanWriteIncrementally(), which tells you if a given file + * format has the capability of performing incremental file writes in + * general. The value returned by this function refers specifically to this + * format instance (e.g., a particular file). + */ + bool CanWriteIncrementally() const; + + /*! + * Creates a new image with the geometry and color space as specified by an + * ImageInfo structure. The newly created image will be written by + * subsequent incremental write operations. + * + * The sample data type and other format-independent and format-specific + * image parameters have been specified by previous calls to SetOptions() + * and SetFormatSpecificData(). + * + * Returns true iff the image was successfully created. + * + * \note This member function should not be invoked for file formats that + * don't support incremental write operations, or for format instances that + * don't allow them. + */ + bool CreateImage( const ImageInfo& info ); + + /*! + * Closes the image that has been created by a previous call to + * CreateImage(). + * + * Returns true iff the image was successfully closed. + * + * \note This member function must be reimplemented by all derived classes + * supporting incremental write operations. + */ + bool CloseImage(); + + /*! + * Incremental write of 32-bit floating point pixel samples. + * + * \param buffer Address of the source sample buffer. + * + * \param startRow First pixel row to write. + * + * \param rowCount Number of pixel rows to write. + * + * \param channel Channel index to write. + * + * Returns true iff the specified pixel row(s) were successfully written; + * false in the event of error, or if the operation was cancelled. + * + * Incremental write operations allow the PixInsight core application and + * other modules to generate images by successive row strips. They are + * useful to generate extremely large images, or large sets of images that + * don't fit in the available RAM. + * + * When a file format implements incremental writing, the corresponding + * FileFormat::CanWriteIncrementally() returns true. Furthermore, the + * CanWriteIncrementally() member function of this class should also return + * true for this object, allowing incremental writes for this particular + * format instance. Otherwise this function must not be invoked - it will + * throw an exception if called for a format that does not support + * incremental writes, and will fail unexpectedly if called for an instance + * that does not allow them. + */ + bool WriteSamples( const FImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 64-bit floating point image. + * + * This is an overloaded member function for the DImage type; see + * WriteSamples( const FImage::sample*, int, int, int ) for a full + * description. + */ + bool WriteSamples( const DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of an 8-bit unsigned integer image. + * + * This is an overloaded member function for the UInt8Image type; see + * WriteSamples( const FImage::sample*, int, int, int ) for a full + * description. + */ + bool WriteSamples( const UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 16-bit unsigned integer image. + * + * This is an overloaded member function for the UInt16Image type; see + * WriteSamples( const FImage::sample*, int, int, int ) for a full + * description. + */ + bool WriteSamples( const UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental write of a 32-bit unsigned integer image. + * + * This is an overloaded member function for the UInt32Image type; see + * WriteSamples( const FImage::sample*, int, int, int ) for a full + * description. + */ + bool WriteSamples( const UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Returns true iff the last file write operation in this file was \e lossy. + * + * This function can ve called just after successful completion of a call to + * WriteImage() or Write(). If a file format instance writes lossy image + * data (e.g., by applying some lossy compression scheme), then this + * function will return true. + */ + bool WasLossyWrite() const; + +private: + + FileFormatInstance( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class FileFormatInstancePrivate; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_FileFormatInstance_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileFormatInstance.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FileInfo.h b/3rdparty/include/pcl/FileInfo.h new file mode 100644 index 0000000..e977860 --- /dev/null +++ b/3rdparty/include/pcl/FileInfo.h @@ -0,0 +1,442 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FileInfo.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FileInfo_h +#define __PCL_FileInfo_h + +/// \file pcl/FileInfo.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FileInfo + * \brief Platform-independent information on file and directory items. + * + * ### TODO: Write a detailed description for %FileInfo. + */ +class PCL_CLASS FileInfo +{ +public: + + /*! + * Default constructor. Constructs an empty %FileInfo object without any + * information on existing file or directory items. + */ + FileInfo() + { + Clear(); + } + + /*! + * Constructs a %FileInfo object with information retrieved for the + * specified file or directory \a path. + */ + FileInfo( const String& path ) + { + Refresh( path ); + } + + /*! + * Copy constructor. + */ + FileInfo( const FileInfo& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~FileInfo() + { + } + + /*! + * Assignment operator. Returns a reference to this object. + */ + FileInfo& operator =( const FileInfo& ) = default; + + /*! + * Returns the absolute path of this file or directory. + */ + const String& Path() const + { + return m_path; + } + + /*! + * Returns the Windows drive component of the path in this object, or an + * empty string if the path does not include a Windows drive specification. + * + * This function only makes sense on Windows. On UNIX and Linux operating + * systems, this function always returns an empty string. + */ + String Drive() const + { + return File::ExtractDrive( m_path ); + } + + /*! + * Returns the parent directory component of the path in this object, or an + * empty string if the path does not include a parent directory. + * + * On Windows, the drive component of the path is \e not included. + * + * Examples: + * + * \li In '/foo.tar.gz' the directory is '/'. + * \li In '/foo/bar.tar.gz' the directory is '/foo'. + * \li In 'foo/bar.tar.gz' the directory is 'foo'. + * \li In 'C:/Foo/Bar.txt' the directory is '/Foo'. + */ + String Directory() const + { + return File::ExtractDirectory( m_path ); + } + + /*! + * Returns the file name component of the path in this object, or an empty + * string if the path does not include a name. + * + * The file extension or suffix is \e not included. + * + * Examples: + * + * \li In '/foo/bar.tar.gz' the name is 'bar'. + * \li In 'C:/Foo/Bar.txt' the name is 'Bar'. + */ + String Name() const + { + return File::ExtractName( m_path ); + } + + /*! + * Returns the file extension component of the path in this object, or an + * empty string if the path does not include an extension. + * + * The returned extension \e includes the initial dot separator. + * + * Examples: + * + * \li In '/foo/bar.tar.gz' the extension is '.gz'. + * \li In 'C:/Foo/Bar.txt' the extension is '.txt'. + */ + String Extension() const + { + return File::ExtractExtension( m_path ); + } + + /*! + * A synonym for Extension(). + */ + String Suffix() const + { + return Extension(); + } + + /*! + * Returns the complete suffix of the path in this object, or an empty + * string if the path does not include a suffix. + * + * The returned string \e includes the initial dot separator. + * + * The complete suffix is the rightmost substring of the path, starting with + * the first occurrence of a dot character. For example, in 'foo.tar.gz' the + * complete suffix is '.tar.gz'. + */ + String CompleteSuffix() const + { + return File::ExtractCompleteSuffix( m_path ); + } + + /*! + * Returns the name and extension of the path in this object. Calling this + * member function is functionally equivalent to: Name() + Extension(). + */ + String NameAndExtension() const + { + return File::ExtractNameAndExtension( m_path ); + } + + /*! + * A synonym for NameAndExtension(). + */ + String NameAndSuffix() const + { + return NameAndExtension(); + } + + /*! + * Returns true iff this object represents an existing file or directory. + */ + bool Exists() const + { + return m_exists; + } + + /*! + * Returns a constant reference to the FileAttributes flags for this file or + * directory. + */ + const FileAttributes& Attributes() const + { + return m_attributes; + } + + /*! + * Returns true iff this object represents an existing directory. + */ + bool IsDirectory() const + { + return m_attributes.IsFlagSet( FileAttribute::Directory ); + } + + /*! + * Returns true iff this object represents an existing file. + */ + bool IsFile() const + { + return m_attributes.IsFlagSet( FileAttribute::Regular ); + } + + /*! + * Returns true iff this object represents a symbolic link. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns false. + */ + bool IsSymbolicLink() const + { + return m_attributes.IsFlagSet( FileAttribute::SymbolicLink ); + } + + /*! + * Returns the target path of this symbolic link, or an empty string if this + * object does not represent a symbolic link. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns an empty string. + */ + String SymbolicLinkTarget() const; + + /*! + * Returns true iff this object represents a hidden file or directory. + * + * On Windows, this member function returns true if the file or directory + * represented by this object has the hidden attribute set. On UNIX and + * Linux operating systems, this function returns true when the file or + * directory name begins with a dot character. + */ + bool IsHidden() const + { + return m_attributes.IsFlagSet( FileAttribute::Hidden ); + } + + /*! + * Returns true iff the user id and group id of the caller process have read + * access permission for the item represented by this object. + */ + bool IsReadable() const + { + return m_readable; + } + + /*! + * Returns true iff the user id and group id of the caller process have write + * access permission for the item represented by this object. + */ + bool IsWritable() const + { + return m_writable; + } + + /*! + * Returns true iff the user id and group id of the caller process have + * execution access permission for the item represented by this object. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns false. + * + * On POSIX systems, this function returns true only if the item represented + * has the S_IXUSR file mode bit set. This means that this function will + * normally return true for directories, since S_IXUSR/S_IXGRP/S_IXOTH + * represent standard search permissions for a directory. + */ + bool IsExecutable() const + { + return m_executable; + } + + /*! + * Returns the size in bytes of the file or directory item represented by + * this object. + * + * If this object represents a directory, a fixed size (usually 4096 bytes) + * is always returned on UNIX and Linux systems. On Windows, zero is always + * returned for directories. + */ + fsize_type Size() const + { + return m_size; + } + + /*! + * Returns the number of existing hard links to the file or directory item + * represented by this object. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns zero. + */ + int NumberOfHardLinks() const + { + return m_numberOfHardLinks; + } + + /*! + * Returns the user id of the owner of the file or directory item + * represented by this object. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns zero. + */ + int UserId() const + { + return m_userId; + } + + /*! + * Returns the group id of the owner of the file or directory item + * represented by this object. + * + * This member function only makes sense on UNIX/Linux platforms. On Windows + * it always returns zero. + */ + int GroupId() const + { + return m_groupId; + } + + /*! + * Returns a constant reference to a FileTime structure corresponding to the + * creation time of this file or directory. + */ + const FileTime& TimeCreated() const + { + return m_created; + } + + /*! + * Returns a constant reference to a FileTime structure corresponding to the + * last access time of this file or directory. + */ + const FileTime& LastAccessed() const + { + return m_lastAccessed; + } + + /*! + * Returns a constant reference to a FileTime structure corresponding to the + * last modification time of this file or directory. + */ + const FileTime& LastModified() const + { + return m_lastModified; + } + + /*! + * Retrieves up-to-date information for the item represented by this object. + */ + void Refresh(); + + /*! + * Retrieves information for the specified \a path. + */ + void Refresh( const String& path ); + + /*! + * Clears all the information in this object, leaving it in an invalid state + * corresponding to a nonexistent item. + */ + void Clear(); + +private: + + String m_path; // full file or directory path + FileAttributes m_attributes; // item attributes + fsize_type m_size; // file size in bytes + int m_numberOfHardLinks; // number of existing hard links to this file + int m_userId; // user id of the file owner + int m_groupId; // group id of the file owner + FileTime m_created; // creation time + FileTime m_lastAccessed; // time of last access + FileTime m_lastModified; // time of last change + bool m_exists; // item exists + bool m_readable; // caller has read permission + bool m_writable; // caller has write permission + bool m_executable; // caller has execute permission + + // Clears everything but *preserves* m_path + void ClearData(); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FileInfo_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FileInfo.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Flags.h b/3rdparty/include/pcl/Flags.h new file mode 100644 index 0000000..c3cbe6f --- /dev/null +++ b/3rdparty/include/pcl/Flags.h @@ -0,0 +1,409 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Flags.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Flags_h +#define __PCL_Flags_h + +/// \file pcl/Flags.h + +#include + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ +class GlobalSettings; +} +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +template struct FlagType {}; +template <> struct FlagType { typedef unsigned type; }; +template <> struct FlagType { typedef int type; }; + +// ---------------------------------------------------------------------------- + +/*! + * \class Flags + * \brief A type-safe collection of enumerated flags + * + * ### TODO: Write a detailed description for %Flags. + */ +template +class PCL_CLASS Flags +{ +public: + + static_assert( sizeof( E ) <= sizeof( int ), + "Invalid sizeof( Flags::enum_type ): Must not be larger than sizeof( int )" ); + + /*! + * Represents the enumerated type that defines individual flags. + */ + typedef E enum_type; + + /*! + * Represents the integral type used to store flags. + */ + typedef typename FlagType::value>::type + flag_type; + + /*! + * Constructs an empty (zero) %Flags instance. + */ + Flags() = default; + + /*! + * Constructs a %Flags instance from an enumerated flag value \a e. + */ + constexpr + Flags( enum_type e ) + : m_flags( int( e ) ) + { + } + + /*! + * Constructs a %Flags instance from a mask \a m. + */ + constexpr + Flags( flag_type m ) + : m_flags( int( m ) ) + { + } + + /*! + * Copy constructor. + */ + Flags( const Flags& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Flags& operator =( const Flags& ) = default; + + /*! + * Assigns an enumerated flag value \a e to this object. Returns a reference + * to this object. + */ + Flags& operator =( enum_type e ) + { + m_flags = e; + return *this; + } + + /*! + * Performs a bitwise AND operation with other flags \a f and stores the + * resulting flags in this object. Returns a reference to this object. + */ + Flags& operator &=( Flags f ) + { + m_flags &= f.m_flags; + return *this; + } + + /*! + * Performs a bitwise AND operation with an enumerated flag value \a e and + * stores the resulting flags in this object. Returns a reference to this + * object. + */ + Flags& operator &=( enum_type e ) + { + m_flags &= unsigned( e ); + return *this; + } + + /*! + * Performs a bitwise AND operation with a mask value \a m and stores the + * resulting flags in this object. Returns a reference to this object. + */ + Flags& operator &=( unsigned m ) + { + m_flags &= m; + return *this; + } + + /*! + * Performs a bitwise inclusive OR operation with other flags \a f and + * stores the resulting flags in this object. Returns a reference to this + * object. + */ + Flags& operator |=( Flags f ) + { + m_flags |= f.m_flags; + return *this; + } + + /*! + * Performs a bitwise inclusive OR operation with an enumerated flag value + * \a e and stores the resulting flags in this object. Returns a reference + * to this object. + */ + Flags& operator |=( enum_type e ) + { + m_flags |= unsigned( e ); + return *this; + } + + /*! + * Performs a bitwise inclusive OR operation with a mask value \a m and + * stores the resulting flags in this object. Returns a reference to this + * object. + */ + Flags& operator |=( unsigned m ) + { + m_flags |= m; + return *this; + } + + /*! + * Performs a bitwise exclusive OR (XOR) operation with other flags \a f and + * stores the resulting flags in this object. Returns a reference to this + * object. + */ + Flags& operator ^=( Flags f ) + { + m_flags ^= f.m_flags; + return *this; + } + + /*! + * Performs a bitwise exclusive OR (XOR) operation with an enumerated flag + * value \a e and stores the resulting flags in this object. Returns a + * reference to this object. + */ + Flags& operator ^=( enum_type e ) + { + m_flags ^= unsigned( e ); + return *this; + } + + /*! + * Performs a bitwise exclusive OR (XOR) operation with a mask value \a m + * and stores the resulting flags in this object. Returns a reference to + * this object. + */ + Flags& operator ^=( unsigned m ) + { + m_flags ^= m; + return *this; + } + + /*! + * Returns true iff the specified flag \a e is set in this %Flags object. + */ + constexpr bool IsFlagSet( enum_type e ) const + { + return (m_flags & e) != flag_type( 0 ); + } + + /*! + * Sets or clears the specified flag \a e in this %Flags object. + */ + void SetFlag( enum_type e, bool on = true ) + { + if ( on ) + m_flags |= e; + else + m_flags &= ~e; + } + + /*! + * Clears the specified flag \a e. + * This is a convenience member function, equivalent to SetFlag( e, false ). + */ + void ClearFlag( enum_type e ) + { + SetFlag( e, false ); + } + + /*! + * Clears all flags in this object. + */ + void Clear() + { + m_flags = flag_type( 0 ); + } + + /*! + * Sets the specified flag \a e in this object. Returns a reference to this + * object. + */ + Flags& operator <<( enum_type e ) + { + SetFlag( e ); + return *this; + } + + /*! + * Returns true iff all flags in this object are zero. + */ + constexpr bool operator !() const + { + return m_flags == flag_type( 0 ); + } + + /*! + * Converts this %Flags object to an integer. + */ + constexpr operator flag_type() const + { + return m_flags; + } + + /*! + * Returns a %Flags object whose value is the bitwise negation of the flags + * stored in this object. + */ + constexpr Flags operator ~() const + { + return Flags( enum_type( ~m_flags ) ); + } + + /*! + * Bitwise AND between two %Flags objects. + */ + constexpr Flags operator &( Flags f ) const + { + return Flags( enum_type( m_flags & f.m_flags ) ); + } + + /*! + * Bitwise AND between a Flags object and an enumerated value. + */ + constexpr Flags operator &( enum_type e ) const + { + return Flags( enum_type( m_flags & flag_type( e ) ) ); + } + + /*! + * Bitwise AND between a %Flags object and a mask. + */ + constexpr Flags operator &( unsigned m ) const + { + return Flags( enum_type( m_flags & m ) ); + } + + /*! + * Bitwise OR between two %Flags objects. + */ + constexpr Flags operator |( Flags f ) const + { + return Flags( enum_type( m_flags | f.m_flags ) ); + } + + /*! + * Bitwise OR between a Flags object and an enumerated value. + */ + constexpr Flags operator |( enum_type e ) const + { + return Flags( enum_type( m_flags | flag_type( e ) ) ); + } + + /*! + * Bitwise OR between a %Flags object and a mask. + */ + constexpr Flags operator |( unsigned m ) const + { + return Flags( enum_type( m_flags | m ) ); + } + + /*! + * Bitwise XOR between two %Flags objects. + */ + constexpr Flags operator ^( Flags f ) const + { + return Flags( enum_type( m_flags ^ f.m_flags ) ); + } + + /*! + * Bitwise XOR between a Flags object and an enumerated value. + */ + constexpr Flags operator ^( enum_type e ) const + { + return Flags( enum_type( m_flags ^ flag_type( e ) ) ); + } + + /*! + * Bitwise XOR between a %Flags object and a mask. + */ + constexpr Flags operator ^( unsigned m ) const + { + return Flags( enum_type( m_flags ^ m ) ); + } + +private: + + flag_type m_flags = flag_type( 0 ); + +#ifndef __PCL_NO_FLAGS_SETTINGS_IO + friend class Settings; +#endif + +#ifndef __PCL_NO_FLAGS_FILE_IO + friend class File; +#endif + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + friend class pi::GlobalSettings; +#endif +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Flags_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Flags.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Font.h b/3rdparty/include/pcl/Font.h new file mode 100644 index 0000000..c262765 --- /dev/null +++ b/3rdparty/include/pcl/Font.h @@ -0,0 +1,547 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Font.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Font_h +#define __PCL_Font_h + +/// \file pcl/Font.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FontFamily + * \brief Platform-independent, standard font families + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FontFamily::Default Default font
FontFamily::SansSerif Sans serif font: Helvetica, Swiss, Arial
FontFamily::Helvetica Equivalent to SansSerif
FontFamily::Swiss Equivalent to SansSerif
FontFamily::Serif Serif font: Times, Garamond
FontFamily::Times Equivalent to Serif
FontFamily::Script Handwriting font: Script, Comic
FontFamily::Monospace Fixed-pitch font: Courier, Vera Sans Mono
FontFamily::TypeWriter Equivalent to Monospace
FontFamily::Courier Equivalent to Monospace
FontFamily::Teletype Equivalent to Monospace
FontFamily::Decorative Decorative font: OldEnglish
FontFamily::OldEnglish Equivalent to Decorative
FontFamily::Symbol Math, greek, etc: Symbol
+ */ +namespace FontFamily +{ + enum value_type + { + Default, // default font + SansSerif, // sans serif font: Helvetica, Swiss, Arial + Helvetica = SansSerif, + Swiss = SansSerif, + Serif, // serif font: Times, Garamond + Times = Serif, + Script, // handwriting font: Script, Comic + Monospace, // fixed-pitch font: Courier, Vera Sans Mono + TypeWriter = Monospace, + Courier = Monospace, + Teletype = Monospace, + Decorative, // decorative font: OldEnglish, + OldEnglish = Decorative, + Symbol // math, greek, etc.: Symbol + }; + + String PCL_FUNC FamilyToFace( value_type family ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FontWeight + * \brief Standard font weights + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FontWeight::Thin 100
FontWeight::ExtraLight 200
FontWeight::UltraLight = ExtraLight
FontWeight::Light 300
FontWeight::Normal 400
FontWeight::Regular = Normal
FontWeight::Medium 500
FontWeight::SemiBold 600
FontWeight::DemiBold = SemiBold
FontWeight::Bold 700
FontWeight::ExtraBold 800
FontWeight::UltraBold = ExtraBold
FontWeight::Heavy 850
FontWeight::Black 900
+ */ +namespace FontWeight +{ + enum value_type + { + Thin = 100, + ExtraLight = 200, + UltraLight = ExtraLight, + Light = 300, + Normal = 400, + Regular = Normal, + Medium = 500, + SemiBold = 600, + DemiBold = SemiBold, + Bold = 700, + ExtraBold = 800, + UltraBold = ExtraBold, + Heavy = 850, + Black = 900 + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FontStretch + * \brief Standard font stretchs + * + * + * + * + * + * + * + * + * + * + * + *
FontStretch::UltraCondensed 50
FontStretch::ExtraCondensed 62
FontStretch::Condensed 75
FontStretch::SemiCondensed 87
FontStretch::Unstretched 100
FontStretch::SemiExpanded 112
FontStretch::Expanded 125
FontStretch::ExtraExpanded 150
FontStretch::UltraExpanded 200
+ */ +namespace FontStretch +{ + enum value_type + { + UltraCondensed = 50, + ExtraCondensed = 62, + Condensed = 75, + SemiCondensed = 87, + Unstretched = 100, + SemiExpanded = 112, + Expanded = 125, + ExtraExpanded = 150, + UltraExpanded = 200 + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class Font + * \brief Client-side interface to a PixInsight %Font object + * + * ### TODO: Write a detailed description for %Font. + */ +class PCL_CLASS Font : public UIObject +{ +public: + + /*! + * Represents a standard font family. + */ + typedef FontFamily::value_type family; + + /*! + * Represents a standard font weight. + */ + typedef FontWeight::value_type std_weight; + + /*! + * Represents a standard font stretch. + */ + typedef FontStretch::value_type std_stretch; + + /*! + * Constructs a %Font object with the specified family and \a size in + * points. + * + * ### TODO: Elaborate on font families, font matching, etc. + */ + Font( family f = FontFamily::Default, double size = 12.0 ); + + /*! + * Constructs a %Font object with the specified font \a face and \a size + * in points. + * + * ### TODO: Elaborate on font faces, font matching, etc. + */ + Font( const String& face, double size = 12.0 ); + + /*! + * Copy constructor. This object will reference the same server-side font + * as the specified instance \a f. + */ + Font( const Font& f ) : UIObject( f ) + { + } + + /*! + * Move constructor. + */ + Font( Font&& x ) : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a %Font object. If this object references an existing font in + * the PixInsight core application, its reference count is decremented. If + * it becomes unreferenced, it will be garbage-collected. + */ + virtual ~Font() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side font as the specified + * instance \a f. If the previous font becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + Font& operator =( const Font& f ) + { + SetHandle( f.handle ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Font& operator =( Font&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null font. A null %Font object does not + * correspond to an existing font object in the PixInsight core application. + */ + static Font& Null(); + + /*! # + */ + String Face() const; + + /*! # + */ + void SetFace( const String& ); + + /*! # + */ + bool IsExactMatch() const; + + /*! # + */ + StringList AvailableWritingSystems() const + { + return AvailableFontWritingSystems( Face() ); + } + + /*! # + */ + StringList AvailableStyles() const + { + return AvailableFontStyles( Face() ); + } + + /*! # + */ + bool IsScalable( const String& style = String() ) const + { + return IsScalableFont( Face(), style ); + } + + /*! # + */ + Array OptimalPointSizes( const String& style = String() ) const + { + return OptimalFontPointSizes( Face(), style ); + } + + /*! # + */ + int PixelSize() const; + + /*! # + */ + void SetPixelSize ( int ); + + /*! # + */ + double PointSize() const; + + /*! # + */ + void SetPointSize( double ); + + /*! # + */ + bool IsFixedPitch() const; + + /*! # + */ + bool IsFixedPitch( const String& style ) const + { + return IsFixedPitchFont( Face(), style ); + } + + /*! # + */ + void SetFixedPitch( bool = true ); + + /*! # + */ + bool IsKerningEnabled() const; + + /*! # + */ + void EnableKerning( bool = true ); + + /*! # + */ + void DisableKerning( bool = true ); + + /*! # + */ + int StretchFactor() const; + + /*! # + */ + void SetStretchFactor( int ); + + /*! # + */ + int Weight() const; + + /*! # + */ + int Weight( const String& style ) const + { + return FontWeight( Face(), style ); + } + + /*! # + */ + void SetWeight( int ); + + /*! # + */ + bool IsBold() const + { + return Weight() >= FontWeight::Bold; + } + + /*! # + */ + void SetBold( bool b = true ) + { + SetWeight( b ? FontWeight::Bold : FontWeight::Normal ); + } + + /*! # + */ + bool IsItalic() const; + + /*! # + */ + bool IsItalic( const String& style ) const + { + return IsItalicFont( Face(), style ); + } + + /*! # + */ + void SetItalic( bool = true ); + + /*! # + */ + bool IsUnderline() const; + + /*! # + */ + void SetUnderline( bool = true ); + + /*! # + */ + bool IsOverline() const; + + /*! # + */ + void SetOverline( bool = true ); + + /*! # + */ + bool IsStrikeOut() const; + + /*! # + */ + void SetStrikeOut( bool = true ); + + /*! # + */ + int Ascent() const; + + /*! # + */ + int Descent() const; + + /*! # + */ + int Height() const; + + /*! # + */ + int LineSpacing() const; + + /*! # + */ + bool IsCharDefined( int ) const; + + /*! # + */ + int MaxWidth() const; + + /*! # + */ + int Width( const String& ) const; + + /*! # + */ + int Width( int ch ) const; + + /*! # + */ + Rect BoundingRect( const String& ) const; + + /*! # + */ + Rect TightBoundingRect( const String& ) const; + + /*! # + */ + static StringList AvailableFonts( const String& writingSystem = String() ); + + /*! # + */ + static StringList AvailableFontWritingSystems( const String& font ); + + /*! # + */ + static StringList AvailableFontStyles( const String& font ); + + /*! # + */ + static Array OptimalFontPointSizes( const String& font, const String& style = String() ); + + /*! # + */ + static bool IsScalableFont( const String& font, const String& style = String() ); + + /*! # + */ + static bool IsFixedPitchFont( const String& font, const String& style = String() ); + + /*! # + */ + static bool IsItalicFont( const String& font, const String& style = String() ); + + /*! # + */ + static int FontWeight( const String& font, const String& style = String() ); + +private: + + Font( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class InternalFontEnumerator; + friend class GraphicsContextBase; + friend class Control; + friend class TreeBox; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Font_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Font.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FontComboBox.h b/3rdparty/include/pcl/FontComboBox.h new file mode 100644 index 0000000..533df9a --- /dev/null +++ b/3rdparty/include/pcl/FontComboBox.h @@ -0,0 +1,393 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FontComboBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FontComboBox_h +#define __PCL_FontComboBox_h + +/// \file pcl/FontComboBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class FontComboBox + * \brief A %ComboBox descendant class to select font faces. + * + * %FontComboBox is a utility class that provides a simple list with all the + * installed fonts on the system, plus the set of standard font + * families - see the FontFamily namespace for the supported set of + * standard font families in the PixInsight/PCL platform. + * + * Optionally, %FontComboBox can restrict the list of font items to include + * only scalable, bitmapped or fixed-pitch fonts. The fonts list can also be + * restricted as a function of the available writing systems (Latin, Greek, + * Cyrillic, and so on). + * + * \sa Font, ComboBox, FontFamily + */ +class PCL_CLASS FontComboBox : public ComboBox +{ +public: + + /*! + * Constructs a %FontComboBox as a child control of \a parent. + * + * A default set of %ComboBox items is created for the full set of fonts + * currently installed on the system. + */ + FontComboBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %FontComboBox control. + */ + virtual ~FontComboBox() + { + } + + /*! + * Returns the face name of the font that corresponds to the currently + * selected %ComboBox item, or an empty string if no item is currently + * selected. + * + * \sa CurrentFont(), SetCurrentFont( const String& ), + * SetCurrentFont( const Font& ) + */ + String CurrentFontFace() const; + + /*! + * Returns a Font object that corresponds to the currently selected + * %ComboBox item, or a null font object (Font::Null()) if no item is + * currently selected. + * + * \param size The size in points of the returned font. + * + * This is a convenience member function, equivalent to: + * Font( CurrentFontFace(), size ). + * + * \sa CurrentFontFace(), SetCurrentFont( const String& ), + * SetCurrentFont( const Font& ) + */ + pcl::Font CurrentFont( double size = 12.0 ) const + { + return pcl::Font( CurrentFontFace(), size ); + } + + /*! + * Selects the %ComboBox item corresponding to the specified font \a face. + * + * If the specified \a face doesn't correspond to an installed or standard + * font family, or if an empty string is specified, this member function + * leaves the %ComboBox control with no selection, i.e. with its selected + * index equal to -1. + * + * \sa SetCurrentFont( const Font& ), CurrentFont(), CurrentFontFace() + */ + void SetCurrentFont( const String& face ); + + /*! + * Selects the %ComboBox item corresponding to the specified \a font. + * + * If the specified \a font doesn't correspond to an installed or standard + * font family, or if \a font is Font::Null(), this member function leaves + * the %ComboBox control with no selection, i.e. with its selected index + * equal to -1. + * + * This is a convenience member function, equivalent to: + * SetCurrentFont( font.Face() ). + * + * \sa SetCurrentFont( const String& ), CurrentFont(), CurrentFontFace() + */ + void SetCurrentFont( const pcl::Font& font ) + { + SetCurrentFont( font.Face() ); + } + + /*! + * Resets this %FontComboBox control to its default state: Replaces the + * current list of %ComboBox items with a new set corresponding to the + * standard font families available on the PixInsight/PCL platform, plus all + * installed fonts on the system. + * + * \sa AddStandardFontFamilies(), AddScalableFonts(), AddFixedPitchFonts(), + * AddItalicFonts(), AddWritingSystem() + */ + void ResetFonts(); + + /*! + * Adds a list of %ComboBox items corresponding to the standard font + * families available on the PixInsight/PCL platform. This includes the + * following fonts: Default, SansSerif, Serif, Script, Monospace, + * Decorative, and Symbol. + * + * \note The list of standard font families is always prepended at the + * beginning of the existing set of items. + * + * \sa RemoveStandardFontFamilies() + */ + void AddStandardFontFamilies(); + + /*! + * Removes all existing %ComboBox items that correspond to standard font + * families available on the PixInsight/PCL platform. See + * AddStandardFontFamilies() for more information. + * + * \sa AddStandardFontFamilies() + */ + void RemoveStandardFontFamilies(); + + /*! + * Adds a list of %ComboBox items corresponding to all scalable fonts + * currently installed on the system. + * + * \sa RemoveScalableFonts() + */ + void AddScalableFonts(); + + /*! + * Removes all existing %ComboBox items that correspond to scalable fonts. + * + * \sa AddScalableFonts() + */ + void RemoveScalableFonts(); + + /*! + * Adds a list of %ComboBox items corresponding to all fixed-pitch fonts + * currently installed on the system. + * + * \sa RemoveFixedPitchFonts() + */ + void AddFixedPitchFonts(); + + /*! + * Removes all existing %ComboBox items that correspond to fixed-pitch + * fonts. + * + * \sa AddFixedPitchFonts() + */ + void RemoveFixedPitchFonts(); + + /*! + * Adds a list of %ComboBox items corresponding to all italic fonts + * currently installed on the system. + * + * \sa RemoveItalicFonts() + */ + void AddItalicFonts(); + + /*! + * Removes all existing %ComboBox items that correspond to italic fonts. + * + * \sa AddItalicFonts() + */ + void RemoveItalicFonts(); + + /*! + * Adds a list of %ComboBox items corresponding to all installed fonts that + * support the specified writing system. + * + * \sa RemoveWritingSystem() + */ + void AddWritingSystem( const String& writingSystem ); + + /*! + * Removes all existing %ComboBox items that correspond to installed fonts + * supporting the specified writing system. + * + * \sa AddWritingSystem() + */ + void RemoveWritingSystem( const String& writingSystem ); + + /*! + * Adds items for all installed fonts that support the Latin writing system. + * + * This is a convenience member function, equivalent to: + * AddWritingSystem( "Latin" ). + * + * \sa RemoveLatinFonts(), AddGreekFonts() + */ + void AddLatinFonts() + { + AddWritingSystem( "Latin" ); + } + + /*! + * Removes all existing %ComboBox items that correspond to installed fonts + * supporting the Latin writing system. + * + * \sa AddLatinFonts(), RemoveGreekFonts() + */ + void RemoveLatinFonts() + { + RemoveWritingSystem( "Latin" ); + } + + /*! + * Adds items for all installed fonts that support the Greek writing system. + * + * This is a convenience member function, equivalent to: + * AddWritingSystem( "Greek" ). + * + * \sa RemoveGreekFonts(), AddLatinFonts() + */ + void AddGreekFonts() + { + AddWritingSystem( "Greek" ); + } + + /*! + * Removes all existing %ComboBox items that correspond to installed fonts + * supporting the Greek writing system. + * + * \sa AddGreekFonts(), RemoveLatinFonts() + */ + void RemoveGreekFonts() + { + RemoveWritingSystem( "Greek" ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnFontSelected( FontComboBox& sender, const String& font ); + // void OnFontHighlighted( FontComboBox& sender, const String& font ); + + /*! + * \defgroup fontcombobox_event_handlers FontComboBox Event Handlers + */ + + /*! + * Defines the prototype of a font combo box event handler. + * + * A font combo box event is generated when an item is selected or + * highlighted in a font combo box. + * + * \param sender The %FontComboBox control that sends a font combo box + * event. + * + * \param font The face name of the font that has been selected or + * highlighted in the \a sender font combo box. + * + * \ingroup fontcombobox_event_handlers + */ + typedef void (Control::*font_event_handler)( FontComboBox& sender, const String& font ); + + /*! + * Sets the font selected event handler for this font combo box. + * + * \param handler The font combo box event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever a font is selected in this + * font combo box control. + * + * \param receiver The control that will receive font selected + * events from this font combo box. + * + * \ingroup fontcombobox_event_handlers + */ + void OnFontSelected( font_event_handler handler, Control& receiver ); + + /*! + * Sets the font highlighted event handler for this font combo + * box control. + * + * \param handler The font combo box event handler. Must be a member + * function of the receiver object's class. This handler + * will be called whenever a font is highlighted in this + * font combo box control. + * + * \param receiver The control that will receive font + * highlighted events from this font combo box. + * + * \ingroup fontcombobox_event_handlers + */ + void OnFontHighlighted( font_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + font_event_handler onFontSelected = nullptr; + Control* onFontSelectedReceiver = nullptr; + + font_event_handler onFontHighlighted = nullptr; + Control* onFontHighlightedReceiver = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + void ItemSelected( ComboBox&, int ); + void ItemHighlighted( ComboBox&, int ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_FontComboBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FontComboBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/FourierTransform.h b/3rdparty/include/pcl/FourierTransform.h new file mode 100644 index 0000000..0e902e7 --- /dev/null +++ b/3rdparty/include/pcl/FourierTransform.h @@ -0,0 +1,386 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/FourierTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_FourierTransform_h +#define __PCL_FourierTransform_h + +/// \file pcl/FourierTransform.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FFTDirection + * \brief Defines directions and types of fast Fourier transforms. + * + * + * + * + *
FFTDirection::Forward Fourier transform
FFTDirection::Backward Inverse Fourier transform
+ */ +namespace FFTDirection +{ + enum value_type + { + Forward, + Backward + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class InPlaceFourierTransform + * \brief In-place discrete Fourier transform of two-dimensional complex images. + * + * %InPlaceFourierTransform performs in-place, discrete Fourier transforms of + * complex-sampled two-dimensional images using fast Fourier transform + * algorithms. + * + * %InPlaceFourierTransform can only be applied to 32-bit and 64-bit floating + * point complex images: either ComplexImage or DComplexImage. + * + * \note \b Important - For performance reasons, %InPlaceFourierTransform can + * change the dimensions of a transformed image (width and/or height in pixels) + * to their nearest optimized %FFT lengths. This may involve reallocation of + * pixel data. If the transformed image already has optimized dimensions, no + * size change or reallocation occurs. See the GenericFFT::GenericFFT( int ) + * constructor for details on optimized %FFT lengths. + * + * \sa FourierTransform + */ +class PCL_CLASS InPlaceFourierTransform : public ImageTransformation, public ParallelProcess +{ +public: + + /*! + * Represents a %FFT direction and type. + */ + typedef FFTDirection::value_type transform_type; + + /*! + * Constructs an %InPlaceFourierTransform instance. + * + * \param type Transform direction and type. This parameter can have one of + * the following values:\n + * \n + * + * + * + * + * + *
FFTDirection::ForwardFourier transform. This is the default value.
FFTDirection::BackwardInverse Fourier transform
+ */ + InPlaceFourierTransform( transform_type type = FFTDirection::Forward ) + : m_type( type ) + { + } + + /*! + * Copy constructor. + */ + InPlaceFourierTransform( const InPlaceFourierTransform& ) = default; + + /*! + * Destroys this %InPlaceFourierTransform object. + */ + virtual ~InPlaceFourierTransform() + { + } + + /*! + * Returns the type and direction of this Fourier transform. See the + * FFTDirection namespace for possible values. + */ + transform_type Type() const + { + return m_type; + } + +protected: + + transform_type m_type; + + // In-place FFT of complex images. + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class InPlaceInverseFourierTransform + * \brief In-place discrete inverse Fourier transform of two-dimensional complex images. + * + * %InPlaceInverseFourierTransform performs in-place, inverse discrete Fourier + * transforms of complex-sampled two-dimensional images using fast Fourier + * transform algorithms. + * + * This is a convenience class derived from InPlaceFourierTransform. It + * implements exactly the same functions as its parent class, but performs + * inverse Fourier transforms by default. + * + * \sa InPlaceFourierTransform + */ +class PCL_CLASS InPlaceInverseFourierTransform : public InPlaceFourierTransform +{ +public: + + /*! + * Constructs an %InPlaceInverseFourierTransform instance. + */ + InPlaceInverseFourierTransform() + : InPlaceFourierTransform( FFTDirection::Backward ) + { + } + + /*! + * Copy constructor. + */ + InPlaceInverseFourierTransform( const InPlaceInverseFourierTransform& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~InPlaceInverseFourierTransform() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class FourierTransform + * \brief Out-of-place discrete Fourier transform of two-dimensional images. + * + * %FourierTransform performs out-of-place, discrete Fourier transforms of + * complex and real two-dimensional images, using fast Fourier transform + * algorithms. + * + * %FourierTransform stores a Fourier transform as either a ComplexImage + * (32-bit floating point) or a DComplexImage (64-bit floating point). The + * transform image is transported by an ImageVariant object. 64-bit transforms + * are created for 64-bit floating point (both real and complex) and 32-bit + * integer (real) images. For the rest of images a 32-bit transform is used. + * + * \sa InPlaceFourierTransform + */ +class PCL_CLASS FourierTransform : public BidirectionalImageTransformation, public ParallelProcess +{ +public: + + /*! + * Default constructor. + * + * Creates a %FourierTransform object with an empty Fourier transform. + */ + FourierTransform() = default; + + /*! + * Copy constructor. + * + * This constructor copies the Fourier transform in the specified source + * object. The Fourier transform is an ImageVariant object. This constructor + * creates an %ImageVariant that references the same image as the source + * object. + */ + FourierTransform( const FourierTransform& ) = default; + + /*! + * Move constructor. + */ + FourierTransform( FourierTransform&& ) = default; + + /*! + * Destroys this %FourierTransform object. + * + * The current Fourier transform, if it exists, is automatically released. + * The Fourier transform is implemented as an ImageVariant object. If there + * are no external references to the image transported by the %ImageVariant, + * then it is also destroyed and deallocated. + */ + virtual ~FourierTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * This operator copies the Fourier transform in the source object. The + * Fourier transform is an ImageVariant object. This operator causes the + * %ImageVariant in this object to reference the same image as the source + * object. If this object already stores a Fourier transform, it is released + * before assignment. + */ + FourierTransform& operator =( const FourierTransform& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + FourierTransform& operator =( FourierTransform&& ) = default; + + /*! + * Returns a constant reference to the Fourier transform in this + * %FourierTransform object. + * + * The Fourier transform is an ImageVariant object. It can transport either + * a 32-bit (float) or 64-bit (double) complex image, that is, either a + * ComplexImage or a DComplexImage, depending on the sample type of the + * transformed image. + */ + const ImageVariant& DFT() const + { + return m_dft; + } + + /*! + * Returns a reference to the Fourier transform in this %FourierTransform + * object. + * + * The Fourier transform is an ImageVariant object. It can transport either + * a 32-bit (float) or 64-bit (double) complex image, that is, either a + * ComplexImage or a DComplexImage, depending on the sample type of the + * transformed image. + */ + ImageVariant& DFT() + { + return m_dft; + } + + /*! + * A synonym for DFT() const. + */ + const ImageVariant& operator *() const + { + return DFT(); + } + + /*! + * A synonym for DFT(). + */ + ImageVariant& operator *() + { + return DFT(); + } + + /*! + * Transfers ownership of the current Fourier transform to the caller. + * + * Returns a copy of the ImageVariant object that transports the current + * Fourier transform in this object. Then the internal ImageVariant of this + * object is released. The transform itself, which is either a ComplexImage + * or a DComplexImage, will not be destroyed, as the newly created + * %ImageVariant will transport and reference it. + * + * If this object stores no Fourier transform, the returned %ImageVariant + * will be empty (no image transported). + */ + ImageVariant ReleaseTransform() + { + ImageVariant r; + m_dft.ReleaseTo( r ); + return r; + } + + /*! + * Releases the current Fourier transform, if exists. + * + * If there are no external references to the image transported by the + * internal ImageVariant object, then the transform matrix, which is either + * a ComplexImage or a DComplexImage object, is destroyed. + */ + void Clear() + { + m_dft.Free(); + } + +protected: + + // Discrete 2-D Fourier Transform + ImageVariant m_dft; + + // Transform + void Transform( const pcl::Image& ) override; + void Transform( const pcl::DImage& ) override; + void Transform( const pcl::ComplexImage& ) override; + void Transform( const pcl::DComplexImage& ) override; + void Transform( const pcl::UInt8Image& ) override; + void Transform( const pcl::UInt16Image& ) override; + void Transform( const pcl::UInt32Image& ) override; + + // Inverse transform + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_FourierTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/FourierTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Frame.h b/3rdparty/include/pcl/Frame.h new file mode 100644 index 0000000..aa51538 --- /dev/null +++ b/3rdparty/include/pcl/Frame.h @@ -0,0 +1,195 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Frame.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Frame_h +#define __PCL_Frame_h + +/// \file pcl/Frame.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FrameStyle + * \brief Frame styles + * + * + * + * + * + * + * + *
FrameStyle::Flat No frame is drawn
FrameStyle::Box Simple rectangular frame
FrameStyle::Raised Raised 3-D panel
FrameStyle::Sunken Sunken (lowered) 3-D panel
FrameStyle::Styled The appearance depends on the current platform and GUI style
+ */ +namespace FrameStyle +{ + enum value_type + { + Flat, // No frame is drawn + Box, // Simple rectangular frame + Raised, // Raised 3-D panel + Sunken, // Sunken (lowered) 3-D panel + Styled // The appearance depends on the current platform and GUI style + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class Frame + * \brief Client-side interface to a PixInsight %Frame control + * + * ### TODO: Write a detailed description for %Frame. + */ +class PCL_CLASS Frame : public Control +{ +public: + + /*! + * Represents a frame style. + */ + typedef FrameStyle::value_type style; + + /*! + * Constructs a %Frame as a child control of \a parent. + */ + Frame( Control& parent = Control::Null() ); + + /*! + * Destroys a %Frame object. + */ + virtual ~Frame() + { + } + + /*! + * Returns the current frame style. + */ + style Style() const; + + /*! + * Sets the frame style. + */ + void SetStyle( style ); + + /*! + * Returns the current frame's line width in pixels. + */ + int LineWidth() const; + + /*! + * Sets the frame's line width in pixels. + */ + void SetLineWidth( int ); + + /*! + * Returns the border width of this frame. + * + * The border width is the distance in pixels from the outer frame rectangle + * to the inner client rectangle. + */ + int BorderWidth() const; + + /*! # + */ + int ScaledLineWidth() const + { + return PhysicalPixelsToLogical( LineWidth() ); + } + + /*! # + */ + void SetScaledLineWidth( int width ) + { + SetLineWidth( LogicalPixelsToPhysical( width ) ); + } + + /*! # + */ + int ScaledBorderWidth() const + { + return PhysicalPixelsToLogical( BorderWidth() ); + } + +protected: + + /*! + * \internal + */ + Frame( void* h ) : Control( h ) + { + } +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Frame_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Frame.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GaiaDatabaseFile.h b/3rdparty/include/pcl/GaiaDatabaseFile.h new file mode 100644 index 0000000..532686e --- /dev/null +++ b/3rdparty/include/pcl/GaiaDatabaseFile.h @@ -0,0 +1,483 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GaiaDatabaseFile.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GaiaDatabaseFile_h +#define __PCL_GaiaDatabaseFile_h + +/// \file pcl/GaiaDatabaseFile.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::GaiaStarFlag + * \brief Data availability and quality flags for Gaia star data. + * + * + * + * + * + * + + * + * + * + * + * + * + + * + * + * + * + * + * + + * + * + * + * + * + * + + * + * + * + * + + * + * + * + * + + * + * + * + * + + * + * + + *
GaiaStarFlag::NoPM No proper motions and parallax available.
GaiaStarFlag::NoGBPMag No G-BP magnitude available.
GaiaStarFlag::NoGRPMag No G-RP magnitude available.
GaiaStarFlag::LackingData Equivalent to NoPM|NoGBPMag|NoGRPMag.
GaiaStarFlag::GoldRA Standard error of right ascension < 0.13 mas.
GaiaStarFlag::GoldDec Standard error of declination < 0.12 mas.
GaiaStarFlag::GoldParx Standard error of parallax < 0.13 mas.
GaiaStarFlag::GoldPMRA Standard error of proper motion in right ascension < 0.14 mas/year.
GaiaStarFlag::GoldPMDec Standard error of proper motion in declination < 0.12 mas/year.
GaiaStarFlag::GoldAstrometry Equivalent to GoldRA|GoldDec|GoldParx|GoldPMRA|GoldPMDec.
GaiaStarFlag::SilverRA Standard error of right ascension in the range [0.13,1.43) mas.
GaiaStarFlag::SilverDec Standard error of declination in the range [0.12,1.28) mas.
GaiaStarFlag::SilverParx Standard error of parallax in the range [0.13,0.86) mas.
GaiaStarFlag::SilverPMRA Standard error of proper motion in right ascension in the range [0.14,0.97) mas/year.
GaiaStarFlag::SilverPMDec Standard error of proper motion in declination in the range [0.12,0.85) mas/year.
GaiaStarFlag::SilverAstrometry Equivalent to SilverRA|SilverDec|SilverParx|SilverPMRA|SilverPMDec.
GaiaStarFlag::BronzeRA Standard error of right ascension in the range [1.43,2.49) mas.
GaiaStarFlag::BronzeDec Standard error of declination in the range [1.28,2.22) mas.
GaiaStarFlag::BronzeParx Standard error of parallax in the range [0.86,1.38) mas.
GaiaStarFlag::BronzePMRA Standard error of proper motion in right ascension in the range [0.97,1.58) mas/year.
GaiaStarFlag::BronzePMDec Standard error of proper motion in declination in the range [0.85,1.38) mas/year.
GaiaStarFlag::BronzeAstrometry Equivalent to BronzeRA|BronzeDec|BronzeParx|BronzePMRA|BronzePMDec.
GaiaStarFlag::GoldGMag Error on G-band mean flux < 0.84 e-/s.
GaiaStarFlag::GoldGBPMag Error on the integrated BP mean flux < 4.94 e-/s.
GaiaStarFlag::GoldGRPMag Error on the integrated RP mean flux < 5.89 e-/s.
GaiaStarFlag::GoldPhotometry Equivalent to GoldGMag|GoldGBPMag|GoldGRPMag.
GaiaStarFlag::SilverGMag Error on G-band mean flux in the range [0.84,2.13) e-/s.
GaiaStarFlag::SilverGBPMag Error on the integrated BP mean flux in the range [4.94,12.61) e-/s.
GaiaStarFlag::SilverGRPMag Error on the integrated RP mean flux in the range [5.89,15.40) e-/s.
GaiaStarFlag::SilverPhotometry Equivalent to SilverGMag|SilverGBPMag|SilverGRPMag.
GaiaStarFlag::BronzeGMag Error on G-band mean flux in the range [2.13,3.08) e-/s.
GaiaStarFlag::BronzeGBPMag Error on the integrated BP mean flux in the range [12.61,18.04) e-/s.
GaiaStarFlag::BronzeGRPMag Error on the integrated RP mean flux in the range [15.40,22.35) e-/s.
GaiaStarFlag::BronzePhotometry Equivalent to BronzeGMag|BronzeGBPMag|BronzeGRPMag.
GaiaStarFlag::BPRPExcess BP-RP excess factor ≥ 2.0
GaiaStarFlag::BPRPExcessHigh BP-RP excess factor ≥ 5.0 (Gaia EDR3 only)
+ * + * The above data quality ranges correspond to the Gaia EDR3 XPSD database + * version 1.0.0, released December 4, 2020. + * + * \ingroup point_source_databases + */ +namespace GaiaStarFlag +{ + enum mask_type + { + NoPM = 0x00000001, + NoGBPMag = 0x00000002, + NoGRPMag = 0x00000004, + LackingData = 0x00000007, + + GoldRA = 0x00000010, + GoldDec = 0x00000020, + GoldPMRA = 0x00000040, + GoldPMDec = 0x00000080, + + SilverRA = 0x00000100, + SilverDec = 0x00000200, + SilverPMRA = 0x00000400, + SilverPMDec = 0x00000800, + + BronzeRA = 0x00001000, + BronzeDec = 0x00002000, + BronzePMRA = 0x00004000, + BronzePMDec = 0x00008000, + + GoldGMag = 0x00010000, + GoldGBPMag = 0x00020000, + GoldGRPMag = 0x00040000, + GoldParx = 0x00080000, + + SilverGMag = 0x00100000, + SilverGBPMag = 0x00200000, + SilverGRPMag = 0x00400000, + SilverParx = 0x00800000, + + BronzeGMag = 0x01000000, + BronzeGBPMag = 0x02000000, + BronzeGRPMag = 0x04000000, + BronzeParx = 0x08000000, + + BPRPExcess = 0x10000008, + BPRPExcessHigh = 0x20000000, + + GoldAstrometry = 0x000800F0, + SilverAstrometry = 0x00800F00, + BronzeAstrometry = 0x0800F000, + + GoldPhotometry = 0x00070000, + SilverPhotometry = 0x00700000, + BronzePhotometry = 0x07000000 + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \struct GaiaStarData + * \brief Star data structure for Gaia catalog search operations. + * + * \ingroup point_source_databases + */ +struct PCL_CLASS GaiaStarData +{ + double ra = 0; //!< Right ascension in degrees, in the range [0,360). + double dec = 0; //!< Declination in degrees, in the range [-90,+90]. + float parx = 0; //!< Parallax in mas. + float pmra = 0; //!< Proper motion in right ascension * cos(dec), in mas/year. + float pmdec = 0; //!< Proper motion in declination, in mas/year. + float magG = 0; //!< Mean G magnitude. + float magBP = 0; //!< Mean G_BP magnitude. + float magRP = 0; //!< Mean G_RP magnitude. + uint32 flags = 0u; //!< Data availability and quality flags. See the GaiaStarFlag namespace. +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct pcl::GaiaSearchData + * \brief Data items and parameters for Gaia catalog search operations. + * + * \ingroup point_source_databases + */ +typedef XPSD::SearchData GaiaSearchData; + +// ---------------------------------------------------------------------------- + +/*! + * \class GaiaDatabaseFile + * \brief Gaia catalog star database file (XPSD format). + * + * This class implements an interface to XPSD files serializing encoded Gaia + * star data. As of writing this documentation (December 2020), Gaia DR2 and + * EDR3 are supported and have been implemented. + * + * The most important functionality of this class is performing fast indexed + * search operations to retrieve point source data for Gaia stars matching a + * set of user-defined criteria. See the GaiaDatabaseFile::Search() member + * function and the GaiaSearchData structure for detailed information. + * + * This implementation provides the following data for the complete Gaia DR2 + * and EDR3 catalogs: + * + * \li Source positions. + * \li Parallaxes. + * \li Proper motions. + * \li Mean magnitudes on the G, GBP and GRP bands. + * \li Data availability and quality flags. + * + * \b References + * + * \li Gaia Data Release 2 - online resources: + * https://www.cosmos.esa.int/web/gaia/data-release-2 + * + * \li Gaia Data Release 2. Summary of the contents and survey + * properties. Gaia Collaboration, Brown, A.G.A., et al.: + * https://arxiv.org/abs/1804.09365v2 + * + * \li Gaia Data Release 2. Documentation release 1.2: + * https://gea.esac.esa.int/archive/documentation/GDR2/index.html + * + * \li Gaia Early Data Release 3 - online resources: + * https://www.cosmos.esa.int/web/gaia/early-data-release-3 + * + * \li Gaia Early Data Release 3. Summary of the contents and survey + * properties. Gaia Collaboration, A.G.A. Brown, A. Vallenari, T. Prusti, + * J.H.J. de Bruijne, et al.: + * https://www.aanda.org/articles/aa/pdf/forth/aa39657-20.pdf + * + * \li Gaia Early Data Release 3. Documentation release 1.0: + * https://gea.esac.esa.int/archive/documentation/GEDR3/index.html + * + * \b Credits + * + * This work has made use of data from the European Space Agency (ESA) mission + * Gaia (https://www.cosmos.esa.int/gaia), processed by the Gaia Data + * Processing and Analysis Consortium (DPAC, + * https://www.cosmos.esa.int/web/gaia/dpac/consortium). Funding for the DPAC + * has been provided by national institutions, in particular the institutions + * participating in the Gaia Multilateral Agreement. + * + * \sa StarDatabaseFile, APASSDatabaseFile + * \ingroup point_source_databases + */ +class PCL_CLASS GaiaDatabaseFile : public StarDatabaseFile +{ +public: + + /*! + * Default constructor. + * + * Constructs an invalid instance that cannot be used until initialized by + * calling the Open() member function. + */ + GaiaDatabaseFile() = default; + + /*! + * Constructs a &GaiaDatabaseFile instance initialized from the specified + * point source database file in XPSD format. As of writing this + * documentation (December 2020), The Gaia DR2 and EDR3 catalogs are + * available. + * + * In the event of errors or invalid data, this constructor will throw the + * appropriate Error exception. + */ + GaiaDatabaseFile( const String& filePath ) + : StarDatabaseFile( filePath ) + { + static_assert( sizeof( EncodedStarData ) == 32, "Invalid sizeof( GaiaDatabaseFile::EncodedStarData )" ); + if ( Metadata().databaseIdentifier == "GaiaEDR3" ) + m_dr = "EDR3"; + else if ( Metadata().databaseIdentifier == "GaiaDR2" ) + { + m_dr = "DR2"; + StringList tokens; + Metadata().databaseVersion.Break( tokens, '.' ); + // Make sure we reject an unsupported DR2 version older than 1.0.2 + if ( tokens.Length() < 3 || tokens[0].ToInt() < 1 || tokens[1].ToInt() < 0 || tokens[2].ToInt() < 2 ) + throw Error( "Unsupported Gaia DR2 database version '" + + Metadata().databaseVersion + "': " + filePath ); + } + else + throw Error( "Invalid or unsupported Gaia database file with unknown identifier '" + + Metadata().databaseIdentifier + "': " + filePath ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GaiaDatabaseFile& operator =( GaiaDatabaseFile&& ) = default; + + /*! + * Deleted copy constructor. %GaiaDatabaseFile instances are unique, + * hence cannot be copied. + */ + GaiaDatabaseFile( const GaiaDatabaseFile& ) = delete; + + /*! + * Deleted copy assignment operator. %GaiaDatabaseFile instances are + * unique, hence cannot be copied. + */ + GaiaDatabaseFile& operator =( const GaiaDatabaseFile& ) = delete; + + /*! + * Performs a search operation for point sources matching the specified + * criteria. + * + * This member function performs a fast indexed search for point sources in + * this database file matching the criteria defined in the specified \a data + * structure. See the GaiaSearchData structure for detailed information on + * search parameters and output data. + * + * Summarily, search criteria include: + * + * \li The region of the sky where point sources will be searched for. This + * region is defined by the equatorial coordinates of a field center and a + * field radius. + * + * \li An optional range of magnitudes. + * + * \li Optional inclusion/exclusion flags. + * + * \li An optional limit for the number of sources included in the search + * result. + * + * The result of the search operation is also returned in the specified + * \a data structure, including, among others, the following items: + * + * \li The list of point sources found. + * + * \li Instrumentation items for performance analysis, including: total + * search time, time used for I/O operations, total I/O operations, time + * used for data decoding, and time used for data decompression. + */ + void Search( GaiaSearchData& data ) const + { + ElapsedTime T; + for ( const XPSD::IndexTree& tree : m_index ) + tree.Search( data.centerRA, data.centerDec, data.radius, &data ); + data.timeTotal += T(); + } + + /*! + * Returns the name of the Gaia data release corresponding to the data + * available in this database file. As of writing this documentation + * (December 2020), this member function can return either "DR2" or "EDR3". + */ + const IsoString& DataRelease() const + { + return m_dr; + } + +private: + + IsoString m_dr; // data release, one of "DR2", "EDR3" + +#pragma pack(push, 1) + /* + * Encoded star record (32 bytes uncompressed). + */ + struct EncodedStarData + { + // Projected coordinates relative to the origin of the parent quadtree + // node, in 0.002 mas units. + uint32 dx; + uint32 dy; + // Parallax in mas units. + float parx; + // Proper motions, mas/yr. + float pmra; + float pmdec; + // Mean magnitudes in 0.001 mag units, encoded as (mag + 1.5)*1000. + uint16 magG; + uint16 magBP; + uint16 magRP; + // Right ascension correction for high declinations, in 0.01 mas units. + int16 dra; + // Data availability and quality flags. + uint32 flags; + }; +#pragma pack(pop) + + void LoadData( void* block, uint64 offset, uint32 size, void* searchData ) const override + { + ElapsedTime T; + StarDatabaseFile::LoadData( block, offset, size, searchData ); + reinterpret_cast( searchData )->timeIO += T(); + ++reinterpret_cast( searchData )->countIO; + } + + void Uncompress( ByteArray& block, uint32 uncompressedSize, void* searchData ) const override + { + ElapsedTime T; + StarDatabaseFile::Uncompress( block, uncompressedSize, searchData ); + reinterpret_cast( searchData )->timeUncompress += T(); + } + + void GetEncodedData( const ByteArray& data, const XPSD::IndexTree& tree, const XPSD::IndexNode& node, void* searchData ) const override + { + ElapsedTime T; + GaiaSearchData* search = reinterpret_cast( searchData ); + double r = Rad( search->radius ); + const EncodedStarData* S = reinterpret_cast( data.Begin() ); + int count = int( data.Size() / sizeof( EncodedStarData ) ); + int matched = 0; + for ( int i = 0; i < count; ++i, ++S ) + if ( search->requiredFlags == 0 || (S->flags & search->requiredFlags) == search->requiredFlags ) + if ( search->inclusionFlags == 0 || (S->flags & search->inclusionFlags) != 0 ) + if ( search->exclusionFlags == 0 || (S->flags & search->exclusionFlags) == 0 ) + { + float magG = 0.001*S->magG - 1.5; + if ( magG >= search->magnitudeLow ) + if ( magG <= search->magnitudeHigh ) + { + GaiaStarData star; + double x = node.x0 + double( S->dx )/3600/1000/500; + double y = node.y0 + double( S->dy )/3600/1000/500; + tree.Unproject( star.ra, star.dec, x, y ); + if ( unlikely( S->dra != 0 ) ) + { + star.ra += double( S->dra )/3600/1000/100; + if ( star.ra < 0 ) + star.ra += 360; + else if ( star.ra >= 360 ) + star.ra -= 360; + } + if ( Distance( search->centerRA, search->centerDec, star.ra, star.dec ) < r ) + { + if ( search->stars.Length() < size_type( search->sourceLimit ) ) + { + star.parx = S->parx; + star.pmra = S->pmra; + star.pmdec = S->pmdec; + star.magG = magG; + star.magBP = 0.001*S->magBP - 1.5; + star.magRP = 0.001*S->magRP - 1.5; + star.flags = S->flags; + search->stars << star; + } + else + ++search->excessCount; + ++matched; + } + } + } + + search->rejectCount += count - matched; + search->timeDecode += T(); + } + + friend class GaiaDR2DatabaseFileGenerator; + friend class GaiaEDR3DatabaseFileGenerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GaiaDatabaseFile_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GaiaDatabaseFile.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GaussianFilter.h b/3rdparty/include/pcl/GaussianFilter.h new file mode 100644 index 0000000..5c58620 --- /dev/null +++ b/3rdparty/include/pcl/GaussianFilter.h @@ -0,0 +1,498 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GaussianFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GaussianFilter_h +#define __PCL_GaussianFilter_h + +/// \file pcl/GaussianFilter.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GaussianFilter + * \brief A kernel filter implementing a discrete Gaussian distribution in two + * dimensions. + * + * A %GaussianFilter object is a specialized KernelFilter whose elements are + * calculated as a discrete representation of an elliptical Gaussian function + * centered at the origin: + * + * G(x,y) = Exp( -( x^2/(2*sx^2) + y^2/(2*sy^2) ) ) + * + * where sx and sy are the standard deviations of the Gaussian distribution on + * the horizontal and vertical axes, respectively. + * + * %GaussianFilter also supports arbitrary rotation around the origin. When the + * filter is rotated, the coordinates x, y in the equation above are replaced + * by their rotated counterparts. + * + * A %GaussianFilter instance is formally defined by the following parameters: + * + * + * + * + * + * + *
\e sigma Standard deviation of the filter distribution on the X axis (sigma > 0).
\e rho The ratio sy/sx (see equation above) of the generated filter distribution (0 <= rho <= 1).
\e theta Rotation angle of the horizontal axis in radians (0 <= theta < PI). This parameter only makes sense when rho < 1.
\e epsilon Maximum truncation error of the computed filter coefficients (eps > 0).
+ * + * \sa KernelFilter, VariableShapeFilter, MoffatFilter, LinearFilter, + * MeanFilter + */ +class PCL_CLASS GaussianFilter : public KernelFilter +{ +public: + + /*! + * Constructs an empty %GaussianFilter object with default functional + * parameters: sigma=2, epsilon=0.01, rho=1, theta=0. + */ + GaussianFilter() = default; + + /*! + * Constructs a %GaussianFilter object given the standard deviation + * \a sigma > 0 and truncation error \a epsilon > 0. Assigns an optional + * \a name to the new filter object. + */ + GaussianFilter( float sigma, float epsilon = 0.01, const String& name = String() ) + { + Initialize( sigma, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %GaussianFilter object given the standard deviation + * \a sigma > 0, truncation error \a epsilon > 0, aspect ratio + * 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in radians. + * Assigns an optional \a name to the new filter object. + */ + GaussianFilter( float sigma, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( sigma, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Constructs a %GaussianFilter object given the odd kernel size \a n >= 3 + * and truncation error \a epsilon > 0. Assigns an optional \a name to the + * new filter object. + */ + GaussianFilter( int n, float epsilon = 0.01, const String& name = String() ) + { + Initialize( n, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %GaussianFilter object given the odd kernel size \a n >= 3, + * truncation error \a epsilon > 0, aspect ratio 0 <= \a rho <= 1, and + * rotation angle 0 <= \a theta <= PI in radians. Assigns an optional + * \a name to the new filter object. + */ + GaussianFilter( int n, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( n, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Copy constructor. + */ + GaussianFilter( const GaussianFilter& ) = default; + + /*! + * Move constructor. + */ + GaussianFilter( GaussianFilter&& ) = default; + + /*! + */ + KernelFilter* Clone() const override + { + return new GaussianFilter( *this ); + } + + /*! + * Returns a separable filter equivalent to this Gaussian kernel filter. + * + * A Gaussian filter is the only circularly symmetric, two-dimensional + * separable filter. This reimplementation returns a separable filter only + * if this object represents an undistorted/unrotated Gaussian function, + * that is, when its aspect ratio is 1. Otherwise an empty SeparableFilter + * object is returned since the filter matrix is not separable. + */ + SeparableFilter AsSeparableFilter( float tolerance = __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE ) const override + { + if ( m_rho == 1 ) + { + FVector v = coefficients.RowVector( Size()>>1 ); + return SeparableFilter( v, v ); + } + return SeparableFilter(); + } + + /*! + * Returns true iff this filter is separable, + * + * A Gaussian filter is separable. As reimplemented in %GaussianFilter, this + * member function returns true for undistorted/unrotated Gaussian filters, + * that is, when this object's aspect ratio is 1. + */ + bool IsSeparable() const override + { + return m_rho == 1; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + GaussianFilter& operator =( const GaussianFilter& x ) + { + (void)KernelFilter::operator =( x ); + m_sigma = x.m_sigma; + m_epsilon = x.m_epsilon; + m_rho = x.m_rho; + m_theta = x.m_theta; + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GaussianFilter& operator =( GaussianFilter&& x ) + { + (void)KernelFilter::operator =( std::move( x ) ); + m_sigma = x.m_sigma; + m_epsilon = x.m_epsilon; + m_rho = x.m_rho; + m_theta = x.m_theta; + return *this; + } + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + */ + float SigmaX() const + { + return m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the Y + * (vertical) axis. + */ + float SigmaY() const + { + return m_rho*m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + * + * This function is an alias to SigmaX(). + */ + float Sigma() const + { + return SigmaX(); + } + + /*! + * Returns the maximum truncation error of the filter coefficients. + */ + float Truncation() const + { + return m_epsilon; + } + + /*! + * Returns the aspect ratio of the filter distribution. This is the ratio + * vertical:horizontal between filter axes in the range [0,1]. + */ + float AspectRatio() const + { + return m_rho; + } + + /*! + * Returns the rotation angle of the filter distribution. This is the + * rotation angle in radians with respect to the central pixel, in the + * range [0,+PI]. + */ + float RotationAngle() const + { + return m_theta; + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * horizontal axis of the elliptical Gaussian filter distribution. + */ + double FWHMx() const + { + return 2.3548200450309493 * m_sigma; + + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * vertical axis of the elliptical Gaussian filter distribution. + */ + double FWHMy() const + { + return m_rho * FWHMx(); + + } + + /*! + * Returns the full width at half maximum, in sigma units, for the + * horizontal axis of the elliptical Gaussian filter distribution. + * + * This function is an alias to FWHMx(). + */ + double FWHM() const + { + return FWHMx(); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0, + * truncation error \a epsilon > 0, aspect ratio 0 <= \a rho <= 1, and + * rotation angle 0 <= \a theta <= PI in radians. + */ + void Set( float sigma, float epsilon, float rho, float theta ) + { + Initialize( sigma, epsilon, rho, theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0, + * truncation error \a epsilon > 0, and aspect ratio 0 <= \a rho <= 1. Does + * not change the current rotation angle. + */ + void Set( float sigma, float epsilon, float rho ) + { + Initialize( sigma, epsilon, rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0 and + * truncation error \a epsilon > 0. Does not change the current aspect ratio + * and rotation angle. + */ + void Set( float sigma, float epsilon ) + { + Initialize( sigma, epsilon, m_rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0. + * The current coefficient truncation error, aspect ratio and rotation angle + * are not changed. + */ + void Set( float sigma ) + { + Initialize( sigma, m_epsilon, m_rho, m_theta ); + } + + /*! + * This is a convenience member function, equivalent to Set( sigma ). + */ + void SetSigma( float sigma ) + { + Set( sigma ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), epsilon ). + */ + void SetTruncation( float epsilon ) + { + Set( m_sigma, epsilon ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Truncation(), rho ). + */ + void SetAspectRatio( float rho ) + { + Set( m_sigma, m_epsilon, rho ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Truncation(), AspectRatio(), theta ). + */ + void SetRotationAngle( float theta ) + { + Set( m_sigma, m_epsilon, m_rho, theta ); + } + + /*! + * Recalculates filter coefficients for the given odd kernel size \a n >= 3. + * This routine computes the required standard deviation to sample the + * Gaussian function on a matrix of the specified size, preserving the + * current coefficient truncation, aspect ratio and rotation angle. + */ + void Resize( int n ) override + { + Initialize( n, m_epsilon, m_rho, m_theta ); + } + + /*! + * Exchanges two Gaussian filters \a x1 and \a x2. + */ + friend void Swap( GaussianFilter& x1, GaussianFilter& x2 ) + { + pcl::Swap( static_cast( x1 ), static_cast( x2 ) ); + pcl::Swap( x1.m_sigma, x2.m_sigma ); + pcl::Swap( x1.m_rho, x2.m_rho ); + pcl::Swap( x1.m_theta, x2.m_theta ); + pcl::Swap( x1.m_epsilon, x2.m_epsilon ); + } + +private: + + float m_sigma = 2; // standard deviation, horizontal axis + float m_rho = 1; // vertical:horizontal axes ratio + float m_theta = 0; // rotation angle in radians, [0,+pi] + float m_epsilon = 0.01F; // maximum truncation error in sigma units + + void Initialize( float s, float e, float r, float a ) + { + PCL_PRECONDITION( s > 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + m_sigma = Abs( s ); + m_epsilon = Abs( e ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + KernelFilter::Resize( 1 + (Max( 1, RoundInt( m_sigma * Sqrt( -2*Ln( m_epsilon ) ) ) ) << 1) ); + Rebuild(); + } + + void Initialize( int n, float e, float r, float a ) + { + PCL_PRECONDITION( n == 0 || n >= 3 && (n & 1) != 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + KernelFilter::Resize( n ); + m_epsilon = Abs( e ); + m_sigma = (Size() >> 1)/Sqrt( -2*Ln( m_epsilon ) ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + Rebuild(); + } + + void Rebuild() + { + int size = Size(); + if ( size == 0 ) + return; + + float* __restrict__ h = *coefficients; + double sx = m_sigma; + double sy = m_rho * sx; + + if ( m_theta == 0 || m_rho == 1 ) + { + double twosx2 = 2*sx*sx; + double twosy2 = 2*sy*sy; + for ( int n2 = size >> 1, dy = -n2; dy <= n2; ++dy ) + if ( dy > 0 ) + for ( int dx = 0; dx < size; ++dx, ++h ) + *h = *(h - ((dy+dy)*size)); + else + for ( int dx = -n2; dx <= n2; ++dx, ++h ) + *h = (dx > 0) ? *(h - (dx+dx)) : float( Exp( -(dx*dx/twosx2 + dy*dy/twosy2) ) ); + } + else + { + double st, ct; SinCos( double( m_theta ), st, ct ); + double sct = st*ct; + double st2 = st*st; + double ct2 = ct*ct; + double twosx2 = 2*sx*sx; + double twosy2 = 2*sy*sy; + double p1 = ct2/twosx2 + st2/twosy2; + double p2 = sct/twosy2 - sct/twosx2; + double p3 = st2/twosx2 + ct2/twosy2; + for ( int n2 = size >> 1, dy = -n2; dy <= n2; ++dy ) + { + double twop2dy = 2*p2*dy; + double p3dy2 = p3*dy*dy; + for ( int dx = -n2; dx <= n2; ++dx, ++h ) + *h = float( Exp( -(p1*dx*dx + twop2dy*dx + p3dy2) ) ); + } + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GaussianFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GaussianFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GeometricTransformation.h b/3rdparty/include/pcl/GeometricTransformation.h new file mode 100644 index 0000000..2cc0b77 --- /dev/null +++ b/3rdparty/include/pcl/GeometricTransformation.h @@ -0,0 +1,277 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GeometricTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GeometricTransformation_h +#define __PCL_GeometricTransformation_h + +/// \file pcl/GeometricTransformation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GeometricTransformation + * \brief Abstract base class of all PCL geometric image transformations. + * + * %GeometricTransformation represents a geometrical transformation that can be + * applied to any image type defined in PCL. + * + * \sa InterpolatingGeometricTransformation, ImageTransformation + */ +class PCL_CLASS GeometricTransformation : public virtual ImageTransformation +{ +public: + + /*! + * Constructs a %GeometricTransformation object. + */ + GeometricTransformation() = default; + + /*! + * Copy constructor. + */ + GeometricTransformation( const GeometricTransformation& ) = default; + + /*! + * Destroys a %GeometricTransformation object. + */ + virtual ~GeometricTransformation() + { + } + + /*! + * Predicts transformed image dimensions. + * + * \param[in,out] width Reference to a variable whose value is a horizontal + * dimension in pixels (width). On output, it will receive the + * predicted horizontal dimension after the transformation. + * + * \param[in,out] height Reference to a variable whose value is a vertical + * dimension in pixels (height). On output, it will receive the + * predicted vertical dimension after the transformation. + * + * \note This is a pure virtual member function that must be reimplemented + * in every derived class. + */ + virtual void GetNewSizes( int& width, int& height ) const = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class InterpolatingGeometricTransformation + * \brief Abstract base class of all PCL interpolating geometric image + * transformations. + * + * %InterpolatingGeometricTransformation represents a geometrical + * transformation that uses a pixel interpolating algorithm to yield + * transformed pixel sample values. Transformations implemented as derived + * classes of %InterpolatingGeometricTransformation can be applied to all + * standard image types defined in PCL. + * + * \sa GeometricTransformation, PixelInterpolation, ImageTransformation + */ +class PCL_CLASS InterpolatingGeometricTransformation : public GeometricTransformation +{ +public: + + /*! + * Constructs a %InterpolatingGeometricTransformation object that will use + * the specified pixel interpolation \a p. + * + * The specified PixelInterpolation object must remain valid and accessible + * as long as this object exists, or until this object is associated with a + * different pixel interpolation. + */ + InterpolatingGeometricTransformation( PixelInterpolation& p ) + : m_interpolation( &p ) + { + PCL_CHECK( m_interpolation != nullptr ) + } + + /*! + * Copy constructor. The constructed object will use the same pixel + * interpolation as the specified source object. + * + * The PixelInterpolation object used by both this object and the source + * object must remain valid and accessible as long as at least one of both + * objects is associated with it. + */ + InterpolatingGeometricTransformation( const InterpolatingGeometricTransformation& ) = default; + + /*! + * Move constructor. + */ + InterpolatingGeometricTransformation( InterpolatingGeometricTransformation&& x ) + : GeometricTransformation( x ) + , m_interpolation( x.m_interpolation ) + , m_unclipped( x.m_unclipped ) + { + x.m_interpolation = nullptr; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * After assignment, this object will use the same pixel interpolation as + * the specified source object. The previously used pixel interpolation is + * simply forgotten by this object, which will no longer depend on it. + * + * The PixelInterpolation object used by both this object and the source + * object must remain valid and accessible as long as at least one of both + * objects is associated with it. + */ + InterpolatingGeometricTransformation& operator =( const InterpolatingGeometricTransformation& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + InterpolatingGeometricTransformation& operator =( InterpolatingGeometricTransformation&& x ) + { + m_interpolation = x.m_interpolation; + x.m_interpolation = nullptr; + m_unclipped = x.m_unclipped; + return *this; + } + + /*! + * Returns a reference to the unmodifiable PixelInterpolation object that + * this transformation is currently using. + */ + const PixelInterpolation& Interpolation() const + { + PCL_CHECK( m_interpolation != nullptr ) + return *m_interpolation; + } + + /*! + * Returns a reference to the PixelInterpolation object that this + * transformation is currently using. + */ + PixelInterpolation& Interpolation() + { + PCL_CHECK( m_interpolation != nullptr ) + return *m_interpolation; + } + + /*! + * Causes this transformation to use the specified pixel interpolation \a p. + * + * The new pixel interpolation will be used to generate transformed pixel + * values after calling this function. The previously used pixel + * interpolation is simply forgotten by this object, which will no longer + * depend on it. + * + * The specified PixelInterpolation object must remain valid and accessible + * as long as this object exists, or until this object is associated with a + * different pixel interpolation. + */ + void SetInterpolation( PixelInterpolation& p ) + { + m_interpolation = &p; + PCL_CHECK( m_interpolation != nullptr ) + } + + /*! + * Returns true if this image transformation applies unclipped pixel + * interpolations. Unclipped interpolations don't constrain interpolated + * pixel sample values to the native range of the pixel data type of the + * transformed image. This allows to apply interpolating transformations to + * images that exceed their representable ranges; for example, when images + * are used to store and manipulate arbitrary matrices for convenience. + * + * Unclipped transformations are always disabled by default. + */ + bool UsingUnclippedInterpolation() const + { + return m_unclipped; + } + + /*! + * Enables the use of unclipped pixel interpolations. See + * UsingUnclippedInterpolation() for more information. + */ + void EnableUnclippedInterpolation( bool enable = true ) + { + m_unclipped = enable; + } + + /*! + * Disables the use of unclipped pixel interpolations. See + * UsingUnclippedInterpolation() for more information. + */ + void DisableUnclippedInterpolation( bool disable = true ) + { + EnableUnclippedInterpolation( !disable ); + } + +protected: + + PixelInterpolation* m_interpolation = nullptr; + bool m_unclipped = false; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GeometricTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GeometricTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GlobalSettings.h b/3rdparty/include/pcl/GlobalSettings.h new file mode 100644 index 0000000..f565f3f --- /dev/null +++ b/3rdparty/include/pcl/GlobalSettings.h @@ -0,0 +1,522 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GlobalSettings.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GlobalSettings_h +#define __PCL_GlobalSettings_h + +/// \file pcl/GlobalSettings.h + +#include +#include + +#include +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION +#include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::GlobalVariableType + * \brief Data types for global platform variables + * + * + * + * + * + * + * + * + * + * + *
GlobalVariableType::Undefined Indicates that the requested global variable does not exist.
GlobalVariableType::Flag Boolean value.
GlobalVariableType::Integer Signed integer.
GlobalVariableType::Unsigned Unsigned integer.
GlobalVariableType::Real Floating point real (IEEE 64-bit floating point).
GlobalVariableType::Color RGBA color (uint32).
GlobalVariableType::Font A font face (a string).
GlobalVariableType::String A UTF-16 string.
+ */ +namespace GlobalVariableType +{ + enum value_type + { + Undefined, // The requested global variable doesn't exist + Flag, // bool + Integer, // int + Unsigned, // unsigned + Real, // double + Color, // RGBA (= uint32) + Font, // Font + String // String + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class PixInsightSettings + * \brief Retrieves global settings from the PixInsight core application + * + * PixInsight global settings, also known as global variables, are + * identifier/value pairs available from the core application to all installed + * modules. Settings can be of six types: flags (or Boolean), integer (signed + * and unsigned), real (floating point), color, font, and string. See the + * pcl::GlobalVariableType namespace for more details. + * + * Below is a complete list of all global settings available in current + * versions of the PixInsight platform (updated as of core version 1.8.8-13). + * + *

PixInsight Public Global Variables

+ * + *

Global %Flags

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Application/AutoUIScaling
Application/HealRegistryInformationOnUpdates
ColorManagement/DefaultEmbedProfilesInGrayscaleImages
ColorManagement/DefaultEmbedProfilesInRGBImages
ColorManagement/DefaultGamutCheckEnabled
ColorManagement/DefaultProofingEnabled
ColorManagement/IsEnabled
ColorManagement/IsValidRead-only.
ColorManagement/UseLowResolutionCLUTs
ColorManagement/UseProofingBPC
ImageWindow/BackupFiles
ImageWindow/CreatePreviewsFromCoreProperties
ImageWindow/Default24BitScreenLUT
ImageWindow/DefaultEmbedProperties
ImageWindow/DefaultEmbedThumbnails
ImageWindow/DefaultMasksShown
ImageWindow/DefaultMetricResolution
ImageWindow/FastScreenRenditions
ImageWindow/FileFormatWarnings
ImageWindow/FollowDownloadLocations
ImageWindow/HighDPIRenditions
ImageWindow/LoadAstrometricSolutions
ImageWindow/LoadInitialProcessingFromCoreProperties
ImageWindow/MeasureScreenRenderingPerformance
ImageWindow/NativeFileDialogs
ImageWindow/ProjectVerifyIncrementalChecksums
ImageWindow/RememberFileOpenType
ImageWindow/RememberFileSaveType
ImageWindow/ShowActiveSTFIndicators
ImageWindow/ShowCaptionCurrentChannels
ImageWindow/ShowCaptionFullPaths
ImageWindow/ShowCaptionIdentifiers
ImageWindow/ShowCaptionZoomRatios
ImageWindow/ShowViewSelectorImageThumbnails
ImageWindow/StrictFileSaveMode
ImageWindow/SwapCompression
ImageWindow/TouchEvents
ImageWindow/UseFileNamesAsImageIdentifiers
ImageWindow/VerboseNetworkOperationsNot available on Windows.
ImageWindow/ZoomAtCursor
MainWindow/AcceptDroppedFiles
MainWindow/AnimateCombo
MainWindow/AnimateMenu
MainWindow/AnimateToolBox
MainWindow/AnimateToolTip
MainWindow/AnimateWindows
MainWindow/CapitalizedMenuBars
MainWindow/CheckForUpdatesAtStartup
MainWindow/ConfirmProgramTermination
MainWindow/DesktopSettingsAware
MainWindow/DoubleClickLaunchesOpenDialog
MainWindow/ExpandFavoritesAtStartup
MainWindow/ExpandMostUsedAtStartup
MainWindow/ExpandRecentlyUsedAtStartup
MainWindow/ExplodeIcons
MainWindow/FadeAutoHideWindows
MainWindow/FadeMenu
MainWindow/FadeToolTip
MainWindow/FadeWindows
MainWindow/FadeWorkspaces
MainWindow/FullScreenAtStartup
MainWindow/HighQualityWallpapers
MainWindow/HoverableAutoHideWindows
MainWindow/ImplodeIcons
MainWindow/MaximizeAtStartup
MainWindow/NativeMenuBar
MainWindow/OpenURLsWithInternalBrowser
MainWindow/OpenResourcesOnNewWebBrowserWindows
MainWindow/PrivateWebBrowsingMode
MainWindow/ShowFavorites
MainWindow/ShowMostUsed
MainWindow/ShowRecentlyUsed
MainWindow/ShowSplashAtStartup
MainWindow/ShowViewListImageThumbnails
MainWindow/ShowWorkspaceThumbnails
MainWindow/TranslucentAutoHideWindows
MainWindow/TranslucentChildWindows
MainWindow/TranslucentWindows
MainWindow/UseWallpapers
MainWindow/WindowButtonsOnTheLeft
Process/AlertOnProcessCompleted
Process/BackupFiles
Process/EnableCUDAAcceleration
Process/EnableExecutionStatistics
Process/EnableLaunchStatistics
Process/EnableParallelCoreColorManagement
Process/EnableParallelCoreRendering
Process/EnableParallelModuleProcessing
Process/EnableParallelProcessing
Process/EnableThreadCPUAffinity
Process/GenerateScriptComments
Process/InitCUDARuntimeAtStartup
Process/VerifyScriptChecksums
+ * + *

Global Integers

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Application/FontResolutionIn dots per inch.
ColorManagement/DefaultRenderingIntentSee the pcl::ICCRenderingIntent namespace.
ColorManagement/OnMissingProfileCore application policies. See the documentation for ColorManagementSetup.
ColorManagement/OnProfileMismatchCore application policies. See the documentation for ColorManagementSetup.
ColorManagement/ProofingIntentSee the pcl::ICCRenderingIntent namespace.
ImageWindow/CursorToleranceIn device pixels.
ImageWindow/DefaultMaskModeSee the pcl::MaskMode namespace.
ImageWindow/DefaultTransparencyModeSee the pcl::TransparencyMode namespace.
ImageWindow/FastScreenRenditionThresholdIn MiB.
ImageWindow/ImageThumbnailSizeIn image pixels.
ImageWindow/ProjectThumbnailSizeIn image pixels.
ImageWindow/WheelStepAngleIn degrees, unsigned.
ImageWindow/WheelDirectionWhen >= 0, rotating forward zooms out. When < 0, rotating forward zooms in.
MainWindow/MaxRecentFilesMaximum length of recent file menu lists.
Process/AutoSavePSMPeriodIn seconds.
Process/ConsoleDelayIn milliseconds.
Process/MaxConsoleLinesMaximum number of stored text lines on %Process %Console.
Process/MaxModuleThreadPriorityFrom 0=idle to 7=real-time.
Process/MaxProcessorsMaximum number of processor cores allowed for installed modules.
Process/MaxFileReadThreadsMaximum number of concurrent file reading threads.
Process/MaxFileWriteThreadsMaximum number of concurrent file writing threads.
Process/MaxUsageListLengthMaximum length of the Recently Used and Most Used lists on %Process %Explorer.
System/NumberOfProcessorsTotal number of processor cores available. Read-only.
TransparencyBrush/BrushSee the pcl::BackgroundBrush namespace.
Workspace/PrimaryScreenCenterXRead-only. In physical device pixels.
Workspace/PrimaryScreenCenterYRead-only. In physical device pixels.
Workspace/IconGridSpacingGrid distance for aligned icon positions on all workspaces. In logical device pixels.
+ * + *

Global Reals

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
Application/StartJDStarting time of the core application instance as a Julian day number. Read-only.
Application/UIScalingFactorGlobal interface scaling factor of the core application. In the range [1.0,4.0].
ImageWindow/DefaultHorizontalResolutionIn device pixels per resolution unit. See the ImageWindow/DefaultMetricResolution global variable.
ImageWindow/DefaultVerticalResolutionIn device pixels per resolution unit. See the ImageWindow/DefaultMetricResolution global variable.
ImageWindow/PinchSensitivityFor touch events. In device pixels.
MainWindow/ActiveWindowOpacityWindow opacity in the [0,1] range.
MainWindow/AutoHideWindowOpacityWindow opacity in the [0,1] range.
MainWindow/InactiveChildWindowOpacityWindow opacity in the [0,1] range.
MainWindow/InactiveWindowOpacityWindow opacity in the [0,1] range.
MainWindow/MovingChildWindowOpacityWindow opacity in the [0,1] range.
MainWindow/MovingWindowOpacityWindow opacity in the [0,1] range.
+ * + *

Global Colors

+ * + * Since PixInsight core version 1.8.0, most UI colors and fonts are defined in + * cascading style sheet files loaded automatically on startup. Only the + * following four color variables remain because they are purely functional + * (i.e., not related to the appearance of GUI controls). + * + * + * + * + * + * + *
ColorManagement/GamutWarningColorFor signaling out-of-gamut pixels in color proofing image renditions.
TransparencyBrush/BackgroundColorBackground brush color for renditions of translucent image pixels.
TransparencyBrush/DefaultColorOpaque color for renditions of translucent image pixels.
TransparencyBrush/ForegroundColorForeground brush color for renditions of translucent image pixels.
+ * + *

Global Fonts

+ * + * Currently there are no global font variables. Since PixInsight core version + * 1.8.0, all UI fonts are defined through cascading style sheet files loaded + * automatically on startup. + * + *

Global Strings

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Application/AppDirectoryFull path to the distribution's core application bundle. Read-only. macOS only,
Application/AsteroidEphemeridesFileFile name or path of the distribution's asteroid ephemerides file (XEPH format).
Application/AsteroidEphemeridesFilePathFull path to the current distribution's asteroid ephemerides file (XEPH format). Read-only.
Application/BaseDirectoryBase directory of the core distribution. Read-only.
Application/BinDirectoryFull path to the distribution's bin directory. Read-only.
Application/CIP_ITRSDataFileFile name or path of the distribution's data file of CIP coordinates in the ITRS (plain text).
Application/CIP_ITRSDataFilePathFull path to the current distribution's data file of CIP coordinates in the ITRS (plain text). Read-only
Application/CoreDirectoryFull directory of the core executable file. Read-only.
Application/CoreFilePathFull file path of the core executable. Read-only.
Application/DeltaATDataFileFile name or path of the distribution's Delta AT (TAI-UTC) data file (plain text).
Application/DeltaATDataFilePathFull path to the current distribution's Delta AT (TAI-UTC) data file (plain text). Read-only
Application/DeltaTDataFileFile name or path of the distribution's Delta T (TT-UT1) data file (plain text).
Application/DeltaTDataFilePathFull path to the current distribution's Delta T (TT-UT1) data file (plain text). Read-only
Application/DocDirectoryFull path to the distribution's doc directory. Read-only.
Application/EtcDirectoryFull path to the distribution's etc directory. Read-only.
Application/FundamentalEphemeridesFileFile name or path of the distribution's fundamental ephemerides file (XEPH format).
Application/FundamentalEphemeridesFilePathFull path to the current distribution's fundamental ephemerides file (XEPH format). Read-only.
Application/HighResFont%Font family for automatic style sheet replacement on high-dpi displays.
Application/HighResMonoFontMonospaced font family for automatic style sheet replacement on high-dpi displays.
Application/IncludeDirectoryFull path to the distribution's include directory. Read-only.
Application/LibDirectoryFull path to the distribution's lib directory. Read-only.
Application/LibraryDirectoryFull path to the distribution's library directory. Read-only.
Application/LowResFont%Font family for automatic style sheet replacement on low-dpi displays.
Application/LowResMonoFontMonospaced font family for automatic style sheet replacement on low-dpi displays.
Application/NutationModelFileFile name or path of the distribution's nutation model file (XEPH format).
Application/NutationModelFilePathFull path to the current distribution's nutation model file (XEPH format). Read-only.
Application/ResourceFile01Core resource file #1.
Application/ResourceFile02Core resource file #2.
Application/ResourceFile03Core resource file #3.
Application/ResourceFile04Core resource file #4.
Application/ResourceFile05Core resource file #5.
Application/ResourceFile06Core resource file #6.
Application/ResourceFile07Core resource file #7.
Application/ResourceFile08Core resource file #8.
Application/ResourceFile09Core resource file #9.
Application/ResourceFile10Core resource file #10.
Application/RscDirectoryFull path to the distribution's rsc directory. Read-only.
Application/ShortTermAsteroidEphemeridesFileFile name or path of the distribution's asteroid ephemerides file (XEPH format) - short-term version (reduced time span).
Application/ShortTermAsteroidEphemeridesFilePathFull path to the current distribution's asteroid ephemerides file (XEPH format) - short-term version (reduced time span). Read-only.
Application/ShortTermFundamentalEphemeridesFileFile name or path of the distribution's fundamental ephemerides file (XEPH format) - short-term version (reduced time span).
Application/ShortTermFundamentalEphemeridesFilePathFull path to the current distribution's fundamental ephemerides file (XEPH format) - short-term version (reduced time span). Read-only.
Application/ShortTermNutationModelFileFile name or path of the distribution's nutation model file (XEPH format) - short-term version (reduced time span).
Application/ShortTermNutationModelFilePathFull path to the current distribution's nutation model file (XEPH format) - short-term version (reduced time span). Read-only.
Application/SrcDirectoryFull path to the distribution's src directory. Read-only.
Application/StartTimeStarting time of the core application in ISO 8601 extended format. Read-only.
Application/StyleSheetFileMain core stile sheet file.
ColorManagement/DefaultGrayscaleProfilePathFull path to the default ICC color profile for grayscale monochrome images.
ColorManagement/DefaultRGBProfilePathFull path to the default ICC color profile for RGB color images.
ColorManagement/MonitorProfilePathFull path to the ICC color profile associated with the primary monitor. Read-only.
ColorManagement/ProofingProfilePathFull path to the ICC color profile for the color proofing target device.
ColorManagement/UpdateMonitorProfileFull path to the scheduled new ICC color profile for the primary monitor. Write-only. See the documentation for ColorManagementSetup.
FileFormat/ReadFiltersA list of file filters for file formats capable of image read operations, suitable for file dialogs. Read-only. Updated dynamically on-demand.
FileFormat/WriteFiltersA list of file filters for file formats capable of image write operations, suitable for file dialogs. Read-only. Updated dynamically on-demand.
ImageContainerIcon/PrefixPrefix for automatically generated image container identifiers.
ImageWindow/ClonePostfixPostfix appended to image duplicates
ImageWindow/DefaultFileExtensionThe default file suffix used to save newly created images.
ImageWindow/DownloadsDirectoryFull path to the core downloads directory.
ImageWindow/NewImageCaptionWindow title token for signaling newly created images.
ImageWindow/PrefixPrefix used for automatically generated image identifiers.
ImageWindow/ProxyURLThe proxy that will be used for core network operations.
MainWindow/WallpaperFile01Core workspace wallpaper file #1.
MainWindow/WallpaperFile02Core workspace wallpaper file #2.
MainWindow/WallpaperFile03Core workspace wallpaper file #3.
MainWindow/WallpaperFile04Core workspace wallpaper file #4.
MainWindow/WallpaperFile05Core workspace wallpaper file #5.
MainWindow/WallpaperFile06Core workspace wallpaper file #6.
MainWindow/WallpaperFile07Core workspace wallpaper file #7.
MainWindow/WallpaperFile08Core workspace wallpaper file #8.
MainWindow/WallpaperFile09Core workspace wallpaper file #9.
MainWindow/WallpaperFile10Core workspace wallpaper file #10.
Preview/PrefixPrefix used for automatically generated preview identifiers.
ProcessIcon/PrefixPrefix used for automatically generated process icon identifiers.
View/BrokenLinkTextText fragment used to signal broken image and/or process relations, such as missing masks.
ViewList/NoPreviewSelectedTextText fragment used when there are no previews selected.
ViewList/NoPreviewsAvailableTextText fragment used when there are no previews available.
ViewList/NoViewSelectedTextText fragment used when there are no views selected.
ViewList/NoViewsAvailableTextText fragment used when there are no views available.
Workspace/PrefixPrefix used for automatically generated workspace identifiers.
+ */ +class PCL_CLASS PixInsightSettings +{ +public: + + /*! + * Represents the data type of a global variable. + */ + typedef GlobalVariableType::value_type variable_type; + + /*! + * Default constructor. This constructor is disabled because + * %PixInsightSettings is not an instantiable class. + */ + PixInsightSettings() = delete; + + /*! + * Copy constructor. This constructor is disabled because + * %PixInsightSettings is not an instantiable class. + */ + PixInsightSettings( const PixInsightSettings& ) = delete; + + /*! + * Copy assignment. This operator is disabled because + * %PixInsightSettings is not an instantiable class. + */ + PixInsightSettings& operator =( const PixInsightSettings& ) = delete; + + /*! + * Virtual destructor. This destructor is disabled because + * %PixInsightSettings is not an instantiable class. + */ + virtual ~PixInsightSettings() = delete; + + /*! + * Retrieves the type of a global variable \a globalId. + */ + static variable_type GlobalVariableType( const IsoString& globalId ); + + /*! + * Returns true iff the specified global variable \a globalId is defined in + * the current PixInsight platform. + */ + static bool IsGlobalVariableDefined( const IsoString& globalId ) + { + return GlobalVariableType( globalId ) != GlobalVariableType::Undefined; + } + + /*! + * Returns the value of a global boolean variable. + */ + static bool GlobalFlag( const IsoString& globalId ); + + /*! + * Returns the value of a global signed integer variable. + */ + static int GlobalInteger( const IsoString& globalId ); + + /*! + * Returns the value of a global unsigned integer variable. + */ + static unsigned GlobalUnsigned( const IsoString& globalId ); + + /*! + * Returns the value of a global floating point real variable. + */ + static double GlobalReal( const IsoString& globalId ); + + /*! + * Returns the value of a global RGBA color variable. + */ + static RGBA GlobalColor( const IsoString& globalId ); + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + /*! + * Returns the value of a global font face variable. + */ + static Font GlobalFont( const IsoString& globalId ); +#endif + + /*! + * Returns the value of a global string variable. + */ + static String GlobalString( const IsoString& globalId ); + + /*! + * Begins a global variable update operation. + * + * \sa EndUpdate(), CalcelUpdate() + */ + static void BeginUpdate(); + + /*! + * Terminates a global variable update operation. + * + * \sa BeginUpdate(), CancelUpdate() + */ + static void EndUpdate(); + + /*! + * Aborts an ongoing global variable update operation. + * + * Use this function if you catch an exception during the sequence of + * SetGlobalXXX() calls. After cancelling an update operation, you + * shouldn't call EndUpdate(). + * + * \sa BeginUpdate(), EndUpdate() + */ + static void CancelUpdate(); + + /*! + * Sets the value of a global boolean variable. + */ + static void SetGlobalFlag( const IsoString& globalId, bool ); + + /*! + * Sets the value of a global signed integer variable. + */ + static void SetGlobalInteger( const IsoString& globalId, int ); + + /*! + * Sets the value of a global unsigned integer variable. + */ + static void SetGlobalUnsigned( const IsoString& globalId, unsigned ); + + /*! + * Sets the value of a global floating point real variable. + */ + static void SetGlobalReal( const IsoString& globalId, double ); + + /*! + * Sets the value of a global RGBA color variable. + */ + static void SetGlobalColor( const IsoString& globalId, RGBA ); + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + /*! + * Sets the value of a global font face variable. + */ + static void SetGlobalFont( const IsoString& globalId, const Font& ); +#endif + + /*! + * Sets the value of a global string variable. + */ + static void SetGlobalString( const IsoString& globalId, const String& ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GlobalSettings_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GlobalSettings.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GnomonicProjection.h b/3rdparty/include/pcl/GnomonicProjection.h new file mode 100644 index 0000000..696298f --- /dev/null +++ b/3rdparty/include/pcl/GnomonicProjection.h @@ -0,0 +1,178 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GnomonicProjection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GnomonicProjection_h +#define __PCL_GnomonicProjection_h + +/// \file pcl/GnomonicProjection.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GnomonicProjection + * \brief Gnomonic projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS GnomonicProjection : public ProjectionBase +{ +public: + + /*! + * Constructs a default %GnomonicProjection object with the specified + * origin equatorial coordinates \a ra0 and \a dec0 in degrees. + */ + GnomonicProjection( double ra0, double dec0 ) + { + m_ra0 = Rad( ra0 ); + m_dec0 = Rad( dec0 ); + SinCos( m_dec0, m_sinDec0, m_cosDec0 ); + } + + /*! + * Constructs a %GnomonicProjection object with the specified \a scale + * factor and origin equatorial coordinates \a ra0 and \a dec0 in degrees. + */ + GnomonicProjection( double scale, double ra0, double dec0 ) + : m_scale( scale ) + { + m_ra0 = Rad( ra0 ); + m_dec0 = Rad( dec0 ); + SinCos( m_dec0, m_sinDec0, m_cosDec0 ); + } + + /*! + * Copy constructor. + */ + GnomonicProjection( const GnomonicProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new GnomonicProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "TAN"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Gnomonic"; + } + + /*! + * Transforms from celestial coordinates to world coordinates. + */ + bool Direct( DPoint& pW, const DPoint& pRD ) const noexcept override; + + /*! + * Transforms from world coordinates to celestial coordinates. + */ + bool Inverse( DPoint& pRD, const DPoint& pW ) const noexcept override; + + /*! + * + */ + bool CheckBrokenLine( const DPoint& cp1, const DPoint& cp2 ) const noexcept override + { + DPoint gp1, gp2; + return Direct( gp1, cp1 ) && Direct( gp2, cp2 ) && + (gp1.x - gp2.x)*(gp1.x - gp2.x) + (gp1.y - gp2.y)*(gp1.y - gp2.y) < 45*45; + } + +protected: + + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override + { + return false; + } + + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override + { + return false; + } + +private: + + double m_scale = Const::deg(); + double m_sinDec0; + double m_cosDec0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GnomonicProjection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GnomonicProjection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Graphics.h b/3rdparty/include/pcl/Graphics.h new file mode 100644 index 0000000..af561f8 --- /dev/null +++ b/3rdparty/include/pcl/Graphics.h @@ -0,0 +1,2329 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Graphics.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Graphics_h +#define __PCL_Graphics_h + +/// \file pcl/Graphics.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef __PCL_GRAPHICS_DONT_REMOVE_PREVIOUS_DECLARATIONS + +// Remove conflicting identifiers from Win32 SDK headers. +// If more conflicts arise, fix *all* of them *here only*. +#ifdef DrawText +#undef DrawText +#endif + +#endif // !__PCL_GRAPHICS_DONT_REMOVE_PREVIOUS_DECLARATIONS + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::CompositionOp + * \brief Image composition operators. + * + * The following are the Porter-Duff alpha composition operators, + * supported by all versions of PixInsight: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CompositionOp::Clear Clear
CompositionOp::Source A
CompositionOp::Destination B
CompositionOp::SourceOver A over B
CompositionOp::DestinationOver B over A
CompositionOp::SourceIn A in B
CompositionOp::DestinationIn B in A
CompositionOp::SourceOut A out B
CompositionOp::DestinationOut B out A
CompositionOp::SourceAtop A atop B
CompositionOp::DestinationAtop B atop A
CompositionOp::Xor A xor B
+ * + * See T. Porter & T. Duff, Compositing Digital Images, Computer + * Graphics Vol. 18, Num. 3, July 1984, pp 253-259. + * + * In addition, the following operators are also supported starting from + * PixInsight core version 1.7.0.702: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CompositionOp::Min Min( A, B )
CompositionOp::Max Max( A, B )
CompositionOp::Add A + B
CompositionOp::Multiply A * B
CompositionOp::Screen ~A * ~B
CompositionOp::Overlay (A > 0.5) ? ~(~(2*(A - 0.5)) * ~B) : 2*A*B
CompositionOp::ColorDodge A/~B
CompositionOp::ColorBurn ~(~A/B)
CompositionOp::HardLight (B > 0.5) ? ~(~A * ~(2*(B - 0.5))) : A*2*B
CompositionOp::SoftLight (B > 0.5) ? ~(~A * ~(B - 0.5)) : A*(B + 0.5)
CompositionOp::Difference Abs( A - B )
CompositionOp::Exclusion 0.5 - 2*(A - 0.5)*(B - 0.5)
+ * + * In the tables above, A represents a target pixel and B represents a source + * pixel. For example, if a Graphics object is being used to paint on a Bitmap + * object, bitmap pixels are target pixels, and any graphical elements drawn + * using the %Graphics object are considered as source pixels. + */ +namespace CompositionOp +{ + enum value_type + { + Clear, // 0 + Source, // A + Destination, // B + SourceOver, // A over B + DestinationOver, // B over A + SourceIn, // A in B + DestinationIn, // B in A + SourceOut, // A out B + DestinationOut, // B out A + SourceAtop, // A atop B + DestinationAtop, // B atop A + Xor, // A xor B + Min, // Min( A, B ) + Max, // Max( A, B ) + Add, // A + B + Multiply, // A * B + Screen, // ~A * ~B + Overlay, // (A > 0.5) ? ~(~(2*(A - 0.5)) * ~B) : 2*A*B + ColorDodge, // A/~B + ColorBurn, // ~(~A/B) + HardLight, // (B > 0.5) ? ~(~A * ~(2*(B - 0.5))) : A*2*B + SoftLight, // (B > 0.5) ? ~(~A * ~(B - 0.5)) : A*(B + 0.5) + Difference, // Abs( A - B ) + Exclusion, // 0.5 - 2*(A - 0.5)*(B - 0.5) + + NumberOfCompositionOps + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::FillRule + * \brief Polygon fill rules + * + * + * + * + *
FillRule::OddEven Odd-even (or parity, alternate) polygon fill rule
FillRule::Winding Nonzero winding polygon fill rule
+ */ +namespace FillRule +{ + enum value_type + { + OddEven, // Odd-even (or parity, alternate) polygon fill rule + Winding, // Nonzero winding polygon fill rule + + NumberOfFillRules + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class Control; +class Bitmap; +class SVG; + +// ---------------------------------------------------------------------------- + +/*! + * \brief Base class of client-side interface classes to PixInsight graphics contexts + * + * ### TODO: Write a detailed description for %GraphicsContextBase. + * + * ### TODO: Include a number of examples for drawing primitives, composition + * operators, rendering performance, transformations, etc. + */ +class PCL_CLASS GraphicsContextBase : public UIObject +{ +public: + + /*! + * Represents a Porter-Duff alpha composition operator. + */ + typedef CompositionOp::value_type composition_op; + + /*! + * Represents a polygon fill rule. + */ + typedef FillRule::value_type fill_rule; + + /*! + * Constructs an inactive graphics context. + */ + GraphicsContextBase(); + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a control. + * + * \warning Invoking this constructor outside a Control::OnPaint() event + * handler is illegal on all supported platforms. If called without an + * active OnPaint() event, this constructor throws an Error exception. + */ + GraphicsContextBase( Control& control ); + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a bitmap. + */ + GraphicsContextBase( Bitmap& bitmap ); + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a svg object. + */ + GraphicsContextBase( SVG& svg ); + + /*! + * Move constructor. + */ + GraphicsContextBase( GraphicsContextBase&& x ) + : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys a %GraphicsContextBase object. If this graphics context is + * active, it is terminated upon destruction. + */ + virtual ~GraphicsContextBase() + { + if ( !IsNull() ) + if ( IsPainting() ) + EndPaint(); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GraphicsContextBase& operator =( GraphicsContextBase&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since graphics contexts are unique objects, calling this member function + * has no effect. + */ + void EnsureUnique() override + { + } + + /*! + * Activates this graphics context to draw on the specified \a control. + * + * \warning Calling this function outside a Control::OnPaint() event handler + * is illegal on all supported platforms. + */ + bool BeginPaint( Control& control ); + + /*! + * Activates this graphics context to draw on the specified \a bitmap. + */ + bool BeginPaint( Bitmap& bitmap ); + + /*! + * Activates this graphics context to draw on the specified \a svg object. + */ + bool BeginPaint( SVG& svg ); + + /*! + * Returns true iff this graphics context is currently active. + */ + bool IsPainting() const; + + /*! + * Terminates a graphics context drawing operation. + */ + void EndPaint(); + + /*! # + */ + bool IsTransformationEnabled() const; + + /*! # + */ + void EnableTransformation( bool = true ); + + /*! # + */ + void DisableTransformation( bool disable = true ) + { + EnableTransformation( !disable ); + } + + /*! # + */ + Matrix TransformationMatrix() const; + + /*! # + */ + void SetTransformationMatrix( const Matrix& M ); + + /*! # + */ + void SetTransformationMatrix( double m11, double m12, double m13, + double m21, double m22, double m23, + double m31, double m32, double m33 ) + { + SetTransformationMatrix( Matrix( m11, m12, m13, m21, m22, m23, m31, m32, m33 ) ); + } + + /*! # + */ + void MultiplyTransformationMatrix( const Matrix& M ); + + /*! # + */ + void MultiplyTransformationMatrix( double m11, double m12, double m13, + double m21, double m22, double m23, + double m31, double m32, double m33 ) + { + MultiplyTransformationMatrix( Matrix( m11, m12, m13, m21, m22, m23, m31, m32, m33 ) ); + } + + /*! # + */ + void RotateTransformation( double angleRadians ); + + /*! # + */ + void ScaleTransformation( double xScale, double yScale ); + + /*! # + */ + void ScaleTransformation( double scale ) + { + ScaleTransformation( scale, scale ); + } + + /*! # + */ + void TranslateTransformation( double dx, double dy ); + + /*! # + */ + void TranslateTransformation( double d ) + { + TranslateTransformation( d, d ); + } + + /*! # + */ + void ShearTransformation( double sx, double sy ); + + /*! # + */ + void ShearTransformation( double s ) + { + ShearTransformation( s, s ); + } + + /*! # + */ + void ResetTransformation(); + + /*! # + */ + void Transform( double& x, double& y ) const; + + /*! # + */ + void Transform( DPoint* p, size_type n ) const; + + /*! # + */ + void Transform( Array& a ) const + { + Transform( a.Begin(), a.Length() ); + } + + /*! # + */ + DPoint Transformed( const DPoint& p ) const + { + DPoint p1( p ); + Transform( p1.x, p1.y ); + return p1; + } + + /*! # + */ + DRect Transformed( const DRect& r ) const + { + DRect r1( r ); + Transform( r1.x0, r1.y0 ); + Transform( r1.x1, r1.y1 ); + return r1; + } + + /*! # + */ + Array Transformed( const Array& a ) const + { + Array a1( a ); + Transform( a1 ); + return a1; + } + + /*! # + */ + bool IsClippingEnabled() const; + + /*! # + */ + void EnableClipping( bool = true ); + + /*! # + */ + void DisableClipping( bool disable = true ) + { + EnableClipping( !disable ); + } + + /*! # + */ + bool IsAntialiasingEnabled() const; + + /*! # + */ + void EnableAntialiasing( bool = true ); + + /*! # + */ + void DisableAntialiasing( bool disable = true ) + { + EnableAntialiasing( !disable ); + } + + /*! # + */ + bool IsTextAntialiasingEnabled() const; + + /*! # + */ + void EnableTextAntialiasing( bool = true ); + + /*! # + */ + void DisableTextAntialiasing( bool disable = true ) + { + EnableTextAntialiasing( !disable ); + } + + /*! # + */ + bool IsSmoothInterpolationEnabled() const; + + /*! # + */ + void EnableSmoothInterpolation( bool = true ); + + /*! # + */ + void DisableSmoothInterpolation( bool disable = true ) + { + EnableSmoothInterpolation( !disable ); + } + + /*! # + */ + composition_op CompositionOperator() const; + + /*! # + */ + void SetCompositionOperator( composition_op ); + + /*! # + */ + void ResetCompositionOperator() + { + SetCompositionOperator( CompositionOp::SourceOver ); + } + + /*! # + */ + double Opacity() const; + + /*! # + */ + void SetOpacity( double op ); + + /*! # + */ + pcl::Brush BackgroundBrush() const; + + /*! # + */ + void SetBackgroundBrush( const pcl::Brush& ); + + /*! # + */ + bool IsTransparentBackground() const; + + /*! # + */ + bool IsOpaqueBackground() const + { + return !IsTransparentBackground(); + } + + /*! # + */ + void SetTransparentBackground( bool = true ); + + /*! # + */ + void SetOpaqueBackground( bool opaque = true ) + { + SetTransparentBackground( !opaque ); + } + + /*! # + */ + pcl::Pen Pen() const; + + /*! + * \deprecated Use Graphics::Pen() in newly produced code. + */ + pcl::Pen GetPen() const + { + return this->Pen(); + } + + /*! # + */ + void SetPen( const pcl::Pen& ); + + /*! # + */ + void SetPen( RGBA color, float width ) + { + SetPen( pcl::Pen( color, width ) ); + } + + /*! # + */ + pcl::Brush Brush() const; + + /*! + * \deprecated Use Graphics::Brush() in newly produced code. + */ + pcl::Brush GetBrush() const + { + return this->Brush(); + } + + /*! # + */ + void SetBrush( const pcl::Brush& ); + + /*! # + */ + pcl::Font Font() const; + + /*! + * \deprecated Use Graphics::Font() in newly produced code. + */ + pcl::Font GetFont() const + { + return this->Font(); + } + + /*! # + */ + void SetFont( const pcl::Font& ); + + /*! # + */ + void PushState(); + + /*! # + */ + void PopState(); + +protected: + + /*! + * \internal + */ + GraphicsContextBase( void* h ) : UIObject( h ) + { + } + +private: + + void* CloneHandle() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Graphics + * \brief Client-side interface to a PixInsight graphics context object + * + * ### TODO: Write a detailed description for %Graphics. + * + * ### TODO: Include a number of examples for drawing primitives, composition + * operators, rendering performance, transformations, etc. + */ +class PCL_CLASS Graphics : public GraphicsContextBase +{ +public: + + /*! + * Represents a Porter-Duff alpha composition operator. + */ + typedef GraphicsContextBase::composition_op composition_op; + + /*! + * Represents a polygon fill rule. + */ + typedef GraphicsContextBase::fill_rule fill_rule; + + /*! + * Constructs an inactive graphics context. + */ + Graphics() = default; + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a control. + * + * \warning Invoking this constructor outside a Control::OnPaint() event + * handler is illegal on all supported platforms. If called without an + * active OnPaint() event, this constructor throws an Error exception. + */ + Graphics( Control& control ) + : GraphicsContextBase( control ) + { + } + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a bitmap. + */ + Graphics( Bitmap& bitmap ) + : GraphicsContextBase( bitmap ) + { + } + + /*! + * Constructs an active graphics context, ready to draw on the specified + * \a svg object. + */ + Graphics( SVG& svg ) + : GraphicsContextBase( svg ) + { + } + + /*! + * Move constructor. + */ + Graphics( Graphics&& x ) + : GraphicsContextBase( std::move( x ) ) + { + } + + /*! + * Destroys a %Graphics object. If this graphics context is active, it is + * terminated upon destruction. + */ + virtual ~Graphics() + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Graphics& operator =( Graphics&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null %Graphics instance. A null %Graphics does + * not correspond to an existing graphics context in the PixInsight core + * application. + */ + static Graphics& Null(); + + /*! # + */ + pcl::Rect ClipRect() const; + + /*! # + */ + void SetClipRect( const pcl::Rect& r ) + { + SetClipRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void SetClipRect( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void IntersectClipRect( const pcl::Rect& r ) + { + SetClipRect( ClipRect().Intersection( r ) ); + } + + /*! # + */ + void IntersectClipRect( int x0, int y0, int x1, int y1 ) + { + IntersectClipRect( pcl::Rect( x0, y0, x1, y1 ) ); + } + + /*! # + */ + void UniteClipRect( const pcl::Rect& r ) + { + SetClipRect( ClipRect().Union( r ) ); + } + + /*! # + */ + void UniteClipRect( int x0, int y0, int x1, int y1 ) + { + UniteClipRect( pcl::Rect( x0, y0, x1, y1 ) ); + } + + /*! # + */ + pcl::Point BrushOrigin() const; + + /*! # + */ + void SetBrushOrigin( const pcl::Point& p ) + { + SetBrushOrigin( p.x, p.y ); + } + + /*! # + */ + void SetBrushOrigin( int x, int y ); + + /*! # + */ + void DrawPoint( const pcl::Point& p ) + { + DrawPoint( p.x, p.y ); + } + + /*! # + */ + void DrawPoint( int x, int y ); + + /*! # + */ + void DrawLine( const pcl::Point& p0, const pcl::Point& p1 ) + { + DrawLine( p0.x, p0.y, p1.x, p1.y ); + } + + /*! # + */ + void DrawLine( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void DrawRect( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void DrawRect( const pcl::Rect& r ) + { + DrawRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void StrokeRect( int x0, int y0, int x1, int y1, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeRect( const pcl::Rect& r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRect( r.x0, r.y0, r.x1, r.y1, pen ); + } + + /*! # + */ + void FillRect( int x0, int y0, int x1, int y1, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillRect( const pcl::Rect& r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRect( r.x0, r.y0, r.x1, r.y1, brush ); + } + + /*! # + */ + void EraseRect( int x0, int y0, int x1, int y1 ) + { + FillRect( x0, y0, x1, y1, BackgroundBrush() ); + } + + /*! # + */ + void EraseRect( const pcl::Rect& r ) + { + EraseRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawRoundedRect( int x0, int y0, int x1, int y1, double rx, double ry ); + + /*! # + */ + void DrawRoundedRect( int x0, int y0, int x1, int y1, double rxy = 25 ) + { + DrawRoundedRect( x0, y0, x1, y1, rxy, rxy ); + } + + /*! # + */ + void DrawRoundedRect( const pcl::Rect& r, double rx, double ry ) + { + DrawRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry ); + } + + /*! # + */ + void DrawRoundedRect( const pcl::Rect& r, double rxy = 25 ) + { + DrawRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy ); + } + + /*! # + */ + void StrokeRoundedRect( int x0, int y0, int x1, int y1, double rx, double ry, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeRoundedRect( int x0, int y0, int x1, int y1, double rxy = 25, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( x0, y0, x1, y1, rxy, rxy, pen ); + } + + /*! # + */ + void StrokeRoundedRect( const pcl::Rect& r, double rx, double ry, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry, pen ); + } + + /*! # + */ + void StrokeRoundedRect( const pcl::Rect& r, double rxy = 25, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy, pen ); + } + + /*! # + */ + void FillRoundedRect( int x0, int y0, int x1, int y1, double rx, double ry, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillRoundedRect( int x0, int y0, int x1, int y1, double rxy = 25, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( x0, y0, x1, y1, rxy, rxy, brush ); + } + + /*! # + */ + void FillRoundedRect( const pcl::Rect& r, double rx, double ry, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry, brush ); + } + + /*! # + */ + void FillRoundedRect( const pcl::Rect& r, double rxy = 25, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy, brush ); + } + + /*! # + */ + void EraseRoundedRect( int x0, int y0, int x1, int y1, double rx, double ry ) + { + FillRoundedRect( x0, y0, x1, y1, rx, ry, BackgroundBrush() ); + } + + /*! # + */ + void EraseRoundedRect( int x0, int y0, int x1, int y1, double rxy = 25 ) + { + EraseRoundedRect( x0, y0, x1, y1, rxy, rxy ); + } + + /*! # + */ + void EraseRoundedRect( const pcl::Rect& r, double rx, double ry ) + { + EraseRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry ); + } + + /*! # + */ + void EraseRoundedRect( const pcl::Rect& r, double rxy = 25 ) + { + EraseRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy ); + } + + /*! # + */ + void DrawEllipse( int x0, int y0, int x1, int y1 ); + + /*! # + */ + void DrawEllipse( const pcl::Rect& r ) + { + DrawEllipse( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void StrokeEllipse( int x0, int y0, int x1, int y1, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeEllipse( const pcl::Rect& r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipse( r.x0, r.y0, r.x1, r.y1, pen ); + } + + /*! # + */ + void FillEllipse( int x0, int y0, int x1, int y1, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillEllipse( const pcl::Rect& r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipse( r.x0, r.y0, r.x1, r.y1, brush ); + } + + /*! # + */ + void EraseEllipse( int x0, int y0, int x1, int y1 ) + { + FillEllipse( x0, y0, x1, y1, BackgroundBrush() ); + } + + /*! # + */ + void EraseEllipse( const pcl::Rect& r ) + { + EraseEllipse( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawCircle( int xc, int yc, int r ) + { + DrawEllipse( xc-r, yc-r, xc+r+1, yc+r+1 ); + } + + /*! # + */ + void DrawCircle( const pcl::Point& c, int r ) + { + DrawCircle( c.x, c.y, r ); + } + + /*! # + */ + void StrokeCircle( int xc, int yc, int r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipse( xc-r, yc-r, xc+r+1, yc+r+1, pen ); + } + + /*! # + */ + void StrokeCircle( const pcl::Point& c, int r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeCircle( c.x, c.y, r, pen ); + } + + /*! # + */ + void FillCircle( int xc, int yc, int r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipse( xc-r, yc-r, xc+r+1, yc+r+1, brush ); + } + + /*! # + */ + void FillCircle( const pcl::Point& c, int r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillCircle( c.x, c.y, r, brush ); + } + + /*! # + */ + void EraseCircle( int xc, int yc, int r ) + { + FillCircle( xc, yc, r, BackgroundBrush() ); + } + + /*! # + */ + void EraseCircle( const pcl::Point& c, int r ) + { + EraseCircle( c.x, c.y, r ); + } + + /*! # + */ + void DrawPolygon( const pcl::Point* p, size_type n, fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void DrawPolygon( const C& c, fill_rule rule = FillRule::OddEven ) + { + DrawPolygon( c.Begin(), c.Length(), rule ); + } + + /*! # + */ + void StrokePolygon( const pcl::Point* p, size_type n, const pcl::Pen& pen = pcl::Pen::Null(), fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void StrokePolygon( const C& c, const pcl::Pen& pen = pcl::Pen::Null(), fill_rule rule = FillRule::OddEven ) + { + StrokePolygon( c.Begin(), c.Length(), pen, rule ); + } + + /*! # + */ + void FillPolygon( const pcl::Point* p, size_type n, const pcl::Brush& brush = pcl::Brush::Null(), fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void FillPolygon( const C& c, const pcl::Brush& brush = pcl::Brush::Null(), fill_rule rule = FillRule::OddEven ) + { + FillPolygon( c.Begin(), c.Length(), brush, rule ); + } + + /*! # + */ + void ErasePolygon( const pcl::Point* p, size_type n, fill_rule rule = FillRule::OddEven ) + { + FillPolygon( p, n, BackgroundBrush(), rule ); + } + + /*! # + */ + template + void ErasePolygon( const C& c, fill_rule rule = FillRule::OddEven ) + { + ErasePolygon( c.Begin(), c.Length(), rule ); + } + + /*! # + */ + void DrawPolyline( const pcl::Point*, size_type n ); + + /*! # + */ + template + void DrawPolyline( const C& c ) + { + DrawPolyline( c.Begin(), c.Length() ); + } + + /*! # + */ + void DrawEllipticArc( int x0, int y0, int x1, int y1, double start, double span ); + + /*! # + */ + void DrawEllipticArc( const pcl::Rect& r, double start, double span ) + { + DrawEllipticArc( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawArc( int xc, int yc, int r, double start, double span ) + { + DrawEllipticArc( xc-r, yc-r, xc+r+1, yc+r+1, start, span ); + } + + /*! # + */ + void DrawArc( const pcl::Point& c, int r, double start, double span ) + { + DrawArc( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawEllipticChord( int x0, int y0, int x1, int y1, double start, double span ); + + /*! # + */ + void DrawEllipticChord( const pcl::Rect& r, double start, double span ) + { + DrawEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void StrokeEllipticChord( int x0, int y0, int x1, int y1, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeEllipticChord( const pcl::Rect& r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span, pen ); + } + + /*! # + */ + void FillEllipticChord( int x0, int y0, int x1, int y1, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillEllipticChord( const pcl::Rect& r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span, brush ); + } + + /*! # + */ + void EraseEllipticChord( int x0, int y0, int x1, int y1, double start, double span ) + { + FillEllipticChord( x0, y0, x1, y1, start, span, BackgroundBrush() ); + } + + /*! # + */ + void EraseEllipticChord( const pcl::Rect& r, double start, double span ) + { + EraseEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawChord( int xc, int yc, int r, double start, double span ) + { + DrawEllipticChord( xc-r, yc-r, xc+r+1, yc+r+1, start, span ); + } + + /*! # + */ + void DrawChord( const pcl::Point& c, int r, double start, double span ) + { + DrawChord( c.x, c.y, r, start, span ); + } + + /*! # + */ + void StrokeChord( int xc, int yc, int r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticChord( xc-r, yc-r, xc+r+1, yc+r+1, start, span, pen ); + } + + /*! # + */ + void StrokeChord( const pcl::Point& c, int r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeChord( c.x, c.y, r, start, span, pen ); + } + + /*! # + */ + void FillChord( int xc, int yc, int r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticChord( xc-r, yc-r, xc+r+1, yc+r+1, start, span, brush ); + } + + /*! # + */ + void FillChord( const pcl::Point& c, int r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillChord( c.x, c.y, r, start, span, brush ); + } + + /*! # + */ + void EraseChord( int xc, int yc, int r, double start, double span ) + { + FillChord( xc, yc, r, start, span, BackgroundBrush() ); + } + + /*! # + */ + void EraseChord( const pcl::Point& c, int r, double start, double span ) + { + EraseChord( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawEllipticPie( int x0, int y0, int x1, int y1, double start, double span ); + + /*! # + */ + void DrawEllipticPie( const pcl::Rect& r, double start, double span ) + { + DrawEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void StrokeEllipticPie( int x0, int y0, int x1, int y1, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeEllipticPie( const pcl::Rect& r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span, pen ); + } + + /*! # + */ + void FillEllipticPie( int x0, int y0, int x1, int y1, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillEllipticPie( const pcl::Rect& r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span, brush ); + } + + /*! # + */ + void EraseEllipticPie( int x0, int y0, int x1, int y1, double start, double span ) + { + FillEllipticPie( x0, y0, x1, y1, start, span, BackgroundBrush() ); + } + + /*! # + */ + void EraseEllipticPie( const pcl::Rect& r, double start, double span ) + { + EraseEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawPie( int xc, int yc, int r, double start, double span ) + { + DrawEllipticPie( xc-r, yc-r, xc+r+1, yc+r+1, start, span ); + } + + /*! # + */ + void DrawPie( const pcl::Point& c, int r, double start, double span ) + { + DrawPie( c.x, c.y, r, start, span ); + } + + /*! # + */ + void StrokePie( int xc, int yc, int r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticPie( xc-r, yc-r, xc+r+1, yc+r+1, start, span, pen ); + } + + /*! # + */ + void StrokePie( const pcl::Point& c, int r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokePie( c.x, c.y, r, start, span, pen ); + } + + /*! # + */ + void FillPie( int xc, int yc, int r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticPie( xc-r, yc-r, xc+r+1, yc+r+1, start, span, brush ); + } + + /*! # + */ + void FillPie( const pcl::Point& c, int r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillPie( c.x, c.y, r, start, span, brush ); + } + + /*! # + */ + void ErasePie( int xc, int yc, int r, double start, double span ) + { + FillPie( xc, yc, r, start, span, BackgroundBrush() ); + } + + /*! # + */ + void ErasePie( const pcl::Point& c, int r, double start, double span ) + { + ErasePie( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawBitmap( int x, int y, const Bitmap& ); + + /*! # + */ + void DrawBitmap( const pcl::Point& p, const Bitmap& bm ) + { + DrawBitmap( p.x, p.y, bm ); + } + + /*! # + */ + void DrawBitmapRect( int x, int y, const Bitmap&, int x0, int y0, int x1, int y1 ); + + /*! # + */ + void DrawBitmapRect( const pcl::Point& p, const Bitmap& bm, const pcl::Rect& r ) + { + DrawBitmapRect( p.x, p.y, bm, r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawScaledBitmap( int x0, int y0, int x1, int y1, const Bitmap& ); + + /*! # + */ + void DrawScaledBitmap( const pcl::Rect& r, const Bitmap& bm ) + { + DrawScaledBitmap( r.x0, r.y0, r.x1, r.y1, bm ); + } + + /*! # + */ + void DrawScaledBitmapRect( int dx0, int dy0, int dx1, int dy1, const Bitmap&, int sx0, int sy0, int sx1, int sy1 ); + + /*! # + */ + void DrawScaledBitmapRect( const pcl::Rect& dst, const Bitmap& bm, const pcl::Rect& src ) + { + DrawScaledBitmapRect( dst.x0, dst.y0, dst.x1, dst.y1, bm, src.x0, src.y0, src.x1, src.y1 ); + } + + /*! # + */ + void DrawTiledBitmap( int x0, int y0, int x1, int y1, const Bitmap&, int xOffset = 0, int yOffset = 0 ); + + /*! # + */ + void DrawTiledBitmap( const pcl::Rect& r, const Bitmap& bm, const pcl::Point& offset = pcl::Point( 0 ) ) + { + DrawTiledBitmap( r.x0, r.y0, r.x1, r.y1, bm, offset.x, offset.y ); + } + + /*! # + */ + void DrawText( int x, int y, const String& ); + + /*! # + */ + void DrawText( const pcl::Point& p, const String& s ) + { + DrawText( p.x, p.y, s ); + } + + /*! # + */ + void DrawTextRect( int x0, int y0, int x1, int y1, const String&, TextAlignmentFlags = TextAlign::Default ); + + /*! # + */ + void DrawTextRect( const pcl::Rect r, const String& s, TextAlignmentFlags a = TextAlign::Default ) + { + DrawTextRect( r.x0, r.y0, r.x1, r.y1, s, a ); + } + + /*! # + */ + pcl::Rect TextRect( int x0, int y0, int x1, int y1, const String&, TextAlignmentFlags = TextAlign::Default ) const; + + /*! # + */ + pcl::Rect TextRect( const pcl::Rect r, const String& s, TextAlignmentFlags a = TextAlign::Default ) + { + return TextRect( r.x0, r.y0, r.x1, r.y1, s, a ); + } + +private: + + Graphics( void* h ) : GraphicsContextBase( h ) + { + } + + friend class InterfaceDispatcher; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class VectorGraphics + * \brief Client-side interface to a PixInsight vector graphics context. + * + * ### TODO: Write a detailed description for %VectorGraphics. + * + * ### TODO: Include a number of examples for drawing primitives, composition + * operators, rendering performance, transformations, etc. + */ +class PCL_CLASS VectorGraphics : public GraphicsContextBase +{ +public: + + /*! + * Represents a Porter-Duff alpha composition operator. + */ + typedef GraphicsContextBase::composition_op composition_op; + + /*! + * Represents a polygon fill rule. + */ + typedef GraphicsContextBase::fill_rule fill_rule; + + /*! + * Constructs an inactive vector graphics context. + */ + VectorGraphics() = default; + + /*! + * Constructs an active vector graphics context, ready to draw on the + * specified \a control. + * + * \warning Invoking this constructor outside a Control::OnPaint() event + * handler is illegal on all supported platforms. If called without an + * active OnPaint() event, this constructor throws an Error exception. + */ + VectorGraphics( Control& control ) + : GraphicsContextBase( control ) + { + } + + /*! + * Constructs an active vector graphics context, ready to draw on the + * specified \a bitmap. + */ + VectorGraphics( Bitmap& bitmap ) + : GraphicsContextBase( bitmap ) + { + } + + /*! + * Constructs an active vector graphics context, ready to draw on the + * specified \a svg object. + */ + VectorGraphics( SVG& svg ) + : GraphicsContextBase( svg ) + { + } + + /*! + * Move constructor. + */ + VectorGraphics( VectorGraphics&& x ) + : GraphicsContextBase( std::move( x ) ) + { + } + + /*! + * Destroys a %VectorGraphics object. If this graphics context is active, it + * is terminated upon destruction. + */ + virtual ~VectorGraphics() + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + VectorGraphics& operator =( VectorGraphics&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null %VectorGraphics instance. A null + * %VectorGraphics does not correspond to an existing vector graphics + * context in the PixInsight core application. + */ + static VectorGraphics& Null(); + + /*! # + */ + pcl::DRect ClipRect() const; + + /*! # + */ + template + void SetClipRect( const R& r ) + { + SetClipRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void SetClipRect( double x0, double y0, double x1, double y1 ); + + /*! # + */ + template + void IntersectClipRect( const R& r ) + { + SetClipRect( ClipRect().Intersection( r ) ); + } + + /*! # + */ + void IntersectClipRect( double x0, double y0, double x1, double y1 ) + { + IntersectClipRect( pcl::DRect( x0, y0, x1, y1 ) ); + } + + /*! # + */ + template + void UniteClipRect( const R& r ) + { + SetClipRect( ClipRect().Union( r ) ); + } + + /*! # + */ + void UniteClipRect( double x0, double y0, double x1, double y1 ) + { + UniteClipRect( pcl::DRect( x0, y0, x1, y1 ) ); + } + + /*! # + */ + pcl::DPoint BrushOrigin() const; + + /*! # + */ + template + void SetBrushOrigin( const P& p ) + { + SetBrushOrigin( p.x, p.y ); + } + + /*! # + */ + void SetBrushOrigin( double x, double y ); + + /*! # + */ + template + void DrawPoint( const P& p ) + { + DrawPoint( p.x, p.y ); + } + + /*! # + */ + void DrawPoint( double x, double y ); + + /*! # + */ + template + void DrawLine( const P0& p0, const P1& p1 ) + { + DrawLine( p0.x, p0.y, p1.x, p1.y ); + } + + /*! # + */ + void DrawLine( double x0, double y0, double x1, double y1 ); + + /*! # + */ + void DrawRect( double x0, double y0, double x1, double y1 ); + + /*! # + */ + template + void DrawRect( const R& r ) + { + DrawRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void StrokeRect( double x0, double y0, double x1, double y1, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + template + void StrokeRect( const R& r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRect( r.x0, r.y0, r.x1, r.y1, pen ); + } + + /*! # + */ + void FillRect( double x0, double y0, double x1, double y1, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + template + void FillRect( const R& r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRect( r.x0, r.y0, r.x1, r.y1, brush ); + } + + /*! # + */ + void EraseRect( double x0, double y0, double x1, double y1 ) + { + FillRect( x0, y0, x1, y1, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseRect( const R& r ) + { + EraseRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawRoundedRect( double x0, double y0, double x1, double y1, double rx, double ry ); + + /*! # + */ + void DrawRoundedRect( double x0, double y0, double x1, double y1, double rxy = 25 ) + { + DrawRoundedRect( x0, y0, x1, y1, rxy, rxy ); + } + + /*! # + */ + template + void DrawRoundedRect( const R& r, double rx, double ry ) + { + DrawRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry ); + } + + /*! # + */ + template + void DrawRoundedRect( const R& r, double rxy = 25 ) + { + DrawRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy ); + } + + /*! # + */ + void StrokeRoundedRect( double x0, double y0, double x1, double y1, double rx, double ry, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + void StrokeRoundedRect( double x0, double y0, double x1, double y1, double rxy = 25, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( x0, y0, x1, y1, rxy, rxy, pen ); + } + + /*! # + */ + template + void StrokeRoundedRect( const R& r, double rx, double ry, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry, pen ); + } + + /*! # + */ + template + void StrokeRoundedRect( const R& r, double rxy = 25, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy, pen ); + } + + /*! # + */ + void FillRoundedRect( double x0, double y0, double x1, double y1, double rx, double ry, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + void FillRoundedRect( double x0, double y0, double x1, double y1, double rxy = 25, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( x0, y0, x1, y1, rxy, rxy, brush ); + } + + /*! # + */ + template + void FillRoundedRect( const R& r, double rx, double ry, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry, brush ); + } + + /*! # + */ + template + void FillRoundedRect( const R& r, double rxy = 25, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy, brush ); + } + + /*! # + */ + void EraseRoundedRect( double x0, double y0, double x1, double y1, double rx, double ry ) + { + FillRoundedRect( x0, y0, x1, y1, rx, ry, BackgroundBrush() ); + } + + /*! # + */ + void EraseRoundedRect( double x0, double y0, double x1, double y1, double rxy = 25 ) + { + EraseRoundedRect( x0, y0, x1, y1, rxy, rxy ); + } + + /*! # + */ + template + void EraseRoundedRect( const R& r, double rx, double ry ) + { + EraseRoundedRect( r.x0, r.y0, r.x1, r.y1, rx, ry ); + } + + /*! # + */ + template + void EraseRoundedRect( const R& r, double rxy = 25 ) + { + EraseRoundedRect( r.x0, r.y0, r.x1, r.y1, rxy, rxy ); + } + + /*! # + */ + void DrawEllipse( double x0, double y0, double x1, double y1 ); + + /*! # + */ + template + void DrawEllipse( const R& r ) + { + DrawEllipse( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void StrokeEllipse( double x0, double y0, double x1, double y1, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + template + void StrokeEllipse( const R& r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipse( r.x0, r.y0, r.x1, r.y1, pen ); + } + + /*! # + */ + void FillEllipse( double x0, double y0, double x1, double y1, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + template + void FillEllipse( const R& r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipse( r.x0, r.y0, r.x1, r.y1, brush ); + } + + /*! # + */ + void EraseEllipse( double x0, double y0, double x1, double y1 ) + { + FillEllipse( x0, y0, x1, y1, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseEllipse( const R& r ) + { + EraseEllipse( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawCircle( double xc, double yc, double r ) + { + DrawEllipse( xc-r, yc-r, xc+r, yc+r ); + } + + /*! # + */ + template + void DrawCircle( const P& c, double r ) + { + DrawCircle( c.x, c.y, r ); + } + + /*! # + */ + void StrokeCircle( double xc, double yc, double r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipse( xc-r, yc-r, xc+r, yc+r, pen ); + } + + /*! # + */ + template + void StrokeCircle( const P& c, double r, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeCircle( c.x, c.y, r, pen ); + } + + /*! # + */ + void FillCircle( double xc, double yc, double r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipse( xc-r, yc-r, xc+r, yc+r, brush ); + } + + /*! # + */ + template + void FillCircle( const P& c, double r, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillCircle( c.x, c.y, r, brush ); + } + + /*! # + */ + void EraseCircle( double xc, double yc, double r ) + { + FillCircle( xc, yc, r, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseCircle( const P& c, double r ) + { + EraseCircle( c.x, c.y, r ); + } + + /*! # + */ + void DrawPolygon( const pcl::DPoint* p, size_type n, fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void DrawPolygon( const C& c, fill_rule rule = FillRule::OddEven ) + { + DrawPolygon( c.Begin(), c.Length(), rule ); + } + + /*! # + */ + void StrokePolygon( const pcl::DPoint* p, size_type n, const pcl::Pen& pen = pcl::Pen::Null(), fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void StrokePolygon( const C& c, const pcl::Pen& pen = pcl::Pen::Null(), fill_rule rule = FillRule::OddEven ) + { + StrokePolygon( c.Begin(), c.Length(), pen, rule ); + } + + /*! # + */ + void FillPolygon( const pcl::DPoint* p, size_type n, const pcl::Brush& brush = pcl::Brush::Null(), fill_rule rule = FillRule::OddEven ); + + /*! # + */ + template + void FillPolygon( const C& c, const pcl::Brush& brush = pcl::Brush::Null(), fill_rule rule = FillRule::OddEven ) + { + FillPolygon( c.Begin(), c.Length(), brush, rule ); + } + + /*! # + */ + void ErasePolygon( const pcl::DPoint* p, size_type n, fill_rule rule = FillRule::OddEven ) + { + FillPolygon( p, n, BackgroundBrush(), rule ); + } + + /*! # + */ + template + void ErasePolygon( const C& c, fill_rule rule = FillRule::OddEven ) + { + ErasePolygon( c.Begin(), c.Length(), rule ); + } + + /*! # + */ + void DrawPolyline( const pcl::DPoint*, size_type n ); + + /*! # + */ + template + void DrawPolyline( const C& c ) + { + DrawPolyline( c.Begin(), c.Length() ); + } + + /*! # + */ + void DrawEllipticArc( double x0, double y0, double x1, double y1, double start, double span ); + + /*! # + */ + template + void DrawEllipticArc( const R& r, double start, double span ) + { + DrawEllipticArc( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawArc( double xc, double yc, double r, double start, double span ) + { + DrawEllipticArc( xc-r, yc-r, xc+r, yc+r, start, span ); + } + + /*! # + */ + template + void DrawArc( const P& c, double r, double start, double span ) + { + DrawArc( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawEllipticChord( double x0, double y0, double x1, double y1, double start, double span ); + + /*! # + */ + template + void DrawEllipticChord( const R& r, double start, double span ) + { + DrawEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void StrokeEllipticChord( double x0, double y0, double x1, double y1, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + template + void StrokeEllipticChord( const R& r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span, pen ); + } + + /*! # + */ + void FillEllipticChord( double x0, double y0, double x1, double y1, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + template + void FillEllipticChord( const R& r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span, brush ); + } + + /*! # + */ + void EraseEllipticChord( double x0, double y0, double x1, double y1, double start, double span ) + { + FillEllipticChord( x0, y0, x1, y1, start, span, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseEllipticChord( const R& r, double start, double span ) + { + EraseEllipticChord( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawChord( double xc, double yc, double r, double start, double span ) + { + DrawEllipticChord( xc-r, yc-r, xc+r, yc+r, start, span ); + } + + /*! # + */ + template + void DrawChord( const P& c, double r, double start, double span ) + { + DrawChord( c.x, c.y, r, start, span ); + } + + /*! # + */ + void StrokeChord( double xc, double yc, double r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticChord( xc-r, yc-r, xc+r, yc+r, start, span, pen ); + } + + /*! # + */ + template + void StrokeChord( const P& c, double r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeChord( c.x, c.y, r, start, span, pen ); + } + + /*! # + */ + void FillChord( double xc, double yc, double r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticChord( xc-r, yc-r, xc+r, yc+r, start, span, brush ); + } + + /*! # + */ + template + void FillChord( const P& c, double r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillChord( c.x, c.y, r, start, span, brush ); + } + + /*! # + */ + void EraseChord( double xc, double yc, double r, double start, double span ) + { + FillChord( xc, yc, r, start, span, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseChord( const P& c, double r, double start, double span ) + { + EraseChord( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawEllipticPie( double x0, double y0, double x1, double y1, double start, double span ); + + /*! # + */ + template + void DrawEllipticPie( const R& r, double start, double span ) + { + DrawEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void StrokeEllipticPie( double x0, double y0, double x1, double y1, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ); + + /*! # + */ + template + void StrokeEllipticPie( const R& r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span, pen ); + } + + /*! # + */ + void FillEllipticPie( double x0, double y0, double x1, double y1, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ); + + /*! # + */ + template + void FillEllipticPie( const R& r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span, brush ); + } + + /*! # + */ + void EraseEllipticPie( double x0, double y0, double x1, double y1, double start, double span ) + { + FillEllipticPie( x0, y0, x1, y1, start, span, BackgroundBrush() ); + } + + /*! # + */ + template + void EraseEllipticPie( const R& r, double start, double span ) + { + EraseEllipticPie( r.x0, r.y0, r.x1, r.y1, start, span ); + } + + /*! # + */ + void DrawPie( double xc, double yc, double r, double start, double span ) + { + DrawEllipticPie( xc-r, yc-r, xc+r, yc+r, start, span ); + } + + /*! # + */ + template + void DrawPie( const P& c, double r, double start, double span ) + { + DrawPie( c.x, c.y, r, start, span ); + } + + /*! # + */ + void StrokePie( double xc, double yc, double r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokeEllipticPie( xc-r, yc-r, xc+r, yc+r, start, span, pen ); + } + + /*! # + */ + template + void StrokePie( const P& c, double r, double start, double span, const pcl::Pen& pen = pcl::Pen::Null() ) + { + StrokePie( c.x, c.y, r, start, span, pen ); + } + + /*! # + */ + void FillPie( double xc, double yc, double r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillEllipticPie( xc-r, yc-r, xc+r, yc+r, start, span, brush ); + } + + /*! # + */ + template + void FillPie( const P& c, double r, double start, double span, const pcl::Brush& brush = pcl::Brush::Null() ) + { + FillPie( c.x, c.y, r, start, span, brush ); + } + + /*! # + */ + void ErasePie( double xc, double yc, double r, double start, double span ) + { + FillPie( xc, yc, r, start, span, BackgroundBrush() ); + } + + /*! # + */ + template + void ErasePie( const P& c, double r, double start, double span ) + { + ErasePie( c.x, c.y, r, start, span ); + } + + /*! # + */ + void DrawBitmap( double x, double y, const Bitmap& ); + + /*! # + */ + template + void DrawBitmap( const P& p, const Bitmap& bm ) + { + DrawBitmap( p.x, p.y, bm ); + } + + /*! # + */ + void DrawBitmapRect( double x, double y, const Bitmap&, double x0, double y0, double x1, double y1 ); + + /*! # + */ + template + void DrawBitmapRect( const P& p, const Bitmap& bm, const R& r ) + { + DrawBitmapRect( p.x, p.y, bm, r.x0, r.y0, r.x1, r.y1 ); + } + + /*! # + */ + void DrawScaledBitmap( double x0, double y0, double x1, double y1, const Bitmap& ); + + /*! # + */ + template + void DrawScaledBitmap( const R& r, const Bitmap& bm ) + { + DrawScaledBitmap( r.x0, r.y0, r.x1, r.y1, bm ); + } + + /*! # + */ + void DrawScaledBitmapRect( double dx0, double dy0, double dx1, double dy1, const Bitmap&, double sx0, double sy0, double sx1, double sy1 ); + + /*! # + */ + template + void DrawScaledBitmapRect( const R1& dst, const Bitmap& bm, const R2& src ) + { + DrawScaledBitmapRect( dst.x0, dst.y0, dst.x1, dst.y1, bm, src.x0, src.y0, src.x1, src.y1 ); + } + + /*! # + */ + void DrawTiledBitmap( double x0, double y0, double x1, double y1, const Bitmap&, double xOffset = 0, double yOffset = 0 ); + + /*! # + */ + template + void DrawTiledBitmap( const R& r, const Bitmap& bm, const P& offset = P() ) + { + DrawTiledBitmap( r.x0, r.y0, r.x1, r.y1, bm, offset.x, offset.y ); + } + + /*! # + */ + void DrawText( double x, double y, const String& ); + + /*! # + */ + template + void DrawText( const P& p, const String& s ) + { + DrawText( p.x, p.y, s ); + } + + /*! # + */ + void DrawTextRect( double x0, double y0, double x1, double y1, const String&, TextAlignmentFlags = TextAlign::Default ); + + /*! # + */ + template + void DrawTextRect( const R& r, const String& s, TextAlignmentFlags a = TextAlign::Default ) + { + DrawTextRect( r.x0, r.y0, r.x1, r.y1, s, a ); + } + + /*! # + */ + pcl::DRect TextRect( double x0, double y0, double x1, double y1, const String&, TextAlignmentFlags = TextAlign::Default ) const; + + /*! # + */ + template + pcl::DRect TextRect( const R& r, const String& s, TextAlignmentFlags a = TextAlign::Default ) + { + return TextRect( r.x0, r.y0, r.x1, r.y1, s, a ); + } + +private: + + VectorGraphics( void* h ) : GraphicsContextBase( h ) + { + } + + friend class InterfaceDispatcher; +}; + +// ---------------------------------------------------------------------------- + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Graphics_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Graphics.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GridInterpolation.h b/3rdparty/include/pcl/GridInterpolation.h new file mode 100644 index 0000000..b3a7b49 --- /dev/null +++ b/3rdparty/include/pcl/GridInterpolation.h @@ -0,0 +1,987 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GridInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GridInterpolation_h +#define __PCL_GridInterpolation_h + +/// \file pcl/GridInterpolation.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION +# include +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GridInterpolation + * \brief Discretized scalar surface interpolation/approximation in two + * dimensions. + * + * This class performs the same tasks as a surface interpolation device, such + * as SurfaceSpline or ShepardInterpolation, but allows for much faster + * interpolation with negligible accuracy loss in most applications. + * + * Interpolation from discrete grids can be orders of magnitude faster than + * direct evaluation of surface interpolation/approximation devices, depending + * on the number of input data points. + */ +class PCL_CLASS GridInterpolation : public ParallelProcess +{ +public: + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + GridInterpolation() = default; + + /*! + * Copy constructor. + */ + GridInterpolation( const GridInterpolation& ) = default; + + /*! + * Move constructor. + */ + GridInterpolation( GridInterpolation&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + GridInterpolation& operator =( const GridInterpolation& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GridInterpolation& operator =( GridInterpolation&& ) = default; + + /*! + * Initializes this %GridInterpolation object for the specified input data + * and interpolation parameters. + * + * \param rect Reference rectangle. Interpolation will be initialized + * within the boundaries of this rectangle at discrete + * \a delta coordinate intervals. + * + * \param delta Grid distance for calculation of discrete function values. + * Must be > 0. + * + * \param S Reference to a surface interpolation/approximation object + * that will be used to evaluate function values at discrete + * coordinate intervals. This object must have been + * previously initialized and must be valid. + * + * \param verbose If true, this function will write information to the + * standard PixInsight console to provide some feedback to + * the user during the (potentially long) initialization + * process. If false, no feedback will be provided. + * + * The template parameter SI must provide a member function of the form: + * + * double SI::operator ()( int x, int y ) const + * + * or an equivalent operator member function whose return value can be + * statically casted to double, with two by-value parameters that can be + * statically casted from the int type. This function will be called + * multiple times to evaluate the approximated surface at discrete grid + * coordinate pairs {x,y}. The implementation of this member function must + * be thread-safe if parallel processing has been enabled and allowed for + * this object. + * + * If parallel processing is allowed, this function executes the + * initialization process using multiple concurrent threads. See + * EnableParallelProcessing() for additional information. + */ + template + void Initialize( const Rect& rect, int delta, const SI& S, bool verbose = true ) + { + PCL_PRECONDITION( rect.IsRect() ) + PCL_PRECONDITION( delta > 0 ) + + m_rect = rect.Ordered(); + if ( !m_rect.IsRect() ) + throw Error( "GridInterpolation::Initialize(): Empty interpolation space." ); + + m_delta = Abs( delta ); + if ( m_delta == 0 ) + throw Error( "GridInterpolation::Initialize(): Zero grid distance." ); + + int w = rect.Width(); + int h = rect.Height(); + int rows = 1 + h/m_delta + ((h%m_delta) ? 1 : 0); + int cols = 1 + w/m_delta + ((w%m_delta) ? 1 : 0); + + m_G = DMatrix( rows, cols ); + + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( "Building surface interpolation grid", rows ); + } +#endif + + Array L = Thread::OptimalThreadLoads( rows, + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData data( monitor, rows ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new GridInitializationThread( data, *this, S, n, n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, data ); + threads.Destroy(); + + m_I.Initialize( m_G.Begin(), cols, rows ); + } + + /*! + * Initializes this %GridInterpolation object with a prescribed discrete + * interpolation matrix. + * + * \param rect Reference rectangle. Interpolation will be initialized + * within the boundaries of this rectangle at discrete + * \a delta coordinate intervals. + * + * \param delta Grid distance for calculation of discrete function values. + * Must be > 0. + * + * \param G interpolation matrix. + * + * The specified \a G matrix must have \a n rows and \a m columns, which are + * given by: + * + * n = 1 + Ceil( rect.Height()/delta )\n + * m = 1 + Ceil( rect.Width()/delta ) + * + * If the dimensions of the specified matrix are different from the values + * defined above, this function will throw an Error exception. + * + * Matrix elements must be function values computed at discrete \a delta + * intervals within \a rect boundaries. For a given matrix row \a r and + * matrix column \a c, the corresponding matrix element must be a function + * value computed at coordinates {\a x,\a y} given by: + * + * x = rect.x0 + c*delta\n + * y = rect.y0 + r*delta + */ + void Initialize( const Rect& rect, int delta, const DMatrix& G ) + { + PCL_PRECONDITION( rect.IsRect() ) + PCL_PRECONDITION( delta > 0 ) + + m_rect = rect.Ordered(); + if ( !m_rect.IsRect() ) + throw Error( "GridInterpolation::Initialize(): Empty interpolation space." ); + + m_delta = Abs( delta ); + if ( m_delta == 0 ) + throw Error( "GridInterpolation::Initialize(): Zero grid distance." ); + + int w = rect.Width(); + int h = rect.Height(); + int rows = 1 + h/m_delta + ((h%m_delta) ? 1 : 0); + int cols = 1 + w/m_delta + ((w%m_delta) ? 1 : 0); + if ( G.Rows() != rows || G.Cols() != cols ) + throw Error( "GridInterpolation::Initialize(): Invalid matrix dimensions." ); + + m_G = G; + m_I.Initialize( m_G.Begin(), cols, rows ); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return !m_G.IsEmpty(); + } + + /*! + * Deallocates internal structures, yielding an empty object that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_I.Clear(); + m_G.Clear(); + } + + /*! + * Returns the current interpolation reference rectangle. See Initialize() + * for more information. + */ + const Rect& ReferenceRect() const + { + return m_rect; + } + + /*! + * Returns the current grid distance for calculation of discrete function + * values. See Initialize() for more information. + */ + int Delta() const + { + return m_delta; + } + + /*! + * Returns a reference to the discrete matrix used for interpolation of + * function values. + * + * If this object has not been initialized, this member function returns a + * reference to an empty matrix. + */ + const DMatrix& InterpolationMatrix() const + { + return m_G; + } + + /*! + * Returns an interpolated function value at the specified coordinates. + */ + template + double operator ()( T x, T y ) const + { + double fx = (double( x ) - m_rect.x0)/m_delta; + double fy = (double( y ) - m_rect.y0)/m_delta; + return m_I( fx, fy ); + } + + /*! + * Returns an interpolated function value at \a p.x and \a p.y coordinates. + */ + template + double operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /*! + * N.B.: Here we need a smooth interpolation function without negative + * lobes, in order to prevent small-scale oscillations. Other options are + * BilinearInterpolation and CubicBSplineFilter. + */ + typedef BicubicBSplineInterpolation grid_interpolation; + + Rect m_rect; + int m_delta; + DMatrix m_G; + grid_interpolation m_I; + + template + class GridInitializationThread : public Thread + { + public: + + GridInitializationThread( const AbstractImage::ThreadData& data, + GridInterpolation& grid, const SI& surface, int startRow, int endRow ) + : m_data( data ) + , m_grid( grid ) + , m_surface( surface ) + , m_startRow( startRow ) + , m_endRow( endRow ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startRow, y = m_grid.m_rect.y0 + i*m_grid.m_delta; i < m_endRow; ++i, y += m_grid.m_delta ) + { + for ( int j = 0, x = m_grid.m_rect.x0; j < m_grid.m_G.Cols(); ++j, x += m_grid.m_delta ) + m_grid.m_G[i][j] = m_surface( x, y ); + + UPDATE_THREAD_MONITOR( 32 ) + } + } + + private: + + const AbstractImage::ThreadData& m_data; + GridInterpolation& m_grid; + const SI& m_surface; + int m_startRow, m_endRow; + }; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PointGridInterpolation + * \brief Discretized vector surface interpolation/approximation in two + * dimensions. + * + * This class performs the same tasks as a point surface interpolation device, + * such as PointSurfaceSpline or PointShepardInterpolation, but allows for much + * faster interpolation with negligible accuracy loss in most applications. + * + * Interpolation from discrete grids can be orders of magnitude faster than + * direct evaluation of surface interpolation/approximation devices, depending + * on the number of input data points. + */ +class PCL_CLASS PointGridInterpolation : public ParallelProcess +{ +public: + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + PointGridInterpolation() = default; + + /*! + * Copy constructor. + */ + PointGridInterpolation( const PointGridInterpolation& ) = default; + + /*! + * Move constructor. + */ + PointGridInterpolation( PointGridInterpolation&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PointGridInterpolation& operator =( const PointGridInterpolation& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PointGridInterpolation& operator =( PointGridInterpolation&& ) = default; + + /*! + * Initializes a %PointGridInterpolation object with a point surface + * interpolation/approximation. + * + * \param rect Reference rectangle. Interpolation will be initialized + * within the boundaries of this rectangle at discrete + * \a delta coordinate intervals. + * + * \param delta Grid distance for calculation of discrete function values. + * Must be > 0. + * + * \param PS Reference to a point surface interpolation/approximation + * object that will be used to evaluate function values at + * discrete coordinate intervals. This object must have been + * previously initialized and must be valid. + * + * \param verbose If true, this function will write information to the + * standard PixInsight console to provide some feedback to + * the user during the (potentially long) initialization + * process. If false, no feedback will be provided. + * + * The template parameter PSI must provide a member function of the form: + * + * DPoint PSI::operator ()( int x, int y ) const + * + * or an equivalent operator member function whose return value can be + * statically casted to DPoint, with two by-value parameters that can be + * statically casted from the int type. This function will be called + * multiple times to evaluate the approximated surface at discrete grid + * coordinate pairs {x,y}. The implementation of this member function must + * be thread-safe if parallel processing has been enabled and allowed for + * this object. + * + * If parallel processing is allowed, this function executes the + * initialization process using multiple concurrent threads. See + * EnableParallelProcessing() for additional information. + */ + template + void Initialize( const Rect& rect, int delta, const PSI& PS, bool verbose = true ) + { + PCL_PRECONDITION( rect.IsRect() ) + PCL_PRECONDITION( delta > 0 ) + + m_rect = rect.Ordered(); + if ( !m_rect.IsRect() ) + throw Error( "PointGridInterpolation::Initialize(): Empty interpolation space." ); + + m_delta = Abs( delta ); + if ( m_delta == 0 ) + throw Error( "PointGridInterpolation::Initialize(): Zero grid distance." ); + + int w = rect.Width(); + int h = rect.Height(); + int rows = 1 + h/m_delta + ((h%m_delta) ? 1 : 0); + int cols = 1 + w/m_delta + ((w%m_delta) ? 1 : 0); + + m_Gx = DMatrix( rows, cols ); + m_Gy = DMatrix( rows, cols ); + + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( "Building surface interpolation grid", rows ); + } +#endif + + Array L = Thread::OptimalThreadLoads( rows, + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData data( monitor, rows ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new GridInitializationThread( data, *this, PS, n, n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, data ); + threads.Destroy(); + + m_Ix.Initialize( m_Gx.Begin(), cols, rows ); + m_Iy.Initialize( m_Gy.Begin(), cols, rows ); + } + + /*! + * Initializes a %PointGridInterpolation object with separate surface + * interpolations/approximations for the X and Y directions. + * + * \param rect Reference rectangle. Interpolation will be initialized + * within the boundaries of this rectangle at discrete + * \a delta coordinate intervals. + * + * \param delta Grid distance for calculation of discrete function values. + * Must be > 0. + * + * \param Sx Reference to a surface interpolation/approximation object + * that will be used to evaluate function values at discrete + * coordinate intervals on the X axis. This object must have + * been previously initialized and must be valid. + * + * \param Sy Reference to a surface interpolation/approximation object + * that will be used to evaluate function values at discrete + * coordinate intervals on the Y axis. This object must have + * been previously initialized and must be valid. + * + * \param verbose If true, this function will write information to the + * standard PixInsight console to provide some feedback to + * the user during the (potentially long) initialization + * process. If false, no feedback will be provided. + * + * The template parameter SI must provide a member function of the form: + * + * double SI::operator ()( int x, int y ) const + * + * or an equivalent operator member function whose return value can be + * statically casted to double, with two by-value parameters that can be + * statically casted from the int type. This function will be called + * multiple times for the \a Sx and \a Sy objects to evaluate the + * approximated surface at discrete grid coordinate pairs {x,y}, + * respectively on the X and Y plane directions. The implementation of this + * member function must be thread-safe if parallel processing has been + * enabled and allowed for this object. + * + * If parallel processing is allowed, this function executes the + * initialization process using multiple concurrent threads. See + * EnableParallelProcessing() for additional information. + */ + template + void Initialize( const Rect& rect, int delta, const SI& Sx, const SI& Sy, bool verbose = true ) + { + PCL_PRECONDITION( rect.IsRect() ) + PCL_PRECONDITION( delta > 0 ) + + m_rect = rect.Ordered(); + if ( !m_rect.IsRect() ) + throw Error( "PointGridInterpolation::Initialize(): Empty interpolation space." ); + + m_delta = Abs( delta ); + if ( m_delta == 0 ) + throw Error( "PointGridInterpolation::Initialize(): Zero grid distance." ); + + int w = rect.Width(); + int h = rect.Height(); + int rows = 1 + h/m_delta + ((h%m_delta) ? 1 : 0); + int cols = 1 + w/m_delta + ((w%m_delta) ? 1 : 0); + + m_Gx = DMatrix( rows, cols ); + m_Gy = DMatrix( rows, cols ); + + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( "Building surface interpolation grid", rows ); + } +#endif + + Array L = Thread::OptimalThreadLoads( rows, + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData data( monitor, rows ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new GridInitializationXYThread( data, *this, Sx, Sy, n, n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, data ); + threads.Destroy(); + + m_Ix.Initialize( m_Gx.Begin(), cols, rows ); + m_Iy.Initialize( m_Gy.Begin(), cols, rows ); + } + + /*! + * Initializes this %PointGridInterpolation object with prescribed + * interpolation matrices. + * + * \param rect Reference rectangle. Interpolation will be initialized + * within the boundaries of this rectangle at discrete + * \a delta coordinate intervals. + * + * \param delta Grid distance for calculation of discrete function values. + * Must be > 0. + * + * \param Gx interpolation matrix in the X direction. + * + * \param Gy Interpolation matrix in the Y direction. + * + * Both \a Gx and \a Gy matrices must have \a n rows and \a m columns, which + * are given by: + * + * n = 1 + Ceil( rect.Height()/delta )\n + * m = 1 + Ceil( rect.Width()/delta ) + * + * If one or both matrices have different dimensions, this function will + * throw an Error exception. + * + * Matrix elements must be function values computed at discrete \a delta + * intervals within \a rect boundaries. For a given matrix row \a r and + * matrix column \a c, the corresponding matrix element must be a function + * value computed at coordinates {\a x,\a y} given by: + * + * x = rect.x0 + c*delta\n + * y = rect.y0 + r*delta + */ + void Initialize( const Rect& rect, int delta, const DMatrix& Gx, const DMatrix& Gy ) + { + PCL_PRECONDITION( rect.IsRect() ) + PCL_PRECONDITION( delta > 0 ) + + m_rect = rect.Ordered(); + if ( !m_rect.IsRect() ) + throw Error( "PointGridInterpolation::Initialize(): Empty interpolation space." ); + + m_delta = Abs( delta ); + if ( m_delta == 0 ) + throw Error( "PointGridInterpolation::Initialize(): Zero grid distance." ); + + int w = rect.Width(); + int h = rect.Height(); + int rows = 1 + h/m_delta + ((h%m_delta) ? 1 : 0); + int cols = 1 + w/m_delta + ((w%m_delta) ? 1 : 0); + if ( Gx.Rows() != rows || Gx.Cols() != cols || Gy.Rows() != rows || Gy.Cols() != cols ) + throw Error( "PointGridInterpolation::Initialize(): Invalid matrix dimensions." ); + + m_Gx = Gx; + m_Gy = Gy; + m_Ix.Initialize( m_Gx.Begin(), cols, rows ); + m_Iy.Initialize( m_Gy.Begin(), cols, rows ); + } + + /*! + * + */ + template + void ApplyLocalModel( const PSI& PS, + const String& message = "Applying local interpolation model", + bool verbose = true ) + { + PCL_PRECONDITION( IsValid() ) + if ( !IsValid() ) + throw Error( "PointGridInterpolation::ApplyLocalModel(): Uninitialized interpolation." ); + + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( message, m_Gx.Rows() ); + } +#endif + + Array L = Thread::OptimalThreadLoads( m_Gx.Rows(), + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData data( monitor, m_Gx.Rows() ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new LocalModelThread( data, *this, PS, n, n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, data ); + threads.Destroy(); + } + + /*! + * + */ + template + void ApplyLocalModel( const SI& Sx, const SI& Sy, + const String& message = "Applying local interpolation model", + bool verbose = true ) + { + PCL_PRECONDITION( IsValid() ) + if ( !IsValid() ) + throw Error( "PointGridInterpolation::ApplyLocalModel(): Uninitialized interpolation." ); + + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( message, m_Gx.Rows() ); + } +#endif + + Array L = Thread::OptimalThreadLoads( m_Gx.Rows(), + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData data( monitor, m_Gx.Rows() ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new LocalModelThread2( data, *this, Sx, Sy, n, n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, data ); + threads.Destroy(); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return !m_Gx.IsEmpty() && !m_Gy.IsEmpty(); + } + + /*! + * Deallocates internal structures, yielding an empty object that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_Ix.Clear(); + m_Iy.Clear(); + m_Gx.Clear(); + m_Gy.Clear(); + } + + /*! + * Returns the current interpolation reference rectangle. See Initialize() + * for more information. + * + * The returned rectangle is ordered (see pcl::IsOrderedRect()). + */ + const Rect& ReferenceRect() const + { + return m_rect; + } + + /*! + * Returns the current grid distance for calculation of discrete function + * values. See Initialize() for more information. + */ + int Delta() const + { + return m_delta; + } + + /*! + * Returns a reference to the discrete matrix used for interpolation of + * function values in the X direction. + * + * If this object has not been initialized, this member function returns a + * reference to an empty matrix. + */ + const DMatrix& XInterpolationMatrix() const + { + return m_Gx; + } + + /*! + * Returns a reference to the discrete matrix used for interpolation of + * function values in the Y direction. + * + * If this object has not been initialized, this member function returns a + * reference to an empty matrix. + */ + const DMatrix& YInterpolationMatrix() const + { + return m_Gy; + } + + /*! + * Returns an interpolated point at the specified coordinates. + */ + template + DPoint operator ()( T x, T y ) const + { + PCL_PRECONDITION( IsValid() ) + double fx = (double( x ) - m_rect.x0)/m_delta; + double fy = (double( y ) - m_rect.y0)/m_delta; + return DPoint( m_Ix( fx, fy ), m_Iy( fx, fy ) ); + } + + /*! + * Returns an interpolated point at the given \a p.x and \a p.y coordinates. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /*! + * N.B.: Here we need a smooth interpolation function without negative + * lobes, in order to prevent small-scale oscillations. Other options are + * BilinearInterpolation and CubicBSplineFilter. + */ + typedef BicubicBSplineInterpolation grid_interpolation; + + Rect m_rect; + int m_delta; + DMatrix m_Gx, m_Gy; + grid_interpolation m_Ix, m_Iy; + + template + class GridInitializationThread : public Thread + { + public: + + GridInitializationThread( const AbstractImage::ThreadData& data, + PointGridInterpolation& grid, const PSI& surface, int startRow, int endRow ) + : m_data( data ) + , m_grid( grid ) + , m_surface( surface ) + , m_startRow( startRow ) + , m_endRow( endRow ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startRow, y = m_grid.m_rect.y0 + i*m_grid.m_delta; i < m_endRow; ++i, y += m_grid.m_delta ) + { + for ( int j = 0, x = m_grid.m_rect.x0; j < m_grid.m_Gx.Cols(); ++j, x += m_grid.m_delta ) + { + DPoint p = m_surface( x, y ); + m_grid.m_Gx[i][j] = p.x; + m_grid.m_Gy[i][j] = p.y; + } + + UPDATE_THREAD_MONITOR( 32 ) + } + } + + private: + + const AbstractImage::ThreadData& m_data; + PointGridInterpolation& m_grid; + const PSI& m_surface; + int m_startRow, m_endRow; + }; + + template + class GridInitializationXYThread : public Thread + { + public: + + GridInitializationXYThread( const AbstractImage::ThreadData& data, + PointGridInterpolation& grid, + const SI& surfaceX, const SI& surfaceY, int startRow, int endRow ) + : m_data( data ) + , m_grid( grid ) + , m_surfaceX( surfaceX ) + , m_surfaceY( surfaceY ) + , m_startRow( startRow ) + , m_endRow( endRow ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startRow, y = m_grid.m_rect.y0 + i*m_grid.m_delta; i < m_endRow; ++i, y += m_grid.m_delta ) + { + for ( int j = 0, x = m_grid.m_rect.x0; j < m_grid.m_Gx.Cols(); ++j, x += m_grid.m_delta ) + { + m_grid.m_Gx[i][j] = m_surfaceX( x, y ); + m_grid.m_Gy[i][j] = m_surfaceY( x, y ); + } + + UPDATE_THREAD_MONITOR( 32 ) + } + } + + private: + + const AbstractImage::ThreadData& m_data; + PointGridInterpolation& m_grid; + const SI& m_surfaceX; + const SI& m_surfaceY; + int m_startRow, m_endRow; + }; + + template + class LocalModelThread : public Thread + { + public: + + LocalModelThread( const AbstractImage::ThreadData& data, + PointGridInterpolation& grid, const PSI& model, int startRow, int endRow ) + : m_data( data ) + , m_grid( grid ) + , m_model( model ) + , m_startRow( startRow ) + , m_endRow( endRow ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startRow, y = m_grid.m_rect.y0 + i*m_grid.m_delta; i < m_endRow; ++i, y += m_grid.m_delta ) + { + for ( int j = 0, x = m_grid.m_rect.x0; j < m_grid.m_Gx.Cols(); ++j, x += m_grid.m_delta ) + { + DPoint d = m_model( x, y ); + m_grid.m_Gx[i][j] += d.x; + m_grid.m_Gy[i][j] += d.y; + } + + UPDATE_THREAD_MONITOR( 32 ) + } + } + + private: + + const AbstractImage::ThreadData& m_data; + PointGridInterpolation& m_grid; + const PSI& m_model; + int m_startRow, m_endRow; + }; + + template + class LocalModelThread2 : public Thread + { + public: + + LocalModelThread2( const AbstractImage::ThreadData& data, + PointGridInterpolation& grid, const SI& modelX, const SI& modelY, int startRow, int endRow ) + : m_data( data ) + , m_grid( grid ) + , m_modelX( modelX ) + , m_modelY( modelY ) + , m_startRow( startRow ) + , m_endRow( endRow ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startRow, y = m_grid.m_rect.y0 + i*m_grid.m_delta; i < m_endRow; ++i, y += m_grid.m_delta ) + { + for ( int j = 0, x = m_grid.m_rect.x0; j < m_grid.m_Gx.Cols(); ++j, x += m_grid.m_delta ) + { + m_grid.m_Gx[i][j] += m_modelX( x, y ); + m_grid.m_Gy[i][j] += m_modelY( x, y ); + } + + UPDATE_THREAD_MONITOR( 32 ) + } + } + + private: + + const AbstractImage::ThreadData& m_data; + PointGridInterpolation& m_grid; + const SI& m_modelX, m_modelY; + int m_startRow, m_endRow; + }; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_GridInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GridInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/GroupBox.h b/3rdparty/include/pcl/GroupBox.h new file mode 100644 index 0000000..4d4f8a7 --- /dev/null +++ b/3rdparty/include/pcl/GroupBox.h @@ -0,0 +1,175 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/GroupBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_GroupBox_h +#define __PCL_GroupBox_h + +/// \file pcl/GroupBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GroupBox + * \brief Client-side interface to a PixInsight %GroupBox control + * + * ### TODO: Write a detailed description for %GroupBox. + */ +class PCL_CLASS GroupBox : public Control +{ +public: + + /*! + * Constructs a %GroupBox object with the specified \a title, as a child + * control of \a parent. + */ + GroupBox( const String& title = String(), Control& parent = Control::Null() ); + + /*! + * Destroys a %GroupBox object. + */ + virtual ~GroupBox() + { + } + + /*! # + */ + String Title() const; + + /*! # + */ + void SetTitle( const String& ); + + /*! # + */ + bool HasTitleCheckBox() const; + + /*! # + */ + void EnableTitleCheckBox( bool = true ); + + /*! # + */ + void DisableTitleCheckBox( bool disable = true ) + { + EnableTitleCheckBox( !disable ); + } + + /*! # + */ + bool IsChecked() const; + + /*! # + */ + void SetChecked( bool = true ); + + /*! # + */ + void Check() + { + SetChecked( true ); + } + + /*! # + */ + void Uncheck() + { + SetChecked( false ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnCheck( GroupBox& sender, bool checked ); + + /*! # + */ + typedef void (Control::*check_event_handler)( GroupBox& sender, bool checked ); + + /*! # + */ + void OnCheck( check_event_handler, Control& ); + +private: + + struct EventHandlers + { + check_event_handler onCheck = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class GroupBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_GroupBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/GroupBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/HammerAitoffProjection.h b/3rdparty/include/pcl/HammerAitoffProjection.h new file mode 100644 index 0000000..ac98477 --- /dev/null +++ b/3rdparty/include/pcl/HammerAitoffProjection.h @@ -0,0 +1,132 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/HammerAitoffProjection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_HammerAitoffProjection_h +#define __PCL_HammerAitoffProjection_h + +/// \file pcl/HammerAitoffProjection.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class HammerAitoffProjection + * \brief Hammer-Aitoff projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS HammerAitoffProjection : public ProjectionBase +{ +public: + + /*! + * Default constructor. + */ + HammerAitoffProjection() = default; + + /*! + * Copy constructor. + */ + HammerAitoffProjection( const HammerAitoffProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new HammerAitoffProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "AIT"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Hammer-Aitoff"; + } + +protected: + + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override; + + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override; + +private: + + double m_Zmin = Const::_1_sqrt2(); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_HammerAitoffProjection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/HammerAitoffProjection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Histogram.h b/3rdparty/include/pcl/Histogram.h new file mode 100644 index 0000000..69112d8 --- /dev/null +++ b/3rdparty/include/pcl/Histogram.h @@ -0,0 +1,660 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Histogram.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Histogram_h +#define __PCL_Histogram_h + +/// \file pcl/Histogram.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Histogram + * \brief Discrete image histogram function + * + * ### TODO: Write a detailed description for %Histogram. + */ +class PCL_CLASS Histogram : public ParallelProcess +{ +public: + + /*! + * Represents a histogram bin count, or the value of the discrete histogram + * function at a specific abscissa or range of abscissae. + */ + typedef uint64 count_type; + + /*! + * A vector of histogram bin counts, which is the type used internally to + * store the values of the discrete histogram function. + */ + typedef UI64Vector histogram_type; + + /*! + * Constructs an empty %Histogram object with the specified \a resolution. + * + * The resolution of a histogram function is the number of discrete + * intervals (or \e bins) used to analyze image data. The minimum possible + * resolution is 2. In PCL, the default resolution is 2^16 = 65536 intervals + * (also known as a 16-bit histogram). + */ + Histogram( int resolution = 0x10000L ) + : m_resolution( pcl::Max( 2, resolution ) ) + { + PCL_PRECONDITION( resolution > 1 ) + } + + /*! + * Constructs a %Histogram object by importing a copy of the specified + * \a data vector as its internal vector of histogram function values. + * Automatically sets the histogram resolution equal to the length of the + * \a data vector, and calculates the peak level of the newly constructed + * histogram. + * + * If the specified \a data vector has less than two components, this + * constructor will yield an empty histogram with the default 16-bit + * resolution. + */ + Histogram( const histogram_type& data ) + { + SetHistogramData( data ); + } + + /*! + * Copy constructor. + */ + Histogram( const Histogram& ) = default; + + /*! + * Move constructor. + */ + Histogram( Histogram&& ) = default; + + /*! + * Destroys a %Histogram object. + */ + virtual ~Histogram() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Histogram& operator =( const Histogram& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Histogram& operator =( Histogram&& ) = default; + + /*! + * Assigns another %Histogram object \a x to this object. + */ + void Assign( const Histogram& x ) + { + (void)operator =( x ); + } + + /*! + * Deallocates the internal vector of histogram values, yielding an empty + * %Histogram object. + */ + void Clear() + { + m_histogram.Clear(); + m_peakLevel = 0; + } + + /*! + * Returns true iff this %Histogram object is empty. An empty histogram has + * no computed histogram values. + */ + bool IsEmpty() const + { + return m_histogram.IsEmpty(); + } + + /*! + * Returns the current resolution of this %Histogram object. + * + * The resolution of a histogram function is the number of discrete + * intervals (or \e bins) used to analyze image data. The minimum possible + * resolution is 2. In PCL, the default resolution is 2^16 = 65536 intervals + * (also known as a 16-bit histogram). + */ + int Resolution() const + { + return m_resolution; + } + + /*! + * Returns the highest valid discrete histogram level, or Resolution()-1. + */ + int LastLevel() const + { + return m_resolution-1; + } + + /*! + * Sets the resolution of this %Histogram object. + * + * The resolution of a histogram function is the number of discrete + * intervals (or \e bins) used to analyze image data. The minimum possible + * resolution is 2. In PCL, the default resolution is 2^16 = 65536 intervals + * (also known as a 16-bit histogram). + * + * After calling this member function, the histogram will be empty and the + * internal vector of histogram function values will be deallocated. + */ + void SetResolution( int resolution ) + { + PCL_PRECONDITION( resolution > 1 ) + Clear(); + m_resolution = pcl::Max( 2, resolution ); + } + + /*! + * If this histogram object is empty, this member function allocates the + * internal vector of histogram function values. Newly allocated vectors are + * not initialized, so the histogram will contain unpredictable values after + * calling this function. + * + * If the histogram is not empty, calling this function has no effect. + */ + void Allocate() + { + if ( m_histogram.IsEmpty() ) + m_histogram = histogram_type( m_resolution ); + } + + /*! + * Returns the current peak level of the histogram. If this histogram is + * empty, the peak level is zero conventionally. + * + * The peak level is simply the index (or integer abscissa) of the histogram + * bin with the largest count, or the position on the X axis of the maximum + * of the histogram function, in the discrete range [0,LastLevel()]. + */ + int PeakLevel() const + { + return m_histogram.IsEmpty() ? 0 : m_peakLevel; + } + + /*! + * Returns the histogram peak level as a floating point number normalized to + * the [0,1] range. See PeakLevel(). + */ + double NormalizedPeakLevel() const + { + return NormalizedLevel( PeakLevel() ); + } + + /*! + * Recalculates the histogram peak level from current histogram function + * values. If the histogram is empty, the peak level is reset to zero + * conventionally. + * + * Returns the newly calculated histogram peak level. + */ + int UpdatePeakLevel() + { + return m_peakLevel = m_histogram.IsEmpty() ? 0 : + int( pcl::MaxItem( m_histogram.Begin(), m_histogram.End() ) - m_histogram.Begin() ); + } + + /*! + * Returns the index of the discrete level in this %Histogram object + * corresponding to the specified normalized level \a x in the [0,1] range. + */ + int HistogramLevel( double x ) const + { + PCL_PRECONDITION( x >= 0 && x <= 1 ) + return RoundInt( pcl::Range( x, 0.0, 1.0 )*(m_resolution - 1) ); + } + + /*! + * Returns the normalized histogram level in the [0,1] range corresponding + * to the specified discrete level \a i in this %Histogram object. + */ + double NormalizedLevel( int i ) const + { + PCL_PRECONDITION( i >= 0 && i < m_resolution ) + return double( pcl::Range( i, 0, m_resolution-1 ) )/(m_resolution - 1); + } + + /*! + * Converts the specified normalized levels \a a, \a b in the [0,1] range to + * discrete histogram levels \a i, \a j, respectively. + */ + void GetHistogramRange( int& i, int& j, double a, double b ) const + { + i = HistogramLevel( a ); + j = HistogramLevel( b ); + if ( j < i ) + pcl::Swap( i, j ); + } + + /*! + * Converts the specified discrete histogram levels \a i, \a j to normalized + * levels \a a, \a b, respectively, in the [0,1] range. + */ + void GetNormalizedRange( double& a, double& b, int i, int j ) const + { + if ( j < i ) + pcl::Swap( i, j ); + a = NormalizedLevel( i ); + b = NormalizedLevel( j ); + } + + /*! + * Returns the total sum of the counts in all histogram intervals, or the + * sum of all discrete histogram function values. If this %Histogram object + * is empty, this function returns zero. + */ + count_type Count() const + { + return m_histogram.Sum(); + } + + /*! + * Returns the histogram count, or the value of the histogram function, at + * the specified discrete level \a i. + */ + count_type Count( int i ) const + { + PCL_PRECONDITION( i >= 0 && i < m_histogram.Length() ) + if ( i < 0 || i >= m_histogram.Length() ) + return 0; + return m_histogram[i]; + } + + /*! + * Subscript operator. Equivalent to Count( int ). + */ + count_type operator []( int i ) const + { + return Count( i ); + } + + /*! + * Returns the sum of counts in the specified interval of discrete histogram + * levels \a i, \a j. + */ + count_type Count( int i, int j ) const + { + PCL_PRECONDITION( i >= 0 && i < m_histogram.Length() ) + PCL_PRECONDITION( j >= 0 && j < m_histogram.Length() ) + if ( m_histogram.IsEmpty() ) + return 0; + i = pcl::Range( i, 0, m_histogram.Length()-1 ); + j = pcl::Range( j, 0, m_histogram.Length()-1 ); + if ( j < i ) + pcl::Swap( i, j ); + return pcl::Sum( m_histogram.At( i ), m_histogram.At( j+1 ) ); + } + + /*! + * Returns the histogram function value for the bin at the current peak + * level. Typically, the peak count is used to normalize the histogram to + * a prescribed range. For example, by dividing all histogram function + * values by the peak count the entire histogram will be normalized to the + * [0,1] range. + */ + count_type PeakCount() const + { + return Count( m_peakLevel ); + } + + /*! + * Returns the peak count, or the maximum histogram function value, within + * the specified range [i,j] of discrete histogram intervals. + */ + count_type PeakCount( int i, int j ) const + { + PCL_PRECONDITION( i >= 0 && i < m_histogram.Length() ) + PCL_PRECONDITION( j >= 0 && j < m_histogram.Length() ) + if ( m_histogram.IsEmpty() ) + return 0; + i = pcl::Range( i, 0, m_histogram.Length()-1 ); + j = pcl::Range( j, 0, m_histogram.Length()-1 ); + if ( j < i ) + pcl::Swap( i, j ); + return *pcl::MaxItem( m_histogram.At( i ), m_histogram.At( j+1 ) ); + } + + /*! + * Returns the discrete histogram level where the sum of counts for its + * preceding levels is greater than or equal to the specified amount \a n. + * + * This function is useful to compute an automatic histogram shadows + * clipping point. The returned index is the position of the shadows + * clipping point that clips (sets to black) the specified amount of image + * pixel samples + */ + int ClipLow( count_type n ) const + { + int i = 0; + for ( count_type s = 0; i < m_histogram.Length()-1 && (s += m_histogram[i]) <= n; ++i ) {} + return i; + } + + /*! + * Returns the normalized histogram level (in the [0,1] range) where the sum + * of counts for its preceding levels is greater than or equal to the + * specified amount \a n. + */ + double NormalizedClipLow( count_type n ) const + { + return NormalizedLevel( ClipLow( n ) ); + } + + /*! + * Returns the discrete histogram level where the sum of counts for its + * succeding levels is greater than or equal to the specified amount \a n. + * + * This function is useful to compute an automatic histogram highlights + * clipping point. The returned index is the position of the highlights + * clipping point that clips (sets to white) the specified amount of image + * pixel samples + */ + int ClipHigh( count_type n ) const + { + int i = m_histogram.Length(); + for ( count_type s = 0; --i > 0 && (s += m_histogram[i]) <= n; ) {} + return i; + } + + /*! + * Returns the normalized histogram level (in the [0,1] range) where the sum + * of counts for its succeding levels is greater than or equal to the + * specified amount \a n. + */ + double NormalizedClipHigh( count_type n ) const + { + return NormalizedLevel( ClipHigh( n ) ); + } + + /*! + * Returns a reference to the immutable internal vector of histogram + * function values. + */ + const histogram_type& HistogramData() const + { + return m_histogram; + } + + /*! + * Causes this %Histogram object to import a copy of the specified \a data + * vector as its internal vector of histogram function values. Automatically + * sets the histogram resolution equal to the length of the \a data vector, + * and recalculates the peak level of the new histogram. + * + * If the specified \a data vector has less than two components, this member + * function will yield an empty histogram without changing the current + * histogram resolution. + */ + void SetHistogramData( const histogram_type& data ) + { + if ( data.Length() < 2 ) + Clear(); + else + { + m_histogram = data; + m_resolution = m_histogram.Length(); + UpdatePeakLevel(); + } + } + + /*! + * \deprecated This member function has been deprecated. It is kept as part + * of PCL for compatibility with existing modules; do not use it in newly + * produced code. + */ + void GetData( count_type* where, int fromLevel = 0, int toLevel = -1 ) const + { + PCL_PRECONDITION( where != nullptr ) + PCL_PRECONDITION( fromLevel >= 0 ) + if ( where != nullptr ) + if ( !m_histogram.IsEmpty() ) + { + fromLevel = pcl::Range( fromLevel, 0, m_histogram.Length()-1 ); + toLevel = (toLevel < 0) ? m_histogram.Length()-1 : pcl::Range( toLevel, 0, m_histogram.Length()-1 ); + if ( toLevel < fromLevel ) + pcl::Swap( fromLevel, toLevel ); + ::memcpy( where, m_histogram.At( fromLevel ), (1+toLevel-fromLevel)*sizeof( count_type ) ); + } + } + + /*! + * Remaps the histogram function to fit the resolution of a target + * histogram \a h. + * + * If the target histogram has the same resolution as this object, this + * member function is equivalent to a plain assignment. If the resolutions + * differ, if this histogram is empty then the target histogram is + * deallocated and cleared, otherwise the target histogram is recomputed as + * a resampled version of this histogram. + * + * This member function is useful to generate reduced versions of a + * histogram. It can also be used to generate bootstrap samples from an + * existing histogram function. + */ + void Resample( Histogram& h ) const + { + if ( h.m_resolution == m_resolution ) + h = *this; + else + { + if ( m_histogram.IsEmpty() ) + h.Clear(); + else + { + h.Allocate(); + h.m_histogram = 0; + double k = double( h.m_histogram.Length() - 1 )/(m_histogram.Length() - 1); + for ( int i = 0; i < m_histogram.Length(); ++i ) + h.m_histogram[pcl::RoundInt( i*k )] += m_histogram[i]; + h.m_peakLevel = int( pcl::MaxItem( h.m_histogram.Begin(), h.m_histogram.End() ) - h.m_histogram.Begin() ); + } + } + } + + /*! + * Computes the discrete entropy of this histogram. + * + * The returned value is normalized to the total weight of the histogram, + * that is, it is independent on the total number of counts stored in the + * histogram data vector. + */ + double Entropy() const + { + double H = 0; + count_type n = Count(); + if ( n > 0 ) + for ( int i = 0; i < m_histogram.Length(); ++i ) + if ( m_histogram[i] > 0 ) + { + double f = double( m_histogram[i] )/n; + H -= f*Log( f ); + } + return H; + } + + /*! + * Computes the histogram function of a 32-bit floating point real image. + */ + const Image& operator <<( const Image& ); + + /*! + * Computes the histogram function of a 64-bit floating point real image. + */ + const DImage& operator <<( const DImage& ); + + /*! + * Computes the histogram function of an 8-bit unsigned integer image. + */ + const UInt8Image& operator <<( const UInt8Image& ); + + /*! + * Computes the histogram function of a 16-bit unsigned integer image. + */ + const UInt16Image& operator <<( const UInt16Image& ); + + /*! + * Computes the histogram function of a 32-bit unsigned integer image. + */ + const UInt32Image& operator <<( const UInt32Image& ); + + /*! + * Computes the histogram function of the image transported by an + * ImageVariant object. + */ + const ImageVariant& operator <<( const ImageVariant& ); + + /*! + * Returns the current rectangular selection in this %Histogram object. + * + * By default, the rectangular selection is an empy rectangle, meaning that + * the rectangular selection in the target image will be used. + */ + const Rect& SelectedRectangle() const + { + return m_rect; + } + + /*! + * Sets a new rectangular selection for this %Histogram object. + * + * When a non-empty rectangular selection is specified, it is used as the + * region of interest (ROI) for calculation of histograms. If an empty or + * invalid rectangle is specified, the current selection in the target image + * will be used. + */ + void SelectRectangle( const Rect& r ) + { + m_rect = r; + } + + /*! + * Clears the rectangular selection in this %Histogram object. + * + * After calling this function, histograms will be calculated for the + * current rectangular selection of the target image. + */ + void ClearRectangle() + { + m_rect = Rect( 0 ); + } + + /*! + * Returns the current channel index selected in this %Histogram object. + * + * By default, the selected channel index is -1, meaning that the channel + * selected in the target image will be used. + */ + int SelectedChannel() const + { + return m_channel; + } + + /*! + * Selects a channel index for this %Histogram object. + * + * When a positive (>= 0) channel index is specified, it is used for + * calculation of histograms. If a negative channel index is specified, the + * current selected channel in the target image will be used. + */ + void SelectChannel( int channel ) + { + m_channel = pcl::Max( -1, channel ); + } + + /*! + * Clears the channel index selection in this %Histogram object. + * + * After calling this function, histograms will be calculated for the + * current selected channel of the target image. + */ + void ClearSelectedChannel() + { + m_channel = -1; + } + +protected: + + histogram_type m_histogram; // Discrete histogram levels + int m_resolution = 0x10000L; // Number of histogram levels + int m_peakLevel = 0; // Maximum level (index of maximum count) + Rect m_rect = 0; // ROI, Rect( 0 ) to use target image's selection + int m_channel = -1; // < 0 to use target image's selection + + friend class View; + friend class HistogramTransformation; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Histogram_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Histogram.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/HistogramTransformation.h b/3rdparty/include/pcl/HistogramTransformation.h new file mode 100644 index 0000000..f395347 --- /dev/null +++ b/3rdparty/include/pcl/HistogramTransformation.h @@ -0,0 +1,530 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/HistogramTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_HistogramTransformation_h +#define __PCL_HistogramTransformation_h + +/// \file pcl/HistogramTransformation.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS Histogram; + +/*! + * \class HistogramTransformation + * \brief Multiple histogram transformation. + * + * ### TODO: Write a detailed description for %HistogramTransformation. + */ +class PCL_CLASS HistogramTransformation : public ImageTransformation, public ParallelProcess +{ +public: + + /*! + * Represents a set of chained histogram transformations. + */ + typedef Array transformation_list; + + /*! + * Constructs a %HistogramTransformation object with the specified + * parameters. + * + * \param mb Midtones balance in the range [0,1]. + * + * \param sc Shadows clipping point in the range [0,1]. + * + * \param hc Highlights clipping point in the range [0,1]. + * + * \param lr Low dynamic range expansion bound, \a lr ≤ 0. + * + * \param hr High dynamic range expansion bound, \a hr ≥ 1. + * + * The default parameter values define an identity transformation: + * + * \a mb = 0.5, \a sc = 0, \a hc = 1, \a lr = 0, \a hr = 1. + */ + HistogramTransformation( double mb = 0.5, + double sc = 0, double hc = 1, + double lr = 0, double hr = 1 ) + { + PCL_PRECONDITION( mb >= 0 && mb <= 1 ) + PCL_PRECONDITION( sc >= 0 && sc <= 1 ) + PCL_PRECONDITION( hc >= 0 && hc <= 1 ) + PCL_PRECONDITION( lr <= 0 ) + PCL_PRECONDITION( hr >= 1 ) + m_midtonesBalance = pcl::Range( mb, 0.0, 1.0 ); + m_clipLow = pcl::Range( sc, 0.0, 1.0 ); + m_clipHigh = pcl::Range( hc, 0.0, 1.0 ); + if ( m_clipHigh < m_clipLow ) + pcl::Swap( m_clipLow, m_clipHigh ); + m_expandLow = Min( lr, 0.0 ); + m_expandHigh = Max( 1.0, hr ); + UpdateFlags(); + } + + /*! + * Copy constructor. + */ + HistogramTransformation( const HistogramTransformation& ) = default; + + /*! + * Move constructor. + */ + HistogramTransformation( HistogramTransformation&& ) = default; + + /*! + * Destroys a %HistogramTransformation object. + */ + virtual ~HistogramTransformation() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + HistogramTransformation& operator =( const HistogramTransformation& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + HistogramTransformation& operator =( HistogramTransformation&& ) = default; + + /*! + * Returns the number of histogram transforms in the transformation chain. + */ + size_type Length() const + { + return 1 + m_transformChain.Length(); + } + + /*! + * Returns a reference to the (immutable) transformation at the specified + * \a index in the current transformation chain. + */ + const HistogramTransformation& operator []( size_type index ) const + { + return (index == 0) ? *this : m_transformChain[index-1]; + } + + /*! + * Returns a reference to the (mutable) transformation at the specified + * \a index in this transformation chain. + */ + HistogramTransformation& operator []( size_type index ) + { + return (index == 0) ? *this : m_transformChain[index-1]; + } + + /*! + * Returns a reference to the (immutable) first histogram transformation in + * the current chain. The returned value is always a reference to this + * object. + */ + const HistogramTransformation& operator *() const + { + return *this; + } + + /*! + * Returns a reference to the (mutable) first histogram transformation in + * the current chain. The returned value is always a reference to this + * object. + */ + HistogramTransformation& operator *() + { + return *this; + } + + /*! + * Adds a histogram transformation to the transformation chain of this + * %HistogramTransformation object. + */ + void Add( const HistogramTransformation& H ) + { + m_transformChain.Add( H ); + } + + /*! # + */ + double MidtonesBalance() const + { + return m_midtonesBalance; + } + + /*! # + */ + double ShadowsClipping() const + { + return m_clipLow; + } + + /*! # + */ + double HighlightsClipping() const + { + return m_clipHigh; + } + + /*! # + */ + double LowRange() const + { + return m_expandLow; + } + + /*! # + */ + double HighRange() const + { + return m_expandHigh; + } + + /*! # + */ + bool IsIdentityTransformation() const + { + return m_midtonesBalance == 0.5 + && m_clipLow == 0 && m_clipHigh == 1 + && m_expandLow == 0 && m_expandHigh == 1; + } + + /*! # + */ + bool IsIdentityTransformationSet() const; + + /*! # + */ + void SetMidtonesBalance( double b ) + { + PCL_PRECONDITION( b >= 0 && b <= 1 ) + m_midtonesBalance = pcl::Range( b, 0.0, 1.0 ); + UpdateFlags(); + } + + /*! # + */ + void SetShadowsClipping( double c ) + { + PCL_PRECONDITION( c >= 0 && c <= 1 ) + m_clipLow = pcl::Range( c, 0.0, 1.0 ); + if ( m_clipHigh < m_clipLow ) + pcl::Swap( m_clipLow, m_clipHigh ); + UpdateFlags(); + } + + /*! # + */ + void SetHighlightsClipping( double c ) + { + PCL_PRECONDITION( c >= 0 && c <= 1 ) + m_clipHigh = pcl::Range( c, 0.0, 1.0 ); + if ( m_clipHigh < m_clipLow ) + pcl::Swap( m_clipLow, m_clipHigh ); + UpdateFlags(); + } + + /*! # + */ + void SetClipping( double sc, double hc ) + { + PCL_PRECONDITION( sc >= 0 && sc <= 1 ) + PCL_PRECONDITION( hc >= 0 && hc <= 1 ) + m_clipLow = pcl::Range( sc, 0.0, 1.0 ); + m_clipHigh = pcl::Range( hc, 0.0, 1.0 ); + if ( m_clipHigh < m_clipLow ) + pcl::Swap( m_clipLow, m_clipHigh ); + UpdateFlags(); + } + + /*! # + */ + void SetLowRange( double r ) + { + PCL_PRECONDITION( r <= 0 ) + m_expandLow = Min( 0.0, r ); + UpdateFlags(); + } + + /*! # + */ + void SetHighRange( double r ) + { + PCL_PRECONDITION( r >= 1 ) + m_expandHigh = Max( 1.0, r ); + UpdateFlags(); + } + + /*! # + */ + void SetRange( double lr, double hr ) + { + PCL_PRECONDITION( lr <= 0 ) + PCL_PRECONDITION( hr >= 1 ) + m_expandLow = Min( 0.0, lr ); + m_expandHigh = Max( 1.0, hr ); + UpdateFlags(); + } + + /*! + * Resets all transformation parameters to yield an identity histogram + * transformation. + */ + void Reset() + { + m_midtonesBalance = 0.5; + m_clipLow = 0; + m_clipHigh = 1; + m_expandLow = 0; + m_expandHigh = 1; + m_transformChain.Clear(); + UpdateFlags(); + } + + // Avoid "hides virtual function in base" warnings by clang + using ImageTransformation::Apply; + + /*! # + */ + void Apply( double*, size_type, double x0 = 0, double x1 = 1 ) const; + + /*! # + */ + void Apply( float*, size_type, float x0 = 0, float x1 = 1 ) const; + + /*! # + */ + void Apply( Histogram& dstH, const Histogram& srcH ) const; + + /*! # + */ + void Make8BitLUT( uint8* ) const; + + /*! # + */ + void Make16BitLUT( uint8* ) const; + + /*! # + */ + void Make16BitLUT( uint16* ) const; + + /*! # + */ + void Make20BitLUT( uint8* ) const; + + /*! # + */ + void Make20BitLUT( uint16* ) const; + + /*! # + */ + void Make24BitLUT( uint8* ) const; + + /*! # + */ + void Make24BitLUT( uint16* ) const; + + /*! + * Returns the value of the midtones transfer function (MTF) for a + * given midtones balance \a m and a sample point \a x. Both \a m and \a x + * must be in the range [0,1]. + */ + static double MidtonesTransferFunction( double m, double x ) + { + /* + * Bulirsch-Stoer algorithm for a diagonal rational interpolation + * function with three fixed data points: (0,0) (m,1/2) (1,1). + * + * This is the MTF function after direct substitution in the B-S + * equations: + * + * double r = 1 + 0.5/((x - m)/(x - 1)/2 - 1); + * return r + r/(x/(x - 1) * (1 - r/(r - 0.5)) - 1); + * + * We can simplify: + * + * double r = (m - 1)/(x + m - 2); + * + * and then we can further simplify to: + * + * return (m - 1)*x/((2*m - 1)*x - m); + * + * Finally, precalculating (m - 1) we can save a multiplication. + */ + if ( x > 0 ) // guard us against degenerate cases + { + if ( x < 1 ) + { + double m1 = m - 1; + return m1*x/((m + m1)*x - m); + } + return 1; + } + return 0; + } + + /*! + * A convenience synonym for MidtonesTransferFunction( m, x ). + */ + static double MTF( double m, double x ) + { + return MidtonesTransferFunction( m, x ); + } + + /*! + * Transforms a real \a value in the normalized [0,1] range. + */ + void Transform( double& value ) const + { + if ( m_flags.hasClipping ) + value = m_flags.hasDelta ? ((value <= m_clipLow) ? 0.0 : ((value >= m_clipHigh) ? 1.0 : (value - m_clipLow)/m_flags.d)) : m_clipLow; + if ( m_flags.hasMTF ) + value = HistogramTransformation::MTF( m_midtonesBalance, value ); + if ( m_flags.hasRange ) + value = (value - m_expandLow)/m_flags.dr; + } + + /*! + * \struct pcl::HistogramTransformation::Flags + * \brief Characterizes a histogram transformation pertaining to a + * histogram transformation chain. + */ + struct Flags + { + double d = 1.0; //!< Total width of the stretched dynamic range + double dr = 1.0; //!< Total width of the expanded dynamic range + bool hasClipping = false; //!< The transformation defines clipping parameters + bool hasMTF = false; //!< The transformation defines a midtones transfer function + bool hasRange = false; //!< The transformation defines dynamic range expansion parameters + bool hasDelta = false; //!< The transformation defines a nonzero stretched range of sample values + + /*! + * Default constructor. + */ + Flags() = default; + + /*! + * Copy constructor. + */ + Flags( const Flags& ) = default; + + /*! + * Constructs a new %Flags object initialized for the parameters of the + * specified HistogramTransformation \a H. + */ + Flags( const HistogramTransformation& H ) + { + hasClipping = H.m_clipLow != 0 || H.m_clipHigh != 1; + hasMTF = H.m_midtonesBalance != 0.5; + hasRange = H.m_expandLow != 0 || H.m_expandHigh != 1; + hasDelta = false; + if ( hasClipping ) + { + d = H.m_clipHigh - H.m_clipLow; + hasDelta = 1 + d != 1; + } + if ( hasRange ) + dr = H.m_expandHigh - H.m_expandLow; + } + }; + + /*! + * Returns the set of flags characterizing this histogram transformation. + */ + Flags TransformationFlags() const + { + return m_flags; + } + +private: + + double m_midtonesBalance = 0.5; // midtones balance + double m_clipLow = 0; // shadows clipping point + double m_clipHigh = 1; // highlights clipping point + double m_expandLow = 0; // shadows dynamic range expansion + double m_expandHigh = 1; // highlights dynamic range expansion + Flags m_flags; // transformation flags + transformation_list m_transformChain; // more transformations + + /*! + * \internal + */ + void UpdateFlags() + { + m_flags = Flags( *this ); + } + + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + + friend class LUT2408Thread; + friend class LUT2416Thread; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_HistogramTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/HistogramTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Homography.h b/3rdparty/include/pcl/Homography.h new file mode 100644 index 0000000..c210df3 --- /dev/null +++ b/3rdparty/include/pcl/Homography.h @@ -0,0 +1,406 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Homography.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Homography_h +#define __PCL_Homography_h + +/// \file pcl/Homography.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Homography + * \brief Homography geometric transformation. + * + * A two-dimensional projective transformation, or \e homography, is a + * line-preserving geometric transformation between two sets of points in the + * plane. More formally, if P represents the set of points in the plane, a + * homography is an invertible mapping H from P^2 to itself such that three + * points p1, p2, p3 are collinear if and only if H(p1), H(p2), H(p3) do. + * + * Homographies have important practical applications in the field of computer + * vision. On the PixInsight platform, this class is an essential component of + * image registration and astrometry processes. + */ +template +class PCL_CLASS Homography +{ +public: + + /*! + * Represents a reference point in two dimensions. + */ + typedef P point; + + /*! + * Represents a list of two-dimensional reference points involved in a + * homography transformation. + */ + typedef Array point_list; + + /*! + * Default constructor. Constructs a no-op transformation with a unit matrix + * transformation matrix. + */ + Homography() + : m_H( Matrix::UnitMatrix( 3 ) ) + { + } + + /*! + * Constructor from a given homography matrix. + */ + Homography( const Matrix& H ) + : m_H( H ) + { + } + + /*! + * Constructor from two 2D point lists. + * + * Computes a homography transformation to generate a list \a P2 of + * transformed points from a list \a P1 of original points. In other words, + * the computed homography H works as follows: + * + * P2 = H( P1 ) + * + * The transformation matrix is calculated by the Direct Linear + * Transformation (DLT) method. Both point lists must contain at least four + * points. + * + * If one of the specified point lists contains less than four points, or if + * no homography can be estimated from the specified point lists (which + * leads to a singular transformation matrix), this constructor throws an + * appropriate Error exception. + * + * \b References + * + * R. Hartley, In defense of the eight-point algorithm. IEEE + * Transactions on Pattern Analysis and Machine Intelligence, vol. 19, pp. + * 580–593, June 1997. + */ + Homography( const point_list& P1, const point_list& P2 ) + : m_H( DLT( P1, P2 ) ) + { + } + + /*! + * Copy constructor. + */ + Homography( const Homography& ) = default; + + /*! + * Copy assignment operator. + */ + Homography& operator =( const Homography& ) = default; + + /*! + * Move constructor. + */ + Homography( Homography&& ) = default; + + /*! + * Move assignment operator. + */ + Homography& operator =( Homography&& ) = default; + + /*! + * Coordinate transformation operator. Applies the homography matrix to the + * specified \a x and \a y coordinates. Returns the transformed point as a + * two-dimensional point with real coordinates. + */ + template + DPoint operator ()( T x, T y ) const + { + double w = m_H[2][0]*x + m_H[2][1]*y + m_H[2][2]; + PCL_CHECK( 1 + w != 1 ) + return DPoint( (m_H[0][0]*x + m_H[0][1]*y + m_H[0][2])/w, + (m_H[1][0]*x + m_H[1][1]*y + m_H[1][2])/w ); + } + + /*! + * Point transformation operator. Applies the homography matrix to the + * coordinates of the specified point \a p. Returns the transformed point as + * a two-dimensional point with real coordinates. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + + /*! + * Returns the inverse of this homography transformation. + * + * If this transformation has been computed from two point lists \a P1 and + * \a P2: + * + * P2 = H( P1 ) + * + * then this function returns a transformation H1 such that: + * + * P1 = H1( P2 ) + */ + Homography Inverse() const + { + return Homography( m_H.Inverse() ); + } + + /*! + * Returns the homography transformation matrix. + */ + operator const Matrix&() const + { + return m_H; + } + + /*! + * Returns true iff this transformation has been initialized and is valid. + */ + bool IsValid() const + { + return !m_H.IsEmpty(); + } + + /*! + * Returns true iff this is an affine homography transformation. + * + * An affine homography is a special type of a general homography where the + * last row of the 3x3 transformation matrix is equal to (0, 0, 1). This + * function verifies that this property holds for the current transformation + * matrix (if it is valid) up to the machine epsilon for the \c double + * numeric type. + */ + bool IsAffine() const + { + return IsValid() + && Abs( m_H[2][0] ) <= std::numeric_limits::epsilon() + && Abs( m_H[2][1] ) <= std::numeric_limits::epsilon() + && 1 - Abs( m_H[2][2] ) <= std::numeric_limits::epsilon(); + } + + /*! + * Ensures that the transformation uniquely references its internal matrix + * data. + */ + void EnsureUnique() + { + m_H.EnsureUnique(); + } + +private: + + Matrix m_H; + + /* + * Normalization of reference points. + */ + struct NormalizedPoints + { + Array N; // the normalized points + Matrix T; // 3x3 normalization matrix + + NormalizedPoints( const point_list& points ) + { + /* + * Calculate the centroid of the input set of points. + */ + DPoint centroid( 0 ); + for ( const auto& p : points ) + centroid += p; + centroid /= points.Length(); + + /* + * Calculate mean centroid distance and move origin to the centroid. + */ + double d0 = 0; + for ( const auto& p : points ) + { + double x = p.x - centroid.x; + double y = p.y - centroid.y; + N << DPoint( x, y ); + d0 += Sqrt( x*x + y*y ); + } + d0 /= points.Length(); + + /* + * Scale point coordinates. + */ + double scale = Const::sqrt2()/d0; + for ( auto& p : N ) + p *= scale; + + /* + * Form the normalization matrix. + */ + T = Matrix( scale, 0.0, -scale*centroid.x, + 0.0, scale, -scale*centroid.y, + 0.0, 0.0, 1.0 ); + } + }; + + /* + * Implementation of the Direct Linear Transformation (DLT) method to + * compute a normalized homography matrix. + */ + static Matrix DLT( const point_list& P1, const point_list& P2 ) + { + int n = Min( P1.Length(), P2.Length() ); + if ( n < 4 ) + throw Error( "Homography::DLT(): Less than four points specified." ); + + /* + * Normalize all points. + */ + NormalizedPoints p1( P1 ); + NormalizedPoints p2( P2 ); + + /* + * Setup cross product matrix A. + */ + Matrix A( 2*n, 9 ); + for ( int i = 0; i < n; ++i ) + { + double x1 = p1.N[i].x; + double y1 = p1.N[i].y; + double x2 = p2.N[i].x; + double y2 = p2.N[i].y; + double* A0 = A[2*i]; + double* A1 = A[2*i + 1]; + //double* A2 = A[3*i + 2]; <-- linearly dependent eqn. + + A0[0] = A0[1] = A0[2] = 0; + A0[3] = -x1; + A0[4] = -y1; + A0[5] = -1; + A0[6] = y2*x1; + A0[7] = y2*y1; + A0[8] = y2; + + A1[0] = x1; + A1[1] = y1; + A1[2] = 1; + A1[3] = A1[4] = A1[5] = 0; + A1[6] = -x2*x1; + A1[7] = -x2*y1; + A1[8] = -x2; + + /* <-- linearly dependent eqn. + A2[0] = -y2*x1; + A2[1] = -y2*y1; + A2[2] = -y2; + A2[3] = x2*x1; + A2[4] = x2*y1; + A2[5] = x2; + A2[6] = A2[7] = A2[8] = 0; + */ + } + + /* + * SVD of cross product matrix. + */ + InPlaceSVD svd( A ); + + /* + * For sanity, set to zero all insignificant singular values. + */ + for ( int i = 0; i < svd.W.Length(); ++i ) + if ( Abs( svd.W[i] ) <= std::numeric_limits::epsilon() ) + svd.W[i] = 0; + + /* + * Locate the smallest nonzero singular value. + */ + int i = svd.IndexOfSmallestSingularValue(); + + /* + * The components of the homography matrix are those of the smallest + * eigenvector, i.e. the column vector of V corresponding to the smallest + * singular value. + */ + Matrix H( svd.V[0][i], svd.V[1][i], svd.V[2][i], + svd.V[3][i], svd.V[4][i], svd.V[5][i], + svd.V[6][i], svd.V[7][i], svd.V[8][i] ); + + if ( Abs( H[2][2] ) <= std::numeric_limits::epsilon() ) + throw Error( "Homography::DLT(): Singular matrix." ); + + /* + * Denormalize matrix components. + */ + H = p2.T.Inverse() * H * p1.T; + + /* + * Normalize matrix so that H[2][2] = 1. + */ + return H *= 1/H[2][2]; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Homography_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Homography.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ICCProfile.h b/3rdparty/include/pcl/ICCProfile.h new file mode 100644 index 0000000..76c1572 --- /dev/null +++ b/3rdparty/include/pcl/ICCProfile.h @@ -0,0 +1,905 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ICCProfile.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ICCProfile_h +#define __PCL_ICCProfile_h + +/// \file pcl/ICCProfile.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup color_management Color Management Classes + */ + +/*! + * \namespace pcl::ICCProfileClass + * \brief Representation of ICC color profile classes + * \ingroup color_management + * + * + * + * + * + * + * + * + * + * + * + *
ICCProfileClass::Unknown Unknown or unsupported ICC profile class
ICCProfileClass::Any Any ICC profile class
ICCProfileClass::InputDevice Input device (scanner) profile
ICCProfileClass::DisplayDevice Display device (monitor) profile
ICCProfileClass::OutputDevice Output device (printer) profile
ICCProfileClass::DeviceLink Device link profile
ICCProfileClass::ColorSpaceConversion Color space conversion profile
ICCProfileClass::AbstractProfile Abstract profile
ICCProfileClass::NamedColorProfile Named color profile
+ */ +namespace ICCProfileClass +{ + enum mask_type + { + Unknown = 0x80000000, + Any = 0x00000000, + InputDevice = 0x00000001, + DisplayDevice = 0x00000002, + OutputDevice = 0x00000004, + DeviceLink = 0x00000008, + ColorSpaceConversion = 0x00000010, + AbstractProfile = 0x00000020, + NamedColorProfile = 0x00000040 + }; +} + +/*! + * \class pcl::ICCProfileClasses + * \brief A combination of ICCProfileClass values. + * \ingroup color_management + */ +typedef Flags ICCProfileClasses; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ICCColorSpace + * \brief Representation of data and connection color spaces in ICC color profiles. + * \ingroup color_management + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ICCColorSpace::Unknown Unknown or unsupported color space
ICCColorSpace::Any Any color space in an ICC profile
ICCColorSpace::XYZ CIE XYZ color space
ICCColorSpace::Lab CIE L*a*b* color space
ICCColorSpace::Luv CIE L*u*v* color space
ICCColorSpace::YCbCr YCbCr color space
ICCColorSpace::Yxy Yxy (luminance and chromaticity coordinates)
ICCColorSpace::RGB RGB color space
ICCColorSpace::Gray Grayscale color space
ICCColorSpace::HSV HSV color ordering system
ICCColorSpace::HLS HLS color ordering system
ICCColorSpace::CMYK CMYK color space
ICCColorSpace::CMY CMY color space
ICCColorSpace::LuvK LuvK color space
+ * + * Other color spaces supported by the ICC profile specification, as for + * example 2-color and 15-color spaces, are unknown to this implementation. + */ +namespace ICCColorSpace +{ + enum mask_type + { + Unknown = 0x80000000, + Any = 0x00000000, + XYZ = 0x00000001, + Lab = 0x00000002, + Luv = 0x00000004, + YCbCr = 0x00000008, + Yxy = 0x00000010, + RGB = 0x00000020, + Gray = 0x00000040, + HSV = 0x00000080, + HLS = 0x00000100, + CMYK = 0x00000200, + CMY = 0x00000400, + LuvK = 0x00000800 + }; +} + +/*! + * \class pcl::ICCColorSpaces + * \brief A combination of ICCColorSpace values. + * \ingroup color_management + */ +typedef Flags ICCColorSpaces; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ICCRenderingIntent + * \brief ICC rendering intents + * \ingroup color_management + * + * + * + * + * + * + *
ICCRenderingIntent::Perceptual Perceptual rendering intent (photographic images)
ICCRenderingIntent::Saturation Saturation rendering intent (graphics)
ICCRenderingIntent::RelativeColorimetric Relative colorimetric rendering intent (match white points)
ICCRenderingIntent::AbsoluteColorimetric Absolute colorimetric rendering intent (proofing)
+ */ +namespace ICCRenderingIntent +{ + enum value_type + { + Perceptual, + Saturation, + RelativeColorimetric, + AbsoluteColorimetric + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ICCRenderingDirection + * \brief ICC transform rendering direction + * \ingroup color_management + * + * + * + * + * + *
ICCRenderingDirection::Input Denotes a rendering intent applied to input pixel values.
ICCRenderingDirection::Output Denotes a rendering intent applied to output pixel values.
ICCRenderingDirection::Proofing Denotes a rendering intent applied by a proofing transform.
+ */ +namespace ICCRenderingDirection +{ + enum value_type + { + Input, + Output, + Proofing + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class ICCProfile + * \brief A high-level interface to ICC color profiles + * + * %ICCProfile is a high-level interface to the ICC profile handling + * functionality implemented in the PixInsight core application. An instance of + * %ICCProfile transports an ICC profile structure that can be embedded in + * image files or used to build color management transformations with the + * ICCProfileTransformation class. + * + * %ICCProfile implements a set of utility functions for profile validation, + * profile information retrieval, profile disk I/O and profile directory + * search, among other tasks. + * + * \ingroup color_management + * \sa ICCProfileTransformation + */ +class PCL_CLASS ICCProfile +{ +public: + + /*! + * Represents an opaque handle to an internal ICC profile. + */ + typedef void* handle; + + /*! + * Represents an ICC profile device class. + */ + typedef ICCProfileClass::mask_type profile_class; + + /*! + * Represents an ICC profile color space. + */ + typedef ICCColorSpace::mask_type color_space; + + /*! + * Represents an ICC rendering intent. + */ + typedef ICCRenderingIntent::value_type rendering_intent; + + /*! + * Represents an ICC transform rendering direction. + */ + typedef ICCRenderingDirection::value_type rendering_direction; + + /*! + * Constructs an empty %ICCProfile object. An empty %ICCProfile doesn't + * store an ICC profile structure. + */ + ICCProfile() = default; + + /*! + * Copy constructor. + */ + ICCProfile( const ICCProfile& ) = default; + + /*! + * Move constructor. + */ + ICCProfile( ICCProfile&& ) = default; + + /*! + * Constructs an %ICCProfile object and loads an ICC profile from a file at + * the specified \a profilePath. + * + * If the specified file does not exist, is not readable, or does not + * contain a valid ICC profile structure, this constructor throws an Error + * exception. + */ + ICCProfile( const String& profilePath ) + { + Load( profilePath ); + } + + /*! + * Constructs an %ICCProfile object to store a copy of the raw ICC profile + * structure available in the specified container. This constructor simply + * calls Set( rawData ). + */ + ICCProfile( const ByteArray& rawData ) + { + Set( rawData ); + } + + /*! + * Constructs an %ICCProfile object to store a copy of the raw ICC profile + * structure at the specified location. This constructor simply calls + * Set( rawData ). + */ + ICCProfile( const void* rawData ) + { + Set( rawData ); + } + + /*! + * Destroys an %ICCProfile object. If this object stores an ICC profile + * structure, it is deallocated upon destruction. + */ + virtual ~ICCProfile() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ICCProfile& operator =( const ICCProfile& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ICCProfile& operator =( ICCProfile&& ) = default; + + /*! + * Returns true iff this object stores an ICC color profile structure. + */ + bool IsProfile() const + { + return !m_data.IsEmpty(); + } + + /*! + * A convenience synonym for IsProfile(). + */ + operator bool() const + { + return IsProfile(); + } + + /*! + * Returns true if this profile has been read from a disk file. Otherwise + * this object either does not transport an ICC profile, or the profile has + * been generated or assigned directly from a memory buffer. + */ + bool IsDiskProfile() const + { + return !m_path.IsEmpty(); + } + + /*! + * Returns true iff the ICC profile stored in this object is identical to the + * profile stored in \a other %ICCProfile object. + * + * If necessary, this function performs a byte-to-byte comparison between + * both ICC profile structures (when both have the same size in bytes). + */ + bool IsSameProfile( const ICCProfile& other ) const; + + /*! + * Returns a reference to the immutable container that stores an ICC profile + * in this %ICCProfile object. The returned ByteArray is empty if this + * object does not transport an ICC color profile. + */ + const ByteArray& ProfileData() const + { + return m_data; + } + + /*! + * Returns the length of the stored ICC profile structure in bytes. Returns + * zero if this %ICCProfile object doesn't store an ICC color profile. + */ + size_type ProfileSize() const; + + /*! + * Returns the full file path of the stored ICC profile, if this object + * transports an ICC profile structure that has been loaded from a file, or + * an empty string otherwise. + */ + String FilePath() const + { + return m_path; + } + + /*! + * Returns the localized profile description of the stored ICC profile. + * + * \param language Optional language code (ISO 639/2) of the requested + * profile description. The default value is "en" for + * English. + * + * \param country Optional country code (ISO 3166) of the requested + * profile description. The default value is "US" for + * United States. + * + * If this object does not transport an ICC profile, this routine returns an + * empty string. Otherwise this routine will always return a valid profile + * description, even if no localized version exists for the requested + * language and country. The returned description will be as close as + * possible to the requested localization. + */ + String Description( const char* language = "en", const char* country = "US" ) const; + + /*! + * Returns the localized manufacturer information of the stored ICC profile. + * + * See Description( const char*, const char* ) const for detailed + * information on function parameters and behavior. + */ + String Manufacturer( const char* language = "en", const char* country = "US" ) const; + + /*! + * Returns the localized device model information of the stored ICC profile. + * + * See Description( const char*, const char* ) const for detailed + * information on function parameters and behavior. + */ + String Model( const char* language = "en", const char* country = "US" ) const; + + /*! + * Returns the localized copyright information of the stored ICC profile. + * + * See Description( const char*, const char* ) const for detailed + * information on function parameters and behavior. + */ + String Copyright( const char* language = "en", const char* country = "US" ) const; + + /*! + * Retrieves localized description, manufacturer, device model and copyright + * information from the stored ICC profile. + * + * If this object does not transport an ICC profile, this routine clears the + * \a description, \a manufacturer, \a model and \a copyright strings. If a + * valid ICC profile is stored in this object, the passed strings will be + * assigned with the corresponding information, as close as possible to the + * requested localization. See Description( const char*, const char* ) const + * for detailed information on localization parameters. + */ + void GetInformation( String& description, String& manufacturer, String& model, String& copyright, + const char* language = "en", const char* country = "US" ) const; + + /*! + * Returns the ICC profile class of the stored profile. See the + * ICCProfileClass namespace for supported profile classes. + * + * If this object doesn't transport an ICC profile, this function returns + * ICCProfileClass::Unknown. + */ + profile_class Class() const; + + /*! + * Returns the ICC color space of the stored profile. See the ICCColorSpace + * namespace for supported color spaces. + * + * If this object doesn't transport an ICC profile, this function returns + * ICCColorSpace::Unknown. + */ + color_space ColorSpace() const; + + /*! + * Returns true iff this object stores an RGB ICC profile. + */ + bool IsRGB() const + { + return ColorSpace() == ICCColorSpace::RGB; + } + + /*! + * Returns true iff this object stores a grayscale ICC profile. + */ + bool IsGrayscale() const + { + return ColorSpace() == ICCColorSpace::Gray; + } + + /*! + * Returns true iff this object stores an ICC profile that supports the + * specified \a intent in the specified transform \a direction. See the + * ICCRenderingIntent and ICCRenderingDirection namespaces, respectively, + * for supported rendering intents and directions. + */ + bool SupportsRenderingIntent( rendering_intent intent, rendering_direction direction ) const; + + /*! + * Returns true iff this object stores an embedded ICC profile. + * + * An embedded ICC profile must have the Embedded Profile bit field + * (bit #0 of header byte #44) set. + */ + bool IsEmbedded() const; + + /*! + * Sets or clears the Embedded Profile header bit field (bit #0 of + * header byte #44) of the stored ICC profile. + * + * \note If this %ICCProfile object is being used to embed an ICC profile in + * an image file, the Embedded Profile flag must be set before + * embedding. + */ + void SetEmbeddedFlag( bool on = true ); + + /*! + * Clears or sets the Embedded Profile header bit field (bit #0 of + * header byte #44) of the stored ICC profile. + * + * This is a convenience member function, equivalent to + * SetEmbeddedFlag( false ) + */ + void ClearEmbeddedFlag() + { + SetEmbeddedFlag( false ); + } + + /*! + * Loads an ICC profile from a disk file at \a profilePath and stores it in + * this %ICCProfile object. + * + * If this object stores an ICC profile before calling this function, it is + * deallocated upon successful load of the specified ICC profile. + * + * If the specified file does not exist or is not readable, or if the file + * contains data that cannot be identified as a valid ICC profile, this + * function throws an Error exception. + */ + void Load( const String& profilePath ); + + /*! + * Forces this %ICCProfile object to store a copy of the ICC profile stored + * in the specified ByteArray container. Previously existing ICC profile + * data will be deallocated. + * + * If the specified container is empty, calling this function is equivalent + * to Clear(). If the container is not empty, it must store a valid ICC + * profile structure; otherwise this function will throw an Error exception. + */ + void Set( const ByteArray& profile ); + + /*! + * Forces this %ICCProfile object to store a copy of the raw ICC profile + * data at the specified location. Previously existing ICC profile data will + * be deallocated. + * + * The specified pointer must be the starting address of a valid ICC profile + * structure; otherwise this function will throw an Error exception. + */ + void Set( const void* rawData ); + + /*! + * Deallocates the stored ICC profile structure and all auxiliary data. + * + * If the profile has been opened before calling this function, any existing + * handle to it will not be closed or invalidated. + */ + void Clear() + { + m_data.Clear(); + m_path.Clear(); + } + + /*! + * Opens the ICC profile stored in this %ICCProfile object. Returns a handle + * to the opened ICC profile. + * + * If this object does not transport a valid ICC profile structure, this + * function throws an Error exception. + * + * Color management transformations are defined through handles to open ICC + * profiles. The caller is responsible for closing ICC profile handles when + * they are no longer needed. + */ + handle Open() const + { + return Open( m_data ); + } + + /*! + * Exchanges two ICC profiles \a x1 and \a x2. + */ + friend void Swap( ICCProfile& x1, ICCProfile& x2 ) + { + pcl::Swap( x1.m_data, x2.m_data ); + pcl::Swap( x1.m_path, x2.m_path ); + } + + /*! + * Opens an ICC profile disk file at \a profilePath. Returns a handle to the + * opened ICC profile. + * + * If the specified file does not exist or is not readable, or if it does + * not contain a valid ICC profile structure, this function throws an Error + * exception. + */ + static handle Open( const String& profilePath ); + + /*! + * Opens an ICC profile from raw ICC profile data stored at the specified + * location. Returns a handle to the opened ICC profile. + * + * If the argument does not point to a valid ICC profile structure, this + * function throws an Error exception. + */ + static handle Open( const void* rawData ); + + /*! + * Opens an ICC profile stored in the specified ByteArray container \a icc. + * Returns a handle to the opened ICC profile. + * + * If the specified container is empty or does not contain a valid ICC + * profile structure, this function throws an Error exception. + */ + static handle Open( const ByteArray& icc ) + { + return Open( icc.Begin() ); + } + + /*! + * Closes an open ICC profile handle. + */ + static void Close( handle h ); + + /*! + * Validates an ICC profile handle. Returns true iff the specified handle is + * a valid handle to an open ICC profile. + */ + static bool IsValidHandle( handle h ); + + /*! + * Validates an ICC profile structure stored in a file at \a profilePath. + * Returns true iff the specified file exists and contains a valid ICC + * profile. + */ + static bool IsValidFile( const String& profilePath ); + + /*! + * Validates an ICC profile from raw ICC profile data stored at the + * specified location. Returns true iff the argument points to a valid ICC + * profile structure. + */ + static bool IsValid( const void* rawdata ); + + /*! + * Validates an ICC profile structure stored in the specified ByteArray + * container \a icc. Returns true iff the container stores a valid ICC + * profile. + */ + static bool IsValid( const ByteArray& icc ) + { + return IsValid( icc.Begin() ); + } + + /*! + * Returns the localized profile description of an open ICC profile. + * + * \param h Handle to an open ICC profile, from which the requested + * profile description will be obtained. + * + * \param language Optional language code (ISO 639/2) of the requested + * profile description. The default value is "en" for + * English. + * + * \param country Optional country code (ISO 3166) of the requested + * profile description. The default value is "US" for the + * United States. + * + * This routine will always return a valid profile description, even if no + * localized version is available for the requested language and country. + * The returned description will be as close as possible to the requested + * localization. + */ + static String Description( handle h, const char* language = "en", const char* country = "US" ); + + /*! + * Returns the localized manufacturer information of an open ICC profile. + * + * See Description( handle, const char*, const char* ) for detailed + * information on function parameters and behavior. + */ + static String Manufacturer( handle h, const char* language = "en", const char* country = "US" ); + + /*! + * Returns the localized device model information of an open ICC profile. + * + * See Description( handle, const char*, const char* ) for detailed + * information on function parameters and behavior. + */ + static String Model( handle h, const char* language = "en", const char* country = "US" ); + + /*! + * Returns the localized copyright information of an open ICC profile. + * + * See Description( handle, const char*, const char* ) for detailed + * information on function parameters and behavior. + */ + static String Copyright( handle h, const char* language = "en", const char* country = "US" ); + + /*! + * Returns the ICC profile class of an open profile. See the ICCProfileClass + * namespace for supported profile classes. + */ + static profile_class Class( handle h ); + + /*! + * Returns the ICC color space of an open profile. See the ICCColorSpace + * namespace for supported color spaces. + */ + static color_space ColorSpace( handle h ); + + /*! + * Returns true iff an open profile supports the specified \a intent in the + * specified transform \a direction. See the ICCRenderingIntent and + * ICCRenderingDirection namespaces, respectively, for supported rendering + * intents and directions. + */ + static bool SupportsRenderingIntent( handle h, rendering_intent intent, rendering_direction direction ); + + /*! + * Returns the list of profile directories. + * + * The profile directories contain the ICC profiles currently installed in + * the system. The specific directories provided by this function are + * platform-dependent. + * + * On X11 Linux and FreeBSD, there is no universally standardized color + * management system. By default, the returned list will include a single + * directory that can be one of the following: + * + * /usr/share/color/icc + * ~/.color/icc + * + * for system-wide or user-local profiles, respectively. If none of the + * above directories exists (and is readable) on the local filesystem, the + * routine will return a fallback directory within the installation + * directory tree of the PixInsight core application. + * + * On OS X, the returned list may contain one or more from the following + * directories: + * + * ~/Library/ColorSync/Profiles + * /Library/ColorSync/Profiles + * /Network/Library/ColorSync/Profiles + * + * Finally, on Windows this function returns the current COLOR directory, + * as reported by the GetColorDirectory() Win32 API function. + */ + static StringList ProfileDirectories(); + + /*! + * Gets a list of full paths for every ICC profile on a given directory. + * + * \param dirPath Optional path to a search directory. If no directory is + * specified, or if an empty string is passed, the whole + * list of system profile directories, as returned by the + * ProfileDirectories() member function, will be searched + * recursively. + * + * This routine performs a recursive directory search on the specified + * directory, or on each system profiles directory if no directory is + * specified. Profiles are quickly identified by opening them and validating + * their profile headers. The search is not limited to any particular file + * suffix such as ".icc" or ".icm". + * + * Returns a list of full paths to the ICC profile files found on the + * search directory. + */ + static StringList FindProfiles( const String& dirPath = String() ); + + /*! + * Finds the file path to an installed ICC profile, given its profile + * description. + * + * \param description Description of the profile to search for. + * + * \param exactMatch If true, this routine will search for a profile that + * matches the specified \a description exactly, including + * character case. If false, the routine will report any + * profile whose description contains the specified + * description performing case-insensitive comparisons. + * The default value is true, so profile descriptions must + * be matched exactly by default. + * + * This function searches the system color directories, as reported by the + * ProfileDirectories() member function, until it finds an ICC profile with + * the specified \a description. This routine performs a recursive directory + * search on each profiles directory. + * + * Returns the full path to the ICC profile, or an empty string if no + * profile was found matching the specified \a description. + */ + static String FindInstalledProfile( const String& description, bool exactMatch = true ); + + /*! + * Extracts a subset of profile paths and their descriptions from a + * previously retrieved list of full paths to ICC profiles. + * + * \param[out] selectedDescriptionsList The list of profile descriptions + * for selected profiles. + * + * \param[out] selectedPathsList The list of paths to selected profiles. + * + * \param pathList The input list of paths to ICC profiles. + * + * \param spaces A combination of ICC color spaces for selected ICC + * profiles. + * + * \param classes A combination of ICC device classes for selected ICC + * profiles. + */ + static void ExtractProfileList( StringList& selectedDescriptionsList, + StringList& selectedPathsList, + const StringList& pathList, + ICCColorSpaces spaces = ICCColorSpace::Any, + ICCProfileClasses classes = ICCProfileClass::Any ); + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::ICCProfile::Info + * \brief A structure to hold descriptive data about ICC profiles. + * \ingroup color_management + * + * The %ICCProfile::Info structure is designed to be used with the + * ICCProfile::FindProfilesByColorSpace() utility function. + */ + struct Info + { + String description; //!< Description of an ICC profile + String path; //!< Full path to an ICC profile disk file + + /*! + * Constructs an %ICCProfile::Info structure. + */ + Info( const String& a_description, const String& a_path = String() ) + : description( a_description ) + , path( a_path ) + { + } + + /*! + * Equality operator. Two %ICCProfile::Info objects are equal if their + * profile descriptions are equal. + */ + bool operator ==( const Info& x ) const + { + return description == x.description; + } + + /*! + * Less than relational operator. %ICCProfile::Info objects are sorted by + * their profile descriptions + */ + bool operator <( const Info& x ) const + { + return description < x.description; + } + }; + + /*! + * Represents a sorted list of ICC profile information items. + */ + typedef SortedArray profile_list; + + /*! + * Returns a sorted list of profile information items (full file paths and + * profile description strings) for the existing ICC profiles of the + * specified ICC profile color spaces. + * + * \param spaces A combination of ICC profile color spaces to search for. + * + * The search operation is restricted to the system color directories, as + * reported by the ProfileDirectories() member function. This routine + * performs a recursive directory search on each profiles directory. + * + * Duplicate profiles are not included in the output \a info list. If the + * same profile is present in two or more directories, or if the same + * profile is present on the same directory with different file names, only + * the first instance seen will be included. Profiles are compared by their + * profile descriptions. + */ + static profile_list FindProfilesByColorSpace( ICCColorSpaces spaces ); + + /*! + * \internal + */ + static void ThrowErrorWithCMSInfo( const String& message ); + +private: + + ByteArray m_data; // ICC profile data + String m_path; // empty if this is an embedded or newly created profile +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ICCProfile_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ICCProfile.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ICCProfileTransformation.h b/3rdparty/include/pcl/ICCProfileTransformation.h new file mode 100644 index 0000000..7e93dd0 --- /dev/null +++ b/3rdparty/include/pcl/ICCProfileTransformation.h @@ -0,0 +1,691 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ICCProfileTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ICCProfileTransformation_h +#define __PCL_ICCProfileTransformation_h + +/// \file pcl/ICCProfileTransformation.h + +#include + +#include +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ + class ImageWindow; +} // pi +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ICCProfileTransformation + * \brief Conversion of pixel values between ICC profile color spaces + * + * %ICCProfileTransformation is a portable color transformation based on ICC + * color profiles. This class is a high-level interface to the color management + * functionality implemented in the PixInsight core application. + * + * %ICCProfileTransformation implements simple profile-to-profile color + * transformations, multiprofile transformations, and device proofing + * transformations with out-of-gamut checks. + * + * \ingroup color_management + * \sa ICCProfile, ImageTransformation + */ +class PCL_CLASS ICCProfileTransformation : public ImageTransformation, public ParallelProcess +{ +public: + + /*! + * Represents an ICC rendering intent. + */ + typedef ICCRenderingIntent::value_type rendering_intent; + + /*! + * Represents an opaque handle to a server-side ICC transformation. + */ + typedef void* transformation_handle; + + /*! + * Represents a list of handles to open ICC profiles. + */ + typedef Array profile_list; + + /*! + * Constructs an empty %ICCPRofileTransformation object. + */ + ICCProfileTransformation() = default; + + /*! + * Move constructor. + */ + ICCProfileTransformation( ICCProfileTransformation&& x ) + : ImageTransformation( x ) + , ParallelProcess( x ) + , m_transformation( x.m_transformation ) + , m_profiles( std::move( x.m_profiles ) ) + , m_intent( x.m_intent ) + , m_proofingIntent( x.m_proofingIntent ) + , m_blackPointCompensation( x.m_blackPointCompensation ) + , m_forceFloatingPoint( x.m_forceFloatingPoint ) + , m_highResolutionCLUT( x.m_highResolutionCLUT ) + , m_lowResolutionCLUT( x.m_lowResolutionCLUT ) + , m_proofingTransformation( x.m_proofingTransformation ) + , m_gamutCheck( x.m_gamutCheck ) + , m_srcRGB( x.m_srcRGB ) + , m_dstRGB( x.m_dstRGB ) + , m_floatingPoint( x.m_floatingPoint ) + { + x.m_transformation = nullptr; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ICCProfileTransformation& operator =( ICCProfileTransformation&& x ) + { + (void)ImageTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + m_transformation = x.m_transformation; + m_profiles = std::move( x.m_profiles ); + m_intent = x.m_intent; + m_proofingIntent = x.m_proofingIntent; + m_blackPointCompensation = x.m_blackPointCompensation; + m_forceFloatingPoint = x.m_forceFloatingPoint; + m_highResolutionCLUT = x.m_highResolutionCLUT; + m_lowResolutionCLUT = x.m_lowResolutionCLUT; + m_proofingTransformation = x.m_proofingTransformation; + m_gamutCheck = x.m_gamutCheck; + m_srcRGB = x.m_srcRGB; + m_dstRGB = x.m_dstRGB; + m_floatingPoint = x.m_floatingPoint; + x.m_transformation = nullptr; + return *this; + } + + /*! + * Copy constructor. This constructor is disabled because ICC color profile + * transformations are unique objects. + */ + ICCProfileTransformation( const ICCProfileTransformation& ) = delete; + + /*! + * Copy assignment. This operator is disabled because ICC color profile + * transformations are unique objects. + */ + ICCProfileTransformation& operator =( const ICCProfileTransformation& ) = delete; + + /*! + * Destroys an %ICCPRofileTransformation object. + */ + virtual ~ICCProfileTransformation() + { + Clear(); + } + + /*! + * Loads an ICC profile from a file at \a profilePath and adds it to this + * ICC profile transformation. + */ + void Add( const String& profilePath ); + + /*! + * Adds the specified ICC \a profile to this ICC profile transformation. + */ + void Add( const ICCProfile& profile ); + + /*! + * Adds an already open ICC profile \a profileHandle to this ICC profile + * transformation. + */ + void Add( const ICCProfile::handle profileHandle ); + + /*! + * Returns true iff this object represents a valid color space transformation + * based on ICC color profiles. + * + * For this member function to return true, the underlying low-level + * transformation should have been created, either implicitly by using + * this object to apply a color transformation, or explicitly by calling + * Create(). + */ + bool IsValid() const + { + return m_transformation != nullptr; + } + + /*! + * Returns a reference to the immutable list of ICC profiles in this ICC + * profile transformation. + */ + const profile_list& Profiles() const + { + return m_profiles; + } + + /*! + * Returns the ICC rendering intent for this ICC profile transformation. + */ + rendering_intent RenderingIntent() const + { + return m_intent; + } + + /*! + * Sets the ICC rendering intent for this ICC profile transformation. + * + * When no intent is set explicitly with this function, the default + * rendering intent is ICCRenderingIntent::Perceptual. + */ + void SetRenderingIntent( rendering_intent i ) + { + CloseTransformation(); + m_intent = i; + } + + /*! + * Returns true iff this ICC profile transformation applies a black point + * compensation algorithm. + */ + bool UsingBlackPointCompensation() const + { + return m_blackPointCompensation; + } + + /*! + * Enables or disables black point compensation for this ICC + * profile transformation. + * + * When not enabled explicitly with this function, no black point + * compensation is applied by default. + */ + void EnableBlackPointCompensation( bool enable = true ) + { + CloseTransformation(); + m_blackPointCompensation = enable; + } + + /*! + * Disables or enables black point compensation for this ICC + * profile transformation. + * + * This is a convenience member function, equivalent to + * EnableBlackPointCompensation( !disable ) + */ + void DisableBlackPointCompensation( bool disable = true ) + { + EnableBlackPointCompensation( !disable ); + } + + /*! + * Returns true iff this ICC profile transformation forces the use of + * floating point operations for computation of transformed pixel samples of + * all numerical data types. + * + * When this option is disabled (which is its default state), 16-bit integer + * arithmetics will be used for 8-bit and 16-bit integer images. Floating + * point will always be used for the rest of images, irrespective of the + * state of this option, in order to preserve numerical accuracy. + */ + bool ForcesFloatingPointTransformation() const + { + return m_forceFloatingPoint; + } + + /*! + * Enables or disables enforcement of floating point computations for this + * ICC profile transformation. + */ + void ForceFloatingPointTransformation( bool force = true ) + { + CloseTransformation(); + m_forceFloatingPoint = force; + } + + /*! + * Disables or enables enforcement of floating point computations for this + * ICC profile transformation. + * + * This is a convenience member function, equivalent to + * ForceFloatingPointTransformation( !relax ) + */ + void RelaxFloatingPointTransformation( bool relax = true ) + { + ForceFloatingPointTransformation( !relax ); + } + + /*! + * Returns true iff this ICC profile transformation uses high-resolution + * color lookup tables (CLUTs) for precalculation of device link functions. + * + * Disabling high-resolution CLUTs may provide a (usually small) speed + * improvement. + * + * By default, %ICCProfileTransformation uses high-resolution CLUTs. + */ + bool UsingHighResolutionCLUT() const + { + return m_highResolutionCLUT; + } + + /*! + * Enables or disables usage of high-resolution CLUT tables for this ICC + * profile transformation. + */ + void EnableHighResolutionCLUT( bool enable = true ) + { + CloseTransformation(); + if ( (m_highResolutionCLUT = enable) == true ) + m_lowResolutionCLUT = false; + } + + /*! + * Disables or enables usage of high-resolution CLUT tables for this ICC + * profile transformation. + * + * This is a convenience member function, equivalent to + * EnableHighResolutionCLUT( !disable ) + */ + void DisableHighResolutionCLUT( bool disable = true ) + { + EnableHighResolutionCLUT( !disable ); + } + + /*! + * Returns true iff this ICC profile transformation uses low-resolution color + * lookup tables (CLUTs) for precalculation of device link functions. + * + * Enabling low-resolution CLUTs may provide a (usually small) speed + * improvement. + * + * By default, %ICCProfileTransformation uses high-resolution CLUTs. + */ + bool UsingLowResolutionCLUT() const + { + return m_lowResolutionCLUT; + } + + /*! + * Enables or disables usage of low-resolution color lookup tables (CLUTs) + * in this ICC color transformation. + */ + void EnableLowResolutionCLUT( bool enable = true ) + { + CloseTransformation(); + if ( (m_lowResolutionCLUT = enable) == true ) + m_highResolutionCLUT = false; + } + + /*! + * Disables or enables usage of low-resolution color lookup tables (CLUTs) + * in this ICC color transformation. + * + * This is a convenience member function, equivalent to + * EnableLowResolutionCLUT( !disable ) + */ + void DisableLowResolutionCLUT( bool disable = true ) + { + EnableLowResolutionCLUT( !disable ); + } + + /*! + * Returns true iff this object represents a device proofing transformation. + */ + bool IsProofingTransformation() const + { + return m_proofingTransformation; + } + + /*! + * Forces the immediate creation (or re-creation) of the underlying + * low-level transformation. + * + * You normally shouldn't need to call this member function, since + * %ICCProfileTransformation automatically creates the necessary low-level + * transformations at the points they are required. + */ + void Create() + { + CreateTransformation( m_forceFloatingPoint ); + } + + /*! + * \internal + * Returns the low-level handle that this %ICCProfileTransformation object + * serves as a high-level interface to. + * + * This function is intended for private use of the PixInsight core + * application; you normally shouldn't need to call it. + */ + transformation_handle Handle() const + { + return m_transformation; + } + + /*! + * Resets this %ICCProfileTransformation object to a default state. + * + * The list of ICC profiles is cleared and the underlying transformation and + * all associated data structures are destroyed. + */ + void Clear(); + + /*! + * Returns true iff the starting ICC profile in this transformation is a RGB + * profile. + */ + bool IsSourceRGBProfile() const + { + return m_srcRGB; + } + + /*! + * Returns true iff the target (last) ICC profile in this transformation is a + * RGB profile. + */ + bool IsTargetRGBProfile() const + { + return m_dstRGB; + } + +protected: + + /* + * Opaque handle to the profile transformation. + */ + mutable transformation_handle m_transformation = nullptr; + + /* + * The ICC profiles, rendering intents and operating parameters that define + * this color transformation. + */ + profile_list m_profiles; + rendering_intent m_intent = ICCRenderingIntent::Perceptual; + rendering_intent m_proofingIntent = ICCRenderingIntent::AbsoluteColorimetric; + bool m_blackPointCompensation = false; + bool m_forceFloatingPoint = false; + bool m_highResolutionCLUT = true; + bool m_lowResolutionCLUT = false; + bool m_proofingTransformation = false; + bool m_gamutCheck = false; + + /* + * Flags indicating source and destination color spaces. + * ### NB: These refer to the color spaces of the source and target pixel + * buffers, *not* to the color spaces of the profiles involved in the + * transformation. + */ + mutable bool m_srcRGB = false; + mutable bool m_dstRGB = false; + + /* + * Flag indicating whether the current transformation (if any) has been + * created forcing floating point arithmetics. + */ + mutable bool m_floatingPoint = false; + + void AddAt( size_type, const String& ); + void AddAt( size_type, const ICCProfile& ); + void AddAt( size_type, const ICCProfile::handle ); + void AddOrReplaceAt( size_type i, const ICCProfile::handle ); + + void CreateTransformation( bool ) const; + void CloseTransformation() const; + + // Inherited from ImageTransformation + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ICCProofingTransformation + * \brief A soft proofing ICC profile transformation + * + * %ICCProofingTransformation implements a device proofing + * transformation. This kind of color transformation allows previewing of + * the final results that would be obtained on a specific proofing + * device without actually performing any rendition on physical media. + * + * A device proofing transformation uses three ICC profiles: a source + * profile, a proofing profile, and a target profile. In + * a typical scenario, the proofing device is a printer and we want to proof it + * on a display monitor. In this common case we have: + * + * Source profile = The ICC profile describing the color space to which source + * pixel values are referred. + * + * Proofing profile = The ICC profile describing the device where the final + * result will be obtained (usually a printer). + * + * Target profile = The ICC profile describing the display device where we'll + * preview the result (usually a monitor). + * + * \ingroup color_management + * \sa ICCProfileTransformation, ICCProfile + */ +class PCL_CLASS ICCProofingTransformation : public ICCProfileTransformation +{ +public: + + /*! + * Constructs a default %ICCProofingTransformation object. + */ + ICCProofingTransformation() + { + m_proofingTransformation = true; + m_profiles.Add( static_cast( nullptr ), 3 ); + } + + /*! + * Move constructor. + */ + ICCProofingTransformation( ICCProofingTransformation&& ) = default; + + /*! + * Destroys an %ICCProofingTransformation object. + */ + virtual ~ICCProofingTransformation() + { + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ICCProofingTransformation& operator =( ICCProofingTransformation&& ) = default; + + /*! + * Loads an ICC profile from a file at \a profilePath and selects it as the + * profile describing the source color space in this transformation. + */ + void SetSourceProfile( const String& profilePath ); + + /*! + * Selects the specified ICC \a profile as the profile describing the source + * color space in this transformation. + */ + void SetSourceProfile( const ICCProfile& profile ); + + /*! + * Selects an already open ICC profile \a profileHandle as the profile + * describing the source color space in this transformation. + */ + void SetSourceProfile( const ICCProfile::handle profileHandle ); + + /*! + * Loads an ICC profile from a file at \a profilePath and selects it as the + * profile describing the proofing device in this transformation. + */ + void SetProofingProfile( const String& profilePath ); + + /*! + * Selects the specified ICC \a profile as the profile describing the + * proofing device in this transformation. + */ + void SetProofingProfile( const ICCProfile& profile ); + + /*! + * Selects an already open ICC profile \a profileHandle as the profile + * describing the proofing device in this transformation. + */ + void SetProofingProfile( const ICCProfile::handle profileHandle ); + + /*! + * Loads an ICC profile from a file at \a profilePath and selects it as the + * profile describing the target (output) color space in this + * transformation. + */ + void SetTargetProfile( const String& profilePath ); + + /*! + * Selects the specified ICC \a profile as the profile describing the target + * (output) color space in this transformation. + */ + void SetTargetProfile( const ICCProfile& profile ); + + /*! + * Selects an already open ICC profile \a profileHandle as the profile + * describing the target (output) color space in this transformation. + */ + void SetTargetProfile( const ICCProfile::handle profileHandle ); + + /*! + * Returns the proofing rendering intent for this ICC proofing + * transformation. + */ + rendering_intent ProofingIntent() const + { + return m_intent; + } + + /*! + * Sets the proofing rendering intent for this ICC proofing transformation. + * + * The default proofing intent is ICCRenderingIntent::AbsoluteColorimetric. + */ + void SetProofingIntent( rendering_intent i ) + { + CloseTransformation(); + m_proofingIntent = i; + } + + /*! + * Returns true iff gamut checking has been enabled for this color + * transformation. When gamut check is enabled, out-of-gamut colors in the + * final rendition are automatically replaced by the current gamut + * warning color (see the SetGamutWarningColor() member function). + */ + bool IsGamutCheckEnabled() const + { + return m_gamutCheck; + } + + /*! + * Enables or disables gamut check for this color transformation. + */ + void EnableGamutCheck( bool enable = true ) + { + CloseTransformation(); + m_gamutCheck = enable; + } + + /*! + * Disables or enables gamut check for this color transformation. + */ + void DisableGamutCheck( bool disable = true ) + { + EnableGamutCheck( !disable ); + } + + /*! + * Returns the current gamut warning color used to represent + * out-of-gamut pixel values in final proofing renditions. The returned + * value is a 32-bit RGBA pixel value. + */ + static RGBA GamutWarningColor(); + + /*! + * Specifies the special RGB color used to represent out-of-gamut pixel + * values in final proofing renditions. Only used for proofing + * transformations with gamut check enabled. + * + * \param color Gamut warning color encoded as a 32-bit RGBA pixel value. + * + * Note that since this is a static member function, the current gamut + * warning color is a global setting that affects all proofing + * transformations performed by the calling module. + */ + static void SetGamutWarningColor( RGBA color ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ICCProfileTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ICCProfileTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Image.h b/3rdparty/include/pcl/Image.h new file mode 100644 index 0000000..4875882 --- /dev/null +++ b/3rdparty/include/pcl/Image.h @@ -0,0 +1,17817 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Image.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Image_h +#define __PCL_Image_h + +/// \file pcl/Image.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef __PCL_IMAGE_NO_BITMAP +# ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +# ifndef __PI_Bitmap_h +# include // using server-side bitmaps +# endif +using namespace pi; +# else +# ifndef __PCL_Bitmap_h +# include // using client-side bitmaps +# endif +# endif +# ifndef __PCL_Color_h +# include // for RGBA +# endif +#endif + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ + class SharedImage; +} +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ImageOp + * \brief Arithmetic, bitwise logical and pixel composition operations. + * + * Supported operations: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ImageOp::Nop No operation
ImageOp::Mov Copy pixels
ImageOp::Add Add
ImageOp::Sub Subtract
ImageOp::Mul Multiply
ImageOp::Div Divide
ImageOp::Pow Raise
ImageOp::Dif Absolute difference
ImageOp::Min Minimum value
ImageOp::Max Maximum value
ImageOp::Or Bitwise OR (inclusive OR)
ImageOp::And Bitwise AND
ImageOp::Xor Bitwise XOR (exclusive OR)
ImageOp::Not Bitwise NOT
ImageOp::Nor Bitwise NOR (inclusive NOR)
ImageOp::Nand Bitwise NAND
ImageOp::Xnor Bitwise XNOR (exclusive NOR)
ImageOp::ColorBurn Color burn pixel composition operator
ImageOp::LinearBurn Linear burn pixel composition operator
ImageOp::Screen Screen pixel composition operator
ImageOp::ColorDodge Color dodge pixel composition operator
ImageOp::Overlay Overlay pixel composition operator
ImageOp::SoftLight Soft light pixel composition operator
ImageOp::HardLight Hard light pixel composition operator
ImageOp::VividLight Vivid light pixel composition operator
ImageOp::LinearLight Linear light pixel composition operator
ImageOp::PinLight Pin light pixel composition operator
ImageOp::Exclusion Exclusion pixel composition operator
+ */ +namespace ImageOp +{ + enum value_type + { + Nop, // No operation + Mov, // a = b + Add, // a + b + Sub, // a - b + Mul, // a * b + Div, // a / b + Pow, // Pow( a, b ) + Dif, // |a - b| + Min, // Min( a, b ) + Max, // Max( a, b ) + Or, // a | b + And, // a & b + Xor, // a ^ b + Not, // ~a + Nor, // ~(a | b) + Nand, // ~(a & b) + Xnor, // ~(a ^ b) + ColorBurn, // 1 - Min( (1 - a)/b, 1 ) + LinearBurn, // a + b - 1 + Screen, // 1 - (1 - a)*(1 - b) + ColorDodge, // Min( a/(1 - b), 1 ) + Overlay, // (a > 0.5) ? 1 - ((1 - 2*(a - 0.5)) * (1 - b)) : 2*a*b + SoftLight, // (b > 0.5) ? 1 - (1 - a)*(1 - b - 0.5) : a*(b + 0.5) + HardLight, // (b > 0.5) ? 1 - (1 - a)*(1 - 2*(b - 0.5)) : 2*a*b + VividLight, // (b > 0.5) ? 1 - Max( (1 - a)/(b - 0.5)/2, 1.0 ) : Min( a/(1 - 2*b ), 1.0 ) + LinearLight, // (b > 0.5) ? Max( a + 2*(b - 0.5), 1.0 ) : Max( a + 2*b - 1, 1.0 ) + PinLight, // (b > 0.5) ? Max( a, 2*(b - 0.5) ) : Min( a, 2*b ) + Exclusion, // 0.5 - 2*(a - 0.5)*(b - 0.5) + NumberOfOperators + }; + + /*! + * Returns true iff the specified operator \a op is an arithmetic operator. + */ + inline bool IsArithmeticOperator( int op ) noexcept + { + return op >= Add && op <= Dif; + } + + /*! + * Returns true iff the specified operator \a op is a bitwise logical + * operator. + */ + inline bool IsBitwiseLogicalOperator( int op ) noexcept + { + return op >= Or && op <= Xnor; + } + + /*! + * Returns true iff the specified operator \a op is a move or replace + * operator. + */ + inline bool IsMoveOperator( int op ) noexcept + { + return op == Mov || op == Min || op == Max; + } + + /*! + * Returns true iff the specified operator \a op is a pixel composition + * operator. + */ + inline bool IsPixelCompositionOperator( int op ) noexcept + { + return op >= ColorBurn && op <= Exclusion; + } + + /*! + * Returns a string with the name of a pixel \a operation. + */ + String Id( value_type operation ); +} + +// ---------------------------------------------------------------------------- + +#define m_pixelData m_data->data +#define m_channelData( c ) reinterpret_cast( PCL_ASSUME_ALIGNED_32( m_pixelData[c] ) ) +#define m_allocator m_data->allocator + +#define m_width m_geometry->width +#define m_height m_geometry->height +#define m_numberOfChannels m_geometry->numberOfChannels + +#define m_colorSpace m_color->colorSpace +#define m_RGBWS m_color->RGBWS + +#define m_channel m_selected.channel +#define m_lastChannel m_selected.lastChannel +#define m_point m_selected.point +#define m_rectangle m_selected.rectangle +#define m_clipLow m_selected.clipLow +#define m_clipHigh m_selected.clipHigh +#define m_clippedLow m_selected.clippedLow +#define m_clippedHigh m_selected.clippedHigh + +// ---------------------------------------------------------------------------- + +class PCL_CLASS ImageVariant; +class PCL_CLASS ImageTransformation; +class PCL_CLASS BidirectionalImageTransformation; + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericImage + * \brief Implements a generic, two-dimensional, shared or local image. + * + * Template class %GenericImage implements a two-dimensional image in PCL. It + * inherits all public properties and functionality from its base classes: + * ImageGeometry, ImageColor, and AbstractImage, and adds a rich set of + * processing primitives through a versatile and easily adaptable interface. + * + * Template instantiations of %GenericImage and GenericPixelTraits provide + * instantiable image classes adapted to particular pixel sample types. Seven + * image types are already predefined in this way by PCL, corresponding to all + * supported real, integer and complex two-dimensional images in the current + * versions of the PixInsight platform: + * + * + * + * + * + * + * + * + * + *
pcl::Image 32-bit floating point real image
pcl::DImage 64-bit floating point real image
pcl::ComplexImage 32-bit floating point complex image
pcl::DComplexImage 64-bit floating point complex image
pcl::UInt8Image 8-bit unsigned integer image
pcl::UInt16Image 16-bit unsigned integer image
pcl::UInt32Image 32-bit unsigned integer image
+ * + * Developers can define new image types easily by writing suitable + * instantiations of GenericPixelTraits and the corresponding instantiations of + * %GenericImage. This system allows for the implementation of new image types + * tightly adapted to particular requirements. + * + * \sa \ref image_types_2d "2-D Image Types", + * \ref image_iterators "Image Iterators", ImageGeometry, ImageColor, + * AbstractImage, ImageVariant, GenericPixelTraits + */ +template +class PCL_CLASS GenericImage : public AbstractImage +{ +public: + + /*! + * Represents the GenericPixelTraits instantiation used in this template + * instantiation of %GenericImage. + * + * The \c pixel_traits type identifies a class implementing basic storage + * and functional primitives adapted to a particular sample data type. + */ + typedef P pixel_traits; + + /*! + * Represents a class responsible for allocation and deallocation of pixel + * data in this template instantiation of %GenericImage. \c pixel_allocator + * must be able to handle shared and local pixel data allocation and + * deallocation in a transparent way. + * + * By default, %GenericImage uses an instantiation of the PixelAllocator + * template class for \c pixel_traits. + */ + typedef PixelAllocator

pixel_allocator; + + /*! + * Represents the data type used to store pixel sample values in this + * template instantiation of %GenericImage. + */ + typedef typename pixel_traits::sample sample; + + /*! + * An enumerated type that represents the set of supported color spaces. + * Valid constants for this enumeration are defined in the ColorSpace + * namespace. + */ + typedef AbstractImage::color_space color_space; + + /*! + * The type of a container class used to store rectangular and channel range + * selections. + */ + typedef AbstractImage::selection_stack selection_stack; + + /*! + * An enumerated type that represents the set of supported arithmetic and + * bitwise pixel operations. Valid constants for this enumeration are + * defined in the ImageOp namespace. + */ + typedef ImageOp::value_type image_op; + + /*! + * A vector of pixel sample values. + */ + typedef GenericVector sample_vector; + + /*! + * A dynamic array of pixel sample values. + */ + typedef Array sample_array; + + // ------------------------------------------------------------------------- + + /*! + * \defgroup image_iterators Image Iterator Classes + */ + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::sample_iterator + * \brief Mutable pixel sample iterator. + * + * A mutable pixel sample iterator provides read/write, random access to + * pixel samples in a single channel of an image. + * + * \ingroup image_iterators + */ + class sample_iterator + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + sample_iterator() = default; + + /*! + * Constructs a mutable pixel sample iterator for one channel of an + * image. + * + * \param image The image to iterate. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + sample_iterator( image_type& image, int channel = -1 ) + : m_image( &image ) + { + m_image->EnsureUnique(); + if ( m_image->ParseChannel( channel ) ) + { + m_iterator = (*m_image)[channel]; + m_end = m_iterator + m_image->NumberOfPixels(); + } + } + + /*! + * Constructs a mutable pixel sample iterator for a range of contiguous + * pixel samples of an image. + * + * \param image The image to iterate. + * + * \param i Pointer to the first pixel sample in the iteration + * range. The iterator will be initialized to access this + * pixel sample just after construction. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to pixel + * samples in the \e same channel of the specified \a image. + */ + sample_iterator( image_type& image, sample* i, sample* j ) + : m_image( &image ) + , m_iterator( i ) + , m_end( j ) + { + } + + /*! + * Copy constructor. + */ + sample_iterator( const sample_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + sample_iterator& operator =( const sample_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return m_image != nullptr && m_iterator != nullptr; + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *m_image; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator. + */ + sample* Position() const noexcept + { + return m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel sample iterator is active if it has not reached (or + * surpassed) its iteration limit: either the end of the iterated image + * channel, or the end of the iteration range, depending on how the + * iterator has been constructed. + */ + operator bool() const noexcept + { + return m_iterator < m_end; + } + + /*! + * Indirection operator. Returns a reference to the pixel sample pointed + * to by this iterator. + */ + sample& operator *() const noexcept + { + return *m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated image channel. Returns a reference to + * this iterator. + */ + sample_iterator& operator ++() noexcept + { + ++m_iterator; + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated image channel. Returns a copy of the + * iterator as it was before incrementing it. + */ + sample_iterator operator ++( int ) noexcept + { + return sample_iterator( *m_image, m_iterator++, m_end ); + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated image channel, then returns a reference + * to this iterator. + */ + sample_iterator& operator --() noexcept + { + --m_iterator; + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated image channel. Returns a copy of the + * iterator as it was before decrementing it. + */ + sample_iterator operator --( int ) noexcept + { + return sample_iterator( *m_image, m_iterator--, m_end ); + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + sample_iterator& operator +=( distance_type delta ) noexcept + { + m_iterator += delta; + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + sample_iterator& operator -=( distance_type delta ) noexcept + { + m_iterator -= delta; + return *this; + } + + /*! + * Moves this iterator on the iterated image channel by the specified + * horizontal and vertical increments in pixels, \a dx and \a dy + * respectively, relative to its current position. Positive (negative) + * \a dx increments move the iterator rightwards (leftwards). Positive + * (negative) \a dy increments move the iterator downwards (upwards). + */ + sample_iterator& MoveBy( int dx, int dy ) noexcept + { + m_iterator += distance_type( dy )*m_image->Width() + distance_type( dx ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend sample_iterator operator +( const sample_iterator& i, distance_type delta ) noexcept + { + return sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend sample_iterator operator +( distance_type delta, const sample_iterator& i ) noexcept + { + return sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend sample_iterator operator -( const sample_iterator& i, distance_type delta ) noexcept + { + return sample_iterator( *i.m_image, i.m_iterator - delta, i.m_end ); + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const sample_iterator& i, const sample_iterator& j ) noexcept + { + return i.m_iterator - j.m_iterator; + } + + /*! + * Returns the distance in pixels between an iterator \a i and a sample + * pointer \a j. + */ + friend distance_type operator -( const sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator - j; + } + + /*! + * Returns the distance in pixels between a sample pointer \a i and an + * iterator \a j. + */ + friend distance_type operator -( const sample* i, const sample_iterator& j ) noexcept + { + return i - j.m_iterator; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const sample_iterator& i, const sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const sample_iterator& i, const sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + + protected: + + image_type* m_image = nullptr; + sample* __restrict__ m_iterator = nullptr; + const sample* __restrict__ m_end = nullptr; + + friend class const_sample_iterator; + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_sample_iterator + * \brief Immutable pixel sample iterator. + * + * An immutable pixel sample iterator provides read-only, random access to + * pixel samples in a single channel of an image. + * + * \ingroup image_iterators + */ + class const_sample_iterator + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_sample_iterator() = default; + + /*! + * Constructs an immutable pixel sample iterator for one channel of an + * image. + * + * \param image The constant image to iterate. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + const_sample_iterator( const image_type& image, int channel = -1 ) + : m_image( &image ) + { + if ( m_image->ParseChannel( channel ) ) + { + m_iterator = (*m_image)[channel]; + m_end = m_iterator + m_image->NumberOfPixels(); + } + } + + /*! + * Constructs an immutable pixel sample iterator for a range of + * contiguous pixel samples of an image. + * + * \param image The constant image to iterate. + * + * \param i Pointer to the first constant pixel sample in the + * iteration range. The iterator will be initialized to + * access this pixel sample just after construction. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to constant + * pixel samples in the \e same channel of the specified \a image. + */ + const_sample_iterator( const image_type& image, const sample* i, const sample* j ) + : m_image( &image ) + , m_iterator( i ) + , m_end( j ) + { + } + + /*! + * Constructs an immutable iterator from a mutable iterator. + * + * \note Don't confuse this constructor with the copy constructor for the + * const_sample_iterator class. Note that the argument to this function + * is a reference to an object of a different class. + */ + const_sample_iterator( const sample_iterator& i ) + : m_image( i.m_image ) + , m_iterator( i.m_iterator ) + , m_end( i.m_end ) + { + } + + /*! + * Copy constructor. + */ + const_sample_iterator( const const_sample_iterator& ) = default; + + /*! + * Assigns a mutable iterator to this object. Returns a reference to this + * iterator. + */ + const_sample_iterator& operator =( const sample_iterator& i ) noexcept + { + m_image = i.m_image; + m_iterator = i.m_iterator; + m_end = i.m_end; + return *this; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + const_sample_iterator& operator =( const const_sample_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return m_image != nullptr && m_iterator != nullptr; + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *m_image; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator. + */ + const sample* Position() const noexcept + { + return m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel sample iterator is active if it has not reached (or + * surpassed) its iteration limit: either the end of the iterated image + * channel, or the end of the iteration range, depending on how the + * iterator has been constructed. + */ + operator bool() const noexcept + { + return m_iterator < m_end; + } + + /*! + * Indirection operator. Returns a reference to the constant pixel sample + * pointed to by this iterator. + */ + const sample& operator *() const noexcept + { + return *m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated image channel, then returns a reference + * to this iterator. + */ + const_sample_iterator& operator ++() noexcept + { + ++m_iterator; + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated image channel. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_sample_iterator operator ++( int ) noexcept + { + return const_sample_iterator( *m_image, m_iterator++, m_end ); + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated image channel, then returns a reference + * to this iterator. + */ + const_sample_iterator& operator --() noexcept + { + --m_iterator; + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated image channel. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_sample_iterator operator --( int ) noexcept + { + return const_sample_iterator( *m_image, m_iterator--, m_end ); + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_sample_iterator& operator +=( distance_type delta ) noexcept + { + m_iterator += delta; + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_sample_iterator& operator -=( distance_type delta ) noexcept + { + m_iterator -= delta; + return *this; + } + + /*! + * Moves this iterator on the iterated image channel by the specified + * horizontal and vertical increments in pixels, \a dx and \a dy + * respectively, relative to its current position. Positive (negative) + * \a dx increments move the iterator rightwards (leftwards). Positive + * (negative) \a dy increments move the iterator downwards (upwards). + */ + const_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + m_iterator += distance_type( dy )*m_image->Width() + distance_type( dx ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_sample_iterator operator +( const const_sample_iterator& i, distance_type delta ) noexcept + { + return const_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_sample_iterator operator +( distance_type delta, const const_sample_iterator& i ) noexcept + { + return const_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_sample_iterator operator -( const const_sample_iterator& i, distance_type delta ) noexcept + { + return const_sample_iterator( *i.m_image, i.m_iterator - delta, i.m_end ); + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const const_sample_iterator& i, const const_sample_iterator& j ) noexcept + { + return i.m_iterator - j.m_iterator; + } + + /*! + * Returns the distance in pixels between an iterator \a i and a sample + * pointer \a j. + */ + friend distance_type operator -( const const_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator - j; + } + + /*! + * Returns the distance in pixels between a sample pointer \a i and an + * iterator \a j. + */ + friend distance_type operator -( const sample* i, const const_sample_iterator& j ) noexcept + { + return i - j.m_iterator; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const const_sample_iterator& i, const const_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const const_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const const_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_sample_iterator& i, const const_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const const_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const const_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + + protected: + + const image_type* m_image = nullptr; + const sample* __restrict__ m_iterator = nullptr; + const sample* __restrict__ m_end = nullptr; + }; + + // ------------------------------------------------------------------------- + + template + class roi_sample_iterator_base + { + protected: + + image_type* m_image = nullptr; + sample_pointer m_iterator = nullptr; + sample_pointer m_rowBegin = nullptr; + sample_pointer m_rowEnd = nullptr; + sample_pointer m_end = nullptr; + + roi_sample_iterator_base() = default; + + roi_sample_iterator_base( image_type& image, const Rect& rect, int channel ) + : m_image( &image ) + { + Rect r = rect; + if ( m_image->ParseRect( r ) ) + { + if ( m_image->ParseChannel( channel ) ) + { + m_iterator = m_rowBegin = m_image->PixelAddress( r.x0, r.y0, channel ); + m_rowEnd = m_rowBegin + r.Width(); + m_end = m_rowEnd + ((r.Height() - 1)*m_image->Width()); + } + } + } + + roi_sample_iterator_base( image_type& image, sample_pointer i, sample_pointer j ) + : m_image( &image ) + { + if ( j < i ) + pcl::Swap( i, j ); + m_iterator = m_rowBegin = i; + m_rowEnd = m_rowBegin + (j - i)%m_image->Width(); + m_end = j; + } + + roi_sample_iterator_base( const roi_sample_iterator_base& i ) = default; + + roi_sample_iterator_base& operator =( const roi_sample_iterator_base& ) = default; + + void Increment() noexcept + { + if ( ++m_iterator == m_rowEnd ) + { + m_rowBegin += m_image->Width(); + m_rowEnd += m_image->Width(); + m_iterator = m_rowBegin; + } + } + + void Decrement() noexcept + { + if ( m_iterator == m_rowBegin ) + { + m_rowBegin -= m_image->Width(); + m_rowEnd -= m_image->Width(); + m_iterator = m_rowEnd; + } + --m_iterator; + } + + void MoveBy( int cols, int rows ) noexcept + { + cols += m_iterator - m_rowBegin; + if ( cols != 0 ) + { + int w = m_rowEnd - m_rowBegin; + if ( pcl::Abs( cols ) >= w ) + { + rows += cols/w; + cols %= w; + } + } + int dy = rows * m_image->Width(); + m_rowBegin += dy; + m_rowEnd += dy; + m_iterator = m_rowBegin + cols; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::roi_sample_iterator + * \brief Mutable region-of-interest pixel sample iterator. + * + * A mutable, region-of-interest (ROI) pixel sample iterator provides + * read/write, random access to pixel samples within a rectangular subset of + * a single channel of an image. + * + * \ingroup image_iterators + */ + class roi_sample_iterator : private roi_sample_iterator_base, sample*> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef roi_sample_iterator_base, sample*> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + roi_sample_iterator() = default; + + /*! + * Constructs a mutable, region-of-interest (ROI) pixel sample iterator + * for one channel of an image. + * + * \param image The image to iterate. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + roi_sample_iterator( image_type& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + : iterator_base( image.EnsureUnique(), rect, channel ) + { + } + + /*! + * Constructs a mutable, region-of-interest (ROI) pixel sample iterator + * for a range of pixel samples of an image. + * + * \param image The image to iterate. + * + * \param i Pointer to the first pixel sample in the iteration + * range. The iterator will be initialized to access this + * pixel sample just after construction. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to pixel + * samples in the \e same channel of the specified \a image. + */ + roi_sample_iterator( image_type& image, sample* i, sample* j ) + : iterator_base( image, i, j ) + { + } + + /*! + * Copy constructor. + */ + roi_sample_iterator( const roi_sample_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + roi_sample_iterator& operator =( const roi_sample_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator. + */ + sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel sample iterator is active if it has not reached + * (or surpassed) its iteration limit, i.e. the bottom right corner of + * its iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the pixel sample pointed + * to by this iterator. + */ + sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + roi_sample_iterator& operator ++() noexcept + { + this->Increment(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + roi_sample_iterator operator ++( int ) noexcept + { + roi_sample_iterator i0( *this ); + this->Increment(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + roi_sample_iterator& operator --() noexcept + { + this->Decrement(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + roi_sample_iterator operator --( int ) noexcept + { + roi_sample_iterator i0( *this ); + this->Decrement(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_sample_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( delta%w, delta/w ); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_sample_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( -delta%w, -delta/w ); + return *this; + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + roi_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + iterator_base::MoveBy( dx, dy ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend roi_sample_iterator operator +( const roi_sample_iterator& i, distance_type delta ) noexcept + { + roi_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend roi_sample_iterator operator +( distance_type delta, const roi_sample_iterator& i ) noexcept + { + roi_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend roi_sample_iterator operator -( const roi_sample_iterator& i, distance_type delta ) noexcept + { + roi_sample_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const roi_sample_iterator& i, const roi_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const roi_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const roi_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const roi_sample_iterator& i, const roi_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const roi_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const roi_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + + friend class const_roi_pixel_iterator; + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_roi_sample_iterator + * \brief Immutable region-of-interest pixel sample iterator. + * + * An immutable, region-of-interest pixel sample iterator provides + * read-only, random access to pixel samples within a rectangular subset of + * a single channel of an image. + * + * \ingroup image_iterators + */ + class const_roi_sample_iterator : private roi_sample_iterator_base, const sample*> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef roi_sample_iterator_base, const sample*> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_roi_sample_iterator() = default; + + /*! + * Constructs an immutable, region-of-interest (ROI) pixel sample + * iterator for one channel of an image. + * + * \param image The constant image to iterate. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + const_roi_sample_iterator( const image_type& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + : iterator_base( image, rect, channel ) + { + } + + /*! + * Constructs an immutable, region-of-interest (ROI) pixel sample + * iterator for a range of pixel samples of an image. + * + * \param image The constant image to iterate. + * + * \param i Pointer to the first constant pixel sample in the + * iteration range. The iterator will be initialized to + * access this pixel sample just after construction. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to constant + * pixel samples in the \e same channel of the specified \a image. + */ + const_roi_sample_iterator( const image_type& image, const sample* i, const sample* j ) + : iterator_base( image, i, j ) + { + } + + /*! + * Constructs an immutable ROI pixel sample iterator from a mutable ROI + * pixel sample iterator. + * + * \note Don't confuse this constructor with the copy constructor for the + * const_roi_sample_iterator class. Note that the argument to this + * function is a reference to an object of a different class. + */ + const_roi_sample_iterator( const roi_sample_iterator& i ) + : iterator_base( i.m_image, i.m_rowBegin, i.m_end ) + { + } + + /*! + * Copy constructor. + */ + const_roi_sample_iterator( const const_roi_sample_iterator& ) = default; + + /*! + * Assigns a mutable iterator to this object. Returns a reference to this + * iterator. + */ + const_roi_sample_iterator& operator =( const roi_sample_iterator& i ) noexcept + { + this->m_image = i.m_image; + this->m_iterator = i.m_iterator; + this->m_rowBegin = i.m_rowBegin; + this->m_rowEnd = i.m_rowEnd; + this->m_end = i.m_end; + return *this; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + const_roi_sample_iterator& operator =( const const_roi_sample_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator. + */ + const sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel sample iterator is active if it has not reached + * (or surpassed) its iteration limit, i.e. the bottom right corner of + * its iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the constant pixel sample + * pointed to by this iterator. + */ + const sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + const_roi_sample_iterator& operator ++() noexcept + { + this->Increment(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel sample in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_roi_sample_iterator operator ++( int ) noexcept + { + const_roi_sample_iterator i0( *this ); + this->Increment(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + const_roi_sample_iterator& operator --() noexcept + { + this->Decrement(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel sample in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_roi_sample_iterator operator --( int ) noexcept + { + const_roi_sample_iterator i0( *this ); + this->Decrement(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_sample_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( delta%w, delta/w ); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_sample_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( -delta%w, -delta/w ); + return *this; + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + const_roi_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + iterator_base::MoveBy( dx, dy ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_roi_sample_iterator operator +( const const_roi_sample_iterator& i, distance_type delta ) noexcept + { + const_roi_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_roi_sample_iterator operator +( distance_type delta, const const_roi_sample_iterator& i ) noexcept + { + const_roi_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_roi_sample_iterator operator -( const const_roi_sample_iterator& i, distance_type delta ) noexcept + { + const_roi_sample_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const const_roi_sample_iterator& i, const const_roi_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const const_roi_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const const_roi_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_roi_sample_iterator& i, const const_roi_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const const_roi_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const const_roi_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + template + class filter_sample_iterator_base : public iterator_base + { + protected: + + filter_type m_filter; + sample_pointer m_begin = nullptr; + + filter_sample_iterator_base() = default; + + filter_sample_iterator_base( image_type& image, const filter_type& filter, int channel ) + : iterator_base( image, channel ) + , m_filter( filter ) + , m_begin( iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + filter_sample_iterator_base( image_type& image, const filter_type& filter, sample_pointer i, sample_pointer j ) + : iterator_base( image, i, j ) + , m_filter( filter ) + , m_begin( iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + filter_sample_iterator_base( const iterator_base& i, const filter_type& filter ) + : iterator_base( i ) + , m_filter( filter ) + , m_begin( iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + filter_sample_iterator_base( const filter_sample_iterator_base& ) = default; + + filter_sample_iterator_base& operator =( const filter_sample_iterator_base& ) = default; + + filter_sample_iterator_base& operator =( const iterator_base& i ) noexcept + { + (void)iterator_base::operator =( i ); + JumpToNextValidSample(); + return *this; + } + + void JumpToNextValidSample() noexcept + { + while ( this->m_iterator < this->m_end && !this->m_filter( *this->m_iterator ) ) + ++this->m_iterator; + } + + void JumpToPrevValidSample() noexcept + { + while ( this->m_iterator > this->m_begin && !this->m_filter( *this->m_iterator ) ) + --this->m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::filter_sample_iterator + * \brief Mutable filter pixel sample iterator. + * + * A mutable pixel sample iterator provides read/write, random access to + * pixel samples in a single channel of an image. A filter iterator uses a + * predicate object to filter pixel samples within its iteration range. + * + * Filter Predicates + * + * For a mutable filter sample iterator, the class template argument F must + * provide a function call operator of the form: + * + * \code bool F::operator()( sample& v ) const \endcode + * + * which returns true if the passed pixel sample value \a v is valid in the + * context of the filter iterator. The filter iterator stores a private + * instance of F to validate pixel samples, so the F class must provide also + * copy constructor semantics, either explicitly or implicitly. + * + * Filter Iterators + * + * Each time a filter iterator is constructed, incremented, decremented, or + * moved forward or backward, the filter predicate is called to validate the + * pixel or pixel sample pointed to by the iterator. If the pointed item is + * not valid, the iterator is incremented or decremented (depending on the + * operation performed initially) until it finds a valid one, or until it + * reaches the end of the iteration range, whichever happens first. In this + * way a filter iterator gives access only to valid items in a completely + * automatic and transparent fashion. + * + * \ingroup image_iterators + */ + template + class filter_sample_iterator : + public filter_sample_iterator_base, sample_iterator, sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef filter_sample_iterator_base, sample_iterator, sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + filter_sample_iterator() = default; + + /*! + * Constructs a mutable filter pixel sample iterator for one channel of + * an image. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + filter_sample_iterator( image_type& image, const F& filter, int channel = -1 ) + : iterator_base( image.EnsureUnique(), filter, channel ) + { + } + + /*! + * Constructs a mutable filter pixel sample iterator for a range of + * contiguous pixel samples of an image. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param i Pointer to the first pixel sample in the iteration + * range. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to pixel + * samples in the \e same channel of the specified \a image. + */ + filter_sample_iterator( image_type& image, const F& filter, sample* i, sample* j ) + : iterator_base( image, filter, i, j ) + { + } + + /*! + * Constructs a mutable filter pixel sample iterator from a sample + * iterator and the specified \a filter. + */ + filter_sample_iterator( const sample_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + filter_sample_iterator( const filter_sample_iterator& i ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + filter_sample_iterator& operator =( const filter_sample_iterator& ) = default; + + /*! + * Assigns a pixel sample iterator to this object. Returns a reference to + * this iterator. + */ + filter_sample_iterator& operator =( const sample_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator. + */ + sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel sample iterator is active if it has not reached (or + * surpassed) its iteration limit: either the end of the iterated image + * channel, or the end of the iteration range, depending on how the + * iterator has been constructed. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the pixel sample pointed + * to by this iterator. + */ + sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated image channel. Returns a reference + * to this iterator. + */ + filter_sample_iterator& operator ++() noexcept + { + ++this->m_iterator; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated image channel. Returns a copy of + * the iterator as it was before incrementing it. + */ + filter_sample_iterator operator ++( int ) noexcept + { + sample* __restrict__ i0 = this->m_iterator++; + this->JumpToNextValidSample(); + return filter_sample_iterator( *this->m_image, this->m_filter, i0, this->m_end ); + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated image channel, then returns a + * reference to this iterator. + */ + filter_sample_iterator& operator --() noexcept + { + --this->m_iterator; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated image channel. Returns a copy of + * the iterator as it was before decrementing it. + */ + filter_sample_iterator operator --( int ) noexcept + { + sample* __restrict__ i0 = this->m_iterator--; + this->JumpToPrevValidSample(); + return filter_sample_iterator( *this->m_image, this->m_filter, i0, this->m_end ); + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + filter_sample_iterator& operator +=( distance_type delta ) noexcept + { + this->m_iterator += delta; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + filter_sample_iterator& operator -=( distance_type delta ) noexcept + { + this->m_iterator -= delta; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Moves this iterator on the iterated image channel by the specified + * horizontal and vertical increments in pixels, \a dx and \a dy + * respectively, relative to its current position. Positive (negative) + * \a dx increments move the iterator rightwards (leftwards). Positive + * (negative) \a dy increments move the iterator downwards (upwards). + */ + filter_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + distance_type d = distance_type( dy )*this->m_image->Width() + distance_type( dx ); + this->m_iterator += d; + if ( d >= 0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend filter_sample_iterator operator +( const filter_sample_iterator& i, distance_type delta ) noexcept + { + return filter_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend filter_sample_iterator operator +( distance_type delta, const filter_sample_iterator& i ) noexcept + { + return filter_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend filter_sample_iterator operator -( const filter_sample_iterator& i, distance_type delta ) noexcept + { + return filter_sample_iterator( *i.m_image, i.m_iterator - delta, i.m_end ); + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const filter_sample_iterator& i, const filter_sample_iterator& j ) noexcept + { + return i.m_iterator - j.m_iterator; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const filter_sample_iterator& i, const filter_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const filter_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const filter_sample_iterator& i, const filter_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const filter_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_filter_sample_iterator + * \brief Immutable filter pixel sample iterator. + * + * An immutable pixel sample iterator provides read-only, random access to + * pixel samples in a single channel of an image. A filter iterator uses a + * predicate object to filter pixel samples within its iteration range. + * + * Filter Predicates + * + * For an immutable filter sample iterator, the class template argument F + * must provide a function call operator of the form: + * + * \code bool F::operator()( const sample& v ) const \endcode + * + * which returns true if the passed pixel sample value \a v is valid in the + * context of the filter iterator. The filter iterator stores a private + * instance of F to validate pixel samples, so the F class must provide also + * copy constructor semantics, either explicitly or implicitly. + * + * Filter Iterators + * + * Each time a filter iterator is constructed, incremented, decremented, or + * moved forward or backward, the filter predicate is called to validate the + * pixel or pixel sample pointed to by the iterator. If the pointed item is + * not valid, the iterator is incremented or decremented (depending on the + * operation performed initially) until it finds a valid one, or until it + * reaches the end of the iteration range, whichever happens first. In this + * way a filter iterator gives access only to valid items in a completely + * automatic and transparent fashion. + * + * \ingroup image_iterators + */ + template + class const_filter_sample_iterator : + public filter_sample_iterator_base, const_sample_iterator, const sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef filter_sample_iterator_base, const_sample_iterator, const sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_filter_sample_iterator() = default; + + /*! + * Constructs an immutable filter pixel sample iterator for one channel + * of an image. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + const_filter_sample_iterator( const image_type& image, const F& filter, int channel = -1 ) + : iterator_base( image, filter, channel ) + { + } + + /*! + * Constructs an immutable filter pixel sample iterator for a range of + * contiguous pixel samples of an image. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param i Pointer to the first constant pixel sample in the + * iteration range. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to constant + * pixel samples in the \e same channel of the specified \a image. + */ + const_filter_sample_iterator( const image_type& image, const F& filter, const sample* i, const sample* j ) + : iterator_base( image, filter, i, j ) + { + } + + /*! + * Constructs an immutable filter pixel sample iterator from a mutable + * sample iterator and the specified \a filter. + */ + const_filter_sample_iterator( const sample_iterator& i, const F& filter ) + : iterator_base( i.m_image, filter, i.m_iterator, i.m_end ) + { + } + + /*! + * Constructs an immutable filter pixel sample iterator from an immutable + * sample iterator and the specified \a filter. + */ + const_filter_sample_iterator( const const_sample_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Constructs an immutable filter pixel sample iterator from a mutable + * filter pixel sample iterator. + */ + const_filter_sample_iterator( const filter_sample_iterator& i ) + : iterator_base( i ) + { + } + + /*! + * Copy constructor. + */ + const_filter_sample_iterator( const const_filter_sample_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + const_filter_sample_iterator& operator =( const const_filter_sample_iterator& ) = default; + + /*! + * Assigns a mutable pixel sample iterator to this object. Returns a + * reference to this iterator. + */ + const_filter_sample_iterator& operator =( const sample_iterator& i ) noexcept + { + (void)const_sample_iterator::operator =( i ); + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Assigns an immutable pixel sample iterator to this object. Returns a + * reference to this iterator. + */ + const_filter_sample_iterator& operator =( const const_sample_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator. + */ + const sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel sample iterator is active if it has not reached (or + * surpassed) its iteration limit: either the end of the iterated image + * channel, or the end of the iteration range, depending on how the + * iterator has been constructed. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the constant pixel sample + * pointed to by this iterator. + */ + const sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated image channel. Returns a reference + * to this iterator. + */ + const_filter_sample_iterator& operator ++() noexcept + { + ++this->m_iterator; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated image channel. Returns a copy of + * the iterator as it was before incrementing it. + */ + const_filter_sample_iterator operator ++( int ) noexcept + { + sample* __restrict__ i0 = this->m_iterator++; + this->JumpToNextValidSample(); + return const_filter_sample_iterator( *this->m_image, this->m_filter, i0, this->m_end ); + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated image channel, then returns a + * reference to this iterator. + */ + const_filter_sample_iterator& operator --() noexcept + { + --this->m_iterator; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated image channel. Returns a copy of + * the iterator as it was before decrementing it. + */ + const_filter_sample_iterator operator --( int ) noexcept + { + sample* __restrict__ i0 = this->m_iterator--; + this->JumpToPrevValidSample(); + return const_filter_sample_iterator( *this->m_image, this->m_filter, i0, this->m_end ); + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_filter_sample_iterator& operator +=( distance_type delta ) noexcept + { + this->m_iterator += delta; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_filter_sample_iterator& operator -=( distance_type delta ) noexcept + { + this->m_iterator -= delta; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Moves this iterator on the iterated image channel by the specified + * horizontal and vertical increments in pixels, \a dx and \a dy + * respectively, relative to its current position. Positive (negative) + * \a dx increments move the iterator rightwards (leftwards). Positive + * (negative) \a dy increments move the iterator downwards (upwards). + */ + const_filter_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + distance_type d = distance_type( dy )*this->m_image->Width() + distance_type( dx ); + this->m_iterator += d; + if ( d >= 0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_filter_sample_iterator operator +( const const_filter_sample_iterator& i, distance_type delta ) noexcept + { + return const_filter_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_filter_sample_iterator operator +( distance_type delta, const const_filter_sample_iterator& i ) noexcept + { + return const_filter_sample_iterator( *i.m_image, i.m_iterator + delta, i.m_end ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_filter_sample_iterator operator -( const const_filter_sample_iterator& i, distance_type delta ) noexcept + { + return const_filter_sample_iterator( *i.m_image, i.m_iterator - delta, i.m_end ); + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const const_filter_sample_iterator& i, const const_filter_sample_iterator& j ) noexcept + { + return i.m_iterator - j.m_iterator; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const const_filter_sample_iterator& i, const const_filter_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const const_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const const_filter_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_filter_sample_iterator& i, const const_filter_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const const_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const const_filter_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + template + class roi_filter_sample_iterator_base : public roi_sample_iterator_base + { + protected: + + typedef roi_sample_iterator_base + roi_iterator_base; + + filter_type m_filter; + sample_pointer m_begin = nullptr; + + roi_filter_sample_iterator_base() = default; + + roi_filter_sample_iterator_base( image_type& image, const filter_type& filter, const Rect& rect, int channel ) + : roi_iterator_base( image, rect, channel ) + , m_filter( filter ) + , m_begin( roi_iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + roi_filter_sample_iterator_base( image_type& image, const filter_type& filter, sample_pointer i, sample_pointer j ) + : roi_iterator_base( image, i, j ) + , m_filter( filter ) + , m_begin( roi_iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + roi_filter_sample_iterator_base( const roi_iterator_base& i, const filter_type& filter ) + : roi_iterator_base( i ) + , m_filter( filter ) + , m_begin( roi_iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + roi_filter_sample_iterator_base( const roi_filter_sample_iterator_base& ) = default; + + roi_filter_sample_iterator_base& operator =( const roi_filter_sample_iterator_base& i ) = default; + + roi_filter_sample_iterator_base& operator =( const roi_iterator_base& i ) noexcept + { + (void)roi_iterator_base::operator =( i ); + JumpToNextValidSample(); + return *this; + } + + void JumpToNextValidSample() noexcept + { + while ( this->m_iterator < this->m_end && !this->m_filter( *this->m_iterator ) ) + roi_iterator_base::Increment(); + } + + void JumpToPrevValidSample() noexcept + { + while ( this->m_iterator > this->m_begin && !this->m_filter( *this->m_iterator ) ) + roi_iterator_base::Decrement(); + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::roi_filter_sample_iterator + * \brief Mutable region-of-interest, filter pixel sample iterator. + * + * A mutable, region-of-interest (ROI), filter pixel sample iterator + * combines the capabilities of roi_sample_iterator and + * filter_sample_iterator in a single iterator class. + * + * \ingroup image_iterators + */ + template + class roi_filter_sample_iterator : public roi_filter_sample_iterator_base, sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef roi_filter_sample_iterator_base, sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + roi_filter_sample_iterator() = default; + + /*! + * Constructs a mutable, region-of-interest (ROI), filter pixel sample + * iterator for one channel of an image. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + roi_filter_sample_iterator( image_type& image, const F& filter, const Rect& rect = Rect( 0 ), int channel = -1 ) + : iterator_base( image.EnsureUnique(), filter, rect, channel ) + { + } + + /*! + * Constructs a mutable, region-of-interest (ROI), filter pixel sample + * iterator for a range of pixel samples of an image. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param i Pointer to the first pixel sample in the iteration + * range. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to pixel + * samples in the \e same channel of the specified \a image. + */ + roi_filter_sample_iterator( image_type& image, const F& filter, sample* i, sample* j ) + : iterator_base( image, filter, i, j ) + { + } + + /*! + * Constructs a mutable, region-of-interest (ROI), filter pixel sample + * iterator from the specified ROI iterator \a i and \a filter. + */ + roi_filter_sample_iterator( const roi_sample_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + roi_filter_sample_iterator( const roi_filter_sample_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + roi_filter_sample_iterator& operator =( const roi_filter_sample_iterator& ) = default; + + /*! + * Assigns a ROI pixel sample iterator. Returns a reference to this + * object. + */ + roi_filter_sample_iterator& operator =( const roi_sample_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator. + */ + sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel sample iterator is active if it has not reached + * (or surpassed) its iteration limit, i.e. the bottom right corner of + * its iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the pixel sample pointed + * to by this iterator. + */ + sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated region of interest. Returns a + * reference to this iterator. + */ + roi_filter_sample_iterator& operator ++() noexcept + { + this->Increment(); + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated region of interest. Returns a copy + * of the iterator as it was before incrementing it. + */ + roi_filter_sample_iterator operator ++( int ) noexcept + { + roi_filter_sample_iterator i0( *this ); + this->Increment(); + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + roi_filter_sample_iterator& operator --() noexcept + { + this->Decrement(); + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated region of interest. Returns a copy + * of the iterator as it was before decrementing it. + */ + roi_filter_sample_iterator operator --( int ) noexcept + { + roi_filter_sample_iterator i0( *this ); + this->Decrement(); + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_filter_sample_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( delta%w, delta/w ); + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_filter_sample_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( -delta%w, -delta/w ); + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + roi_filter_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + sample* __restrict__ i0 = this->m_iterator; + iterator_base::MoveBy( dx, dy ); + if ( this->m_iterator >= i0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend roi_filter_sample_iterator operator +( const roi_filter_sample_iterator& i, distance_type delta ) noexcept + { + roi_filter_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend roi_filter_sample_iterator operator +( distance_type delta, const roi_filter_sample_iterator& i ) noexcept + { + roi_filter_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend roi_filter_sample_iterator operator -( const roi_filter_sample_iterator& i, distance_type delta ) noexcept + { + roi_filter_sample_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const roi_filter_sample_iterator& i, const roi_filter_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const roi_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const roi_filter_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const roi_filter_sample_iterator& i, const roi_filter_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const roi_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const roi_filter_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_roi_filter_sample_iterator + * \brief Immutable region-of-interest, filter pixel sample iterator. + * + * An immutable, region-of-interest (ROI), filter pixel sample iterator + * combines the capabilities of const_roi_sample_iterator and + * const_filter_sample_iterator in a single iterator class. + * + * \ingroup image_iterators + */ + template + class const_roi_filter_sample_iterator : public roi_filter_sample_iterator_base, const sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef roi_filter_sample_iterator_base, const sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_roi_filter_sample_iterator() = default; + + /*! + * Constructs an immutable, region-of-interest (ROI), filter pixel sample + * iterator for one channel of an image. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + * + * \param channel Channel index. If this parameter is a negative integer, + * then this object will be initialized to iterate on the + * currently selected channel of the \a image. If an + * invalid (i.e., nonexistent) channel index is specified, + * then the resulting iterator will also be invalid, with + * an empty iteration range. The default value is -1. + */ + const_roi_filter_sample_iterator( const image_type& image, const F& filter, const Rect& rect = Rect( 0 ), int channel = -1 ) + : iterator_base( image, filter, rect, channel ) + { + } + + /*! + * Constructs an immutable, region-of-interest (ROI), filter pixel sample + * iterator for a range of pixel samples of an image. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param i Pointer to the first constant pixel sample in the + * iteration range. + * + * \param j End of the iteration range. The iterator will be + * invalid when it reaches (or surpasses) this point. + * + * \note Both iteration limits \a i and \a j must be pointers to pixel + * samples in the \e same channel of the specified \a image. + */ + const_roi_filter_sample_iterator( const image_type& image, const F& filter, const sample* i, const sample* j ) + : iterator_base( image, filter, i, j ) + { + } + + /*! + * Constructs an immutable, region-of-interest (ROI), filter pixel sample + * iterator from the specified immutable ROI iterator \a i and \a filter. + */ + const_roi_filter_sample_iterator( const const_roi_sample_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + const_roi_filter_sample_iterator( const const_roi_filter_sample_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + const_roi_filter_sample_iterator& operator =( const const_roi_filter_sample_iterator& ) = default; + + /*! + * Assigns an immutable ROI pixel sample iterator. Returns a reference to + * this object. + */ + const_roi_filter_sample_iterator& operator =( const const_roi_sample_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && this->m_iterator != nullptr; + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator. + */ + const sample* Position() const noexcept + { + return this->m_iterator; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel sample iterator is active if it has not reached + * (or surpassed) its iteration limit, i.e. the bottom right corner of + * its iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator < this->m_end; + } + + /*! + * Indirection operator. Returns a reference to the constant pixel sample + * pointed to by this iterator. + */ + const sample& operator *() const noexcept + { + return *this->m_iterator; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated region of interest. Returns a + * reference to this iterator. + */ + const_roi_filter_sample_iterator& operator ++() noexcept + { + this->Increment(); + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel sample in the iterated region of interest. Returns a copy + * of the iterator as it was before incrementing it. + */ + const_roi_filter_sample_iterator operator ++( int ) noexcept + { + const_roi_filter_sample_iterator i0( *this ); + this->Increment(); + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated region of interest, then returns a + * reference to this iterator. + */ + const_roi_filter_sample_iterator& operator --() noexcept + { + this->Decrement(); + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel sample in the iterated region of interest. Returns a copy + * of the iterator as it was before decrementing it. + */ + const_roi_filter_sample_iterator operator --( int ) noexcept + { + const_roi_filter_sample_iterator i0( *this ); + this->Decrement(); + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_filter_sample_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( delta%w, delta/w ); + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_filter_sample_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( -delta%w, -delta/w ); + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + const_roi_filter_sample_iterator& MoveBy( int dx, int dy ) noexcept + { + const sample* __restrict__ i0 = this->m_iterator; + iterator_base::MoveBy( dx, dy ); + if ( this->m_iterator >= i0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_roi_filter_sample_iterator operator +( const const_roi_filter_sample_iterator& i, distance_type delta ) noexcept + { + const_roi_filter_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_roi_filter_sample_iterator operator +( distance_type delta, const const_roi_filter_sample_iterator& i ) noexcept + { + const_roi_filter_sample_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_roi_filter_sample_iterator operator -( const const_roi_filter_sample_iterator& i, distance_type delta ) noexcept + { + const_roi_filter_sample_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel sample. + */ + friend bool operator ==( const const_roi_filter_sample_iterator& i, const const_roi_filter_sample_iterator& j ) noexcept + { + return i.m_iterator == j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i and a sample pointer \a j point to + * the same pixel sample. + */ + friend bool operator ==( const const_roi_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator == j; + } + + /*! + * Returns true iff a sample pointer \a i and an iterator \a j point to + * the same pixel sample. + */ + friend bool operator ==( const sample* i, const const_roi_filter_sample_iterator& j ) noexcept + { + return i == j.m_iterator; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_roi_filter_sample_iterator& i, const const_roi_filter_sample_iterator& j ) noexcept + { + return i.m_iterator < j.m_iterator; + } + + /*! + * Returns true iff an iterator \a i precedes a sample pointer \a j. + */ + friend bool operator <( const const_roi_filter_sample_iterator& i, const sample* j ) noexcept + { + return i.m_iterator < j; + } + + /*! + * Returns true iff a sample pointer \a i precedes an iterator \a j. + */ + friend bool operator <( const sample* i, const const_roi_filter_sample_iterator& j ) noexcept + { + return i < j.m_iterator; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::pixel_iterator + * \brief Mutable pixel iterator. + * + * A mutable pixel iterator provides read/write, random access to all pixels + * of an image. + * + * \ingroup image_iterators + */ + class pixel_iterator + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef GenericVector iterator_type; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + pixel_iterator() = default; + + /*! + * Constructs a mutable pixel iterator for the specified \a image. + */ + pixel_iterator( image_type& image ) + : m_image( &image ) + { + m_image->EnsureUnique(); + if ( !m_image->IsEmpty() ) + { + m_iterator = iterator_type( m_image->NumberOfChannels() ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] = (*m_image)[i]; + m_end = m_iterator[0] + m_image->NumberOfPixels(); + } + } + + /*! + * Copy constructor. + */ + pixel_iterator( const pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + pixel_iterator& operator =( const pixel_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return m_image != nullptr && !m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *m_image; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator in + * the specified \a channel. + */ + sample* Position( int channel ) const noexcept + { + return m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel iterator is active if it has not reached (or + * surpassed) its iteration limit. + */ + operator bool() const noexcept + { + return m_iterator[0] < m_end; + } + + /*! + * Array subscript operator. Returns a reference to the pixel sample + * pointed to by this iterator in the specified \a channel. + */ + sample& operator []( int channel ) const noexcept + { + return *m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel in the iterated image. Returns a reference to this iterator. + */ + pixel_iterator& operator ++() noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + ++m_iterator[i]; + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel in the iterated image. Returns a copy of the iterator as it was + * before incrementing it. + */ + pixel_iterator operator ++( int ) noexcept + { + pixel_iterator i0( *this ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + ++m_iterator[i]; + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated image. Returns a reference to this iterator. + */ + pixel_iterator& operator --() noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + --m_iterator[i]; + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated image. Returns a copy of the iterator as it was + * before decrementing it. + */ + pixel_iterator operator --( int ) noexcept + { + pixel_iterator i0( *this ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + --m_iterator[i]; + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixels. Negative increments + * move this iterator backward by \a delta pixels. Returns a reference to + * this iterator. + */ + pixel_iterator& operator +=( distance_type delta ) noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] += delta; + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixels. Negative increments + * move this iterator forward by \a delta pixels. Returns a reference to + * this iterator. + */ + pixel_iterator& operator -=( distance_type delta ) noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] -= delta; + return *this; + } + + /*! + * Moves this iterator on the iterated image by the specified horizontal + * and vertical increments in pixels, \a dx and \a dy respectively, + * relative to its current position. Positive (negative) \a dx increments + * move the iterator rightwards (leftwards). Positive (negative) \a dy + * increments move the iterator downwards (upwards). + */ + pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + return operator +=( distance_type( dy )*m_image->Width() + distance_type( dx ) ); + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend pixel_iterator operator +( const pixel_iterator& i, distance_type delta ) noexcept + { + pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend pixel_iterator operator +( distance_type delta, const pixel_iterator& i ) noexcept + { + pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend pixel_iterator operator -( const pixel_iterator& i, distance_type delta ) noexcept + { + pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const pixel_iterator& i, const pixel_iterator& j ) noexcept + { + return i.m_iterator[0] - j.m_iterator[0]; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const pixel_iterator& i, const pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const pixel_iterator& i, const pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + + protected: + + image_type* m_image = nullptr; + iterator_type m_iterator; + const sample* __restrict__ m_end = nullptr; + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_pixel_iterator + * \brief Immutable pixel iterator. + * + * An immutable pixel iterator provides read-only, random access to all + * pixels of an image. + * + * \ingroup image_iterators + */ + class const_pixel_iterator + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef GenericVector iterator_type; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_pixel_iterator() = default; + + /*! + * Constructs an immutable pixel iterator for the specified \a image. + */ + const_pixel_iterator( const image_type& image ) + : m_image( &image ) + { + if ( !m_image->IsEmpty() ) + { + m_iterator = iterator_type( m_image->NumberOfChannels() ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] = (*m_image)[i]; + m_end = m_iterator[0] + m_image->NumberOfPixels(); + } + } + + /*! + * Copy constructor. + */ + const_pixel_iterator( const const_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + const_pixel_iterator& operator =( const const_pixel_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return m_image != nullptr && !m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *m_image; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator in the specified \a channel. + */ + const sample* Position( int channel ) const noexcept + { + return m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel iterator is active if it has not reached (or + * surpassed) its iteration limit. + */ + operator bool() const noexcept + { + return m_iterator[0] < m_end; + } + + /*! + * Array subscript operator. Returns a reference to the constant pixel + * sample pointed to by this iterator in the specified \a channel. + */ + const sample& operator []( int channel ) const noexcept + { + return *m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel in the iterated image. Returns a reference to this iterator. + */ + const_pixel_iterator& operator ++() noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + ++m_iterator[i]; + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel in the iterated image. Returns a copy of the iterator as it was + * before incrementing it. + */ + const_pixel_iterator operator ++( int ) noexcept + { + const_pixel_iterator i0( *this ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + ++m_iterator[i]; + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated image. Returns a reference to this iterator. + */ + const_pixel_iterator& operator --() noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + --m_iterator[i]; + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated image. Returns a copy of the iterator as it was + * before decrementing it. + */ + const_pixel_iterator operator --( int ) noexcept + { + const_pixel_iterator i0( *this ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + --m_iterator[i]; + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixels. Negative increments + * move this iterator backward by \a delta pixels. Returns a reference to + * this iterator. + */ + const_pixel_iterator& operator +=( distance_type delta ) noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] += delta; + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixels. Negative increments + * move this iterator forward by \a delta pixels. Returns a reference to + * this iterator. + */ + const_pixel_iterator& operator -=( distance_type delta ) noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] -= delta; + return *this; + } + + /*! + * Moves this iterator on the iterated image by the specified horizontal + * and vertical increments in pixels, \a dx and \a dy respectively, + * relative to its current position. Positive (negative) \a dx increments + * move the iterator rightwards (leftwards). Positive (negative) \a dy + * increments move the iterator downwards (upwards). + */ + const_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + return operator +=( distance_type( dy )*m_image->Width() + distance_type( dx ) ); + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_pixel_iterator operator +( const const_pixel_iterator& i, distance_type delta ) noexcept + { + const_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_pixel_iterator operator +( distance_type delta, const const_pixel_iterator& i ) noexcept + { + const_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_pixel_iterator operator -( const const_pixel_iterator& i, distance_type delta ) noexcept + { + const_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Iterator subtraction operator. Returns the distance in pixels between + * the specified iterators \a i and \a j. + */ + friend distance_type operator -( const const_pixel_iterator& i, const const_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] - j.m_iterator[0]; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const const_pixel_iterator& i, const const_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_pixel_iterator& i, const const_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + + protected: + + const image_type* m_image = nullptr; + iterator_type m_iterator; + const sample* __restrict__ m_end = nullptr; + }; + + // ------------------------------------------------------------------------- + + template + class roi_pixel_iterator_base + { + protected: + + typedef GenericVector iterator_type; + + image_type* m_image = nullptr; + iterator_type m_iterator; + sample_pointer m_rowBegin = nullptr; + sample_pointer m_rowEnd = nullptr; + sample_pointer m_end = nullptr; + + roi_pixel_iterator_base() = default; + + roi_pixel_iterator_base( image_type& image, const Rect& rect ) + : m_image( &image ) + { + Rect r = rect; + if ( m_image->ParseRect( r ) ) + { + m_iterator = iterator_type( m_image->NumberOfChannels() ); + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] = m_image->PixelAddress( r.x0, r.y0, i ); + m_rowBegin = m_iterator[0]; + m_rowEnd = m_rowBegin + r.Width(); + m_end = m_rowEnd + ((r.Height() - 1)*m_image->Width()); + } + } + + roi_pixel_iterator_base( const roi_pixel_iterator_base& ) = default; + + roi_pixel_iterator_base& operator =( const roi_pixel_iterator_base& ) = default; + + void Increment() noexcept + { + for ( int i = 0; i < m_iterator.Length(); ++i ) + ++m_iterator[i]; + if ( m_iterator[0] == m_rowEnd ) + { + int w = m_rowEnd - m_rowBegin; + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] += m_image->Width() - w; + m_rowBegin += m_image->Width(); + m_rowEnd += m_image->Width(); + } + } + + void Decrement() noexcept + { + if ( m_iterator[0] == m_rowBegin ) + { + int w = m_rowEnd - m_rowBegin; + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] -= m_image->Width() - w; + m_rowBegin -= m_image->Width(); + m_rowEnd -= m_image->Width(); + } + for ( int i = 0; i < m_iterator.Length(); ++i ) + --m_iterator[i]; + } + + void MoveBy( int cols, int rows ) noexcept + { + int dx = m_iterator[0] - m_rowBegin; + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] -= dx; + cols += dx; + if ( cols != 0 ) + { + int w = m_rowEnd - m_rowBegin; + if ( pcl::Abs( cols ) >= w ) + { + rows += cols/w; + cols %= w; + } + } + int dy = rows * m_image->Width(); + for ( int i = 0; i < m_iterator.Length(); ++i ) + m_iterator[i] += dy + cols; + m_rowBegin += dy; + m_rowEnd += dy; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::roi_pixel_iterator + * \brief Mutable region-of-interest pixel iterator. + * + * A mutable, region-of-interest (ROI) pixel iterator provides read/write, + * random access to pixels within a rectangular subset of an image. + * + * \ingroup image_iterators + */ + class roi_pixel_iterator : private roi_pixel_iterator_base, sample*> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef roi_pixel_iterator_base, sample*> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + roi_pixel_iterator() = default; + + /*! + * Constructs a mutable, region-of-interest (ROI) pixel iterator. + * + * \param image The image to iterate. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + */ + roi_pixel_iterator( image_type& image, const Rect& rect = Rect( 0 ) ) + : iterator_base( image.EnsureUnique(), rect ) + { + } + + /*! + * Copy constructor. + */ + roi_pixel_iterator( const roi_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + roi_pixel_iterator& operator =( const roi_pixel_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator in + * the specified \a channel. + */ + sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel iterator is active if it has not reached (or + * surpassed) its iteration limit, i.e. the bottom right corner of its + * iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the pixel sample + * pointed to by this iterator in the specified \a channel. + */ + sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel in the iterated region of interest, then returns a reference to + * this iterator. + */ + roi_pixel_iterator& operator ++() noexcept + { + this->Increment(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + roi_pixel_iterator operator ++( int ) noexcept + { + roi_pixel_iterator i0( *this ); + this->Increment(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated region of interest, then returns a reference to + * this iterator. + */ + roi_pixel_iterator& operator --() noexcept + { + this->Decrement(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + roi_pixel_iterator operator --( int ) noexcept + { + roi_pixel_iterator i0( *this ); + this->Decrement(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_pixel_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( delta%w, delta/w ); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_pixel_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( -delta%w, -delta/w ); + return *this; + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + roi_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + iterator_base::MoveBy( dx, dy ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend roi_pixel_iterator operator +( const roi_pixel_iterator& i, distance_type delta ) noexcept + { + roi_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend roi_pixel_iterator operator +( distance_type delta, const roi_pixel_iterator& i ) noexcept + { + roi_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend roi_pixel_iterator operator -( const roi_pixel_iterator& i, distance_type delta ) noexcept + { + roi_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const roi_pixel_iterator& i, const roi_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const roi_pixel_iterator& i, const roi_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_roi_pixel_iterator + * \brief Immutable region-of-interest pixel iterator. + * + * An immutable, region-of-interest (ROI) pixel iterator provides read-only, + * random access to pixels within a rectangular subset of an image. + * + * \ingroup image_iterators + */ + class const_roi_pixel_iterator : private roi_pixel_iterator_base, const sample*> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + typedef roi_pixel_iterator_base, const sample*> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_roi_pixel_iterator() = default; + + /*! + * Constructs an immutable, region-of-interest (ROI) pixel iterator. + * + * \param image The constant image to iterate. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + */ + const_roi_pixel_iterator( const image_type& image, const Rect& rect = Rect( 0 ) ) + : iterator_base( image, rect ) + { + } + + /*! + * Copy constructor. + */ + const_roi_pixel_iterator( const const_roi_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + const_roi_pixel_iterator& operator =( const const_roi_pixel_iterator& ) = default; + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator in the specified \a channel. + */ + const sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel iterator is active if it has not reached (or + * surpassed) its iteration limit, i.e. the bottom right corner of its + * iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the constant pixel + * sample pointed to by this iterator in the specified \a channel. + */ + const sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * pixel in the iterated region of interest, then returns a reference to + * this iterator. + */ + const_roi_pixel_iterator& operator ++() noexcept + { + this->Increment(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_roi_pixel_iterator operator ++( int ) noexcept + { + const_roi_pixel_iterator i0( *this ); + this->Increment(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated region of interest, then returns a reference to + * this iterator. + */ + const_roi_pixel_iterator& operator --() noexcept + { + this->Decrement(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_roi_pixel_iterator operator --( int ) noexcept + { + const_roi_pixel_iterator i0( *this ); + this->Decrement(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_pixel_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( delta%w, delta/w ); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_pixel_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + iterator_base::MoveBy( -delta%w, -delta/w ); + return *this; + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + const_roi_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + iterator_base::MoveBy( dx, dy ); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_roi_pixel_iterator operator +( const const_roi_pixel_iterator& i, distance_type delta ) noexcept + { + const_roi_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_roi_pixel_iterator operator +( distance_type delta, const const_roi_pixel_iterator& i ) noexcept + { + const_roi_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_roi_pixel_iterator operator -( const const_roi_pixel_iterator& i, distance_type delta ) noexcept + { + const_roi_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const const_roi_pixel_iterator& i, const const_roi_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_roi_pixel_iterator& i, const const_roi_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + template + class filter_pixel_iterator_base : public iterator_base + { + protected: + + filter_type m_filter; + sample_pointer m_begin = nullptr; + + filter_pixel_iterator_base() = default; + + filter_pixel_iterator_base( image_type& image, const filter_type& filter ) + : iterator_base( image ) + , m_filter( filter ) + , m_begin( iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + filter_pixel_iterator_base( const iterator_base& i, const filter_type& filter ) + : iterator_base( i ) + , m_filter( filter ) + , m_begin( iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + filter_pixel_iterator_base( const filter_pixel_iterator_base& ) = default; + + filter_pixel_iterator_base& operator =( const filter_pixel_iterator_base& ) = default; + + filter_pixel_iterator_base& operator =( const iterator_base& i ) noexcept + { + (void)iterator_base::operator =( i ); + JumpToNextValidSample(); + } + + void JumpToNextValidSample() noexcept + { + while ( this->m_iterator[0] < this->m_end && !this->m_filter( this->m_iterator ) ) + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + ++this->m_iterator[i]; + } + + void JumpToPrevValidSample() noexcept + { + while ( this->m_iterator[0] > this->m_begin && !this->m_filter( this->m_iterator ) ) + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + --this->m_iterator[i]; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::filter_pixel_iterator + * \brief Mutable filter pixel iterator. + * + * A mutable pixel iterator provides read/write, random access to all pixels + * in an image. A filter pixel iterator uses a predicate object to filter + * pixels within its iteration range. + * + * Filter Predicates + * + * For a mutable filter pixel iterator, the class template argument F must + * provide a function call operator of the form: + * + * \code bool F::operator()( const GenericVector\& f ) const \endcode + * + * Each component of the passed vector \a f is a pointer to a pixel sample + * in the corresponding channel of the iterated image. The function call + * operator must return true if the pointed pixel is valid in the context of + * the filter iterator. The filter iterator stores a private instance of F + * to validate pixels, so the F class must provide also copy constructor + * semantics, either explicitly or implicitly. + * + * Filter Iterators + * + * Each time a filter iterator is constructed, incremented, decremented, or + * moved forward or backward, the filter predicate is called to validate the + * pixel or pixel sample pointed to by the iterator. If the pointed item is + * not valid, the iterator is incremented or decremented (depending on the + * operation performed initially) until it finds a valid one, or until it + * reaches the end of the iteration range, whichever happens first. In this + * way a filter iterator gives access only to valid items in a completely + * automatic and transparent fashion. + * + * \ingroup image_iterators + */ + template + class filter_pixel_iterator : + public filter_pixel_iterator_base, pixel_iterator, sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef filter_pixel_iterator_base, pixel_iterator, sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + filter_pixel_iterator() = default; + + /*! + * Constructs a mutable filter pixel iterator. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixels. + */ + filter_pixel_iterator( image_type& image, const F& filter ) + : iterator_base( image.EnsureUnique(), filter ) + { + } + + /*! + * Constructs a mutable filter pixel iterator from a mutable pixel + * iterator and the specified \a filter. + */ + filter_pixel_iterator( const pixel_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + filter_pixel_iterator( const filter_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + filter_pixel_iterator& operator =( const filter_pixel_iterator& ) = default; + + /*! + * Assigns a mutable pixel iterator to this object. Returns a reference + * to this iterator. + */ + filter_pixel_iterator& operator =( const pixel_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator in + * the specified \a channel. + */ + sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel iterator is active if it has not reached (or + * surpassed) its iteration limit. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the pixel sample + * pointed to by this iterator in the specified \a channel. + */ + sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated image. Returns a reference to this + * iterator. + */ + filter_pixel_iterator& operator ++() noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + ++this->m_iterator[i]; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated image channel. Returns a copy of the + * iterator as it was before incrementing it. + */ + filter_pixel_iterator operator ++( int ) noexcept + { + filter_pixel_iterator i0( *this ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + ++this->m_iterator[i]; + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated image channel, then returns a reference to + * this iterator. + */ + filter_pixel_iterator& operator --() noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + --this->m_iterator[i]; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated image channel. Returns a copy of the + * iterator as it was before decrementing it. + */ + filter_pixel_iterator operator --( int ) noexcept + { + filter_pixel_iterator i0( *this ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + --this->m_iterator[i]; + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + filter_pixel_iterator& operator +=( distance_type delta ) noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] += delta; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + filter_pixel_iterator& operator -=( distance_type delta ) noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] -= delta; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Moves this iterator on the iterated image by the specified horizontal + * and vertical increments in pixels, \a dx and \a dy respectively, + * relative to its current position. Positive (negative) \a dx increments + * move the iterator rightwards (leftwards). Positive (negative) \a dy + * increments move the iterator downwards (upwards). + */ + filter_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + distance_type d = distance_type( dy )*this->m_image->Width() + distance_type( dx ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] += d; + if ( d >= 0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend filter_pixel_iterator operator +( const filter_pixel_iterator& i, distance_type delta ) noexcept + { + filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend filter_pixel_iterator operator +( distance_type delta, const filter_pixel_iterator& i ) noexcept + { + filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend filter_pixel_iterator operator -( const filter_pixel_iterator& i, distance_type delta ) noexcept + { + filter_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const filter_pixel_iterator& i, const filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const filter_pixel_iterator& i, const filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_filter_pixel_iterator + * \brief Immutable filter pixel iterator. + * + * An immutable pixel iterator provides read-only, random access to all + * pixels in an image. A filter pixel iterator uses a predicate object to + * filter pixels within its iteration range. + * + * Filter Predicates + * + * For an immutable filter pixel iterator, the class template argument F + * must provide a function call operator of the form: + * + * \code bool F::operator()( const GenericVector\& f ) const \endcode + * + * Each component of the passed vector \a f is a pointer to a constant pixel + * sample in the corresponding channel of the iterated image. The function + * call operator must return true if the pointed pixel is valid in the + * context of the filter iterator. The filter iterator stores a private + * instance of F to validate pixels, so the F class must provide also copy + * constructor semantics, either explicitly or implicitly. + * + * Filter Iterators + * + * Each time a filter iterator is constructed, incremented, decremented, or + * moved forward or backward, the filter predicate is called to validate the + * pixel or pixel sample pointed to by the iterator. If the pointed item is + * not valid, the iterator is incremented or decremented (depending on the + * operation performed initially) until it finds a valid one, or until it + * reaches the end of the iteration range, whichever happens first. In this + * way a filter iterator gives access only to valid items in a completely + * automatic and transparent fashion. + * + * \ingroup image_iterators + */ + template + class const_filter_pixel_iterator : + public filter_pixel_iterator_base, const_pixel_iterator, const sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef filter_pixel_iterator_base, const_pixel_iterator, const sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_filter_pixel_iterator() = default; + + /*! + * Constructs an immutable filter pixel iterator. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixels. + */ + const_filter_pixel_iterator( const image_type& image, const F& filter ) + : iterator_base( image, filter ) + { + } + + /*! + * Constructs an immutable filter pixel iterator from an immutable pixel + * iterator and the specified \a filter. + */ + const_filter_pixel_iterator( const const_pixel_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + const_filter_pixel_iterator( const const_filter_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this iterator. + */ + const_filter_pixel_iterator& operator =( const const_filter_pixel_iterator& ) = default; + + /*! + * Assigns an immutable pixel iterator to this object. Returns a + * reference to this iterator. + */ + const_filter_pixel_iterator& operator =( const const_pixel_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator in the specified \a channel. + */ + const sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A pixel iterator is active if it has not reached (or + * surpassed) its iteration limit. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the constant pixel + * sample pointed to by this iterator in the specified \a channel. + */ + const sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated image. Returns a reference to this + * iterator. + */ + const_filter_pixel_iterator& operator ++() noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + ++this->m_iterator[i]; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated image channel. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_filter_pixel_iterator operator ++( int ) noexcept + { + const_filter_pixel_iterator i0( *this ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + ++this->m_iterator[i]; + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated image channel, then returns a reference to + * this iterator. + */ + const_filter_pixel_iterator& operator --() noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + --this->m_iterator[i]; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated image channel. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_filter_pixel_iterator operator --( int ) noexcept + { + const_filter_pixel_iterator i0( *this ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + --this->m_iterator[i]; + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move forward by \a delta pixel samples. Negative + * increments move this iterator backward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_filter_pixel_iterator& operator +=( distance_type delta ) noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] += delta; + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position. Positive increments cause + * this iterator to move backward by \a delta pixel samples. Negative + * increments move this iterator forward by \a delta pixel samples. + * Returns a reference to this iterator. + */ + const_filter_pixel_iterator& operator -=( distance_type delta ) noexcept + { + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] -= delta; + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Moves this iterator on the iterated image by the specified horizontal + * and vertical increments in pixels, \a dx and \a dy respectively, + * relative to its current position. Positive (negative) \a dx increments + * move the iterator rightwards (leftwards). Positive (negative) \a dy + * increments move the iterator downwards (upwards). + */ + const_filter_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + distance_type d = distance_type( dy )*this->m_image->Width() + distance_type( dx ); + for ( int i = 0; i < this->m_iterator.Length(); ++i ) + this->m_iterator[i] += d; + if ( d >= 0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_filter_pixel_iterator operator +( const const_filter_pixel_iterator& i, distance_type delta ) noexcept + { + const_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_filter_pixel_iterator operator +( distance_type delta, const const_filter_pixel_iterator& i ) noexcept + { + const_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_filter_pixel_iterator operator -( const const_filter_pixel_iterator& i, distance_type delta ) noexcept + { + const_filter_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const const_filter_pixel_iterator& i, const const_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_filter_pixel_iterator& i, const const_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + template + class roi_filter_pixel_iterator_base : public roi_pixel_iterator_base + { + protected: + + typedef roi_pixel_iterator_base + roi_iterator_base; + + filter_type m_filter; + sample_pointer m_begin = nullptr; + + roi_filter_pixel_iterator_base() = default; + + roi_filter_pixel_iterator_base( image_type& image, const filter_type& filter, const Rect& rect ) + : roi_iterator_base( image, rect ) + , m_filter( filter ) + , m_begin( roi_iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + roi_filter_pixel_iterator_base( const roi_iterator_base& i, const filter_type& filter ) + : roi_iterator_base( i ) + , m_filter( filter ) + , m_begin( roi_iterator_base::m_iterator ) + { + JumpToNextValidSample(); + } + + roi_filter_pixel_iterator_base( const roi_filter_pixel_iterator_base& ) = default; + + roi_filter_pixel_iterator_base& operator =( const roi_filter_pixel_iterator_base& ) = default; + + roi_filter_pixel_iterator_base& operator =( const roi_iterator_base& i ) noexcept + { + (void)roi_iterator_base::operator =( i ); + JumpToNextValidSample(); + return *this; + } + + void JumpToNextValidSample() noexcept + { + while ( this->m_iterator[0] < this->m_end && !this->m_filter( this->m_iterator ) ) + roi_iterator_base::Increment(); + } + + void JumpToPrevValidSample() noexcept + { + while ( this->m_iterator[0] > this->m_begin && !this->m_filter( this->m_iterator ) ) + roi_iterator_base::Decrement(); + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::roi_filter_pixel_iterator + * \brief Mutable region-of-interest, filter pixel iterator. + * + * A mutable, region-of-interest (ROI), filter pixel iterator combines the + * capabilities of roi_pixel_iterator and filter_pixel_iterator in a single + * iterator class. + * + * \ingroup image_iterators + */ + template + class roi_filter_pixel_iterator : public roi_filter_pixel_iterator_base, sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef roi_filter_pixel_iterator_base, sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + roi_filter_pixel_iterator() = default; + + /*! + * Constructs a mutable, region-of-interest (ROI), filter pixel iterator. + * + * \param image The image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + */ + roi_filter_pixel_iterator( image_type& image, const F& filter, const Rect& rect = Rect( 0 ) ) + : iterator_base( image.EnsureUnique(), filter, rect ) + { + } + + /*! + * Constructs a mutable, region-of-interest (ROI), filter pixel iterator + * from the specified ROI pixel iterator \a i and \a filter. + */ + roi_filter_pixel_iterator( const roi_pixel_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + roi_filter_pixel_iterator( const roi_filter_pixel_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + roi_filter_pixel_iterator& operator =( const roi_filter_pixel_iterator& ) = default; + + /*! + * Assigns a ROI pixel iterator. Returns a reference to this object. + */ + roi_filter_pixel_iterator& operator =( const roi_pixel_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the image being iterated by this object. + */ + image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the pixel sample pointed to by this iterator in + * the specified \a channel. + */ + sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel iterator is active if it has not reached (or + * surpassed) its iteration limit, i.e. the bottom right corner of its + * iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the pixel sample + * pointed to by this iterator in the specified \a channel. + */ + sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated region of interest. Returns a reference to + * this iterator. + */ + roi_filter_pixel_iterator& operator ++() noexcept + { + this->Increment(); + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + roi_filter_pixel_iterator operator ++( int ) noexcept + { + roi_filter_pixel_iterator i0( *this ); + this->Increment(); + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated region of interest, then returns a + * reference to this iterator. + */ + roi_filter_pixel_iterator& operator --() noexcept + { + this->Decrement(); + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + roi_filter_pixel_iterator operator --( int ) noexcept + { + roi_filter_pixel_iterator i0( *this ); + this->Decrement(); + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_filter_pixel_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( delta%w, delta/w ); + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + roi_filter_pixel_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( -delta%w, -delta/w ); + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + roi_filter_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + sample* __restrict__ i0 = this->m_iterator[0]; + iterator_base::MoveBy( dx, dy ); + if ( this->m_iterator[0] >= i0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend roi_filter_pixel_iterator operator +( const roi_filter_pixel_iterator& i, distance_type delta ) noexcept + { + roi_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend roi_filter_pixel_iterator operator +( distance_type delta, const roi_filter_pixel_iterator& i ) noexcept + { + roi_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend roi_filter_pixel_iterator operator -( const roi_filter_pixel_iterator& i, distance_type delta ) noexcept + { + roi_filter_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const roi_filter_pixel_iterator& i, const roi_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const roi_filter_pixel_iterator& i, const roi_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::GenericImage::const_roi_filter_pixel_iterator + * \brief Immutable region-of-interest, filter pixel iterator. + * + * An immutable, region-of-interest (ROI), filter pixel iterator combines + * the capabilities of const_roi_pixel_iterator and + * const_filter_pixel_iterator in a single iterator class. + * + * \ingroup image_iterators + */ + template + class const_roi_filter_pixel_iterator : public roi_filter_pixel_iterator_base, const sample*, F> + { + public: + + /*! + * Represents the type of the iterated image. + */ + typedef GenericImage

image_type; + + /*! + * Represents the pixel traits class used by the iterated image. + */ + typedef typename image_type::pixel_traits pixel_traits; + + /*! + * Represents a pixel sample of the iterated image. + */ + typedef typename image_type::sample sample; + + /*! + * Represents the type of the unary predicate used by this filter + * iterator. + */ + typedef F filter_type; + + typedef roi_filter_pixel_iterator_base, const sample*, F> + iterator_base; + + /*! + * Default constructor. Initializes an invalid iterator. + */ + const_roi_filter_pixel_iterator() = default; + + /*! + * Constructs an immutable, region-of-interest (ROI), filter pixel + * iterator. + * + * \param image The constant image to iterate. + * + * \param filter Reference to a predicate object that will be used to + * filter pixel sample values. + * + * \param rect Region of interest. If an empty rectangle is specified, + * the current rectangular selection in the \a image will + * be used. If the specified rectangle is not empty and + * extends beyond image boundaries, only the intersection + * with the image will be used. If that intersection does + * not exist, then the resulting iterator will be invalid, + * with an empty iteration range. The default value is an + * empty rectangle. + */ + const_roi_filter_pixel_iterator( const image_type& image, const F& filter, const Rect& rect = Rect( 0 ) ) + : iterator_base( image, filter, rect ) + { + } + + /*! + * Constructs an immutable, region-of-interest (ROI), filter pixel + * iterator from the specified ROI pixel iterator \a i and \a filter. + */ + const_roi_filter_pixel_iterator( const const_roi_pixel_iterator& i, const F& filter ) + : iterator_base( i, filter ) + { + } + + /*! + * Copy constructor. + */ + const_roi_filter_pixel_iterator( const const_roi_filter_pixel_iterator& ) = default; + + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + const_roi_filter_pixel_iterator& operator =( const const_roi_filter_pixel_iterator& ) = default; + + /*! + * Assigns a ROI pixel iterator. Returns a reference to this object. + */ + const_roi_filter_pixel_iterator& operator =( const const_roi_pixel_iterator& i ) noexcept + { + (void)iterator_base::operator =( i ); + return *this; + } + + /*! + * Returns true only if this iterator is valid. A valid iterator defines + * a valid iterated image and a non-null position. + */ + bool IsValid() const noexcept + { + return this->m_image != nullptr && !this->m_iterator.IsEmpty(); + } + + /*! + * Returns a reference to the constant image being iterated by this + * object. + */ + const image_type& Image() const noexcept + { + return *this->m_image; + } + + /*! + * Returns a reference to the immutable predicate object used by this + * filter iterator. + */ + const filter_type& Filter() const noexcept + { + return this->m_filter; + } + + /*! + * Returns a reference to the mutable predicate object used by this + * filter iterator. + */ + filter_type& Filter() noexcept + { + return this->m_filter; + } + + /*! + * Returns a pointer to the constant pixel sample pointed to by this + * iterator in the specified \a channel. + */ + const sample* Position( int channel ) const noexcept + { + return this->m_iterator[channel]; + } + + /*! + * Boolean type conversion operator. Returns true if this iterator is + * active. A ROI pixel iterator is active if it has not reached (or + * surpassed) its iteration limit, i.e. the bottom right corner of its + * iterated region of interest. + */ + operator bool() const noexcept + { + return this->m_iterator[0] < this->m_end; + } + + /*! + * Array subscript operator. Returns a reference to the constant pixel + * sample pointed to by this iterator in the specified \a channel. + */ + const sample& operator []( int channel ) const noexcept + { + return *this->m_iterator[channel]; + } + + /*! + * Pre-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated region of interest. Returns a reference to + * this iterator. + */ + const_roi_filter_pixel_iterator& operator ++() noexcept + { + this->Increment(); + this->JumpToNextValidSample(); + return *this; + } + + /*! + * Post-increment operator. Causes this iterator to point to the next + * valid pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_roi_filter_pixel_iterator operator ++( int ) noexcept + { + const_roi_filter_pixel_iterator i0( *this ); + this->Increment(); + this->JumpToNextValidSample(); + return i0; + } + + /*! + * Pre-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated region of interest, then returns a + * reference to this iterator. + */ + const_roi_filter_pixel_iterator& operator --() noexcept + { + this->Decrement(); + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Post-decrement operator. Causes this iterator to point to the previous + * valid pixel in the iterated region of interest. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_roi_filter_pixel_iterator operator --( int ) noexcept + { + const_roi_filter_pixel_iterator i0( *this ); + this->Decrement(); + this->JumpToPrevValidSample(); + return i0; + } + + /*! + * Scalar assignment/addition operator. Increments this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move forward (rightwards and downwards) by \a delta pixel + * samples. Negative increments move this iterator backward (leftwards + * and upwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_filter_pixel_iterator& operator +=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( delta%w, delta/w ); + } + + /*! + * Scalar assignment/subtraction operator. Decrements this iterator by a + * distance \a delta from its current position, within the rectangular + * region of interest being iterated. Positive increments cause this + * iterator to move backward (leftwards and upwards) by \a delta pixel + * samples. Negative increments move this iterator forward (rightwards + * and downwards) by \a delta pixel samples. Returns a reference to this + * iterator. + */ + const_roi_filter_pixel_iterator& operator -=( distance_type delta ) noexcept + { + int w = this->m_rowEnd - this->m_rowBegin; + return MoveBy( -delta%w, -delta/w ); + } + + /*! + * Moves this iterator within its rectangular region of interest by the + * specified horizontal and vertical increments in pixels, \a dx and + * \a dy respectively, relative to its current position. Positive + * (negative) \a dx increments move the iterator rightwards (leftwards). + * Positive (negative) \a dy increments move the iterator downwards + * (upwards). + */ + const_roi_filter_pixel_iterator& MoveBy( int dx, int dy ) noexcept + { + const sample* __restrict__ i0 = this->m_iterator[0]; + iterator_base::MoveBy( dx, dy ); + if ( this->m_iterator[0] >= i0 ) + this->JumpToNextValidSample(); + else + this->JumpToPrevValidSample(); + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to the specified iterator \a i incremented by a distance \a delta. + */ + friend const_roi_filter_pixel_iterator operator +( const const_roi_filter_pixel_iterator& i, distance_type delta ) noexcept + { + const_roi_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Iterator-to-scalar addition operator. This operator implements the + * commutative property of scalar-to-iterator addition. + */ + friend const_roi_filter_pixel_iterator operator +( distance_type delta, const const_roi_filter_pixel_iterator& i ) noexcept + { + const_roi_filter_pixel_iterator j( i ); + j += delta; + return j; + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * the specified iterator \a i decremented by a distance \a delta. + */ + friend const_roi_filter_pixel_iterator operator -( const const_roi_filter_pixel_iterator& i, distance_type delta ) noexcept + { + const_roi_filter_pixel_iterator j( i ); + j -= delta; + return j; + } + + /*! + * Equality operator. Returns true if two iterators \a i and \a j point + * to the same pixel. + */ + friend bool operator ==( const const_roi_filter_pixel_iterator& i, const const_roi_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] == j.m_iterator[0]; + } + + /*! + * Less than operator. Returns true if the specified iterator \a i + * precedes another iterator \a j. + */ + friend bool operator <( const const_roi_filter_pixel_iterator& i, const const_roi_filter_pixel_iterator& j ) noexcept + { + return i.m_iterator[0] < j.m_iterator[0]; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * Returns true iff this %GenericImage template instantiation uses floating + * point pixel samples; returns false if it uses integer samples. + */ + static bool IsFloatSample() noexcept + { + return pixel_traits::IsFloatSample(); + } + + /*! + * Returns true iff this %GenericImage template instantiation uses complex + * pixel samples; returns false if it uses real samples. + */ + static bool IsComplexSample() noexcept + { + return pixel_traits::IsComplexSample(); + } + + /*! + * Returns the number of 8-bit bytes required to store a pixel sample in + * this %GenericImage template instantiation. + */ + static int BytesPerSample() noexcept + { + return P::BytesPerSample(); + } + + /*! + * Returns the number of bits in a pixel sample of this %GenericImage + * template instantiation. + */ + static int BitsPerSample() noexcept + { + return P::BitsPerSample(); + } + + /*! + * Returns true iff this object and another \a image use the same pixel + * sample type: + * + * \li Same sample size in bits. + * \li Both images using integer, floating point real, or complex samples. + */ + template + bool SameSampleType( const GenericImage& image ) const noexcept + { + return image.BitsPerSample() == BitsPerSample() && + image.IsFloatSample() == IsFloatSample() && + image.IsComplexSample() == IsComplexSample(); + } + + /*! + * Always returns true, indicating that this object and the specified + * \a image, both of the same template instantiation, use the same pixel + * sample type. + */ + bool SameSampleType( const GenericImage& image ) const noexcept + { + return true; + } + + // ------------------------------------------------------------------------- + + /*! + * Constructs a default local image. This object will be initialized as an + * empty grayscale image with local storage. + */ + GenericImage() + { + m_data = new Data( this ); + } + + /*! + * Copy constructor. Constructs a local image to store a copy of the + * currently selected pixel samples in a local or shared image. The behavior + * of this constructor depends on the current selections and storage type of + * the specified source \a image: + * + * \li If the source object is a shared image, then this constructor will + * create a duplicate of its current selection as a local image. + * + * \li If the source object is a completely selected local image + * (see the note below), then this object will reference the same image + * data, and hence no duplicate of the existing pixel data will be + * generated. This enables the copy-on-write (or implicit data sharing) + * functionality of %GenericImage. + * + * \li If the source image is only partially selected, then a local image + * will be initialized to store in this object a copy of the selected pixel + * samples in the source image. If the selected range of channels is smaller + * than the required number of nominal channels for the source color space, + * then this object will be in the grayscale space. Otherwise this object + * will inherit the color space of the source \a image. + * + * \note In a completely selected image, the current rectangular selection + * includes the entire image boundaries, and the range of selected channels + * comprises all existing channels, including all nominal and alpha + * channels. By default, all images are completely selected. A complete + * selection is also enabled after calling the inherited + * ImageGeometry::ResetSelections() member function. + */ + GenericImage( const GenericImage& image ) + { + if ( !image.IsShared() ) + if ( image.IsCompletelySelected() ) + { + image.m_data->Attach( this ); + m_data = image.m_data; + m_status = image.m_status; + ResetSelections(); + return; + } + + m_data = new Data( this ); + (void)Assign( image ); + } + + /*! + * Move constructor. + */ + GenericImage( GenericImage&& image ) + : AbstractImage( image ) + , m_data( image.m_data ) + { + image.m_data = nullptr; + } + + /*! + * Constructs a local image to store a copy of the specified \a image, which + * belongs to a different template instantiation. + * + * This constructor generates a uniquely referenced duplicate of the current + * selection of pixel samples in the specified \a image, converted to the + * sample type of this template instantiation. + * + * \note Don't confuse this constructor with the copy constructor for + * %GenericImage. Note that the source \a image argument is a reference to a + * different template instantiation of %GenericImage. + */ + template + GenericImage( const GenericImage& image ) + { + m_data = new Data( this ); + (void)Assign( image ); + } + + /*! + * Constructs a local image to store a copy of a subset of pixel samples in + * the specified \a image. + * + * \param image Source image. + * + * \param rect Source rectangular selection. If this parameter defines an + * empty rectangle, the current rectangular selection in the + * source \a image will be used. If the specified rectangle + * is not empty and extends beyond the boundaries of the + * source \a image, only the intersection with the source + * \a image will be used. If that intersection does not + * exist, this constructor will initialize an empty image. + * + * \param firstChannel Zero-based index of the first channel to copy. If + * a negative index is specified, the first selected channel + * in the source \a image will be used. If the specified + * index is larger than or equal to the number of existing + * channels in the source \a image, this constructor will + * initialize an empty image. The default value is -1. + * + * \param lastChannel Zero-based index of the last channel to copy. If + * a negative index is specified, the last selected channel + * in the source \a image will be used. If the specified + * index is larger than or equal to the number of existing + * channels in the source \a image, this constructor will + * initialize an empty image. The default value is -1. + * + * If the specified source \a image and this object use different pixel + * sample types, this constructor will use pixel traits primitives to + * perform all the necessary data type conversions between different pixel + * sample types transparently. + * + * \note This constructor will always generate a uniquely referenced, local + * image, irrespective of whether the \a rect, \a firstChannel and + * \a lastChannel parameters define a complete or partial selection for the + * specified source \a image. To make use of the implicit data sharing + * mechanism of %GenericImage, use the copy constructor and make sure that + * the source \a image is completely selected. + */ + template + GenericImage( const GenericImage& image, const Rect& rect, int firstChannel = -1, int lastChannel = -1 ) + { + m_data = new Data( this ); + (void)Assign( image, rect, firstChannel, lastChannel ); + } + + /*! + * Constructs a local image with the specified dimensions and color space. + * + * \param width Width in pixels of the newly created image. + * + * \param height Height in pixels of the newly created image. + * + * \param colorSpace Color space. See the ColorSpace namespace for + * symbolic constants. If this parameter is not specified, a + * grayscale image will be constructed. + * + * The number of channels in the constructed image will depend on the + * specified color space. Grayscale images will have a single channel. In + * general, color images will have three channels. + * + * \note Pixel samples in the newly constructed image are not initialized by + * this constructor, so the image will contain unpredictable values. + */ + GenericImage( int width, int height, color_space colorSpace = ColorSpace::Gray ) + { + m_data = new Data( this ); + m_data->Allocate( width, height, ColorSpace::NumberOfNominalChannels( colorSpace ), colorSpace ); + ResetSelections(); + } + + /*! + * Constructs a local image with data read from a raw-storage stream. + * + * \param stream Reference to an input stream where a raw image has been + * previously stored (e.g. with the Write() member function). + * + * The input \a stream must provide sample values in the sample data type of + * this image. The sample data type of an image is invariantly defined by + * its template instantiation, and thus cannot be changed. + * + * \warning If the image stored in the input \a stream and this image use + * different pixel sample data types, this function will throw an Error + * exception with the appropriate error message. + */ + explicit GenericImage( File& stream ) + { + m_data = new Data( this ); + Read( stream ); + } + + /*! + * Constructs a shared, client-side managed image corresponding to a + * server-side image living in the PixInsight core application. + * + * \param handle A low-level API handle to an existing image in the + * PixInsight core application. + * + * Shared images are alias objects referencing server-side images living + * within the PixInsight core application. Shared images allocate pixel data + * in the core application's heap, which we call shared memory. + * + * Local images exist within the user module's local heap, including all of + * their pixel data. + * + * PCL implements an abstraction mechanism that allows you to handle local + * and shared images transparently. Except in very few and special cases, + * you don't have to know whether you're working with a shared or a local + * image; your code will be exactly the same under both situations. + */ + explicit GenericImage( void* handle ) + { + m_data = new Data( this, handle ); + ResetSelections(); + } + + /*! + * Constructs a new shared image with the specified geometry and color. + * + * \param width Width in pixels of the newly created image. + * + * \param height Height in pixels of the newly created image. + * + * \param colorSpace Color space. See the ColorSpace namespace for + * symbolic constants. If this parameter is not specified, a + * grayscale image will be constructed. + * + * The first \c void* parameter is strictly formal. Its value will be + * ignored as its sole purpose is to distinguish this constructor from the + * corresponding local storage constructor. + * + * The number of channels in the constructed image will depend on the + * specified color space. Grayscale images will have a single channel. In + * general, color images will have three channels. + * + * A shared image created with this constructor can be used for intermodule + * communication tasks, such as file I/O operations with the FileFormat and + * FileFormatInstance classes, and execution of processes with Process and + * ProcessInstance. + * + * \note Pixel samples in the newly constructed image are not initialized by + * this constructor, so the image will contain unpredictable values. + */ + GenericImage( void*, int width, int height, color_space colorSpace = ColorSpace::Gray ) + { + m_data = new Data( this, width, height, ColorSpace::NumberOfNominalChannels( colorSpace ), colorSpace ); + ResetSelections(); + } + + /*! + * Destroys a %GenericImage instance. If this is a nonempty local or shared + * image, the image data associated with this object are dereferenced. If + * the image data become unreferenced, they are also destroyed. + * + * The internal allocator object does all the necessary clean-up work for + * both local and shared images transparently: + * + * \li When a local image becomes unreferenced, all the internal data + * structures are destroyed and the memory space in use to store pixel + * samples is released immediately in the local heap of the calling module. + * + * \li When a shared image becomes unreferenced, the server-side image is + * dereferenced. When the server-side shared image becomes unreferenced, it + * is garbage-collected and eventually destroyed by the PixInsight core + * application. + */ + virtual ~GenericImage() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + // ------------------------------------------------------------------------- + + /*! + * Returns true iff this object is a shared image. Returns false if this is + * a local image. + * + * Shared images are alias objects referencing actual images living within + * the PixInsight core application. Shared images allocate pixel data in + * the core application's heap, which we call shared memory. + * + * Local images exist within the user module's local heap, including all of + * their pixel data. + * + * PCL implements an abstraction mechanism that allows you to handle local + * and shared images transparently. Except in very few and special cases, + * you don't have to know whether you're working with a shared or a local + * image; your code will be exactly the same under both situations. + */ + bool IsShared() const noexcept + { + return m_data->IsShared(); + } + + /*! + * Returns true iff this object uniquely references its pixel data. Returns + * false if this object is sharing its pixel data with other %GenericImage + * instances. + * + * \note Don't confuse uniqueness of reference with local or shared storage + * of images. A %GenericImage can share its data with other instances living + * in the local heap of the calling module, irrespective of whether the + * pixel data is local or shared. + */ + bool IsUnique() const noexcept + { + return m_data->IsUnique(); + } + + /*! + * Ensures that this image uses local pixel data storage. Returns a + * reference to this image. + * + * If this object is already a local image, then calling this member + * function has no effect. + * + * If the image is shared, then this function creates a local duplicate, + * dereferences the previously referenced pixel data, and references the + * newly created local duplicate. Upon returning, this image will uniquely + * reference its pixel data. + */ + GenericImage& EnsureLocal() + { + if ( m_data->IsShared() ) + { + GenericImage local_; + GenericImage* local = &local_; // ### Workaround to GCC 7's 'dereferencing type-punned pointer' bugs + local->m_data->Allocate( m_width, m_height, m_numberOfChannels, m_colorSpace ); + local->m_RGBWS = m_RGBWS; + local->m_selected = m_selected; + local->m_savedSelections = m_savedSelections; + local->m_status = m_status; + for ( int c = 0; c < m_numberOfChannels; ++c ) + P::Copy( (*local)[c], m_channelData( c ), NumberOfPixels() ); + + local->m_data->Attach( this ); + DetachFromData(); + m_data = local->m_data; + } + return *this; + } + + /*! + * Ensures that this object uniquely references its pixel data, making a + * unique copy of its referenced pixel data if necessary. Returns a + * reference to this image. + * + * If this object is not sharing its pixel data with other %GenericImage + * instances, then calling this member function has no effect. + * + * If this object is sharing its pixel data with other instances, then the + * previously referenced pixel data are dereferenced, and a newly created + * copy of the pixel data is uniquely referenced by this image. In this case + * this object will always be a \e local image after calling this function: + * newly created duplicates of existing pixel data are always allocated in + * the local heap of the calling module. + */ + GenericImage& EnsureUnique() + { + if ( !m_data->IsUnique() ) + { + Data* newData = m_data->Clone( this ); + DetachFromData(); + m_data = newData; + } + return *this; + } + + /*! + * Returns a reference to the internal pixel allocator object associated + * with this image. + * + * The type of the allocator object is a template specialization of the + * PixelAllocator class for the sample data type of this image. The + * allocator is responsible for dynamic allocation of pixel data, including + * channel slots (pointers to pixel sample blocks) and pixel sample + * blocks (used to store channel pixel data). + * + * The allocator must be able to handle dynamic allocation for local and + * shared memory transparently. This means that the allocator object knows + * whether this is a local image (allocated in the calling module's heap) or + * a shared image (allocated in the PixInsight core's heap), and allows you + * to manage and allocate pixel data without distinction in both cases. + * + * \warning \e Never use the \c new and \c delete operators with pixel data + * memory blocks. Always call the Allocator() member function of + * %GenericImage to get a reference to its PixelAllocator object, then use + * its public member functions for all allocations and deallocations of + * pixel data. + */ + pixel_allocator& Allocator() const noexcept + { + return m_allocator; + } + + /*! + * \internal Synchronizes this object with the server-side shared image, if + * this is a shared client-side image. Does nothing if this is a local + * image allocated in the calling module's heap. + */ + void Synchronize() + { + m_data->SynchronizeWithSharedImage(); + ResetSelections(); + } + + /*! + * Allocates new pixel data with the specified geometry and color space. + * Returns a reference to this image. + * + * \param width New image width in pixels. + * + * \param height New image height in pixels. + * + * \param numberOfChannels Number of channels. Must be greater than or + * equal to the number of nominal channels corresponding to + * the specified color space: one for grayscale images; three + * for color images. If this parameter is not specified, a + * single grayscale channel will be allocated. + * + * \param colorSpace New color space. See the ColorSpace namespace + * for symbolic constants. If this parameter is not + * specified, new image data will be allocated in the + * grayscale space. + * + * If this object uniquely references its pixel data, then the previously + * existing pixel data are destroyed, deallocated, and replaced with a newly + * allocated local or shared image, preserving the storage space of this + * instance. + * + * If this object is not unique, then the previously referenced pixel data + * are dereferenced, and a newly created local image is uniquely referenced + * by this object and allocated with the specified parameters. + * + * All image selections are reset to the default full selection after + * calling this function. + * + * \note Newly allocated pixel samples are not initialized, so the image + * will contain unpredictable values after calling this member function. + */ + GenericImage& AllocateData( int width, int height, + int numberOfChannels = 1, + color_space colorSpace = ColorSpace::Gray ) + { + if ( !m_data->IsUnique() ) + { + Data* newData = new Data( this ); + DetachFromData(); + m_data = newData; + } + m_data->Allocate( width, height, numberOfChannels, colorSpace ); + ResetSelections(); + return *this; + } + + /*! + * Allocates new pixel data with the specified geometry and color space. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * AllocateData( rect.Width(), rect.Height(), numberOfChannels, colorSpace ); + * \endcode + */ + GenericImage& AllocateData( const Rect& rect, + int numberOfChannels = 1, + color_space colorSpace = ColorSpace::Gray ) + { + return AllocateData( rect.Width(), rect.Height(), numberOfChannels, colorSpace ); + } + + /*! + * Causes this object to reference an empty image. Returns a reference to + * this image. + * + * If this object uniquely references its pixel data, then the pixel data + * are destroyed and deallocated immediately. + * + * If this object is not unique, then the previously referenced pixel data + * are dereferenced, and a newly created empty local image is uniquely + * referenced by this object. + */ + GenericImage& FreeData() + { + if ( !m_data->IsEmpty() ) + if ( m_data->IsUnique() ) + m_data->Deallocate(); + else + { + Data* newData = new Data( this ); + DetachFromData(); + m_data = newData; + } + ResetSelections(); + return *this; + } + + /*! + * Forces this image to acquire the specified pixel data. Returns a + * reference to this image. + * + * \param data Starting address of the acquired pixel data. Must be + * either a null pointer, or a pointer to an array of + * contiguous blocks of pixel samples. + * + * \param width Width in pixels of the acquired pixel data. + * + * \param height Height in pixels of the acquired pixel data. + * + * \param numberOfChannels Number of channels in the acquired data. Must + * be greater than or equal to the number of nominal channels + * corresponding to the specified color space: one for + * grayscale images; three for color images. If this + * parameter is not specified, a single grayscale channel is + * assumed. + * + * \param colorSpace Color space of the acquired data. See the + * ColorSpace namespace for symbolic constants. If this + * parameter is not specified, the grayscale space is assumed + * for the acquired data. + * + * If this object uniquely references its pixel data, then the previously + * existing pixel data are destroyed, deallocated, and replaced with the + * specified local or shared \a data, preserving the storage space of this + * instance. + * + * If this object is a non-unique local image, then the previously + * referenced pixel data are dereferenced, and a newly created local image + * is uniquely referenced by this object and forced to own the specified + * local \a data. + * + * If this object is a non-unique shared image, then this member function + * throws an Error exception with the appropriate error message: An aliased + * shared image cannot be forced to store externally allocated pixel data. + * + * When successful, this function resets all image selections to the default + * full selection. + * + * \warning When calling this member function for a shared image, always + * make sure that the passed \a data array and the pointed data blocks have + * been allocated as shared memory. If you pass a locally-allocated array or + * block to this function (e.g., a \c new'ed block), you may cause severe + * heap corruption in the PixInsight core application. Similarly, if the + * image is local, only locally-allocated arrays and blocks must be used. In + * other words: shared and local pixel data and images cannot be mixed. + * + * \warning \e Never use the \c new and \c delete operators with pixel data + * memory blocks. Always call the Allocator() member function of + * %GenericImage to get a reference to its PixelAllocator object, then use + * its public member functions for all allocations and deallocations of + * pixel data. + */ + GenericImage& ImportData( sample** data, int width, int height, + int numberOfChannels = 1, color_space colorSpace = ColorSpace::Gray ) + { + if ( !m_data->IsUnique() ) + { + if ( m_data->IsShared() ) + throw Error( "GenericImage::ImportData(): Invalid operation for an aliased shared image" ); + Data* newData = new Data( this ); + DetachFromData(); + m_data = newData; + } + m_data->Import( data, width, height, numberOfChannels, colorSpace ); + ResetSelections(); + return *this; + } + + /*! + * Releases ownership of the pixel data allocated by this image. + * + * Returns an array of pointers to the channel data blocks that were owned + * by the image before calling this function. The returned array is a + * sequence of pointers p0, p1, ..., pn-1, where each pi is the starting + * address of a contiguous block containing the sample data of an image + * channel, and n is the number of channels in the image, including all + * nominal and alpha channels. + * + * After calling this function the image will be empty, but the returned + * data will not be deallocated; the caller will be responsible for + * deallocating it when it is no longer needed. + * + * If this member function is called for an aliased image, it throws an + * Error exception with the appropriate error message: Pixel data cannot be + * released if two or more %GenericImage instances are referencing them. + * The reason for this limitation is that if the data of a non-unique image + * were released, either all instances sharing the same data would be + * affected, which violates the implicit data sharing paradigm, or the newly + * allocated data of a unique clone would be released, which makes no sense. + * + * \warning When calling ReleaseData() for a shared image, always be aware + * that the returned \c sample** value points to a \e shared memory block. + * If you handle such a block as if it was a block within your local heap + * (e.g., if you call the \c delete operator to deallocate it), you may + * cause severe heap corruption. + * + * \warning \e Never use the \c new and \c delete operators with pixel data + * memory blocks. Always call the Allocator() member function of + * %GenericImage to get a reference to its PixelAllocator object, then use + * its public member functions for all allocations and deallocations of + * pixel data. + */ + sample** ReleaseData() + { + if ( !m_data->IsUnique() ) + throw Error( "GenericImage::ReleaseData(): Invalid operation for an aliased image" ); + sample** data = m_data->Release(); + ResetSelections(); + return data; + } + + // ------------------------------------------------------------------------- + + /*! + * Returns the size in bytes of a row of pixels in this image (also known as + * a scan line). + */ + size_type LineSize() const noexcept + { + return BytesPerSample() * size_type( m_width ); + } + + /*! + * Returns the size in bytes of a channel of this image. This is equal to + * the area in square pixels multiplied by BytesPerSample(). + */ + size_type ChannelSize() const noexcept + { + return BytesPerSample() * NumberOfPixels(); + } + + /*! + * Returns the size in bytes of all memory blocks required to store the + * pixel data in this image, including nominal and alpha channels. This is + * equal to the area in square pixels multiplied by the number of channels, + * multiplied by BytesPerSample(). + */ + size_type ImageSize() const noexcept + { + return ChannelSize() * size_type( m_numberOfChannels ); + } + + /*! + * Returns the size in bytes of all memory blocks required to store the + * pixel data in the nominal channels of this image (i.e., \e excluding + * alpha channels). + */ + size_type NominalSize() const noexcept + { + return ChannelSize() * NumberOfNominalChannels(); + } + + /*! + * Returns the size in bytes of all memory blocks required to store the + * pixel data in the alpha channels of this image (i.e., \e excluding + * nominal channels). Returns zero if this image has no alpha channels. + */ + size_type AlphaSize() const noexcept + { + return ChannelSize() * NumberOfAlphaChannels(); + } + + /*! + * Returns a pointer to the first pixel sample in the specified \a channel. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * The returned value is the address of the pixel at coordinates x=y=0 in + * the specified \a channel. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample* PixelData( int channel = 0 ) + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + EnsureUnique(); + return m_channelData( channel ); + } + + /*! + * Returns a pointer to the constant first pixel sample in the specified + * \a channel. + * + * This member function is the immutable counterpart of PixelData( int ). + */ + const sample* PixelData( int channel = 0 ) const noexcept + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + return m_channelData( channel ); + } + + /*! + * Returns true only is this is a valid, nonempty image. + */ + operator bool() const noexcept + { + return m_data != nullptr && !m_data->IsEmpty(); + } + + /*! + * Returns a pointer to the first pixel sample in the specified \a channel. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. + * + * This operator is a convenience synonym for the PixelData( int ) member + * function. + */ + sample* operator []( int channel ) + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + return PixelData( channel ); + } + + /*! + * Returns a pointer to the constant first pixel sample in the specified + * \a channel. + * + * This operator function is the immutable counterpart of operator []( int ). + */ + const sample* operator []( int channel ) const noexcept + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + return PixelData( channel ); + } + + /*! + * Returns a pointer to the first pixel sample in the first channel of this + * image. + * + * For grayscale images, this function can be more readable and elegant than + * operator []( int ). + */ + sample* operator *() + { + PCL_PRECONDITION( 0 < m_numberOfChannels ) + return PixelData( 0 ); + } + + /*! + * Returns a pointer to the constant first pixel sample in the first channel + * of this image. + * + * This operator function is the immutable counterpart of operator *(). + */ + const sample* operator *() const noexcept + { + PCL_PRECONDITION( 0 < m_numberOfChannels ) + return PixelData( 0 ); + } + + /*! + * Returns the starting address of a scan line (i.e., a row of + * pixels) in this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, such that 0 ≤ \a y < \a h, where \a h is the + * height in pixels of this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * The returned value is a pointer to the sample at coordinates (x=0,y) in + * the specified \a channel. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample* ScanLine( int y, int channel = 0 ) + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + PCL_PRECONDITION( 0 <= y && y < m_height ) + EnsureUnique(); + return m_channelData( channel ) + RowOffset( y ); + } + + /*! + * Returns the starting address of a constant scan line (i.e., a + * row of pixels) in this image. + * + * This member function is the immutable counterpart of ScanLine( int, int ). + */ + const sample* ScanLine( int y, int channel = 0 ) const noexcept + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + PCL_PRECONDITION( 0 <= y && y < m_height ) + return m_channelData( channel ) + RowOffset( y ); + } + + /*! + * Returns the address of a pixel sample in this image, given by its pixel + * coordinates and channel index. + * + * \param x Horizontal coordinate (or column index) of the desired + * pixel, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * The returned value is a pointer to the sample at coordinates (x,y) in the + * specified \a channel. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample* PixelAddress( int x, int y, int channel = 0 ) + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + PCL_PRECONDITION( 0 <= x && x < m_width ) + PCL_PRECONDITION( 0 <= y && y < m_height ) + EnsureUnique(); + return m_channelData( channel ) + PixelOffset( x, y ); + } + + /*! + * Returns the address of a constant pixel sample in this image, given by + * its pixel coordinates and channel index. + * + * This member function is the immutable counterpart of PixelAddress( int, int, int ). + */ + const sample* PixelAddress( int x, int y, int channel = 0 ) const noexcept + { + PCL_PRECONDITION( 0 <= channel && channel < m_numberOfChannels ) + PCL_PRECONDITION( 0 <= x && x < m_width ) + PCL_PRECONDITION( 0 <= y && y < m_height ) + return m_channelData( channel ) + PixelOffset( x, y ); + } + + /*! + * Returns the address of a pixel sample in this image, given by its pixel + * position and channel index. + * + * \param p Position of the desired pixel in image coordinates. The + * specified point must be included in the image bounds + * rectangle, that is, its coordinates must refer to an + * existing pixel in this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * The returned value is a pointer to the sample at coordinates (p.x,p.y) in + * the specified \a channel. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample* PixelAddress( const Point& p, int channel = 0 ) + { + return PixelAddress( p.x, p.y, channel ); + } + + /*! + * Returns the address of a constant pixel sample in this image, given by + * its pixel position and channel index. + * + * This member function is the immutable counterpart of + * PixelAddress( const Point&, int ). + */ + const sample* PixelAddress( const Point& p, int channel = 0 ) const noexcept + { + return PixelAddress( p.x, p.y, channel ); + } + + /*! + * Returns a reference to a pixel sample in this image, given by its pixel + * coordinates and channel index. + * + * \param x Horizontal coordinate (or column index) of the desired + * pixel, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample& operator ()( int x, int y, int channel = 0 ) + { + return *PixelAddress( x, y, channel ); + } + + /*! + * Returns a pixel sample value, given by its pixel coordinates and channel + * index. + * + * \param x Horizontal coordinate (or column index) of the desired + * pixel, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + */ + sample operator ()( int x, int y, int channel = 0 ) const noexcept + { + return *PixelAddress( x, y, channel ); + } + + /*! + * Returns a reference to a pixel sample in this image, given by its pixel + * position and channel index. + * + * \param p Position of the desired pixel in image coordinates. The + * specified point must be included in the image bounds + * rectangle, that is, its coordinates must refer to an + * existing pixel in this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * If this image is aliased, it is made unique before returning from this + * member function. This involves making a local duplicate of the previously + * referenced pixel data. + */ + sample& operator ()( const Point& p, int channel = 0 ) + { + return *PixelAddress( p, channel ); + } + + /*! + * Returns a pixel sample value, given by its pixel position and channel + * index. + * + * \param p Position of the desired pixel in image coordinates. The + * specified point must be included in the image bounds + * rectangle, that is, its coordinates must refer to an + * existing pixel in this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + */ + sample operator ()( const Point& p, int channel = 0 ) const noexcept + { + return *PixelAddress( p, channel ); + } + + /*! + * Returns a reference to a pixel sample in this image, given by its pixel + * coordinates and channel index. + * + * \deprecated This member function has been deprecated. Use + * GenericImage::operator()( int, int, int ) in newly produced code. + */ + sample& Pixel( int x, int y, int channel = 0 ) + { + return operator()( x, y, channel ); + } + + /*! + * Returns a pixel sample value, given by its pixel coordinates and channel + * index. + * + * \deprecated This member function has been deprecated. Use + * GenericImage::operator()( int, int, int ) const in newly produced code. + */ + sample Pixel( int x, int y, int channel = 0 ) const noexcept + { + return operator()( x, y, channel ); + } + + /*! + * Returns a reference to a pixel sample in this image, given by its pixel + * position and channel index. + * + * \deprecated This member function has been deprecated. Use + * GenericImage::operator()( const Point&, int ) in newly produced code. + */ + sample& Pixel( const Point& p, int channel = 0 ) + { + return operator()( p, channel ); + } + + /*! + * Returns a pixel sample value, given by its pixel position and channel + * index. + * + * \deprecated This member function has been deprecated. Use + * GenericImage::operator()( const Point&, int ) const in newly produced + * code. + */ + sample Pixel( const Point& p, int channel = 0 ) const noexcept + { + return operator()( p, channel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Associates an RGB working space \a RGBWS with this image. + * + * \note For shared images (i.e. images living in the PixInsight core + * application), the RGB working space cannot be changed by calling this + * member function. + */ + void SetRGBWorkingSpace( const RGBColorSystem& RGBWS ) override + { + if ( !IsShared() ) + { + EnsureUnique(); + m_RGBWS = RGBWS; + } + } + + // ------------------------------------------------------------------------- + + /*! + * Copies pixel samples from the specified source \a image to this image. + * Returns a reference to this image. + * + * \param image Source image. + * + * \param rect Source rectangular selection. If this parameter defines an + * empty rectangle, the current rectangular selection in the + * source \a image will be used. If the specified rectangle + * is not empty and extends beyond source \a image + * boundaries, only the intersection with the source \a image + * will be used. If that intersection does not exist, then + * this image will be empty after calling this member + * function. The default value is an empty rectangle. + * + * \param firstChannel Zero-based index of the first channel to copy. If a + * negative value is specified, the first selected channel in + * the source \a image will be used. If the specified value + * is larger than or equal to the number of existing channels + * in the source \a image, then this image will be empty + * after calling this function. The default value is -1. + * + * \param lastChannel Zero-based index of the last channel to copy. If a + * negative value is specified, the last selected channel in + * the source \a image will be used. If the specified value + * is larger than or equal to the number of existing channels + * in the source \a image, then this image will be empty + * after calling this function. The default value is -1. + * + * Previously referenced data in this image will be dereferenced, and + * immediately destroyed if they become unreferenced. + * + * If this image and the specified source \a image are (a) compatible in + * terms of pixel sample types, (b) both are local images, and (c) the + * source \a image is completely selected, then this member function just + * references the same pixel data, enabling the implicit data sharing + * mechanism of %GenericImage. In this case, existing pixel data in the + * source \a image are not duplicated, and no allocation is performed. + * + * If this member function causes a reallocation of pixel data, the newly + * allocated data will be uniquely referenced by this image. + * + * The source \a image can be an instance of any supported template + * instantiation of %GenericImage, not necessarily of the same instantiation + * than this image. All the necessary data type conversions are performed + * transparently. If pixel sample types are different, source data are + * transformed to the data type of this image. This involves conversions + * from the source data type P1::sample to the target data type P::sample, + * as per pixel traits primitives. + * + * \note It is very important to point out that the storage class of an + * image cannot be changed with this member function, even if this image and + * the source image belong to the same template instantiation. For example: + * + * \code + * Image aSharedImage( (void*)0, 0, 0 ); + * ... + * Image local; + * ... + * local.Assign( aSharedImage ); // local continues being a local image. + * // It now stores a copy of aSharedImage's + * // pixel data. + * local = aSharedImage; // Same as above, since the assignment operator is + * // just an alias for the Assign() function. + * + * ImageVariant otherShared; + * otherShared.CreateSharedFloatImage(); + * otherShared.AssignImage( local ); // otherShared is still a shared image. + * \endcode + */ + template + GenericImage& Assign( const GenericImage& image, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + m_status = image.Status(); + + Rect r = rect; + if ( !image.ParseSelection( r, firstChannel, lastChannel ) ) + { + FreeData(); + return *this; + } + + int n = 1 + lastChannel - firstChannel; + AllocateData( r, n, (firstChannel == 0 && n >= ColorSpace::NumberOfNominalChannels( image.ColorSpace() )) ? + image.ColorSpace() : ColorSpace::Gray ); + + if ( !IsShared() ) // ### cannot modify a shared image's RGBWS + m_RGBWS = image.RGBWorkingSpace(); + + ResetSelections(); + + if ( r == image.Bounds() ) + for ( int c = 0; firstChannel <= lastChannel; ++c, ++firstChannel ) + P::Copy( m_channelData( c ), image[firstChannel], NumberOfPixels() ); + else + for ( int c = 0; firstChannel <= lastChannel; ++c, ++firstChannel ) + { + sample* f = m_channelData( c ); + const typename P1::sample* g = image.PixelAddress( r.LeftTop(), firstChannel ); + for ( int y = 0; y < m_height; ++y, f += m_width, g += image.Width() ) + P::Copy( f, g, m_width ); + } + + return *this; + } + + GenericImage& Assign( const GenericImage& image, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + m_status = image.Status(); + + Rect r = rect; + if ( !image.ParseSelection( r, firstChannel, lastChannel ) ) + { + FreeData(); + return *this; + } + +#define completeSelection (firstChannel == 0 && lastChannel == image.m_numberOfChannels-1 && r == image.Bounds()) + + if ( m_data == image.m_data ) + { + // Self-assignment + if ( !completeSelection ) + { + GenericImage result( image, r, firstChannel, lastChannel ); // ### implicit recursion + result.m_data->Attach( this ); + DetachFromData(); + m_data = result.m_data; + } + ResetSelections(); + return *this; + } + + if ( !IsShared() ) + if ( !image.IsShared() ) + if ( completeSelection ) + { + image.m_data->Attach( this ); + DetachFromData(); + m_data = image.m_data; + ResetSelections(); + return *this; + } + +#undef completeSelection + + int n = 1 + lastChannel - firstChannel; + AllocateData( r, n, (firstChannel == 0 && n >= ColorSpace::NumberOfNominalChannels( image.ColorSpace() )) ? + image.ColorSpace() : ColorSpace::Gray ); + + if ( !IsShared() ) // ### cannot modify a shared image's RGBWS + m_RGBWS = image.m_RGBWS; + + ResetSelections(); + + if ( r == image.Bounds() ) + for ( int c = 0; firstChannel <= lastChannel; ++c, ++firstChannel ) + P::Copy( m_channelData( c ), image[firstChannel], NumberOfPixels() ); + else + for ( int c = 0; firstChannel <= lastChannel; ++c, ++firstChannel ) + { + sample* f = m_channelData( c ); + const sample* g = image.PixelAddress( r.LeftTop(), firstChannel ); + for ( int y = 0; y < m_height; ++y, f += m_width, g += image.m_width ) + P::Copy( f, g, m_width ); + } + + return *this; + } + + /*! + * Copies pixel samples from the specified source \a image to this image. + * Returns a reference to this image. + * + * This operator is a convenience synonym for Assign(). + */ + template + GenericImage& operator =( const GenericImage& image ) + { + return Assign( image ); + } + + /*! + * Copy assignment operator. Copies pixel samples from the specified source + * \a image to this image. Returns a reference to this image. + * + * This operator is a synonym for Assign(), where both this object and the + * source \a image are instances of the same template instantiation of + * %GenericImage. The declaration of this operator is necessary for + * optimization purposes. It also provides a pure copy assignment operator + * for the %GenericImage template class. + */ + GenericImage& operator =( const GenericImage& image ) + { + return Assign( image ); + } + +#define TRANSFER_BODY() \ + if ( m_data != image.m_data ) \ + { \ + DetachFromData(); \ + m_data = image.m_data; \ + (void)AbstractImage::operator =( image ); \ + image.m_data = nullptr; \ + } \ + return *this + + /*! + * Transfers data from another \a image to this object. Returns a reference + * to this image. + * + * Decrements the reference counter of the current image data, and destroys + * it if it becomes unreferenced. + * + * Transfers the source image to this object, leaving empty and invalid the + * source \a image, which cannot be used and must be destroyed immediately + * after calling this function. + */ + GenericImage& Transfer( GenericImage& image ) + { + TRANSFER_BODY(); + } + + /*! + * Transfers data from another \a image to this object. Returns a reference + * to this image. + * + * Decrements the reference counter of the current image data, and destroys + * it if it becomes unreferenced. + * + * Transfers the source image to this object, leaving empty and invalid the + * source \a image, which cannot be used and must be destroyed immediately + * after calling this function. + */ + GenericImage& Transfer( GenericImage&& image ) + { + TRANSFER_BODY(); + } + +#undef TRANSFER_BODY + + /*! + * Move assignment operator. Returns a reference to this image. + * + * This operator is equivalent to Transfer( GenericImage& ). + */ + GenericImage& operator =( GenericImage&& image ) + { + return Transfer( image ); + } + + /*! + * Fills the current selection (selection rectangle and channel range) with + * a \a scalar. Returns a reference to this image. + * + * This operator is a convenience synonym for Fill(). + */ + GenericImage& operator =( sample scalar ) + { + return Fill( scalar ); + } + + /*! + * Exchanges two images \a x1 and \a x2 of the same template instantiation. + */ + friend void Swap( GenericImage& x1, GenericImage& x2 ) noexcept + { + x1.AbstractImage::Swap( x2 ); + pcl::Swap( x1.m_data, x2.m_data ); + } + + // ------------------------------------------------------------------------- + +#ifndef __PCL_NO_VECTOR_IMAGE_CONVERSION + + /*! + * Generates a vector of pixel samples from a row of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * The number of components in the returned vector will be equal to the + * width in pixels of this image. + * + * If this image is empty, if the specified vertical coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * returns an empty vector. + */ + sample_vector RowVector( int y, int channel = -1 ) const + { + if ( channel < 0 ) + channel = m_channel; + if ( y < 0 || y >= m_height || channel < 0 || channel >= m_numberOfChannels ) + return sample_vector(); + sample_vector row( m_width ); + P::Get( row.Begin(), ScanLine( y, channel ), m_width ); + return row; + } + + /*! + * Generates a vector of pixel samples from a column of this image. + * + * \param x Horizontal coordinate (or column index) of the desired + * column, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * The number of components in the returned vector will be equal to the + * height in pixels of this image. + * + * If this image is empty, if the specified horizontal coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * returns an empty vector. + */ + sample_vector ColumnVector( int x, int channel = -1 ) const + { + if ( channel < 0 ) + channel = m_channel; + if ( x < 0 || x >= m_width || channel < 0 || channel >= m_numberOfChannels ) + return sample_vector(); + sample_vector col( m_height ); + const sample* v = PixelAddress( x, 0, channel ); + for ( int y = 0; y < m_height; ++y, v += m_width ) + col[y] = *v; + return col; + } + + /*! + * A convenience synonym for ColumnVector( int, int ) const. + */ + sample_vector ColVector( int x, int channel = 0 ) const + { + return ColumnVector( x, channel ); + } + +#endif // !__PCL_NO_VECTOR_IMAGE_CONVERSION + + /*! + * Stores a duplicate of a row of pixel samples in the specified array, + * with implicit data type conversion. + * + * \param[out] buffer Starting address of a contiguous block where samples + * from the source row will be converted and copied. The + * length of this block must be at least equal to the + * width in pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * If this image is empty, if the specified vertical coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * does nothing. + */ + template + void GetRow( T* buffer, int y, int channel = -1 ) const + { + PCL_PRECONDITION( buffer != 0 ) + if ( channel < 0 ) + channel = m_channel; + if ( y >= 0 && y < m_height && channel >= 0 && channel < m_numberOfChannels ) + P::Get( buffer, ScanLine( y, channel ), m_width ); + } + + /*! + * Stores a duplicate of a column of pixel samples in the specified array, + * with implicit data type conversion. + * + * \param[out] buffer Starting address of a contiguous block where samples + * from the source column will be converted and copied. + * The length of this block must be at least equal to the + * height in pixels of this image. + * + * \param x Horizontal coordinate (or column index) of the desired + * column, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * If this image is empty, if the specified horizontal coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * does nothing. + */ + template + void GetColumn( T* buffer, int x, int channel = -1 ) const + { + PCL_PRECONDITION( buffer != 0 ) + if ( channel < 0 ) + channel = m_channel; + if ( x >= 0 && x < m_width && channel >= 0 && channel < m_numberOfChannels ) + { + const sample* v = PixelAddress( x, 0, channel ); + for ( int y = 0; y < m_height; ++y, ++buffer, v += m_width ) + P::FromSample( *buffer, *v ); + } + } + + /*! + * Sets a row of pixel samples from values in the specified array, with + * implicit data type conversion. Returns a reference to this image. + * + * \param buffer Starting address of a contiguous block with source + * values that will be converted and copied to the target + * row in this image. The length of this block must be at + * least equal to the width in pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * If this image is empty, if the specified vertical coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * does nothing. + */ + template + GenericImage& SetRow( const T* buffer, int y, int channel = -1 ) + { + PCL_PRECONDITION( buffer != 0 ) + if ( channel < 0 ) + channel = m_channel; + if ( y >= 0 && y < m_height && channel >= 0 && channel < m_numberOfChannels ) + P::Copy( ScanLine( y, channel ), buffer, m_width ); + return *this; + } + + /*! + * Sets a column of pixel samples from values in the specified array, with + * implicit data type conversion. Returns a reference to this image. + * + * \param buffer Starting address of a contiguous block with source + * values that will be converted and copied to the target + * column in this image. The length of this block must be + * at least equal to the height in pixels of this image. + * + * \param x Horizontal coordinate (or column index) of the desired + * column, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param channel Channel index. If this parameter is negative, the + * currently selected channel will be used. The default + * value is -1. + * + * If this image is empty, if the specified horizontal coordinate is out of + * range, or if a nonexistent channel is specified, this member function + * does nothing. + */ + template + GenericImage& SetColumn( const T* buffer, int x, int channel = -1 ) + { + PCL_PRECONDITION( buffer != 0 ) + if ( channel < 0 ) + channel = m_channel; + if ( x >= 0 && x < m_width && channel >= 0 && channel < m_numberOfChannels ) + { + sample* v = PixelAddress( x, 0, channel ); + for ( int y = 0; y < m_height; ++y, ++buffer, v += m_width ) + *v = P::ToSample( *buffer ); + } + return *this; + } + + // ------------------------------------------------------------------------- + + /*! + * Creates \a n new alpha channels in this image. Alpha channels are those + * in excess of nominal channels, e.g. a fourth channel in an RGB color + * image, or a second channel in a grayscale image. Returns a reference to + * this image. + * + * Newly created channels are not initialized, so their pixel samples will + * contain unpredictable values. + */ + GenericImage& CreateAlphaChannels( int n ) + { + if ( n > 0 && m_numberOfChannels > 0 ) + { + EnsureUnique(); + sample** oldData = m_pixelData; + sample** newData = nullptr; + try + { + newData = m_allocator.AllocateChannelSlots( m_numberOfChannels+n ); + for ( int i = 0; i < m_numberOfChannels; ++i ) + newData[i] = oldData[i]; + for ( int i = 0; i < n; ++i ) + newData[m_numberOfChannels+i] = m_allocator.AllocatePixels( m_width, m_height ); + } + catch ( ... ) + { + if ( newData != nullptr ) + { + for ( int i = 0; i < n; ++i ) + if ( newData[m_numberOfChannels+i] != nullptr ) + m_allocator.Deallocate( newData[m_numberOfChannels+i] ); + m_allocator.Deallocate( newData ); + } + throw; + } + + m_allocator.SetSharedData( m_pixelData = newData ); + m_allocator.SetSharedGeometry( m_width, m_height, m_numberOfChannels += n ); + m_allocator.Deallocate( oldData ); + } + + return *this; + } + + /*! + * Forces this image to acquire the specified pixel sample data as a new + * alpha channel. Returns a reference to this image. + * + * \param data Starting address of the acquired pixel data. If this + * parameter is a null pointer, a single new alpha channel + * will be added to the image. + * + * The image will own the acquired pixel \a data. The new alpha channel is + * appended to the existing channels. + * + * \warning See the ImportData() member function documentation for an + * important warning notice that applies also to this function. + */ + GenericImage& AddAlphaChannel( sample* data = nullptr ) + { + // $$$ WARNING $$$ + // * If this is a shared image, data must either be null or point to a + // shared memory block. + // * If this is a local image, data must either be null or point to a + // block allocated in the local heap. + + if ( data == nullptr ) + CreateAlphaChannels( 1 ); + else if ( m_numberOfChannels > 0 ) + { + EnsureUnique(); + sample** oldData = m_pixelData; + sample** newData = nullptr; + try + { + newData = m_allocator.AllocateChannelSlots( m_numberOfChannels+1 ); + for ( int i = 0; i < m_numberOfChannels; ++i ) + newData[i] = oldData[i]; + newData[m_numberOfChannels] = data; + } + catch ( ... ) + { + if ( newData != nullptr ) + m_allocator.Deallocate( newData ); + throw; + } + + m_allocator.SetSharedData( m_pixelData = newData ); + m_allocator.SetSharedGeometry( m_width, m_height, ++m_numberOfChannels ); + m_allocator.Deallocate( oldData ); + } + + return *this; + } + + /*! + * Releases an alpha channel into another image. Returns a reference to this + * image. + * + * \param image Image that will receive the data from the released alpha + * channel. Its previous contents will be dereferenced and + * eventually destroyed. + * + * \param channel Zero-based index of the alpha channel to be released, + * 0 ≤ \a channel < \a n, where \a n is the number of + * existing alpha channels before calling this function. + * + * \note The specified \a channel index is an alpha channel index, + * not a normal channel index comprising nominal channels. That is, the + * first alpha channel is indexed as zero by this function. + * + * \warning If this image is a shared instance, then the specified target + * \a image must also be a reference to a shared image. Correspondingly, if + * this is a local image, the target \a image must also be local. Pixel data + * blocks cannot be transferred between local and shared images. If this + * rule is violated, this member function will throw an Error exception. + */ + GenericImage& ReleaseAlphaChannel( GenericImage& image, int channel ) + { + if ( IsShared() != image.IsShared() ) + throw Error( "GenericImage::ReleaseAlphaChannel(): Cannot release pixel data between local and shared images" ); + + if ( channel < 0 || channel >= NumberOfAlphaChannels() ) + { + image.FreeData(); + return *this; + } + + int c = NumberOfNominalChannels() + channel; + + sample** newData = nullptr; + try + { + newData = image.m_allocator.AllocateChannelSlots( 1 ); + *newData = m_pixelData[c]; + } + catch ( ... ) + { + if ( newData != nullptr ) + image.m_allocator.Deallocate( newData ); + throw; + } + + image.FreeData(); + + image.m_pixelData = newData; + image.m_width = m_width; + image.m_height = m_height; + image.m_numberOfChannels = 1; + image.m_colorSpace = ColorSpace::Gray; + image.m_data->UpdateSharedImage(); + image.ResetSelections(); + + m_pixelData[c] = nullptr; + ForgetAlphaChannel( channel ); + + return *this; + } + + /*! + * Destroys an alpha channel. Returns a reference to this image. + * + * \param channel Zero-based index of the alpha channel to be destroyed, + * 0 ≤ \a c < \a n, where \a n is the number of existing + * alpha channels before calling this function. + * + * \note The specified \a channel index is an alpha channel index, + * not a normal channel index comprising nominal channels. That is, the + * first alpha channel is indexed as zero by this function. + */ + GenericImage& DeleteAlphaChannel( int channel ) + { + if ( channel >= 0 && channel < NumberOfAlphaChannels() ) + { + EnsureUnique(); + int c = NumberOfNominalChannels() + channel; + m_allocator.Deallocate( m_pixelData[c] ); + m_pixelData[c] = nullptr; + ForgetAlphaChannel( channel ); + } + + return *this; + } + + /*! + * Forces this image to discard an existing alpha channel without + * deallocating it. Returns a reference to this image. + * + * \param channel Zero-based index of the alpha channel to be forgotten, + * 0 ≤ \a c < \a n, where \a n is the number of existing + * alpha channels before calling this function. + * + * \warning You should have gained control over the pixel data corresponding + * to the forgotten \a channel before calling this function, in order to be + * able to deallocate it when appropriate, or you'll induce a memory leak. + * + * \note The specified \a channel index is an alpha channel index, + * not a normal channel index comprising nominal channels. That is, the + * first alpha channel is indexed as zero by this function. + */ + GenericImage& ForgetAlphaChannel( int channel ) + { + if ( channel >= 0 && channel < NumberOfAlphaChannels() ) + { + EnsureUnique(); + sample** oldData = m_pixelData; + sample** newData = m_allocator.AllocateChannelSlots( m_numberOfChannels-1 ); + + int n0 = NumberOfNominalChannels(); + int c = n0 + channel; + + for ( int i = 0; i < c; ++i ) + newData[i] = oldData[i]; + for ( int i = c, j = c; ++j < m_numberOfChannels; ++i ) + newData[i] = oldData[j]; + + m_allocator.SetSharedData( m_pixelData = newData ); + m_allocator.SetSharedGeometry( m_width, m_height, --m_numberOfChannels ); + + if ( m_channel >= n0 || m_lastChannel >= n0 ) + ResetChannelRange(); + + m_allocator.Deallocate( oldData ); + } + + return *this; + } + + /*! + * Destroys all existing alpha channels in this image. Returns a reference + * to this image. + */ + GenericImage& DeleteAlphaChannels() + { + int n0 = NumberOfNominalChannels(); + int n = m_numberOfChannels; + if ( n > n0 ) + { + EnsureUnique(); + do + m_allocator.Deallocate( m_pixelData[--n] ), m_pixelData[n] = nullptr; + while ( n > n0 ); + ForgetAlphaChannels(); + } + + return *this; + } + + /*! + * Forces this image to discard all existing alpha channels without + * deallocating them. Returns a reference to this image. + * + * \warning You should have gained control over the pixel data for all alpha + * channels in this image before calling this function, in order to be able + * to deallocate them when appropriate, or you'll induce a memory leak. + */ + GenericImage& ForgetAlphaChannels() + { + int n0 = NumberOfNominalChannels(); + if ( m_numberOfChannels > n0 ) + { + EnsureUnique(); + sample** oldData = m_pixelData; + sample** newData = m_allocator.AllocateChannelSlots( n0 ); + + for ( int i = 0; i < n0; ++i ) + newData[i] = oldData[i]; + + m_allocator.SetSharedData( m_pixelData = newData ); + m_allocator.SetSharedGeometry( m_width, m_height, m_numberOfChannels = n0 ); + + if ( m_channel >= n0 || m_lastChannel >= n0 ) + ResetChannelRange(); + + m_allocator.Deallocate( oldData ); + } + + return *this; + } + + // ------------------------------------------------------------------------- + + /*! + * Fills a subset of pixel samples of this image with the specified + * \a scalar. Returns a reference to this image. + * + * \param scalar Scalar value to fill with. The specified value will be + * converted to the sample data type of this image. + * + * \param rect Target rectangular region. If this parameter defines an + * empty rectangle, the current rectangular selection will be + * used. If the specified rectangle is not empty and extends + * beyond image boundaries, only the intersection with this + * image will be used. If that intersection does not exist, + * then this member function has no effect. The default value + * is an empty rectangle. + * + * \param firstChannel Zero-based index of the first channel to fill. If a + * negative index is specified, the first selected channel + * will be used. If the specified index is larger than or + * equal to the number of channels in this image, then this + * member function has no effect. The default value is -1. + * + * \param lastChannel Zero-based index of the last channel to fill. If a + * negative index is specified, the last selected channel + * will be used. If the specified index is larger than or + * equal to the number of channels in this image, then this + * member function has no effect. The default value is -1. + * + * Previously referenced data in this image will be dereferenced, and + * immediately destroyed if they become unreferenced. + * + * If this member function causes a reallocation of pixel data, the newly + * allocated data will be local and uniquely referenced by this image. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Fill( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Filling image", N*(1 + lastChannel - firstChannel) ); + + sample v = P::ToSample( scalar ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + P::Fill( m_pixelData[i], v, N ); + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, v, w ); + } + + return *this; + } + + /*! + * Fills a subset of pixel samples of this image with the scalar components + * of a vector of per-channel filling \a values. Returns a reference to this + * image. + * + * \param values %Vector of filling values. Each component of this vector + * is a filling value for the corresponding channel in the + * pixel sample selection (i.e., the first component is the + * filling value for the first selected channel, the second + * component for the second selected channel, etc.). If the + * vector has less components than channels in the selection, + * the missing values are replaced with the minimum sample + * value in the native range of the image (usually zero). + * + * The rest of parameters of this function are identical to those of + * Fill( T, const Rect&, int, int ). + */ + template + GenericImage& Fill( const GenericVector& values, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Filling image", N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() ) + for ( int i = firstChannel, c = 0; i <= lastChannel; ++i, ++c, m_status += N ) + { + sample v = (c < values.Length()) ? P::ToSample( values[c] ) : P::MinSampleValue(); + P::Fill( m_pixelData[i], v, N ); + } + else + for ( int i = firstChannel, c = 0, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, ++c, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + sample v = (c < values.Length()) ? P::ToSample( values[c] ) : P::MinSampleValue(); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, v, w ); + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * filled with the specified \a scalar. + * + * For information on the parameters of this member function, see the + * documentation for Fill( T, const Rect&, int, int ). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Filled( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Fill( scalar ); + return result; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * filled with the scalar components of a vector of per-channel filling + * \a values. + * + * For information on the parameters of this member function, see the + * documentation for Fill( const GenericVector&, const Rect&, int, int ). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Filled( const GenericVector& values, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Fill( values ); + return result; + } + + /*! + * Fills a subset of pixel samples with the constant value resulting from + * converting the floating point scalar zero (0.0) to the sample data type + * of the image. Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Fill( P::ToSample( 0.0 ), rect, firstChannel, lastChannel ); + * \endcode + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Zero( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Fill( P::ToSample( 0.0 ), rect, firstChannel, lastChannel ); + } + + /*! + * Fills a subset of pixel samples with the constant value resulting from + * converting the floating point scalar one (1.0) to the sample data type of + * the image. Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Fill( P::ToSample( 1.0 ), rect, firstChannel, lastChannel ); + * \endcode + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& One( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Fill( P::ToSample( 1.0 ), rect, firstChannel, lastChannel ); + } + + /*! + * Fills a subset of pixel samples with the minimum sample value in the + * native range of the image. Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Fill( P::MinSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Black( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Fill( P::MinSampleValue(), rect, firstChannel, lastChannel ); + } + + /*! + * Fills a subset of pixel samples with the maximum sample value in the + * native range of the image. Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Fill( P::MaxSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& White( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Fill( P::MaxSampleValue(), rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Inverts a subset of pixel samples with respect to the specified + * \a scalar. Returns a reference to this image. + * + * The inverse of a pixel sample \a v with respect to a scalar \a r is equal + * to \a r - \a v. Normally (but not necessarily) the reference scalar used + * is the maximum sample value in the native range of the image. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Invert( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Inverting pixel samples", N*(1 + lastChannel - firstChannel) ); + + sample v = P::ToSample( scalar ); + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = v - *f; + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = v - *f; + } + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * inverted with respect to the specified \a scalar. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Inverted( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Invert( scalar ); + return result; + } + + /*! + * Inverts a subset of pixel samples with respect to the maximum sample + * value in the native range of the image. Returns a reference to this + * image. + * + * This member function is a convenience shortcut for: + * + * \code + * Invert( P::MaxSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Invert( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Invert( P::MaxSampleValue(), rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * inverted with respect to the maximum sample value in the native range of + * the image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage Inverted( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Invert(); + return result; + } + + /*! + * Returns an inverted duplicate of this image. The inversion operation is + * performed on the current pixel sample selection with respect to the + * maximum sample value in the native range of the image. + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage operator ~() const + { + GenericImage result( *this ); + (void)result.Invert(); + return result; + } + + /*! + * Replaces a subset of pixel samples with their bitwise logical NOT values. + * Returns a reference to this image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Not( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Bitwise Not", N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + P::Not( *f ); + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + P::Not( *f ); + } + } + + return *this; + } + + /*! + * Truncates a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * \param lowerBound Lower bound of the truncation range. + * \param upperBound Upper bound of the truncation range. + * + * The specified truncation bounds are converted to the sample data type of + * this image, using pixel traits primitives. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Truncate( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Truncating pixel samples", N*(1 + lastChannel - firstChannel) ); + + sample b0 = P::ToSample( lowerBound ); + sample b1 = P::ToSample( upperBound ); + if ( b1 < b0 ) + pcl::Swap( b0, b1 ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + if ( *f < b0 ) + *f = b0; + else if ( b1 < *f ) + *f = b1; + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( *f < b0 ) + *f = b0; + else if ( b1 < *f ) + *f = b1; + } + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * truncated to the specified range of values. + * + * \param lowerBound Lower bound of the truncation range. + * \param upperBound Upper bound of the truncation range. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Truncated( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Truncate( lowerBound, upperBound ); + return result; + } + + /*! + * Truncates a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Truncate( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * Note that this function only makes sense for floating point real or + * complex images, where pixel samples can take arbitrary values. Integer + * pixel samples are constrained to their native range by nature, so calling + * this function for integer images has no effect. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Truncate( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Truncate( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * truncated to the native range of the image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage Truncated( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Truncate(); + return result; + } + + /*! + * Rescales a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * \param lowerBound Lower bound of the rescaling range. + * \param upperBound Upper bound of the rescaling range. + * + * The specified rescaling bounds are converted to the sample data type of + * this image, using pixel traits primitives. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The rescaling operation is as follows. Given the following two ranges: + * + * \li \c m, \c M : The range of existing sample values in the selected set of + * pixel samples, + * \li \c r0, \c r1 : The rescaling range, + * + * the rescaled value \c r for a given sample \c s is: + * + *

+    * r = r0 + (s - m)*(r1 - r0)/(M - m)
+    * 
+ * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Rescale( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + size_type Ns = N*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Rescaling pixel samples", Ns ); + + sample b0 = P::ToSample( lowerBound ); + sample b1 = P::ToSample( upperBound ); + if ( b1 < b0 ) + pcl::Swap( b0, b1 ); + + sample v0, v1; + GetExtremePixelValues( v0, v1, r, firstChannel, lastChannel ); + if ( v0 == b0 && v1 == b1 ) + { + m_status += Ns; + return *this; + } + + EnsureUnique(); + + double d = 0; + if ( b0 != b1 ) + if ( v0 != v1 ) + d = (double( b1 ) - double( b0 ))/(double( v1 ) - double( v0 )); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + + if ( v0 != v1 ) + { + if ( b0 != b1 ) + { + if ( b0 == sample( 0 ) ) + { + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = P::FloatToSample( d*(*f - v0) ); + } + else + { + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = P::FloatToSample( d*(*f - v0) + b0 ); + } + } + else + P::Fill( f, b0, N ); + } + else + P::Fill( f, pcl::Range( v0, b0, b1 ), N ); + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + + if ( v0 != v1 ) + { + if ( b0 != b1 ) + { + if ( b0 == sample( 0 ) ) + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = P::FloatToSample( d*(*f - v0) ); + } + } + else + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = P::FloatToSample( d*(*f - v0) + b0 ); + } + } + } + else + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, b0, w ); + } + } + else + { + sample v = pcl::Range( v0, b0, b1 ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, v, w ); + } + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * rescaled to the specified range of values. + * + * \param lowerBound Lower bound of the rescaling range. + * \param upperBound Upper bound of the rescaling range. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Rescaled( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Rescale( lowerBound, upperBound ); + return result; + } + + /*! + * Rescales a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Rescale( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Rescale( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Rescale( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * rescaled to the native range of the image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage Rescaled( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Rescale(); + return result; + } + + /*! + * Normalizes a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * \param lowerBound Lower bound of the normalizing range. + * \param upperBound Upper bound of the normalizing range. + * + * The specified normalizing bounds are converted to the sample data type of + * this image, using pixel traits primitives. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * Normalization is a conditional rescaling operation: Pixel sample values + * are rescaled to the specified normalizing range only if the existing + * extreme sample values exceed that range. Given the following two ranges: + * + * \li \c m, \c M : The range of existing sample values in the selected set of + * pixel samples, + * \li \c n0, \c n1 : The normalizing range, + * + * the normalized value \c n for a given sample \c s is: + * + *
+    * if m < n0 or M > n1
+    *    n = n0 + (s - m)*(n1 - n0)/(M - m)
+    * else
+    *    n = s
+    * endif
+    * 
+ * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Normalize( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + size_type Ns = N*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Normalizing pixel samples", Ns ); + + sample b0 = P::ToSample( lowerBound ); + sample b1 = P::ToSample( upperBound ); + if ( b1 < b0 ) + pcl::Swap( b0, b1 ); + + sample v0, v1; + GetExtremePixelValues( v0, v1, r, firstChannel, lastChannel ); + + if ( v0 >= b0 && v1 <= b1 ) + { + m_status += Ns; + return *this; + } + + EnsureUnique(); + + double d = 0; + if ( b0 != b1 ) + if ( v0 != v1 ) + d = (double( b1 ) - double( b0 ))/(double( v1 ) - double( v0 )); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + + if ( v0 != v1 ) + { + if ( b0 != b1 ) + { + if ( b0 == sample( 0 ) ) + { + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = P::FloatToSample( d*(*f - v0) ); + } + else + { + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = P::FloatToSample( d*(*f - v0) + b0 ); + } + } + else + P::Fill( f, b0, N ); + } + else + P::Fill( f, pcl::Range( v0, b0, b1 ), N ); + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + + if ( v0 != v1 ) + { + if ( b0 != b1 ) + { + if ( b0 == sample( 0 ) ) + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = P::FloatToSample( d*(*f - v0) ); + } + } + else + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = P::FloatToSample( d*(*f - v0) + b0 ); + } + } + } + else + { + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, b0, w ); + } + } + else + { + sample v = pcl::Range( v0, b0, b1 ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width ) + P::Fill( f, v, w ); + } + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * normalized to the specified range of values. + * + * \param lowerBound Lower bound of the normalizing range. + * \param upperBound Upper bound of the normalizing range. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Normalized( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Normalize( lowerBound, upperBound ); + return result; + } + + /*! + * Normalizes a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Normalize( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + * \endcode + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Normalize( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Normalize( P::MinSampleValue(), P::MaxSampleValue(), rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * normalized to the native range of the image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage Normalized( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Normalize(); + return result; + } + + /*! + * Binarizes a subset of pixel samples with respect to the specified + * \a threshold value. Returns a reference to this image. + * + * \param threshold Binarizing threshold. + * + * The specified binarizing threshold is converted to the sample data type + * of this image, using pixel traits primitives. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The binarized value \c b of a sample \c s is given by: + * + *
+    * if s < t
+    *    b = 0
+    * else
+    *    b = 1
+    * endif
+    * 
+ * + * where \c t is the binarizing threshold value, and 0 and 1 represent, + * respectively, the minimum and maximum pixel sample values in the native + * range of the image. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Binarize( T threshold, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Binarizing pixel samples", N*(1 + lastChannel - firstChannel) ); + + sample t = P::ToSample( threshold ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = (*f < t) ? P::MinSampleValue() : P::MaxSampleValue(); + } + else + for ( int c = firstChannel, w = r.Width(), h = r.Height(); c <= lastChannel; ++c, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), c ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = (*f < t) ? P::MinSampleValue() : P::MaxSampleValue(); + } + } + + return *this; + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * binarized with respect to the specified \a threshold value. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Binarized( T threshold, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Binarize( threshold ); + return result; + } + + /*! + * Binarizes a subset of pixel samples with respect to the central value of + * the native range of the image. Returns a reference to this image. + * + * This member function is a convenience shortcut for: + * + * \code + * Binarize( (P::MinSampleValue() + P::MaxSampleValue())/2, rect, firstChannel, lastChannel ); + * \endcode + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& Binarize( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Binarize( (P::MinSampleValue() + P::MaxSampleValue())/2, rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * binarized with respect to the central value of the native range of the + * image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage Binarized( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Binarize(); + return result; + } + + /*! + * Replaces a subset of pixel samples with their absolute values. Returns a + * reference to this image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Note that this member function is a no-op for unsigned integer + * images (e.g., UInt8Image, UInt16Image and UInt32Image). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + GenericImage& SetAbsoluteValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing absolute value", N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + PCL_IVDEP + for ( size_type j = 0; j < N; ++j, ++f ) + *f = pcl::Abs( *f ); + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); + PCL_IVDEP + for ( int j = 0; j < h; ++j, f += m_width-w ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + *f = pcl::Abs( *f ); + } + } + + return *this; + } + + /*! + * A synonym for SetAbsoluteValue(). + */ + GenericImage& Abs( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteValue( rect, firstChannel, lastChannel ); + } + + /*! + * Returns a local image with a subset of pixel samples from this image, + * replaced with their absolute values. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + GenericImage AbsoluteValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.SetAbsoluteValue(); + return result; + } + + // ------------------------------------------------------------------------- + + /* + * Implementation of Apply( scalar ) member functions. We have to have a + * separate implementation function to prevent infinite recursion in several + * template specializations of the Apply() member function. + */ + template + GenericImage& ApplyScalar( T scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( op == ImageOp::Div ) + if ( 1 + scalar == 1 ) + throw Error( "Division by zero or insignificant scalar" ); + + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Applying scalar: " + + ImageOp::Id( op ) + + ' ' + String( scalar ), N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() ) + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; +#define ITERATE( Op ) \ + PCL_IVDEP \ + for ( size_type j = 0; j < N; ++j, ++f ) \ + P::Op( *f, scalar ) + switch ( op ) + { + case ImageOp::Mov: ITERATE( Mov ); break; + case ImageOp::Add: ITERATE( Add ); break; + case ImageOp::Sub: ITERATE( Sub ); break; + case ImageOp::Mul: ITERATE( Mul ); break; + case ImageOp::Div: ITERATE( Div ); break; + case ImageOp::Pow: ITERATE( Pow ); break; + case ImageOp::Dif: ITERATE( Dif ); break; + case ImageOp::Min: ITERATE( Min ); break; + case ImageOp::Max: ITERATE( Max ); break; + case ImageOp::Not: ITERATE( Not ); break; + case ImageOp::Or: ITERATE( Or ); break; + case ImageOp::Nor: ITERATE( Nor ); break; + case ImageOp::And: ITERATE( And ); break; + case ImageOp::Nand: ITERATE( Nand ); break; + case ImageOp::Xor: ITERATE( Xor ); break; + case ImageOp::Xnor: ITERATE( Xnor ); break; + case ImageOp::ColorBurn: ITERATE( ColorBurn ); break; + case ImageOp::LinearBurn: ITERATE( LinearBurn ); break; + case ImageOp::Screen: ITERATE( Screen ); break; + case ImageOp::ColorDodge: ITERATE( ColorDodge ); break; + case ImageOp::Overlay: ITERATE( Overlay ); break; + case ImageOp::SoftLight: ITERATE( SoftLight ); break; + case ImageOp::HardLight: ITERATE( HardLight ); break; + case ImageOp::VividLight: ITERATE( VividLight ); break; + case ImageOp::LinearLight: ITERATE( LinearLight ); break; + case ImageOp::PinLight: ITERATE( PinLight ); break; + case ImageOp::Exclusion: ITERATE( Exclusion ); break; + default: break; + } +#undef ITERATE + } + else + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i, m_status += N ) + { + sample* __restrict__ f = PixelAddress( r.LeftTop(), i ); +#define ITERATE( Op ) \ + PCL_IVDEP \ + for ( int j = 0; j < h; ++j, f += m_width-w ) \ + { \ + PCL_IVDEP \ + for ( int k = 0; k < w; ++k, ++f ) \ + P::Op( *f, scalar ); \ + } + switch ( op ) + { + case ImageOp::Mov: ITERATE( Mov ); break; + case ImageOp::Add: ITERATE( Add ); break; + case ImageOp::Sub: ITERATE( Sub ); break; + case ImageOp::Mul: ITERATE( Mul ); break; + case ImageOp::Div: ITERATE( Div ); break; + case ImageOp::Pow: ITERATE( Pow ); break; + case ImageOp::Dif: ITERATE( Dif ); break; + case ImageOp::Min: ITERATE( Min ); break; + case ImageOp::Max: ITERATE( Max ); break; + case ImageOp::Not: ITERATE( Not ); break; + case ImageOp::Or: ITERATE( Or ); break; + case ImageOp::Nor: ITERATE( Nor ); break; + case ImageOp::And: ITERATE( And ); break; + case ImageOp::Nand: ITERATE( Nand ); break; + case ImageOp::Xor: ITERATE( Xor ); break; + case ImageOp::Xnor: ITERATE( Xnor ); break; + case ImageOp::ColorBurn: ITERATE( ColorBurn ); break; + case ImageOp::LinearBurn: ITERATE( LinearBurn ); break; + case ImageOp::Screen: ITERATE( Screen ); break; + case ImageOp::ColorDodge: ITERATE( ColorDodge ); break; + case ImageOp::Overlay: ITERATE( Overlay ); break; + case ImageOp::SoftLight: ITERATE( SoftLight ); break; + case ImageOp::HardLight: ITERATE( HardLight ); break; + case ImageOp::VividLight: ITERATE( VividLight ); break; + case ImageOp::LinearLight: ITERATE( LinearLight ); break; + case ImageOp::PinLight: ITERATE( PinLight ); break; + case ImageOp::Exclusion: ITERATE( Exclusion ); break; + default: break; + } +#undef ITERATE + } + + return *this; + } + + /*! + * Replaces a subset of pixel samples with the result of an arithmetic, + * bitwise logical or pixel composition operation with a scalar. Returns a + * reference to this image. + * + * \param scalar Right-hand operand value. + * + * \param op Identifies an arithmetic, bitwise logical or pixel + * composition operator. For a list of supported operators, + * see the ImageOp namespace. The default value is + * ImageOp::Mov (replace target with source). + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If the specified \a scalar is zero or insignificant, and the \a op + * argument is ImageOp::Div, this function throws an Error exception to + * prevent a division by zero. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + GenericImage& Apply( T scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return ApplyScalar( scalar, op, rect, firstChannel, lastChannel ); + } + + GenericImage& Apply( float scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( ImageOp::IsArithmeticOperator( op ) || ImageOp::IsPixelCompositionOperator( op ) ) + return ApplyScalar( scalar, op, rect, firstChannel, lastChannel ); + return ApplyScalar( P::ToSample( scalar ), op, rect, firstChannel, lastChannel ); + } + + GenericImage& Apply( double scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( ImageOp::IsArithmeticOperator( op ) || ImageOp::IsPixelCompositionOperator( op ) ) + return ApplyScalar( scalar, op, rect, firstChannel, lastChannel ); + return ApplyScalar( P::ToSample( scalar ), op, rect, firstChannel, lastChannel ); + } + + GenericImage& Apply( pcl::Complex scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( ImageOp::IsArithmeticOperator( op ) || ImageOp::IsPixelCompositionOperator( op ) ) + return ApplyScalar( scalar, op, rect, firstChannel, lastChannel ); + return ApplyScalar( P::ToSample( scalar ), op, rect, firstChannel, lastChannel ); + } + + GenericImage& Apply( pcl::Complex scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( ImageOp::IsArithmeticOperator( op ) || ImageOp::IsPixelCompositionOperator( op ) ) + return ApplyScalar( scalar, op, rect, firstChannel, lastChannel ); + return ApplyScalar( P::ToSample( scalar ), op, rect, firstChannel, lastChannel ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * performs an arithmetic or bitwise logical operation with a scalar. + * Returns the resulting image. + * + * \param scalar Right-hand operand value. + * + * \param op Identifies an arithmetic or bitwise logical operator. For + * a list of supported operators, see the ImageOp namespace. + * The default value is ImageOp::Mov (replace target with + * source). + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Applied( T scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Apply( scalar, op ); + return result; + } + + // ------------------------------------------------------------------------- + + /*! + * Performs an arithmetic or bitwise logical operation between a subset of + * pixel samples in this image and the corresponding samples of another + * operand \a image. Returns a reference to this image. + * + * \param image Right-hand operand image. + * + * \param op Identifies an arithmetic or bitwise logical operator. For + * a list of supported operators, see the ImageOp namespace. + * The default value is ImageOp::Mov (replace target with + * source). + * + * \param point Target point in image coordinates. This is the upper left + * corner of the target rectangular region where the source + * \a image will be applied to this image. If one or both + * point coordinates are equal to \c int_max (the maximum + * possible value of type \c int), then the current anchor + * point selection will be used. The default value is + * Point( int_max ). + * + * \param channel Target channel index (zero-based). This is the index of + * the first channel where source pixel samples will be + * applied. If this parameter is negative, then the currently + * selected channel will be used. The default value is -1. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The specified operation is performed with samples in the intersection + * between the specified (or implicit) rectangular selections for both + * images. Each channel in the specified channel range selection for this + * image is operated with its counterpart channel in the right-hand operand + * \a image, starting from the first selected channel in the right-hand + * operand \a image. + * + * The operation may involve conversions to the appropriate floating point + * data type for intermediate results, or LUT table lookups, as necessary + * to ensure preservation of the full native range of the image. Floating + * point conversions may take place even if both images share the same + * sample data type, depending on the selected operator. + * + * \note Increments the status monitoring object by the number of pixel + * samples in the intersection between both operand images. + */ + template + GenericImage& Apply( const GenericImage& image, image_op op = ImageOp::Mov, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !image.ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + if ( !ParseChannel( channel ) ) + return *this; + + Point p = point; + if ( p.x == int_max || p.y == int_max ) + p = m_point; + + if ( p.x < 0 ) + { + if ( (r.x0 -= p.x) >= r.x1 ) + return *this; + p.x = 0; + } + else if ( p.x >= m_width ) + return *this; + + if ( p.y < 0 ) + { + if ( (r.y0 -= p.y) >= r.y1 ) + return *this; + p.y = 0; + } + else if ( p.y >= m_height ) + return *this; + + r.ResizeTo( pcl::Min( m_width - p.x, r.Width() ), + pcl::Min( m_height - p.y, r.Height() ) ); + + lastChannel = pcl::Min( lastChannel, firstChannel + m_numberOfChannels - channel - 1 ); + + EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Applying image, op=" + ImageOp::Id( op ), N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() && r == image.Bounds() ) + for ( int i = channel, j = firstChannel; j <= lastChannel; ++i, ++j, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + const typename P1::sample* __restrict__ g = image[j]; + +#define ITERATE( Op ) \ + PCL_IVDEP \ + for ( size_type k = 0; k < N; ++k, ++f, ++g ) \ + P::Op( *f, *g ) + switch ( op ) + { + case ImageOp::Mov: + P::Copy( f, g, N ); + break; + case ImageOp::Min: + P::CopyMin( f, g, N ); + break; + case ImageOp::Max: + P::CopyMax( f, g, N ); + break; + default: + switch ( op ) + { + case ImageOp::Add: ITERATE( Add ); break; + case ImageOp::Sub: ITERATE( Sub ); break; + case ImageOp::Mul: ITERATE( Mul ); break; + case ImageOp::Div: + for ( size_type j = 0; j < N; ++j, ++f, ++g ) + if ( *g != 0 ) + P::Div( *f, *g ); + else + *f = P::MaxSampleValue(); + break; + case ImageOp::Pow: ITERATE( Pow ); break; + case ImageOp::Dif: ITERATE( Dif ); break; + case ImageOp::Not: ITERATE( Not ); break; + case ImageOp::Or: ITERATE( Or ); break; + case ImageOp::Nor: ITERATE( Nor ); break; + case ImageOp::And: ITERATE( And ); break; + case ImageOp::Nand: ITERATE( Nand ); break; + case ImageOp::Xor: ITERATE( Xor ); break; + case ImageOp::Xnor: ITERATE( Xnor ); break; + case ImageOp::ColorBurn: ITERATE( ColorBurn ); break; + case ImageOp::LinearBurn: ITERATE( LinearBurn ); break; + case ImageOp::Screen: ITERATE( Screen ); break; + case ImageOp::ColorDodge: ITERATE( ColorDodge ); break; + case ImageOp::Overlay: ITERATE( Overlay ); break; + case ImageOp::SoftLight: ITERATE( SoftLight ); break; + case ImageOp::HardLight: ITERATE( HardLight ); break; + case ImageOp::VividLight: ITERATE( VividLight ); break; + case ImageOp::LinearLight: ITERATE( LinearLight ); break; + case ImageOp::PinLight: ITERATE( PinLight ); break; + case ImageOp::Exclusion: ITERATE( Exclusion ); break; + default: break; + } +#undef ITERATE + break; + } + } + else + for ( int i = channel, j = firstChannel, w = r.Width(), h = r.Height(); j <= lastChannel; ++i, ++j, m_status += N ) + { + sample* __restrict__ f = PixelAddress( p, i ); + const typename P1::sample* __restrict__ g = image.PixelAddress( r.LeftTop(), j ); + +#define ITERATE( Op ) \ + PCL_IVDEP \ + for ( int k = 0; k < h; ++k, f += m_width-w, g += image.Width()-w ) \ + { \ + PCL_IVDEP \ + for ( int l = 0; l < w; ++l, ++f, ++g ) \ + P::Op( *f, *g ); \ + } + switch ( op ) + { + case ImageOp::Mov: + for ( int k = 0; k < h; ++k, f += m_width, g += image.Width() ) + P::Copy( f, g, w ); + break; + case ImageOp::Min: + for ( int k = 0; k < h; ++k, f += m_width, g += image.Width() ) + P::CopyMin( f, g, w ); + break; + case ImageOp::Max: + for ( int k = 0; k < h; ++k, f += m_width, g += image.Width() ) + P::CopyMax( f, g, w ); + break; + case ImageOp::Add: ITERATE( Add ); break; + case ImageOp::Sub: ITERATE( Sub ); break; + case ImageOp::Mul: ITERATE( Mul ); break; + case ImageOp::Div: + PCL_IVDEP + for ( int k = 0; k < h; ++k, f += m_width-w, g += image.Width()-w ) + { + PCL_IVDEP + for ( int l = 0; l < w; ++l, ++f, ++g ) + if ( *g != 0 ) + P::Div( *f, *g ); + else + *f = P::MaxSampleValue(); + } + break; + case ImageOp::Pow: ITERATE( Pow ); break; + case ImageOp::Dif: ITERATE( Dif ); break; + case ImageOp::Not: ITERATE( Not ); break; + case ImageOp::Or: ITERATE( Or ); break; + case ImageOp::Nor: ITERATE( Nor ); break; + case ImageOp::And: ITERATE( And ); break; + case ImageOp::Nand: ITERATE( Nand ); break; + case ImageOp::Xor: ITERATE( Xor ); break; + case ImageOp::Xnor: ITERATE( Xnor ); break; + case ImageOp::ColorBurn: ITERATE( ColorBurn ); break; + case ImageOp::LinearBurn: ITERATE( LinearBurn ); break; + case ImageOp::Screen: ITERATE( Screen ); break; + case ImageOp::ColorDodge: ITERATE( ColorDodge ); break; + case ImageOp::Overlay: ITERATE( Overlay ); break; + case ImageOp::SoftLight: ITERATE( SoftLight ); break; + case ImageOp::HardLight: ITERATE( HardLight ); break; + case ImageOp::VividLight: ITERATE( VividLight ); break; + case ImageOp::LinearLight: ITERATE( LinearLight ); break; + case ImageOp::PinLight: ITERATE( PinLight ); break; + case ImageOp::Exclusion: ITERATE( Exclusion ); break; + break; + default: + break; + } +#undef ITERATE + } + + return *this; + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * performs an arithmetic or bitwise logical operation with the + * corresponding samples of another \a image. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Apply(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Applied( const GenericImage& image, image_op op = ImageOp::Mov, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + int c0 = (channel < 0) ? m_channel : channel; + int c1 = c0 + ((firstChannel < 0) ? image.FirstSelectedChannel() : firstChannel); + int c2 = c0 + ((lastChannel < 0) ? image.LastSelectedChannel() : lastChannel); + GenericImage result( *this, rect.MovedTo( point ), c1, c2 ); + (void)result.Apply( image, op, Point( 0 ), 0, rect, firstChannel, lastChannel ); + return result; + } + + // ------------------------------------------------------------------------- + + /*! + * Applies an image transformation to a subset of pixel samples. Returns a + * reference to this image. + * + * \param transformation An image transformation that will be applied to + * the selected subset of pixel samples. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If the applied \a transformation is bidirectional, then this function + * represents an inverse transformation, usually requiring a + * previous direct transformation. See the Transform() member + * function. + * + * Bidirectional transformations such as FourierTransform and + * ATrousWaveletTransform usually ignore the specified (or implicit) + * selections of a rectangular region and channel range. Other + * non-invertible transformations, especially geometric transformations such + * as Resample or Rotation, also ignore pixel sample selections. + * + * \note In general, the applied transformation increments the status + * monitoring object proportionally to the number of selected pixel samples. + * However, the specific increments depend on the applied transformations. + * + * \warning This member function is not thread safe, even if the + * subset of pixel samples is selected directly with the \a rect, + * \a firstChannel and \a lastChannel parameters. This is because image + * transformations always use the current image selection, which this + * function changes temporarily. + * + * \sa ImageTransformation + */ + GenericImage& Apply( const ImageTransformation& transformation, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ); + // ### Implemented in pcl/ImageTransformation.h (because of mutual dependencies) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * applies an image transformation to a subset of pixel samples. Returns the + * resulting image. + * + * \param transformation An image transformation that will be applied to + * the selected subset of pixel samples. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). For information on image transformations, + * see Apply( const ImageTransformation& ) and ImageTransformation. + * + * \warning This member function is not thread safe, even if the + * subset of pixel samples is selected directly with the \a rect, + * \a firstChannel and \a lastChannel parameters. This is because image + * transformations always use the current image selection, which this + * function changes temporarily. + */ + GenericImage Applied( const ImageTransformation& transformation, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Apply( transformation ); + return result; + } + + /*! + * Applies a \e direct image transformation to a subset of pixel samples. + * + * \param transform A bidirectional image transformation that will be + * applied to the selected subset of pixel samples. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note In general, the applied transformation increments the status + * monitoring object proportionally to the number of selected pixel samples. + * However, the specific increments depend on the applied transformations. + * + * \warning This member function is not thread safe, even if the + * subset of pixel samples is selected directly with the \a rect, + * \a firstChannel and \a lastChannel parameters. This is because image + * transformations always use the current image selection, which this + * function changes temporarily. + * + * \sa ImageTransformation + */ + void Transform( BidirectionalImageTransformation& transform, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const; + // ### Implemented in pcl/ImageTransformation.h (because of mutual dependencies) + + // ------------------------------------------------------------------------- + +#ifndef __PCL_IMAGE_NO_BITMAP + + /*! + * Blends a rectangular region of a 32-bit RGBA \a bitmap with this image. + * Returns a reference to this image. + * + * \param bitmap Reference to a constant source bitmap. + * + * \param point Target point in image coordinates. This is the upper left + * corner of the target rectangular region where the source + * \a bitmap will be applied to this image. If one or both + * point coordinates are equal to \c int_max (the maximum + * possible value of type \c int), then the current anchor + * point selection will be used. The default value is + * Point( int_max ). + * + * \param rect Source rectangular region in bitmap coordinates. If this + * parameter defines an empty rectangle, the whole source + * bitmap will be applied. If the specified rectangle is not + * empty and extends beyond image boundaries, only the + * intersection with the source bitmap will be used. If that + * intersection does not exist, then this member function has + * no effect. The default value is an empty rectangle. + * + * The blending operation involves only nominal image channels. The alpha + * channel of the source bitmap defines a transparency mask for combining + * bitmap pixel values and image pixel sample values. The resulting pixel + * sample value \c V1 after the blending operation is given in the + * normalized real range [0,1] by the following expression: + * + *
+    * V1 = V*(1 - A/255) + B * A/255
+    * 
+ * + * where \c V is the initial pixel value of this image, \c A is the alpha + * value of the source bitmap pixel, and \c B is one of the red, green or + * blue values in the source bitmap pixel. The expression above is applied + * respectively for each nominal sample of this image. + * + * \note Increments the status monitoring object by the number of pixels in + * the intersection between this image and the specified rectangular region + * of the source bitmap. + */ + GenericImage& Blend( const Bitmap& bitmap, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ) ) + { + Rect r = rect; + if ( r.IsRect() ) + r = bitmap.Bounds().Intersection( r ); + else + r = bitmap.Bounds(); + if ( !r.IsRect() ) + return *this; + + Point p = point; + if ( p.x == int_max || p.y == int_max ) + p = m_point; + + if ( p.x < 0 ) + { + if ( (r.x0 -= p.x) >= r.x1 ) + return *this; + p.x = 0; + } + else if ( p.x >= m_width ) + return *this; + + if ( p.y < 0 ) + { + if ( (r.y0 -= p.y) >= r.y1 ) + return *this; + p.y = 0; + } + else if ( p.y >= m_height ) + return *this; + + r.ResizeTo( pcl::Min( m_width - p.x, r.Width() ), + pcl::Min( m_height - p.y, r.Height() ) ); + + bool hasAlpha = HasAlphaChannels(); + int w = r.Width(); + int h = r.Height(); + + EnsureUnique(); + + if ( IsColor() ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Blending RGBA bitmap", size_type( w )*size_type( h ) ); + + sample* __restrict__ fR = nullptr; + sample* __restrict__ fG = nullptr; + sample* __restrict__ fB = nullptr; + sample* __restrict__ fA = nullptr; + + for ( int i = 0; i < h; ++i, ++p.y, m_status += w ) + { + fR = PixelAddress( p, 0 ); + fG = PixelAddress( p, 1 ); + fB = PixelAddress( p, 2 ); + if ( hasAlpha ) + fA = PixelAddress( p, 3 ); + + const RGBA* __restrict__ g = bitmap.ScanLine( r.y0 + i ) + r.x0; + + for ( int j = 0; j < w; ++j, ++fR, ++fG, ++fB, ++fA, ++g ) + { + RGBA rgba = *g; + + uint8 A = Alpha( rgba ); + + if ( hasAlpha ) + { + P::Mov( *fR, Red( rgba ) ); + P::Mov( *fG, Green( rgba ) ); + P::Mov( *fB, Blue( rgba ) ); + P::Mov( *fA, A ); + } + else if ( A != 0 ) + { + if ( A == 0xFF ) + { + P::Mov( *fR, Red( rgba ) ); + P::Mov( *fG, Green( rgba ) ); + P::Mov( *fB, Blue( rgba ) ); + } + else + { + double k = PTLUT->pDLUTA[A]; + double k1 = PTLUT->p1DLUT8[A]; + double v; + P::FromSample( v, *fR ), P::Mov( *fR, k*Red( rgba ) + k1*v ); + P::FromSample( v, *fG ), P::Mov( *fG, k*Green( rgba ) + k1*v ); + P::FromSample( v, *fB ), P::Mov( *fB, k*Blue( rgba ) + k1*v ); + } + } + } + } + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Blending grayscale bitmap", size_type( w )*size_type( h ) ); + + sample* __restrict__ fK = nullptr; + sample* __restrict__ fA = nullptr; + + for ( int i = 0; i < h; ++i, ++p.y, m_status += w ) + { + fK = PixelAddress( p, 0 ); + if ( hasAlpha ) + fA = PixelAddress( p, 1 ); + + const RGBA* __restrict__ g = bitmap.ScanLine( r.y0 + i ) + r.x0; + + for ( int j = 0; j < w; ++j, ++fK, ++fA, ++g ) + { + RGBA rgba = *g; + uint8 R = Red( rgba ); + uint8 G = Green( rgba ); + uint8 B = Blue( rgba ); + uint8 A = Alpha( rgba ); + + double K = 0.5*(pcl::Min( pcl::Min( R, G ), B ) + + pcl::Max( pcl::Max( R, G ), B )); + + if ( hasAlpha ) + { + P::Mov( *fK, K/255 ); + P::Mov( *fA, A ); + } + else if ( A != 0 ) + { + if ( A == 0xFF ) + P::Mov( *fK, K/255 ); + else + { + double v; + P::FromSample( v, *fK ); + P::Mov( *fK, PTLUT->pDLUTA[A]*K + PTLUT->p1DLUT8[A]*v ); + } + } + } + } + } + + return *this; + } + + /*! + * Returns a local duplicate of this image blended with a rectangular region + * of a 32-bit RGBA \a bitmap. + * + * For information on the parameters of this member function, see the + * documentation for Blend(). + * + * \note Increments the status monitoring object of the returned image by + * the number of pixels in the intersection between this image and the + * specified rectangular region of the source bitmap. + */ + GenericImage Blended( const Bitmap& bitmap, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ) ) const + { + GenericImage result( *this, Bounds(), 0, m_numberOfChannels-1 ); + (void)result.Blend( bitmap, point, rect ); + return result; + } + +#endif // !__PCL_IMAGE_NO_BITMAP + + // ------------------------------------------------------------------------- + + /*! + * Replaces a subset of pixel samples in this image with the specified + * constant \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Mov, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Move( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Mov, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Move(). + */ + template + GenericImage& Mov( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Move( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * Adds the specified \a scalar to a subset of pixel samples in this image. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Add, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Add( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Add, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Add(). + */ + template + GenericImage& operator +=( T scalar ) + { + return Add( scalar ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * adds a \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Added( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Add( scalar ); + return result; + } + + /*! + * Subtracts the specified \a scalar from a subset of pixel samples in this + * image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Sub, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Subtract( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Sub, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Subtract(). + */ + template + GenericImage& Sub( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Subtract( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Subtract(). + */ + template + GenericImage& operator -=( T scalar ) + { + return Subtract( scalar ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * subtracts a \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Subtracted( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Subtract( scalar ); + return result; + } + + /*! + * Multiplies a subset of pixel samples in this image by the specified + * \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Mul, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Multiply( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Mul, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Multiply(). + */ + template + GenericImage& Mul( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Multiply( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Multiply(). + */ + template + GenericImage& operator *=( T scalar ) + { + return Multiply( scalar ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * multiplies it by a \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Multiplied( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Multiply( scalar ); + return result; + } + + /*! + * Divides a subset of pixel samples in this image by the specified + * \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Div, rect, firstChannel, lastChannel ); + * \endcode + * + * \warning Make sure that the specified \a scalar is not zero or + * insignificant. + */ + template + GenericImage& Divide( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Div, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Divide(). + */ + template + GenericImage& Div( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Divide( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Divide(). + */ + template + GenericImage& operator /=( T scalar ) + { + return Divide( scalar ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * divides it by a \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + * + * \warning Make sure that the specified \a scalar is not zero or + * insignificant. + */ + template + GenericImage Divided( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Divide( scalar ); + return result; + } + + /*! + * Raises (exponentiation operator) a subset of pixel samples in this image + * to the specified \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Pow, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Raise( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Pow, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Raise(). + */ + template + GenericImage& Pow( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Raise( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Raise(). + */ + template + GenericImage& operator ^=( T scalar ) + { + return Raise( scalar ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * raises it to a \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Raised( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.Raise( scalar ); + return result; + } + + /*! + * Replaces a subset of pixel samples in this image with the absolute + * values of their differences with the specified \a scalar. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Dif, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetAbsoluteDifference( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Dif, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetAbsoluteDifference(). + */ + template + GenericImage& Dif( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteDifference( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the absolute values of their differences with the specified + * \a scalar. Returns the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage AbsoluteDifference( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.SetAbsoluteDifference( scalar ); + return result; + } + + /*! + * Replaces a subset of pixel samples in this image with the minimum of each + * sample and the specified \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Min, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetMinimum( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Min, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetMinimum(). + */ + template + GenericImage& Min( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMinimum( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the minimum of each sample and the specified \a scalar. Returns + * the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Minimum( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.SetMinimum( scalar ); + return result; + } + + /*! + * Replaces a subset of pixel samples in this image with the maximum of each + * sample and the specified \a scalar. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Max, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetMaximum( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Max, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetMaximum(). + */ + template + GenericImage& Max( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMaximum( scalar, rect, firstChannel, lastChannel ); + } + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the maximum of each sample and the specified \a scalar. Returns + * the resulting image. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * \note Increments the status monitoring object of the returned image by + * the number of selected pixel samples. + */ + template + GenericImage Maximum( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + GenericImage result( *this, rect, firstChannel, lastChannel ); + (void)result.SetMaximum( scalar ); + return result; + } + + /*! + * Performs a bitwise OR (inclusive OR) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Or, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Or( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Or, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise AND operation between a subset of pixel samples in + * this image and the specified \a scalar. Returns a reference to this + * image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::And, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& And( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::And, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise XOR (exclusive OR) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Or, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Xor( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Xor, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise NOR (NOT inclusive OR) operation between a subset of + * pixel samples in this image and the specified \a scalar. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Nor, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Nor( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Nor, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise NAND (NOT AND) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Nand, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Nand( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Nand, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise XNOR (exclusive NOR) operation between a subset of + * pixel samples in this image and the specified \a scalar. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( scalar, ImageOp::Xnor, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Xnor( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( scalar, ImageOp::Xnor, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Replaces a subset of pixel samples in this image with samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Mov, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Move( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Mov, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Move(). + */ + template + GenericImage& Mov( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Move( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Adds pixel samples of the specified \a image to a subset of pixel samples + * in this image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Add, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Add( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Add, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Add(). + */ + template + GenericImage& operator +=( const GenericImage& image ) + { + return Add( image ); + } + + /*! + * Subtracts pixel samples of the specified \a image from a subset of pixel + * samples in this image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Sub, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Subtract( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Sub, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Subtract(). + */ + template + GenericImage& Sub( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Subtract( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Subtract(). + */ + template + GenericImage& operator -=( const GenericImage& image ) + { + return Subtract( image ); + } + + /*! + * Multiplies a subset of pixel samples in this image by samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Mul, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Multiply( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Mul, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Multiply(). + */ + template + GenericImage& Mul( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Multiply( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Multiply(). + */ + template + GenericImage& operator *=( const GenericImage& image ) + { + return Multiply( image ); + } + + /*! + * Divides a subset of pixel samples in this image by samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Div, point, channel, rect, firstChannel, lastChannel ); + * \endcode + * + * When a source pixel sample of the specified \a image is zero or + * insignificant, the corresponding target pixel sample is set to the + * maximum sample value in the native range of this image. + */ + template + GenericImage& Divide( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Div, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Divide(). + */ + template + GenericImage& Div( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Divide( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Divide(). + */ + template + GenericImage& operator /=( const GenericImage& image ) + { + return Divide( image ); + } + + /*! + * Raises (exponentiation operator) a subset of pixel samples in this image + * to samples from the specified source \a image. Returns a reference to + * this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Pow, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Raise( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Pow, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Raise(). + */ + template + GenericImage& Pow( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Raise( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for Raise(). + */ + template + GenericImage& operator ^=( const GenericImage& image ) + { + return Raise( image ); + } + + /*! + * Replaces a subset of pixel samples in this image with the absolute values + * of their differences with samples from the specified source \a image. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Dif, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetAbsoluteDifference( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Dif, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetAbsoluteDifference(). + */ + template + GenericImage& Dif( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteDifference( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Replaces a subset of pixel samples in this image with the minimum of each + * target sample and the corresponding source sample of the specified + * \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Min, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetMinimum( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Min, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetMinimum(). + */ + template + GenericImage& Min( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMinimum( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Replaces a subset of pixel samples in this image with the maximum of each + * target sample and the corresponding source sample of the specified + * \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Min, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& SetMaximum( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Max, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * A synonym for SetMaximum(). + */ + template + GenericImage& Max( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMaximum( image, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise OR (inclusive OR) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Or, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Or( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Or, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise AND operation between a subset of pixel samples in + * this image and the corresponding samples of the specified source + * \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::And, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& And( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::And, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise XOR (exclusive OR) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Xor, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Xor( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Xor, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise NOR (NOT inclusive OR) operation between a subset of + * pixel samples in this image and the corresponding samples of the + * specified source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Nor, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Nor( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Nor, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise NAND (NOT AND) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Nand, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Nand( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Nand, point, channel, rect, firstChannel, lastChannel ); + } + + /*! + * Performs a bitwise XNOR (NOT exclusive OR) operation between a subset of + * pixel samples in this image and the corresponding samples of the + * specified source \a image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Apply( image, ImageOp::Xnor, point, channel, rect, firstChannel, lastChannel ); + * \endcode + */ + template + GenericImage& Xnor( const GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Apply( image, ImageOp::Xnor, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Exchanges a subset of pixel samples between this image and another + * operand \a image. Returns a reference to this image. + * + * \param image Operand image, whose pixel samples will be exchanged with + * samples from this image. + * + * \param point Target point in image coordinates. This is the upper left + * corner of the target rectangular region where the source + * \a image will be exchanged with this image. If one or both + * point coordinates are equal to \c int_max (the maximum + * possible value of type \c int), then the current anchor + * point selection will be used. The default value is + * Point( int_max ). + * + * \param channel Target channel index (zero-based). This is the index of + * the first channel of this image where pixel samples will + * be exchanged. If this parameter is negative, then the + * currently selected channel will be used. The default value + * is -1. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The specified operation is performed with samples in the intersection + * between the specified (or implicit) rectangular selections for both + * images. Each channel in the specified channel range selection for this + * image is operated with its counterpart channel in the operand \a image, + * starting from the first selected channel in the operand \a image. + * + * The operation may involve conversions to the appropriate floating point + * data type for intermediate results, or LUT table lookups, as necessary + * to ensure preservation of the full native range of both images. + * + * \note Increments the status monitoring object by the number of pixel + * samples in the intersection between both operand images. + */ + template + GenericImage& Exchange( GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + Rect r = rect; + if ( !image.ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + if ( !ParseChannel( channel ) ) + return *this; + + Point p = point; + if ( p.x == int_max || p.y == int_max ) + p = m_point; + + if ( p.x < 0 ) + { + if ( (r.x0 -= p.x) >= r.x1 ) + return *this; + p.x = 0; + } + else if ( p.x >= m_width ) + return *this; + + if ( p.y < 0 ) + { + if ( (r.y0 -= p.y) >= r.y1 ) + return *this; + p.y = 0; + } + else if ( p.y >= m_height ) + return *this; + + r.ResizeTo( pcl::Min( m_width - p.x, r.Width() ), + pcl::Min( m_height - p.y, r.Height() ) ); + + lastChannel = pcl::Min( lastChannel, firstChannel + m_numberOfChannels - channel - 1 ); + + EnsureUnique(); + image.EnsureUnique(); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Exchanging pixel samples", N*(1 + lastChannel - firstChannel) ); + + if ( r == Bounds() && r == image.Bounds() ) + for ( int i = channel, j = firstChannel; j <= lastChannel; ++i, ++j, m_status += N ) + { + sample* __restrict__ f = m_pixelData[i]; + typename P1::sample* __restrict__ g = image[j]; + PCL_IVDEP + for ( size_type k = 0; k < N; ++k, ++f, ++g ) + { + sample t = *f; + P1::FromSample( *f, *g ); + P::FromSample( *g, t ); + } + } + else + for ( int i = channel, j = firstChannel, w = r.Width(), h = r.Height(); j <= lastChannel; ++i, ++j, m_status += N ) + { + sample* __restrict__ f = PixelAddress( p, i ); + typename P1::sample* __restrict__ g = image.PixelAddress( r.LeftTop(), j ); + PCL_IVDEP + for ( int k = 0; k < h; ++k, f += m_width-w, g += image.Width()-w ) + { + PCL_IVDEP + for ( int l = 0; l < w; ++l, ++f, ++g ) + { + sample t = *f; + P1::FromSample( *f, *g ); + P::FromSample( *g, t ); + } + } + } + + return *this; + } + + /*! + * A synonym for Exchange(). + */ + template + GenericImage& Xchg( GenericImage& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Exchange( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + + /*! + * Returns the minimum value among a subset of pixel samples of this image. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * minimum sample value. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + sample MinimumSampleValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing minimum pixel sample value", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MinThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MinThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MinThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + sample min = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + min = threads[i].min; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + if ( threads[i].min < min ) + min = threads[i].min; + break; + } + + threads.Destroy(); + m_status += N; + return min; + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * MinimumSampleValue() instead. + */ + sample MinimumPixelValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return MinimumSampleValue( rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Returns the maximum value among a subset of pixel samples of this image. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * maximum sample value. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + sample MaximumSampleValue( const Rect& rect = Rect( 0 ), + int firstChannel = -1, int lastChannel = -1, int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing maximum pixel sample value", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MaxThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MaxThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MaxThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + sample max = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + max = threads[i].max; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + if ( max < threads[i].max ) + max = threads[i].max; + break; + } + + threads.Destroy(); + m_status += N; + return max; + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * MaximumSampleValue() instead. + */ + sample MaximumPixelValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return MaximumSampleValue( rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Obtains the extreme values among a subset of pixel samples of this image. + * + * \param[out] min Minimum sample value. + * + * \param[out] max Maximum sample value. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If necessary, the output values will be converted from the pixel sample + * data type of this image using pixel traits primitives. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * extreme sample values. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + void GetExtremeSampleValues( T& min, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + { + // ### Required for compatibility with PCL 1.x + P::FromSample( min, P::MinSampleValue() ); + max = min; + return; + } + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing extreme pixel sample values", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MinMaxThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MinMaxThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MinMaxThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + sample vmin = P::MinSampleValue(); + sample vmax = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + vmin = threads[i].min; + vmax = threads[i].max; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + { + if ( threads[i].min < vmin ) + vmin = threads[i].min; + if ( vmax < threads[i].max ) + vmax = threads[i].max; + } + break; + } + + threads.Destroy(); + m_status += N; + P::FromSample( min, vmin ); + P::FromSample( max, vmax ); + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * GetExtremeSampleValues() instead. + */ + void GetExtremePixelValues( sample& min, sample& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + GetExtremeSampleValues( min, max, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Returns the minimum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * \param[out] xmin Horizontal coordinate of the first occurrence of the + * returned minimum pixel sample value. + * + * \param[out] ymin Vertical coordinate of the first occurrence of the + * returned minimum pixel sample value. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * minimum sample value. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + sample LocateMinimumSampleValue( int& xmin, int& ymin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + { + // ### Required for compatibility with PCL 1.x + xmin = ymin = 0; + return P::MinSampleValue(); + } + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Locating minimum pixel sample value", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MinPosThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MinPosThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MinPosThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + xmin = ymin = -1; + sample min = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + min = threads[i].min; + xmin = threads[i].pmin.x; + ymin = threads[i].pmin.y; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + if ( threads[i].min < min ) + { + min = threads[i].min; + xmin = threads[i].pmin.x; + ymin = threads[i].pmin.y; + } + break; + } + + threads.Destroy(); + m_status += N; + return min; + } + + /*! + * Returns the minimum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * \param[out] pmin Coordinates of the first occurrence of the returned + * minimum pixel sample value. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * This member function is equivalent to: + * + * \code + * LocateMinimumSampleValue( pmin.x, pmin.y, rect, firstChannel, lastChannel ); + * \endcode + */ + sample LocateMinimumSampleValue( Point& pmin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMinimumSampleValue( pmin.x, pmin.y, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * LocateMinimumSampleValue() instead. + */ + sample LocateMinimumPixelValue( int& xmin, int& ymin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMinimumSampleValue( xmin, ymin, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * LocateMinimumSampleValue() instead. + */ + sample LocateMinimumPixelValue( Point& pmin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMinimumSampleValue( pmin, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Returns the maximum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * \param[out] xmax Horizontal coordinate of the first occurrence of the + * returned maximum pixel sample value. + * + * \param[out] ymax Vertical coordinate of the first occurrence of the + * returned maximum pixel sample value. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * maximum sample value. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + sample LocateMaximumSampleValue( int& xmax, int& ymax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + { + // ### Required for compatibility with PCL 1.x + xmax = ymax = 0; + return P::MaxSampleValue(); + } + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Locating maximum pixel sample value", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MaxPosThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MaxPosThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MaxPosThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + xmax = ymax = -1; + sample max = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + max = threads[i].max; + xmax = threads[i].pmax.x; + ymax = threads[i].pmax.y; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + if ( max < threads[i].max ) + { + max = threads[i].max; + xmax = threads[i].pmax.x; + ymax = threads[i].pmax.y; + } + break; + } + + threads.Destroy(); + m_status += N; + return max; + } + + /*! + * Returns the maximum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * \param[out] pmax Coordinates of the first occurrence of the returned + * maximum pixel sample value. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the parameters of this member function, see the + * documentation for Fill(). + * + * This member function is equivalent to: + * + * \code + * LocateMaximumSampleValue( pmax.x, pmax.y, rect, firstChannel, lastChannel ); + * \endcode + */ + sample LocateMaximumSampleValue( Point& pmax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMaximumSampleValue( pmax.x, pmax.y, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * LocateMaximumSampleValue() instead. + */ + sample LocateMaximumPixelValue( int& xmax, int& ymax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMaximumSampleValue( xmax, ymax, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * \deprecated This member function has been deprecated. It is still part of + * PCL only to keep existing code alive. In newly produced code, use + * LocateMaximumSampleValue() instead. + */ + sample LocateMaximumPixelValue( Point& pmax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return LocateMaximumSampleValue( pmax, rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Obtains the extreme values, and the image coordinates of their first + * occurrences, among a subset of pixel samples of this image. + * + * \param[out] xmin Horizontal coordinate of the first occurrence of the + * minimum pixel sample value. + * + * \param[out] ymin Vertical coordinate of the first occurrence of the + * minimum pixel sample value. + * + * \param[out] min Minimum pixel sample value in the selected subset. + * + * \param[out] xmax Horizontal coordinate of the first occurrence of the + * maximum pixel sample value. + * + * \param[out] ymax Vertical coordinate of the first occurrence of the + * maximum pixel sample value. + * + * \param[out] max Maximum pixel sample value in the selected subset. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * extreme sample values. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + template + void LocateExtremeSampleValues( int& xmin, int& ymin, T& min, + int& xmax, int& ymax, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + { + // ### Required for compatibility with PCL 1.x + xmin = ymin = xmax = ymax = 0; + P::FromSample( min, P::MinSampleValue() ); + max = min; + return; + } + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Locating extreme pixel sample values", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new MinMaxPosThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( MinMaxPosThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( MinMaxPosThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + xmin = ymin = xmax = ymax = -1; + sample vmin = P::MinSampleValue(); + sample vmax = P::MinSampleValue(); + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + vmin = threads[i].min; + xmin = threads[i].pmin.x; + ymin = threads[i].pmin.y; + vmax = threads[i].max; + xmax = threads[i].pmax.x; + ymax = threads[i].pmax.y; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + { + if ( threads[i].min < vmin ) + { + vmin = threads[i].min; + xmin = threads[i].pmin.x; + ymin = threads[i].pmin.y; + } + if ( vmax < threads[i].max ) + { + vmax = threads[i].max; + xmax = threads[i].pmax.x; + ymax = threads[i].pmax.y; + } + } + break; + } + + threads.Destroy(); + m_status += N; + P::FromSample( min, vmin ); + P::FromSample( max, vmax ); + } + + /*! + * Obtains the extreme values, and the image coordinates of their first + * occurrences, among a subset of pixel samples of this image. + * + * \param[out] pmin Coordinates of the first occurrence of the minimum + * pixel sample value. + * + * \param[out] min Minimum pixel sample value in the selected subset. + * + * \param[out] pmax Coordinates of the first occurrence of the maximum + * pixel sample value. + * + * \param[out] max Maximum pixel sample value in the selected subset. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account to search for the + * extreme sample values. + */ + template + void LocateExtremeSampleValues( Point& pmin, T& min, + Point& pmax, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + LocateExtremeSampleValues( pmin.x, pmin.y, min, + pmax.x, pmax.y, max, + rect, firstChannel, lastChannel, maxProcessors ); + } + + /*! + * Returns the number of pixel samples selectable for statistics calculation + * from a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account. If range clipping + * is disabled, the result of this member function will be the volume of the + * specified (or implicitly selected) region. + * + * When range clipping is enabled and this is a complex-valued image, this + * function uses the magnitudes (or absolute values) of all selected samples + * to compare them with the bounds of the current clipping range. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + size_type Count( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Counting pixel samples", N ); + + if ( !this->IsRangeClippingEnabled() ) + { + m_status += N; + return size_type( r.Width() ) * size_type( r.Height() ) * size_type( 1 + lastChannel - firstChannel ); + } + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new CountThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( CountThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( CountThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + size_type count = 0; + for ( const CountThread& thread : threads ) + count += thread.count; + + threads.Destroy(); + m_status += N; + return count; + } + + /*! + * Returns the arithmetic mean of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the mean in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the mean of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the mean. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Mean( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing mean pixel sample value", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + size_type n = 0; + for ( const SumThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + n += thread.n; + } + + threads.Destroy(); + + m_status += N; + + if ( n == 0 ) + return 0; + return s/n; + } + + /*! + * Returns the median of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the median in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the median of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the median. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Median( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing median pixel sample value", N ); + + if ( N <= 2560000 ) + { + SmpThread S( *this, r, firstChannel, lastChannel, 0, r.Height() ); + S.Run(); + if ( S.n == 0 ) + { + m_status += N; + return 0; + } + double m = double( *pcl::Select( S.samples.Begin(), S.samples.At( S.n ), S.n >> 1 ) )/double( P::MaxSampleValue() ); + if ( S.n & 1 ) + { + m_status += N; + return m; + } + m = (m + double( *pcl::Select( S.samples.Begin(), S.samples.At( S.n ), (S.n >> 1)-1 ) )/double( P::MaxSampleValue() ))/2; + m_status += N; + return m; + } + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors, 160*1024/*overheadLimitPx*/ ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + + double low, high; + size_type count = 0; + { + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new MinMaxThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ); + + if ( threads.Length() > 1 ) + { + int i = 0; + for ( MinMaxThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( MinMaxThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + sample slow = 0, shigh = 0; + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + slow = threads[i].min; + shigh = threads[i].max; + count = threads[i].count; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + { + if ( threads[i].min < slow ) + slow = threads[i].min; + if ( shigh < threads[i].max ) + shigh = threads[i].max; + count += threads[i].count; + } + break; + } + + threads.Destroy(); + + low = double( slow ); + high = double( shigh ); + } + + const double eps = P::IsComplexSample() ? 2*std::numeric_limits::epsilon() : + (P::IsFloatSample() ? 2*std::numeric_limits::epsilon() : + 0.5/Pow2( double( P::BitsPerSample() ) )); + if ( count == 0 ) + { + m_status += N; + return 0; + } + if ( high - low < eps ) + { + m_status += N; + return low/double( P::MaxSampleValue() ); + } + + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new HistogramThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), low, high ); + + double mh = 0, l0 = low, h0 = high; + SzVector H0; + + for ( size_type n = 0, n2 = count >> 1, step = 0, it = 0;; ++it ) + { + SzVector H; + if ( it == 0 && step ) + H = H0; + else + { + if ( threads.Length() > 1 ) + { + int i = 0; + for ( HistogramThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( HistogramThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + H = threads[0].H; + for ( size_type i = 1; i < threads.Length(); ++i ) + H += threads[i].H; + if ( it == 0 ) + if ( (count & 1) == 0 ) + H0 = H; + } + + for ( int i = 0; ; n += H[i++] ) + if ( n + H[i] > n2 ) + { + double range = high - low; + high = (range * (i + 1))/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + low = (range * i)/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + if ( high - low < eps ) + { + if ( count & 1 ) + { + threads.Destroy(); + m_status += N; + return low/double( P::MaxSampleValue() ); + } + if ( step ) + { + threads.Destroy(); + m_status += N; + return (low + mh)/2/double( P::MaxSampleValue() ); + } + mh = low; + low = l0; + high = h0; + n = 0; + --n2; + ++step; + it = 0; + } + break; + } + } + } + + /*! + * Returns an order statistic computed for a subset of pixel samples. + * + * \param k Selection point in the [0,1] range, where 0 corresponds to + * the minimum value in the ordered subset of selected pixel + * samples and 1 corresponds to the maximum value. If the value of + * this parameter is outside the [0,1] range, this function returns + * zero conventionally. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This function returns the requested order statistic in the normalized + * range [0,1], irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the requested order + * statistic for the set of magnitudes (or absolute values) of all selected + * samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double OrderStatistic( double k, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + if ( k < 0 || k > 1 ) + return 0; + + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing order statistic", N ); + + if ( N <= 2560000 ) + { + SmpThread S( *this, r, firstChannel, lastChannel, 0, r.Height() ); + S.Run(); + m_status += N; + if ( S.n == 0 ) + return 0; + return double( *pcl::Select( S.samples.Begin(), S.samples.At( S.n ), distance_type( k*(S.n - 1) ) ) )/double( P::MaxSampleValue() ); + } + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors, 160*1024/*overheadLimitPx*/ ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + + double low, high; + size_type count = 0; + { + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new MinMaxThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ); + + if ( threads.Length() > 1 ) + { + int i = 0; + for ( MinMaxThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( MinMaxThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + sample slow = 0, shigh = 0; + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + slow = threads[i].min; + shigh = threads[i].max; + count = threads[i].count; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + { + if ( threads[i].min < slow ) + slow = threads[i].min; + if ( shigh < threads[i].max ) + shigh = threads[i].max; + count += threads[i].count; + } + break; + } + + threads.Destroy(); + + low = double( slow ); + high = double( shigh ); + } + + const double eps = P::IsComplexSample() ? 2*std::numeric_limits::epsilon() : + (P::IsFloatSample() ? 2*std::numeric_limits::epsilon() : + 0.5/Pow2( double( P::BitsPerSample() ) )); + if ( count == 0 ) + { + m_status += N; + return 0; + } + if ( k == 0 || high - low < eps ) + { + m_status += N; + return low/double( P::MaxSampleValue() ); + } + if ( k == 1 ) + { + m_status += N; + return high/double( P::MaxSampleValue() ); + } + + size_type index = size_type( k*(count - 1) ); + + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new HistogramThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), low, high ); + + for ( size_type n = 0;; ) + { + if ( threads.Length() > 1 ) + { + int i = 0; + for ( HistogramThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( HistogramThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + SzVector H = threads[0].H; + for ( size_type i = 1; i < threads.Length(); ++i ) + H += threads[i].H; + + for ( int i = 0; ; n += H[i++] ) + if ( n + H[i] > index ) + { + double range = high - low; + high = (range * (i + 1))/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + low = (range * i)/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + if ( high - low < eps ) + { + threads.Destroy(); + m_status += N; + return low/double( P::MaxSampleValue() ); + } + break; + } + } + } + + /*! + * Returns the variance from the mean of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the variance in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the variance of the + * magnitudes (or absolute values) of all selected samples. + * + * This implementation uses a two-pass compensated summation algorithm to + * minimize roundoff errors (see References). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the variance. + * + * \b References + * + * William H. Press et al., Numerical Recipes in C: The Art of + * Scientific Computing, Second Edition (1997 reprint) Cambridge + * University Press, page 613. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Variance( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing variance", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray sumThreads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + sumThreads.Add( new SumThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( sumThreads.Length() > 1 ) + { + int n = 0; + for ( SumThread& thread : sumThreads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumThread& thread : sumThreads ) + thread.Wait(); + } + else + sumThreads[0].Run(); + + double s = 0; + double e = 0; + size_type n = 0; + for ( const SumThread& thread : sumThreads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + n += thread.n; + } + + sumThreads.Destroy(); + + if ( n < 2 ) + return 0; + double mean = s/n; + + ReferenceArray varThreads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + varThreads.Add( new VarThread( *this, mean, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( varThreads.Length() > 1 ) + { + int n = 0; + for ( VarThread& thread : varThreads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( VarThread& thread : varThreads ) + thread.Wait(); + } + else + varThreads[0].Run(); + + double var = 0, eps = 0; + for ( const VarThread& thread : varThreads ) + var += thread.var, eps += thread.eps; + + varThreads.Destroy(); + m_status += N; + return (var - eps*eps/n)/(n - 1); + } + + /*! + * Returns the standard deviation from the mean of a subset of pixel + * samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the standard deviation in the normalized + * range [0,1], irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the standard deviation + * of the magnitudes (or absolute values) of all selected samples. + * + * This implementation uses a two-pass compensated summation algorithm to + * minimize roundoff errors (see References). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the variance. + * + * \b References + * + * William H. Press et al., Numerical Recipes in C: The Art of + * Scientific Computing, Second Edition (1997 reprint) Cambridge + * University Press, page 613. + */ + double StdDev( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + return pcl::Sqrt( Variance( rect, firstChannel, lastChannel, maxProcessors ) ); + } + + /*! + * Returns the mean absolute deviation of a subset of pixel samples with + * respect to the specified \a center value. + * + * \param center Reference central value for computation of the mean + * absolute deviation in the normalized range [0,1]. + * Typically, this parameter is set to the median value of + * the set of pixel samples used for calculation. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the mean absolute deviation with respect to + * \a center in the normalized range [0,1], irrespective of the sample data + * type of the image. + * + * For complex-valued images, this function returns the average absolute + * deviation of the magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the average absolute deviation. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double AvgDev( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing average absolute deviation", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumAbsDevThread( *this, center, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumAbsDevThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumAbsDevThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + size_type n = 0; + for ( const SumAbsDevThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + n += thread.n; + } + + threads.Destroy(); + + m_status += N; + + if ( n == 0 ) + return 0; + return s/n; + } + + /*! + * Returns the two-sided mean absolute deviation of a subset of pixel + * samples with respect to the specified \a center value. + * + * \param center Reference central value for computation of the mean + * absolute deviation in the normalized range [0,1]. + * Typically, the value of this parameter is the median of + * the set of pixel samples used for calculation. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * See AvgDev() for complete information and references. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + TwoSidedEstimate TwoSidedAvgDev( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing two-sided average absolute deviation", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new TwoSidedSumAbsDevThread( *this, center, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( TwoSidedSumAbsDevThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( TwoSidedSumAbsDevThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s0 = 0, s1 = 0; + double e0 = 0, e1 = 0; + size_type n0 = 0, n1 = 0; + for ( const TwoSidedSumAbsDevThread& thread : threads ) + { + double y = thread.s0 - e0; + double t = s0 + y; + e0 = (t - s0) - y; + s0 = t; + n0 += thread.n0; + y = thread.s1 - e1; + t = s1 + y; + e1 = (t - s1) - y; + s1 = t; + n1 += thread.n1; + } + + threads.Destroy(); + + m_status += N; + + return { (n0 > 0) ? s0/n0 : 0.0, + (n1 > 0) ? s1/n1 : 0.0 }; + } + + /*! + * Returns the median absolute deviation (MAD) of a subset of pixel samples + * with respect to the specified \a center value. + * + * \param center Reference central value for computation of MAD in the + * normalized range [0,1]. Normally, this value should be the + * median of the selected pixel samples, or the median of the + * whole image. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns MAD in the normalized range [0,1] with + * respect to \a center, irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the MAD of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the median absolute deviation. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, it must be multiplied by the constant 1.4826. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double MAD( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing median absolute deviation", N ); + + if ( N <= 2560000 ) + { + AbsDevSmpThread S( *this, center, r, firstChannel, lastChannel, 0, r.Height() ); + S.Run(); + if ( S.n == 0 ) + { + m_status += N; + return 0; + } + double m = *pcl::Select( S.values.Begin(), S.values.At( S.n ), S.n >> 1 ); + if ( S.n & 1 ) + { + m_status += N; + return m; + } + m = (m + *pcl::Select( S.values.Begin(), S.values.At( S.n ), (S.n >> 1)-1 ))/2; + m_status += N; + return m; + } + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors, 160*1024/*overheadLimitPx*/ ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + + double low, high; + size_type count = 0; + { + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new ExtremeAbsDevThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), center ); + + if ( threads.Length() > 1 ) + { + int n = 0; + for ( ExtremeAbsDevThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( ExtremeAbsDevThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].count > 0 ) + { + low = threads[i].minAbsDev; + high = threads[i].maxAbsDev; + count += threads[i].count; + while ( ++i < threads.Length() ) + if ( threads[i].count > 0 ) + { + if ( threads[i].minAbsDev < low ) + low = threads[i].minAbsDev; + if ( threads[i].maxAbsDev > high ) + high = threads[i].maxAbsDev; + count += threads[i].count; + } + break; + } + + threads.Destroy(); + } + + const double eps = 2*std::numeric_limits::epsilon(); + if ( count == 0 || high - low < eps ) + { + m_status += N; + return 0; + } + + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new AbsDevHistogramThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), center, low, high ); + + double mh = 0, l0 = low, h0 = high; + SzVector H0; + + for ( size_type n = 0, n2 = count >> 1, step = 0, it = 0;; ++it ) + { + SzVector H; + if ( it == 0 && step ) + H = H0; + else + { + if ( threads.Length() > 1 ) + { + int i = 0; + for ( AbsDevHistogramThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( AbsDevHistogramThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + H = threads[0].H; + for ( size_type i = 1; i < threads.Length(); ++i ) + H += threads[i].H; + if ( it == 0 ) + if ( (count & 1) == 0 ) + H0 = H; + } + + for ( int i = 0; ; n += H[i++] ) + if ( n + H[i] > n2 ) + { + double range = high - low; + high = (range * (i + 1))/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + low = (range * i)/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + low; + if ( high - low < eps ) + { + if ( count & 1 ) + { + threads.Destroy(); + m_status += N; + return low; + } + if ( step ) + { + threads.Destroy(); + m_status += N; + return (low + mh)/2; + } + mh = low; + low = l0; + high = h0; + n = 0; + --n2; + ++step; + it = 0; + } + break; + } + } + } + + /*! + * Returns the two-sided median absolute deviation (MAD) of a subset of + * pixel samples with respect to the specified \a center value. + * + * \param center Reference central value for computation of MAD in the + * normalized range [0,1]. Normally, this value should be the + * median of the selected pixel samples, or the median of the + * whole image. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * See MAD() for more information and references. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + TwoSidedEstimate TwoSidedMAD( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing two-sided median absolute deviation", N ); + + if ( N <= 2560000 ) + { + TwoSidedAbsDevSmpThread S( *this, center, r, firstChannel, lastChannel, 0, r.Height() ); + S.Run(); + m_status += N; + return { pcl::Median( S.values.Begin(), S.p ), + pcl::Median( S.q, S.values.End() ) }; + } + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors, 160*1024/*overheadLimitPx*/ ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + + double minLow = 0, minHigh = 0, maxLow = 0, maxHigh = 0; + size_type nLow = 0, nHigh = 0; + { + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new TwoSidedExtremeAbsDevThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), center ); + + if ( threads.Length() > 1 ) + { + int n = 0; + for ( TwoSidedExtremeAbsDevThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( TwoSidedExtremeAbsDevThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].nLow > 0 ) + { + minLow = threads[i].minAbsDevLow; + maxLow = threads[i].maxAbsDevLow; + nLow = threads[i].nLow; + while ( ++i < threads.Length() ) + if ( threads[i].nLow > 0 ) + { + if ( threads[i].minAbsDevLow < minLow ) + minLow = threads[i].minAbsDevLow; + if ( threads[i].maxAbsDevLow > maxLow ) + maxLow = threads[i].maxAbsDevLow; + nLow += threads[i].nLow; + } + break; + } + + for ( size_type i = 0; i < threads.Length(); ++i ) + if ( threads[i].nHigh > 0 ) + { + minHigh = threads[i].minAbsDevHigh; + maxHigh = threads[i].maxAbsDevHigh; + nHigh = threads[i].nHigh; + while ( ++i < threads.Length() ) + if ( threads[i].nHigh > 0 ) + { + if ( threads[i].minAbsDevHigh < minHigh ) + minHigh = threads[i].minAbsDevHigh; + if ( threads[i].maxAbsDevHigh > maxHigh ) + maxHigh = threads[i].maxAbsDevHigh; + nHigh += threads[i].nHigh; + } + break; + } + + threads.Destroy(); + } + + int side; + double sideLow, sideHigh; + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads << new TwoSidedAbsDevHistogramThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ), center, side, sideLow, sideHigh ); + + const double eps = 2*std::numeric_limits::epsilon(); + double mad[ 2 ]; + for ( side = 0; side < 2; ++side ) + { + size_type n = side ? nHigh : nLow; + if ( n < 2 ) + { + mad[side] = 0; + continue; + } + + sideLow = side ? minHigh : minLow; + sideHigh = side ? maxHigh : maxLow; + if ( sideHigh - sideLow < eps ) + { + mad[side] = 0; + continue; + } + + double mh = 0, h0 = sideHigh; + SzVector H0; + + for ( size_type count = 0, n2 = n >> 1, step = 0, it = 0;; ++it ) + { + SzVector H; + if ( it == 0 && step ) + H = H0; + else + { + if ( threads.Length() > 1 ) + { + int i = 0; + for ( TwoSidedAbsDevHistogramThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? i++ : -1 ); + for ( TwoSidedAbsDevHistogramThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + H = threads[0].H; + for ( size_type i = 1; i < threads.Length(); ++i ) + H += threads[i].H; + if ( it == 0 ) + if ( (n & 1) == 0 ) + H0 = H; + } + + for ( int i = 0; ; count += H[i++] ) + if ( count + H[i] > n2 ) + { + double range = sideHigh - sideLow; + sideHigh = (range * (i + 1))/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + sideLow; + sideLow = (range * i)/(__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) + sideLow; + if ( sideHigh - sideLow < eps ) + { + if ( n & 1 ) + { + mad[side] = sideLow; + goto __madNextSide; + } + if ( step ) + { + mad[side] = (sideLow + mh)/2; + goto __madNextSide; + } + mh = sideLow; + sideLow = 0; + sideHigh = h0; + count = 0; + --n2; + ++step; + it = 0; + } + break; + } + } + +__madNextSide: + ; + } + + threads.Destroy(); + m_status += N; + return { mad[0], mad[1] }; + } + + /*! + * Returns a biweight midvariance (BWMV) for a subset of pixel samples. + * + * \param center Reference center value in the [0,1] range. Normally, the + * median of the selected pixel samples should be used. + * + * \param sigma A reference estimate of dispersion in the [0,1] range. + * Normally, the median absolute deviation from the median + * (MAD) of the selected pixel samples should be used. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the same as MAD). + * + * This member function returns BWMV in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns a BWMV for the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the biweight midvariance. + * + * \b References + * + * Rand R. Wilcox (2012), Introduction to Robust Estimation and Hypothesis + * Testing, 3rd Edition, Elsevier Inc., Section 3.12.1. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double BiweightMidvariance( double center, double sigma, int k = 9, bool reducedLength = false, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + double kd = k * sigma; + if ( kd < 0 || 1 + kd == 1 ) + { + m_status += N; + return 0; + } + + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing biweight midvariance", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new BWMVThread( *this, center, kd, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( BWMVThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( BWMVThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double num = 0, den = 0; + size_type n = 0, nr = 0; + for ( const BWMVThread& thread : threads ) + { + num += thread.num; + den += thread.den; + n += thread.n; + nr += thread.nr; + } + + threads.Destroy(); + + m_status += N; + den *= den; + return (n >= 2 && 1 + den != 1) ? (reducedLength ? nr : n)*num/den : 0.0; + } + + /*! + * Returns a two-sided biweight midvariance (BWMV) for a subset of pixel + * samples. + * + * \param center Reference center value in the [0,1] range. Normally, the + * median of the selected pixel samples should be used. + * + * \param sigma Reference estimates of dispersion in the [0,1] range, + * respectively for samples below and above the reference \a center + * value (low and high members of the TwoSidedEstimate structure, + * respectively). Normally, a two-sided median absolute deviation + * from the median (two-sided MAD) for the selected pixel samples + * should be specified. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * See the BiweightMidvariance() member function for more information and + * references. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( double center, const TwoSidedEstimate& sigma, int k = 9, bool reducedLength = false, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + double kd0 = k * sigma.low; + double kd1 = k * sigma.high; + if ( kd0 < 0 || 1 + kd0 == 1 || kd1 < 0 || 1 + kd1 == 1 ) + { + m_status += N; + return 0; + } + + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing two-sided biweight midvariance", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new TwoSidedBWMVThread( *this, center, kd0, kd1, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( TwoSidedBWMVThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( TwoSidedBWMVThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double num0 = 0, den0 = 0, num1 = 0, den1 = 0; + size_type n0 = 0, n1 = 0, nr0 = 0, nr1 = 0; + for ( const TwoSidedBWMVThread& thread : threads ) + { + num0 += thread.num0; + den0 += thread.den0; + num1 += thread.num1; + den1 += thread.den1; + n0 += thread.n0; + n1 += thread.n1; + nr0 += thread.nr0; + nr1 += thread.nr1; + } + + threads.Destroy(); + + m_status += N; + + den0 *= den0; + den1 *= den1; + return { (n0 >= 2 && 1 + den0 != 1) ? (reducedLength ? nr0 : n0)*num0/den0 : 0.0, + (n1 >= 2 && 1 + den1 != 1) ? (reducedLength ? nr1 : n1)*num1/den1 : 0.0 }; + } + + /*! + * Returns a percentage bend midvariance (PBMV) for a subset of pixel + * samples. + * + * \param center Reference center value in the [0,1] range. Normally, the + * median of the selected pixel samples should be used. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the + * breakdown point of the estimator) at the expense of lower + * efficiency. The default value is beta=0.2. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * This member function returns PBMV in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns a PBMV for the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the percentage bend midvariance. + * + * \b References + * + * Rand R. Wilcox (2012), Introduction to Robust Estimation and Hypothesis + * Testing, 3rd Edition, Elsevier Inc., Section 3.12.3. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double BendMidvariance( double center, double beta = 0.2, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing percentage bend midvariance", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new DSmpThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( DSmpThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( DSmpThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + Array values; + for ( DSmpThread& thread : threads ) + if ( !thread.values.IsEmpty() ) + { + values.Add( thread.values.Begin(), thread.values.At( thread.n ) ); + thread.values.Clear(); + } + + threads.Destroy(); + + double pbmv = pcl::BendMidvariance( values.Begin(), values.End(), center, beta ); + m_status += N; + return pbmv; + } + + /*! + * Sn scale estimator of Rousseeuw and Croux for a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * For a sample {x0,...,x_n-1}, the Sn estimator is given by: + * + * Sn = c * low_median( high_median( |x_i - x_j| ) ) + * + * where low_median() is the order statistic of rank (n + 1)/2, and + * high_median() is the order statistic of rank n/2 + 1. + * + * This member function returns Sn in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the Sn estimator of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the Sn estimator. + * + * The constant c = 1.1926 must be used to make the Sn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median Absolute + * Deviation, Journal of the American Statistical Association, Vol. 88, + * pp. 1273-1283. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Sn( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing Sn scale estimate", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new DSmpThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( DSmpThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( DSmpThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + Array values; + for ( DSmpThread& thread : threads ) + if ( !thread.values.IsEmpty() ) + { + values.Add( thread.values.Begin(), thread.values.At( thread.n ) ); + thread.values.Clear(); + } + + threads.Destroy(); + + double sn = pcl::Sn( values.Begin(), values.End() ); + m_status += N; + return sn; + } + + /*! + * Qn scale estimator of Rousseeuw and Croux for a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * For a sample {x0,...,x_n-1}, the Qn estimator is given by: + * + * Qn = c * first_quartile( |x_i - x_j| : i < j ) + * + * where first_quartile() is the order statistic of rank (n + 1)/4. + * + * This member function returns Qn in the normalized range [0,1], + * irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the Qn estimator of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the Qn estimator. + * + * The constant c = 2.2219 must be used to make the Qn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median Absolute + * Deviation, Journal of the American Statistical Association, Vol. 88, + * pp. 1273-1283. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Qn( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing Qn scale estimate", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new DSmpThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( DSmpThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( DSmpThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + Array values; + for ( DSmpThread& thread : threads ) + if ( !thread.values.IsEmpty() ) + { + values.Add( thread.values.Begin(), thread.values.At( thread.n ) ); + thread.values.Clear(); + } + + threads.Destroy(); + + double qn = pcl::Qn( values.Begin(), values.End() ); + m_status += N; + return qn; + } + + /*! + * Returns the norm of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The norm is the sum of all selected pixel sample values. This member + * function returns the norm in the normalized range [0,1], irrespective of + * the sample data type of the image. + * + * For real-valued integer images, this function returns the sum of all + * selected samples converted to the normalized range [0,1]. + * + * For floating-point real images, this function simply sums all selected + * samples, assuming that no selected samples have negative values. If there + * are some negative values, the returned value may make not sense, + * depending on the application. + * + * For complex-valued images, this function returns the sum of the + * magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the norm. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Norm( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing norm", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + for ( const SumThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + } + + threads.Destroy(); + m_status += N; + return (1 + s != 1) ? s : 0.0; // don't return insignificant nonzero values + } + + /*! + * Returns the modulus of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * The modulus is the sum of the absolute values of all selected pixel + * sample values. This member function returns the modulus in the normalized + * range [0,1], irrespective of the sample data type of the image. + * + * This member function only makes sense for real-valued floating point + * images. For the rest of image types, including unsigned integer and + * complex valued images, this function is always equivalent to Norm(). + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the modulus. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double Modulus( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing modulus", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumAbsThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumAbsThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumAbsThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + for ( const SumAbsThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + } + + threads.Destroy(); + m_status += N; + return (1 + s != 1) ? s : 0.0; // don't return insignificant nonzero values + } + + /*! + * Returns the sum of the squares of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the sum of squares in the normalized range + * [0,1], irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the sum of the + * squares of the magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the sum of squares. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double SumOfSquares( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing sum of squares", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumSqrThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumSqrThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumSqrThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + for ( const SumSqrThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + } + + threads.Destroy(); + m_status += N; + return (1 + s != 1) ? s : 0.0; // don't return insignificant nonzero values + } + + /*! + * Returns the mean of the squares of a subset of pixel samples. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This member function returns the mean of squares in the normalized range + * [0,1], irrespective of the sample data type of the image. + * + * For complex-valued images, this function returns the mean of the + * squares of the magnitudes (or absolute values) of all selected samples. + * + * If range clipping is enabled for this image, only pixel samples within + * the current clipping range will be taken into account for calculation of + * the mean of squares. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + double MeanOfSquares( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing mean of squares", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SumSqrThread( *this, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( SumSqrThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( SumSqrThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + double s = 0; + double e = 0; + size_type n = 0; + for ( const SumSqrThread& thread : threads ) + { + double y = thread.s - e; + double t = s + y; + e = (t - s) - y; + s = t; + n += thread.n; + } + + threads.Destroy(); + + m_status += N; + + if ( n < 1 ) + return 0; + return s/n; + } + + /*! + * Returns a vector of norms for a subset of pixel samples. + * + * \param maxDegree Maximum degree ≥ 1 of the computed vector of + * norms. The default value is 2, hence the L1 and L2 norms are + * computed if this parameter is not specified. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + * + * This function computes a series of image norms, up to \a maxDegree, in a + * single multithreaded operation for improved efficiency. The norms are + * returned as a vector. The first vector component is the L1 norm, which is + * the sum of all selected pixel sample values. The second vector component + * is the L2 norm, or the sum of squared pixel sample values, and so on. + * + * For the sake of performance, this function assumes that no negative + * values exist in the selected subset of pixel samples; otherwise, odd + * norms will provide meaningless results. All norms are returned expressed + * in the normalized range [0,1], irrespective of the sample data type of + * the image. + * + * This function implements a numerically stable summation algorithm to + * reduce roundoff errors to the machine's floating point precision. + * + * See the Norm() and SumOfSquares() member functions for more information + * and important implementation details. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + */ + Vector Norms( int maxDegree = 2, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + PCL_PRECONDITION( maxDegree > 0 ) + maxDegree = pcl::Max( 1, maxDegree ); + + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return 0; + + size_type N = size_type( r.Width() )*size_type( r.Height() )*(1 + lastChannel - firstChannel); + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing norms", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + bool useAffinity = m_parallel && Thread::IsRootThread(); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new NormThread( *this, maxDegree, r, firstChannel, lastChannel, n, n + int( L[i] ) ) ); + if ( threads.Length() > 1 ) + { + int n = 0; + for ( NormThread& thread : threads ) + thread.Start( ThreadPriority::DefaultMax, useAffinity ? n++ : -1 ); + for ( NormThread& thread : threads ) + thread.Wait(); + } + else + threads[0].Run(); + + Vector R( 0.0, maxDegree ); + Vector e( 0.0, maxDegree ); + for ( const NormThread& thread : threads ) + for ( int i = 0; i < maxDegree; ++i ) + { + double y = thread.R[i] - e[i]; + double t = R[i] + y; + e[i] = (t - R[i]) - y; + R[i] = t; + } + for ( int i = 0; i < maxDegree; ++i ) + if ( 1 + R[i] == 1 ) // don't return insignificant nonzero values + R[i] = 0; + + threads.Destroy(); + m_status += N; + return R; + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for the specified + * \a channel of this image. + * + * This function calls pcl::Hash64() for the internal pixel sample buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + */ + uint64 Hash64( int channel = -1, uint64 seed = 0 ) const noexcept + { + if ( !ParseChannel( channel ) ) + return 0; + return pcl::Hash64( m_channelData( channel ), ChannelSize(), seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for the specified + * \a channel of this image. + * + * This function calls pcl::Hash32() for the internal pixel sample buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + * + * For information on the rest of parameters of this member function, see + * the documentation for Fill(). + */ + uint32 Hash32( int channel = -1, uint32 seed = 0 ) const noexcept + { + if ( !ParseChannel( channel ) ) + return 0; + return pcl::Hash32( m_channelData( channel ), ChannelSize(), seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for the specified + * \a channel of this image. This function is a synonym for Hash64(). + */ + uint64 Hash( int channel = -1, uint64 seed = 0 ) const noexcept + { + return Hash64( channel, seed ); + } + + // ------------------------------------------------------------------------- + + /*! + * Writes a subset of pixel samples to a raw-storage output stream. Returns + * a reference to this image. + * + * \param file Output stream to write to. + * + * The generated raw-storage can be used to generate a new image with the + * Read() member function. + * + * \note Increments the status monitoring object by the number of pixel + * samples written to the specified \a file. + * + * \note This member function, together with the Read() function, implements + * a lightweight image reading/writing system with limited error detection + * and handling capabilities. For more powerful and sophisticated ways to + * serialize image data, see the ImageVariant class. + */ + GenericImage& Write( File& file, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return const_cast( *this ); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + int numberOfChannels = 1 + lastChannel - firstChannel; + + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Writing to raw-storage image stream", N*numberOfChannels ); + + file.WriteUI32( r.Width() ); + file.WriteUI32( r.Height() ); + file.WriteUI32( numberOfChannels ); + file.WriteUI32( (firstChannel == 0 && lastChannel >= 2) ? m_colorSpace : ColorSpace::Gray ); + + if ( r == Bounds() ) + { + for ( int i = firstChannel; i <= lastChannel; ++i, m_status += N ) + file.Write( (const void*)m_pixelData[i], fsize_type( ChannelSize() ) ); + } + else + { + for ( int i = firstChannel, w = r.Width(), h = r.Height(); i <= lastChannel; ++i ) + { + const sample* p = PixelAddress( r.LeftTop(), i ); + for ( int j = 0; j < h; ++j, p += m_width, m_status += w ) + file.Write( (const void*)p, w*BytesPerSample() ); + } + } + + return const_cast( *this ); + } + + /*! + * Writes a subset of pixel samples to a raw-storage file. Returns a + * reference to this image. + * + * \param filePath File path where a new file will be created with pixel + * data from this image. + * + * This member function is just a wrapper to the more general version: + * Write( File&, const Rect&, int, int ). + */ + GenericImage& Write( const String& filePath, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + File file = File::CreateFileForWriting( filePath ); + return Write( file, rect, firstChannel, lastChannel ); + } + + /*! + * Reads an image from a raw-storage stream. Returns a reference to this + * image. + * + * \param file Input stream to read from. + * + * If this object uniquely references its pixel data, then the previously + * existing pixel data are destroyed, deallocated, and replaced with a newly + * allocated local or shared image, preserving the storage space of this + * instance. + * + * The input stream must provide pixel sample values in the sample data type + * of this image. The sample data type of an image is invariantly defined by + * its template instantiation, and thus cannot be changed. If the image + * stored in the input stream uses a different sample data type than this + * image, this function will lead to unpredictable results, most likely an + * exception being thrown by the stream I/O routines. + * + * If this object is not unique, then the previously referenced pixel data + * are dereferenced, and a newly created local image is uniquely referenced + * by this object. + * + * All image selections are reset to the default full selection after + * calling this function. + * + * The data read from the specified \a file should have been generated by a + * previous call to Write(). + * + * \note Increments the status monitoring object by the number of pixel + * samples read from the specified \a file. + * + * \note This function, together with the Write() function, implements a + * lightweight image reading/writing system with limited error detection and + * handling capabilities. For more powerful and sophisticated ways to + * serialize image data, see the ImageVariant class. + */ + GenericImage& Read( File& file ) + { + int width, height, numberOfChannels, colorSpace; + file.ReadUI32( width ); + file.ReadUI32( height ); + file.ReadUI32( numberOfChannels ); + file.ReadUI32( colorSpace ); + + AllocateData( width, height, numberOfChannels, color_space( colorSpace ) ); + + ResetSelections(); + + size_type N = NumberOfPixels(); + if ( N > 0 ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Reading from raw-storage image stream", N*m_numberOfChannels ); + for ( int i = 0; i < m_numberOfChannels; ++i, m_status += N ) + file.Read( (void*)m_pixelData[i], fsize_type( ChannelSize() ) ); + } + + return *this; + } + + /*! + * Reads an image from a raw-storage file. Returns a reference to this + * image. + * + * \param filePath Path to an existing file from which new pixel data will + * be read. The contents of the existing file will not be + * modified in any way. + * + * This member function is just a wrapper to the more general version: + * Read( File& ). + */ + GenericImage& Read( const String& filePath ) + { + File file = File::OpenFileForReading( filePath ); + return Read( file ); + } + + // ------------------------------------------------------------------------- + + /*! + * Crops or extends the entire image by applying the specified margins. + * Returns a reference to this image. + * + * \param left Left margin in pixels. + * + * \param top Top margin in pixels. + * + * \param right Right margin in pixels. + * + * \param bottom Bottom margin in pixels. + * + * \param fillValues %Vector of filling sample values for extended areas, + * used when one or more margins are greater than zero. + * Each vector component is used for its corresponding + * channel (e.g., the first component is used to fill the + * red channel of an RGB image, the second component to + * fill the green channel, etc.). If there are less vector + * components than channels in the image, the minimum + * sample value in the native range of the image (usually + * zero or black) is used for the missing filling values. + * The default parameter value is an empty vector, so the + * extended areas are filled with black by default. + * + * Negative margins crop the image at their respective sides. Positive + * margin values add extra space. + * + * \note Increments the status monitoring object by the area in square + * pixels of the cropping rectangle. + */ + template + GenericImage& CropBy( int left, int top, int right, int bottom, const GenericVector& fillValues ) + { + if ( left == 0 && top == 0 && right == 0 && bottom == 0 ) + return *this; + + if ( m_width+left+right <= 0 || m_height+top+bottom <= 0 ) + { + FreeData(); + return *this; + } + + Rect r( -left, -top, m_width+right, m_height+bottom ); + int width = r.Width(); + int height = r.Height(); + + if ( !Intersects( r ) ) + return AllocateData( width, height, m_numberOfChannels, m_colorSpace ).Fill( fillValues ); + + size_type N = size_type( width )*size_type( height ); + + EnsureUnique(); + + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( String().Format( "Crop margins: %+d, %+d, %+d, %+d", + left, top, right, bottom ), N*m_numberOfChannels ); + + sample** newData = nullptr; + + try + { + newData = m_allocator.AllocateChannelSlots( m_numberOfChannels ); + + for ( int c = 0; c < m_numberOfChannels; ++c, m_status += N ) + { + sample* __restrict__ f = newData[c] = m_allocator.AllocatePixels( N ); + sample v = (c < fillValues.Length()) ? P::ToSample( fillValues[c] ) : P::MinSampleValue(); + + for ( int i = r.y0, j; i < r.y1; ) + { + for ( ; i < 0; ++i ) + { + PCL_IVDEP + for ( int j = 0; j < width; ++j ) + *f++ = v; + } + + PCL_IVDEP + for ( j = r.x0; j < 0; ++j ) + *f++ = v; + + for ( const sample* f0 = PixelAddress( j, i, c ); j < r.x1; ) + { + *f++ = *f0++; + if ( ++j == m_width ) + { + PCL_IVDEP + for ( ; j < r.x1; ++j ) + *f++ = v; + } + } + + if ( ++i == m_height ) + for ( ; i < r.y1; ++i ) + { + PCL_IVDEP + for ( int j = 0; j < width; ++j ) + *f++ = v; + } + } + } + + try + { + for ( int c = 0; c < m_numberOfChannels; ++c ) + { + m_allocator.Deallocate( m_pixelData[c] ); + m_pixelData[c] = newData[c]; + } + m_allocator.Deallocate( newData ); + newData = nullptr; + + m_allocator.SetSharedGeometry( m_width = width, m_height = height, m_numberOfChannels ); + + ResetPoint(); + ResetSelection(); + return *this; + } + catch ( ... ) + { + m_data->Deallocate(); + ResetSelections(); + throw; + } + } + catch ( ... ) + { + if ( newData != nullptr ) + { + for ( int i = 0; i < m_numberOfChannels; ++i ) + if ( newData[i] != nullptr ) + m_allocator.Deallocate( newData[i] ), newData[i] = nullptr; + m_allocator.Deallocate( newData ); + } + throw; + } + } + + /*! + * Crops or extends the entire image by applying the specified margins, + * filling extended regions with the minimum sample value in the native + * range of the image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * CropBy( left, top, right, bottom, sample_vector() ); + * \endcode + */ + GenericImage& CropBy( int left, int top, int right, int bottom ) + { + return CropBy( left, top, right, bottom, sample_vector() ); + } + + /*! + * Crops the image to the specified rectangular region. Returns a reference + * to this image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * CropBy( -rect.x0, -rect.y0, rect.x1 - m_width, rect.y1 - m_height, fillValues ); + * \endcode + */ + template + GenericImage& CropTo( const Rect& rect, const GenericVector& fillValues ) + { + Rect r = rect.Ordered(); + return CropBy( -r.x0, -r.y0, r.x1 - m_width, r.y1 - m_height, fillValues ); + } + + /*! + * Crops the image to the specified rectangular region, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * CropTo( rect, sample_vector() ); + * \endcode + */ + GenericImage& CropTo( const Rect& rect ) + { + return CropTo( rect, sample_vector() ); + } + + /*! + * Crops the image to the specified rectangular region. Returns a reference + * to this image. + * + * This member function is equivalent to: + * + * \code + * CropTo( Rect( x0, y0, x1, y1 ), fillValues ); + * \endcode + */ + template + GenericImage& CropTo( int x0, int y0, int x1, int y1, const GenericVector& fillValues ) + { + return CropTo( Rect( x0, y0, x1, y1 ), fillValues ); + } + + /*! + * Crops the image to the specified rectangular region, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * CropTo( x0, y0, x1, y1, sample_vector() ); + * \endcode + */ + GenericImage& CropTo( int x0, int y0, int x1, int y1 ) + { + return CropTo( x0, y0, x1, y1, sample_vector() ); + } + + /*! + * Crops the image to its current rectangular selection. Returns a reference + * to this image. + * + * This member function is equivalent to: + * + * \code + * CropTo( SelectedRectangle(), fillValues ); + * \endcode + */ + template + GenericImage& Crop( const GenericVector& fillValues ) + { + return CropTo( m_rectangle, fillValues ); + } + + /*! + * Crops the image to its current rectangular selection, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Crop( sample_vector() ); + * \endcode + */ + GenericImage& Crop() + { + return Crop( sample_vector() ); + } + + /*! + * Shifts (translates) this image by the specified increments in pixels. + * Returns a reference to this image. + * + * \param dx Horizontal displacement in pixels. + * + * \param dy Vertical displacement in pixels. + * + * \param fillValues %Vector of filling sample values for extended areas. + * See the documentation for CropBy() for more + * information. + * + * Positive increment values shift the image toward the right and bottom + * sides. Negative increments shift toward the left and top sides. + * + * This member function is equivalent to: + * + * \code + * CropBy( dx, dy, -dx, -dy, fillValues ); + * \endcode + */ + template + GenericImage& ShiftBy( int dx, int dy, const GenericVector& fillValues ) + { + return CropBy( dx, dy, -dx, -dy, fillValues ); + } + + /*! + * Shifts (translates) this image by the specified increments in pixels, + * filling extended regions with the minimum sample value in the native + * range of the image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftBy( dx, dy, sample_vector() ); + * \endcode + */ + GenericImage& ShiftBy( int dx, int dy ) + { + return ShiftBy( dx, dy, sample_vector() ); + } + + /*! + * Shifts (translates) the image to the specified coordinates. Returns a + * reference to this image. + * + * A synonym for ShiftBy( int, int, sample ). + */ + template + GenericImage& ShiftTo( int x, int y, const GenericVector& fillValues ) + { + return ShiftBy( x, y, fillValues ); + } + + /*! + * Shifts (translates) the image to the specified coordinates, filling + * extended regions with the minimum sample value in the native range of the + * image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftTo( x, y, sample_vector() ); + * \endcode + */ + GenericImage& ShiftTo( int x, int y ) + { + return ShiftTo( x, y, sample_vector() ); + } + + /*! + * Shifts (translates) the image to the specified coordinates. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftBy( p.x, p.y, fillValues ); + * \endcode + */ + template + GenericImage& ShiftTo( const Point& p, const GenericVector& fillValues ) + { + return ShiftBy( p.x, p.y, fillValues ); + } + + /*! + * Shifts (translates) the image to the specified coordinates, filling + * extended regions with the minimum sample value in the native range of the + * image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftTo( p, sample_vector() ); + * \endcode + */ + GenericImage& ShiftTo( const Point& p ) + { + return ShiftTo( p, sample_vector() ); + } + + /*! + * Extends or crops the image centered within the specified \a width and + * \a height in pixels. Returns a reference to this image. + */ + template + GenericImage& ShiftToCenter( int width, int height, const GenericVector& fillValues ) + { + int dx2 = (width - m_width) >> 1; + int dy2 = (height - m_height) >> 1; + return CropBy( dx2, dy2, width-m_width-dx2, height-m_height-dy2, fillValues ); + } + + /*! + * Extends or crops the image centered within the specified \a width and + * \a height in pixels, filling extended regions with the minimum sample + * value in the native range of the image. Returns a reference to this + * image. + * + * This member function is equivalent to: + * + * \code + * ShiftToCenter( width, height, sample_vector() ); + * \endcode + */ + GenericImage& ShiftToCenter( int width, int height ) + { + return ShiftToCenter( width, height, sample_vector() ); + } + + /*! + * Extends or crops the image at its right and bottom sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + */ + template + GenericImage& ShiftToTopLeft( int width, int height, const GenericVector& fillValues ) + { + int dx = width - m_width; + int dy = height - m_height; + return CropBy( 0, 0, dx, dy, fillValues ); + } + + /*! + * Extends or crops the image at its right and bottom sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftToTopLeft( width, height, sample_vector() ); + * \endcode + */ + GenericImage& ShiftToTopLeft( int width, int height ) + { + return ShiftToTopLeft( width, height, sample_vector() ); + } + + /*! + * Extends or crops the image at its left and bottom sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + */ + template + GenericImage& ShiftToTopRight( int width, int height, const GenericVector& fillValues ) + { + int dx = width - m_width; + int dy = height - m_height; + return CropBy( dx, 0, 0, dy, fillValues ); + } + + /*! + * Extends or crops the image at its left and bottom sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftToTopRight( width, height, sample_vector() ); + * \endcode + */ + GenericImage& ShiftToTopRight( int width, int height ) + { + return ShiftToTopRight( width, height, sample_vector() ); + } + + /*! + * Extends or crops the image at its right and top sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + */ + template + GenericImage& ShiftToBottomLeft( int width, int height, const GenericVector& fillValues ) + { + int dx = width - m_width; + int dy = height - m_height; + return CropBy( 0, dy, dx, 0, fillValues ); + } + + /*! + * Extends or crops the image at its right and top sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftToBottomLeft( width, height, sample_vector() ); + * \endcode + */ + GenericImage& ShiftToBottomLeft( int width, int height ) + { + return ShiftToBottomLeft( width, height, sample_vector() ); + } + + /*! + * Extends or crops the image at its left and top sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + */ + template + GenericImage& ShiftToBottomRight( int width, int height, const GenericVector& fillValues ) + { + int dx = width - m_width; + int dy = height - m_height; + return CropBy( dx, dy, 0, 0, fillValues ); + } + + /*! + * Extends or crops the image at its left and top sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftToBottomRight( width, height, sample_vector() ); + * \endcode + */ + GenericImage& ShiftToBottomRight( int width, int height ) + { + return ShiftToBottomRight( width, height, sample_vector() ); + } + + /*! + * Shifts (translates) the image to its current anchor point selection. + * Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * ShiftTo( SelectedPoint(), fillValues ); + * \endcode + */ + template + GenericImage& Shift( const GenericVector& fillValues ) + { + return ShiftTo( m_point, fillValues ); + } + + /*! + * Shifts (translates) the image to its current anchor point selection, + * filling extended regions with the minimum sample value in the native + * range of the image. Returns a reference to this image. + * + * This member function is equivalent to: + * + * \code + * Shift( sample_vector() ); + * \endcode + */ + GenericImage& Shift() + { + return Shift( sample_vector() ); + } + + // ------------------------------------------------------------------------- + + /*! + * Converts the image to the specified color space. Returns a reference to + * this object. + * + * \param colorSpace Specifies a color space to convert the image to. See + * the ColorSpace namespace for symbolic constants + * corresponding to all supported color spaces in this + * version of PCL. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * Color space conversion is performed in the current RGB working space + * (RGBWS) associated with this image. + * + * This function operates on the entire image; current selections are + * neither used nor modified (except the channel range selection, which is + * reset to defaults when the color space conversion involves a change in + * the number of nominal channels). Existing alpha channels are never + * modified by this member function. + * + * Before performing the requested color space conversion, this function + * ensures that the image data is uniquely referenced by this object. If + * necessary, the previously referenced data are dereferenced (and destroyed + * immediately if they become unreferenced), and a new local image is + * allocated and referenced. + * + * \note Increments the status monitoring object by the number of pixels + * (\e not samples) in the image. + */ + GenericImage& SetColorSpace( color_space colorSpace, int maxProcessors = 0 ) + { + size_type N = NumberOfPixels(); + if ( N == 0 ) + return *this; + + if ( colorSpace == m_colorSpace ) + { + m_status += N; + return *this; + } + + EnsureUnique(); + + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "In-place color space conversion: " + + ColorSpace::Name( m_colorSpace ) + + " -> " + + ColorSpace::Name( colorSpace ), N ); + + int n = m_numberOfChannels; + + if ( m_colorSpace == ColorSpace::Gray ) + { + sample** oldData = m_pixelData; + sample** newData = nullptr; + + try + { + // Make room for the G and B channels. + newData = m_allocator.AllocateChannelSlots( 2+n ); + + // Put the nominal gray channel into the R slot + newData[0] = oldData[0]; + + // Allocate and copy the G and B channels + newData[1] = m_allocator.AllocatePixels( N ); + ::memcpy( newData[1], oldData[0], ChannelSize() ); + newData[2] = m_allocator.AllocatePixels( N ); + ::memcpy( newData[2], oldData[0], ChannelSize() ); + + // Put existing alpha channels in their corresponding slots + for ( int i = 1; i < n; ++i ) + newData[i+2] = oldData[i]; + + try + { + m_pixelData = newData; + newData = nullptr; + m_numberOfChannels += 2; + m_colorSpace = ColorSpace::RGB; + m_data->UpdateSharedImage(); + + ResetChannelRange(); + + m_allocator.Deallocate( oldData ); + } + catch ( ... ) + { + m_data->Deallocate(); + ResetSelections(); + throw; + } + } + catch ( ... ) + { + if ( newData != nullptr ) + { + newData[0] = nullptr; + if ( newData[1] != nullptr ) + m_allocator.Deallocate( newData[1] ), newData[1] = nullptr; + if ( newData[2] != nullptr ) + m_allocator.Deallocate( newData[2] ), newData[2] = nullptr; + m_allocator.Deallocate( newData ); + throw; + } + } + + if ( colorSpace == ColorSpace::RGB ) + { + m_status += N; + return *this; + } + + n += 2; + } + + Array L = Thread::OptimalThreadLoads( N, + 16u/*overheadLimit*/, + m_parallel ? ((maxProcessors > 0) ? maxProcessors : m_maxProcessors) : 1 ); + ThreadData data( *this, N ); + ReferenceArray threads; + for ( size_type i = 0, n = 0; i < L.Length(); n += L[i++] ) + threads.Add( new ColorSpaceConversionThread( *this, data, colorSpace, n, n + L[i] ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + + if ( colorSpace == ColorSpace::Gray ) + { + sample** oldData = m_pixelData; + sample** newData = nullptr; + + try + { + newData = m_allocator.AllocateChannelSlots( n-2 ); + newData[0] = oldData[0]; + for ( int i = 3; i < n; ++i ) + newData[i-2] = oldData[i]; + + m_pixelData = newData; + newData = nullptr; + m_numberOfChannels -= 2; + m_colorSpace = ColorSpace::Gray; + m_data->UpdateSharedImage(); + + ResetChannelRange(); + + m_allocator.Deallocate( oldData[1] ); + m_allocator.Deallocate( oldData[2] ); + m_allocator.Deallocate( oldData ); + } + catch ( ... ) + { + m_data->Deallocate(); + ResetSelections(); + if ( newData != nullptr ) + m_allocator.Deallocate( newData ); + throw; + } + } + else + { + m_allocator.SetSharedColor( m_colorSpace = colorSpace, m_RGBWS ); + } + + return *this; + } + + // ------------------------------------------------------------------------- + + /*! + * Computes the CIE Y component for a subset of pixel samples and stores it + * in a grayscale image. + * + * \param[out] Y Reference to a destination image, where the computed + * CIE Y component will be stored. This image can be an + * instance of any supported %GenericImage template + * instantiation; all the necessary data type conversions + * are carried out transparently. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * This member function computes the Y component of the CIE XYZ space. CIE Y + * component values are calculated in the RGB working space (RGBWS) + * currently associated with the image. + * + * If this image is in the grayscale color space, gray source samples are + * simply copied to the destination image, after conversion to the + * destination sample data type, if necessary, using pixel traits + * primitives. + * + * If this image is in the CIE XYZ color space, samples from the luminance + * channel (source channel #1) are simply copied to the destination image, + * after conversion to the destination sample data type, if necessary. + * + * For other color spaces, CIE Y values are obtained by means of the + * simplest possible intermediate transformation (usually to the CIE XYZ + * space), converted to the destination sample data type if necessary, and + * transferred to the destination image. + * + * The luminance is computed for the specified subset of pixel samples, or + * for the current rectangular selection, depending on parameter values. For + * more information on the rest of parameters of this function, see the + * documentation for Fill(). The current channel range selection is always + * ignored by this function. + * + * The previous contents of the destination image will be dereferenced (and + * immediately destroyed if they become unreferenced) and replaced with the + * computed, uniquely referenced CIE Y data. The destination image will be + * in the grayscale color space; it will have a single channel corresponding + * to the luminance of the specified pixel sample subset in this image. The + * dimensions of the destination image will be the same ones of the + * specified pixel sample subset, and it will be associated with the same + * RGBWS as this image. + * + * \note In general, computing luminance components as integer values is an + * error. The GenericPixelTraits instantiation P1 should correspond to a + * floating point real pixel sample type, either \c float or \c double, + * depending on the source data type. The recommended types are:\n + * \n + * \li FloatPixelTraits for 8-bit and 16-bit integer images, as well as for + * 32-bit floating point real and complex images.\n + * \li DoublePixelTraits for 32-bit integer images, as well as for 64-bit + * floating point real and complex images. + * + * \note Increments the status monitoring object by the number of selected + * pixel samples. + * + * \warning Please note that the computed lightness is meaningful as such + * \e exclusively in the RGB working space of this image. + */ + template + void GetLuminance( GenericImage& Y, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseRect( r ) ) + { + Y.FreeData(); + return; + } + + Y.AllocateData( r ); + if ( !Y.IsShared() ) + Y.SetRGBWorkingSpace( m_RGBWS ); + + size_type N = Y.NumberOfPixels(); + + if ( m_colorSpace == ColorSpace::Gray || m_colorSpace == ColorSpace::CIEXYZ ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Transferring pixel data", N ); + + typename GenericImage::sample* __restrict__ g = *Y; + int cY = (m_colorSpace == ColorSpace::Gray) ? 0 : 1; + if ( r == Bounds() ) + { + const sample* __restrict__ f = m_pixelData[cY]; + P1::Copy( g, f, N ); + } + else + { + const sample* __restrict__ f = PixelAddress( r.LeftTop(), cY ); + for ( int i = 0; i < Y.Height(); ++i, f += m_width, g += Y.Width() ) + P1::Copy( g, f, Y.Width() ); + } + + m_status += N; + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing CIE Y component", N ); + + Array L = OptimalThreadRows( Y.Height(), Y.Width(), maxProcessors ); + ThreadData data( *this, N ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new GetLuminanceThread( Y, *this, data, r, n, n + int( L[i] ) ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + } + } + + /*! + * Computes the CIE Y component for a subset of pixel samples and stores it + * in a grayscale image, transported by an ImageVariant object. + * + * If the specified %ImageVariant does not transport an image, a new + * floating point image will be created with the appropriate sample type + * (either 32-bit or 64-bit floating point, depending on the sample data + * type of this image). + */ + void GetLuminance( ImageVariant& Y, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const; + // Implemented in pcl/ImageVariant.h + + /*! + * Computes the CIE L* component for a subset of pixel samples and stores it + * in a grayscale image. + * + * \param[out] L Reference to a destination image, where the computed + * CIE L* component will be stored. This image can be an + * instance of any supported %GenericImage template + * instantiation; all the necessary data type conversions + * are carried out transparently. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * This member function computes the L* component of the CIE L*a*b* space. + * CIE L* component values are calculated in the RGB working space (RGBWS) + * currently associated with this image. + * + * If this image is in the grayscale color space, gray source samples are + * simply copied to the destination image, after conversion to the + * destination sample data type, if necessary, using pixel traits + * primitives. + * + * If this image is in the CIE L*a*b* color space, samples from the + * lightness channel (source channel #0) are simply copied to the + * destination image, after conversion to the destination sample data type, + * if necessary. + * + * For other color spaces, CIE L* values are obtained by means of the + * simplest possible intermediate transformation (usually to the CIE L*a*b* + * space), converted to the destination sample data type if necessary, and + * transferred to the destination image. + * + * The lightness is computed for the specified subset of pixel samples, or + * for the current rectangular selection, depending on parameter values. For + * more information on the rest of parameters of this function, see the + * documentation for Fill(). The current channel range selection is always + * ignored by this function. + * + * The previous contents of the destination image will be dereferenced (and + * immediately destroyed if they become unreferenced) and replaced with the + * computed, uniquely referenced CIE L* data. The destination image will be + * in the grayscale color space; it will have a single channel corresponding + * to the lightness of the specified pixel sample subset in this image. The + * dimensions of the destination image will be the same ones of the + * specified pixel sample subset, and it will be associated with the same + * RGBWS as this image. + * + * \note In general, computing lightness components as integer values is an + * error. The GenericPixelTraits instantiation P1 should correspond to a + * floating point real pixel sample type, either \c float or \c double, + * depending on the source data type. The recommended types are:\n + * \n + * \li FloatPixelTraits for 8-bit and 16-bit integer images, as well as for + * 32-bit floating point real and complex images.\n + * \li DoublePixelTraits for 32-bit integer images, as well as for 64-bit + * floating point real and complex images. + * + * \note Increments the status monitoring object by the number of modified + * pixels (\e not samples). + * + * \warning Please note that the computed lightness is meaningful as such + * \e exclusively in the RGB working space of this image. + */ + template + void GetLightness( GenericImage& L, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseRect( r ) ) + { + L.FreeData(); + return; + } + + L.AllocateData( r ); + if ( !L.IsShared() ) + L.SetRGBWorkingSpace( m_RGBWS ); + + size_type N = L.NumberOfPixels(); + + if ( m_colorSpace == ColorSpace::Gray || m_colorSpace == ColorSpace::CIELab || m_colorSpace == ColorSpace::CIELch ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Transferring pixel data", N ); + + typename GenericImage::sample* g = *L; + if ( r == Bounds() ) + { + const sample* __restrict__ f = *m_pixelData; + P1::Copy( g, f, N ); + } + else + { + const sample* __restrict__ f = PixelAddress( r.LeftTop() ); + for ( int i = 0; i < L.Height(); ++i, f += m_width, g += L.Width() ) + P1::Copy( g, f, L.Width() ); + } + + m_status += N; + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing CIE L* component", N ); + + Array R = OptimalThreadRows( L.Height(), L.Width(), maxProcessors ); + ThreadData data( *this, N ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( R.Length() ); n += int( R[i++] ) ) + threads.Add( new GetLightnessThread( L, *this, data, r, n, n + int( R[i] ) ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + } + } + + /*! + * Computes the CIE L* component for a subset of pixel samples and stores it + * in a grayscale image, transported by an ImageVariant object. + * + * If the specified %ImageVariant does not transport an image, a new + * floating point image will be created with the appropriate sample type + * (either 32-bit or 64-bit floating point, depending on the sample data + * type of this image). + */ + void GetLightness( ImageVariant& L, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const; + // Implemented in pcl/ImageVariant.h + + /*! + * Computes the intensity HSI component for a subset of pixel samples and + * stores it in a grayscale image. + * + * \param[out] I Reference to a destination image, where the computed + * intensity component will be stored. This image can be + * an instance of any supported %GenericImage template + * instantiation; all the necessary data type conversions + * are carried out transparently. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * This member function computes the I intensity component in the HSI color + * ordering scheme. The intensity is useful for applications where a + * colorimetrically correct component, such as luminance or lightness, is + * not necessary. For example, the intensity component can be used for + * feature detection (e.g., star detection) on RGB color images. + * + * The intensity component I of an RGB pixel is given by: + * + *
+    * I = (Max(R,G,B) + Min(R,G,B))/2
+    * 
+ * + * where R, G and B are the red, green and blue components of the RGB pixel, + * respectively. + * + * If this image is in the grayscale or HSI spaces, gray or intensity source + * samples are simply copied to the destination image, after conversion to + * the destination sample data type, if necessary, using pixel traits + * primitives. + * + * If this image is in the RGB color space, the intensity components for + * each pixel is calculated as described above. For other color spaces + * intermediate RGB components are computed on the fly. + * + * The intensity is computed for the specified subset of pixel samples, or + * for the current rectangular selection, depending on parameter values. For + * more information on the rest of parameters of this function, see the + * documentation for Fill(). The current channel range selection is always + * ignored by this function. + * + * The previous contents of the destination image will be dereferenced (and + * immediately destroyed if they become unreferenced) and replaced with the + * computed, uniquely referenced intensity data. The destination image will + * be in the grayscale color space; it will have a single channel + * corresponding to the intensity of the specified pixel sample subset in + * this image. The dimensions of the destination image will be the same ones + * of the specified pixel sample subset, and it will be associated with the + * same RGBWS as this image. + * + * \note Increments the status monitoring object by the number of modified + * pixels (\e not samples). + */ + template + void GetIntensity( GenericImage& I, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + Rect r = rect; + if ( !ParseRect( r ) ) + { + I.FreeData(); + return; + } + + I.AllocateData( r ); + if ( !I.IsShared() ) + I.SetRGBWorkingSpace( m_RGBWS ); + + size_type N = I.NumberOfPixels(); + + if ( m_colorSpace == ColorSpace::Gray || m_colorSpace == ColorSpace::HSI ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Transferring pixel data", N ); + + typename GenericImage::sample* __restrict__ g = *I; + int cI = (m_colorSpace == ColorSpace::Gray) ? 0 : 2; + if ( r == Bounds() ) + { + const sample* __restrict__ f = m_pixelData[cI]; + P1::Copy( g, f, N ); + } + else + { + const sample* __restrict__ f = PixelAddress( r.LeftTop(), cI ); + for ( int i = 0; i < I.Height(); ++i, f += m_width, g += I.Width() ) + P1::Copy( g, f, I.Width() ); + } + + m_status += N; + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Computing intensity component", N ); + + Array L = OptimalThreadRows( I.Height(), I.Width(), maxProcessors ); + ThreadData data( *this, N ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new GetIntensityThread( I, *this, data, r, n, n + int( L[i] ) ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + } + } + + /*! + * Computes the intensity HSI component for a subset of pixel samples and + * stores it in a grayscale image, transported by an ImageVariant object. + * + * If the specified %ImageVariant does not transport an image, a new + * floating point image will be created with the appropriate sample type + * (either 32-bit or 64-bit floating point, depending on the sample data + * type of this image). + */ + void GetIntensity( ImageVariant& I, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const; + // Implemented in pcl/ImageVariant.h + + // ------------------------------------------------------------------------- + + /*! + * Replaces the CIE Y component of a subset of pixel samples with data + * extracted from another image. + * + * \param Y Reference to a source image, from which the CIE Y + * components will be obtained. This image can be in any + * supported color space, and can be an instance of any + * supported template instantiation of %GenericImage; all + * the necessary color space and data type conversions are + * carried out transparently. + * + * \param point Target point in image coordinates. This is the upper + * left corner of the target rectangular region in this + * image where CIE Y components will be replaced with + * source values. If one or both point coordinates are + * equal to \c int_max (the maximum possible value of type + * \c int), then the current anchor point selection will + * be used. The default value is Point( int_max ). + * + * \param rect Source rectangular region. If this parameter defines an + * empty rectangle, the current rectangular selection in + * the source image will be used. If the specified + * rectangle is not empty and extends beyond source image + * boundaries, only the intersection with the source image + * will be used. If that intersection does not exist, then + * this member function has no effect. The default value + * is an empty rectangle. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * This member function computes and replaces the Y component of the CIE XYZ + * color space. Source CIE Y component values are calculated in the RGB + * working space (RGBWS) associated with the source image \a Y. Replacement + * of CIE Y components in this (target) image is performed by + * transformations in the RGBWS associated with this image. This ensures + * that only pure illumination data is transferred between both images, + * without any chrominance contamination. + * + * If the source image is in the grayscale or CIE XYZ color spaces, samples + * from its first or second channel, respectively, are directly taken as + * source values, requiring no additional conversion. + * + * Once a source CIE Y value is available, either by direct extraction or + * through the simplest possible intermediate transformation (usually to the + * CIE L*a*b* or CIE XYZ spaces), it is inserted in the corresponding + * destination pixel by means of a series of transformations in the target + * RGBWS, whose number and complexity depend on the destination color space. + * Additional sample data type conversions may take place using pixel traits + * primitives, if the source and destination data types differ. Roundoff + * errors are minimized during the whole process. + * + * \note Increments the status monitoring object by the number of modified + * pixels (\e not samples). + */ + template + GenericImage& SetLuminance( const GenericImage& Y, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ), + int maxProcessors = 0 ) + { + Rect r = rect; + if ( !Y.ParseRect( r ) ) + return *this; + + Point p = point; + if ( p.x == int_max || p.y == int_max ) + p = m_point; + + if ( p.x < 0 ) + { + if ( (r.x0 -= p.x) >= r.x1 ) + return *this; + p.x = 0; + } + else if ( p.x >= m_width ) + return *this; + + if ( p.y < 0 ) + { + if ( (r.y0 -= p.y) >= r.y1 ) + return *this; + p.y = 0; + } + else if ( p.y >= m_height ) + return *this; + + r.ResizeTo( pcl::Min( m_width - p.x, r.Width() ), + pcl::Min( m_height - p.y, r.Height() ) ); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + + EnsureUnique(); + + if ( m_colorSpace == ColorSpace::Gray && + (Y.ColorSpace() == ColorSpace::Gray || Y.ColorSpace() == ColorSpace::CIEXYZ) ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Transferring pixel data", N ); + + int c0 = (Y.ColorSpace() == ColorSpace::Gray) ? 0 : 1; + const typename GenericImage::sample* __restrict__ g = Y.PixelAddress( r.LeftTop(), c0 ); + sample* __restrict__ f = PixelAddress( p ); + for ( int i = 0, w = r.Width(), h = r.Height(); i < h; ++i, f += m_width, g += Y.Width(), m_status += w ) + P::Copy( f, g, w ); + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Importing CIE Y component", N ); + + Array L = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + ThreadData data( *this, N ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SetLuminanceThread( *this, Y, data, p, r, n, n + int( L[i] ) ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + } + + return *this; + } + + /*! + * Replaces the CIE Y component of a subset of pixel samples with data + * extracted from another image, transported by an ImageVariant object. + * + * If the specified %ImageVariant does not transport an image, a new + * floating point image will be created with the appropriate sample type + * (either 32-bit or 64-bit floating point, depending on the sample data + * type of this image). + */ + GenericImage& SetLuminance( const ImageVariant& Y, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ), + int maxProcessors = 0 ); + // Implemented in pcl/ImageVariant.h + + /*! + * Replaces the CIE L* component of a subset of pixel samples with data + * extracted from another image. + * + * \param L Reference to a source image, from which the CIE L* + * components will be obtained. This image can be in any + * supported color space, and can be an instance of any + * supported template instantiation of %GenericImage; all + * the necessary color space and data type conversions are + * carried out transparently. + * + * \param point Target point in image coordinates. This is the upper + * left corner of the target rectangular region in this + * image where CIE L* components will be replaced with + * source values. If one or both point coordinates are + * equal to \c int_max (the maximum possible value of type + * \c int), then the current anchor point selection will + * be used. The default value is Point( int_max ). + * + * \param rect Source rectangular region. If this parameter defines an + * empty rectangle, the current rectangular selection in + * the source image will be used. If the specified + * rectangle is not empty and extends beyond source image + * boundaries, only the intersection with the source image + * will be used. If that intersection does not exist, then + * this member function has no effect. The default value + * is an empty rectangle. + * + * \param maxProcessors If a value greater than zero is specified, it is + * the maximum number of concurrent threads that this function can + * execute. If zero or a negative value is specified, the current + * thread limit for this image will be used instead (see + * AbstractImage::SetMaxProcessors()). The default value is zero. + * + * This member function computes and replaces the L* component of the CIE + * L*a*b* color space. Source CIE L* component values are calculated in the + * RGB working space (RGBWS) associated with the source image \a L. + * Replacement of CIE L* components in this (target) image is performed by + * transformations in the RGBWS associated with this image. This ensures + * that only pure illumination data is transferred between both images, + * without any chrominance contamination. + * + * If the source image is in the grayscale, CIE L*a*b* or CIE L*c*h* color + * spaces, samples from its first channel are directly taken as source + * values, requiring no additional conversion. + * + * Once a source CIE L* value is available, either by direct extraction or + * through the simplest possible intermediate transformation (usually to the + * CIE L*a*b* or CIE XYZ spaces), it is inserted in the corresponding + * destination pixel by means of a series of transformations in the target + * RGBWS, whose number and complexity depend on the destination color space. + * Additional sample data type conversions may take place using pixel traits + * primitives, if the source and destination data types differ. Roundoff + * errors are minimized during the whole process. + * + * \note Increments the status monitoring object by the number of modified + * pixels (\e not samples). + */ + template + GenericImage& SetLightness( const GenericImage& L, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ), + int maxProcessors = 0 ) + { + Rect r = rect; + if ( !L.ParseRect( r ) ) + return *this; + + Point p = point; + if ( p.x == int_max || p.y == int_max ) + p = m_point; + + if ( p.x < 0 ) + { + if ( (r.x0 -= p.x) >= r.x1 ) + return *this; + p.x = 0; + } + else if ( p.x >= m_width ) + return *this; + + if ( p.y < 0 ) + { + if ( (r.y0 -= p.y) >= r.y1 ) + return *this; + p.y = 0; + } + else if ( p.y >= m_height ) + return *this; + + r.ResizeTo( pcl::Min( m_width - p.x, r.Width() ), + pcl::Min( m_height - p.y, r.Height() ) ); + + size_type N = size_type( r.Width() )*size_type( r.Height() ); + + EnsureUnique(); + + if ( m_colorSpace == ColorSpace::Gray && + (L.ColorSpace() == ColorSpace::Gray || + L.ColorSpace() == ColorSpace::CIELab || L.ColorSpace() == ColorSpace::CIELch) ) + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Transferring pixel data", N ); + + const typename GenericImage::sample* __restrict__ g = L.PixelAddress( r.LeftTop() ); + sample* __restrict__ f = PixelAddress( p ); + for ( int i = 0, w = r.Width(), h = r.Height(); i < h; ++i, f += m_width, g += L.Width(), m_status += w ) + P::Copy( f, g, w ); + } + else + { + if ( m_status.IsInitializationEnabled() ) + m_status.Initialize( "Importing CIE L* component", N ); + + Array R = OptimalThreadRows( r.Height(), r.Width(), maxProcessors ); + ThreadData data( *this, N ); + ReferenceArray > threads; + for ( int i = 0, n = 0; i < int( R.Length() ); n += int( R[i++] ) ) + threads.Add( new SetLightnessThread( *this, L, data, p, r, n, n + int( R[i] ) ) ); + RunThreads( threads, data ); + threads.Destroy(); + + m_status = data.status; + } + + return *this; + } + + /*! + * Replaces the CIE L* component of a subset of pixel samples with data + * extracted from another image, transported by an ImageVariant object. + * + * If the specified %ImageVariant does not transport an image, a new + * floating point image will be created with the appropriate sample type + * (either 32-bit or 64-bit floating point, depending on the sample data + * type of this image). + */ + GenericImage& SetLightness( const ImageVariant& L, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ), + int maxProcessors = 0 ); + // Implemented in pcl/ImageVariant.h + + /*! + * Compression of image pixel samples. + * + * \param compressor A compression algorithm that will be used to compress + * pixel sample data from this image. + * + * \param rect A rectangular region in image pixel coordinates. This + * region determines the subset of pixel samples that will + * be compressed. If this parameter is not specified, or + * if an empty rectangle is specified, this function will + * compress pixel samples in the current rectangular + * selection of this image, that is, SelectedRectangle(). + * + * \param channel Channel index. Must be the zero-based index of an + * existing channel in this image, or an integer < 0. If + * this parameter is not specified or a negative integer, + * this function will compress pixel samples in the + * currently selected channel of this image, that is, + * SelectedChannel(). + * + * \param perf If non-null, pointer to a Compression::Performance + * structure where performance data will be provided. + * + * Returns a dynamic array of compressed sub-blocks. Each array element is a + * Compression::Subblock structure with the compressed data and the + * corresponding uncompressed length in bytes. If compression succeeds, the + * returned array will have at least one element. + * + * Data will be compressed for the intersection of the specified (or + * implicitly selected) rectangular region with this image. All predefined + * pixel sample types are supported, including integer, real and complex + * pixels. + * + * If there is no intersection between the rectangular region and the image, + * if an invalid channel index is specified, or if one or more sub-blocks + * are not compressible with the specified compression algorithm, this + * function returns an empty array. + */ + Compression::subblock_list Compress( const Compression& compressor, + const Rect& rect = Rect( 0 ), int channel = -1, + Compression::Performance* perf = nullptr ) const + { + Rect r = rect; + if ( !ParseSelection( r, channel ) ) + return Compression::subblock_list(); + if ( r == Bounds() ) + return compressor.Compress( m_channelData( channel ), ChannelSize(), perf ); + GenericImage

subimage( *this, r, channel, channel ); + return compressor.Compress( subimage[0], subimage.ChannelSize(), perf ); + } + + // ------------------------------------------------------------------------- + +private: + + /*! + * \struct Data + * \internal + * Reference-counted image data structure. + */ + struct Data : public ReferenceCounter + { + /*! + * Pixel data + * + * Each element in the data array points to a contiguous block of pixel + * samples that stores one channel of the image. This includes all + * nominal and alpha channels. + */ + sample** data = nullptr; + + /*! + * Pixel allocator + * + * The allocator is responsible for all allocations and deallocations of + * pixel data and the associated structures. The allocator works on local + * or external storage, depending on whether this instance is a local or + * a shared image. For shared images, the allocator takes into account + * ownership of the shared object for controlled destruction of shared + * resources. + */ + pixel_allocator allocator; + + /*! + * Image geometry + */ + Geometry geometry; + + /*! + * Image color + */ + Color color; + + /*! + * Constructs an empty local image. + */ + Data( GenericImage* image ) + { + LinkWithClientImage( image ); + } + + /*! + * Constructs an aliased shared image. + */ + Data( GenericImage* image, void* handle ) + : allocator( handle ) + { + SynchronizeWithSharedImage(); + LinkWithClientImage( image ); + } + + /*! + * Constructs a newly created shared image. + */ + Data( GenericImage* image, int width, int height, int numberOfChannels, int colorSpace ) + : allocator( width, height, numberOfChannels, colorSpace ) + { + SynchronizeWithSharedImage(); + LinkWithClientImage( image ); + } + + void Attach( GenericImage* image ) + { + ReferenceCounter::Attach(); + LinkWithClientImage( image ); + } + + ~Data() + { + if ( IsShared() ) + Reset(); + else + Deallocate(); + } + + bool IsShared() const noexcept + { + return allocator.IsShared(); + } + + bool IsEmpty() const noexcept + { + return data == nullptr; + } + + void Allocate( int width, int height, int numberOfChannels, color_space colorSpace ) + { + if ( width <= 0 || height <= 0 || numberOfChannels <= 0 ) + { + Deallocate(); + return; + } + + if ( numberOfChannels < ColorSpace::NumberOfNominalChannels( colorSpace ) ) + throw Error( "GenericImage::Data::Allocate(): Insufficient number of channels" ); + + if ( data != nullptr ) + { + if ( size_type( width )*size_type( height ) == geometry.NumberOfPixels() ) + { + if ( numberOfChannels != geometry.numberOfChannels ) + { + sample** newData = nullptr; + int m = pcl::Min( geometry.numberOfChannels, numberOfChannels ); + + try + { + newData = allocator.AllocateChannelSlots( numberOfChannels ); + for ( int i = 0; i < m; ++i ) + newData[i] = data[i]; + for ( int i = m; i < numberOfChannels; ++i ) + newData[i] = allocator.AllocatePixels( width, height ); + + try + { + for ( int i = m; i < geometry.numberOfChannels; ++i ) + if ( data[i] != nullptr ) + allocator.Deallocate( data[i] ), data[i] = nullptr; + allocator.Deallocate( data ); + data = newData; + newData = nullptr; + } + catch ( ... ) + { + Deallocate(); + throw; + } + } + catch ( ... ) + { + if ( newData != nullptr ) + { + for ( int i = m; i < numberOfChannels; ++i ) + if ( newData[i] != nullptr ) + allocator.Deallocate( newData[i] ), newData[i] = nullptr; + allocator.Deallocate( newData ); + } + throw; + } + } + } + else + { + sample** newData = nullptr; + + try + { + newData = allocator.AllocateChannelSlots( numberOfChannels ); + for ( int i = 0; i < numberOfChannels; ++i ) + newData[i] = allocator.AllocatePixels( width, height ); + + try + { + for ( int i = 0; i < geometry.numberOfChannels; ++i ) + if ( data[i] != nullptr ) + allocator.Deallocate( data[i] ), data[i] = nullptr; + allocator.Deallocate( data ); + data = newData; + newData = nullptr; + } + catch ( ... ) + { + Deallocate(); + throw; + } + } + catch ( ... ) + { + if ( newData != nullptr ) + { + for ( int i = 0; i < numberOfChannels; ++i ) + if ( newData[i] != nullptr ) + allocator.Deallocate( newData[i] ), newData[i] = nullptr; + allocator.Deallocate( newData ); + } + throw; + } + } + } + else + { + try + { + data = allocator.AllocateChannelSlots( numberOfChannels ); + for ( int i = 0; i < numberOfChannels; ++i ) + data[i] = allocator.AllocatePixels( width, height ); + } + catch ( ... ) + { + if ( data != nullptr ) + { + for ( int i = 0; i < numberOfChannels; ++i ) + if ( data[i] != nullptr ) + allocator.Deallocate( data[i] ), data[i] = nullptr; + allocator.Deallocate( data ); + Reset(); + } + throw; + } + } + + geometry.width = width; + geometry.height = height; + geometry.numberOfChannels = numberOfChannels; + + color.colorSpace = colorSpace; + + UpdateSharedImage(); + } + + void Import( sample** newData, int width, int height, int numberOfChannels, color_space colorSpace ) + { + if ( newData != data ) + { + Deallocate(); + + if ( newData != nullptr && width > 0 && height > 0 && numberOfChannels > 0 ) + { + if ( numberOfChannels < ColorSpace::NumberOfNominalChannels( colorSpace ) ) + throw Error( "GenericImage::Data::Import(): Insufficient number of channels" ); + + data = newData; + + geometry.width = width; + geometry.height = height; + geometry.numberOfChannels = numberOfChannels; + + color.colorSpace = colorSpace; + + UpdateSharedImage(); + } + } + } + + sample** Release() + { + sample** oldData = data; + Reset(); + UpdateSharedImage(); + return oldData; + } + + void Deallocate() + { + if ( data != nullptr ) + { + for ( int i = 0; i < geometry.numberOfChannels; ++i ) + if ( data[i] != nullptr ) + allocator.Deallocate( data[i] ), data[i] = nullptr; + allocator.Deallocate( data ); + Reset(); + UpdateSharedImage(); + } + } + + Data* Clone( GenericImage* image ) const + { + Data* clone = nullptr; + try + { + clone = new Data; + + if ( !IsEmpty() ) + { + clone->data = clone->allocator.AllocateChannelSlots( geometry.numberOfChannels ); + for ( int i = 0; i < geometry.numberOfChannels; ++i ) + { + clone->data[i] = clone->allocator.AllocatePixels( geometry.width, geometry.height ); + P::Copy( clone->data[i], data[i], geometry.NumberOfPixels() ); + } + + clone->geometry.Assign( geometry ); + clone->color.Assign( color ); + } + + clone->LinkWithClientImage( image ); + return clone; + } + catch ( ... ) + { + if ( clone != nullptr ) + { + clone->Deallocate(); + delete clone; + } + throw; + } + } + + void Reset() + { + data = nullptr; + geometry.Reset(); + color.Reset(); + } + + void UpdateSharedImage() + { + allocator.SetSharedData( data ); + allocator.SetSharedGeometry( geometry.width, geometry.height, geometry.numberOfChannels ); + allocator.SetSharedColor( color.colorSpace, color.RGBWS ); + } + + void SynchronizeWithSharedImage() + { + data = allocator.GetSharedData(); + allocator.GetSharedGeometry( geometry.width, geometry.height, geometry.numberOfChannels ); + allocator.GetSharedColor( color.colorSpace, color.RGBWS ); + } + + private: + + Data() = default; + + void LinkWithClientImage( GenericImage* image ) + { + if ( image != nullptr ) + { + image->m_geometry = &geometry; + image->m_color = &color; + } + } + }; + + /*! + * \internal + * The reference-counted image data. + */ + Data* m_data = nullptr; + + /*! + * \internal + * Dereferences image data and disposes it if it becomes garbage. + */ + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } + + // ------------------------------------------------------------------------- + + class RectThreadBase : public Thread + { + public: + + RectThreadBase( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : m_image( image ) + , m_rect( rect ) + , m_ch1( ch1 ) + , m_ch2( ch2 ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + virtual void Run() = 0; + + protected: + + const GenericImage& m_image; + const Rect& m_rect; + int m_ch1, m_ch2; + int m_firstRow, m_endRow; + + template void Execute( F process ) noexcept + { + int w = m_rect.Width(); + int dw = m_image.Width() - w; + + if ( m_image.IsLowRangeClippingEnabled() ) + { + sample clipLow = P::ToSample( m_image.RangeClipLow() ); + if ( m_image.IsHighRangeClippingEnabled() ) + { + sample clipHigh = P::ToSample( m_image.RangeClipHigh() ); + for ( int i = m_ch1; i <= m_ch2; ++i ) + { + const sample* __restrict__ f = m_image.PixelAddress( m_rect.x0, m_rect.y0+m_firstRow, i ); + for ( int j = m_firstRow; j < m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( clipLow < *f ) + if ( *f < clipHigh ) + process( f ); + } + } + } + else + { + for ( int i = m_ch1; i <= m_ch2; ++i ) + { + const sample* __restrict__ f = m_image.PixelAddress( m_rect.x0, m_rect.y0+m_firstRow, i ); + for ( int j = m_firstRow; j < m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( clipLow < *f ) + process( f ); + } + } + } + } + else if ( m_image.IsHighRangeClippingEnabled() ) + { + sample clipHigh = P::ToSample( m_image.RangeClipHigh() ); + for ( int i = m_ch1; i <= m_ch2; ++i ) + { + const sample* __restrict__ f = m_image.PixelAddress( m_rect.x0, m_rect.y0+m_firstRow, i ); + for ( int j = m_firstRow; j < m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( *f < clipHigh ) + process( f ); + } + } + } + else + { + for ( int i = m_ch1; i <= m_ch2; ++i ) + { + const sample* __restrict__ f = m_image.PixelAddress( m_rect.x0, m_rect.y0+m_firstRow, i ); + for ( int j = m_firstRow; j < m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + process( f ); + } + } + } + } + }; + + // ------------------------------------------------------------------------- + + class CountThread : public RectThreadBase + { + public: + + size_type count = 0; + + CountThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + /* + * N.B. These threads are only used when range clipping is enabled. + */ + int w = this->m_rect.Width(); + int dw = this->m_image.Width() - w; + + if ( this->m_image.IsLowRangeClippingEnabled() ) + { + sample clipLow = P::ToSample( this->m_image.RangeClipLow() ); + if ( this->m_image.IsHighRangeClippingEnabled() ) + { + sample clipHigh = P::ToSample( this->m_image.RangeClipHigh() ); + for ( int i = this->m_ch1; i <= this->m_ch2; ++i ) + { + const sample* __restrict__ f = this->m_image.PixelAddress( this->m_rect.x0, this->m_rect.y0+this->m_firstRow, i ); + for ( int j = this->m_firstRow; j < this->m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( clipLow < *f ) + if ( *f < clipHigh ) + ++count; + } + } + } + else + { + for ( int i = this->m_ch1; i <= this->m_ch2; ++i ) + { + const sample* __restrict__ f = this->m_image.PixelAddress( this->m_rect.x0, this->m_rect.y0+this->m_firstRow, i ); + for ( int j = this->m_firstRow; j < this->m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( clipLow < *f ) + ++count; + } + } + } + } + else if ( this->m_image.IsHighRangeClippingEnabled() ) + { + sample clipHigh = P::ToSample( this->m_image.RangeClipHigh() ); + for ( int i = this->m_ch1; i <= this->m_ch2; ++i ) + { + const sample* __restrict__ f = this->m_image.PixelAddress( this->m_rect.x0, this->m_rect.y0+this->m_firstRow, i ); + for ( int j = this->m_firstRow; j < this->m_endRow; ++j, f += dw ) + { + PCL_IVDEP + for ( int k = 0; k < w; ++k, ++f ) + if ( *f < clipHigh ) + ++count; + } + } + } + else // ?! this should not happen + count = size_type( 1 + this->m_ch2 - this->m_ch1 ) * size_type( w ) * size_type( this->m_rect.Height() ); + } + }; + + // ------------------------------------------------------------------------- + + class MinThread : public RectThreadBase + { + public: + + sample min; + size_type count; + + MinThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + min = P::HighestSampleValue(); + count = 0; + this->Execute( [=]( const sample* f ) + { + if ( *f < min ) + min = *f; + ++count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class MaxThread : public RectThreadBase + { + public: + + sample max; + size_type count; + + MaxThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + max = P::LowestSampleValue(); + count = 0; + this->Execute( [=]( const sample* f ) + { + if ( max < *f ) + max = *f; + ++count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class MinMaxThread : public RectThreadBase + { + public: + + sample min; + sample max; + size_type count; + + MinMaxThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + min = P::HighestSampleValue(); + max = P::LowestSampleValue(); + count = 0; + this->Execute( [=]( const sample* f ) + { + if ( *f < min ) + min = *f; + if ( max < *f ) + max = *f; + ++count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class ExtremePosThreadBase : public RectThreadBase + { + public: + + int cmin, cmax; + Point pmin, pmax; + size_type count; + + ExtremePosThreadBase( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + count = 0; + m_amin = m_amax = nullptr; + DoExecute(); + + if ( count > 0 ) + { + if ( m_amin != 0 ) + for ( int i = this->m_ch1; i <= this->m_ch2; ++i ) + if ( m_amin >= this->m_image[i] && m_amin < (this->m_image[i] + this->m_image.NumberOfPixels()) ) + { + cmin = i; + pmin.x = (m_amin - this->m_image[i]) % this->m_image.Width(); + pmin.y = (m_amin - this->m_image[i]) / this->m_image.Width(); + break; + } + if ( m_amax != 0 ) + for ( int i = this->m_ch1; i <= this->m_ch2; ++i ) + if ( m_amax >= this->m_image[i] && m_amax < (this->m_image[i] + this->m_image.NumberOfPixels()) ) + { + cmax = i; + pmax.x = (m_amax - this->m_image[i]) % this->m_image.Width(); + pmax.y = (m_amax - this->m_image[i]) / this->m_image.Width(); + break; + } + } + } + + protected: + + const sample* m_amin; + const sample* m_amax; + + virtual void DoExecute() = 0; + }; + + // ------------------------------------------------------------------------- + + class MinPosThread : public ExtremePosThreadBase + { + public: + + sample min; + + MinPosThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : ExtremePosThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + private: + + void DoExecute() override + { + min = P::HighestSampleValue(); + this->Execute( [=]( const sample* f ) + { + if ( *f < min ) + min = *(this->m_amin = f); + ++this->count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class MaxPosThread : public ExtremePosThreadBase + { + public: + + sample max; + + MaxPosThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : ExtremePosThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + private: + + void DoExecute() override + { + max = P::LowestSampleValue(); + this->Execute( [=]( const sample* f ) + { + if ( max < *f ) + max = *(this->m_amax = f); + ++this->count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class MinMaxPosThread : public ExtremePosThreadBase + { + public: + + sample min, max; + + MinMaxPosThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : ExtremePosThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + private: + + void DoExecute() override + { + min = P::HighestSampleValue(); + max = P::LowestSampleValue(); + this->Execute( [=]( const sample* f ) + { + if ( *f < min ) + min = *(this->m_amin = f); + if ( max < *f ) + max = *(this->m_amax = f); + ++this->count; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class SumThread : public RectThreadBase + { + public: + + double s; + size_type n; + + SumThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + void Run() final + { + s = e = 0; + n = 0; + DoExecute(); + } + + protected: + + double e; + + void SumStep( double x ) noexcept + { + double y = x - e; + double t = s + y; + e = (t - s) - y; + s = t; + ++n; + } + + virtual void DoExecute() + { + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + SumStep( v ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class SumSqrThread : public SumThread + { + public: + + SumSqrThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : SumThread( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + private: + + void DoExecute() override + { + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + this->SumStep( v*v ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class SumAbsThread : public SumThread + { + public: + + SumAbsThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : SumThread( image, rect, ch1, ch2, firstRow, endRow ) + { + } + + private: + + void DoExecute() override + { + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + this->SumStep( pcl::Abs( v ) ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class NormThread : public RectThreadBase + { + public: + + Vector R; + size_type n; + + NormThread( const GenericImage& image, int degree, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , R( degree ) + , e( degree ) + { + } + + void Run() final + { + R = e = 0.0; + n = 0; + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + for ( int i = 0;; ) + { + NormStep( i, v ); + if ( ++i == R.Length() ) + break; + v *= v; + } + ++n; + } ); + } + + protected: + + Vector e; + + void NormStep( int i, double x ) noexcept + { + double y = x - e[i]; + double t = R[i] + y; + e[i] = (t - R[i]) - y; + R[i] = t; + } + }; + + // ------------------------------------------------------------------------- + + class HistogramThread : public RectThreadBase + { + public: + + SzVector H; + + HistogramThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow, + const double& low, const double& high ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , H( __PCL_MEDIAN_HISTOGRAM_LENGTH ) + , m_low( low ) + , m_high( high ) + { + } + + void Run() final + { + H = size_type( 0 ); + m_range = m_high - m_low; +// Workaround for clang compiler bug on macOS: +// https://pixinsight.com/forum/index.php?threads/pi-always-crash-when-stf.15830/ +#ifdef __PCL_MACOSX + if ( 1 + m_range != 1 ) +#endif + this->Execute( [=]( const sample* f ) + { + if ( *f >= m_low ) + if ( *f <= m_high ) + ++H[TruncInt( (__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) * (double( *f ) - m_low)/m_range )]; + } ); + } + + private: + + const double& m_low; + const double& m_high; + double m_range; + }; + + // ------------------------------------------------------------------------- + + class ExtremeAbsDevThread : public RectThreadBase + { + public: + + double minAbsDev, maxAbsDev; + size_type count; + + ExtremeAbsDevThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow, double center ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + void Run() final + { + minAbsDev = std::numeric_limits::max(); + maxAbsDev = 0; + count = 0; + this->Execute( [=]( const sample* f ) + { + double d; P::FromSample( d, *f ); + d = pcl::Abs( d - m_center ); + if ( d < minAbsDev ) + minAbsDev = d; + if ( d > maxAbsDev ) + maxAbsDev = d; + ++count; + } ); + } + + private: + + double m_center; + }; + + // ------------------------------------------------------------------------- + + class TwoSidedExtremeAbsDevThread : public RectThreadBase + { + public: + + double minAbsDevLow, minAbsDevHigh; + double maxAbsDevLow, maxAbsDevHigh; + size_type nLow, nHigh; + + TwoSidedExtremeAbsDevThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow, double center ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + void Run() final + { + minAbsDevLow = minAbsDevHigh = std::numeric_limits::max(); + maxAbsDevLow = maxAbsDevHigh = 0; + nLow = nHigh = 0; + this->Execute( [=]( const sample* f ) + { + double x; P::FromSample( x, *f ); + if ( x <= m_center ) + { + double d = m_center - x; + if ( d < minAbsDevLow ) + minAbsDevLow = d; + if ( d > maxAbsDevLow ) + maxAbsDevLow = d; + ++nLow; + } + else + { + double d = x - m_center; + if ( d < minAbsDevHigh ) + minAbsDevHigh = d; + if ( d > maxAbsDevHigh ) + maxAbsDevHigh = d; + ++nHigh; + } + } ); + } + + private: + + double m_center; + }; + + // ------------------------------------------------------------------------- + + class AbsDevHistogramThread : public RectThreadBase + { + public: + + SzVector H; + + AbsDevHistogramThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow, + double center, const double& low, const double& high ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , H( __PCL_MEDIAN_HISTOGRAM_LENGTH ) + , m_center( center ) + , m_low( low ) + , m_high( high ) + { + } + + void Run() final + { + H = size_type( 0 ); + m_range = m_high - m_low; +// Workaround for clang compiler bug on macOS: +// https://pixinsight.com/forum/index.php?threads/pi-always-crash-when-stf.15830/ +#ifdef __PCL_MACOSX + if ( 1 + m_range != 1 ) +#endif + this->Execute( [=]( const sample* f ) + { + double d; P::FromSample( d, *f ); + d = pcl::Abs( d - m_center ); + if ( d >= m_low ) + if ( d <= m_high ) + ++H[TruncInt( (__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) * (d - m_low)/m_range )]; + } ); + } + + private: + + double m_center; + const double& m_low; + const double& m_high; + double m_range; + }; + + // ------------------------------------------------------------------------- + + class TwoSidedAbsDevHistogramThread : public RectThreadBase + { + public: + + SzVector H; + + TwoSidedAbsDevHistogramThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow, + double center, const int& side, const double& low, const double& high ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , H( __PCL_MEDIAN_HISTOGRAM_LENGTH ) + , m_center( center ) + , m_side( side ) + , m_low( low ) + , m_high( high ) + { + } + + void Run() final + { + H = size_type( 0 ); + m_range = m_high - m_low; +// Workaround for clang compiler bug on macOS: +// https://pixinsight.com/forum/index.php?threads/pi-always-crash-when-stf.15830/ +#ifdef __PCL_MACOSX + if ( 1 + m_range != 1 ) +#endif + this->Execute( [=]( const sample* f ) + { + double x; P::FromSample( x, *f ); + if ( m_side > 0 == x > m_center ) + { + double d = m_side ? x - m_center : m_center - x; + if ( d >= m_low ) + if ( d <= m_high ) + ++H[TruncInt( (__PCL_MEDIAN_HISTOGRAM_LENGTH - 1) * (d - m_low)/m_range )]; + } + } ); + } + + private: + + double m_center; + const int& m_side; + const double& m_low; + const double& m_high; + double m_range; + }; + + // ------------------------------------------------------------------------- + + class VarThread : public RectThreadBase + { + public: + + double var, eps; + + VarThread( const GenericImage& image, double mean, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_mean( mean ) + { + } + + void Run() final + { + var = eps = 0; + this->Execute( [=]( const sample* f ) + { + double d; P::FromSample( d, *f ); + d -= m_mean; + var += d*d; + eps += d; + } ); + } + + private: + + double m_mean; + }; + + // ------------------------------------------------------------------------- + + class SumAbsDevThread : public SumThread + { + public: + + SumAbsDevThread( const GenericImage& image, double center, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : SumThread( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + private: + + double m_center; + + void DoExecute() override + { + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + this->SumStep( pcl::Abs( v - m_center ) ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class TwoSidedSumAbsDevThread : public RectThreadBase + { + public: + + double s0, s1; + size_type n0, n1; + + TwoSidedSumAbsDevThread( const GenericImage& image, double center, + const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + void Run() final + { + s0 = s1 = 0; + n0 = n1 = 0; + this->Execute( [=]( const sample* f ) + { + double v; P::FromSample( v, *f ); + if ( v <= m_center ) + { + s0 += m_center - v; + ++n0; + } + else + { + s1 += v - m_center; + ++n1; + } + } ); + } + + private: + + double m_center; + }; + + // ------------------------------------------------------------------------- + + class BWMVThread : public RectThreadBase + { + public: + + double num, den; + size_type n, nr; + + BWMVThread( const GenericImage& image, double center, double kd, + const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + , m_kd( kd ) + { + } + + void Run() final + { + num = den = 0; + n = nr = 0; + this->Execute( [=]( const sample* f ) + { + ++n; + double xc; P::FromSample( xc, *f ); xc -= m_center; + double y = xc/m_kd; + if ( pcl::Abs( y ) < 1 ) + { + double y2 = y*y; + double y21 = 1 - y2; + num += xc*xc * y21*y21*y21*y21; + den += y21 * (1 - 5*y2); + ++nr; + } + } ); + } + + private: + + double m_center; + double m_kd; + }; + + // ------------------------------------------------------------------------- + + class TwoSidedBWMVThread : public RectThreadBase + { + public: + + double num0, den0; + double num1, den1; + size_type n0, n1, nr0, nr1; + + TwoSidedBWMVThread( const GenericImage& image, double center, double kd0, double kd1, + const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + , m_kd0( kd0 ) + , m_kd1( kd1 ) + { + } + + void Run() final + { + num0 = den0 = num1 = den1 = 0; + n0 = n1 = nr0 = nr1 = 0; + this->Execute( [=]( const sample* f ) + { + double xc; P::FromSample( xc, *f ); xc -= m_center; + bool low = xc <= 0; + if ( low ) + ++n0; + else + ++n1; + + double y = xc/(low ? m_kd0 : m_kd1); + if ( pcl::Abs( y ) < 1 ) + { + double y2 = y*y; + double y21 = 1 - y2; + double num = xc*xc * y21*y21*y21*y21; + double den = y21 * (1 - 5*y2); + if ( low ) + { + num0 += num; + den0 += den; + ++nr0; + } + else + { + num1 += num; + den1 += den; + ++nr1; + } + } + } ); + } + + private: + + double m_center; + double m_kd0; + double m_kd1; + }; + + // ------------------------------------------------------------------------- + + class SmpThread : public RectThreadBase + { + public: + + Array samples; + size_type n; + + SmpThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + size_type N = size_type( this->m_rect.Width() ) + * size_type( this->m_endRow - this->m_firstRow ) + * (1 + this->m_ch2 - this->m_ch1); + samples = Array( N ); + } + + void Run() final + { + n = 0; + this->Execute( [=]( const sample* f ) + { + samples[n++] = *f; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class DSmpThread : public RectThreadBase + { + public: + + Array values; + size_type n; + + DSmpThread( const GenericImage& image, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : RectThreadBase( image, rect, ch1, ch2, firstRow, endRow ) + { + size_type N = size_type( this->m_rect.Width() ) + * size_type( this->m_endRow - this->m_firstRow ) + * (1 + this->m_ch2 - this->m_ch1); + values = Array( N ); + } + + void Run() final + { + n = 0; + DoExecute(); + } + + protected: + + virtual void DoExecute() + { + this->Execute( [=]( const sample* f ) + { + P::FromSample( values[n++], *f ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class AbsDevSmpThread : public DSmpThread + { + public: + + AbsDevSmpThread( const GenericImage& image, double center, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : DSmpThread( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + private: + + double m_center; + + void DoExecute() override + { + this->Execute( [=]( const sample* f ) + { + double d; P::FromSample( d, *f ); + this->values[this->n++] = pcl::Abs( d - m_center ); + } ); + } + }; + + // ------------------------------------------------------------------------- + + class TwoSidedAbsDevSmpThread : public DSmpThread + { + public: + + Array::iterator p, q; + + TwoSidedAbsDevSmpThread( const GenericImage& image, double center, const Rect& rect, int ch1, int ch2, int firstRow, int endRow ) + : DSmpThread( image, rect, ch1, ch2, firstRow, endRow ) + , m_center( center ) + { + } + + private: + + double m_center; + + void DoExecute() override + { + p = this->values.Begin(); + q = this->values.End(); + this->Execute( [=]( const sample* f ) + { + double x; P::FromSample( x, *f ); + if ( x <= m_center ) + *p++ = m_center - x; + else + *--q = x - m_center; + ++this->n; + } ); + } + }; + + // ------------------------------------------------------------------------- + + class ColorSpaceConversionThread : public Thread + { + public: + + ColorSpaceConversionThread( GenericImage& image, ThreadData& data, + color_space toColorSpace, size_type begin, size_type end ) + : m_image( image ) + , m_data( data ) + , m_toColorSpace( toColorSpace ) + , m_begin( begin ) + , m_end( end ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& rgbws = m_image.RGBWorkingSpace(); + + typename P::sample* f0 = m_image[0] + m_begin; + typename P::sample* f1 = m_image[1] + m_begin; + typename P::sample* f2 = m_image[2] + m_begin; + typename P::sample* fN = m_image[0] + m_end; + + for ( ; f0 < fN; ++f0, ++f1, ++f2 ) + { + RGBColorSystem::sample r0, r1, r2; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB : + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::HSV : + rgbws.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI : + rgbws.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ : + rgbws.RGBToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab : + rgbws.RGBToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch : + rgbws.RGBToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::HSV : + rgbws.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::RGB : + break; + case ColorSpace::HSI : + rgbws.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ : + rgbws.RGBToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab : + rgbws.RGBToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch : + rgbws.RGBToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::HSI : + rgbws.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::RGB : + break; + case ColorSpace::HSV : + rgbws.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ : + rgbws.RGBToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab : + rgbws.RGBToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch : + rgbws.RGBToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::CIEXYZ : + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::RGB : + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSV : + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI : + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab : + rgbws.CIEXYZToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch : + rgbws.CIEXYZToCIELab( r0, r1, r2, r0, r1, r2 ); + rgbws.CIELabToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::CIELab : + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::RGB : + rgbws.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSV : + rgbws.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI : + rgbws.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ : + rgbws.CIELabToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch : + rgbws.CIELabToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::CIELch : + switch ( m_toColorSpace ) + { + case ColorSpace::Gray : + rgbws.CIELchToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToGray( r0, r0, r1, r2 ); + break; + case ColorSpace::RGB : + rgbws.CIELchToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSV : + rgbws.CIELchToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI : + rgbws.CIELchToRGB( r0, r1, r2, r0, r1, r2 ); + rgbws.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ : + rgbws.CIELchToCIELab( r0, r1, r2, r0, r1, r2 ); + rgbws.CIELabToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab : + rgbws.CIELchToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + default: + break; + } + + *f0 = P::ToSample( r0 ); + + if ( m_toColorSpace != ColorSpace::Gray ) + { + *f1 = P::ToSample( r1 ); + *f2 = P::ToSample( r2 ); + } + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + + private: + + GenericImage& m_image; + ThreadData& m_data; + color_space m_toColorSpace; + size_type m_begin, m_end; + }; + + // ------------------------------------------------------------------------- + + template + class GetLuminanceThread : public Thread + { + public: + + GetLuminanceThread( GenericImage& luminance, const GenericImage& image, ThreadData& data, + const Rect& rect, int firstRow, int endRow ) + : m_luminance( luminance ) + , m_image( image ) + , m_data( data ) + , m_rect( rect ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& rgbws = m_image.RGBWorkingSpace(); + + const typename P::sample* f0 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + const typename P::sample* f1 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 1 ); + const typename P::sample* f2 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 2 ); + + typename P1::sample* fY = m_luminance.ScanLine( m_firstRow ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++fY ) + { + RGBColorSystem::sample r0, r1, r2, rY; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + rgbws.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + rgbws.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + rY = rgbws.CIEY( r0, r1, r2 ); + break; + + case ColorSpace::CIELch: + rgbws.CIELchToCIELab( r0, r1, r2, r0, r1, r2 ); + // fall through + case ColorSpace::CIELab: + rgbws.CIELabToCIEXYZ( r0, rY, r2, r0, r1, r2 ); + break; + + default: // ?! + rY = 0; + break; + } + + *fY = P1::ToSample( rY ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + + private: + + GenericImage& m_luminance; + const GenericImage& m_image; + ThreadData& m_data; + const Rect& m_rect; + int m_firstRow, m_endRow; + }; + + // ------------------------------------------------------------------------- + + template + class GetLightnessThread : public Thread + { + public: + + GetLightnessThread( GenericImage& lightness, const GenericImage& image, ThreadData& data, + const Rect& rect, int firstRow, int endRow ) + : m_lightness( lightness ) + , m_image( image ) + , m_data( data ) + , m_rect( rect ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& rgbws = m_image.RGBWorkingSpace(); + + const typename P::sample* f0 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + const typename P::sample* f1 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 1 ); + const typename P::sample* f2 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 2 ); + + typename P1::sample* fL = m_lightness.ScanLine( m_firstRow ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++fL ) + { + RGBColorSystem::sample r0, r1, r2, rL; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + case ColorSpace::CIEXYZ: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + rgbws.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + rgbws.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ: + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + rL = rgbws.CIEL( r0, r1, r2 ); + break; + + default: // ?! + rL = 0; + break; + } + + *fL = P1::ToSample( rL ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + + private: + + GenericImage& m_lightness; + const GenericImage& m_image; + ThreadData& m_data; + const Rect& m_rect; + int m_firstRow, m_endRow; + }; + + // ------------------------------------------------------------------------- + + template + class GetIntensityThread : public Thread + { + public: + + GetIntensityThread( GenericImage& luminance, const GenericImage& image, ThreadData& data, + const Rect& rect, int firstRow, int endRow ) + : m_intensity( luminance ) + , m_image( image ) + , m_data( data ) + , m_rect( rect ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& rgbws = m_image.RGBWorkingSpace(); + + const typename P::sample* f0 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + const typename P::sample* f1 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 1 ); + const typename P::sample* f2 = m_image.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 2 ); + + typename P1::sample* fI = m_intensity.ScanLine( m_firstRow ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++fI ) + { + RGBColorSystem::sample r0, r1, r2; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + break; + case ColorSpace::HSV: + rgbws.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ: + rgbws.CIEXYZToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab: + rgbws.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch: + rgbws.CIELchToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + + *fI = P1::ToSample( rgbws.Intensity( r0, r1, r2 ) ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + + private: + + GenericImage& m_intensity; + const GenericImage& m_image; + ThreadData& m_data; + const Rect& m_rect; + int m_firstRow, m_endRow; + }; + + // ------------------------------------------------------------------------- + + template + class SetLuminanceThread : public Thread + { + public: + + SetLuminanceThread( GenericImage& image, const GenericImage& luminance, ThreadData& data, + const Point& target, const Rect& rect, int firstRow, int endRow ) + : m_image( image ) + , m_luminance( luminance ) + , m_data( data ) + , m_target( target ) + , m_rect( rect ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& sourceRGBWS = m_luminance.RGBWorkingSpace(); + const RGBColorSystem& targetRGBWS = m_image.RGBWorkingSpace(); + + typename P::sample* f0 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 0 ); + typename P::sample* f1 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 1 ); + typename P::sample* f2 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 2 ); + + if ( m_luminance.ColorSpace() == ColorSpace::Gray || m_luminance.ColorSpace() == ColorSpace::CIEXYZ ) + { + int cY = (m_luminance.ColorSpace() == ColorSpace::Gray) ? 0 : 1; + const typename P1::sample* fY = m_luminance.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, cY ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(), dwY = m_luminance.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw, fY += dwY ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++fY ) + { + RGBColorSystem::sample r0, r1, r2, rY; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + P1::FromSample( rY, *fY ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: // RGB + break; + } + targetRGBWS.RGBToCIEab( r1, r2, r0, r1, r2 ); + targetRGBWS.CIELabToRGB( r0, r1, r2, sourceRGBWS.CIEYToCIEL( rY ), r1, r2 ); + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + default: // RGB + break; + } + break; + + case ColorSpace::CIEXYZ: + targetRGBWS.CIEXYZToCIELab( r0, r1, r2, r0, r1, r2 ); + targetRGBWS.CIELabToCIEXYZ( r0, r1, r2, sourceRGBWS.CIEYToCIEL( rY ), r1, r2 ); + break; + + case ColorSpace::CIELab: + case ColorSpace::CIELch: + r0 = sourceRGBWS.CIEYToCIEL( rY ); + break; + + default: // ??? + break; + } + + *f0 = P::ToSample( r0 ); + *f1 = P::ToSample( r1 ); + *f2 = P::ToSample( r2 ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + else + { + const typename P1::sample* g0 = m_luminance.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + const typename P1::sample* g1 = m_luminance.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 1 ); + const typename P1::sample* g2 = m_luminance.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 2 ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(), dwY = m_luminance.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw, g0 += dwY, g1 += dwY, g2 += dwY ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++g0, ++g1, ++g2 ) + { + typename RGBColorSystem::sample r0, r1, r2, s0, s1, s2; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + P1::FromSample( s0, *g0 ); + P1::FromSample( s1, *g1 ); + P1::FromSample( s2, *g2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + case ColorSpace::CIEXYZ: + case ColorSpace::CIELab: + case ColorSpace::CIELch: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + targetRGBWS.RGBToCIEab( r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ: + targetRGBWS.CIEXYZToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab: // NOOP + case ColorSpace::CIELch: // NOOP + break; + default: // ?! + break; + } + + switch ( m_luminance.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_luminance.ColorSpace() ) + { + case ColorSpace::HSV: + sourceRGBWS.HSVToRGB( s0, s1, s2, s0, s1, s2 ); + break; + case ColorSpace::HSI: + sourceRGBWS.HSIToRGB( s0, s1, s2, s0, s1, s2 ); + break; + default: + break; + } + r0 = sourceRGBWS.CIEL( s0, s1, s2 ); + break; + case ColorSpace::CIEXYZ: + sourceRGBWS.CIEXYZToCIELab( r0, s1, s2, s0, s1, s2 ); + break; + case ColorSpace::CIELab: + case ColorSpace::CIELch: + r0 = s0; + break; + default: // ?! + break; + } + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + targetRGBWS.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + default: // RGB + break; + } + break; + case ColorSpace::CIEXYZ: + targetRGBWS.CIELabToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELab: // NOOP + case ColorSpace::CIELch: // NOOP + break; + default: // ?! + break; + } + break; + + default: // ?! + break; + } + + *f0 = P::ToSample( r0 ); + *f1 = P::ToSample( r1 ); + *f2 = P::ToSample( r2 ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + } + + private: + + GenericImage& m_image; + const GenericImage& m_luminance; + ThreadData& m_data; + const Point& m_target; + const Rect& m_rect; + int m_firstRow, m_endRow; + }; + + // ------------------------------------------------------------------------- + + template + class SetLightnessThread : public Thread + { + public: + + SetLightnessThread( GenericImage& image, const GenericImage& lightness, ThreadData& data, + const Point& target, const Rect& rect, int firstRow, int endRow ) + : m_image( image ) + , m_lightness( lightness ) + , m_data( data ) + , m_target( target ) + , m_rect( rect ) + , m_firstRow( firstRow ) + , m_endRow( endRow ) + { + } + + void Run() final + { + INIT_THREAD_MONITOR() + + const RGBColorSystem& sourceRGBWS = m_lightness.RGBWorkingSpace(); + const RGBColorSystem& targetRGBWS = m_image.RGBWorkingSpace(); + + typename P::sample* f0 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 0 ); + typename P::sample* f1 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 1 ); + typename P::sample* f2 = m_image.PixelAddress( m_target.x, m_target.y + m_firstRow, 2 ); + + if ( m_lightness.ColorSpace() == ColorSpace::Gray || + m_lightness.ColorSpace() == ColorSpace::CIELab || m_lightness.ColorSpace() == ColorSpace::CIELch ) + { + const typename P1::sample* fL = m_lightness.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(), dwL = m_lightness.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw, fL += dwL ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++fL ) + { + RGBColorSystem::sample r0, r1, r2, rL; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + P1::FromSample( rL, *fL ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + targetRGBWS.RGBToCIEab( r1, r2, r0, r1, r2 ); + targetRGBWS.CIELabToRGB( r0, r1, r2, rL, r1, r2 ); + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + + case ColorSpace::CIEXYZ: + r1 = targetRGBWS.CIELToCIEY( rL ); + break; + + case ColorSpace::CIELab: + case ColorSpace::CIELch: + r0 = rL; + break; + + default: // ??? + break; + } + + *f0 = P::ToSample( r0 ); + *f1 = P::ToSample( r1 ); + *f2 = P::ToSample( r2 ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + else + { + const typename P1::sample* g0 = m_lightness.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 0 ); + const typename P1::sample* g1 = m_lightness.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 1 ); + const typename P1::sample* g2 = m_lightness.PixelAddress( m_rect.x0, m_rect.y0 + m_firstRow, 2 ); + + for ( int y = m_firstRow, dw = m_image.Width()-m_rect.Width(), dwL = m_lightness.Width()-m_rect.Width(); + y < m_endRow; + ++y, f0 += dw, f1 += dw, f2 += dw, g0 += dwL, g1 += dwL, g2 += dwL ) + { + const typename P::sample* fN = f0 + m_rect.Width(); + + for ( ; f0 < fN; ++f0, ++f1, ++f2, ++g0, ++g1, ++g2 ) + { + typename RGBColorSystem::sample r0, r1, r2, s0, s1, s2; + P::FromSample( r0, *f0 ); + P::FromSample( r1, *f1 ); + P::FromSample( r2, *f2 ); + P1::FromSample( s0, *g0 ); + P1::FromSample( s1, *g1 ); + P1::FromSample( s2, *g2 ); + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + case ColorSpace::CIEXYZ: + case ColorSpace::CIELab: + case ColorSpace::CIELch: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.HSVToRGB( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.HSIToRGB( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + targetRGBWS.RGBToCIEab( r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIEXYZ: + targetRGBWS.CIEXYZToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch: + targetRGBWS.CIELchToCIELab( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + + switch ( m_lightness.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + switch ( m_lightness.ColorSpace() ) + { + case ColorSpace::HSV: + sourceRGBWS.HSVToRGB( s0, s1, s2, s0, s1, s2 ); + break; + case ColorSpace::HSI: + sourceRGBWS.HSIToRGB( s0, s1, s2, s0, s1, s2 ); + break; + default: + break; + } + r0 = sourceRGBWS.CIEL( s0, s1, s2 ); + break; + case ColorSpace::CIEXYZ: + r0 = sourceRGBWS.CIEYToCIEL( s1 ); + break; + default: // ??? + break; + } + + switch ( m_image.ColorSpace() ) + { + case ColorSpace::RGB: + case ColorSpace::HSV: + case ColorSpace::HSI: + targetRGBWS.CIELabToRGB( r0, r1, r2, r0, r1, r2 ); + switch ( m_image.ColorSpace() ) + { + case ColorSpace::HSV: + targetRGBWS.RGBToHSV( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::HSI: + targetRGBWS.RGBToHSI( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + break; + case ColorSpace::CIEXYZ: + targetRGBWS.CIELabToCIEXYZ( r0, r1, r2, r0, r1, r2 ); + break; + case ColorSpace::CIELch: + targetRGBWS.CIELabToCIELch( r0, r1, r2, r0, r1, r2 ); + break; + default: + break; + } + + default: // ??? + break; + } + + *f0 = P::ToSample( r0 ); + *f1 = P::ToSample( r1 ); + *f2 = P::ToSample( r2 ); + + UPDATE_THREAD_MONITOR( 65536 ) + } + } + } + } + + private: + + GenericImage& m_image; + const GenericImage& m_lightness; + ThreadData& m_data; + const Point& m_target; + const Rect& m_rect; + int m_firstRow, m_endRow; + }; + + // ------------------------------------------------------------------------- + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + friend class pi::SharedImage; +#endif +}; + +#undef m_pixelData +#undef m_channelData +#undef m_allocator +#undef m_width +#undef m_height +#undef m_numberOfChannels +#undef m_colorSpace +#undef m_RGBWS +#undef m_channel +#undef m_lastChannel +#undef m_point +#undef m_rectangle +#undef m_clipLow +#undef m_clipHigh +#undef m_clippedLow +#undef m_clippedHigh + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup image_scalar_operators Image Scalar Operators + */ + +/*! + * Returns the sum of an \a image and a \a scalar. The operation is performed + * on the current selection of the specified \a image. + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator +( const GenericImage

& image, T scalar ) +{ + GenericImage

result( image ); + (void)(result += scalar); + return result; +} + +/*! + * Returns the sum of a \a scalar and an \a image. The operation is performed + * on the current selection of the specified \a image. + * + * This operator implements the commutative property of image scalar addition. + * + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator +( T scalar, const GenericImage

& image ) +{ + return image + scalar; +} + +/*! + * Returns the subtraction of a \a scalar from an \a image. The operation is + * performed on the current selection of the specified \a image. + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator -( const GenericImage

& image, T scalar ) +{ + GenericImage

result( image ); + (void)(result -= scalar); + return result; +} + +/*! + * Returns the product of an \a image by a \a scalar. The operation is + * performed on the current selection of the specified \a image. + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator *( const GenericImage

& image, T scalar ) +{ + GenericImage

result( image ); + (void)(result *= scalar); + return result; +} + +/*! + * Returns the product of a \a scalar by an \a image. The operation is + * performed on the current selection of the specified \a image. + * + * This operator implements the commutative property of image scalar + * multiplication. + * + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator *( T scalar, const GenericImage

& image ) +{ + return image * scalar; +} + +/*! + * Returns the result of dividing an \a image by a \a scalar. The operation is + * performed on the current selection of the specified \a image. + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator /( const GenericImage

& image, T scalar ) +{ + GenericImage

result( image ); + (void)(result /= scalar); + return result; +} + +/*! + * Returns the result of raising an \a image to a \a scalar. The operation is + * performed on the current selection of the specified \a image. + * \ingroup image_scalar_operators + */ +template inline +GenericImage

operator ^( const GenericImage

& image, T scalar ) +{ + GenericImage

result( image ); + (void)(result ^= scalar); + return result; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup image_operators Image Operators + */ + +/*! + * Returns the sum of two images. + * + * The image addition operation is performed for the current selection of the + * right-hand operand image, and is applied at the current anchor point of the + * left-hand image. + * + * The result is an image of the same template instantiation as the left-hand + * operand image. + * + * \ingroup image_operators + */ +template inline +GenericImage operator +( const GenericImage& image1, const GenericImage& image2 ) +{ + GenericImage result( image1 ); + (void)(result += image2); + return result; +} + +/*! + * Returns the difference of two images. + * + * The image subtraction operation is performed for the current selection of + * the right-hand operand image, and is applied at the current anchor point of + * the left-hand image. + * + * The result is an image of the same template instantiation as the left-hand + * operand image. + * + * \ingroup image_operators + */ +template inline +GenericImage operator -( const GenericImage& image1, const GenericImage& image2 ) +{ + GenericImage result( image1 ); + (void)(result -= image2); + return result; +} + +/*! + * Returns the product of two images. + * + * The image multiplication operation is performed for the current selection of + * the right-hand operand image, and is applied at the current anchor point of + * the left-hand image. + * + * The result is an image of the same template instantiation as the left-hand + * operand image. + * + * \ingroup image_operators + */ +template inline +GenericImage operator *( const GenericImage& image1, const GenericImage& image2 ) +{ + GenericImage result( image1 ); + (void)(result *= image2); + return result; +} + +/*! + * Returns the result of dividing one image \a image1 by another image + * \a image2. + * + * The image division operation is performed for the current selection of the + * right-hand operand image, and is applied at the current anchor point of the + * left-hand image. + * + * The result is an image of the same template instantiation as the left-hand + * operand image. + * + * \ingroup image_operators + */ +template inline +GenericImage operator /( const GenericImage& image1, const GenericImage& image2 ) +{ + GenericImage result( image1 ); + (void)(result /= image2); + return result; +} + +/*! + * Returns the result of raising one image \a image1 to another image + * \a image2. + * + * The image exponentiation operation is performed for the current selection of + * the right-hand operand image, and is applied at the current anchor point of + * the left-hand image. + * + * The result is an image of the same template instantiation as the left-hand + * operand image. + * + * \ingroup image_operators + */ +template inline +GenericImage operator ^( const GenericImage& image1, const GenericImage& image2 ) +{ + GenericImage result( image1 ); + (void)(result ^= image2); + return result; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_IMAGE_INSTANTIATE + +/*! + * \defgroup image_types_2d Image Types + */ + +/*! + * \class pcl::FImage + * \ingroup image_types_2d + * \brief 32-bit floating point real image. + * + * %FImage is a template instantiation of GenericImage for FloatPixelTraits. + */ +typedef GenericImage FImage; + +/*! + * \class pcl::DImage + * \ingroup image_types_2d + * \brief 64-bit floating point real image. + * + * %DImage is a template instantiation of GenericImage for DoublePixelTraits. + */ +typedef GenericImage DImage; + +/*! + * \class pcl::FComplexImage + * \ingroup image_types_2d + * \brief 32-bit floating point complex image. + * + * %FComplexImage is a template instantiation of GenericImage for the + * ComplexPixelTraits class. + */ +typedef GenericImage FComplexImage; + +/*! + * \class pcl::DComplexImage + * \ingroup image_types_2d + * \brief 64-bit floating point complex image. + * + * %DComplexImage is a template instantiation of GenericImage for the + * DComplexPixelTraits class. + */ +typedef GenericImage DComplexImage; + +/*! + * \class pcl::UInt8Image + * \ingroup image_types_2d + * \brief 8-bit unsigned integer image. + * + * %UInt8Image is a template instantiation of GenericImage for the + * UInt8PixelTraits class. + */ +typedef GenericImage UInt8Image; + +/*! + * \class pcl::UInt16Image + * \ingroup image_types_2d + * \brief 16-bit unsigned integer image. + * + * %UInt16Image is a template instantiation of GenericImage for the + * UInt16PixelTraits class. + */ +typedef GenericImage UInt16Image; + +/*! + * \class pcl::UInt32Image + * \ingroup image_types_2d + * \brief 32-bit unsigned integer image. + * + * %UInt32Image is a template instantiation of GenericImage for the + * UInt32PixelTraits class. + */ +typedef GenericImage UInt32Image; + +/*! + * \class pcl::Image + * \ingroup image_types_2d + * \brief 32-bit floating point real image. + * + * %Image is an alias for FImage. It is a template instantiation of + * GenericImage for the FloatPixelTraits class. + */ +typedef FImage Image; + +/*! + * \class pcl::ComplexImage + * \ingroup image_types_2d + * \brief 32-bit floating point complex image. + * + * %ComplexImage is an alias for FComplexImage. It is a template instantiation + * of GenericImage for the ComplexPixelTraits class. + */ +typedef FComplexImage ComplexImage; + +#endif // __PCL_NO_IMAGE_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_IMAGE_VARIANT_AUTO + +#ifndef __PCL_ImageVariant_h +#include +#endif + +#endif // __PCL_NO_IMAGE_VARIANT_AUTO + +// ---------------------------------------------------------------------------- + +#endif // __PCL_Image_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Image.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageColor.h b/3rdparty/include/pcl/ImageColor.h new file mode 100644 index 0000000..4183ece --- /dev/null +++ b/3rdparty/include/pcl/ImageColor.h @@ -0,0 +1,258 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageColor.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageColor_h +#define __PCL_ImageColor_h + +/// \file pcl/ImageColor.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_colorSpace m_color->colorSpace +#define m_RGBWS m_color->RGBWS + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageColor + * \brief Implements color space properties of images. + * + * %ImageColor defines the color space and the RGB Working Space for an image. + * + * Supported color spaces are defined and enumerated by the ColorSpace class. + * + * An RGB Working Space (RGBWS) is used by PCL and the PixInsight core + * application to perform luminance/chrominance separations and color space + * conversions. Note that a RGBWS has nothing to do with color management and + * ICC profiles in the PixInsight/PCL environment. An RGBWS is used for image + * processing tasks exclusively, and \e never for color management tasks. + * + * RGB working spaces are implemented by the RGBColorSystem class. + * + * Note that for a shared image (that is, an image living in the PixInsight + * core application) the RGBWS is controlled exclusively by its parent + * ImageWindow. + * + * \sa ImageGeometry, AbstractImage, GenericImage + */ +class PCL_CLASS ImageColor +{ +public: + + /*! + * An enumerated type that represents the set of supported color spaces. + * Valid constants for this enumeration are defined in the ColorSpace + * namespace. + */ + typedef ColorSpace::value_type color_space; + + /*! + * Returns a reference to the RGB working space associated with this image. + */ + const RGBColorSystem& RGBWorkingSpace() const noexcept + { + return m_RGBWS; + } + + /*! + * Associates a given RGB working space (RGBWS) with this image. + * + * \note For shared images (that is, images living in the PixInsight core + * application), the RGB working space cannot be changed by calling this + * function. This is because the RGBWS of a shared image is a property + * controlled by its parent image window. See the documentation for the + * ImageWindow class. + */ + virtual void SetRGBWorkingSpace( const RGBColorSystem& RGBWS ) + { + m_RGBWS = RGBWS; + } + + /*! + * Returns a reference to the current default RGB working space (RGBWS). If + * you don't change it, the factory-default RGBWS corresponds to the sRGB + * color space. + * + * \note This function only works for local images. For shared images, the + * default RGBWS is controlled by the ImageWindow class. + */ + static const RGBColorSystem& DefaultRGBWorkingSpace() noexcept + { + return s_defaultRGBWS; + } + + /*! + * Selects the specified RGB working space \a RGBWS as the default RGB + * working space for local images. The default RGBWS is associated with + * newly created local images; existing images won't be affected by this + * setting. + * + * \note This function only works for local images. For shared images, the + * default RGBWS is controlled exclusively by the ImageWindow class. + */ + static void SetDefaultRGBWorkingSpace( const RGBColorSystem& RGBWS ) + { + s_defaultRGBWS = RGBWS; + } + + /*! + * Resets the default RGB working space (RGBWS) to the factory-default sRGB + * color space. + */ + static void ResetDefaultRGBWorkingSpace() + { + s_defaultRGBWS = RGBColorSystem::sRGB; + } + + /*! + * Returns true iff this is a color image. Returns false if this is a + * grayscale monochrome image. + */ + bool IsColor() const noexcept + { + return m_colorSpace != ColorSpace::Gray; + } + + /*! + * Returns the color space of this image. This function returns the value of + * a symbolic constant enumerated by the ColorSpace namespace. + */ + color_space ColorSpace() const noexcept + { + return m_colorSpace; + } + + /*! + * Returns the identifier of a nominal channel \a c in the current color + * space of this image. + */ + String ChannelId( int c ) const noexcept + { + return ColorSpace::ChannelId( m_colorSpace, c ); + } + +protected: + + struct Color + { + color_space colorSpace; + RGBColorSystem RGBWS; + + Color( color_space cs = ColorSpace::Gray ) + : colorSpace( cs ) + , RGBWS( s_defaultRGBWS ) + { + } + + Color( const Color& ) = default; + + void Assign( const Color& x ) + { + colorSpace = x.colorSpace; + RGBWS = x.RGBWS; + } + + void Reset() noexcept + { + colorSpace = ColorSpace::Gray; + } + }; + + Color* m_color = nullptr; + + /* + * The default RGB Working Space + * + * Unless explicitly modified, this corresponds to the sRGB space. + * + * Note that shared images don't use this default RGBWS, but the global + * RGBWS currently selected in the PixInsight core application. + */ + static RGBColorSystem s_defaultRGBWS; + + ImageColor() = default; + ImageColor( const ImageColor& ) = default; + ImageColor& operator =( const ImageColor& ) = default; + + virtual ~ImageColor() + { + m_color = nullptr; + } + + void Swap( ImageColor& image ) noexcept + { + pcl::Swap( m_color, image.m_color ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_colorSpace +#undef m_RGBWS + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageColor_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageColor.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageDescription.h b/3rdparty/include/pcl/ImageDescription.h new file mode 100644 index 0000000..135fe6b --- /dev/null +++ b/3rdparty/include/pcl/ImageDescription.h @@ -0,0 +1,141 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageDescription.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageDescription_h +#define __PCL_ImageDescription_h + +/// \file pcl/ImageDescription.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageDescription + * \brief A structure to transport basic information and options for an image + * stored in an image file + * + * This structure is used (instantiated in ImageDescriptionArray containers) by + * the FileFormatImplementation and FileFormaInstance classes to describe + * individual images stored in image files. + * + * \sa ImageInfo, ImageOptions, FileFormatImplementation, FileFormatInstance + */ +struct PCL_CLASS ImageDescription +{ + ImageInfo info; //!< Basic image information: dimensions and color space. + ImageOptions options; //!< Format-independent image file options. + IsoString id; //!< Identifier of this image. Usually a running counter starting from zero. + + /*! + * Default constructor. + */ + ImageDescription() = default; + + /*! + * Constructs an %ImageDescription object from the specified ImageInfo, + * ImageOptions and image identifier. + */ + ImageDescription( const ImageInfo& i, const ImageOptions& o, const IsoString& s = IsoString() ) + : info( i ), options( o ), id( s ) + { + } + + ImageDescription( const ImageInfo& i, const ImageOptions& o, const String& s ) + : ImageDescription( i, o, IsoString( s ) ) + { + } + + /*! + * Constructs an %ImageDescription object from the specified ImageInfo + * structure with default format-independent options and an empty image + * identifier. + */ + ImageDescription( const ImageInfo& i ) + : info( i ) + { + } + + /*! + * Copy constructor. + */ + ImageDescription( const ImageDescription& ) = default; + + /*! + * Cop assignment operator. Returns a reference to this object. + */ + ImageDescription& operator =( const ImageDescription& ) = default; +}; + +/*! + * \class pcl::ImageDescriptionArray + * \brief Dynamic array of ImageDescription structures + * + * %ImageDescriptionArray is a template instantiation of Array for + * ImageDescription. + */ +typedef Array ImageDescriptionArray; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageDescription_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageDescription.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageGeometry.h b/3rdparty/include/pcl/ImageGeometry.h new file mode 100644 index 0000000..8538ec7 --- /dev/null +++ b/3rdparty/include/pcl/ImageGeometry.h @@ -0,0 +1,404 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageGeometry.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageGeometry_h +#define __PCL_ImageGeometry_h + +/// \file pcl/ImageGeometry.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_width m_geometry->width +#define m_height m_geometry->height +#define m_numberOfChannels m_geometry->numberOfChannels + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageGeometry + * \brief Implements geometric properties of two-dimensional images. + * + * %ImageGeometry defines the dimensions in pixels and the channel count of a + * two-dimensional image. + * + * \sa ImageColor, Abstractmage, GenericImage + */ +class PCL_CLASS ImageGeometry +{ +public: + + /*! + * Returns the width of this image in pixels. + */ + int Width() const noexcept + { + return m_width; + } + + /*! + * Returns the height of this image in pixels. + */ + int Height() const noexcept + { + return m_height; + } + + /*! + * Returns the total number of channels in this image, including nominal and + * alpha channels. + */ + int NumberOfChannels() const noexcept + { + return m_numberOfChannels; + } + + /*! + * Returns the index of the last existing channel in this image. This is the + * largest valid channel index that can be used with this image, + * corresponding to a nominal or alpha channel. If this image is empty, this + * function returns -1. + */ + int LastChannel() const noexcept + { + return m_numberOfChannels-1; + } + + /*! + * Returns true iff the specified channel index \a c is valid. A valid + * channel index corresponds to an existing channel in this image. + */ + bool IsValidChannelIndex( int c ) const noexcept + { + return c >= 0 && c < m_numberOfChannels; + } + + /*! + * Returns true iff this image is empty, i.e. if its area is zero. + */ + bool IsEmpty() const noexcept + { + return m_width <= 0 || m_height <= 0 || m_numberOfChannels <= 0; + } + + /*! + * Returns the bounding rectangle of this image. The upper left corner of + * the returned rectangle (x0, y0) is always (0,0). The lower right corner + * coordinates (x1, y1) correspond to the width and height of the image. + */ + Rect Bounds() const noexcept + { + return Rect( m_width, m_height ); + } + + /*! + * Returns true iff this image includes the specified point \a p in image + * coordinates. + */ + template + bool Includes( const GenericPoint& p ) const noexcept + { + return Includes( p.x, p.y ); + } + + /*! + * Returns true iff this image includes the specified rectangle \a r in image + * coordinates. + */ + template + bool Includes( const GenericRectangle& r ) const noexcept + { + return Includes( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Returns true iff this image includes a rectangle given by its separate + * image coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical). + * \param x1,y1 Lower right corner coordinates (horizontal, vertical). + */ + template + bool Includes( T x0, T y0, T x1, T y1 ) const noexcept + { + pcl::OrderRect( x0, y0, x1, y1 ); + return Includes( x0, y0 ) && Includes( x1-T( 1 ), y1-T( 1 ) ); + } + + /*! + * Returns true iff this image includes a point given by its separate image + * coordinates. + * + * \param x Horizontal coordinate. + * \param y Vertical coordinate. + */ + template + bool Includes( T x, T y ) const noexcept + { + return x < m_width && y < m_height && x >= 0 && y >= 0; + } + + /*! + * Returns true iff this image intersects with the specified rectangle \a r + * in image coordinates. + */ + template + bool Intersects( const pcl::GenericRectangle& r ) const noexcept + { + return Intersects( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Returns true iff this image intersects with a rectangle given by its + * separate image coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical). + * \param x1,y1 Lower right corner coordinates (horizontal, vertical). + */ + template + bool Intersects( T x0, T y0, T x1, T y1 ) const noexcept + { + pcl::OrderRect( x0, y0, x1, y1 ); + return x0 < m_width && y0 < m_height && x1 > T( 0 ) && y1 > T( 0 ); + } + + /*! + * Constrains a point \a p to stay within the boundaries of this image. + * Returns true iff the original point location is included in this image. + */ + template + bool Clip( pcl::GenericPoint& p ) const noexcept + { + return Clip( p.x, p.y ); + } + + /*! + * Constrains two point coordinates \a x and \a y to stay within the + * boundaries of this image. + * + * \param[out] x Horizontal coordinate of the clipped point. + * \param[out] y Vertical coordinate of the clipped point. + * + * Returns true iff the original point location is included in this image. + */ + template + bool Clip( T& x, T& y ) const noexcept + { + bool in = false; + + if ( x >= T( m_width ) ) x = T( m_width-1 ); + else if ( x < T( 0 ) ) x = T( 0 ); + else in = true; + + if ( y >= T( m_height ) ) y = T( m_height-1 ); + else if ( y < T( 0 ) ) y = T( 0 ); + else return in; + + return false; + } + + /*! + * Constrains a rectangular region \a r in image coordinates to fit into the + * boundaries of this image. Also ensures coherence of clipped rectangular + * coordinates such that r.x0 <= r.x1 and r.y0 <= r.y1. + * + * Returns true iff the original rectangle intersects this image. + */ + template + bool Clip( pcl::GenericRectangle& r ) const noexcept + { + return Clip( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Constrains a rectangular region, given by its separate image + * coordinates, to fit into the boundaries of this image. Also ensures + * coherence of rectangular coordinates, such that x0 <= x1 and y0 <= y1. + * + * \param[out] x0,y0 Upper left corner coordinates (horizontal, vertical) + * of the rectangle that will be clipped. + * + * \param[out] x1,y1 Lower right corner coordinates (horizontal, vertical) + * of the rectangle that will be clipped. + * + * Returns true iff the original rectangle intersects the image. + */ + template + bool Clip( T& x0, T& y0, T& x1, T& y1 ) const noexcept + { + pcl::OrderRect( x0, y0, x1, y1 ); + + int out = 0; + + if ( x0 >= T( m_width ) ) x0 = T( m_width ), ++out; + else if ( x0 < T( 0 ) ) x0 = T( 0 ); + + if ( y0 >= T( m_height ) ) y0 = T( m_height ), ++out; + else if ( y0 < T( 0 ) ) y0 = T( 0 ); + + if ( x1 > T( m_width ) ) x1 = T( m_width ); + else if ( x1 <= T( 0 ) ) x1 = T( 0 ), ++out; + + if ( y1 > T( m_height ) ) y1 = T( m_height ); + else if ( y1 <= T( 0 ) ) y1 = T( 0 ), ++out; + + return !out; + } + + /*! + * Returns the number of pixels in this image, or its area in square pixels. + */ + size_type NumberOfPixels() const noexcept + { + return size_type( m_width )*size_type( m_height ); + } + + /*! + * Returns the total number of samples in this image, or the area in square + * pixels multiplied by the number of channels, including alpha channels. + */ + size_type NumberOfSamples() const noexcept + { + return NumberOfPixels()*size_type( m_numberOfChannels ); + } + + /*! + * Returns the offset of a given pixel row \a y (also known as scan + * line) from the beginning of a channel's data block. + */ + distance_type RowOffset( int y ) const noexcept + { + return distance_type( y )*distance_type( m_width ); + } + + /*! + * Returns the offset of a given pixel from the beginning of a channel's + * data block. + * + * \param x Horizontal pixel coordinate. + * \param y Vertical pixel coordinate. + */ + distance_type PixelOffset( int x, int y ) const noexcept + { + return RowOffset( y ) + distance_type( x ); + } + +protected: + + /* + * Image geometry + */ + struct Geometry + { + int width = 0; + int height = 0; + int numberOfChannels = 0; + + Geometry() = default; + Geometry( const Geometry& ) = default; + + size_type NumberOfPixels() const noexcept + { + return size_type( width )*size_type( height ); + } + + void Assign( const Geometry& x ) noexcept + { + width = x.width; + height = x.height; + numberOfChannels = x.numberOfChannels; + } + + void Reset() noexcept + { + width = height = numberOfChannels = 0; + } + }; + + Geometry* m_geometry = nullptr; + + ImageGeometry() = default; + ImageGeometry( const ImageGeometry& ) = default; + ImageGeometry& operator =( const ImageGeometry& ) = default; + + virtual ~ImageGeometry() + { + m_geometry = nullptr; + } + + void Swap( ImageGeometry& image ) noexcept + { + pcl::Swap( m_geometry, image.m_geometry ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_numberOfChannels + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageGeometry_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageGeometry.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageInfo.h b/3rdparty/include/pcl/ImageInfo.h new file mode 100644 index 0000000..73f733c --- /dev/null +++ b/3rdparty/include/pcl/ImageInfo.h @@ -0,0 +1,180 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageInfo.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageInfo_h +#define __PCL_ImageInfo_h + +/// \file pcl/ImageInfo.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageInfo + * \brief A simple structure to hold basic information about images + */ +class PCL_CLASS ImageInfo +{ +public: + + /*! + * Represents a color space. See the ColorSpace namespace for supported + * values. + */ + typedef ColorSpace::value_type color_space; + + int width; //!< %Image width in pixels + int height; //!< %Image height in pixels + int numberOfChannels; //!< Number of channels, including alpha channels + color_space colorSpace; //!< %Color space, compatible with ImageColor::color_space + bool supported; //!< Whether we support this image + + /*! + * Constructs an %ImageInfo object with default values. + */ + ImageInfo() + { + Reset(); + } + + /*! + * Copy constructor. + */ + ImageInfo( const ImageInfo& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ImageInfo& operator =( const ImageInfo& ) = default; + + /*! + * Constructs an %ImageInfo object with data obtained from the specified + * \a image. + * + * The width, height and numberOfChannels data members are set to the + * dimensions of the selected rectangle and the number of selected channels + * in \a image, respectively. + */ + ImageInfo( const AbstractImage& image ) + { + width = image.SelectedRectangle().Width(); + height = image.SelectedRectangle().Height(); + numberOfChannels = image.NumberOfSelectedChannels(); + colorSpace = image.ColorSpace(); + supported = IsValid(); + } + + /*! + * Returns the number of pixels in the image, or width*height. + */ + size_type NumberOfPixels() const + { + return size_type( width )*size_type( height ); + } + + /*! + * Returns the number of samples in the image, or + * width*height*numberOfChannels. + */ + size_type NumberOfSamples() const + { + return NumberOfPixels()*size_type( numberOfChannels ); + } + + /*! + * Initializes this %ImageInfo structure with default values, corresponding + * to an empty image. + */ + void Reset() + { + width = height = numberOfChannels = 0; + colorSpace = ColorSpace::Unknown; + supported = false; + } + + /*! + * Returns true iff this object describes a valid nonempty image. + */ + bool IsValid() const + { + return width > 0 && + height > 0 && + colorSpace != ColorSpace::Unknown && + numberOfChannels >= ((colorSpace == ColorSpace::Gray) ? 1 : 3); + } + + /*! + * Returns true iff this object is equal to another instance \a x. + */ + bool operator ==( const ImageInfo& x ) const + { + return width == x.width && + height == x.height && + numberOfChannels == x.numberOfChannels && + colorSpace == x.colorSpace; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageInfo_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageInfo.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageOptions.h b/3rdparty/include/pcl/ImageOptions.h new file mode 100644 index 0000000..a370446 --- /dev/null +++ b/3rdparty/include/pcl/ImageOptions.h @@ -0,0 +1,186 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageOptions.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageOptions_h +#define __PCL_ImageOptions_h + +/// \file pcl/ImageOptions.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::CFAType + * \brief Color Filter Array types. + * + * A CFA (Color Filter Array) is a mosaic of color filters placed in front of + * an image sensor, such as CMOS sensors of digital cameras. This enumeration + * defines the CFA types currently supported in PCL. + * + * + * + * + * + *
CFAType::None The image uses no CFA pattern, or the CFA pattern is unsupported.
CFAType::BGGR, CFAType::GRBG, CFAType::GBRG, CFAType::RGGB RGB CFA types.
CFAType::CYGM Cyan/Yellow/Green/Magenta CFA (used by a few digital cameras).
+ */ +namespace CFAType +{ + enum value_type { None, BGGR, GRBG, GBRG, RGGB, CYGM, NumberOfCFATypes }; + + /*! + * Returns a string representing a type of color filter array. + * + * \param cfa A supported CFA type, identified by its corresponding + * symbolic constant. + */ + String Name( int cfa ); +} + +/*! + * \class ImageOptions + * \brief Format-independent, fundamental image stream options. + */ +class PCL_CLASS ImageOptions +{ +public: + + uint8 bitsPerSample : 8; //!< Number of bits per sample: 8, 16, 32 or 64. The default value is 16. + bool ieeefpSampleFormat : 1; //!< Sample type: IEEE 754 floating point (true) or integers (false). The default value is false. + bool complexSample : 1; //!< Sample type: Complex (true) or real (false) samples. The default value is false. + bool signedIntegers : 1; //!< Integer sample values are signed (true) or unsigned (false). The default value is false. + bool metricResolution : 1; //!< Resolution units: centimeter (true) or inch (false). The default value is false. + bool readNormalized : 1; //!< Normalize floating-point sample values after reading. The default value is true. + bool embedICCProfile : 1; //!< Embed an ICC profile (when available). The default value is true. + bool embedThumbnail : 1; //!< Embed thumbnail images (when available). The default value is false. + bool embedProperties : 1; //!< Embed data properties (when available). The default value is true. + bool embedRGBWS : 1; //!< Embed RGB working space parameters. The default value is true. + bool embedDisplayFunction : 1; //!< Embed display function (aka STF) parameters. The default value is true. + bool embedColorFilterArray : 1; //!< Embed color filter array (CFA) description. The default value is true. + bool embedProcessingHistory : 1; //!< Embed existing processing history as an XML document. The default value is false. + bool embedPreviewRects : 1; //!< Embed existing preview rectangles and their identifiers. The default value is false. + int __rsv__ : 11; // Reserved for future extensions; must be zero. + + double lowerRange; //!< Lower limit to normalize read floating-point samples. The default value is 0. + double upperRange; //!< Upper limit to normalize read floating-point samples. The default value is 1. + + double xResolution; //!< Horizontal resolution in pixels per resolution unit (0=unknown). The default value is 72. + double yResolution; //!< Vertical resolution in pixels per resolution unit (0=unknown). The default value is 72. + + int isoSpeed; //!< ISO speed as specified in ISO 12232 (0=unknown) + float exposure; //!< Exposure in seconds (0=unknown) + float aperture; //!< Focal length divided by lens diameter (F/D) (0=unknown) + float focalLength; //!< Focal length in millimeters (0=unknown) + int cfaType; //!< Color Filter Array type. See CFAType namespace for possible values (0=none). + + /*! + * Constructs an %ImageOptions structure with default values. + */ + ImageOptions() + { + Reset(); + } + + /*! + * Copy constructor. + */ + ImageOptions( const ImageOptions& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ImageOptions& operator =( const ImageOptions& ) = default; + + /*! + * Initializes all data members to default values. + */ + void Reset() + { + bitsPerSample = 16; + ieeefpSampleFormat = false; + complexSample = false; + signedIntegers = false; + metricResolution = false; + readNormalized = true; + embedICCProfile = true; + embedThumbnail = false; + embedProperties = true; + embedRGBWS = true; + embedDisplayFunction = true; + embedColorFilterArray = true; + embedProcessingHistory = false; + embedPreviewRects = false; + __rsv__ = 0; + lowerRange = 0; + upperRange = 1; + xResolution = 72; + yResolution = 72; + isoSpeed = 0; + exposure = 0; + aperture = 0; + focalLength = 0; + cfaType = CFAType::None; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageOptions_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageOptions.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageRenderingModes.h b/3rdparty/include/pcl/ImageRenderingModes.h new file mode 100644 index 0000000..f1826a1 --- /dev/null +++ b/3rdparty/include/pcl/ImageRenderingModes.h @@ -0,0 +1,189 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageRenderingModes.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageRenderingModes_h +#define __PCL_ImageRenderingModes_h + +/// \file pcl/ImageRenderingModes.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::DisplayChannel + * \brief Rendering modes for image display and bitmap renditions. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
DisplayChannel::Invalid Represents an invalid or undefined display mode
DisplayChannel::RGBK Composite RGB or Gray (normal display mode)
DisplayChannel::Red Red channel as grayscale
DisplayChannel::Green Green channel as grayscale
DisplayChannel::Blue Blue channel as grayscale
DisplayChannel::CIE_L CIE L* component
DisplayChannel::Lightness A synomym for DisplayChannel::CIE_L
DisplayChannel::ChrominanceRG Chrominance, CIE a*,b* as red+green composite
DisplayChannel::ChrominanceLFixed Chrominance, CIE L* fixed to 0.5
DisplayChannel::CIE_a CIE a* component
DisplayChannel::CIE_b CIE b* component
DisplayChannel::CIE_c CIE c* component
DisplayChannel::CIE_h CIE h* component
DisplayChannel::CIE_X CIE X component
DisplayChannel::CIE_Y CIE Y component
DisplayChannel::CIE_Z CIE Z component
DisplayChannel::Hue Hue from the HSV/HSI spaces
DisplayChannel::SaturationHSV Saturation from HSV
DisplayChannel::SaturationHSI Saturation from HSI
DisplayChannel::Value Value from HSV (V = Max(R,G,B))
DisplayChannel::Intensity Intensity from HSI (I = 0.5*(Min(R,G,B) + Max(R,G,B)))
DisplayChannel::Alpha First alpha channel (the rest as Alpha+n)
+ */ +namespace DisplayChannel +{ + enum value_type + { + Invalid = -1, + RGBK = 0, // Composite RGB or Gray (normal display mode) + Red, // Red channel as grayscale + Green, // Green channel as grayscale + Blue, // Blue channel as grayscale + CIE_L, // CIE L* + Lightness = CIE_L, // Lightness = CIE L* + Luminance = CIE_L, // ### Deprecated - retained for compatibility -> suppress in PCL 2.0 + ChrominanceRG, // Chrominance, CIE a*,b* as red+green composite + ChrominanceLFixed, // Chrominance, CIE L* fixed to 0.5 + CIE_a, // CIE a* + CIE_b, // CIE b* + CIE_c, // CIE c* + CIE_h, // CIE h* + CIE_X, // CIE X + CIE_Y, // CIE Y + CIE_Z, // CIE Z + Hue, // Hue from the HSV/HSI spaces + SaturationHSV, // Saturation from HSV + SaturationHSI, // Saturation from HSI + Value, // Value from HSV (V = Max(R,G,B)) + Intensity, // Intensity from HSI (I = 0.5*(Min(R,G,B) + Max(R,G,B))) + Alpha // First alpha channel (the rest as Alpha+n) + }; + + inline bool IsLuminanceOrChrominance( value_type c ) + { + return c >= Lightness && c < Hue; + } +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::MaskMode + * \brief Mask rendering modes for image display and bitmap renditions. + * + * Mask rendering modes define how masked pixels are represented on bitmap + * renditions of images. The \e traditional mode used by PixInsight has always + * been MaskMode::Multiply, which simply multiplies each pixel of a screen + * rendition by its mask image counterpart. + * + * Since PixInsight version 1.5.5, an additional set of \e overlay mask + * rendering modes is available, providing more accurate representations in + * several user-selectable colors. A new \e replace mode has also been + * implemented to facilitate blinking comparisons between images and masks. The + * default mask rendering mode has been set to MaskMode::OverlayRed. + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MaskMode::Replace Replaces the image by the mask.
MaskMode::Multiply Multiplies the image by the mask. This is the \e traditional mask rendering mode used by PixInsight before version 1.5.5.
MaskMode::OverlayRed Represents mask-protected pixels as red pixels on screen renditions.
MaskMode::OverlayGreen Represents mask-protected pixels as green pixels on screen renditions.
MaskMode::OverlayBlue Represents mask-protected pixels as blue pixels on screen renditions.
MaskMode::OverlayYellow Represents mask-protected pixels as yellow pixels (red+green) on screen renditions.
MaskMode::OverlayMagenta Represents mask-protected pixels as magenta pixels (red+blue) on screen renditions.
MaskMode::OverlayCyan Represents mask-protected pixels as cyan pixels (green+blue) on screen renditions.
MaskMode::OverlayOrange Represents mask-protected pixels as orange pixels (red + 1/2*green) on screen renditions.
MaskMode::OverlayViolet Represents mask-protected pixels as violet pixels (1/2*red + blue) on screen renditions.
MaskMode::Default Identifies the default mask rendering mode used by the PixInsight core application. Currently this corresponds to MaskMode::OverlayRed.
+ */ +namespace MaskMode +{ + enum value_type + { + Replace, // Replaces the image by the mask + Multiply, // Multiplies the image by the mask (PI's traditional mode) + OverlayRed, // Red mask + OverlayGreen, // Green mask + OverlayBlue, // Blue mask + OverlayYellow, // Yellow mask (red+green) + OverlayMagenta, // Magenta mask (red+blue) + OverlayCyan, // Cyan mask (green+blue) + OverlayOrange, // Orange mask (red + 1/2*green) + OverlayViolet, // Violet mask (1/2*red + blue) + + NumberOfModes, + + Default = OverlayRed + }; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageRenderingModes_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageRenderingModes.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageResolution.h b/3rdparty/include/pcl/ImageResolution.h new file mode 100644 index 0000000..e56ed43 --- /dev/null +++ b/3rdparty/include/pcl/ImageResolution.h @@ -0,0 +1,207 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageResolution.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageResolution_h +#define __PCL_ImageResolution_h + +/// \file pcl/ImageResolution.h + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageResolution + * \brief %Image resolution data + * + * ### TODO: Write a detailed description for %ImageResolution. + */ +class PCL_CLASS ImageResolution +{ +public: + + /*! + * Constructs a default %ImageResolution object. + */ + ImageResolution() = default; + + /*! + * Copy constructor. + */ + ImageResolution( const ImageResolution& ) = default; + + /*! + * Assignment operator. Returns a reference to this object. + */ + ImageResolution& operator =( const ImageResolution& ) = default; + + /*! + * Gets resolution values for both \a x and \a y axes in pixels per + * resolution unit. + * + * \sa HorizontalResolution(), VerticalResolution() + */ + void GetResolution( double& x, double& y ) + { + x = xResolution; y = yResolution; + } + + /*! + * Returns the horizontal (X-axis) resolution in pixels per resolution unit. + * + * \sa VerticalResolution(), GetResolution() + */ + double HorizontalResolution() const + { + return xResolution; + } + + /*! + * Returns the vertical (Y-axis) resolution in pixels per resolution unit. + * + * \sa HorizontalResolution(), GetResolution() + */ + double VerticalResolution() const + { + return yResolution; + } + + /*! + * Sets resolution values for both \a x and \a y axes in pixels per + * resolution unit. + * + * \sa GetResolution(), SetResolution( double ) + */ + void SetResolution( double x, double y ) + { + PCL_PRECONDITION( x >= 0 ) + PCL_PRECONDITION( y >= 0 ) + xResolution = pcl::Max( 0.0, x ); yResolution = pcl::Max( 0.0, y ); + } + + /*! + * Returns the resolution for both axes, in pixels per resolution unit. + * + * This member function is more meaningful for contexts where separate + * horizontal and vertical resolutions are not supported. + * + * \sa GetResolution(), SetResolution( double ), SetResolution( double, double ) + */ + double Resolution() const + { + return xResolution; + } + + /*! + * Sets the resolution for both axes, in pixels per resolution unit. + * + * This member function is more meaningful for contexts where separate + * horizontal and vertical resolutions are not supported. + * + * \sa Resolution(), HorizontalResolution(), VerticalResolution(), GetResolution() + */ + void SetResolution( double r ) + { + PCL_PRECONDITION( r >= 0 ) + xResolution = yResolution = pcl::Max( 0.0, r ); + } + + /*! + * Returns true iff this object express resolution in pixels per centimeter; + * false if it express resolution in pixels per inch. + * + * \sa SetMetricResolution() + */ + bool IsMetricResolution() const + { + return metric; + } + + /*! + * Sets the resolution unit for this %ImageResolution object. + * + * \param m If true, enables resolution in pixels per centimeter (metric + * resolution). If false, enables resolution in pixels per inch. + * + * \sa IsMetricResolution() + */ + void SetMetricResolution( bool m ) + { + metric = m; + } + +protected: + + /* + * Resolution in pixels per resolution unit (centimeters or inches). + */ + double xResolution = 72; + double yResolution = 72; + + /* + * Flag true when resolution values are expressed in pixels per centimeter. + * Pixels per inch otherwise. + */ + bool metric = false; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageResolution_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageResolution.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageSelections.h b/3rdparty/include/pcl/ImageSelections.h new file mode 100644 index 0000000..4062309 --- /dev/null +++ b/3rdparty/include/pcl/ImageSelections.h @@ -0,0 +1,122 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageSelections.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageSelections_h +#define __PCL_ImageSelections_h + +/// \file pcl/ImageSelections.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \struct ImageSelections + * \brief A structure used to store rectangular image selections, channel + * ranges, anchor points, and clipping ranges. + * + * %ImageSelections defines a rectangular area, a channel range, and an anchor + * point that can be used as a selection for 2D images. + * + * This structure also defines a clipping range in the normalized [0,1] range. + * Range clipping is used for calculation of statistics such as mean, median, + * standard deviation, average and median deviations, etc. + */ +struct PCL_CLASS ImageSelections +{ + int channel = 0; //!< First selected channel + int lastChannel = 0; //!< Last selected channel + Point point = 0; //!< Current anchor point + Rect rectangle = 0; //!< Current rectangular selection + double clipLow = 0.0; //!< Clipping range, lower bound + double clipHigh = 1.0; //!< Clipping range, upper bound + bool clippedLow = false; //!< Use range clipping, low pixels + bool clippedHigh = false; //!< Use range clipping, high pixels + + /*! + * Constructs a default %ImageSelections instance: + * + * \li Only the first channel selected: channel = lastChannel = 0. + * \li Empty rectangular selection: rectangle = Rect( 0 ). + * \li Anchor point at the origin of image coordinates: point = Point( 0 ). + * \li Clipping range lower bound = 0.0 + * \li Clipping range upper bound = 1.0 + * \li Range clipping disabled. + */ + ImageSelections() = default; + + /*! + * Copy constructor. + */ + ImageSelections( const ImageSelections& ) = default; + + /*! + * Assignment operator. Returns a reference to this object. + */ + ImageSelections& operator =( const ImageSelections& ) = default; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageSelections_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageSelections.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageStatistics.h b/3rdparty/include/pcl/ImageStatistics.h new file mode 100644 index 0000000..977d97b --- /dev/null +++ b/3rdparty/include/pcl/ImageStatistics.h @@ -0,0 +1,1000 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageStatistics.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageStatistics_h +#define __PCL_ImageStatistics_h + +/// \file pcl/ImageStatistics.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageStatistics + * \brief Descriptive image statistics. + * + * %ImageStatistics provides basic descriptive statistics of pixel sample + * values: + * + * \li Pixel sample count. + * + * \li Arithmetic mean. + * + * \li Median. + * + * \li Variance and standard deviation from the mean. + * + * \li Sum of squared samples. + * + * \li Average deviation from the median. + * + * \li Median absolute deviation from the median (MAD). + * + * \li Biweight midvariance. + * + * \li Percentage bend midvariance. + * + * \li Sn and Qn scale estimators of Rousseeuw/Croux. + * + * \li Extreme pixel sample values: minimum and maximum, and the image + * coordinates of their first occurrences. + * + * All statistics can be enabled/disabled individually. + * + * %ImageStatistics works like a unidirectional image transformation, although + * it isn't actually a derived class of ImageTransformation. Example of use: + * + * \code + * Image image; + * // ... + * ImageStatistics S; + * S.DisableVariance(); // disable variance and sigma calculations + * image.SelectChannel( 2 ); // select the third channel of image + * image.SelectRectangle( 80, 100, 450, 600 ); // select a rectangular region + * S << image; // calculate image statistics for selected samples + * Console().WriteLn( String().Format( "\\The median is: %.5f", S.Median() ) ); + * \endcode + * + * %ImageStatistics calculates statistical values for the currently selected + * region and channel of its source image. + */ +class PCL_CLASS ImageStatistics : public ParallelProcess +{ +public: + + /*! + * \class pcl::ImageStatistics::Data + * \brief Statistical data in the normalized [0,1] range. + */ + struct PCL_CLASS Data + { + size_type count = 0; //!< Total number of evaluated samples. + double mean = 0; //!< Arithmetic mean. + double sumOfSquares = 0; //!< Sum of squared samples. + double median = 0; //!< Median sample value. + double variance = 0; //!< Variance from the mean. + double stdDev = 0; //!< Standard deviation (=Sqrt(variance)). + double avgDev = 0; //!< Average deviation from the median. + double MAD = 0; //!< Median absolute deviation from the median. + double bwmv = 0; //!< Biweight midvariance. + double pbmv = 0; //!< Percentage bend midvariance. + double Sn = 0; //!< Sn scale estimator of Rousseeuw and Croux. + double Qn = 0; //!< Qn scale estimator of Rousseeuw and Croux. + double minimum = 0; //!< Minimum sample value. + Point minPos = Point( 0 ); //!< Position of the minimum sample value. + double maximum = 0; //!< Maximum sample value. + Point maxPos = Point( 0 ); //!< Position of the maximum sample value. + double low = 0; //!< If rejectLow, ignore samples less than or equal to this value. + double high = 0; //!< If rejectHigh, ignore samples greater than or equal to this value. + bool rejectLow = false; //!< Ignore samples with values less than or equal to low. + bool rejectHigh = false; //!< Ignore samples with values greater than or equal to high. + bool noExtremes = false; //!< Do not compute minimum and maximum sample values. + bool noMean = false; //!< Do not compute the mean, variance, and standard deviation. + bool noSumOfSquares = false; //!< Do not compute the sum of squared samples. + bool noVariance = false; //!< Do not compute variance and standard deviation. + bool noMedian = false; //!< Do not compute median, average deviation, MAD, biweight and bend midvariances. + bool noAvgDev = false; //!< Do not compute average deviation. + bool noMAD = false; //!< Do not compute MAD. + bool noBWMV = false; //!< Do not compute biweight midvariance. + bool noPBMV = false; //!< Do not compute percentage bend midvariance. + bool noSn = true; //!< Do not compute Sn estimator of scale. + bool noQn = true; //!< Do not compute Qn estimator of scale. + + /*! + * Constructs a default %ImageStatistics::Data structure. + */ + Data() = default; + + /*! + * Copy constructor. + */ + Data( const Data& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Data& operator =( const Data& ) = default; + + /*! + * Copies all data items from another instance \a x. + */ + void Assign( const Data& x ) + { + (void)operator =( x ); + } + + /*! + * Copies only statistical data items from another instance \a x. Does + * not copy operating parameters (such as low, high, noVariance, etc.). + */ + void AssignStatisticalData( const Data& x ) + { + count = x.count; + mean = x.mean; + sumOfSquares = x.sumOfSquares; + median = x.median; + variance = x.variance; + stdDev = x.stdDev; + avgDev = x.avgDev; + MAD = x.MAD; + bwmv = x.bwmv; + pbmv = x.pbmv; + Sn = x.Sn; + Qn = x.Qn; + minimum = x.minimum; + minPos = x.minPos; + maximum = x.maximum; + maxPos = x.maxPos; + } + }; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an %ImageStatistics object. + */ + ImageStatistics() = default; + + /*! + * Copy constructor. + */ + ImageStatistics( const ImageStatistics& ) = default; + + /*! + * Destroys an %ImageStatistics object. + */ + virtual ~ImageStatistics() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ImageStatistics& operator =( const ImageStatistics& ) = default; + + /*! + * Copies other %ImageStatistics object \a x to this object. + */ + void Assign( const ImageStatistics& x ) + { + (void)operator =( x ); + } + + /*! + * Returns a constant reference to the statistical data in this object. + */ + const Data& GetData() const + { + return m_data; + } + + /*! + * Returns the total number of evaluated samples. + */ + size_type Count() const + { + return m_data.count; + } + + /*! + * Returns the arithmetic mean of the evaluated sample values in the + * normalized [0,1] range. + */ + double Mean() const + { + return m_data.mean; + } + + /*! + * Returns the sum of squares for the evaluated sample values. Samples are + * evaluated in the normalized [0,1] range. + */ + double SumOfSquares() const + { + return m_data.sumOfSquares; + } + + /*! + * Returns the median of the evaluated sample values in the normalized [0,1] + * range. + */ + double Median() const + { + return m_data.median; + } + + /*! + * Returns the variance from the mean of the evaluated sample valuess in the + * normalized [0,1] range. + */ + double Variance() const + { + return m_data.variance; + } + + /*! + * Returns the variance from the mean of the evaluated sample valuess in the + * normalized [0,1] range. + * + * This member function is a synonym for Variance(). + */ + double Var() const + { + return Variance(); + } + + /*! + * Returns the standard deviation from the mean of the evaluated sample + * values in the normalized [0,1] range. + */ + double StandardDeviation() const + { + return m_data.stdDev; + } + + /*! + * Returns the standard deviation from the mean of the evaluated sample + * values in the normalized [0,1] range. + * + * This member function is a synonym for StandardDeviation(). + */ + double StdDev() const + { + return StandardDeviation(); + } + + /*! + * Returns the average deviation from the median of the evaluated sample + * values in the normalized [0,1] range. + * + * The average deviation is an estimator of the variability of a + * distribution around its central value. In the case of a deep sky image, + * the average deviation provides a good estimation of the width of the + * main histogram peak. + */ + double AverageDeviation() const + { + return m_data.avgDev; + } + + /*! + * Returns the average deviation from the median of the evaluated sample + * values in the normalized [0,1] range. + * + * This member function is a synonym for AverageDeviation(). + */ + double AvgDev() const + { + return AverageDeviation(); + } + + /*! + * Returns the median absolute deviation from the median (MAD) of the + * evaluated sample values in the normalized [0,1] range. + * + * The MAD is a well-known robust estimator of dispersion. + */ + double MAD() const + { + return m_data.MAD; + } + + /*! + * Returns the biweight midvariance of the evaluated pixel sample values in + * the normalized [0,1] range. + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the best possible breakdown). + */ + double BiweightMidvariance() const + { + return m_data.bwmv; + } + + /*! + * Returns the biweight midvariance of the evaluated pixel sample values in + * the normalized [0,1] range. + * + * This member function is a synonym for BiweightMidvariance(). + */ + double BWMV() const + { + return m_data.bwmv; + } + + /*! + * Returns the percentage bend midvariance of the evaluated pixel sample + * values in the normalized [0,1] range. + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. As implemented in %ImageStatistics (beta=0.2), its Gaussian + * efficiency is 67%. + */ + double BendMidvariance() const + { + return m_data.pbmv; + } + + /*! + * Returns the percentage bend midvariance of the evaluated pixel sample + * values in the normalized [0,1] range. + * + * This member function is a synonym for BendMidvariance(). + */ + double PBMV() const + { + return m_data.pbmv; + } + + /*! + * Returns the Sn scale estimator of Rousseeuw and Croux in the normalized + * [0,1] range. + * + * Sn is a robust estimator of scale (dispersion). It has the same outlier + * rejection properties as the MAD but its Gaussian efficiency is higher + * (58%; the efficiency of MAD is only 37%). Unlike the MAD, Sn does not + * measure variability around a central value, but between pairs of data + * points. This makes Sn a potentially better estimator for asymmetrical or + * skewed distributions. + */ + double Sn() const + { + return m_data.Sn; + } + + /*! + * Returns the Qn scale estimator of Rousseeuw and Croux in the normalized + * [0,1] range. + * + * Qn is a robust estimator of scale (dispersion). It has the same outlier + * rejection properties as the MAD, but its Gaussian efficiency is higher + * (87%; the efficiency of MAD is only 37%). Unlike the MAD, Qn does not + * measure variability around a central value, but between pairs of data + * points. This makes Qn a potentially better estimator for asymmetrical or + * skewed distributions. + */ + double Qn() const + { + return m_data.Qn; + } + + /*! + * Returns the minimum evaluated sample value in the normalized [0,1] range. + */ + double Minimum() const + { + return m_data.minimum; + } + + /*! + * Returns the minimum evaluated sample value in the normalized [0,1] range. + * + * This member function is a synonym for Maximum(). + */ + double Min() const + { + return Minimum(); + } + + /*! + * Returns the position (x,y coordinates) of the first occurrence of the + * minimum evaluated sample value. + */ + Point MinimumPosition() const + { + return m_data.minPos; + } + + /*! + * Returns the position (x,y coordinates) of the first occurrence of the + * minimum evaluated sample value. + * + * This member function is a synonym for MinimumPosition(). + */ + Point MinPos() const + { + return MinimumPosition(); + } + + /*! + * Returns the maximum evaluated sample value in the normalized [0,1] range. + */ + double Maximum() const + { + return m_data.maximum; + } + + /*! + * Returns the maximum evaluated sample value in the normalized [0,1] range. + * + * This member function is a synonym for Maximum(). + */ + double Max() const + { + return Maximum(); + } + + /*! + * Returns the position (x,y coordinates) of the first occurrence of the + * maximum evaluated sample value. + */ + Point MaximumPosition() const + { + return m_data.maxPos; + } + + /*! + * Returns the position (x,y coordinates) of the first occurrence of the + * maximum evaluated sample value. + * + * This member function is a synonym for MaximumPosition(). + */ + Point MaxPos() const + { + return MaximumPosition(); + } + + /*! + * Returns the low sample rejection limit in the [0,1] range. + * + * When low sample rejection is enabled, sample values less than or equal to + * the value returned by this function will be ignored during statistics + * calculation. + */ + double RejectionLow() const + { + return m_data.low; + } + + /*! + * Returns the high sample rejection limit in the [0,1] range. + * + * When high sample rejection is enabled, sample values greater than or + * equal to the value returned by this function will be ignored during + * statistics calculation. + */ + double RejectionHigh() const + { + return m_data.high; + } + + /*! + * Sets the \a low and \a high rejection limits in the [0,1] range. + * + * When sample rejection is enabled, sample values inside the ranges [0,low] + * and [high,1] will be ignored during statistics calculation. + */ + void SetRejectionLimits( double low, double high ) + { + m_data.low = Range( low, 0.0, 1.0 ); + m_data.high = Range( high, 0.0, 1.0 ); + if ( m_data.high < m_data.low ) + pcl::Swap( m_data.low, m_data.high ); + } + + /*! + * Returns true iff low sample rejection is enabled in this %ImageStatistics + * object. + * + * When low sample rejection is enabled, sample values less than or equal to + * the low sample rejection limit will be ignored during statistics + * calculation. + */ + bool IsLowRejectionEnabled() const + { + return m_data.rejectLow; + } + + /*! + * Returns true iff high sample rejection is enabled in this %ImageStatistics + * object. + * + * When high sample rejection is enabled, sample values greater than or + * equal to the high sample rejection limit will be ignored during + * statistics calculation. + */ + bool IsHighRejectionEnabled() const + { + return m_data.rejectHigh; + } + + /*! + * Enables low and/or high sample rejections. + * + * When sample rejection is enabled, sample values inside the ranges [0,low] + * and [high,1] will be ignored during statistics calculation (where low and + * high are the current low and high rejection limits). + */ + void EnableRejection( bool enableLow = true, bool enableHigh = true ) + { + m_data.rejectLow = enableLow; + m_data.rejectHigh = enableHigh; + } + + /*! + * Disables low and/or high sample rejection. + * + * This is a convenience member function, equivalent to + * EnableRejection( !disableLow, !disableHigh ). + */ + void DisableRejection( bool disableLow = true, bool disableHigh = true ) + { + EnableRejection( !disableLow, !disableHigh ); + } + + /*! + * Returns true iff calculation of extreme pixel sample values is currently + * enabled for this instance of %ImageStatistics. + */ + bool IsExtremesEnabled() const + { + return !m_data.noExtremes; + } + + /*! + * Enables calculation of extreme pixel sample values for this + * %ImageStatistics object. + */ + void EnableExtremes( bool enable = true ) + { + m_data.noExtremes = !enable; + } + + /*! + * Disables calculation of extreme pixel sample values for this + * %ImageStatistics object. + */ + void DisableExtremes( bool disable = true ) + { + m_data.noExtremes = disable; + } + + /*! + * Returns true iff calculation of the arithmetic mean is currently enabled + * for this instance of %ImageStatistics. + * + * When arithmetic mean calculation is disabled, the variance (and hence the + * standard deviation) is also disabled implicitly. + */ + bool IsMeanEnabled() const + { + return !m_data.noMean; + } + + /*! + * Enables calculation of the arithmetic mean for this %ImageStatistics + * object. + * + * When arithmetic mean calculation is disabled, the variance (and hence the + * standard deviation) is also disabled implicitly. + */ + void EnableMean( bool enable = true ) + { + m_data.noMean = !enable; + } + + /*! + * Disables calculation of the arithmetic mean for this %ImageStatistics + * object. + * + * When arithmetic mean calculation is disabled, the variance (and hence the + * standard deviation) is also disabled implicitly. + */ + void DisableMean( bool disable = true ) + { + m_data.noMean = disable; + } + + /*! + * Returns true iff calculation of the sum of squares is currently enabled + * for this instance of %ImageStatistics. + */ + bool IsSumOfSquaresEnabled() const + { + return !m_data.noSumOfSquares; + } + + /*! + * Enables calculation of the sum of squares for this object. + */ + void EnableSumOfSquares( bool enable = true ) + { + m_data.noSumOfSquares = !enable; + } + + /*! + * Disables calculation of the sum of squares for this object. + */ + void DisableSumOfSquares( bool disable = true ) + { + m_data.noSumOfSquares = disable; + } + + /*! + * Returns true iff calculation of the variance is currently enabled for + * this instance of %ImageStatistics. + */ + bool IsVarianceEnabled() const + { + return !m_data.noVariance; + } + + /*! + * Enables calculation of the variance for this %ImageStatistics object. + */ + void EnableVariance( bool enable = true ) + { + m_data.noVariance = !enable; + } + + /*! + * Disables calculation of the variance for this %ImageStatistics object. + */ + void DisableVariance( bool disable = true ) + { + m_data.noVariance = disable; + } + + /*! + * Returns true iff calculation of the median is currently enabled for this + * instance of %ImageStatistics. + * + * When median calculation is disabled, the average deviation, MAD and + * biweight midvariance estimators are also disabled implicitly. + */ + bool IsMedianEnabled() const + { + return !m_data.noMedian; + } + + /*! + * Enables calculation of the median for this %ImageStatistics object. + * + * When median calculation is disabled, the average deviation, MAD, biweight + * midvariance and bend midvariance estimators are also disabled implicitly. + */ + void EnableMedian( bool enable = true ) + { + m_data.noMedian = !enable; + } + + /*! + * Disables calculation of the median for this %ImageStatistics object. + * + * When median calculation is disabled, the average deviation, MAD, biweight + * midvariance and bend midvariance estimators are also disabled implicitly. + */ + void DisableMedian( bool disable = true ) + { + m_data.noMedian = disable; + } + + /*! + * Returns true iff calculation of the average deviation from the median is + * currently enabled for this instance of %ImageStatistics. + */ + bool IsAvgDevEnabled() const + { + return !m_data.noAvgDev; + } + + /*! + * Enables calculation of the average deviation from the median for this + * %ImageStatistics object. + */ + void EnableAvgDev( bool enable = true ) + { + m_data.noAvgDev = !enable; + } + + /*! + * Disables calculation of the average deviation from the median for this + * %ImageStatistics object. + */ + void DisableAvgDev( bool disable = true ) + { + m_data.noAvgDev = disable; + } + + /*! + * Returns true iff calculation of the median deviation from the median (MAD) + * is currently enabled for this instance of %ImageStatistics. + * + * When MAD calculation is disabled, the biweight midvariance estimator is + * also disabled implicitly. + */ + bool IsMADEnabled() const + { + return !m_data.noMAD; + } + + /*! + * Enables calculation of the median deviation from the median (MAD) for + * this %ImageStatistics object. + * + * When MAD calculation is disabled, the biweight midvariance estimator is + * also disabled implicitly. + */ + void EnableMAD( bool enable = true ) + { + m_data.noMAD = !enable; + } + + /*! + * Disables calculation of the median deviation from the median (MAD) for + * this %ImageStatistics object. + * + * When MAD calculation is disabled, the biweight midvariance estimator is + * also disabled implicitly. + */ + void DisableMAD( bool disable = true ) + { + m_data.noMAD = disable; + } + + /*! + * Returns true iff calculation of the biweight midvariance (BWMV) is + * currently enabled for this instance of %ImageStatistics. + */ + bool IsBWMVEnabled() const + { + return !m_data.noBWMV; + } + + /*! + * Enables calculation of the biweight midvariance (BWMV) for this + * %ImageStatistics object. + */ + void EnableBWMV( bool enable = true ) + { + m_data.noBWMV = !enable; + } + + /*! + * Disables calculation of the biweight midvariance (BWMV) for this + * %ImageStatistics object. + */ + void DisableBWMV( bool disable = true ) + { + m_data.noBWMV = disable; + } + + /*! + * Returns true iff calculation of the percentage bend midvariance (PBMV) is + * currently enabled for this instance of %ImageStatistics. + */ + bool IsPBMVEnabled() const + { + return !m_data.noPBMV; + } + + /*! + * Enables calculation of the percentage bend midvariance (PBMV) for this + * %ImageStatistics object. + */ + void EnablePBMV( bool enable = true ) + { + m_data.noPBMV = !enable; + } + + /*! + * Disables calculation of the percentage bend midvariance (PBMV) for this + * %ImageStatistics object. + */ + void DisablePBMV( bool disable = true ) + { + m_data.noPBMV = disable; + } + + /*! + * Returns true iff calculation of the Rousseeuw/Croux Sn estimator of scale + * is currently enabled for this instance of %ImageStatistics. + * + * \note The Sn estimator is disabled by default. + */ + bool IsSnEnabled() const + { + return !m_data.noSn; + } + + /*! + * Enables calculation of the Rousseeuw/Croux Sn estimator of scale for + * this %ImageStatistics object. + * + * \note The Sn estimator is disabled by default. + */ + void EnableSn( bool enable = true ) + { + m_data.noSn = !enable; + } + + /*! + * Disables calculation of the Rousseeuw/Croux Sn estimator of scale for + * this %ImageStatistics object. + * + * \note The Sn estimator is disabled by default. + */ + void DisableSn( bool disable = true ) + { + m_data.noSn = disable; + } + + /*! + * Returns true iff calculation of the Rousseeuw/Croux Qn estimator of scale + * is currently enabled for this instance of %ImageStatistics. + * + * \note The Qn estimator is disabled by default. + */ + bool IsQnEnabled() const + { + return !m_data.noQn; + } + + /*! + * Enables calculation of the Rousseeuw/Croux Qn estimator of scale for + * this %ImageStatistics object. + * + * \note The Qn estimator is disabled by default. + */ + void EnableQn( bool enable = true ) + { + m_data.noQn = !enable; + } + + /*! + * Disables calculation of the Rousseeuw/Croux Qn estimator of scale for + * this %ImageStatistics object. + * + * \note The Qn estimator is disabled by default. + */ + void DisableQn( bool disable = true ) + { + m_data.noQn = disable; + } + + /*! + * Calculates statistical data for a 32-bit floating point image. Returns a + * reference to the source \a image. + */ + const Image& operator <<( const Image& image ); + + /*! + * Calculates statistical data for a 64-bit floating point image. Returns a + * reference to the source \a image. + */ + const DImage& operator <<( const DImage& image ); + + /*! + * Calculates statistical data for an 8-bit unsigned integer image. Returns + * a reference to the source \a image. + */ + const UInt8Image& operator <<( const UInt8Image& image ); + + /*! + * Calculates statistical data for a 16-bit unsigned integer image. Returns + * a reference to the source \a image. + */ + const UInt16Image& operator <<( const UInt16Image& image ); + + /*! + * Calculates statistical data for a 32-bit unsigned integer image. Returns + * a reference to the source \a image. + */ + const UInt32Image& operator <<( const UInt32Image& image ); + + /*! + * Calculates statistical data for an image transported by an ImageVariant + * instance. Returns a reference to the source \a image. + */ + const ImageVariant& operator <<( const ImageVariant& image ) + { + if ( image ) + if ( !image.IsComplexSample() ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: *this << static_cast( *image ); break; + case 64: *this << static_cast( *image ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: *this << static_cast( *image ); break; + case 16: *this << static_cast( *image ); break; + case 32: *this << static_cast( *image ); break; + } + return image; + } + +protected: + + Data m_data; // statistical data + + friend class View; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageStatistics_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageStatistics.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageTransformation.h b/3rdparty/include/pcl/ImageTransformation.h new file mode 100644 index 0000000..693b034 --- /dev/null +++ b/3rdparty/include/pcl/ImageTransformation.h @@ -0,0 +1,436 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageTransformation_h +#define __PCL_ImageTransformation_h + +/// \file pcl/ImageTransformation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageTransformation + * \brief Root base class of all PCL image transformations. + * + * %ImageTransformation represents a generic transformation that can be applied + * to any image type defined in PCL. + * + * %ImageTransformation is a base class for all PCL image transformations, + * including both unidirectional (single-step) and bidirectional (invertible, + * two-step) transformations. + * + * For single-step processes, %ImageTransformation represents a direct + * transformation that applies to a target image. + * + * Two-step invertible processes are derived classes of + * BidirectionalImageTransformation in PCL. For these processes + * %ImageTransformation represents an inverse transformation that + * applies to a target image after a previous direct transformation, + * usually performed by the same class. + * + * \sa BidirectionalImageTransformation + */ +class PCL_CLASS ImageTransformation +{ +public: + + /*! + * Constructs a default %ImageTransformation object. + */ + ImageTransformation() = default; + + /*! + * Copy constructor. + */ + ImageTransformation( const ImageTransformation& ) = default; + + /*! + * Destroys an %ImageTransformation object. + */ + virtual ~ImageTransformation() + { + } + + /*! + * Applies this transformation to a target \a image. Returns a reference to + * the target image. + * + * If this is a bidirectional transformation, then this function represents + * an inverse transformation requiring a previous direct + * transformation, usually performed by the same class. + */ + template + GenericImage

& operator >>( GenericImage

& image ) const + { + Apply( image ); + return image; + } + + /*! + * Applies this transformation to the current selection in a target \a image + * transported by the specified ImageVariant object. Returns a reference to + * the target %ImageVariant. + * + * If this is a bidirectional transformation, then this function represents + * an inverse transformation requiring a previous direct + * transformation, usually performed by the same class. + * + * \sa BidirectionalImageTransformation + */ + ImageVariant& operator >>( ImageVariant& image ) const + { + if ( image ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: Apply( static_cast( *image ) ); break; + case 64: Apply( static_cast( *image ) ); break; + } + else if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: Apply( static_cast( *image ) ); break; + case 64: Apply( static_cast( *image ) ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: Apply( static_cast( *image ) ); break; + case 16: Apply( static_cast( *image ) ); break; + case 32: Apply( static_cast( *image ) ); break; + } + return image; + } + +protected: + + /*! + * Applies this transformation to a 32-bit floating point \a image. + */ + virtual void Apply( pcl::Image& image ) const + { + throw NotImplemented( *this, "Apply to 32-bit floating-point images" ); + } + + /*! + * Applies this transformation to a 64-bit floating point \a image. + */ + virtual void Apply( pcl::DImage& image ) const + { + throw NotImplemented( *this, "Apply to 64-bit floating-point images" ); + } + + /*! + * Applies this transformation to a 32-bit complex \a image. + */ + virtual void Apply( pcl::ComplexImage& image ) const + { + throw NotImplemented( *this, "Apply to 32-bit complex images" ); + } + + /*! + * Applies this transformation to a 64-bit complex \a image. + */ + virtual void Apply( pcl::DComplexImage& image ) const + { + throw NotImplemented( *this, "Apply to 64-bit complex images" ); + } + + /*! + * Applies this transformation to an 8-bit unsigned integer \a image. + */ + virtual void Apply( pcl::UInt8Image& image ) const + { + throw NotImplemented( *this, "Apply to 8-bit integer images" ); + } + + /*! + * Applies this transformation to a 16-bit unsigned integer \a image. + */ + virtual void Apply( pcl::UInt16Image& image ) const + { + throw NotImplemented( *this, "Apply to 16-bit integer images" ); + } + + /*! + * Applies this transformation to a 32-bit unsigned integer \a image. + */ + virtual void Apply( pcl::UInt32Image& image ) const + { + throw NotImplemented( *this, "Apply to 32-bit integer images" ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BidirectionalImageTransformation + * \brief Root base class for bidirectional PCL image transformations. + * + * %BidirectionalImageTransformation represents a two-step, invertible process + * that can be applied to any image type defined in PCL. + * + * Two-step invertible processes can perform an inverse transformation + * after a previous direct transformation. The inverse transformation + * functionality is provided by the ImageTransformation base class. + * + * \sa ImageTransformation + */ +class PCL_CLASS BidirectionalImageTransformation : public ImageTransformation +{ +public: + + /*! + * Constructs a default %BidirectionalImageTransformation object + */ + BidirectionalImageTransformation() = default; + + /*! + * Copy constructor. + */ + BidirectionalImageTransformation( const BidirectionalImageTransformation& ) = default; + + /*! + * Destroys a %BidirectionalImageTransformation object. + */ + virtual ~BidirectionalImageTransformation() + { + } + + /*! + * Applies this transformation to the current selection in a target + * \a image. Returns a reference to the target image. + * + * This function represents a direct transformation applied to the + * target image. An inverse transformation is performed by the + * operator >>( const GenericImage& ) member function, inherited from + * ImageTransformation. + */ + template + const GenericImage

& operator <<( const GenericImage

& image ) + { + Transform( image ); + return image; + } + + /*! + * Applies this transformation to the current selection in a target \a image + * transported by the specified ImageVariant object. Returns a reference to + * the target %ImageVariant. + * + * This function represents a direct transformation applied to the + * target image. An inverse transformation is performed by the + * operator >>( const ImageVariant& ) member function, inherited from + * ImageTransformation. + */ + const ImageVariant& operator <<( const ImageVariant& image ) + { + if ( image ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: Transform( static_cast( *image ) ); break; + case 64: Transform( static_cast( *image ) ); break; + } + else if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: Transform( static_cast( *image ) ); break; + case 64: Transform( static_cast( *image ) ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: Transform( static_cast( *image ) ); break; + case 16: Transform( static_cast( *image ) ); break; + case 32: Transform( static_cast( *image ) ); break; + } + return image; + } + +protected: + + /*! + * Transforms a 32-bit floating point \a image. + */ + virtual void Transform( const pcl::Image& image ) + { + throw NotImplemented( *this, "Transformation of 32-bit floating-point images" ); + } + + /*! + * Transforms a 64-bit floating point \a image. + */ + virtual void Transform( const pcl::DImage& image ) + { + throw NotImplemented( *this, "Transformation of 64-bit floating-point images" ); + } + + /*! + * Transforms a 32-bit complex \a image. + */ + virtual void Transform( const pcl::ComplexImage& image ) + { + throw NotImplemented( *this, "Transformation of 32-bit complex images" ); + } + + /*! + * Transforms a 64-bit complex \a image. + */ + virtual void Transform( const pcl::DComplexImage& image ) + { + throw NotImplemented( *this, "Transformation of 64-bit complex images" ); + } + + /*! + * Transforms an 8-bit unsigned integer \a image. + */ + virtual void Transform( const pcl::UInt8Image& image ) + { + throw NotImplemented( *this, "Transformation of 8-bit integer images" ); + } + + /*! + * Transforms a 16-bit unsigned integer \a image. + */ + virtual void Transform( const pcl::UInt16Image& image ) + { + throw NotImplemented( *this, "Transformation of 16-bit integer images" ); + } + + /*! + * Transforms a 32-bit unsigned integer \a image. + */ + virtual void Transform( const pcl::UInt32Image& image ) + { + throw NotImplemented( *this, "Transformation of 32-bit integer images" ); + } +}; + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +/* + * Implementation of members of GenericImage<> requiring a complete declaration + * of ImageTransformation. + */ + +// ---------------------------------------------------------------------------- + +template inline +GenericImage

& GenericImage

::Apply( const ImageTransformation& transformation, + const Rect& rect, int firstChannel, int lastChannel ) +{ + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return *this; + + PushSelections(); + SelectRectangle( r ); + SelectChannelRange( firstChannel, lastChannel ); + + try + { + transformation >> *this; + PopSelections(); + } + catch ( ... ) + { + PopSelections(); + throw; + } + + return *this; +} + +// ---------------------------------------------------------------------------- + +template inline +void GenericImage

::Transform( BidirectionalImageTransformation& transform, + const Rect& rect, int firstChannel, int lastChannel ) const +{ + Rect r = rect; + if ( !ParseSelection( r, firstChannel, lastChannel ) ) + return; + + PushSelections(); + SelectRectangle( r ); + SelectChannelRange( firstChannel, lastChannel ); + + try + { + transform << *this; + PopSelections(); + } + catch ( ... ) + { + PopSelections(); + throw; + } +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageVariant.h b/3rdparty/include/pcl/ImageVariant.h new file mode 100644 index 0000000..74c6a37 --- /dev/null +++ b/3rdparty/include/pcl/ImageVariant.h @@ -0,0 +1,7277 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageVariant.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageVariant_h +#define __PCL_ImageVariant_h + +/// \file pcl/ImageVariant.h + +#include + +#include +#include + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +namespace pi +{ + class SharedImage; +} +#endif + +#define SOLVE_TEMPLATE( F ) \ + if ( IsComplexSample() ) \ + switch ( BitsPerSample() ) \ + { \ + case 32: F( ComplexImage ); break; \ + case 64: F( DComplexImage ); break; \ + } \ + else if ( IsFloatSample() ) \ + switch ( BitsPerSample() ) \ + { \ + case 32: F( Image ); break; \ + case 64: F( DImage ); break; \ + } \ + else \ + switch ( BitsPerSample() ) \ + { \ + case 8: F( UInt8Image ); break; \ + case 16: F( UInt16Image ); break; \ + case 32: F( UInt32Image ); break; \ + } + +#define SOLVE_TEMPLATE_2( I, F ) \ + if ( I.IsComplexSample() ) \ + switch ( I.BitsPerSample() ) \ + { \ + case 32: F( ComplexImage ); break; \ + case 64: F( DComplexImage ); break; \ + } \ + else if ( I.IsFloatSample() ) \ + switch ( I.BitsPerSample() ) \ + { \ + case 32: F( Image ); break; \ + case 64: F( DImage ); break; \ + } \ + else \ + switch ( I.BitsPerSample() ) \ + { \ + case 8: F( UInt8Image ); break; \ + case 16: F( UInt16Image ); break; \ + case 32: F( UInt32Image ); break; \ + } + +#define SOLVE_TEMPLATE_REAL( F ) \ + if ( IsFloatSample() ) \ + switch ( BitsPerSample() ) \ + { \ + case 32: F( Image ); break; \ + case 64: F( DImage ); break; \ + } \ + else \ + switch ( BitsPerSample() ) \ + { \ + case 8: F( UInt8Image ); break; \ + case 16: F( UInt16Image ); break; \ + case 32: F( UInt32Image ); break; \ + } + +#define SOLVE_TEMPLATE_REAL_2( I, F ) \ + if ( I.IsFloatSample() ) \ + switch ( I.BitsPerSample() ) \ + { \ + case 32: F( Image ); break; \ + case 64: F( DImage ); break; \ + } \ + else \ + switch ( I.BitsPerSample() ) \ + { \ + case 8: F( UInt8Image ); break; \ + case 16: F( UInt16Image ); break; \ + case 32: F( UInt32Image ); break; \ + } + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::SwapCompression + * \brief Compression algorithms for raw image file generation. + * + * This namespace enumerates the compression algorithms supported by the + * ImageVariant::WriteSwapFile() and ImageVariant::WriteSwapFiles() functions. + * + * Supported compression algorithms: + * + * + * + * + * + * + * + * + * + *
SwapCompression::None Do not use compression.
SwapCompression::ZLib ZLib (deflate) compression.
SwapCompression::ZLib_SH ZLib (deflate) compression with byte shuffling.
SwapCompression::LZ4 LZ4 fast compression.
SwapCompression::LZ4_Sh LZ4 fast compression with byte shuffling.
SwapCompression::LZ4HC LZ4-HC compression.
SwapCompression::LZ4HC_Sh LZ4-HC compression with byte shuffling.
+ */ +namespace SwapCompression +{ + enum value_type + { + None, // Do not use compression. + ZLib, // ZLib (deflate) compression. + ZLib_SH, // ZLib (deflate) compression with byte shuffling. + LZ4, // LZ4 fast compression. + LZ4_Sh, // LZ4 fast compression with byte shuffling. + LZ4HC, // LZ4-HC compression. + LZ4HC_Sh, // LZ4-HC compression with byte shuffling. + + NumberOfAlgorithms + }; +} + +/*! + * \class ImageVariant + * \brief Acts like a union for all types of images in PCL, with optional + * class-wide ownership of transported images. + * + * An instance of %ImageVariant owns a pointer to AbstractImage. That allows it + * to transport and manage all template instantiations of GenericImage + * transparently with a unique abstract interface: Image, ComplexImage, + * UInt16Image, and so on. + * + * + * Image Template Instantiation Resolution + * + * %ImageVariant provides functionality to identify the particular data type + * that the transported image uses to represent its pixel samples. Once we know + * the pixel data type, we can resolve the template instantiation of + * GenericImage, which in turn gives us access to the whole data and + * functionality of the transported image. The following code snippet shows a + * typical example of template resolution with %ImageVariant: + * + * \code + * ImageVariant image; + * // ... + * if ( image ) // if the ImageVariant transports a valid image + * { + * if ( image.IsComplexImage() ) + * throw Error( "Complex images are not supported in DoSomething()" ); + * if ( image.IsFloatSample() ) + * switch ( image.BitsPerSample() ) + * { + * case 32 : DoSomething( static_cast( *image ) ); break; + * case 64 : DoSomething( static_cast( *image ) ); break; + * } + * else + * switch ( image.BitsPerSample() ) + * { + * case 8 : DoSomething( static_cast( *image ) ); break; + * case 16 : DoSomething( static_cast( *image ) ); break; + * case 32 : DoSomething( static_cast( *image ) ); break; + * } + * } + * \endcode + * + * In this code, \c DoSomething is a template function to deal with an image of + * a particular pixel sample type. In the code above, all standard PCL images + * are supported except complex images. For example, \c DoSomething could be + * like this function: + * + * \code + * template void DoSomething( GenericImage

& image ) + * { + * image.ShiftToCenter( image.Width()+20, image.Height()+20 ); + * } + * \endcode + * + * This \c DoSomething function adds a 10-pixel black frame around the passed + * \a image. + * + * + * Generalized Image Manipulation + * + * Besides identifying image template instantiations, %ImageVariant provides + * generalized wrappers for most of the member functions of GenericImage. This + * allows you to work with an instance of %ImageVariant just as if it were its + * transported image, without even knowing its pixel data type in most cases. + * The example we have seen above could be implemented in a much simpler way as + * follows: + * + * \code + * void DoSomething( ImageVariant& image ) + * { + * if ( image ) + * { + * if ( image.IsComplexImage() ) + * throw Error( "Complex images are not supported in DoSomething()" ); + * image.ShiftToCenter( image.Width()+20, image.Height()+20 ); + * } + * } + * \endcode + * + * The above code works because %ImageVariant defines a \c ShiftToCenter member + * function as a wrapper to GenericImage::ShiftToCenter(), with implicit + * template instantiation resolution. As we have said, virtually all of + * GenericImage's functionality can be used transparently in a type-independent + * way through %ImageVariant. + * + * + * Image Ownership + * + * Transported images can optionally be owned by %ImageVariant. When + * %ImageVariant owns a transported image, the image is destroyed when all + * instances of %ImageVariant referencing that image are destroyed. It is + * important to know that ownership of transported images is a class-wide + * property of %ImageVariant, not a private property of any particular + * %ImageVariant instance. + * + * Class-wide ownership means that an image is not owned only by a particular + * instance of %ImageVariant, but by \e all existing instances that transport + * the same image. Consider the following code snippets: + * + * \code + * Image image; + * ImageVariant var( &image ); // ImageVariant does not own image + * \endcode + * + * In this first case, we have an image and create an %ImageVariant object to + * transport it. When the \c var object gets out of scope, \c image will + * continue existing and won't be destroyed. + * + * \code + * ImageVariant var; + * var.CreateFloatImage(); // ImageVariant owns a newly created image + * \endcode + * + * In this case, we have an %ImageVariant object and tell it to create a new + * image (a 32-bit floating point image in the example). The newly created + * image will be transported by \c var and is now owned by %ImageVariant. when + * the last instance of %ImageVariant transporting the image is destroyed, the + * image will also be destroyed automatically. + * + * You can also switch on and off %ImageVariant's ownership: + * + * \code + * Image* image = new Image; + * ImageVariant var( image ); + * var.SetOwnership( true ); // now ImageVariant owns image + * \endcode + * + * %ImageVariant implements an \e explicit data sharing mechanism, which makes + * it different from the \e implicit data sharing implemented by rest of + * container classes in PCL. It is important to state clearly that ownership of + * image data is not a property of any particular object in this case, but of + * the whole %ImageVariant class. + * + * \sa AbstractImage, GenericImage + */ +class PCL_CLASS ImageVariant +{ +public: + + /*! + * An enumerated type that represents the set of supported color spaces. + * Valid constants for this enumeration are defined in the ColorSpace + * namespace. + */ + typedef AbstractImage::color_space color_space; + + /*! + * An enumerated type that represents the set of supported arithmetic and + * bitwise pixel operations. Valid constants for this enumeration are + * defined in the ImageOp namespace. + */ + typedef ImageOp::value_type image_op; + + /* + * An enumerated type that represents a compression algorithm for raw + * storage file generation. Valid constants for this enumeration are defined + * in the SwapCompression namespace. + */ + typedef SwapCompression::value_type swap_compression; + + /*! + * Constructs an empty %ImageVariant. An empty %ImageVariant instance does + * not transport an image. + */ + ImageVariant() + { + m_data = new Data; + } + + /*! + * Constructs an %ImageVariant instance to transport the specified \a image. + * + * By default, the transported image is not owned by %ImageVariant object. + * To cause %ImageVariant to own the transported image, the SetOwnership() + * member function must be called explicitly. + */ + template + ImageVariant( GenericImage

* image ) + { + m_data = new Data; + m_data->Update( image ); + } + + /*! + * Copy constructor. Constructs an %ImageVariant instance as an alias of an + * existing %ImageVariant object. + * + * This constructor simply increments the reference counter of the + * transported image. When all references to a transported image are + * removed, and the transported image is owned by %ImageVariant, it is + * destroyed and deallocated. + */ + ImageVariant( const ImageVariant& image ) + : m_data( image.m_data ) + { + m_data->Attach(); + } + + /*! + * Move constructor. + */ + ImageVariant( ImageVariant&& image ) + : m_data( image.m_data ) + { + image.m_data = nullptr; + } + + /*! + * Destroys an %ImageVariant instance. + * + * If the transported image exists and is owned by %ImageVariant, and there + * are no more %ImageVariant references to it, then it is also destroyed. + */ + virtual ~ImageVariant() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Returns a pointer to the unmodifiable image transported by this + * %ImageVariant object. + */ + const AbstractImage* ImagePtr() const noexcept + { + return m_data->image; + } + + /*! + * Returns a pointer to the image transported by this %ImageVariant object. + */ + AbstractImage* ImagePtr() noexcept + { + return m_data->image; + } + + /*! + * Returns true iff this %ImageVariant transports the same image as another + * \a image. + * + * This member function also returns true if \e both objects transport no + * image. + */ + bool IsSameImage( const ImageVariant& image ) const noexcept + { + return m_data->image == image.m_data->image; + } + + /*! + * Returns true iff this %ImageVariant instance transports a floating point + * image. + */ + bool IsFloatSample() const noexcept + { + return m_data->isFloatSample; + } + + /*! + * Returns true iff this %ImageVariant instance transports a complex image. + */ + bool IsComplexSample() const noexcept + { + return m_data->isComplexSample; + } + + /*! + * Returns the number of bits per sample of the image transported by this + * %ImageVariant object, or zero if it transports no image. + */ + int BitsPerSample() const noexcept + { + return m_data->bitsPerSample; + } + + /*! + * Returns the number of 8-bit bytes per sample of the image transported by + * this %ImageVariant, or zero if this object transports no image. + */ + int BytesPerSample() const noexcept + { + return m_data->bitsPerSample >> 3; + } + + /*! + * Returns the width in pixels of the image transported by this + * %ImageVariant, or zero if this object transports no image. + */ + int Width() const noexcept + { + return m_data->image ? m_data->image->Width() : 0; + } + + /*! + * Returns the height in pixels of the image transported by this + * %ImageVariant, or zero if this object transports no image. + */ + int Height() const noexcept + { + return m_data->image ? m_data->image->Height() : 0; + } + + /*! + * Returns the number of pixels in the image transported by this + * %ImageVariant, or zero if this object transports no image. + * + * The returned value is equal to Width()*Height(). + */ + size_type NumberOfPixels() const noexcept + { + return m_data->image ? m_data->image->NumberOfPixels() : 0; + } + + /*! + * Returns the total number of channels in the image transported by this + * %ImageVariant, or zero if this object transports no image. + */ + int NumberOfChannels() const noexcept + { + return m_data->image ? m_data->image->NumberOfChannels() : 0; + } + + /*! + * Returns the index of the last existing channel in this image. This is the + * largest valid channel index that can be used with this image, + * corresponding to a nominal or alpha channel. If the image transported by + * this object is empty, or if this object does not transport an image, this + * function returns -1. + */ + int LastChannel() const noexcept + { + return m_data->image ? m_data->image->LastChannel() : -1; + } + + /*! + * Returns true iff the specified channel index \a c is valid. A valid + * channel index corresponds to an existing channel in this image. Returns + * false if this object does not transport an image. + */ + bool IsValidChannelIndex( int c ) const noexcept + { + return m_data->image && m_data->image->IsValidChannelIndex( c ); + } + + /*! + * Returns the number of nominal channels in the image transported by this + * %ImageVariant, or zero if this object transports no image. + * + * Nominal channels are those defined by the color space of the image: One + * channel for monochrome grayscale images, and three channels for RGB color + * images. Additional channels are known as alpha channels. + */ + int NumberOfNominalChannels() const noexcept + { + return m_data->image ? m_data->image->NumberOfNominalChannels() : 0; + } + + /*! + * Returns true iff this %ImageVariant object transports an image with one or + * more alpha channels. + * + * Alpha channels are those in excess of the nominal channels corresponding + * to the color space of the image; for example, a second channel in a + * grayscale image, or a fourth channel in an RGB color image. + */ + bool HasAlphaChannels() const noexcept + { + return m_data->image && m_data->image->HasAlphaChannels(); + } + + /*! + * Returns the number of alpha channels in the image transported by this + * %ImageVariant, or zero if this object transports no image. + * + * Alpha channels are those in excess of the nominal channels corresponding + * to the color space of the image; for example, a second channel in a + * grayscale image, or a fourth channel in an RGB color image. + */ + int NumberOfAlphaChannels() const noexcept + { + return m_data->image ? m_data->image->NumberOfAlphaChannels() : 0; + } + + /*! + * Returns the total number of samples in the image transported by this + * %ImageVariant, or zero if this object does not transport an image. + * + * The number of samples is equal to NumberOfPixels()*NumberOfChannels(). + */ + size_type NumberOfSamples() const noexcept + { + return m_data->image ? m_data->image->NumberOfSamples() : 0; + } + + /*! + * Returns the total number of nominal samples in the image transported by + * this %ImageVariant, or zero if this object does not transport an image. + * + * The number of nominal samples is equal to + * NumberOfPixels()*NumberOfNominalChannels(). + */ + size_type NumberOfNominalSamples() const noexcept + { + return m_data->image ? m_data->image->NumberOfNominalSamples() : 0; + } + + /*! + * Returns the total number of alpha samples in the image transported by + * this %ImageVariant, or zero if this object does not transport an image. + * + * The number of alpha samples is equal to + * NumberOfPixels()*NumberOfAlphaChannels(). + */ + size_type NumberOfAlphaSamples() const noexcept + { + return m_data->image ? m_data->image->NumberOfAlphaSamples() : 0; + } + + /*! + * Returns the bounding rectangle of this image. + * + * The upper left corner of the returned rectangle (x0, y0) is always (0,0). + * The lower right corner coordinates (x1, y1) correspond to the width and + * height of the image. + * + * If this object transports no image, this function returns an empty + * rectangle. + */ + Rect Bounds() const noexcept + { + return m_data->image ? m_data->image->Bounds() : Rect( 0 ); + } + + /*! + * Returns true iff this image includes the specified point \a p in image + * coordinates. + * + * If this object transports no image, this function returns false. + */ + template + bool Includes( const GenericPoint& p ) const noexcept + { + return m_data->image && m_data->image->Includes( p ); + } + + /*! + * Returns true iff this image includes the specified rectangle \a r in image + * coordinates. + * + * If this object transports no image, this function returns false. + */ + template + bool Includes( const GenericRectangle& r ) const noexcept + { + return m_data->image && m_data->image->Includes( r ); + } + + /*! + * Returns true iff this image includes a rectangle given by its separate + * image coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical). + * \param x1,y1 Lower right corner coordinates (horizontal, vertical). + * + * If this object transports no image, this function returns false. + */ + template + bool Includes( T x0, T y0, T x1, T y1 ) const noexcept + { + return m_data->image && m_data->image->Includes( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this image includes a point given by its separate image + * coordinates. + * + * \param x Horizontal coordinate. + * \param y Vertical coordinate. + * + * If this object transports no image, this function returns false. + */ + template + bool Includes( T x, T y ) const noexcept + { + return m_data->image && m_data->image->Includes( x, y ); + } + + /*! + * Returns true iff this image intersects with the specified rectangle \a r + * in image coordinates. + * + * If this object transports no image, this function returns false. + */ + template + bool Intersects( const pcl::GenericRectangle& r ) const noexcept + { + return m_data->image && m_data->image->Intersects( r ); + } + + /*! + * Returns true iff this image intersects with a rectangle given by its + * separate image coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical). + * \param x1,y1 Lower right corner coordinates (horizontal, vertical). + * + * If this object transports no image, this function returns false. + */ + template + bool Intersects( T x0, T y0, T x1, T y1 ) const noexcept + { + return m_data->image && m_data->image->Intersects( x0, y0, x1, y1 ); + } + + /*! + * Constrains a point \a p to stay within the boundaries of this image. + * Returns true iff the original point location is included in this image. + * + * If this object transports no image, this function does nothing and + * returns false. + */ + template + bool Clip( pcl::GenericPoint& p ) const noexcept + { + return m_data->image && m_data->image->Clip( p ); + } + + /*! + * Constrains two point coordinates \a x and \a y to stay within the + * boundaries of this image. + * + * \param[out] x Horizontal coordinate of the clipped point. + * \param[out] y Vertical coordinate of the clipped point. + * + * Returns true iff the original point location is included in this image. + * + * If this object transports no image, this function does nothing and + * returns false. + */ + template + bool Clip( T& x, T& y ) const noexcept + { + return m_data->image && m_data->image->Clip( x, y ); + } + + /*! + * Constrains a rectangular region \a r in image coordinates to fit into the + * boundaries of this image. Also ensures coherence of clipped rectangular + * coordinates such that r.x0 ≤ r.x1 and r.y0 ≤ r.y1. + * + * Returns true iff the original rectangle intersects this image. + * + * If this object transports no image, this function does nothing and + * returns false. + */ + template + bool Clip( pcl::GenericRectangle& r ) const noexcept + { + return m_data->image && m_data->image->Clip( r ); + } + + /*! + * Constrains a rectangular region, given by its separate image coordinates, + * to fit into the boundaries of this image. Also ensures coherence of + * rectangular coordinates, such that x0 ≤ x1 and y0 ≤ y1. + * + * \param[out] x0,y0 Upper left corner coordinates (horizontal, vertical) + * of the rectangle that will be clipped. + * + * \param[out] x1,y1 Lower right corner coordinates (horizontal, vertical) + * of the rectangle that will be clipped. + * + * Returns true iff the original rectangle intersects the image. + * + * If this object transports no image, this function does nothing and + * returns false. + */ + template + bool Clip( T& x0, T& y0, T& x1, T& y1 ) const noexcept + { + return m_data->image && m_data->image->Clip( x0, y0, x1, y1 ); + } + + /*! + * Selects a single channel. + * + * \param c Channel index, 0 ≤ \a c < \a n, where \a n is the total + * number of channels in this image, including alpha channels. + */ + void SelectChannel( int c ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectChannel( c ); + } + + /*! + * Returns the index of the currently selected channel, or -1 if this object + * does not transport an image. + * + * If the current channel selection includes more than one channel, this + * function returns the index of the first selected channel. + * + * This function is a convenience synonym for FirstSelectedChannel(). + */ + int SelectedChannel() const noexcept + { + return m_data->image ? m_data->image->SelectedChannel() : -1; + } + + /*! + * Selects a range of channels by their channel indices. The selected range + * \e includes the two channels specified. + * + * \param c0 Index of the first channel to select. + * \param c1 Index of the last channel to select. + */ + void SelectChannelRange( int c0, int c1 ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectChannelRange( c0, c1 ); + } + + /*! + * Sets the current channel range selection to include all nominal channels + * exclusively, excluding alpha channels. + */ + void SelectNominalChannels() const noexcept + { + if ( m_data->image ) + m_data->image->SelectNominalChannels(); + } + + /*! + * Sets the current channel range selection to include the existing alpha + * channels only, excluding the nominal channels. + * + * \note If this image has no alpha channels, this function selects the last + * nominal channel. The channel range selection cannot be empty by design. + */ + void SelectAlphaChannels() const noexcept + { + if ( m_data->image ) + m_data->image->SelectAlphaChannels(); + } + + /*! + * Resets the channel range selection to include all existing channels (all + * nominal and alpha channels) in this image. + */ + void ResetChannelRange() const noexcept + { + if ( m_data->image ) + m_data->image->ResetChannelRange(); + } + + /*! + * Returns the number of selected channels, or zero if this object does not + * transport an image. + */ + int NumberOfSelectedChannels() const noexcept + { + return m_data->image ? m_data->image->NumberOfSelectedChannels() : 0; + } + + /*! + * Returns the channel index of the first selected channel, or -1 if this + * object does not transport an image. + */ + int FirstSelectedChannel() const noexcept + { + return m_data->image ? m_data->image->FirstSelectedChannel() : -1; + } + + /*! + * Returns the channel index of the last selected channel, or -1 if this + * object does not transport an image. + */ + int LastSelectedChannel() const noexcept + { + return m_data->image ? m_data->image->LastSelectedChannel() : -1; + } + + /*! + * Copies the first and last channel indices of the current channel + * selection to the specified variables. + * + * \param[out] c0 Index of the first selected channel. + * \param[out] c1 Index of the last selected channel. + */ + void GetSelectedChannelRange( int& c0, int& c1 ) const noexcept + { + if ( m_data->image ) + m_data->image->GetSelectedChannelRange( c0, c1 ); + } + + /*! + * Selects an anchor point by its separate image coordinates. + * + * \param x Horizontal coordinate of the new anchor point. + * \param y Vertical coordinate of the new anchor point. + */ + void SelectPoint( int x, int y ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectPoint( x, y ); + } + + /*! + * Selects a new anchor point \a p in image coordinates. + */ + void SelectPoint( const Point& p ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectPoint( p ); + } + + /*! + * Resets the anchor point to the origin of image coordinates, i.e to x=y=0. + */ + void ResetPoint() const noexcept + { + if ( m_data->image ) + m_data->image->ResetPoint(); + } + + /*! + * Returns the current anchor point, or zero if this object does not + * transport an image. + */ + Point SelectedPoint() const noexcept + { + return m_data->image ? m_data->image->SelectedPoint() : Point( 0 ); + } + + /*! + * Defines the current rectangular selection by its separate image + * coordinates. + * + * \param x0,y0 Upper left corner coordinates (horizontal, vertical) of + * the new rectangular selection. + * + * \param x1,y1 Lower right corner coordinates (horizontal, vertical) of + * the new rectangular selection. + * + * The resulting selection is constrained to stay within the image + * boundaries. + */ + void SelectRectangle( int x0, int y0, int x1, int y1 ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectRectangle( x0, y0, x1, y1 ); + } + + /*! + * Defines the current rectangular selection by its separate corner + * points in image coordinates. + * + * \param p0 Position of the upper left corner of the new selection. + * + * \param p1 Position of the lower right corner of the new selection. + */ + void SelectRectangle( const Point& p0, const Point& p1 ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectRectangle( p0, p1 ); + } + + /*! + * Defines the current rectangular selection as the specified rectangle \a r + * in image coordinates. + */ + void SelectRectangle( const Rect& r ) const noexcept + { + if ( m_data->image ) + m_data->image->SelectRectangle( r ); + } + + /*! + * Resets the rectangular selection to include the entire image boundaries. + */ + void ResetSelection() const noexcept + { + if ( m_data->image ) + m_data->image->ResetSelection(); + } + + /*! + * Returns true iff the current selection is empty, i.e. if its area is zero. + * Returns false if the current selection is not empty, or if this object + * does not transport an image. + */ + bool IsEmptySelection() const noexcept + { + return m_data->image ? m_data->image->IsEmptySelection() : false; + } + + /*! + * Returns true iff the current rectangular selection comprises the entire + * image. Returns false if the selection is not complete, or if this object + * does not transport an image. + */ + bool IsFullSelection() const noexcept + { + return m_data->image ? m_data->image->IsFullSelection() : false; + } + + /*! + * Returns the current rectangular selection, or zero if this object does + * not transport an image. + */ + Rect SelectedRectangle() const noexcept + { + return m_data->image ? m_data->image->SelectedRectangle() : Rect( 0 ); + } + + /*! + * Returns true if this image is completely selected; false if it is + * only partially selected, or if this object does not transport an image. + * + * In a completely selected image, the current rectangular selection + * includes the whole image, and the current channel range selection + * comprises all existing channels, including nominal and alpha channels. + */ + bool IsCompletelySelected() const noexcept + { + return m_data->image ? m_data->image->IsCompletelySelected() : false; + } + + /*! + * Returns the number of selected pixels. This is the area in square pixels + * of the current selection rectangle. Returns zero if this object does not + * transport an image. + */ + size_type NumberOfSelectedPixels() const noexcept + { + return m_data->image ? m_data->image->NumberOfSelectedPixels() : 0; + } + + /*! + * Returns the number of selected samples. This is the area in square pixels + * of the current selection rectangle multiplied by the number of selected + * channels. Returns zero if this object does not transport an image. + */ + size_type NumberOfSelectedSamples() const noexcept + { + return m_data->image ? m_data->image->NumberOfSelectedSamples() : 0; + } + + /*! + * Returns true iff range clipping is currently enabled for this image. + * Returns false if range clipping is disabled, or if this object does not + * transport an image. + * + * When range clipping is enabled, pixel samples outside the current + * clipping range: + * + * ( RangeClipLow(), RangeClipHigh() ) + * + * are ignored by statistics calculation routines. Note that range bounds + * are always excluded, since the range is open on both sides. The clipping + * range is always defined in the normalized [0,1] range for all pixel + * sample data types; the necessary conversions are performed transparently. + * + * When range clipping is disabled, the clipping range is ignored and all + * pixel samples are considered for statistical calculations. + * + * To make it more flexible, range clipping can be enabled/disabled + * separately for the low and high bounds. + * + * The default clipping range is the normalized (0,1) range. Range clipping + * is disabled by default. + */ + bool IsRangeClippingEnabled() const noexcept + { + return m_data->image ? m_data->image->IsRangeClippingEnabled() : false; + } + + /*! + * Returns true iff range clipping is currently enabled for the low clipping + * bound. Returns false if this object does not transport an image. + * + * When this function returns true, pixel samples with values less than or + * equal to the low clipping bound (as reported by RangeClipLow() ) will be + * rejected for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + bool IsLowRangeClippingEnabled() const noexcept + { + return m_data->image ? m_data->image->IsLowRangeClippingEnabled() : false; + } + + /*! + * Returns true iff range clipping is currently enabled for the high + * clipping bound. Returns false if this object does not transport an image. + * + * When this function returns true, pixel samples with values greater than + * or equal to the high clipping bound (as reported by RangeClipHigh() ) + * will be rejected for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + bool IsHighRangeClippingEnabled() const noexcept + { + return m_data->image ? m_data->image->IsHighRangeClippingEnabled() : false; + } + + /*! + * Enables range clipping for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void EnableRangeClipping( bool enableLow = true, bool enableHigh = true ) const noexcept + { + if ( m_data->image ) + m_data->image->EnableRangeClipping( enableLow, enableHigh ); + } + + /*! + * Disables range clipping for statistical calculations. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void DisableRangeClipping( bool disableLow = true, bool disableHigh = true ) const noexcept + { + if ( m_data->image ) + m_data->image->DisableRangeClipping( disableLow, disableHigh ); + } + + /*! + * Returns the lower bound of the current clipping range. Returns zero if + * this object does not transport an image. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + double RangeClipLow() const noexcept + { + return m_data->image ? m_data->image->RangeClipLow() : 0.0; + } + + /*! + * Returns the upper bound of the current clipping range. Returns zero if + * this object does not transport an image. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + double RangeClipHigh() const noexcept + { + return m_data->image ? m_data->image->RangeClipHigh() : 0.0; + } + + /*! + * Sets the lower bound of the clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipLow( double clipLow ) const noexcept + { + if ( m_data->image ) + m_data->image->SetRangeClipLow( clipLow ); + } + + /*! + * Sets the upper bound of the clipping range. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipHigh( double clipHigh ) const noexcept + { + if ( m_data->image ) + m_data->image->SetRangeClipHigh( clipHigh ); + } + + /*! + * Sets the lower and upper bounds of the clipping range and enables range + * clipping (both low and high clipping bounds), in a single function call. + * + * See IsRangeClippingEnabled() for more information on range clipping. + */ + void SetRangeClipping( double clipLow, double clipHigh ) const noexcept + { + if ( m_data->image ) + m_data->image->SetRangeClipping( clipLow, clipHigh ); + } + + /*! + * Resets the range clipping parameters: + * + * Clipping range lower bound = 0.0 + * Clipping range upper bound = 1.0 + * Range clipping disabled + */ + void ResetRangeClipping() const noexcept + { + if ( m_data->image ) + m_data->image->ResetRangeClipping(); + } + + /*! + * Resets all image selections to default values: + * + * \li All channels are selected, including nominal and alpha channels. + * \li The anchor point is located at {0,0}, that is the upper left corner. + * \li The rectangular selection is set to comprise the entire image. + * \li The clipping range is set to [0,1]. + * \li Range clipping is disabled. + * + * Calling this member function is equivalent to: + * + * \code + * ResetChannelRange(); + * ResetPoint(); + * ResetSelection(); + * ResetRangeClipping(); + * \endcode + */ + void ResetSelections() const noexcept + { + if ( m_data->image ) + m_data->image->ResetSelections(); + } + + /*! + * Returns a reference to the internal ImageSelections object in the image + * transported by this %ImageVariant. + * + * \note This member function assumes that this object transports a valid + * image. Do not call it otherwise. + */ + ImageSelections& Selections() const noexcept + { + return m_data->image->Selections(); + } + + /*! + * Saves the current selections (rectangular area, channel range, anchor + * point and range clipping), pushing them to the internal selection stack. + */ + void PushSelections() const + { + if ( m_data->image ) + m_data->image->PushSelections(); + } + + /*! + * Restores and pops (removes) the current selections (rectangular area, + * channel range, anchor point and range clipping) from the internal + * selection stack. + * + * If no selections have been previously pushed to the internal selection + * stack, this function is ignored. + */ + void PopSelections() const + { + if ( m_data->image ) + m_data->image->PopSelections(); + } + + /*! + * Returns true if one or more selections have been pushed to the internal + * selection stack, that is, if the PopSelections() function can be called + * to restore them. Returns false otherwise, or if this object does not + * transport an image. + */ + bool CanPopSelections() const noexcept + { + return m_data->image ? m_data->image->CanPopSelections() : false; + } + + /*! + * Returns a reference to the status monitoring object associated with the + * image transported by this %ImageVariant. + * + * \note This member function assumes that this object transports a valid + * image. Do not call it otherwise. + */ + StatusMonitor& Status() const noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return m_data->image->Status(); + } + + /*! + * Returns the address of the status monitoring callback object currently + * selected for the image transported by this %ImageVariant, or zero if this + * object does not transport an image. + */ + pcl::StatusCallback* StatusCallback() const noexcept + { + return m_data->image ? m_data->image->StatusCallback() : nullptr; + } + + /*! + * Specifies the address of an object that will be used to perform status + * monitoring callbacks for the image transported by this %ImageVariant. + * + * If this object does not transport an image, calling this member function + * has no effect. + */ + void SetStatusCallback( pcl::StatusCallback* callback ) const noexcept + { + if ( m_data->image ) + m_data->image->SetStatusCallback( callback ); + } + + /*! + * Returns true iff this image is allowed to use multiple parallel execution + * threads (when multiple threads are permitted and available) for member + * functions that support parallel execution. + * + * If this object does not transport an image, this member function returns + * false. + */ + bool IsParallelProcessingEnabled() const noexcept + { + return m_data->image != nullptr && m_data->image->IsParallelProcessingEnabled(); + } + + /*! + * Enables parallel processing for this image. + * + * \param enable Whether to enable or disable parallel processing. True by + * default. + * + * \param maxProcessors The maximum number of processors allowed for this + * image. If \a enable is false this parameter is ignored. A + * value ≤ 0 is ignored. The default value is zero. + * + * If this object does not transport an image, calling this member function + * has no effect. + */ + void EnableParallelProcessing( bool enable = true, int maxProcessors = 0 ) noexcept + { + if ( m_data->image ) + m_data->image->EnableParallelProcessing( enable, maxProcessors ); + } + + /*! + * Disables parallel processing for this image. + * + * This is a convenience function, equivalent to: + * EnableParallelProcessing( !disable ) + * + * If this object does not transport an image, calling this member function + * has no effect. + */ + void DisableParallelProcessing( bool disable = true ) noexcept + { + if ( m_data->image ) + m_data->image->DisableParallelProcessing( disable ); + } + + /*! + * Returns the maximum number of processors allowed for this image, or zero + * if this object does not transport an image. + * + * The returned nonzero value is the maximum number of processors that this + * image can use in member functions that support parallel execution. + * + * Irrespective of the value returned by this function, a module should not + * use more processors than the maximum number of parallel threads allowed + * for external modules on the PixInsight platform. This number is given by + * the "Process/MaxProcessors" global variable (refer to the GlobalSettings + * class for information on global variables). + */ + int MaxProcessors() const noexcept + { + return m_data->image ? m_data->image->MaxProcessors() : 0; + } + + /*! + * Sets the maximum number of processors allowed for this image. + * + * The specified \a maxProcessors parameter is the maximum number of + * processors that this image can use in member functions that support + * parallel execution. + * + * In the current versions of PCL, a module can use a maximum of 1023 + * processors. The term \e processor actually refers to the number of + * threads a module can execute concurrently. + * + * Irrespective of the value specified by this function, a module should not + * use more processors than the maximum number of parallel threads allowed + * for external modules on the PixInsight platform. This number is given by + * the "Process/MaxProcessors" global variable (refer to the GlobalSettings + * class for information on global variables). + * + * If this object does not transport an image, calling this member function + * has no effect. + */ + void SetMaxProcessors( int maxProcessors ) noexcept + { + if ( m_data->image ) + m_data->image->SetMaxProcessors( maxProcessors ); + } + + /*! + * Returns the size in bytes of a row of pixels (also known as a scan + * line) in the image transported by this %ImageVariant image, or zero + * if this object transports no image. + * + * The returned value is BytesPerSample()*Width(). + */ + size_type LineSize() const noexcept + { + return m_data->image ? BytesPerSample() * size_type( m_data->image->Width() ) : 0; + } + + /*! + * Returns the size in bytes of a channel in the image transported by this + * %ImageVariant, or zero if this object transports no image. + * + * The returned value is BytesPerSample()*NumberOfPixels(). + */ + size_type ChannelSize() const noexcept + { + return BytesPerSample() * NumberOfPixels(); + } + + /*! + * Returns the size in bytes of the allocated pixel data in the image + * transported by this %ImageVariant, or zero if this object transports no + * image. + * + * The returned value is NumberOfSamples()*BytesPerSample(). + */ + size_type ImageSize() const noexcept + { + return ChannelSize() * size_type( NumberOfChannels() ); + } + + /*! + * Returns the size in bytes of all memory blocks required to store the + * pixel data in the nominal channels (i.e., \e excluding alpha channels) of + * the image transported by this %ImageVariant, or zero if this object + * transports no image. + * + * The returned value is ChannelSize()*NumberOfNominalChannels(). + */ + size_type NominalSize() const noexcept + { + return ChannelSize() * size_type( NumberOfNominalChannels() ); + } + + /*! + * Returns the size in bytes of all memory blocks required to store the + * pixel data in the alpha channels (i.e., \e excluding nominal channels) + * of this image. Returns zero if this image has no alpha channels, or if + * this object transports no image. + * + * The returned value is ChannelSize()*NumberOfAlphaChannels(). + */ + size_type AlphaSize() const noexcept + { + return ChannelSize() * size_type( NumberOfAlphaChannels() ); + } + + /*! + * Returns true iff this %ImageVariant transports a color image. Returns + * false if this object transports a grayscale image, or if it does not + * transport any image. + */ + bool IsColor() const noexcept + { + return m_data->image && m_data->image->IsColor(); + } + + /*! + * Returns the identifier of the color space of the image transported by + * this %ImageVariant. + * + * This function returns the value of a symbolic constant enumerated by the + * ColorSpace namespace. If this object transports no image, this function + * returns ColorSpace::Unknown. + */ + color_space ColorSpace() const noexcept + { + return m_data->image ? m_data->image->ColorSpace() : ColorSpace::Unknown; + } + + /*! + * Returns the identifier of a nominal channel or component \a c in the + * color space of the image transported by this %ImageVariant, or an empty + * string if this object transports no image. + */ + String ChannelId( int c ) const noexcept + { + return m_data->image ? m_data->image->ChannelId( c ) : String(); + } + + /*! + * Returns a reference to the RGB working space associated with the image + * transported by this %ImageVariant object. + * + * \warning Do not call this member function if the %ImageVariant does not + * transport an image. + */ + const RGBColorSystem& RGBWorkingSpace() const noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return m_data->image->RGBWorkingSpace(); + } + + /*! + * Associates a given RGB working space ( RGBWS ) with the image transported + * by this %ImageVariant object. + * + * \note For shared images ( i.e. images living in the PixInsight core + * application ), the RGB working space cannot be changed by calling this + * function. + * + * \warning If this member function is called for a shared image, it throws + * an Error exception with the appropriate error message. + */ + void SetRGBWorkingSpace( const RGBColorSystem& rgbws ) + { + if ( m_data->image ) + m_data->image->SetRGBWorkingSpace( rgbws ); + } + + // ------------------------------------------------------------------------- + +#define __ABSOLUTE_DIFFERENCE( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).AbsoluteDifference( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the absolute values of their differences with the specified + * \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::AbsoluteDifference() + */ + template + ImageVariant AbsoluteDifference( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __ABSOLUTE_DIFFERENCE ) + return result; + } + +#undef __ABSOLUTE_DIFFERENCE + + // ------------------------------------------------------------------------- + +#define __ABSOLUTE_VALUE( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).AbsoluteValue( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * replaced with their absolute values. + * + * This member function is a generalized wrapper for + * GenericImage::AbsoluteValue() + */ + ImageVariant AbsoluteValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __ABSOLUTE_VALUE ) + return result; + } + +#undef __ABSOLUTE_VALUE + + // ------------------------------------------------------------------------- + +#define __ADD( I ) \ + static_cast( **this ).Add( scalar, rect, firstChannel, lastChannel ) + + /*! + * Adds the specified \a scalar to a subset of pixel samples in this image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Add() + */ + template + ImageVariant& Add( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __ADD ) + return *this; + } + +#undef __ADD + + // ------------------------------------------------------------------------- + +#define __ADD_1( I ) \ + ImageVariant::Add( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __ADD_2( I ) \ + image1.Add( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Add( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __ADD_2 ) + } + +public: + + /*! + * Adds pixel samples of the specified \a image to a subset of pixel samples + * in this image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Add() + */ + ImageVariant& Add( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __ADD_1 ) + return *this; + } + +#undef __ADD_1 +#undef __ADD_2 + + // ------------------------------------------------------------------------- + +#define __ADDED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Added( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * adds a \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for GenericImage::Added() + */ + template + ImageVariant Added( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __ADDED ) + return result; + } + +#undef __ADDED + + // ------------------------------------------------------------------------- + +#define __ALLOCATE_DATA( I ) \ + static_cast( **this ).AllocateData( width, height, numberOfChannels, colorSpace ) + + /*! + * Allocates new pixel data with the specified geometry and color space. + * Returns a reference to this image. + * + * If this object transports no image, a new local image is created in + * 32-bit floating point format by calling CreateImage(). + * + * This member function is a generalized wrapper for + * GenericImage::AllocateData() + */ + ImageVariant& AllocateData( int width, int height, int numberOfChannels = 1, color_space colorSpace = ColorSpace::Gray ) + { + if ( !*this ) + CreateImage(); + SOLVE_TEMPLATE( __ALLOCATE_DATA ) + return *this; + } + +#undef __ALLOCATE_DATA + + // ------------------------------------------------------------------------- + +#define __ALLOCATE_DATA( I ) \ + static_cast( **this ).AllocateData( rect, numberOfChannels, colorSpace ) + + /*! + * Allocates new pixel data with the specified geometry and color space. + * Returns a reference to this image. + * + * If this object transports no image, a new local image is created in + * 32-bit floating point format by calling CreateImage(). + * + * This member function is a generalized wrapper for + * GenericImage::AllocateData() + */ + ImageVariant& AllocateData( const Rect& rect, int numberOfChannels = 1, color_space colorSpace = ColorSpace::Gray ) + { + if ( !*this ) + CreateImage(); + SOLVE_TEMPLATE( __ALLOCATE_DATA ) + return *this; + } + +#undef __ALLOCATE_DATA + + // ------------------------------------------------------------------------- + +#define __AND( I ) \ + static_cast( **this ).And( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise AND operation between a subset of pixel samples in + * this image and the specified \a scalar. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for GenericImage::And() + */ + template + ImageVariant& And( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __AND ) + return *this; + } + +#undef __AND + + // ------------------------------------------------------------------------- + +#define __AND_1( I ) \ + ImageVariant::And( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __AND_2( I ) \ + image1.And( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void And( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __AND_2 ) + } + +public: + + /*! + * Performs a bitwise AND operation between a subset of pixel samples in + * this image and the corresponding samples of the specified source + * \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::And() + */ + ImageVariant& And( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __AND_1 ) + return *this; + } + +#undef __AND_1 +#undef __AND_2 + + // ------------------------------------------------------------------------- + +#define __APPLIED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Applied( scalar, op, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * performs an arithmetic or bitwise logical operation with a scalar. + * Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::Applied( T ) + */ + template + ImageVariant Applied( T scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __APPLIED ) + return result; + } + +#undef __APPLIED + + // ------------------------------------------------------------------------- + +#define __APPLIED_1( I ) \ + result = ImageVariant::Applied( static_cast( **this ), image, op, point, channel, rect, firstChannel, lastChannel ) + +#define __APPLIED_2( I ) \ + result.SetImage( *new pcl::I( image1.Applied( static_cast( *image2 ), op, point, channel, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + +private: + + template static + ImageVariant Applied( const GenericImage

& image1, const ImageVariant& image2, + image_op op, const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + ImageVariant result; + SOLVE_TEMPLATE_2( image2, __APPLIED_2 ) + return result; + } + +public: + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * performs an arithmetic or bitwise logical operation with the + * corresponding samples of another \a image. Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::Applied( const GenericImage& ) + */ + ImageVariant Applied( const ImageVariant& image, image_op op = ImageOp::Mov, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __APPLIED_1 ) + return result; + } + +#undef __APPLIED_1 +#undef __APPLIED_2 + + // ------------------------------------------------------------------------- + +#define __APPLIED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Applied( transformation, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * applies an image transformation. Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::Applied( const ImageTransformation& ) + */ + ImageVariant Applied( const ImageTransformation& transformation, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __APPLIED ) + return result; + } + +#undef __APPLIED + + // ------------------------------------------------------------------------- + +#define __APPLY( I ) \ + static_cast( **this ).Apply( scalar, op, rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples with the result of an arithmetic, + * bitwise logical or pixel composition operation with a scalar. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Apply( T ) + */ + template + ImageVariant& Apply( T scalar, image_op op = ImageOp::Mov, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __APPLY ) + return *this; + } + +#undef __APPLY + + // ------------------------------------------------------------------------- + +#define __APPLY_1( I ) \ + ImageVariant::Apply( static_cast( **this ), image, op, point, channel, rect, firstChannel, lastChannel ) + +#define __APPLY_2( I ) \ + image1.Apply( static_cast( *image2 ), op, point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Apply( GenericImage

& image1, const ImageVariant& image2, + image_op op, const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __APPLY_2 ) + } + +public: + + /*! + * Performs an arithmetic, bitwise logical or pixel composition operation + * between a subset of pixel samples in this image and the corresponding + * samples of another operand \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Apply( const GenericImage& ) + */ + ImageVariant& Apply( const ImageVariant& image, image_op op = ImageOp::Mov, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __APPLY_1 ) + return *this; + } + +#undef __APPLY_1 +#undef __APPLY_2 + + // ------------------------------------------------------------------------- + +#define __APPLY( I ) \ + static_cast( **this ).Apply( transformation, rect, firstChannel, lastChannel ) + + /*! + * Applies an image transformation to a subset of pixel samples. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Apply( const ImageTransformation& ) + */ + ImageVariant& Apply( const ImageTransformation& transformation, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __APPLY ) + return *this; + } + +#undef __APPLY + + // ------------------------------------------------------------------------- + +#define __ASSIGN_IMAGE_1( I ) \ + ImageVariant::AssignImage( static_cast( **this ), image, rect, firstChannel, lastChannel ) + +#define __ASSIGN_IMAGE_2( I ) \ + image1.Assign( static_cast( *image2 ), rect, firstChannel, lastChannel ) + +private: + + template static + void AssignImage( GenericImage

& image1, const ImageVariant& image2, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __ASSIGN_IMAGE_2 ) + } + +public: + + /*! + * Copies pixel samples from the specified source \a image to this image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Assign() + */ + ImageVariant& AssignImage( const ImageVariant& image, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __ASSIGN_IMAGE_1 ) + return *this; + } + +#undef __ASSIGN_IMAGE_1 +#undef __ASSIGN_IMAGE_2 + + // ------------------------------------------------------------------------- + +#define __AVG_DEV( I ) \ + result = static_cast( **this ).AvgDev( center, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the mean absolute deviation of a subset of pixel samples with + * respect to the specified \a center value. + * + * This member function is a generalized wrapper for GenericImage::AvgDev() + */ + double AvgDev( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __AVG_DEV ) + return result; + } + +#undef __AVG_DEV + + // ------------------------------------------------------------------------- + +#define __2SIDED_AVG_DEV( I ) \ + result = static_cast( **this ).TwoSidedAvgDev( center, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the two-sided mean absolute deviation of a subset of pixel + * samples with respect to the specified \a center value. + * + * This member function is a generalized wrapper for + * GenericImage::TwoSidedAvgDev() + */ + TwoSidedEstimate TwoSidedAvgDev( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + TwoSidedEstimate result( 0 ); + if ( *this ) + SOLVE_TEMPLATE( __2SIDED_AVG_DEV ) + return result; + } + +#undef __2SIDED_AVG_DEV + + // ------------------------------------------------------------------------- + +#define __BINARIZE( I ) \ + static_cast( **this ).Binarize( threshold, rect, firstChannel, lastChannel ) + + /*! + * Binarizes a subset of pixel samples with respect to the specified + * \a threshold value. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Binarize() + */ + template + ImageVariant& Binarize( T threshold, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __BINARIZE ) + return *this; + } + +#undef __BINARIZE + + // ------------------------------------------------------------------------- + +#define __BINARIZE( I ) \ + static_cast( **this ).Binarize( rect, firstChannel, lastChannel ) + + /*! + * Binarizes a subset of pixel samples with respect to the specified + * \a threshold value. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Binarize() + */ + ImageVariant& Binarize( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __BINARIZE ) + return *this; + } + +#undef __BINARIZE + + // ------------------------------------------------------------------------- + +#define __BINARIZED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Binarized( threshold, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * binarized with respect to the specified \a threshold value. + * + * This member function is a generalized wrapper for + * GenericImage::Binarized() + */ + template + ImageVariant Binarized( T threshold, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __BINARIZED ) + return result; + } + +#undef __BINARIZED + + // ------------------------------------------------------------------------- + +#define __BINARIZED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Binarized( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Binarizes a subset of pixel samples with respect to the central value of + * the native range of the image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Binarized() + */ + ImageVariant Binarized( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __BINARIZED ) + return result; + } + +#undef __BINARIZED + + // ------------------------------------------------------------------------- + +#define __PBMV( I ) \ + result = static_cast( **this ).BendMidvariance( center, beta, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns a percentage bend midvariance (PBMV) for a subset of pixel + * samples, with respect the the specified \a center value, with the + * specified \a beta rejection parameter. + * + * This member function is a generalized wrapper for + * GenericImage::BendMidvariance() + */ + double BendMidvariance( double center, double beta = 0.2, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __PBMV ) + return result; + } + +#undef __PBMV + + // ------------------------------------------------------------------------- + +#define __BWMV( I ) \ + result = static_cast( **this ).BiweightMidvariance( center, sigma, k, reducedLength, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns a biweight midvariance (BWMV) for a subset of pixel samples, with + * respect the the specified \a center value, \a sigma estimate of + * dispersion, and \a k threshold in sigma units. + * + * This member function is a generalized wrapper for + * GenericImage::BiweightMidvariance() + */ + double BiweightMidvariance( double center, double sigma, int k = 9, bool reducedLength = false, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __BWMV ) + return result; + } + +#undef __BWMV + + // ------------------------------------------------------------------------- + +#define __2SIDED_BWMV( I ) \ + result = static_cast( **this ).TwoSidedBiweightMidvariance( center, sigma, k, reducedLength, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns a two-sided biweight midvariance (BWMV) for a subset of pixel + * samples, with respect the the specified \a center value, two-sided + * \a sigma estimate of dispersion, and \a k threshold in sigma units. + * + * This member function is a generalized wrapper for + * GenericImage::TwoSidedBiweightMidvariance() + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( double center, const TwoSidedEstimate& sigma, int k = 9, bool reducedLength = false, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + TwoSidedEstimate result( 0 ); + if ( *this ) + SOLVE_TEMPLATE( __2SIDED_BWMV ) + return result; + } + +#undef __2SIDED_BWMV + + // ------------------------------------------------------------------------- + +#define __BLACK( I ) \ + static_cast( **this ).Black( rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples with the minimum sample value in the + * native range of the image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Black() + */ + ImageVariant& Black( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __BLACK ) + return *this; + } + +#undef __BLACK + + // ------------------------------------------------------------------------- + +#define __BLEND( I ) \ + static_cast( **this ).Blend( bitmap, point, rect ) + + /*! + * Blends a rectangular region of a 32-bit RGBA \a bitmap with this image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Blend() + */ + ImageVariant& Blend( const Bitmap& bitmap, + const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ) ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __BLEND ) + return *this; + } + +#undef __BLEND + + // ------------------------------------------------------------------------- + +#define __BLENDED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Blended( bitmap, point, rect ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local duplicate of this image blended with a rectangular region + * of a 32-bit RGBA \a bitmap. + * + * This member function is a generalized wrapper for GenericImage::Blended() + */ + ImageVariant Blended( const Bitmap& bitmap, const Point& point = Point( int_max ), const Rect& rect = Rect( 0 ) ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __BLENDED ) + return result; + } + +#undef __BLENDED + + // ------------------------------------------------------------------------- + +#define __COUNT( I ) \ + result = static_cast( **this ).Count( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the number of pixel samples selectable for statistics calculation + * from a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Count() + */ + uint64 Count( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, int maxProcessors = 0 ) const + { + uint64 result = 0; + if ( *this ) + SOLVE_TEMPLATE( __COUNT ) + return result; + } + +#undef __COUNT + + // ------------------------------------------------------------------------- + +#define __CREATE_ALPHA_CHANNELS( I ) \ + static_cast( **this ).CreateAlphaChannels( n ) + + /*! + * Creates \a n new alpha channels in this image. Alpha channels are those + * in excess of nominal channels, e.g. a fourth channel in an RGB color + * image, or a second channel in a grayscale image. Returns a reference to + * this image. + * + * Newly created channels are not initialized, so their pixel samples will + * contain unpredictable values. + * + * This member function is a generalized wrapper for + * GenericImage::CreateAlphaChannels() + */ + void CreateAlphaChannels( int n ) + { + if ( *this ) + SOLVE_TEMPLATE( __CREATE_ALPHA_CHANNELS ) + } + +#undef __CREATE_ALPHA_CHANNELS + + // ------------------------------------------------------------------------- + +#define __CROP( I ) \ + static_cast( **this ).Crop( fillValues ) + + /*! + * Crops the image to its current rectangular selection. Returns a reference + * to this image. + * + * This member function is a generalized wrapper for GenericImage::Crop() + */ + template + ImageVariant& Crop( const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP ) + return *this; + } + +#undef __CROP + + // ------------------------------------------------------------------------- + +#define __CROP( I ) \ + static_cast( **this ).Crop() + + /*! + * Crops the image to its current rectangular selection, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Crop() + */ + ImageVariant& Crop() + { + if ( *this ) + SOLVE_TEMPLATE( __CROP ) + return *this; + } + +#undef __CROP + + // ------------------------------------------------------------------------- + +#define __CROP_BY( I ) \ + static_cast( **this ).CropBy( left, top, right, bottom, fillValues ) + + /*! + * Crops or extends the entire image by applying the specified margins. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropBy() + */ + template + ImageVariant& CropBy( int left, int top, int right, int bottom, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_BY ) + return *this; + } + +#undef __CROP_BY + + // ------------------------------------------------------------------------- + +#define __CROP_BY( I ) \ + static_cast( **this ).CropBy( left, top, right, bottom ) + + /*! + * Crops or extends the entire image by applying the specified margins. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropBy() + */ + ImageVariant& CropBy( int left, int top, int right, int bottom ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_BY ) + return *this; + } + +#undef __CROP_BY + + // ------------------------------------------------------------------------- + +#define __CROP_TO( I ) \ + static_cast( **this ).CropTo( rect, fillValues ) + + /*! + * Crops the image to the specified rectangular region. Returns a reference + * to this image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropTo() + */ + template + ImageVariant& CropTo( const Rect& rect, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_TO ) + return *this; + } + +#undef __CROP_TO + + // ------------------------------------------------------------------------- + +#define __CROP_TO( I ) \ + static_cast( **this ).CropTo( rect ) + + /*! + * Crops the image to the specified rectangular region, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropTo() + */ + ImageVariant& CropTo( const Rect& rect ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_TO ) + return *this; + } + +#undef __CROP_TO + + // ------------------------------------------------------------------------- + +#define __CROP_TO( I ) \ + static_cast( **this ).CropTo( x0, y0, x1, y1, fillValues ) + + /*! + * Crops the image to the specified rectangular region. Returns a reference + * to this image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropTo() + */ + template + ImageVariant& CropTo( int x0, int y0, int x1, int y1, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_TO ) + return *this; + } + +#undef __CROP_TO + + // ------------------------------------------------------------------------- + +#define __CROP_TO( I ) \ + static_cast( **this ).CropTo( x0, y0, x1, y1 ) + + /*! + * Crops the image to the specified rectangular region, filling extended + * regions with the minimum sample value in the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::CropTo() + */ + ImageVariant& CropTo( int x0, int y0, int x1, int y1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __CROP_TO ) + return *this; + } + +#undef __CROP_TO + + // ------------------------------------------------------------------------- + +#define __DELETE_ALPHA_CHANNEL( I ) \ + static_cast( **this ).DeleteAlphaChannel( channel ) + + /*! + * Destroys an alpha channel. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::DeleteAlphaChannel() + */ + void DeleteAlphaChannel( int channel ) + { + if ( *this ) + SOLVE_TEMPLATE( __DELETE_ALPHA_CHANNEL ) + } + +#undef __DELETE_ALPHA_CHANNEL + + // ------------------------------------------------------------------------- + +#define __DELETE_ALPHA_CHANNELS( I ) \ + static_cast( **this ).DeleteAlphaChannels() + + /*! + * Destroys all existing alpha channels in this image. Returns a reference + * to this image. + * + * This member function is a generalized wrapper for + * GenericImage::DeleteAlphaChannels() + */ + void DeleteAlphaChannels() + { + if ( *this ) + SOLVE_TEMPLATE( __DELETE_ALPHA_CHANNELS ) + } + +#undef __DELETE_ALPHA_CHANNELS + + // ------------------------------------------------------------------------- + +#define __DIVIDE( I ) \ + static_cast( **this ).Divide( scalar, rect, firstChannel, lastChannel ) + + /*! + * Divides a subset of pixel samples in this image by the specified + * \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Divide() + */ + template + ImageVariant& Divide( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __DIVIDE ) + return *this; + } + +#undef __DIVIDE + + /*! + * A synonym for Divide(). + */ + template + ImageVariant& Div( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Divide( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __DIVIDE_1( I ) \ + ImageVariant::Divide( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __DIVIDE_2( I ) \ + image1.Divide( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Divide( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __DIVIDE_2 ) + } + +public: + + /*! + * Divides a subset of pixel samples in this image by samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Divide() + */ + ImageVariant& Divide( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __DIVIDE_1 ) + return *this; + } + +#undef __DIVIDE_1 +#undef __DIVIDE_2 + + /*! + * A synonym for Divide(). + */ + ImageVariant& Div( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Divide( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __DIVIDED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Divided( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * divides it by a \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for GenericImage::Divided() + */ + template + ImageVariant Divided( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __DIVIDED ) + return result; + } + +#undef __DIVIDED + + // ------------------------------------------------------------------------- + +#define __EXCHANGE_1( I ) \ + ImageVariant::Exchange( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __EXCHANGE_2( I ) \ + image1.Exchange( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Exchange( GenericImage

& image1, ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __EXCHANGE_2 ) + } + +public: + + /*! + * Exchanges a subset of pixel samples between this image and another + * operand \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Exchange() + */ + ImageVariant& Exchange( ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __EXCHANGE_1 ) + return *this; + } + +#undef __EXCHANGE_1 +#undef __EXCHANGE_2 + + /*! + * A synonym for Exchange(). + */ + ImageVariant& Xchg( ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Exchange( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __FILL( I ) \ + static_cast( **this ).Fill( scalar, rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples of this image with the specified + * \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Fill() + */ + template + ImageVariant& Fill( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __FILL ) + return *this; + } + +#undef __FILL + + // ------------------------------------------------------------------------- + +#define __FILL( I ) \ + static_cast( **this ).Fill( values, rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples of this image with the scalar components + * of a vector of per-channel filling \a values. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for GenericImage::Fill() + */ + template + ImageVariant& Fill( const GenericVector& values, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __FILL ) + return *this; + } + +#undef __FILL + + // ------------------------------------------------------------------------- + +#define __FILLED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Filled( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * filled with the specified \a scalar. + * + * This member function is a generalized wrapper for GenericImage::Filled() + */ + template + ImageVariant Filled( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __FILLED ) + return result; + } + +#undef __FILLED + + // ------------------------------------------------------------------------- + +#define __FILLED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Filled( values, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * filled with the scalar components of a vector of per-channel filling + * \a values. + * + * This member function is a generalized wrapper for GenericImage::Filled() + */ + template + ImageVariant Filled( const GenericVector& values, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __FILLED ) + return result; + } + +#undef __FILLED + + // ------------------------------------------------------------------------- + +#define __FORGET_ALPHA_CHANNEL( I ) \ + static_cast( **this ).ForgetAlphaChannel( channel ) + + /*! + * Forces this image to discard an existing alpha channel without + * deallocating it. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ForgetAlphaChannel() + */ + void ForgetAlphaChannel( int channel ) + { + if ( *this ) + SOLVE_TEMPLATE( __FORGET_ALPHA_CHANNEL ) + } + +#undef __FORGET_ALPHA_CHANNEL + + // ------------------------------------------------------------------------- + +#define __FORGET_ALPHA_CHANNELS( I ) \ + static_cast( **this ).ForgetAlphaChannels() + + /*! + * Forces this image to discard all existing alpha channels without + * deallocating them. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ForgetAlphaChannels() + */ + void ForgetAlphaChannels() + { + if ( *this ) + SOLVE_TEMPLATE( __FORGET_ALPHA_CHANNELS ) + } + +#undef __FORGET_ALPHA_CHANNELS + + // ------------------------------------------------------------------------- + +#define __GET_COLUMN( I ) \ + static_cast( **this ).GetColumn( buffer, x, channel ) + + /*! + * Stores a duplicate of a column of pixel samples in the specified array, + * with implicit data type conversion. + * + * This member function is a generalized wrapper for + * GenericImage::GetColumn() + */ + template + void GetColumn( T* buffer, int x, int channel = -1 ) const + { + PCL_PRECONDITION( buffer != 0 ) + if ( *this ) + SOLVE_TEMPLATE( __GET_COLUMN ) + } + +#undef __GET_COLUMN + + // ------------------------------------------------------------------------- + +#define __GET_EXTREME_SAMPLE_VALUES( I ) \ + static_cast( **this ).GetExtremeSampleValues( min, max, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Obtains the extreme values among a subset of pixel samples of this image. + * + * This member function is a generalized wrapper for + * GenericImage::GetExtremeSampleValues() + */ + template + void GetExtremeSampleValues( T& min, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + PCL_PRECONDITION( buffer != 0 ) + if ( *this ) + SOLVE_TEMPLATE( __GET_EXTREME_SAMPLE_VALUES ) + } + +#undef __GET_EXTREME_SAMPLE_VALUES + + // ------------------------------------------------------------------------- + +#define __GET_INTENSITY_1( I ) \ + ImageVariant::GetIntensity( Y, static_cast( **this ), rect, maxProcessors ) + +#define __GET_INTENSITY_2( I ) \ + image.GetIntensity( static_cast( *Y ), rect, maxProcessors ) + +private: + + template static + void GetIntensity( ImageVariant& Y, const GenericImage

& image, const Rect& rect, int maxProcessors ) + { + if ( !Y.IsComplexSample() ) + SOLVE_TEMPLATE_REAL_2( Y, __GET_INTENSITY_2 ) + } + +public: + + /*! + * Computes the intensity HSI component for a subset of pixel samples and + * stores it in a grayscale image. + * + * \param[out] Y Reference to a destination %ImageVariant where the + * computed intensity component will be stored. If this + * object does not transport an image, a new 32-bit floating + * point image will be created. + * + * This member function is a generalized wrapper for + * GenericImage::GetIntensity(). + */ + void GetIntensity( ImageVariant& Y, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + if ( *this ) + if ( !IsComplexSample() ) + { + if ( !Y ) + Y.CreateFloatImage( 32 ); + + SOLVE_TEMPLATE_REAL( __GET_INTENSITY_1 ) + } + } + +#undef __GET_INTENSITY_1 +#undef __GET_INTENSITY_2 + + // ------------------------------------------------------------------------- + +#define __GET_LIGHTNESS_1( I ) \ + ImageVariant::GetLightness( L, static_cast( **this ), rect, maxProcessors ) + +#define __GET_LIGHTNESS_2( I ) \ + image.GetLightness( static_cast( *L ), rect, maxProcessors ) + +private: + + template static + void GetLightness( ImageVariant& L, const GenericImage

& image, const Rect& rect, int maxProcessors ) + { + if ( !L.IsComplexSample() ) + SOLVE_TEMPLATE_REAL_2( L, __GET_LIGHTNESS_2 ) + } + +public: + + /*! + * Computes the CIE L* component for a subset of pixel samples and stores it + * in a grayscale image. + * + * \param[out] L Reference to a destination %ImageVariant where the + * computed CIE L* component will be stored. If this object + * does not transport an image, a new floating point image + * will be created with the appropriate sample type (either + * 32-bit or 64-bit floating point, depending on the sample + * data type of this image). + * + * This member function is a generalized wrapper for + * GenericImage::GetLightness(). + */ + void GetLightness( ImageVariant& L, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + if ( *this ) + if ( !IsComplexSample() ) + { + if ( !L ) + L.CreateFloatImage( ( BitsPerSample() < 32 ) ? 32 : ( IsFloatSample() ? BitsPerSample() : 64 ) ); + + SOLVE_TEMPLATE_REAL( __GET_LIGHTNESS_1 ) + } + } + +#undef __GET_LIGHTNESS_1 +#undef __GET_LIGHTNESS_2 + + // ------------------------------------------------------------------------- + +#define __GET_LUMINANCE_1( I ) \ + ImageVariant::GetLuminance( Y, static_cast( **this ), rect, maxProcessors ) + +#define __GET_LUMINANCE_2( I ) \ + image.GetLuminance( static_cast( *Y ), rect, maxProcessors ) + +private: + + template static + void GetLuminance( ImageVariant& Y, const GenericImage

& image, const Rect& rect, int maxProcessors ) + { + if ( !Y.IsComplexSample() ) + SOLVE_TEMPLATE_REAL_2( Y, __GET_LUMINANCE_2 ) + } + +public: + + /*! + * Computes the CIE Y component for a subset of pixel samples and stores it + * in a grayscale image. + * + * \param[out] Y Reference to a destination %ImageVariant where the + * computed CIE Y component will be stored. If this object + * does not transport an image, a new floating point image + * will be created with the appropriate sample type (either + * 32-bit or 64-bit floating point, depending on the sample + * data type of this image). + * + * This member function is a generalized wrapper for + * GenericImage::GetLuminance(). + */ + void GetLuminance( ImageVariant& Y, const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) const + { + if ( *this ) + if ( !IsComplexSample() ) + { + if ( !Y ) + Y.CreateFloatImage( ( BitsPerSample() < 32 ) ? 32 : ( IsFloatSample() ? BitsPerSample() : 64 ) ); + + SOLVE_TEMPLATE_REAL( __GET_LUMINANCE_1 ) + } + } + +#undef __GET_LUMINANCE_1 +#undef __GET_LUMINANCE_2 + + // ------------------------------------------------------------------------- + +#define __GET_ROW( I ) \ + static_cast( **this ).GetRow( buffer, y, channel ) + + /*! + * Stores a duplicate of a row of pixel samples in the specified array, + * with implicit data type conversion. + * + * This member function is a generalized wrapper for GenericImage::GetRow() + */ + template + void GetRow( T* buffer, int y, int channel = -1 ) const + { + PCL_PRECONDITION( buffer != 0 ) + if ( *this ) + SOLVE_TEMPLATE( __GET_ROW ) + } + +#undef __GET_ROW + + // ------------------------------------------------------------------------- + +#define __INVERT( I ) \ + static_cast( **this ).Invert( scalar, rect, firstChannel, lastChannel ) + + /*! + * Inverts a subset of pixel samples with respect to the specified + * \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Invert() + */ + template + ImageVariant& Invert( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __INVERT ) + return *this; + } + +#undef __INVERT + + // ------------------------------------------------------------------------- + +#define __INVERT( I ) \ + static_cast( **this ).Invert( rect, firstChannel, lastChannel ) + + /*! + * Inverts a subset of pixel samples with respect to the maximum sample + * value in the native range of the image. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for GenericImage::Invert() + */ + ImageVariant& Invert( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __INVERT ) + return *this; + } + +#undef __INVERT + + // ------------------------------------------------------------------------- + +#define __INVERTED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Inverted( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * inverted with respect to the specified \a scalar. + * + * This member function is a generalized wrapper for + * GenericImage::Inverted() + */ + template + ImageVariant Inverted( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __INVERTED ) + return result; + } + +#undef __INVERTED + + // ------------------------------------------------------------------------- + +#define __INVERTED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Inverted( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * inverted with respect to the maximum sample value in the native range of + * the image. + * + * This member function is a generalized wrapper for + * GenericImage::Inverted() + */ + ImageVariant Inverted( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __INVERTED ) + return result; + } + +#undef __INVERTED + + // ------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#define __IS_SHARED_IMAGE( I ) \ + result = static_cast( **this ).IsShared() + + /*! + * Returns true iff this %ImageVariant object transports a shared image. + * Returns false if the transported image is local, or if this object + * transports no image. + * + * This member function is a generalized wrapper for + * GenericImage::IsShared() + */ + bool IsSharedImage() const noexcept + { + bool result = false; + if ( *this ) + SOLVE_TEMPLATE( __IS_SHARED_IMAGE ) + return result; + } + +#undef __IS_SHARED_IMAGE + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + + // ------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#define __SHARED_IMAGE_HANDLE( I ) \ + handle = static_cast( **this ).Allocator().Handle() + + /*! + * Returns the handle to the shared image transported by this %ImageVariant + * object, or zero (a null pointer) if the transported image is local, or if + * this object transports no image. + */ + void* SharedImageHandle() const noexcept + { + void* handle = nullptr; + if ( *this ) + SOLVE_TEMPLATE( __SHARED_IMAGE_HANDLE ) + return handle; + } + +#undef __SHARED_IMAGE_HANDLE + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + + // ------------------------------------------------------------------------- + +#define __IS_UNIQUE_IMAGE( I ) \ + result = static_cast( **this ).IsUnique() + + /*! + * Returns true iff this %ImageVariant object transports an image that + * uniquely references its pixel data. Returns false if the transported + * image is sharing its pixel data with other instances, or if this object + * transports no image. + * + * This member function is a generalized wrapper for + * GenericImage::IsUnique() + */ + bool IsUniqueImage() const noexcept + { + bool result = false; + if ( *this ) + SOLVE_TEMPLATE( __IS_UNIQUE_IMAGE ) + return result; + } + +#undef __IS_UNIQUE_IMAGE + + // ------------------------------------------------------------------------- + +#define __LOCATE_EXTREME_SAMPLE_VALUES( I ) \ + static_cast( **this ).LocateExtremeSampleValues( xmin, ymin, min, xmax, ymax, max, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Obtains the extreme values, and the image coordinates of their first + * occurrences, among a subset of pixel samples of this image. + * + * This member function is a generalized wrapper for + * GenericImage::LocateExtremeSampleValues() + */ + template + void LocateExtremeSampleValues( int& xmin, int& ymin, T& min, + int& xmax, int& ymax, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __LOCATE_EXTREME_SAMPLE_VALUES ) + } + +#undef __LOCATE_EXTREME_SAMPLE_VALUES + + // ------------------------------------------------------------------------- + +#define __LOCATE_EXTREME_SAMPLE_VALUES( I ) \ + static_cast( **this ).LocateExtremeSampleValues( pmin, min, pmax, max, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Obtains the extreme values, and the image coordinates of their first + * occurrences, among a subset of pixel samples of this image. + * + * This member function is a generalized wrapper for + * GenericImage::LocateExtremeSampleValues() + */ + template + void LocateExtremeSampleValues( Point& pmin, T& min, + Point& pmax, T& max, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __LOCATE_EXTREME_SAMPLE_VALUES ) + } + +#undef __LOCATE_EXTREME_SAMPLE_VALUES + + // ------------------------------------------------------------------------- + +#define __LOCATE_MAXIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).LocateMaximumSampleValue( xmax, ymax, rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the maximum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * This member function is a generalized wrapper for + * GenericImage::LocateMaximumSampleValue() + */ + double LocateMaximumSampleValue( int& xmax, int& ymax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __LOCATE_MAXIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __LOCATE_MAXIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __LOCATE_MAXIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).LocateMaximumSampleValue( pmax, rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the maximum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * This member function is a generalized wrapper for + * GenericImage::LocateMaximumSampleValue() + */ + double LocateMaximumSampleValue( Point& pmax, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __LOCATE_MAXIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __LOCATE_MAXIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __LOCATE_MINIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).LocateMinimumSampleValue( xmin, ymin, rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the minimum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * This member function is a generalized wrapper for + * GenericImage::LocateMinimumSampleValue() + */ + double LocateMinimumSampleValue( int& xmin, int& ymin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __LOCATE_MINIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __LOCATE_MINIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __LOCATE_MINIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).LocateMinimumSampleValue( pmin, rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the minimum value among a subset of pixel samples of this image, + * and obtains the image coordinates of its first occurrence. + * + * This member function is a generalized wrapper for + * GenericImage::LocateMinimumSampleValue() + */ + double LocateMinimumSampleValue( Point& pmin, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __LOCATE_MINIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __LOCATE_MINIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __MAD( I ) \ + result = static_cast( **this ).MAD( center, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the median absolute deviation (MAD) of a subset of pixel samples + * with respect to the specified \a center value. + * + * This member function is a generalized wrapper for GenericImage::MAD() + */ + double MAD( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MAD ) + return result; + } + +#undef __MAD + +// ------------------------------------------------------------------------- + +#define __2SIDED_MAD( I ) \ + result = static_cast( **this ).TwoSidedMAD( center, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the two-sided median absolute deviation (MAD) of a subset of + * pixel samples with respect to the specified \a center value. + * + * This member function is a generalized wrapper for + * GenericImage::TwoSidedMAD() + */ + TwoSidedEstimate TwoSidedMAD( double center, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + TwoSidedEstimate result( 0 ); + if ( *this ) + SOLVE_TEMPLATE( __2SIDED_MAD ) + return result; + } + +#undef __2SIDED_MAD + +// ------------------------------------------------------------------------- + +#define __MAXIMUM( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Maximum( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the maximum of each sample and the specified \a scalar. Returns + * the resulting image. + * + * This member function is a generalized wrapper for GenericImage::Maximum() + */ + template + ImageVariant Maximum( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __MAXIMUM ) + return result; + } + +#undef __MAXIMUM + + // ------------------------------------------------------------------------- + +#define __MAXIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).MaximumSampleValue( rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the maximum value among a subset of pixel samples of this image. + * + * This member function is a generalized wrapper for + * GenericImage::MaximumSampleValue() + */ + double MaximumSampleValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MAXIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __MAXIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __MEAN( I ) \ + result = static_cast( **this ).Mean( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the arithmetic mean of a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Mean() + */ + double Mean( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MEAN ) + return result; + } + +#undef __MEAN + + // ------------------------------------------------------------------------- + +#define __MEAN_OF_SQUARES( I ) \ + result = static_cast( **this ).MeanOfSquares( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the mean of the squares of a subset of pixel samples. + * + * This member function is a generalized wrapper for + * GenericImage::MeanOfSquares() + */ + double MeanOfSquares( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MEAN_OF_SQUARES ) + return result; + } + +#undef __MEAN_OF_SQUARES + + // ------------------------------------------------------------------------- + +#define __MEDIAN( I ) \ + result = static_cast( **this ).Median( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the median of a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Median() + */ + double Median( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MEDIAN ) + return result; + } + +#undef __MEDIAN + + // ------------------------------------------------------------------------- + +#define __ORDER_STATISTIC( I ) \ + result = static_cast( **this ).OrderStatistic( k, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns an order statistic computed for a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::OrderStatistic() + */ + double OrderStatistic( double k, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __ORDER_STATISTIC ) + return result; + } + +#undef __ORDER_STATISTIC + + // ------------------------------------------------------------------------- + +#define __MINIMUM( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Minimum( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * computes the minimum of each sample and the specified \a scalar. Returns + * the resulting image. + * + * This member function is a generalized wrapper for GenericImage::Minimum() + */ + template + ImageVariant Minimum( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __MINIMUM ) + return result; + } + +#undef __MINIMUM + + // ------------------------------------------------------------------------- + +#define __MINIMUM_SAMPLE_VALUE( I ) \ + pcl::I::pixel_traits::FromSample( result, static_cast( **this ).MinimumSampleValue( rect, firstChannel, lastChannel, maxProcessors ) ) + + /*! + * Returns the minimum value among a subset of pixel samples of this image. + * + * This member function is a generalized wrapper for + * GenericImage::MinimumSampleValue() + */ + double MinimumSampleValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MINIMUM_SAMPLE_VALUE ) + return result; + } + +#undef __MINIMUM_SAMPLE_VALUE + + // ------------------------------------------------------------------------- + +#define __MODULUS( I ) \ + result = static_cast( **this ).Modulus( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the modulus of a subset of pixel samples. The modulus is the sum + * of the absolute values of all selected pixel sample values. + * + * This member function is a generalized wrapper for GenericImage::Modulus() + */ + double Modulus( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __MODULUS ) + return result; + } + +#undef __MODULUS + + // ------------------------------------------------------------------------- + +#define __MOVE( I ) \ + static_cast( **this ).Move( scalar, rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples in this image with the specified + * constant \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Move() + */ + template + ImageVariant& Move( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __MOVE ) + return *this; + } + +#undef __MOVE + + /*! + * A synonym for Move(). + */ + template + ImageVariant& Mov( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Move( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __MOVE_1( I ) \ + ImageVariant::Move( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __MOVE_2( I ) \ + image1.Move( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Move( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __MOVE_2 ) + } + +public: + + /*! + * Replaces a subset of pixel samples in this image with samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Move() + */ + ImageVariant& Move( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __MOVE_1 ) + return *this; + } + +#undef __MOVE_1 +#undef __MOVE_2 + + ImageVariant& Mov( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Move( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __MULTIPLY( I ) \ + static_cast( **this ).Multiply( scalar, rect, firstChannel, lastChannel ) + + /*! + * Multiplies a subset of pixel samples in this image by the specified + * \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Multiply() + */ + template + ImageVariant& Multiply( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __MULTIPLY ) + return *this; + } + +#undef __MULTIPLY + + /*! + * A synonym for Multiply(). + */ + template + ImageVariant& Mul( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Multiply( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __MULTIPLY_1( I ) \ + ImageVariant::Multiply( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __MULTIPLY_2( I ) \ + image1.Multiply( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Multiply( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __MULTIPLY_2 ) + } + +public: + + /*! + * Multiplies a subset of pixel samples in this image by samples from the + * specified source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Multiply() + */ + ImageVariant& Multiply( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __MULTIPLY_1 ) + return *this; + } + +#undef __MULTIPLY_1 +#undef __MULTIPLY_2 + + /*! + * A synonym for Multiply(). + */ + ImageVariant& Mul( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Multiply( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __MULTIPLIED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Multiplied( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * multiplies it by a \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::Multiplied() + */ + template + ImageVariant Multiplied( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __MULTIPLIED ) + return result; + } + +#undef __MULTIPLIED + + // ------------------------------------------------------------------------- + +#define __NAND( I ) \ + static_cast( **this ).Nand( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise NAND (NOT AND) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is a generalized wrapper for GenericImage::Nand() + */ + template + ImageVariant& Nand( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __NAND ) + return *this; + } + +#undef __NAND + + // ------------------------------------------------------------------------- + +#define __NAND_1( I ) \ + ImageVariant::Nand( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __NAND_2( I ) \ + image1.Nand( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Nand( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __NAND_2 ) + } + +public: + + /*! + * Performs a bitwise NAND (NOT AND) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Nand() + */ + ImageVariant& Nand( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __NAND_1 ) + return *this; + } + +#undef __NAND_1 +#undef __NAND_2 + + // ------------------------------------------------------------------------- + +#define __NOR( I ) \ + static_cast( **this ).Nor( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise NOR (NOT inclusive OR) operation between a subset of + * pixel samples in this image and the specified \a scalar. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Nor() + */ + template + ImageVariant& Nor( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __NOR ) + return *this; + } + +#undef __NOR + + // ------------------------------------------------------------------------- + +#define __NOR_1( I ) \ + ImageVariant::Nor( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __NOR_2( I ) \ + image1.Nor( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Nor( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __NOR_2 ) + } + +public: + + /*! + * Performs a bitwise NOR (NOT inclusive OR) operation between a subset of + * pixel samples in this image and the corresponding samples of the + * specified source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Nor() + */ + ImageVariant& Nor( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __NOR_1 ) + return *this; + } + +#undef __NOR_1 +#undef __NOR_2 + + // ------------------------------------------------------------------------- + +#define __NORM( I ) \ + result = static_cast( **this ).Norm( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the norm of a subset of pixel samples. The norm is the sum of all + * selected pixel sample values. + * + * This member function is a generalized wrapper for GenericImage::Norm() + */ + double Norm( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __NORM ) + return result; + } + +#undef __NORM + + // ------------------------------------------------------------------------- + +#define __NORMS( I ) \ + result = static_cast( **this ).Norms( maxDegree, rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns a vector of norms for a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Norms() + */ + Vector Norms( int maxDegree, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + Vector result; + if ( *this ) + SOLVE_TEMPLATE( __NORMS ) + return result; + } + +#undef __NORM + + // ------------------------------------------------------------------------- + +#define __NORMALIZE( I ) \ + static_cast( **this ).Normalize( lowerBound, upperBound, rect, firstChannel, lastChannel ) + + /*! + * Normalizes a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Normalize() + */ + template + ImageVariant& Normalize( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __NORMALIZE ) + return *this; + } + +#undef __NORMALIZE + + // ------------------------------------------------------------------------- + +#define __NORMALIZE( I ) \ + static_cast( **this ).Normalize( rect, firstChannel, lastChannel ) + + /*! + * Normalizes a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Normalize() + */ + ImageVariant& Normalize( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __NORMALIZE ) + return *this; + } + +#undef __NORMALIZE + + // ------------------------------------------------------------------------- + +#define __NORMALIZED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Normalized( lowerBound, upperBound, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * normalized to the specified range of values. + * + * This member function is a generalized wrapper for + * GenericImage::Normalized() + */ + template + ImageVariant Normalized( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __NORMALIZED ) + return result; + } + +#undef __NORMALIZED + + // ------------------------------------------------------------------------- + +#define __NORMALIZED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Normalized( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * normalized to the native range of the image. + * + * This member function is a generalized wrapper for + * GenericImage::Normalized() + */ + ImageVariant Normalized( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __NORMALIZED ) + return result; + } + +#undef __NORMALIZED + + // ------------------------------------------------------------------------- + +#define __NOT( I ) \ + static_cast( **this ).Not( rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples with their bitwise logical NOT values. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Not() + */ + ImageVariant& Not( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __NOT ) + return *this; + } + +#undef __NOT + + // ------------------------------------------------------------------------- + +#define __ONE( I ) \ + static_cast( **this ).One( rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples with the constant value resulting from + * converting the scalar one (1) to the sample data type of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::One() + */ + ImageVariant& One( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __ONE ) + return *this; + } + +#undef __ONE + + // ------------------------------------------------------------------------- + +#define __MULTIPLY( I ) \ + static_cast( **this ) *= scalar + + /*! + * A synonym for Multiply(). + */ + template + ImageVariant& operator *=( T scalar ) + { + if ( *this ) + SOLVE_TEMPLATE( __MULTIPLY ) + return *this; + } + +#undef __MULTIPLY + + // ------------------------------------------------------------------------- + +#define __MULTIPLY_1( I ) \ + ImageVariant::Multiply( static_cast( **this ), image ) + +#define __MULTIPLY_2( I ) \ + image1 *= static_cast( *image2 ) + +private: + + template static + void Multiply( GenericImage

& image1, const ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __MULTIPLY_2 ) + } + +public: + + /*! + * A synonym for Multiply(). + */ + ImageVariant& operator *=( const ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __MULTIPLY_1 ) + return *this; + } + +#undef __MULTIPLY_1 +#undef __MULTIPLY_2 + + // ------------------------------------------------------------------------- + +#define __ADD( I ) \ + static_cast( **this ) += scalar + + /*! + * A synonym for Add(). + */ + template + ImageVariant& operator +=( T scalar ) + { + if ( *this ) + SOLVE_TEMPLATE( __ADD ) + return *this; + } + +#undef __ADD + + // ------------------------------------------------------------------------- + +#define __ADD_1( I ) \ + ImageVariant::Add( static_cast( **this ), image ) + +#define __ADD_2( I ) \ + image1 += static_cast( *image2 ) + +private: + + template static + void Add( GenericImage

& image1, const ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __ADD_2 ) + } + +public: + + /*! + * A synonym for Add(). + */ + ImageVariant& operator +=( const ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __ADD_1 ) + return *this; + } + +#undef __ADD_1 +#undef __ADD_2 + + // ------------------------------------------------------------------------- + +#define __SUBTRACT( I ) \ + static_cast( **this ) -= scalar + + /*! + * A synonym for Subtract(). + */ + template + ImageVariant& operator -=( T scalar ) + { + if ( *this ) + SOLVE_TEMPLATE( __SUBTRACT ) + return *this; + } + +#undef __SUBTRACT + + // ------------------------------------------------------------------------- + +#define __SUBTRACT_1( I ) \ + ImageVariant::Subtract( static_cast( **this ), image ) + +#define __SUBTRACT_2( I ) \ + image1 -= static_cast( *image2 ) + +private: + + template static + void Subtract( GenericImage

& image1, const ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __SUBTRACT_2 ) + } + +public: + + /*! + * A synonym for Subtract(). + */ + ImageVariant& operator -=( const ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __SUBTRACT_1 ) + return *this; + } + +#undef __SUBTRACT_1 +#undef __SUBTRACT_2 + + // ------------------------------------------------------------------------- + +#define __DIVIDE( I ) \ + static_cast( **this ) /= scalar + + /*! + * A synonym for Divide(). + */ + template + ImageVariant& operator /=( T scalar ) + { + if ( *this ) + SOLVE_TEMPLATE( __DIVIDE ) + return *this; + } + +#undef __DIVIDE + + // ------------------------------------------------------------------------- + +#define __DIVIDE_1( I ) \ + ImageVariant::Divide( static_cast( **this ), image ) + +#define __DIVIDE_2( I ) \ + image1 /= static_cast( *image2 ) + +private: + + template static + void Divide( GenericImage

& image1, const ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __DIVIDE_2 ) + } + +public: + + /*! + * A synonym for Divide(). + */ + ImageVariant& operator /=( const ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __DIVIDE_1 ) + return *this; + } + +#undef __DIVIDE_1 +#undef __DIVIDE_2 + + // ------------------------------------------------------------------------- + +#define __RAISE( I ) \ + static_cast( **this ) ^= scalar + + /*! + * A synonym for Raise(). + */ + template + ImageVariant& operator ^=( T scalar ) + { + if ( *this ) + SOLVE_TEMPLATE( __RAISE ) + return *this; + } + +#undef __RAISE + + // ------------------------------------------------------------------------- + +#define __RAISE_1( I ) \ + ImageVariant::Raise( static_cast( **this ), image ) + +#define __RAISE_2( I ) \ + image1 ^= static_cast( *image2 ) + +private: + + template static + void Raise( GenericImage

& image1, const ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __RAISE_2 ) + } + +public: + + /*! + * A synonym for Raise(). + */ + ImageVariant& operator ^=( const ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __RAISE_1 ) + return *this; + } + +#undef __RAISE_1 +#undef __RAISE_2 + + // ------------------------------------------------------------------------- + +#define __INVERTED( I ) \ + result.SetImage( *new pcl::I( ~static_cast( **this ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns an inverted duplicate of this image. The inversion operation is + * performed on the current pixel sample selection with respect to the + * maximum sample value in the native range of the image. + * + * This member function is a generalized wrapper for + * GenericImage::operator ~() + */ + ImageVariant operator ~() const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __INVERTED ) + return result; + } + +#undef __INVERTED + + // ------------------------------------------------------------------------- + +#define __OR( I ) \ + static_cast( **this ).Or( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise OR (inclusive OR) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is a generalized wrapper for GenericImage::Or() + */ + template + ImageVariant& Or( T scalar, const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __OR ) + return *this; + } + +#undef __OR + + // ------------------------------------------------------------------------- + +#define __OR_1( I ) \ + ImageVariant::Or( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __OR_2( I ) \ + image1.Or( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Or( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __OR_2 ) + } + +public: + + /*! + * Performs a bitwise OR (inclusive OR) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Or() + */ + ImageVariant& Or( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __OR_1 ) + return *this; + } + +#undef __OR_1 +#undef __OR_2 + + // ------------------------------------------------------------------------- + +#define __RAISE( I ) \ + static_cast( **this ).Raise( scalar, rect, firstChannel, lastChannel ) + + /*! + * Raises (exponentiation operator) a subset of pixel samples in this image + * to the specified \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Raise() + */ + template + ImageVariant& Raise( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __RAISE ) + return *this; + } + +#undef __RAISE + + /*! + * A synonym for Raise(). + */ + template + ImageVariant& Pow( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Raise( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __Qn( I ) \ + result = static_cast( **this ).Qn( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the Qn scale estimator of Rousseeuw and Croux for a subset of + * pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Qn() + */ + double Qn( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = false; + if ( *this ) + SOLVE_TEMPLATE( __Qn ) + return result; + } + +#undef __Qn + + // ------------------------------------------------------------------------- + +#define __RAISE_1( I ) \ + ImageVariant::Raise( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __RAISE_2( I ) \ + image1.Raise( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Raise( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __RAISE_2 ) + } + +public: + + /*! + * Raises (exponentiation operator) a subset of pixel samples in this image + * to samples from the specified source \a image. Returns a reference to + * this image. + * + * This member function is a generalized wrapper for GenericImage::Raise() + */ + ImageVariant& Raise( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __RAISE_1 ) + return *this; + } + +#undef __RAISE_1 +#undef __RAISE_2 + + /*! + * A synonym for Raise(). + */ + ImageVariant& Pow( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Raise( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __RAISED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Raised( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * raises it to a \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for GenericImage::Raised() + */ + template + ImageVariant Raised( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __RAISED ) + return result; + } + +#undef __RAISED + + // ------------------------------------------------------------------------- + +#define __READ( I ) \ + static_cast( **this ).Read( file ) + + /*! + * Reads an image from a raw-storage stream. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for GenericImage::Read() + */ + ImageVariant& Read( File& file ) + { + if ( *this ) + SOLVE_TEMPLATE( __READ ) + return *this; + } + +#undef __READ + + // ------------------------------------------------------------------------- + +#define __READ( I ) \ + static_cast( **this ).Read( filePath ) + + /*! + * Reads an image from a raw-storage file. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for GenericImage::Read() + */ + ImageVariant& Read( const String& filePath ) + { + if ( *this ) + SOLVE_TEMPLATE( __READ ) + return *this; + } + +#undef __READ + + // ------------------------------------------------------------------------- + +#define __RESCALE( I ) \ + static_cast( **this ).Rescale( lowerBound, upperBound, rect, firstChannel, lastChannel ) + + /*! + * Rescales a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Rescale() + */ + template + ImageVariant& Rescale( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __RESCALE ) + return *this; + } + +#undef __RESCALE + + // ------------------------------------------------------------------------- + +#define __RESCALE( I ) \ + static_cast( **this ).Rescale( rect, firstChannel, lastChannel ) + + /*! + * Rescales a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Rescale() + */ + ImageVariant& Rescale( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __RESCALE ) + return *this; + } + +#undef __RESCALE + + // ------------------------------------------------------------------------- + +#define __RESCALED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Rescaled( lowerBound, upperBound, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * rescaled to the specified range of values. + * + * This member function is a generalized wrapper for + * GenericImage::Rescaled() + */ + template + ImageVariant Rescaled( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __RESCALED ) + return result; + } + +#undef __RESCALED + + // ------------------------------------------------------------------------- + +#define __RESCALED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Rescaled( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * rescaled to the native range of the image. + * + * This member function is a generalized wrapper for + * GenericImage::Rescaled() + */ + ImageVariant Rescaled( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE_REAL( __RESCALED ) + return result; + } + +#undef __RESCALED + + // ------------------------------------------------------------------------- + +#define __SET_ABSOLUTE_DIFFERENCE( I ) \ + static_cast( **this ).SetAbsoluteDifference( scalar, rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples in this image with the absolute + * values of their differences with the specified \a scalar. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetAbsoluteDifference() + */ + template + ImageVariant& SetAbsoluteDifference( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SET_ABSOLUTE_DIFFERENCE ) + return *this; + } + +#undef __SET_ABSOLUTE_DIFFERENCE + + /*! + * A synonym for SetAbsoluteDifference(). + */ + template + ImageVariant& Dif( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteDifference( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SET_ABSOLUTE_DIFFERENCE_1( I ) \ + ImageVariant::SetAbsoluteDifference( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __SET_ABSOLUTE_DIFFERENCE_2( I ) \ + image1.SetAbsoluteDifference( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void SetAbsoluteDifference( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __SET_ABSOLUTE_DIFFERENCE_2 ) + } + +public: + + /*! + * Replaces a subset of pixel samples in this image with the absolute values + * of their differences with samples from the specified source \a image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetAbsoluteDifference() + */ + ImageVariant& SetAbsoluteDifference( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __SET_ABSOLUTE_DIFFERENCE_1 ) + return *this; + } + +#undef __SET_ABSOLUTE_DIFFERENCE_1 +#undef __SET_ABSOLUTE_DIFFERENCE_2 + + ImageVariant& Dif( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteDifference( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SET_ABSOLUTE_VALUE( I ) \ + static_cast( **this ).SetAbsoluteValue( rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples with their absolute values. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetAbsoluteValue() + */ + ImageVariant& SetAbsoluteValue( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SET_ABSOLUTE_VALUE ) + return *this; + } + + ImageVariant& Abs( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetAbsoluteValue( rect, firstChannel, lastChannel ); + } + +#undef __SET_ABSOLUTE_VALUE + + // ------------------------------------------------------------------------- + +#define __SET_COLOR_SPACE( I ) \ + static_cast( **this ).SetColorSpace( colorSpace, maxProcessors ) + + /*! + * Converts the image to the specified color space. Returns a reference to + * this object. + * + * This member function is a generalized wrapper for + * GenericImage::SetColorSpace() + */ + ImageVariant& SetColorSpace( color_space colorSpace, int maxProcessors = 0 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SET_COLOR_SPACE ) + return *this; + } + +#undef __SET_COLOR_SPACE + + // ------------------------------------------------------------------------- + +#define __SET_COLUMN( I ) \ + static_cast( **this ).SetColumn( buffer, x, channel ) + + /*! + * Sets a column of pixel samples from values in the specified array, with + * implicit data type conversion. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetColumn() + */ + template + ImageVariant& SetColumn( const T* buffer, int x, int channel = -1 ) + { + PCL_PRECONDITION( buffer != 0 ) + if ( *this ) + SOLVE_TEMPLATE( __SET_COLUMN ) + return *this; + } + +#undef __SET_COLUMN + + // ------------------------------------------------------------------------- + +#define __SET_LIGHTNESS_1( I ) \ + ImageVariant::SetLightness( static_cast( **this ), L, point, rect, maxProcessors ) + +#define __SET_LIGHTNESS_2( I ) \ + image.SetLightness( static_cast( *L ), point, rect, maxProcessors ) + +private: + + template static + void SetLightness( GenericImage

& image, const ImageVariant& L, + const Point& point, const Rect& rect, int maxProcessors ) + { + if ( !L.IsComplexSample() ) + SOLVE_TEMPLATE_REAL_2( L, __SET_LIGHTNESS_2 ) + } + +public: + + /*! + * Replaces the CIE L* component of a subset of pixel samples with data + * extracted from another image. + * + * This member function is a generalized wrapper for + * GenericImage::SetLightness() + */ + ImageVariant& SetLightness( const ImageVariant& L, + const Point& point = Point( int_max ), + const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) + { + if ( *this ) + if ( !IsComplexSample() ) + if ( L ) + SOLVE_TEMPLATE_REAL( __SET_LIGHTNESS_1 ) + return *this; + } + +#undef __SET_LIGHTNESS_1 +#undef __SET_LIGHTNESS_2 + + // ------------------------------------------------------------------------- + +#define __SET_LUMINANCE_1( I ) \ + ImageVariant::SetLuminance( static_cast( **this ), Y, point, rect, maxProcessors ) + +#define __SET_LUMINANCE_2( I ) \ + image.SetLuminance( static_cast( *Y ), point, rect, maxProcessors ) + +private: + + template static + void SetLuminance( GenericImage

& image, const ImageVariant& Y, + const Point& point, const Rect& rect, int maxProcessors ) + { + if ( !Y.IsComplexSample() ) + SOLVE_TEMPLATE_REAL_2( Y, __SET_LUMINANCE_2 ) + } + +public: + + /*! + * Replaces the CIE Y component of a subset of pixel samples with data + * extracted from another image. + * + * This member function is a generalized wrapper for + * GenericImage::SetLuminance() + */ + ImageVariant& SetLuminance( const ImageVariant& Y, + const Point& point = Point( int_max ), + const Rect& rect = Rect( 0 ), int maxProcessors = 0 ) + { + if ( *this ) + if ( !IsComplexSample() ) + if ( Y ) + SOLVE_TEMPLATE_REAL( __SET_LUMINANCE_1 ) + return *this; + } + +#undef __SET_LUMINANCE_1 +#undef __SET_LUMINANCE_2 + + // ------------------------------------------------------------------------- + +#define __SET_MAXIMUM( I ) \ + static_cast( **this ).SetMaximum( scalar, rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples in this image with the maximum of each + * sample and the specified \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetMaximum() + */ + template + ImageVariant& SetMaximum( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SET_MAXIMUM ) + return *this; + } + +#undef __SET_MAXIMUM + + /*! + * A synonym for SetMaximum(). + */ + template + ImageVariant& Max( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMaximum( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SET_MAXIMUM_1( I ) \ + ImageVariant::SetMaximum( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __SET_MAXIMUM_2( I ) \ + image1.SetMaximum( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void SetMaximum( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __SET_MAXIMUM_2 ) + } + +public: + + /*! + * Replaces a subset of pixel samples in this image with the maximum of each + * target sample and the corresponding source sample of the specified + * \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetMaximum() + */ + ImageVariant& SetMaximum( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __SET_MAXIMUM_1 ) + return *this; + } + +#undef __SET_MAXIMUM_1 +#undef __SET_MAXIMUM_2 + + /*! + * A synonym for SetMaximum(). + */ + ImageVariant& Max( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMaximum( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SET_MINIMUM( I ) \ + static_cast( **this ).SetMinimum( scalar, rect, firstChannel, lastChannel ) + + /*! + * Replaces a subset of pixel samples in this image with the minimum of each + * sample and the specified \a scalar. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetMinimum() + */ + template + ImageVariant& SetMinimum( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SET_MINIMUM ) + return *this; + } + +#undef __SET_MINIMUM + + /*! + * A synonym for SetMinimum(). + */ + template + ImageVariant& Min( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMinimum( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SET_MINIMUM_1( I ) \ + ImageVariant::SetMinimum( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __SET_MINIMUM_2( I ) \ + image1.SetMinimum( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void SetMinimum( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __SET_MINIMUM_2 ) + } + +public: + + /*! + * Replaces a subset of pixel samples in this image with the minimum of each + * target sample and the corresponding source sample of the specified + * \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetMinimum() + */ + ImageVariant& SetMinimum( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __SET_MINIMUM_1 ) + return *this; + } + +#undef __SET_MINIMUM_1 +#undef __SET_MINIMUM_2 + + /*! + * A synonym for SetMinimum(). + */ + ImageVariant& Min( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return SetMinimum( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __Sn( I ) \ + result = static_cast( **this ).Sn( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the Sn scale estimator of Rousseeuw and Croux for a subset of + * pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Sn() + */ + double Sn( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = false; + if ( *this ) + SOLVE_TEMPLATE( __Sn ) + return result; + } + +#undef __Sn + + // ------------------------------------------------------------------------- + +#define __SET_ROW( I ) \ + static_cast( **this ).SetRow( buffer, y, channel ) + + /*! + * Sets a row of pixel samples from values in the specified array, with + * implicit data type conversion. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::SetRow() + */ + template + ImageVariant& SetRow( const T* buffer, int y, int channel = -1 ) + { + PCL_PRECONDITION( buffer != 0 ) + if ( *this ) + SOLVE_TEMPLATE( __SET_ROW ) + return *this; + } + +#undef __SET_ROW + + // ------------------------------------------------------------------------- + +#define __ENSURE_UNIQUE_IMAGE( I ) \ + static_cast( **this ).EnsureUnique() + + /*! + * Ensures that the image transported by this %ImageVariant object uniquely + * references its pixel data, making a unique copy of its referenced pixel + * data if necessary. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::EnsureUnique() + */ + ImageVariant& EnsureUniqueImage() + { + if ( *this ) + SOLVE_TEMPLATE( __ENSURE_UNIQUE_IMAGE ) + return *this; + } + +#undef __ENSURE_UNIQUE_IMAGE + + // ------------------------------------------------------------------------- + +#define __ENSURE_LOCAL_IMAGE( I ) \ + static_cast( **this ).EnsureLocal() + + /*! + * Ensures that the image transported by this %ImageVariant object uses + * local pixel data storage. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::EnsureLocal() + */ + ImageVariant& EnsureLocalImage() + { + if ( *this ) + SOLVE_TEMPLATE( __ENSURE_LOCAL_IMAGE ) + return *this; + } + +#undef __ENSURE_LOCAL_IMAGE + + // ------------------------------------------------------------------------- + +#define __SHIFT( I ) \ + static_cast( **this ).Shift( fillValues ) + + /*! + * Shifts (translates) the image to its current anchor point selection. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Shift() + */ + template + ImageVariant& Shift( const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT ) + return *this; + } + +#undef __SHIFT + + // ------------------------------------------------------------------------- + +#define __SHIFT( I ) \ + static_cast( **this ).Shift() + + /*! + * Shifts (translates) the image to its current anchor point selection, + * filling extended regions with the minimum sample value in the native + * range of the image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Shift() + */ + ImageVariant& Shift() + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT ) + return *this; + } + +#undef __SHIFT + + // ------------------------------------------------------------------------- + +#define __SHIFT_BY( I ) \ + static_cast( **this ).ShiftBy( dx, dy, fillValues ) + + /*! + * Shifts (translates) this image by the specified increments in pixels. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftBy() + */ + template + ImageVariant& ShiftBy( int dx, int dy, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_BY ) + return *this; + } + +#undef __SHIFT_BY + + // ------------------------------------------------------------------------- + +#define __SHIFT_BY( I ) \ + static_cast( **this ).ShiftBy( dx, dy ) + + /*! + * Shifts (translates) this image by the specified increments in pixels, + * filling extended regions with the minimum sample value in the native + * range of the image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftBy() + */ + ImageVariant& ShiftBy( int dx, int dy ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_BY ) + return *this; + } + +#undef __SHIFT_BY + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO( I ) \ + static_cast( **this ).ShiftTo( x, y, fillValues ) + + /*! + * Shifts (translates) the image to the specified coordinates. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftTo() + */ + template + ImageVariant& ShiftTo( int x, int y, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO ) + return *this; + } + +#undef __SHIFT_TO + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO( I ) \ + static_cast( **this ).ShiftTo( x, y ) + + /*! + * Shifts (translates) the image to the specified coordinates, filling + * extended regions with the minimum sample value in the native range of the + * image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftTo() + */ + ImageVariant& ShiftTo( int x, int y ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO ) + return *this; + } + +#undef __SHIFT_TO + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO( I ) \ + static_cast( **this ).ShiftTo( p, fillValues ) + + /*! + * Shifts (translates) the image to the specified coordinates. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftTo() + */ + template + ImageVariant& ShiftTo( const Point& p, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO ) + return *this; + } + +#undef __SHIFT_TO + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO( I ) \ + static_cast( **this ).ShiftTo( p ) + + /*! + * Shifts (translates) the image to the specified coordinates, filling + * extended regions with the minimum sample value in the native range of the + * image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::ShiftTo() + */ + ImageVariant& ShiftTo( const Point& p ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO ) + return *this; + } + +#undef __SHIFT_TO + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_LEFT( I ) \ + static_cast( **this ).ShiftToBottomLeft( width, height, fillValues ) + + /*! + * Extends or crops the image at its right and top sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToBottomLeft() + */ + template + ImageVariant& ShiftToBottomLeft( int width, int height, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_LEFT ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_LEFT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_LEFT( I ) \ + static_cast( **this ).ShiftToBottomLeft( width, height ) + + /*! + * Extends or crops the image at its right and top sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToBottomLeft() + */ + ImageVariant& ShiftToBottomLeft( int width, int height ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_LEFT ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_LEFT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_RIGHT( I ) \ + static_cast( **this ).ShiftToBottomRight( width, height, fillValues ) + + /*! + * Extends or crops the image at its left and top sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToBottomRight() + */ + template + ImageVariant& ShiftToBottomRight( int width, int height, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_RIGHT ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_RIGHT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_RIGHT( I ) \ + static_cast( **this ).ShiftToBottomRight( width, height ) + + /*! + * Extends or crops the image at its left and top sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToBottomRight() + */ + ImageVariant& ShiftToBottomRight( int width, int height ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_RIGHT ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_RIGHT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_CENTER( I ) \ + static_cast( **this ).ShiftToCenter( width, height, fillValues ) + + /*! + * Extends or crops the image centered within the specified \a width and + * \a height in pixels. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToCenter() + */ + template + ImageVariant& ShiftToCenter( int width, int height, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_CENTER ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_CENTER + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_BOTTOM_CENTER( I ) \ + static_cast( **this ).ShiftToCenter( width, height ) + + /*! + * Extends or crops the image centered within the specified \a width and + * \a height in pixels, filling extended regions with the minimum sample + * value in the native range of the image. Returns a reference to this + * image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToCenter() + */ + ImageVariant& ShiftToCenter( int width, int height ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_BOTTOM_CENTER ) + return *this; + } + +#undef __SHIFT_TO_BOTTOM_CENTER + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_TOP_LEFT( I ) \ + static_cast( **this ).ShiftToTopLeft( width, height, fillValues ) + + /*! + * Extends or crops the image at its right and bottom sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToTopLeft() + */ + template + ImageVariant& ShiftToTopLeft( int width, int height, const GenericVector& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_TOP_LEFT ) + return *this; + } + +#undef __SHIFT_TO_TOP_LEFT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_TOP_LEFT( I ) \ + static_cast( **this ).ShiftToTopLeft( width, height ) + + /*! + * Extends or crops the image at its right and bottom sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToTopLeft() + */ + ImageVariant& ShiftToTopLeft( int width, int height ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_TOP_LEFT ) + return *this; + } + +#undef __SHIFT_TO_TOP_LEFT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_TOP_RIGHT( I ) \ + static_cast( **this ).ShiftToTopRight( width, height, fillValues ) + + /*! + * Extends or crops the image at its left and bottom sides to the specified + * \a width and \a height in pixels. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToTopRight() + */ + template + ImageVariant& ShiftToTopRight( int width, int height, const GenericVector< T >& fillValues ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_TOP_RIGHT ) + return *this; + } + +#undef __SHIFT_TO_TOP_RIGHT + + // ------------------------------------------------------------------------- + +#define __SHIFT_TO_TOP_RIGHT( I ) \ + static_cast( **this ).ShiftToTopRight( width, height ) + + /*! + * Extends or crops the image at its left and bottom sides to the specified + * \a width and \a height in pixels, filling extended regions with the + * minimum sample value in the native range of the image. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::ShiftToTopRight() + */ + ImageVariant& ShiftToTopRight( int width, int height ) + { + if ( *this ) + SOLVE_TEMPLATE( __SHIFT_TO_TOP_RIGHT ) + return *this; + } + +#undef __SHIFT_TO_TOP_RIGHT + + // ------------------------------------------------------------------------- + +#define __STD_DEV( I ) \ + result = static_cast( **this ).StdDev( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the standard deviation of a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::StdDev() + */ + double StdDev( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __STD_DEV ) + return result; + } + +#undef __STD_DEV + + // ------------------------------------------------------------------------- + +#define __SUBTRACT( I ) \ + static_cast( **this ).Subtract( scalar, rect, firstChannel, lastChannel ) + + /*! + * Subtracts the specified \a scalar from a subset of pixel samples in this + * image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Subtract() + */ + template + ImageVariant& Subtract( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE( __SUBTRACT ) + return *this; + } + +#undef __SUBTRACT + + /*! + * A synonym for Subtract(). + */ + template + ImageVariant& Sub( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Subtract( scalar, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SUBTRACT_1( I ) \ + ImageVariant::Subtract( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __SUBTRACT_2( I ) \ + image1.Subtract( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Subtract( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_2( image2, __SUBTRACT_2 ) + } + +public: + + /*! + * Subtracts pixel samples of the specified \a image from a subset of pixel + * samples in this image. Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Subtract() + */ + ImageVariant& Subtract( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __SUBTRACT_1 ) + return *this; + } + +#undef __SUBTRACT_1 +#undef __SUBTRACT_2 + + /*! + * A synonym for Subtract(). + */ + ImageVariant& Sub( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + return Subtract( image, point, channel, rect, firstChannel, lastChannel ); + } + + // ------------------------------------------------------------------------- + +#define __SUBTRACTED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Subtracted( scalar, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Creates a local image with a subset of pixel samples from this image, and + * subtracts a \a scalar. Returns the resulting image. + * + * This member function is a generalized wrapper for + * GenericImage::Subtracted() + */ + template + ImageVariant Subtracted( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __SUBTRACTED ) + return result; + } + +#undef __SUBTRACTED + + // ------------------------------------------------------------------------- + +#define __SUM_OF_SQUARES( I ) \ + result = static_cast( **this ).SumOfSquares( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the sum of the squares of a subset of pixel samples. + * + * This member function is a generalized wrapper for + * GenericImage::SumOfSquares() + */ + double SumOfSquares( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, + int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __SUM_OF_SQUARES ) + return result; + } + +#undef __SUM_OF_SQUARES + + // ------------------------------------------------------------------------- + +#define __TRANSFER_IMAGE_1( I ) \ + ImageVariant::TransferImage( static_cast( **this ), image ) + +#define __TRANSFER_IMAGE_2( I ) \ + image1.Transfer( static_cast( *image2 ) ) + +private: + + template static + void TransferImage( GenericImage

& image1, ImageVariant& image2 ) + { + SOLVE_TEMPLATE_2( image2, __TRANSFER_IMAGE_2 ) + } + +public: + + /*! + * Transfers pixel data to this image from another \a image, which is an + * instance of a different template instantiation of %GenericImage. Returns + * a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Transfer() + */ + ImageVariant& TransferImage( ImageVariant& image ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE( __TRANSFER_IMAGE_1 ) + return *this; + } + +#undef __TRANSFER_IMAGE_1 +#undef __TRANSFER_IMAGE_2 + + // ------------------------------------------------------------------------- + +#define __TRANSFORM( I ) \ + static_cast( **this ).Transform( transform, rect, firstChannel, lastChannel ) + + /*! + * Applies a \e direct image transformation to a subset of pixel samples. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Transform() + */ + void Transform( BidirectionalImageTransformation& transform, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + if ( *this ) + SOLVE_TEMPLATE( __TRANSFORM ) + } + +#undef __TRANSFORM + + // ------------------------------------------------------------------------- + +#define __TRUNCATE( I ) \ + static_cast( **this ).Truncate( lowerBound, upperBound, rect, firstChannel, lastChannel ) + + /*! + * Truncates a subset of pixel samples to the specified range of values. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Truncate() + */ + template + ImageVariant& Truncate( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __TRUNCATE ) + return *this; + } + +#undef __TRUNCATE + + // ------------------------------------------------------------------------- + +#define __TRUNCATE( I ) \ + static_cast( **this ).Truncate( rect, firstChannel, lastChannel ) + + /*! + * Truncates a subset of pixel samples to the native range of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for + * GenericImage::Truncate() + */ + ImageVariant& Truncate( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __TRUNCATE ) + return *this; + } + +#undef __TRUNCATE + + // ------------------------------------------------------------------------- + +#define __TRUNCATED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Truncated( lowerBound, upperBound, rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * truncated to the specified range of values. + * + * This member function is a generalized wrapper for + * GenericImage::Truncated() + */ + template + ImageVariant Truncated( T lowerBound, T upperBound, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __TRUNCATED ) + return result; + } + +#undef __TRUNCATED + + // ------------------------------------------------------------------------- + +#define __TRUNCATED( I ) \ + result.SetImage( *new pcl::I( static_cast( **this ).Truncated( rect, firstChannel, lastChannel ) ) ); \ + result.SetOwnership( true ) + + /*! + * Returns a local image with a subset of pixel samples from this image, + * truncated to the native range of the image. + * + * This member function is a generalized wrapper for + * GenericImage::Truncated() + */ + ImageVariant Truncated( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + ImageVariant result; + if ( *this ) + SOLVE_TEMPLATE( __TRUNCATED ) + return result; + } + +#undef __TRUNCATED + + // ------------------------------------------------------------------------- + +#define __VARIANCE( I ) \ + result = static_cast( **this ).Variance( rect, firstChannel, lastChannel, maxProcessors ) + + /*! + * Returns the variance from the mean of a subset of pixel samples. + * + * This member function is a generalized wrapper for GenericImage::Variance() + */ + double Variance( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1, int maxProcessors = 0 ) const + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __VARIANCE ) + return result; + } + +#undef __VARIANCE + + // ------------------------------------------------------------------------- + +#define __WHITE( I ) \ + static_cast( **this ).White( rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples with the maximum sample value in the + * native range of the image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::White() + */ + ImageVariant& White( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __WHITE ) + return *this; + } + +#undef __WHITE + + // ------------------------------------------------------------------------- + +#define __WRITE( I ) \ + static_cast( **this ).Write( file, rect, firstChannel, lastChannel ) + + /*! + * Writes a subset of pixel samples to a raw-storage output stream. Returns + * a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Write() + */ + ImageVariant& Write( File& file, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + if ( *this ) + SOLVE_TEMPLATE( __WRITE ) + return const_cast( *this ); + } + +#undef __WRITE + + // ------------------------------------------------------------------------- + +#define __WRITE( I ) \ + static_cast( **this ).Write( filePath, rect, firstChannel, lastChannel ) + + /*! + * Writes a subset of pixel samples to a raw-storage output stream. Returns + * a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Write() + */ + ImageVariant& Write( const String& filePath, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) const + { + if ( *this ) + SOLVE_TEMPLATE( __WRITE ) + return const_cast( *this ); + } + +#undef __WRITE + + // ------------------------------------------------------------------------- + +#define __XNOR( I ) \ + static_cast( **this ).Xnor( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise XNOR (exclusive NOR) operation between a subset of + * pixel samples in this image and the specified \a scalar. Returns a + * reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Xnor() + */ + template + ImageVariant& Xnor( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __XNOR ) + return *this; + } + +#undef __XNOR + + // ------------------------------------------------------------------------- + +#define __XNOR_1( I ) \ + ImageVariant::Xnor( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __XNOR_2( I ) \ + image1.Xnor( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Xnor( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __XNOR_2 ) + } + +public: + + /*! + * Performs a bitwise XNOR (NOT exclusive OR) operation between a subset of + * pixel samples in this image and the corresponding samples of the + * specified source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Xnor() + */ + ImageVariant& Xnor( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __XNOR_1 ) + return *this; + } + +#undef __XNOR_1 +#undef __XNOR_2 + + // ------------------------------------------------------------------------- + +#define __XOR( I ) \ + static_cast( **this ).Xor( scalar, rect, firstChannel, lastChannel ) + + /*! + * Performs a bitwise XOR (exclusive OR) operation between a subset of pixel + * samples in this image and the specified \a scalar. Returns a reference to + * this image. + * + * This member function is a generalized wrapper for GenericImage::Xor() + */ + template + ImageVariant& Xor( T scalar, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __XOR ) + return *this; + } + +#undef __XOR + + // ------------------------------------------------------------------------- + +#define __XOR_1( I ) \ + ImageVariant::Xor( static_cast( **this ), image, point, channel, rect, firstChannel, lastChannel ) + +#define __XOR_2( I ) \ + image1.Xor( static_cast( *image2 ), point, channel, rect, firstChannel, lastChannel ) + +private: + + template static + void Xor( GenericImage

& image1, const ImageVariant& image2, + const Point& point, int channel, + const Rect& rect, int firstChannel, int lastChannel ) + { + SOLVE_TEMPLATE_REAL_2( image2, __XOR_2 ) + } + +public: + + /*! + * Performs a bitwise XOR (exclusive OR) operation between a subset of pixel + * samples in this image and the corresponding samples of the specified + * source \a image. Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Xor() + */ + ImageVariant& Xor( const ImageVariant& image, + const Point& point = Point( int_max ), int channel = -1, + const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + if ( image ) + SOLVE_TEMPLATE_REAL( __XOR_1 ) + return *this; + } + +#undef __XOR_1 +#undef __XOR_2 + + // ------------------------------------------------------------------------- + +#define __ZERO( I ) \ + static_cast( **this ).Zero( rect, firstChannel, lastChannel ) + + /*! + * Fills a subset of pixel samples with the constant value resulting from + * converting the scalar zero (0) to the sample data type of the image. + * Returns a reference to this image. + * + * This member function is a generalized wrapper for GenericImage::Zero() + */ + ImageVariant& Zero( const Rect& rect = Rect( 0 ), int firstChannel = -1, int lastChannel = -1 ) + { + if ( *this ) + SOLVE_TEMPLATE_REAL( __ZERO ) + return *this; + } + +#undef __ZERO + + // ------------------------------------------------------------------------- + +#define __COMPRESS( I ) \ + return static_cast( **this ).Compress( compressor, rect, channel, perf ) + + /*! + * Compression of pixel samples from the image transported by an + * %ImageVariant. Returns a list of compressed sub-blocks. + * + * If this %ImageVariant object does not transport an image, this function + * returns an empty array. + * + * This member function is a generalized wrapper for + * GenericImage::Compress(). + */ + Compression::subblock_list Compress( const Compression& compressor, + const Rect& rect = Rect( 0 ), int channel = -1, + Compression::Performance* perf = nullptr ) const + { + if ( *this ) + SOLVE_TEMPLATE( __COMPRESS ) + return Compression::subblock_list(); + } + +#undef __COMPRESS + + // ------------------------------------------------------------------------- + + /*! + * Returns true iff this %ImageVariant object transports an image that is an + * instance of the same template instantiation of the specified image. + */ + template + bool IsAs( const pcl::GenericImage

& ) const + { + return m_data->image && m_data->isFloatSample == P::IsFloatSample() && + m_data->isComplexSample == P::IsComplexSample() && + m_data->bitsPerSample == P::BitsPerSample(); + } + + /*! + * Assigns another instance of %ImageVariant to this object. Returns a + * reference to this object. + * + * If the previously transported image (if any) was owned by %ImageVariant, + * and there are no more ImageVariant references to it, then it is destroyed + * before assignment. + */ + ImageVariant& Assign( const ImageVariant& image ) + { + image.m_data->Attach(); + DetachFromData(); + m_data = image.m_data; + return *this; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * This operator calls Assign() with the specified source \a image. + */ + ImageVariant& operator =( const ImageVariant& image ) + { + return Assign( image ); + } + +#define TRANSFER_BODY() \ + if ( &image != this ) /* N.B.: Self-movement incompatible with server-side SharedImage */ \ + { \ + DetachFromData(); \ + m_data = image.m_data; \ + image.m_data = nullptr; \ + } \ + return *this + + /*! + * Transfers the image transported by other %ImageVariant to this object. + * Returns a reference to this object. + * + * If the previously transported image (if any) was owned by %ImageVariant, + * and there are no more ImageVariant references to it, then it is destroyed + * before assignment. + * + * After calling this function, the specified source \a image is left in an + * invalid state and should be destroyed immediately. + */ + ImageVariant& Transfer( ImageVariant& image ) + { + TRANSFER_BODY(); + } + + /*! + * Transfers the image transported by other %ImageVariant to this object. + * Returns a reference to this object. + * + * If the previously transported image (if any) was owned by %ImageVariant, + * and there are no more ImageVariant references to it, then it is destroyed + * before assignment. + * + * After calling this function, the specified source \a image is left in an + * invalid state and should be destroyed immediately. + */ + ImageVariant& Transfer( ImageVariant&& image ) + { + TRANSFER_BODY(); + } + +#undef TRANSFER_BODY + + /*! + * Move assignment operator. Returns a reference to this object. + * + * This operator calls Transfer() with the specified source \a image. + */ + ImageVariant& operator =( ImageVariant&& image ) + { + return Transfer( image ); + } + + /*! + * Releases the image transported by this object and forces another + * %ImageVariant instance to transport it. + * + * Unlike move assignment (or, equivalently, the Transfer() member + * function), this object will be in a valid empty state after calling this + * function. + */ + void ReleaseTo( ImageVariant& image ) + { + if ( &image != this ) // N.B.: Self-release incompatible with server-side SharedImage. + { + Data* newData = new Data; + image.DetachFromData(); + image.m_data = m_data; + m_data = newData; + } + } + + /*! + * Forces this instance of %ImageVariant to transport the specified image. + * Returns a reference to this object. + * + * If the previously transported image (if any) was owned by %ImageVariant, + * and there are no more %ImageVariant references to it, then it is + * destroyed before referencing the specified image. + */ + template + ImageVariant& SetImage( GenericImage

& image ) + { + if ( &image != m_data->image ) + { + Free(); + m_data->Update( &image ); + } + return *this; + } + + /*! + * Exchanges two %ImageVariant instances \a x1 and \a x2. + */ + friend void Swap( ImageVariant& x1, ImageVariant& x2 ) noexcept + { + pcl::Swap( x1.m_data, x2.m_data ); + } + + /*! + * Creates a new image with the specified sample data type. Returns a + * reference to this object. + * + * \param isFloat If true, floating-point real samples will be used. + * + * \param isComplex If true, complex pixel samples (implicitly + * floating-point) will be used. + * + * \param bitSize Number of bits per sample. The supported combinations + * are:\n + * \n + * \li For floating-point samples (real or complex): 32 or 64.\n + * \li For integer samples: 8, 16 or 32. + * + * If the previously transported image (if any) was owned by %ImageVariant, + * and there are no more %ImageVariant references to it, then it is + * destroyed before creating the new image. + * + * The newly created image will be empty. To allocate pixel data, you must + * call GenericImage::AllocateData() explicitly. + * + * The newly created image will be owned by %ImageVariant. + */ + ImageVariant& CreateImage( bool isFloat, bool isComplex, int bitSize ) + { + if ( isFloat ) + { + if ( isComplex ) + CreateComplexImage( bitSize ); + else + CreateFloatImage( bitSize ); + } + else + { + if ( !isComplex ) + CreateUIntImage( bitSize ); + /* + else + { + ### Yeah this is true, but everybody already knows so we don't want + to replicate this useless message everywhere! + throw Error( "Integer-valued complex images not supported by this PCL version." ); + } + */ + } + + return *this; + } + +#define CREATE_IMAGE( I ) m_data->Update( new pcl::I ) + + /*! + * Creates a new floating point real image with the specified sample size + * in bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly created real image. + * Valid argument values are 32 and 64. The default value + * is 32. + * + * This function is a convenience shortcut for: + * + * \code CreateImage( true, false, bitSize ); \endcode + */ + ImageVariant& CreateFloatImage( int bitSize = 32 ) + { + PCL_PRECONDITION( bitSize == 32 || bitSize == 64 ) + Free(); + switch ( bitSize ) + { + case 32: CREATE_IMAGE( Image ); break; + case 64: CREATE_IMAGE( DImage ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + + /*! + * Creates a new 32-bit floating point real image. Returns a reference to + * this object. + * + * This function is a convenience shortcut for: + * + * \code CreateFloatImage(); \endcode + */ + ImageVariant& CreateImage() + { + return CreateFloatImage(); + } + + /*! + * Creates a new floating point complex image with the specified sample + * size in bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly created complex + * image. Valid argument values are 32 and 64. + * + * This function is a convenience shortcut for: + * + * \code CreateImage( true, true, bitSize ); \endcode + */ + ImageVariant& CreateComplexImage( int bitSize = 32 ) + { + PCL_PRECONDITION( bitSize == 32 || bitSize == 64 ) + Free(); + switch ( bitSize ) + { + case 32: CREATE_IMAGE( ComplexImage ); break; + case 64: CREATE_IMAGE( DComplexImage ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + + /*! + * Creates a new unsigned integer image with the specified sample size in + * bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly integer image. Valid + * argument values are 8, 16 and 32. + * + * This function is a convenience shortcut for: + * + * \code CreateImage( false, false, bitSize ); \endcode + */ + ImageVariant& CreateUIntImage( int bitSize = 16 ) + { + PCL_PRECONDITION( bitSize == 8 || bitSize == 16 || bitSize == 32 ) + Free(); + switch ( bitSize ) + { + case 8: CREATE_IMAGE( UInt8Image ); break; + case 16: CREATE_IMAGE( UInt16Image ); break; + case 32: CREATE_IMAGE( UInt32Image ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + +#undef CREATE_IMAGE + + /*! + * Creates a new image with the same sample data type (template + * instantiation) as the specified image. Returns a reference to this + * object. + * + * \param image %Image to obtain sample data type parameters from. + * + * This function is a convenience shortcut for: + * + * \code + * CreateImage( P::IsFloatSample(), P::IsComplexSample(), P::BitsPerSample() ); + * \endcode + */ + template + ImageVariant& CreateImageAs( const pcl::GenericImage

& image ) + { + return CreateImage( P::IsFloatSample(), P::IsComplexSample(), P::BitsPerSample() ); + } + + /*! + * Creates a new image with the same sample data type (template + * instantiation) as the specified %ImageVariant object. Returns a reference + * to this object. + * + * \param image %ImageVariant to obtain sample data type parameters from. + * + * This function is a convenience shortcut for: + * + * \code + * CreateImage( image.IsFloatSample(), image.IsComplexSample(), image.BitsPerSample() ); + * \endcode + */ + ImageVariant& CreateImageAs( const ImageVariant& image ) + { + return CreateImage( image.IsFloatSample(), image.IsComplexSample(), image.BitsPerSample() ); + } + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + + /*! + * Creates a new shared image with the specified sample data type. Returns a + * reference to this object. + * + * \param isFloat If true, floating-point real pixels will be used. + * + * \param isComplex If true, complex pixels ( implicitly floating point ) + * will be used. + * + * \param bitSize Number of bits per sample. The supported combinations + * are:\n + * \n + * \li For floating-point samples ( real or complex ): 32 or 64.\n + * \li For integer samples: 8, 16 or 32. + * + * This member function works in an equivalent way to: + * + * \code CreateImage( bool isFloat, bool isComplex, int bitSize ); \endcode + * + * except that this function creates a shared image, while + * CreateImage() creates a local image. A shared image is an alias + * to an image that lives in the PixInsight core application, while a local + * image is a private object in the local heap of the calling module. + * + * Shared images are particularly useful for processes involving + * intermodule communication in the PixInsight platform. An example + * is the FileFormatInstance class, which can be used to perform file I/O + * operations by invoking any installed file format support module on the + * platform. %FileFormatInstance requires shared images to read/write images + * from/to disk files (you can actually pass a local image to + * %FileFormatInstance, but then PCL will generate and use a temporary + * \e shared working image on the fly, wasting memory unnecessarily). + */ + ImageVariant& CreateSharedImage( bool isFloat, bool isComplex, int bitSize ) + { + if ( isFloat ) + { + if ( isComplex ) + CreateSharedComplexImage( bitSize ); + else + CreateSharedFloatImage( bitSize ); + } + else + { + if ( !isComplex ) + CreateSharedUIntImage( bitSize ); + } + + return *this; + } + +#define CREATE_SHARED_IMAGE( I ) m_data->Update( new pcl::I( (void*)0, 0, 0 ) ) + + /*! + * Creates a new shared, floating point real image with the specified sample + * size in bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly created real image. + * Valid argument values are 32 and 64. + * + * This function is a convenience shortcut for: + * + * \code CreateSharedImage( true, false, bitSize ); \endcode + * + * For an equivalent member function that creates a local image, see + * CreateFloatImage(). + */ + ImageVariant& CreateSharedFloatImage( int bitSize = 32 ) + { + PCL_PRECONDITION( bitSize == 32 || bitSize == 64 ) + Free(); + switch ( bitSize ) + { + case 32: CREATE_SHARED_IMAGE( Image ); break; + case 64: CREATE_SHARED_IMAGE( DImage ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + + /*! + * Creates a new shared, 32-bit floating point real image. Returns a + * reference to this object. + * + * This function is a convenience shortcut for: + * + * \code CreateSharedFloatImage( 32 ); \endcode + * + * For an equivalent member function that creates a local image, see + * CreateImage(). + */ + ImageVariant& CreateSharedImage() + { + return CreateSharedFloatImage(); + } + + /*! + * Creates a new shared, floating point complex image with the specified + * sample size in bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly created complex + * image. Valid argument values are 32 and 64. + * + * This function is a convenience shortcut for: + * + * \code CreateSharedImage( true, true, bitSize ); \endcode + * + * For an equivalent member function that creates a local image, see + * CreateComplexImage(). + */ + ImageVariant& CreateSharedComplexImage( int bitSize = 32 ) + { + PCL_PRECONDITION( bitSize == 32 || bitSize == 64 ) + Free(); + switch ( bitSize ) + { + case 32: CREATE_SHARED_IMAGE( ComplexImage ); break; + case 64: CREATE_SHARED_IMAGE( DComplexImage ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + + /*! + * Creates a new shared, unsigned integer image with the specified sample + * size in bits. Returns a reference to this object. + * + * \param bitSize Sample size in bits for the newly integer image. Valid + * argument values are 8, 16 and 32. + * + * This function is a convenience shortcut for: + * + * \code CreateImage( false, false, bitSize ); \endcode + * + * For an equivalent member function that creates a local image, see + * CreateUIntImage(). + */ + ImageVariant& CreateSharedUIntImage( int bitSize = 16 ) + { + PCL_PRECONDITION( bitSize == 8 || bitSize == 16 || bitSize == 32 ) + Free(); + switch ( bitSize ) + { + case 8: CREATE_SHARED_IMAGE( UInt8Image ); break; + case 16: CREATE_SHARED_IMAGE( UInt16Image ); break; + case 32: CREATE_SHARED_IMAGE( UInt32Image ); break; + } + m_data->ownsImage = m_data->image != nullptr; + return *this; + } + +#undef CREATE_SHARED_IMAGE + + /*! + * Creates a new shared image with the same sample data type ( template + * instantiation ) as the specified image. Returns a reference to this + * object. + * + * \param image %Image to obtain sample data type parameters from. + * + * This function is a convenience shortcut for: + * + * \code + * CreateSharedImage( P::IsFloatSample(), P::IsComplexSample(), P::BitsPerSample() ); + * \endcode + * + * For an equivalent member function that creates a local image, see + * CreateImageAs( const pcl::GenericImage& ). + */ + template + ImageVariant& CreateSharedImageAs( const pcl::GenericImage

& image ) + { + return CreateSharedImage( P::IsFloatSample(), P::IsComplexSample(), P::BitsPerSample() ); + } + + /*! + * Creates a new shared image with the same sample data type ( template + * instantiation ) as the specified %ImageVariant object. Returns a + * reference to this object. + * + * \param image %ImageVariant to obtain sample data type parameters from. + * + * This function is a convenience shortcut for: + * + * \code + * CreateSharedImage( image.IsFloatSample(), image.IsComplexSample(), image.BitsPerSample() ); + * \endcode + * + * For an equivalent member function that creates a local image, see + * CreateImageAs( const ImageVariant& ). + */ + ImageVariant& CreateSharedImageAs( const ImageVariant& image ) + { + return CreateSharedImage( image.IsFloatSample(), image.IsComplexSample(), image.BitsPerSample() ); + } + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +#define ALLOCATE_IMAGE( I ) \ + static_cast( **this ).AllocateData( width, height, numberOfChannels, colorSpace ) + + /*! + * Allocates pixel data in the image transported by this %ImageVariant + * instance, with the specified geometry and color space. Returns a + * reference to this object. + * + * \param width Width of the newly created image in pixels. + * + * \param height Height of the newly created image in pixels. + * + * \param numberOfChannels Number of channels. Must be larger or equal to + * the number of nominal channels, as imposed by + * the specified color space. + * + * \param colorSpace Color space. See the ColorSpace namespace for + * symbolic constants. + * + * If this %ImageVariant object transports no image, a new one is created in + * 32-bit floating point format. %ImageVariant will own the newly created + * image in this case. + * + * This function is useful to allocate pixel data without having to resolve + * the template instantiation of the transported image. PCL allocates pixels + * of the appropriate sample data type transparently. + */ + ImageVariant& AllocateImage( int width, int height, int numberOfChannels, color_space colorSpace ) + { + if ( !*this ) + CreateImage(); + SOLVE_TEMPLATE( ALLOCATE_IMAGE ) + return *this; + } + +#undef ALLOCATE_IMAGE + +#define COPY_IMAGE( I ) static_cast( **this ).Assign( image ) + + /*! + * Assigns an image to the image transported by this %ImageVariant instance. + * Returns a reference to this object. + * + * \param image %Image to assign. + * + * The assigned image can be an instance of any supported template + * instantiation of GenericImage. If this %ImageVariant object transports no + * image, a new one is created as an instance of the same template + * instantiation as the specified source image. In this case, %ImageVariant + * will own the newly created image. + * + * This function is useful to assign an image without having to resolve the + * template instantiation of the transported image. PCL performs the + * assignment between different image types transparently. + */ + template + ImageVariant& CopyImage( const GenericImage

& image ) + { + if ( !*this ) + CreateImageAs( image ); + SOLVE_TEMPLATE( COPY_IMAGE ) + return *this; + } + +#undef COPY_IMAGE + +#define COPY_IMAGE( I ) CopyImage( static_cast( *image ) ) + + /*! + * Assigns an image transported by another %ImageVariant instance to the + * image transported by this object. Returns a reference to this object. + * + * \param image Source %ImageVariant instance whose transported image will + * be assigned. + * + * This function calls CopyImage( const I& ) after resolving the template + * instantiation of the transported image. See the documentation of that + * function for details. + */ + ImageVariant& CopyImage( const ImageVariant& image ) + { + if ( image ) + SOLVE_TEMPLATE_2( image, COPY_IMAGE ) + else + FreeImage(); + return *this; + } + +#undef COPY_IMAGE + +#define FREE_IMAGE( I ) static_cast( **this ).FreeData() + + /*! + * Destroys the existing pixel data in the image transported by this + * %ImageVariant instance. Returns a reference to this object. + * + * This function is useful to deallocate pixel data without having to + * resolve the template instantiation of the transported image. PCL + * deallocates pixel data of any supported pixel sample type transparently. + * + * If this %ImageVariant transports no image, this function has no effect. + * + * \note Unlike the Free() member function, this function cannot destroy + * the transported image, but only its pixel data. Note that this function + * destroys pixel data irrespective of whether %ImageVariant owns the + * transported image. + */ + ImageVariant& FreeImage() + { + if ( *this ) + SOLVE_TEMPLATE( FREE_IMAGE ) + return *this; + } + + /*! + * Returns a pointer to a dynamically allocated Compression object. The + * returned object implements the specified raw storage compression + * \a algorithm for compression of a contiguous sequence of elements with + * \a itemSize bytes each. + */ + static Compression* NewCompression( swap_compression algorithm, int itemSize = 1 ); + +#undef FREE_IMAGE + + /*! + * Writes the image transported by this %ImageVariant instance to a raw + * storage file. + * + * \param filePath A file path specification where the output raw + * storage file will be created. + * + * \param compression Compression algorithm. If specified, all stored + * pixel data will be compressed using this algorithm. + * Compression is disabled by default + * + * \param perf If non-null, pointer to a Compression::Performance + * structure where compression performance data will be + * provided if the raw file is compressed. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file write operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * The generated file can be employed to construct a new image instance by + * calling the ReadSwapFile() member function with the same file path + * specification. + * + * This function is useful to write pixel data without having to resolve the + * template instantiation of the transported image. PCL writes pixel data of + * any supported sample type transparently. + */ + void WriteSwapFile( const String& filePath, + swap_compression compression = SwapCompression::None, + Compression::Performance* perf = nullptr, + bool processEvents = false ) const; + + /*! + * Writes the image transported by this %ImageVariant object to a set of + * raw storage files using parallel disk write operations. + * + * \param fileName Base file name for the raw storage files. + * + * \param directories A list of directories where the set of raw files + * will be created by this function. + * + * \param compression Compression algorithm. If specified, all stored + * pixel data will be compressed using this algorithm. + * Compression is disabled by default + * + * \param perf If non-null, pointer to a Compression::Performance + * structure where compression performance data will be + * provided if the raw files are compressed. Output + * performance values are the averages of the same + * values computed for all threads. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file write operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * Each string in the \a directories string list must be a full path + * specification to an existing directory. On each directory, an output file + * will be created and an independent execution thread will write the + * corresponding section of the pixel data from the image transported by + * this %ImageVariant. To retrieve the data, call the ReadSwapFiles() member + * function with the same base file name and output directories. + * + * \warning This function is not thread-safe: it can only be called from the + * root thread. This function will throw an Error exception if it is called + * from a local thread. + */ + void WriteSwapFiles( const String& fileName, const StringList& directories, + swap_compression compression = SwapCompression::None, + Compression::Performance* perf = nullptr, + bool processEvents = false ) const; + /*! + * Reads the image transported by this %ImageVariant instance from a raw + * storage file. + * + * \param filePath A file path specification to an existing raw storage + * image file. + * + * \param perf If non-null, pointer to a Compression::Performance + * structure where compression performance data will be + * provided if the raw file is compressed. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file read operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * If necessary, the transported image is re-created as an instance of a + * different template instantiation, to match the sample data type stored + * in the input file. + * + * In any case, if %ImageVariant owned the previously transported image ( if + * any ), it is destroyed before reading the new one. + * + * This function is useful to read pixel data without having to resolve + * template instantiation, neither of the input file nor of the transported + * image. PCL does all the necessary data reading, decompression, allocation + * and deallocation transparently. + */ + void ReadSwapFile( const String& filePath, + Compression::Performance* perf = nullptr, + bool processEvents = false ); + + /*! + * Reads an image from a set of raw storage files using parallel disk read + * operations. + * + * \param fileName Base file name for the raw storage files. + * + * \param directories A list of directories where the set of raw files + * have been created by a previous call to + * WriteSwapFiles( const String&, const StringList& ). + * + * \param perf If non-null, pointer to a Compression::Performance + * structure where compression performance data will be + * provided if the raw files are compressed. Output + * performance values are the averages of the same + * values computed for all threads. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file read operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * The read image will be transported and owned by this %ImageVariant + * instance. If an image is already transported by this object before + * calling this function, it is removed by a call to Free() prior to the + * reading operation. + * + * If necessary, the transported image is re-created as an instance of a + * different template instantiation, to match the sample data type stored + * in the input file(s). + * + * \warning This function is not thread-safe: it can only be called from the + * root thread. This function will throw an Error exception if it is called + * from a local thread. + */ + void ReadSwapFiles( const String& fileName, const StringList& directories, + Compression::Performance* perf = nullptr, + bool processEvents = false ); + + /*! + * Merges the image transported by this object with pixel data read from a + * raw storage file, masking it with the image transported by another + * %ImageVariant instance. + * + * \param filePath A file path specification to an existing raw storage + * image file. + * + * \param mask A reference to an %ImageVariant instance whose + * transported image will act as a mask for the merge + * operation. + * + * \param invert If this argument is true, mask pixels will be + * inverted before carrying out the merge operation. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file read operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * Given a pixel \b V of the image transported by this instance, a pixel + * \b S read from the input file, and a pixel \b M of the mask image, the + * original pixel \b V is replaced by the result \b V' of the following + * expression: + * + *

+    * if invert
+    *    M = 1 - M
+    * V' = V*( 1 - M ) + S*M
+    * 
+ * + * in the normalized real range [0,1], where \b 1 represents a saturated + * (usually white) pixel sample value. + */ + void MaskFromSwapFile( const String& filePath, const ImageVariant& mask, bool invert = false, + bool processEvents = false ); + + /*! + * Merges the image transported by this object with pixel data read from a + * set of raw storage files through parallel disk read operations, masking + * it with the image transported by another %ImageVariant instance. + * + * \param fileName Base file name for the raw storage files from which + * source pixels will be read to be merged with this + * image. + * + * \param directories A list of directories where the set of raw files + * have been created by a previous call to + * WriteSwapFiles( const String&, const StringList& ). + * + * \param mask A reference to an %ImageVariant instance whose + * transported image will act as a mask for the merge + * operation. + * + * \param invert If this argument is true, mask pixels will be + * inverted before carrying out the merge operation. + * + * \param processEvents If true, Module->ProcessEvents() will be called at + * regular intervals during the file read operation. + * This is useful to keep the graphical interface + * responsive during long disk operations. The default + * value is false. + * + * This routine produces exactly the same result as its single-threaded + * counterpart MaskFromSwapFile(). + * + * \warning This function is not thread-safe: it can only be called from the + * root thread. This function will throw an Error exception if it is called + * from a local thread. + */ + void MaskFromSwapFiles( const String& fileName, const StringList& directories, + const ImageVariant& mask, bool invert = false, + bool processEvents = false ); + + /*! + * Deletes all raw storage files previously created by a call to the + * WriteSwapFile() member function. + */ + static void DeleteSwapFile( const String& filePath ); + + /*! + * Deletes all raw storage files previously created by a call to the + * WriteSwapFiles() member function. + * + * \warning This function is not thread-safe: it can only be called from the + * root thread. This function will throw an Error exception if it is called + * from a local thread. + */ + static void DeleteSwapFiles( const String& fileName, const StringList& directories ); + + /*! + * Returns the total size in bytes occupied by a raw storage image file. + * + * \param filePath A file path specification to an existing raw storage + * image file. + * + * This function does not read any pixel data. All the required data to + * compute the returned file size is retrieved from existing file headers. + */ + static uint64 SwapFileSize( const String& filePath ); + + /*! + * Returns the total size in bytes occupied by a set of raw storage files. + * + * \param fileName Base file name for the raw storage files. + * + * \param directories A list of directories where the set of raw files + * have been created by a previous call to + * WriteSwapFiles( const String&, const StringList& ). + * + * This function does not read any pixel data. All the required data to + * compute the returned file size is retrieved from existing file headers. + */ + static uint64 SwapFilesSize( const String& fileName, const StringList& directories ); + + /*! + * Merges the image transported by this object with the image transported by + * another %ImageVariant instance, masking it with the image transported by + * a third %ImageVariant instance. + * + * \param src A reference to an %ImageVariant instance whose transported + * image will be the source of the merge operation. + * + * \param mask A reference to an %ImageVariant instance whose transported + * image will act as a mask for the merge operation. + * + * \param invert If this argument is true, mask pixels will be inverted + * before carrying out the merge operation. + * + * Given a pixel \b V of the image transported by this instance, a pixel + * \b S of the image transported by the source %ImageVariant instance, and a + * pixel \b M of the mask image, the original pixel \b V is replaced by the + * result \b V' of the following expression: + * + *
+    * if invert
+    *    M = 1 - M
+    * V' = V*( 1 - M ) + S*M
+    * 
+ * + * in the normalized real range [0,1], where \b 1 represents a saturated + * (usually white) pixel sample value. + */ + void MaskImage( const ImageVariant& src, const ImageVariant& mask, bool invert = false ); + + /*! + * Returns true iff %ImageVariant owns the image transported by this + * instance, if any. + */ + bool OwnsImage() const noexcept + { + return m_data->ownsImage; + } + + /*! + * Causes %ImageVariant to own the transported image, if any. Returns a + * reference to this object. + * + * \note If %ImageVariant owns a transported image, it is destroyed when all + * instances of %ImageVariant referencing that image are destroyed. It is + * very important to point out that ownership of transported images is a + * class-wide property of %ImageVariant, not a private property of + * any particular %ImageVariant instance. + */ + ImageVariant& SetOwnership( bool owner = true ) noexcept + { + m_data->ownsImage = owner && m_data->image; + return *this; + } + + /*! + * Removes the transported image, if there is one, from this %ImageVariant + * object. Returns a reference to this object. + * + * If the transported image is owned by %ImageVariant, and there are no more + * %ImageVariant references to it, then it is also destroyed. + */ + ImageVariant& Free() + { + if ( m_data->IsUnique() ) + m_data->Free(); + else + { + Data* newData = new Data; + DetachFromData(); + m_data = newData; + } + return *this; + } + + /*! + * Structure member selection operator. Returns a pointer to the constant + * image transported by this %ImageVariant object. + * + * \warning Do not call this member function if the %ImageVariant does not + * transport an image. + */ + const AbstractImage* operator ->() const noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return m_data->image; + } + + /*! + * Structure member selection operator. Returns a pointer to the image + * transported by this %ImageVariant object. + * + * \warning Do not call this member function if the %ImageVariant does not + * transport an image. + */ + AbstractImage* operator ->() noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return m_data->image; + } + + /*! + * Dereference operator. Returns a reference to the constant image + * transported by this %ImageVariant object. + * + * \warning Do not call this member function if the %ImageVariant does not + * transport an image. + */ + const AbstractImage& operator *() const noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return *m_data->image; + } + + /*! + * Dereference operator. Returns a reference to the image transported by + * this %ImageVariant object. + * + * \warning Do not call this member function if the %ImageVariant does not + * transport an image. + */ + AbstractImage& operator *() noexcept + { + PCL_PRECONDITION( m_data->image != nullptr ) + return *m_data->image; + } + + /*! + * Returns true iff this %ImageVariant instance transports an image. + */ + operator bool() const noexcept + { + return m_data->image != nullptr; + } + +#define __PIXEL_ACCESS_OPERATOR( I ) \ + pcl::I::pixel_traits::FromSample( result, *static_cast( **this ).PixelAddress( x, y, channel ) ) + + /*! + * Returns a pixel sample value, given by its pixel coordinates and channel + * index. + * + * \param x Horizontal coordinate (or column index) of the desired + * pixel, 0 ≤ \a x < \a w, where \a w is the width in + * pixels of this image. + * + * \param y Vertical coordinate (or row index) of the desired scan + * line, 0 ≤ \a y < \a h, where \a h is the height in + * pixels of this image. + * + * \param channel Channel index, 0 ≤ \a channel < \a n, where \a n is + * the number of channels in this image, including nominal + * and alpha channels. The default value is zero. + * + * This member function returns the requested pixel sample in the normalized + * range [0,1], irrespective of the sample data type of the image. This + * function conventionally returns zero if this object transports no image. + * + * \note For the sake of performance, this function does not check validity + * of coordinates and channel indexes. Specifying invalid coordinates may + * lead to unpredictable results, most likey raising an access violation + * signal or exception. + */ + double operator ()( int x, int y, int channel = 0 ) const noexcept + { + double result = 0; + if ( *this ) + SOLVE_TEMPLATE( __PIXEL_ACCESS_OPERATOR ) + return result; + } + +#undef __PIXEL_ACCESS_OPERATOR + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + + bool IsShared() const noexcept + { + return m_shared != nullptr; + } + + // Implemented in SharedImage.cpp + pi::SharedImage* GetSharedImage( bool rdOnly = false ) const; + pi::SharedImage* NewSharedImage( void* owner, bool rdOnly = false ); + +#endif + +private: + + struct Data : public ReferenceCounter + { + AbstractImage* image = nullptr; + bool isFloatSample = false; + bool isComplexSample = false; + uint8 bitsPerSample = 0; + bool ownsImage = false; + + Data() = default; + + ~Data() + { + Free(); + } + + template + void Update( GenericImage

* a_image ) noexcept + { + image = a_image; + isFloatSample = P::IsFloatSample(); + isComplexSample = P::IsComplexSample(); + bitsPerSample = uint8( P::BitsPerSample() ); + } + + void Free() + { + if ( ownsImage ) + delete image; + image = nullptr; + isFloatSample = isComplexSample = false; + bitsPerSample = 0; + //ownsImage = ownsImage; ### N.B.: Ownership must *not* change here + } + }; + + Data* m_data = nullptr; + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + // This is the server-side part of the image sharing mechanism + pi::SharedImage* m_shared = nullptr; +#else + const void* m_shared = nullptr; +#endif + + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + // Server-side private ctor. used by View + template + ImageVariant( GenericImage

* image, int ) + { + m_data = new Data; + m_data->Update( image ); + m_data->ownsImage = true; + } +#endif + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION + friend class pi::SharedImage; +#else + friend class View; + friend class ImageView; +#endif +}; + +// ---------------------------------------------------------------------------- + +/* + * Implementation of member functions of GenericImage requiring a full + * declaration of ImageVariant. + */ + +template inline +void GenericImage

::GetLuminance( ImageVariant& Y, const Rect& rect, int maxProcessors ) const +{ + ImageVariant( const_cast*>( this ) ).GetLuminance( Y, rect, maxProcessors ); +} + +template inline +void GenericImage

::GetLightness( ImageVariant& L, const Rect& rect, int maxProcessors ) const +{ + ImageVariant( const_cast*>( this ) ).GetLightness( L, rect, maxProcessors ); +} + +template inline +void GenericImage

::GetIntensity( ImageVariant& I, const Rect& rect, int maxProcessors ) const +{ + ImageVariant( const_cast*>( this ) ).GetIntensity( I, rect, maxProcessors ); +} + +template inline +GenericImage

& GenericImage

::SetLuminance( const ImageVariant& Y, const Point& point, const Rect& rect, int maxProcessors ) +{ + (void)ImageVariant( this ).SetLuminance( Y, point, rect, maxProcessors ); + return *this; +} + +template inline +GenericImage

& GenericImage

::SetLightness( const ImageVariant& L, const Point& point, const Rect& rect, int maxProcessors ) +{ + (void)ImageVariant( this ).SetLightness( L, point, rect, maxProcessors ); + return *this; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ImageVariant_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageVariant.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageView.h b/3rdparty/include/pcl/ImageView.h new file mode 100644 index 0000000..6958794 --- /dev/null +++ b/3rdparty/include/pcl/ImageView.h @@ -0,0 +1,1459 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageView.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageView_h +#define __PCL_ImageView_h + +/// \file pcl/ImageView.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageView + * \brief Client-side interface to a PixInsight %ImageView control. + * + * ### TODO: Write a detailed description for %ImageView. + * + * \sa ImageWindow + */ +class PCL_CLASS ImageView : public ScrollBox +{ +public: + + /*! + * Represents a GUI working mode. Valid modes are defined in the ImageMode + * namespace. + */ + typedef ImageMode::value_type gui_mode; + + /*! + * Represents a display image channel supported by the PixInsight core + * application. Valid display channels and components are defined in the + * DisplayChannel namespace. + */ + typedef DisplayChannel::value_type display_channel; + + /*! + * Represents a transparency background brush supported by the PixInsight + * core application. Valid transparency brushes are defined in the + * BackgroundBrush namespace. + */ + typedef BackgroundBrush::value_type background_brush; + + /*! + * Represents a transparency rendering mode supported by the PixInsight core + * application. Valid transparency rendering modes are defined in the + * TransparencyMode namespace. + */ + typedef TransparencyMode::value_type transparency_mode; + + /*! + * Creates a new %ImageView control with the specified image parameters. + * + * \param parent Parent control of the newly created %ImageView. + * + * \param width %Image width in pixels. Must be >= 0. There is no specific + * upper limit. If zero is specified, the %ImageView will + * contain an empty image. The default value is zero. + * + * \param height %Image width in pixels. Must be >= 0. There is no specific + * upper limit. If zero is specified, the %ImageView will + * contain an empty image. The default value is zero. + * + * \param numberOfChannels Number of channels in the image. Must be >= 0. + * There is no specific upper limit. If zero is specified, + * the %ImageView will contain an empty image. If a value > 0 + * is specified, it should not be less than the number of + * nominal channels: 1 for grayscale images, 3 for color + * images. Channels in excess of nominal channels are + * generated as alpha channels. The default value is one. + * + * \param bitsPerSample Number of bits per sample. Supported values are + * 8, 16 and 32 for integer images; 32 and 64 for floating + * point images. The default value is 32. + * + * \param floatSample True to create a floating point image; false to + * create an integer image. The default value is true. + * + * \param color True to create an RGB color image; false to create a + * grayscale image. The default value is false. + * + * If not empty, all nominal and alpha channels of the newly created image + * are initialized with zero pixel sample values (black pixels). + */ + ImageView( Control& parent = Control::Null(), + int width = 0, int height = 0, int numberOfChannels = 1, + int bitsPerSample = 32, bool floatSample = true, bool color = false ); + + /*! + * Destroys an %ImageView control. + */ + virtual ~ImageView() + { + } + + /*! + * Returns an ImageVariant instance that transports the image owned by this + * %ImageView control. + * + * The returned ImageVariant object transports a shared image. A + * shared image is a managed alias for an actual image living in the + * PixInsight core application. This is because a GUI control is also a + * managed object. + */ + ImageVariant Image() const; + + /*! + * Returns true iff this %ImageView control holds a color image, false if it + * is a grayscale image. + */ + bool IsColorImage() const; + + /*! + * Copies the width and height in pixels, and the number of channels of the + * image in this %ImageView control to the specified variables. + */ + void GetImageGeometry( int& width, int& height, int& numberOfChannels ) const; + + /*! + * Returns the width in pixels of the image in this %ImageView control. + */ + int ImageWidth() const + { + int w, dum; GetImageGeometry( w, dum, dum ); return w; + } + + /*! + * Returns the height in pixels of the image in this %ImageView control. + */ + int ImageHeight() const + { + int dum, h; GetImageGeometry( dum, h, dum ); return h; + } + + /*! + * Returns the bounding rectangle of the image in this %ImageView control. + * The upper left corner of the returned rectangle (x0, y0) is always (0,0). + * The lower right corner coordinates (x1, y1) correspond to the width and + * height of the image. + */ + Rect ImageBounds() const + { + int w, h, dum; GetImageGeometry( w, h, dum ); return Rect( w, h ); + } + + /*! + * Retrieves the pixel sample data format used by the image owned by this + * %ImageView control. + * + * \param[out] bitsPerSample On output, will be equal to the number of bits + * per sample used by the image. Can be 8, 16 or + * 32 for an integer image; 32 or 64 for a + * floating point image. + * + * \param[out] floatSample On output, will be true if the image uses + * floating point samples; false if it uses + * integer samples. + */ + void GetSampleFormat( int& bitsPerSample, bool& floatSample ) const; + + /*! + * Converts the image owned by this %ImageView control to the specified + * sample data format. + * + * \param bitsPerSample Number of bits per sample. Can be 8, 16 or 32 + * for an integer image; 32 or 64 for a floating + * point image. + * + * \param floatSample True to transform the image to a floating + * point data format; false to transform the + * image to an integer data format. + * + * This function does nothing if the image in this control already has the + * specified sample data format. + */ + void SetSampleFormat( int bitsPerSample, bool floatSample ); + + /*! + * Obtains a copy of the RGB working space (RGBWS) associated with the + * image owned by this %ImageView control. + * + * \param[out] rgbws Reference to an object where the parameters of the + * current RGBWS will be copied. + */ + void GetRGBWS( RGBColorSystem& rgbws ) const; + + /*! + * Sets the RGB working space (RGBWS) for the image owned by this %ImageView + * control. + * + * \param rgbws Reference to a RGBWS that will be associated with + * the image owned by this object. + */ + void SetRGBWS( const RGBColorSystem& rgbws ); + + /*! + * Returns true iff color management is active for the image in this + * %ImageView control. + */ + bool IsColorManagementEnabled() const; + + /*! + * Enables color management for the image in this %ImageView control. + * + * Color management uses ICC profiles for the image in this control (either + * a profile associated with the image or a global profile) and the monitor + * device to control how the image is rendered on the screen. Color + * management transformations are applied to yield a visual representation + * that takes into account the actual meaning of numerical pixel sample + * values, considering the chromatic responses of the screen and of the + * devices and color spaces that have originated the image. + * + * If color management is disabled for an image, its pixel sample values are + * sent directly to the screen, avoiding ICC profile transformations. This + * improves output performance, but may give a false representation of the + * image on the screen. + * + * If this control is visible, its screen rendition is updated immediately + * after calling this function. + */ + void EnableColorManagement( bool = true ); + + /*! + * Disables color management for the image in this %ImageView control. + * + * See the documentation for EnableColorManagement() for additional + * information on color management in PixInsight. + * + * If this control is visible, its screen rendition is updated immediately + * after calling this function. + */ + void DisableColorManagement( bool disable = true ) + { + EnableColorManagement( !disable ); + } + + /*! + * Returns true iff soft-proofing is currently enabled for the image + * in this %ImageView control. + */ + bool IsProofingEnabled() const; + + /*! + * Enables soft-proofing for the image in this %ImageView control. + * + * Color proofing is used to emulate an output device (usually a printer) on + * the screen. Proofing requires three ICC profiles: the image profile + * (either an embedded profile or the default profile), the monitor profile, + * and a proofing profile that describes the emulated device. Color + * proofing is useful to preview the final printed result without rendering + * images to physical media. + * + * If this control is visible and has color management enabled, its screen + * rendition is updated immediately after calling this function. + */ + void EnableProofing( bool = true ); + + /*! + * Disables soft-proofing for the image in this %ImageView control. + * + * See the documentation for EnableProofing() for additional information on + * color proofing. + * + * If this control is visible and has color management enabled, its screen + * rendition is updated immediately after calling this function. + */ + void DisableProofing( bool disable = true ) + { + EnableProofing( !disable ); + } + + /*! + * Returns true iff the gamut check soft-proofing feature is + * currently enabled for the image in this %ImageView control. + */ + bool IsGamutCheckEnabled() const; + + /*! + * Enables the gamut check proofing feature for the image in this + * %ImageView control. + * + * The gamut check feature represents out-of-gamut colors (i.e., + * colors that are not defined in the color space of the image) with a + * special color (selectable via global color management preferences) for + * quick visual detection. + * + * If this control is visible, has color management enabled, and has soft + * proofing enabled, its screen rendition is updated immediately after + * calling this function. If color proofing is disabled, calling this + * function has no effect. + */ + void EnableGamutCheck( bool = true ); + + /*! + * Disables the gamut check proofing feature for the image in this + * %ImageView control. + * + * See the documentation for EnableGamutCheck() for additional information + * on the gamut check color proofing feature. + * + * If this control is visible, has color management enabled, and has soft + * proofing enabled, its screen rendition is updated immediately after + * calling this function. If color proofing is disabled, calling this + * function has no effect. + */ + void DisableGamutCheck( bool disable = true ) + { + EnableGamutCheck( !disable ); + } + + /*! + * Allows enabling or disabling all color management features at once for + * this %ImageView control. + * + * \param cmEnabled Enables (if true) or disables (if false) color + * management for the image in this control. + * + * \param proofing Enables (if true) or disables (if false) + * soft-proofing for the image in this control. + * + * \param gamutCheck Enables (if true) or disables (if false) the + * gamut check proofing feature. The state of this + * argument has no meaning if the \a proofing parameter + * is false. + * + * If this control is visible, its screen rendition is updated immediately + * after calling this function. + */ + void SetColorManagementFeatures( bool cmEnabled, bool proofing, bool gamutCheck ); + + /*! + * Obtains a copy of the current ICC profile associated with the image in + * this %ImageView control. + * + * \param[out] icc Reference to an object where a copy of the current ICC + * profile will be stored. + */ + bool GetICCProfile( ICCProfile& icc ) const; + + /*! + * Sets the current ICC profile for the image in this %ImageView control as + * a copy of an existing ICC profile. + * + * \param icc Reference to an object that will be used to set the current + * ICC profile. + * + * If this control is visible and has color management enabled, its screen + * rendition is updated immediately after calling this function. + */ + void SetICCProfile( const ICCProfile& icc ); + + /*! + * Sets the current ICC profile for the image in this %ImageView control as + * a copy of an ICC profile loaded from a disk file. + * + * \param filePath A file path specification to an ICC profile that will + * be loaded and copied to the ICC profile of the image. + * + * If this control is visible and has color management enabled, its screen + * rendition is updated immediately after calling this function. + */ + void SetICCProfile( const String& filePath ); + + /*! + * Causes the image in this %ImageView control to be associated with the + * default ICC profile globally defined in the PixInsight core application. + * + * If this control has its own associated ICC profile, this funtion destroys + * it and frees its allocated space. + * + * If this control is visible and has color management enabled, its screen + * rendition is updated immediately after calling this function. + */ + void DeleteICCProfile(); + + /*! + * Returns the current GUI working mode for this %ImageView control. + * + * The returned value can be identified with the symbolic constants defined + * in the ImageMode namespace. + */ + gui_mode CurrentMode() const; + + /*! + * Sets the current GUI working mode for this %ImageView control. + * + * \param mode Specifies the new GUI mode. Supported modes are identified + * through symbolic constants defined in the ImageMode + * namespace. + * + * Preview edition and dynamic modes are not valid for %ImageView. The only + * valid GUI working modes are: + * + * ImageMode::Readout \n + * ImageMode::ZoomIn \n + * ImageMode::ZoomOut \n + * ImageMode::Pan \n + * ImageMode::Center + */ + void SelectMode( gui_mode mode ); + + /*! + * Returns the current display channel for this %ImageView control. + * + * The returned value can be identified with the symbolic constants defined + * int the DisplayChannel namespace. + */ + display_channel CurrentChannel() const; + + /*! + * Returns true iff the current display channel for this %ImageView control + * corresponds to an alpha channel of the image. + */ + bool IsAlphaChannelDisplayed() const + { + return CurrentChannel() >= DisplayChannel::Alpha; + } + + /*! + * Returns the alpha channel index displayed for the image in this + * %ImageView control. If the current display channel does not correspond to + * an alpha channel, a negative integer value is returned. + * + * Alpha channel indices are relative to the first alpha channel in an + * image. For example, the first alpha channel is always indexed as alpha + * channel #0, and so on. + */ + int CurrentAlphaChannel() const + { + return CurrentChannel() - DisplayChannel::Alpha; + } + + /*! + * Selects the current display channel for this %ImageView control. + * + * \param channel Specifies the new display channel. Supported display + * channels are enumerated in the DisplayChannel + * namespace. + * + * Not all display channels are valid for all images in all contexts. For + * example, if the image in the current view is a grayscale image, the only + * valid display channels are the combined RGB/K channel + * (DisplayChannel::RGBK) and, if the image has \a n alpha channels, values + * in the range DisplayChannel::Alpha to DisplayChannel::Alpha+n-1. If an + * invalid display channel is specified, this function is simply ignored. + */ + void SelectChannel( display_channel channel ); + + /*! + * Returns the current transparency rendering mode for this %ImageView + * control. + * + * Supported transparency modes are defined in the TransparencyMode + * namespace. + */ + transparency_mode TransparencyMode() const; + + /*! + * Returns the color used in this %ImageView control to render transparent + * image regions, when the transparency mode is TransparencyMode::Color. + * + * The returned color is an AARRGGBB value. The alpha value is always 0xff, + * since the transparency background cannot be transparent. + */ + RGBA TransparencyColor() const; + + /*! + * Returns true iff transparent image areas are currently visible for this + * %ImageView control. + * + * Transparencies are visible if the current rendering mode is not + * TransparencyMode::Hide. + */ + bool IsTransparencyVisible() const + { + return TransparencyMode() != pcl::TransparencyMode::Hide; + } + + /*! + * Sets the current transparency rendering mode for this %ImageView control. + * + * \param mode Specifies the new mode that will be used to render + * transparent regions of images. Supported transparency + * modes are identified through symbolic constants defined in + * the TransparencyMode namespace. + * + * \param color New color that will be used when the transparency mode is + * TransparencyMode::Color. If zero is specified (the default + * value), the current color will not be changed. + */ + void SetTransparencyMode( transparency_mode mode, RGBA color = 0 ); + + /*! + * Disables transparency renditions for this %ImageView control. + * + * Calling this function is equivalent to: + * + * \code SetTransparencyMode( pcl::TransparencyMode::Hide ); \endcode + */ + void HideTransparency() + { + SetTransparencyMode( pcl::TransparencyMode::Hide ); + } + + /*! + * Sets new viewport central location coordinates and zoom factor for this + * %ImageView control. + * + * \param cx,cy Position (horizontal, vertical) of the new central + * viewport location in image coordinates. + * + * \param zoom New viewport zoom factor. Positive zoom factors are + * interpreted as magnifying factors; negative zoom factors + * are reduction factors: + * + *

+    * Zoom Factor    Screen Zoom (screen pixels : image pixels)
+    * ===========    ==========================================
+    *      0               Current zoom factor (no change)
+    *   1 or -1            1:1 (actual pixels)
+    *      2               2:1 (x2 magnification)
+    *      3               3:1 (x3 magnification)
+    *     ...
+    *     -2               1:2 (1/2 reduction)
+    *     -3               1:3 (1/3 reduction)
+    *     ...
+    * 
+ * + * A zoom factor of -1 should not be used explicitly; it is a + * reserved value for internal use, and there is no guarantee + * that future versions of PCL continue accepting it. + * + * If the specified viewport location cannot correspond to the viewport + * central position with the specified zoom factor, the nearest image + * coordinates are always selected automatically. For example, if you + * pass image coordinates \a cx=0 and \a cy=0 as arguments to this function, + * the GUI will set the viewport center to the necessary image location in + * order to display the upper left corner of the image just at the upper + * left corner of the viewport. + * + * If the \a zoom argument is not specified, the current zoom factor is not + * changed since the default value of this parameter is zero; see the table + * above. + * + * If this control is visible, calling this function causes an immediate + * regeneration of the screen rendition for the visible viewport region. + */ + void SetViewport( double cx, double cy, int zoom = 0 ); + + /*! + * Sets new viewport central location and zoom factor for this %ImageView + * control. + * + * Calling this function is equivalent to: + * + * \code SetViewport( center.x, center.y, int ); \endcode + * + * See the documentation for SetViewport( double, double, int ). + */ + void SetViewport( const DPoint& center, int zoom = 0 ) + { + SetViewport( center.x, center.y, zoom ); + } + + /*! + * Returns the current zoom factor in the viewport of this %ImageView + * control. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + int ZoomFactor() const; + + /*! + * Sets the zoom factor for the viewport of this %ImageView control to the + * specified value \a z. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void SetZoomFactor( int z ); + + /*! + * Increments the current zoom factor for the viewport of this %ImageView + * control. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void ZoomIn() + { + int z = ZoomFactor() + 1; + SetZoomFactor( (z > 0) ? z : +1 ); + } + + /*! + * Decrements the current zoom factor for the viewport of this %ImageView + * control. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void ZoomOut() + { + int z = ZoomFactor() - 1; + SetZoomFactor( (z > 0 || z < -1) ? z : -2 ); + } + + /*! + * Gets the current sizes of the viewport in this %ImageView control. + * + * \param[out] width Reference to a variable where the viewport width in + * pixels will be stored. + * + * \param[out] height Reference to a variable where the viewport height in + * pixels will be stored. + * + * The provided sizes represent the entire image in this control, as + * represented on its viewport after applying the current zoom factor. + * Viewport sizes can also be thought of as the available navigation ranges + * in an %ImageView control. + */ + void GetViewportSize( int& width, int& height ) const; + + /*! + * Gets the current width of the viewport in this %ImageView control. + */ + int ViewportWidth() const + { + int w, dum; + GetViewportSize( w, dum ); + return w; + } + + /*! + * Gets the current height of the viewport in this %ImageView control. + */ + int ViewportHeight() const + { + int dum, h; + GetViewportSize( dum, h ); + return h; + } + + /*! + * Returns the current viewport position in this %ImageView control. + * + * The viewport position corresponds to the viewport coordinates of the + * upper left corner of the visible viewport region. These + * coordinates can be negative if the represented image is smaller than the + * size of the viewport control, that is, when the extended viewport + * space is visible around the screen rendition of the image. + */ + Point ViewportPosition() const; + + /*! + * Sets the viewport position in this %ImageView control to the specified + * \a x and \a y viewport coordinates. + * + * If this control is visible, calling this function causes an immediate + * regeneration of the screen rendition for the visible viewport region. + */ + void SetViewportPosition( int x, int y ); + + /*! + * Sets the viewport position in this %ImageView control to the specified + * position \a p in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code SetViewportPosition( p.x, p.y ); \endcode + */ + void SetViewportPosition( const Point& p ) + { + SetViewportPosition( p.x, p.y ); + } + + /*! + * Gets the current visible viewport region in this %ImageView control. + * + * The returned rectangle corresponds to the visible region of the image in + * viewport coordinates. It depends on the current viewport zoom factor and + * on the positions of the viewport's scroll bars, if they are visible. + */ + Rect VisibleViewportRect() const; + + /*! + * Returns the width in pixels of the current visible viewport region in + * this %ImageView control. + */ + int VisibleViewportWidth() const + { + return VisibleViewportRect().Width(); + } + + /*! + * Returns the height in pixels of the current visible viewport region in + * this %ImageView control. + */ + int VisibleViewportHeight() const + { + return VisibleViewportRect().Height(); + } + + /*! + * Converts the specified \a x and \a y integer coordinates from the + * viewport coordinate system to the image coordinate system. + * + * The converted image coordinates are rounded to the nearest integers. + */ + void ViewportToImage( int& x, int& y ) const; + + /*! + * Converts the specified \a x and \a y real floating point coordinates from + * the viewport coordinate system to the image coordinate system. + */ + void ViewportToImage( double& x, double& y ) const; + + /*! + * Converts a point \a p in the viewport coordinate system to the image + * coordinate system. Returns a point with the resulting floating point real + * image coordinates. + */ + template + DPoint ViewportToImage( const GenericPoint& p ) const + { + DPoint p1 = p; + ViewportToImage( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the viewport coordinate system to the image + * coordinate system. Returns a rectangle with the resulting floating point + * real image coordinates. + */ + template + DRect ViewportToImage( const GenericRectangle& r ) const + { + DRect r1 = r; + ViewportToImage( r1.x0, r1.y0 ); + ViewportToImage( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts a set of integer points from the viewport coordinate system to + * the image coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from viewport coordinates to image coordinates. + * + * \param n Number of points in the \a p array. + * + * Converted point image coordinates are rounded to the nearest integers. + */ + void ViewportToImage( Point* p, size_type n ) const; + + /*! + * Converts a set of real floating-point points from the viewport + * coordinate system to the image coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from viewport coordinates to image coordinates. + * + * \param n Number of points in the \a p array. + */ + void ViewportToImage( DPoint* p, size_type n ) const; + + /*! + * Converts a set of points in a dynamic array from the viewport coordinate + * system to the image coordinate system. + * + * \param a Reference to a dynamic array of points that will be converted + * from viewport coordinates to image coordinates. + */ + template + void ViewportToImage( Array >& a ) const + { + ViewportToImage( a.Begin(), a.Length() ); + } + + /*! + * Converts a set of integer scalars from the viewport coordinate system to + * the image coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from viewport coordinates to image + * coordinates. + * + * \param n Number of scalars in the \a p array. + * + * Converted scalars in image coordinates are rounded to the nearest + * integers. + */ + void ViewportScalarToImage( int* d, size_type n ) const; + + /*! + * Converts a set of real floating-point scalars from the viewport + * coordinate system to the image coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from viewport coordinates to image + * coordinates. + * + * \param n Number of scalars in the \a p array. + */ + void ViewportScalarToImage( double* d, size_type n ) const; + + /*! + * Converts a scalar \a d in the viewport coordinate system to the image + * coordinate system. Returns the resulting floating point real scalar in + * image coordinates. + */ + double ViewportScalarToImage( double d ) const; + + /*! + * Converts a scalar \a d in the viewport coordinate system to the image + * coordinate system. Returns the resulting floating point real scalar in + * image coordinates. + */ + template + double ViewportScalarToImage( T d ) const + { + return ViewportScalarToImage( double( d ) ); + } + + /*! + * Converts the specified \a x and \a y integer coordinates from the image + * coordinate system to the viewport coordinate system. + * + * The converted viewport coordinates are rounded to the nearest integers. + */ + void ImageToViewport( int& x, int& y ) const; + + /*! + * Converts the specified \a x and \a y real floating-point coordinates from + * the image coordinate system to the viewport coordinate system. + */ + void ImageToViewport( double& x, double& y ) const; + + /*! + * Converts a point \a p in the image coordinate system to the viewport + * coordinate system. Returns a point with the resulting viewport + * coordinates. + * + * If the template argument T corresponds to an integer type, the converted + * viewport coordinates in the resulting point are rounded to the nearest + * integers. + */ + template + GenericPoint ImageToViewport( const GenericPoint& p ) const + { + GenericPoint p1 = p; + ImageToViewport( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the image coordinate system to the viewport + * coordinate system. Returns a rectangle with the resulting viewport + * coordinates. + * + * If the template argument T corresponds to an integer type, the converted + * viewport coordinates in the resulting rectangle are rounded to the + * nearest integers. + */ + template + GenericRectangle ImageToViewport( const GenericRectangle& r ) const + { + GenericRectangle r1 = r; + ImageToViewport( r1.x0, r1.y0 ); + ImageToViewport( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts a set of integer points from the image coordinate system to + * the viewport coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from image coordinates to viewport coordinates. + * + * \param n Number of points in the \a p array. + * + * Converted point viewport coordinates are rounded to the nearest integers. + */ + void ImageToViewport( Point* p, size_type n ) const; + + /*! + * Converts a set of real floating-point points from the image coordinate + * system to the viewport coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from image coordinates to viewport coordinates. + * + * \param n Number of points in the \a p array. + */ + void ImageToViewport( DPoint* p, size_type n ) const; + + /*! + * Converts a set of points in a dynamic array from the image coordinate + * system to the viewport coordinate system. + * + * \param a Reference to a dynamic array of points that will be converted + * from image coordinates to viewport coordinates. + */ + template + void ImageToViewport( Array >& a ) const + { + ImageToViewport( a.Begin(), a.Length() ); + } + + /*! + * Converts a set of integer scalars from the image coordinate system to + * the viewport coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from image coordinates to viewport + * coordinates. + * + * \param n Number of scalars in the \a p array. + * + * Converted scalars in viewport coordinates are rounded to the nearest + * integers. + */ + void ImageScalarToViewport( int* d, size_type n ) const; + + /*! + * Converts a set of real floating-point scalars from the image coordinate + * system to the viewport coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from image coordinates to viewport + * coordinates. + * + * \param n Number of scalars in the \a p array. + */ + void ImageScalarToViewport( double* d, size_type n ) const; + + /*! + * Converts an integer scalar \a d in the image coordinate system to the + * viewport coordinate system. Returns the resulting scalar in viewport + * coordinates. + * + * The resulting scalar in viewport coordinates is rounded to the nearest + * integer. + */ + int ImageScalarToViewport( int ) const; + + /*! + * Converts a real floating-point scalar \a d in the image coordinate system + * to the viewport coordinate system. Returns the resulting scalar in + * viewport coordinates. + */ + double ImageScalarToViewport( double ) const; + + /*! + * Converts the specified \a x and \a y integer coordinates from the + * viewport coordinate system to the global coordinate system. + * + * The converted global coordinates are rounded to the nearest integers. + */ + void ViewportToGlobal( int& x, int& y ) const; + + /*! + * Converts a point \a p in the viewport coordinate system to the global + * coordinate system. Returns a point with the resulting global coordinates. + */ + Point ViewportToGlobal( const Point& p ) const + { + Point p1 = p; + ViewportToGlobal( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the viewport coordinate system to the global + * coordinate system. Returns a rectangle with the resulting global + * coordinates. + */ + Rect ViewportToGlobal( const Rect& r ) const + { + Rect r1 = r; + ViewportToGlobal( r1.x0, r1.y0 ); + ViewportToGlobal( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts the specified \a x and \a y integer coordinates from the global + * coordinate system to the viewport coordinate system. + * + * The converted viewport coordinates are rounded to the nearest integers. + */ + void GlobalToViewport( int& x, int& y ) const; + + /*! + * Converts a point \a p in the global coordinate system to the viewport + * coordinate system. Returns a point with the resulting viewport + * coordinates. + */ + Point GlobalToViewport( const Point& p ) const + { + Point p1 = p; + GlobalToViewport( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the global coordinate system to the viewport + * coordinate system. Returns a rectangle with the resulting viewport + * coordinates. + */ + Rect GlobalToViewport( const Rect& r ) const + { + Rect r1 = r; + GlobalToViewport( r1.x0, r1.y0 ); + GlobalToViewport( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Causes a complete regeneration of the whole viewport and its associated + * UI resources. + * + * Calling this function may be necessary to force a regeneration after + * changing the geometry of the image owned by this %ImageView control. + */ + void Reset() + { + SetZoomFactor( ZoomFactor() ); + } + + /*! + * Regenerates the screen rendition for the visible viewport region in this + * %ImageView control. + */ + void Regenerate(); + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code RegenerateViewportRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void RegenerateViewportRect( const Rect& r ) + { + RegenerateViewportRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in viewport coordinates. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the regenerated region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the regenerated region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be regenerated and updated, that is, + * its intersection with the visible viewport region. + */ + void RegenerateViewportRect( int x0, int y0, int x1, int y1 ); + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in image coordinates. + * + * Calling this function is equivalent to: + * + * \code RegenerateImageRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void RegenerateImageRect( const pcl::DRect& r ) + { + RegenerateImageRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in image coordinates. + * + * \param x0,y0 %Image coordinates (horizontal, vertical) of the upper + * left corner of the regenerated region. + * + * \param x1,y1 %Image coordinates (horizontal, vertical) of the lower + * right corner of the regenerated region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be regenerated and updated, that is, + * its intersection with the visible viewport region. + */ + void RegenerateImageRect( double x0, double y0, double x1, double y1 ); + + /*! + * Requests a screen update for the entire visible viewport region in this + * %ImageView control. + */ + void UpdateViewport(); + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code UpdateViewportRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void UpdateViewportRect( const Rect& r ) + { + UpdateViewportRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in viewport coordinates. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the update region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the update region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be updated, that is, its + * intersection with the visible viewport region. + */ + void UpdateViewportRect( int x0, int y0, int x1, int y1 ); + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in image coordinates. + * + * Calling this function is equivalent to: + * + * \code UpdateImageRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void UpdateImageRect( const pcl::DRect& r ) + { + UpdateImageRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in image coordinates. + * + * \param x0,y0 %Image coordinates (horizontal, vertical) of the upper + * left corner of the update region. + * + * \param x1,y1 %Image coordinates (horizontal, vertical) of the lower + * right corner of the update region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be updated, that is, its + * intersection with the visible viewport region in the image coordinate + * system. + */ + void UpdateImageRect( double x0, double y0, double x1, double y1 ); + + /*! + * Returns true iff there are pending viewport updates for this %ImageView + * control. + */ + bool HasPendingUpdates() const; + + /*! + * Executes all pending viewport update requests for this %ImageView + * control. + * + * Viewport update requests are not executed immediately by the core + * PixInsight application. For the sake of performance, The GUI tries to + * optimize screen updates by performing the minimum possible redrawing + * work. + * + * This means that update requests are placed on a queue, waiting while the + * main GUI thread is busy or until a sufficiently large update region + * becomes available. + * + * With this function, an interface can force the immediate screen update + * for all pending update viewport regions. If multiple update regions are + * pending, the core application will still minimize the required drawing + * work by grouping all of them into the minimum possible amount of larger + * regions. + */ + void CommitPendingUpdates(); + + /*! + * Returns a rectangle in viewport coordinates that includes all pending + * viewport update regions for this %ImageView control. + */ + Rect ViewportUpdateRect() const; + + /*! + * Returns a RGBA bitmap with a screen rendition of a viewport region of + * this %ImageView control. + * + * Calling this function is equivalent to: + * + * \code ViewportBitmap( r.x0, r.y0, r.x1, r.y1, flags ); \endcode + */ + Bitmap ViewportBitmap( const Rect& r, uint32 flags = 0 ) const + { + return ViewportBitmap( r.x0, r.y0, r.x1, r.y1, flags ); + } + + /*! + * Returns a RGBA bitmap with a screen rendition of a viewport region of + * this %ImageView control. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the source viewport region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the source viewport region. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + * + * The returned bitmap will contain a screen rendition for the specified + * source region of the image in this %ImageView control. It will be + * magnified or reduced according to the current zoom factor. + */ + Bitmap ViewportBitmap( int x0, int y0, int x1, int y1, uint32 flags = 0 ) const; + + /*! + * Begins a new interactive rectangular selection procedure on the viewport + * of this %ImageView control. + * + * Calling this function is equivalent to: + * + * \code BeginSelection( p.x, p.y, flags ); \endcode + */ + void BeginSelection( const Point& p, uint32 flags = 0 ) + { + BeginSelection( p.x, p.y, flags ); + } + + /*! + * Starts a new interactive rectangular selection procedure on the viewport + * of this %ImageView control. + * + * \param x,y %Image coordinates of the starting point of a new + * rectangular selection. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + * + * Interfaces typically use BeginSelection() in response to an OnMousePress + * event to start a rectangular selection. ModifySelection() is then called + * from an OnMouseMove event handler, and the final selection coordinates + * are obtained by calling SelectionRect() from an OnMouseRelease event + * handler. + */ + void BeginSelection( int x, int y, uint32 flags = 0 ); + + /*! + * Updates an ongoing interactive rectangular selection procedure on the + * viewport of this %ImageView control. + * + * Calling this function is equivalent to: + * + * \code ModifySelection( p.x, p.y, flags ); \endcode + */ + void ModifySelection( const Point& p, uint32 flags = 0 ) + { + ModifySelection( p.x, p.y, flags ); + } + + /*! + * Updates an ongoing interactive rectangular selection procedure on the + * viewport of this %ImageView control. + * + * \param x,y %Image coordinates to update the current rectangular + * selection. The selection rectangle is defined by this + * position and the starting position defined in the call to + * BeginSelection() that originated the current selection + * procedure. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + */ + void ModifySelection( int x, int y, uint32 flags = 0 ); + + /*! + * Requests a screen viewport update for the current rectangular selection. + */ + void UpdateSelection(); + + /*! + * Aborts the current interactive selection procedure. + */ + void CancelSelection(); + + /*! + * Terminates the current interactive selection procedure. + */ + void EndSelection(); + + /*! + * Returns the current rectangular selection in image coordinates. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + * + * Before calling this function, a rectangular selection procedure should + * have been started with BeginSelection(). + */ + Rect SelectionRect( uint32* flags = 0 ) const; + + /*! + * Returns true iff an interactive selection procedure is currently active on + * the viewport of this %ImageView control. + */ + bool IsSelection() const; + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnScrollViewport( ImageView& sender, int dx, int dy ); + + /*! + * \defgroup image_view_event_handlers ImageView Event Handlers + */ + + /*! + * Defines the prototype of a scroll event handler. + * + * A scroll event is generated when the viewport in this %ImageView control + * has been moved with respect to the control's origin, e.g. when the values + * of one or both scroll bars have been changed. The event is generated just + * \e before updating the viewport, so this event handler can be implemented + * for optimization purposes. + * + * \param sender The control that sends a scroll event. + * + * \param dx Horizontal scroll distance in viewport pixels. Positive + * values mean scrolling in the rightward direction. + * + * \param dy Vertical scroll distance in viewport pixels. Positive + * values mean scrolling in the downward direction. + * + * \ingroup image_view_event_handlers + */ + typedef void (Control::*scroll_event_handler)( ImageView& sender, int dx, int dy ); + + /*! + * Sets the scroll event handler for this %ImageView control. + * + * \param handler The scroll event handler. Must be a member function of + * the receiver object's class. + * + * \param receiver The control that will receive scroll events from this + * %ImageView object. + * + * \ingroup image_view_event_handlers + */ + void OnScrollViewport( scroll_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + scroll_event_handler onScrollViewport = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + +protected: + + /*! + * \internal + */ + ImageView( void* ); + + /*! + * \internal + */ + ImageView( void*, void* ); + + friend class ImageViewEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ImageView_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageView.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ImageWindow.h b/3rdparty/include/pcl/ImageWindow.h new file mode 100644 index 0000000..d930df9 --- /dev/null +++ b/3rdparty/include/pcl/ImageWindow.h @@ -0,0 +1,3025 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ImageWindow.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ImageWindow_h +#define __PCL_ImageWindow_h + +/// \file pcl/ImageWindow.h + +#include + +#include +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include +#include +#include +#include +#include + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class RGBColorSystem; +class ICCProfile; +class ProcessInterface; + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ImageMode + * \brief GUI operation modes. + * + * + * + * + * + * + * + * + * + * + * + * + *
ImageMode::Invalid Represents an invalid or unsupported mode.
ImageMode::Readout Default mode, click to get real-time readouts.
ImageMode::ZoomIn Click to zoom in the current view.
ImageMode::ZoomOut Click to zoom out the current view.
ImageMode::Pan Click and drag to pan the current view.
ImageMode::Center Click to center the view at the mouse position.
ImageMode::NewPreview Click and drag to define a new preview.
ImageMode::EditPreview Click and drag to change an existing preview.
ImageMode::DynamicOperation Module-defined dynamic operation.
ImageMode::Default Identifies the default GUI operation mode in the PixInsight core application (ImageMode::Readout).
+ */ +namespace ImageMode +{ + enum value_type + { + Invalid = -1, // Represents an invalid or unsupported mode + Readout = 0, // Default mode, click to get real-time readouts + ZoomIn, // Click to zoom in the current view + ZoomOut, // Click to zoom out the current view + Pan, // Click and drag to pan the current view + Center, // Click to center the view at the mouse position + NewPreview, // Click and drag to define a new preview + EditPreview, // Click and drag to change an existing preview + DynamicOperation, // Module-defined dynamic operation + + NumberOfModes, + + Default = Readout + }; + + /*! + * Returns true iff the specified mode is a valid GUI mode when the active + * view is a preview. + */ + inline bool IsValidPreviewMode( value_type m ) + { + return m != NewPreview && m != EditPreview; + } + + /*! + * Returns true iff the specified mode is a valid GUI mode when the active + * view is a main view. + */ + inline bool IsValidMainViewMode( value_type m ) + { + return !IsValidPreviewMode( m ); + } +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::BackgroundBrush + * \brief Transparency background brushes. + * + * + * + * + * + * + * + * + * + * + * + * + * + *
BackgroundBrush::Small Small chessboard pattern
BackgroundBrush::Medium Medium chessboard pattern
BackgroundBrush::Large Large chessboard pattern
BackgroundBrush::SmallCrossPattern Small cross pattern
BackgroundBrush::MediumCrossPattern Medium cross pattern
BackgroundBrush::LargeCrossPattern Large cross pattern
BackgroundBrush::SmallDiagPattern Small diagonal pattern
BackgroundBrush::MediumDiagPattern Medium diagonal pattern
BackgroundBrush::LargeDiagPattern Large diagonal pattern
BackgroundBrush::Solid Solid brush with the foreground color
BackgroundBrush::Default Identifies the default transparency background brush used by the PixInsight core application. Currently this corresponds to BackgroundBrush::Small.
+ */ +namespace BackgroundBrush +{ + enum value_type + { + Small, // Small chessboard pattern + Medium, // Medium chessboard pattern + Large, // Large chessboard pattern + SmallCrossPattern, // Small cross pattern + MediumCrossPattern, // Medium cross pattern + LargeCrossPattern, // Large cross pattern + SmallDiagPattern, // Small diagonal pattern + MediumDiagPattern, // Medium diagonal pattern + LargeDiagPattern, // Large diagonal pattern + Solid, // Solid brush with the foreground color + + NumberOfBrushes, + + Default = Small + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::TransparencyMode + * \brief Transparency rendering modes + * + * + * + * + * + * + *
TransparencyMode::Hide Don't show transparencies (ignore alpha channels).
TransparencyMode::BackgroundBrush Use the transparency background brush.
TransparencyMode::Color Use an opaque background color.
TransparencyMode::Default Identifies the default transparency rendering mode used by the PixInsight core application. Currently this corresponds to TransparencyMode::BackgroundBrush.
+ */ +namespace TransparencyMode +{ + enum value_type + { + Hide, // Don't show transparencies + BackgroundBrush, // Use the transparency background brush + Color, // Use an opaque background color + + NumberOfModes, + + Default = BackgroundBrush + }; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::UndoFlag + * \brief History data item specifiers for ProcessImplementation::UndoMode(). + * + * Use %UndoFlag constants to make up return values for + * ProcessImplementation::UndoMode(). That member function specifies the data + * that the PixInsight core application must save to swap files before + * executing an instance of a given process. Saved undo data are used to + * retrieve a history state of an image, e.g. for undo and redo operations. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
UndoFlag::DefaultMode Save pixel data, astrometric solution and previews.
UndoFlag::PixelData Save pixel data.
UndoFlag::RGBWS Save RGB Working Space data.
UndoFlag::ICCProfile Save ICC profile.
UndoFlag::Keywords Save %FITS keywords.
UndoFlag::FormatData Save Format-specific data.
UndoFlag::ImageId Save image identifier.
UndoFlag::Resolution Save image resolution data.
UndoFlag::AstrometricSolution Save existing astrometric solution.
UndoFlag::All Save all data items.
UndoFlag::DeletePropertiesOnEntry Unconditionally destroy/delete non-permanent view properties before execution.
UndoFlag::DeletePropertiesOnExit Unconditionally destroy/delete non-permanent view properties after execution.
UndoFlag::ExcludePreviews Don't save state of previews.
UndoFlag::ExcludeMaskRelations Don't save masking dependencies.
+ */ +namespace UndoFlag +{ + /* + * ### TODO: PCL 2.x: Get rid of all project depencies on UndoFlags. + */ + enum mask_type + { + DefaultMode = 0x00000000, // Save pixel data, astrometric solution and previews + PixelData = 0x00000001, // Save pixel data + RGBWS = 0x00000002, // RGB Working Space data + ICCProfile = 0x00000004, // ICC profile + Keywords = 0x00000008, // %FITS keywords + //Metadata = 0x00000010, // ### DEPRECATED - Keep unused for now, for compatibility with existing projects + FormatData = 0x00000020, // Format-specific data + ImageId = 0x00000040, // %Image identifier + Resolution = 0x00000080, // %Image resolution + AstrometricSolution = 0x00000100, // Save the current astrometric solution + All = 0x000FFFFF, // Save all data items + DeletePropertiesOnEntry = 0x01000000, // Destroy/delete non-permanent view properties before execution + DeletePropertiesOnExit = 0x02000000, // Destroy/delete non-permanent view properties after execution + ExcludePreviews = 0x80000000, // Don't save state of previews + ExcludeMaskRelations = 0x40000000 // Don't save masking dependencies + }; +} + +/*! + * \class pcl::UndoFlags + * \brief A collection of history data item specifiers. + */ +typedef Flags UndoFlags; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class ImageWindow + * \brief High-level interface to an image window object in the PixInsight core + * application. + * + * ### TODO: Write a detailed description for %ImageWindow. + * + * \sa View + */ +class PCL_CLASS ImageWindow : public UIObject +{ +public: + + /*! + * Represents a GUI working mode. Valid modes are defined in the ImageMode + * namespace. + */ + typedef ImageMode::value_type gui_mode; + + /*! + * Represents a display image channel supported by the PixInsight core + * application. Valid display channels and components are defined in the + * DisplayChannel namespace. + */ + typedef DisplayChannel::value_type display_channel; + + /*! + * Represents a mask rendering mode supported by the PixInsight core + * application. Valid mask rendering modes are defined in the MaskMode + * namespace. + */ + typedef MaskMode::value_type mask_mode; + + /*! + * Represents a transparency background brush supported by the PixInsight + * core application. Valid transparency brushes are defined in the + * BackgroundBrush namespace. + */ + typedef BackgroundBrush::value_type background_brush; + + /*! + * Represents a transparency rendering mode supported by the PixInsight core + * application. Valid transparency rendering modes are defined in the + * TransparencyMode namespace. + */ + typedef TransparencyMode::value_type transparency_mode; + + /*! + * Constructs a null image window. A null %ImageWindow does not correspond + * to an existing image window in the PixInsight core application. + */ + ImageWindow() = default; + + /*! + * Creates a new image window with the specified image parameters. + * + * \param width %Image width in pixels. Must be >= 1. There is no specific + * upper limit. + * + * \param height %Image height in pixels. Must be >= 1. There is no + * specific upper limit. + * + * \param numberOfChannels Number of channels in the image. Should not be + * less than the number of nominal channels: 1 for grayscale + * images, 3 for color images. Channels in excess of nominal + * channels are generated as alpha channels. This parameter is + * one by default. + * + * \param bitsPerSample Number of bits per sample. Supported values are + * 8, 16 and 32 for integer images; 32 and 64 for floating point + * images. This parameter is 32 by default. + * + * \param floatSample True to create a floating point image; false to + * create an integer image. This parameter is true by default. + * + * \param color True to create a RGB color image; false to create a + * grayscale image. This parameter is false by default. + * + * \param initialProcessing True if the core application should assign a + * ProcessContainer instance to hold the initial processing for + * this image. The initial processing items will be + * automatically generated by the core application as a function + * of the current processing thread context. This parameter is + * true by default. + * + * \param id Identifier for the new image. If an empty string is + * specified, the core application will assign an automatically + * generated identifier. If the specified identifier is not + * unique, the core application will make it unique by appending + * an automatically generated suffix. This parameter is an empty + * string by default. + * + * The newly created image is initialized with zero pixel sample values + * (black pixels). This includes all nominal and alpha channels. + * + * The new image window will be hidden. To make it visible on the core + * application, you must call its Show() member function explicitly. + */ + ImageWindow( int width, int height, int numberOfChannels = 1, + int bitsPerSample = 32, bool floatSample = true, bool color = false, + bool initialProcessing = true, + const IsoString& id = IsoString() ); + + ImageWindow( int width, int height, int numberOfChannels, + int bitsPerSample, bool floatSample, bool color, + bool initialProcessing, + const IsoString::ustring_base& id ) + : ImageWindow( width, height, numberOfChannels, + bitsPerSample, floatSample, color, + initialProcessing, + IsoString( id ) ) + { + } + + /*! + * Copy constructor. Constructs an %ImageWindow object as an alias of an + * existing %ImageWindow object. + * + * It cannot be overemphasized that this constructor does not create a + * new image window in the PixInsight core application. It only creates + * an \e alias object for an existing image window in the calling + * module. In all respects, the alias and aliased objects are + * completely interchangeable; their behaviors are exactly identical since + * they refer to the same server-side object. + */ + ImageWindow( const ImageWindow& w ) + : UIObject( w ) + { + } + + /*! + * Move constructor. + */ + ImageWindow( ImageWindow&& x ) + : UIObject( std::move( x ) ) + { + } + + /*! + * Destroys this %ImageWindow object. + * + * This destructor does \e not destroy the actual image window object, which + * is part of the PixInsight core application. Only the managed alias object + * living in the calling module is destroyed. + */ + virtual ~ImageWindow() + { + } + + /*! + * Copy assignment operator. Detaches this object from its previously + * referenced server-side image window and makes it an alias of the + * specified \a window. Returns a reference to this object. + * + * When this operator is used, the calling object is detached from the + * previously referenced window. Note that an image window cannot be + * destroyed when it becomes unreferenced, as it is an internal UI object + * that belongs to the core application, not to the calling module, even if + * the window has been created by the calling module. + */ + ImageWindow& operator =( const ImageWindow& window ) + { + Assign( window ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ImageWindow& operator =( ImageWindow&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Returns a reference to a null %ImageWindow instance. A null %ImageWindow + * does not correspond to an existing image window in the PixInsight core + * application. + */ + static ImageWindow& Null(); + + /*! + * Opens an image file and loads one or more images into new image windows. + * + * \param url A path specification or URL that points to an image file to + * be loaded by the PixInsight core application. The file name + * \e must include a file extension, since it is the only way to + * select a file format, necessary to read and decode images. + * + * \param id Identifier for the new image(s). If an empty string is + * specified, the application will assign an automatically + * generated identifier. If the specified identifier is not + * unique, the application will make it unique by appending an + * automatically generated suffix. This parameter is an empty + * string by default. + * + * \param formatHints A string of format hints that will be sent to the + * file format instance created to load the image. Format hints + * are useful to modify the behavior of a file format suuport + * module lo load a specific image, overriding global + * preferences and format settings. See the + * FileFormatInstance::Open() member function for more + * information on format hints. This parameter is an empty + * string by default. + * + * \param asCopy True to open the images as \e copies. The %File > Save + * command (and all related menu items) is always disabled for + * images loaded as copies in the PixInsight core application. + * This means that the only way to write an image copy is the + * %File > Save As command. This is a security enhancement to + * avoid %File > Save accidents, e.g. by pressing Ctrl+S + * inattentively. The same applies to the \c save internal + * command-line command, which requires an explicit file path + * specification for image copies. This parameter is false by + * default. + * + * \param allowMessages True to allow the core application to show + * warning message boxes (e.g., to inform about inexact read + * operations) and color management dialog boxes (upon + * ICC profile mismatches or missing ICC profiles). If this + * parameter is false, no dialog box or warning message box will + * be shown, and default actions will be taken as appropriate + * for conflicting ICC profiles. However, all warning messages + * will be sent to the processing console when this parameter is + * false. Error messages will always be shown. This parameter is + * true by default. + * + * The PixInsight core application will find and select a file format to + * read the specified image file, among the installed file format modules. + * Format selection is exclusively a function of the specified file + * extension (e.g., .fit will select the %FITS format, .tif the %TIFF + * format, .jpg for %JPEG, and so on). + * + * %File and directory paths in the PixInsight environment employ UNIX + * directory separators (the slash character, '/') on all supported + * platforms. As an exception, on Windows PCL allows you to use also DOS + * separators (backslash, '\'), but their use is discouraged since its + * support might be discontinued in future PCL versions. + * + * URLs must be valid and conform to the URI specification from RFC 3986 + * (Uniform Resource Identifier: Generic Syntax). At least the file, HTTP, + * HTTPS, FTP and FTPS protocols are supported. More protocols may be + * available, depending on PixInsight core versions. + * + * Returns an array of %ImageWindow objects. Each object in the array + * corresponds to an image loaded into a new image window from the specified + * file. In general, the returned array will contain only one object, since + * most image file formats can store just a single image. For formats that + * can store multiple images, more than one %ImageWindow can be created as a + * result of opening a single file. + * + * Newly created image windows will be hidden. To make them visible on the + * core application's workspace, you must call their ImageWindow::Show() + * member function explicitly. + */ + static Array Open( const String& url, + const IsoString& id = IsoString(), + const IsoString& formatHints = IsoString(), + bool asCopy = false, + bool allowMessages = true ); + + template + static Array Open( const String& url, + const S1& id, + const S2& formatHints, + bool asCopy = false, + bool allowMessages = true ) + { + return Open( url, IsoString( id ), IsoString( formatHints ), asCopy, allowMessages ); + } + + /*! + * Returns true iff the image in this window has not been loaded from a disk + * file, but created as a new image in the core application (e.g., by the + * NewImage standard process). + */ + bool IsNew() const; + + /*! + * Returns true iff the image in this window has been loaded from a file + * as a copy. + * + * The %File > Save command (and all related menu items) is always disabled + * for images loaded as copies in the PixInsight core application. This + * means that the only way to write an image copy is the %File > Save As + * command. This is a security enhancement to avoid %File > Save accidents, + * e.g. by pressing Ctrl+S inattentively. The same applies to the \c save + * command-line internal command, which requires an explicit file path + * specification for image copies. + */ + bool IsACopy() const; + + /*! + * Returns the full file path to the image file loaded in this image + * window, or an empty string if this window holds is a \e new image. + * + * \note When an image has been loaded from a remote location (by specifying + * a valid URL in a call to ImageWindow::Open(), for example), the returned + * path corresponds to the file that has been downloaded to the local + * filesystem upon window creation, not to the original URL. + */ + String FilePath() const; + + /*! + * Returns the URL of the remote resource from which this image has been + * downloaded, or an empty string if this window has not been downloaded + * from a remote location. + */ + String FileURL() const; + + /*! + * Returns true iff this image has been downloaded from a remote location, in + * which case the source URL can be obtained by calling FileURL(). + */ + bool HasURL() const + { + return !FileURL().IsEmpty(); + } + + /*! + * Returns an ImageOptions structure with information about the image in + * this image window. + */ + ImageOptions FileInfo() const; + + /*! + * Returns the modification counter for this image window. The + * modification counter contains the amount of changes made to the image + * since it was created, loaded from a disk file, or saved to a disk file. + */ + size_type ModifyCount() const; + + /*! + * Returns true iff the image in this image window has been modified and is + * unsaved. An image is modified if its modification counter is not zero. + */ + bool IsModified() const + { + return ModifyCount() > 0; + } + + /*! + * Requests closing this image window. Returns true if the window was + * actually closed. + * + * When an image window is closed, its image and all of its numerous + * associated resources are destroyed. The close operation is irreversible + * in PixInsight. + * + * If the image in this window is not modified, the window will be closed + * and true will be returned. + * + * If the image in this window is modified and has not been saved to a disk + * file, the PixInsight core application will ask the user if it is ok to + * throw away the changes by closing this window. If the user answers + * affirmatively, the window will be closed and this function will return + * true. If the user says no, the window will not be closed and the + * function will return false. + * + * \sa ForceClose() + */ + bool Close(); + + /*! + * Closes this image window unconditionally. The window will be closed + * immediately without asking questions, irrespective of whether the image + * or its associated metadata have been modified. + * + * \sa Close() + */ + void ForceClose(); + + /*! + * Returns the main view of this image window. + * + * The main view holds the entire image of this window. There is only one + * main view in an image window. + */ + View MainView() const; + + /*! + * Returns the current view of this image window. + * + * The current view is the view currently selected for direct user + * interaction in the core application GUI for this image window. The + * current view receives cursor and pointing device (mouse) events. + */ + View CurrentView() const; + + /*! + * Selects the specified view as the current view in this image window. + */ + void SelectView( View& ); + + /*! + * Selects the main view as the current view in this image window. + */ + void SelectMainView() + { + View v( MainView() ); SelectView( v ); + } + + /*! + * Destroys all existing properties for all views in this image window. + */ + void PurgeProperties(); + + /*! + * Returns true iff the specified view is a view of this image window, that + * is, either the main view of this image window, or one of its previews. + */ + bool IsValidView( const View& ) const; + + /*! + * Returns the number of previews currently defined in this image window. + */ + int NumberOfPreviews() const; + + /*! + * Returns true iff there are one or more previews currently defined in this + * image window. + */ + bool HasPreviews() const + { + return NumberOfPreviews() > 0; + } + + /*! + * Returns a dynamic array of View objects corresponding to the previews + * currently defined in this image window. If this window has no previews, + * an empty array is returned. + */ + Array Previews() const; + + /*! + * Finds a preview by its identifier. If the specified \a previewId + * identifier corresponds to an existing preview in this image window, it + * is returned as a View object. If no preview in this image window has the + * specified \a previewId identifier, or if this window has no previews, + * this function returns an alias of View::Null(). + */ + View PreviewById( const IsoString& previewId ) const; + + View PreviewById( const IsoString::ustring_base& previewId ) const + { + return PreviewById( IsoString( previewId ) ); + } + + /*! + * Returns true if a preview with the specified \a previewId identifier is + * currently defined in this image window; false if no preview with such + * identifier exists in this window, or if this window has no previews. + */ + bool PreviewExists( const IsoString& previewId ) const + { + return !IsNull() && !PreviewById( previewId ).IsNull(); + } + + bool PreviewExists( const IsoString::ustring_base& previewId ) const + { + return PreviewExists( IsoString( previewId ) ); + } + + /*! + * Returns the currently selected preview, or an alias of View::Null() if + * no preview is currently selected in this image window. + * + * \note The selected preview in an image window has nothing to do + * with the current view in the same image window. The selected + * preview corresponds to a selection on the main view of the window, used + * to resize and move preview rectangles, and also to perform preview + * actions (undo/redo, reset, store, restore, etc) without needing to select + * a preview as the window's current view. + */ + View SelectedPreview() const; + + /*! + * Causes this window to select the specified view as its selected + * preview. Refer to the SelectedPreview() function for further + * information on the concept of selected preview. + */ + void SelectPreview( View& ); + + /*! + * Causes this window to select the view with the specified identifier as + * its current selected preview. Refer to the SelectedPreview() + * function for further information on the concept of selected preview. + */ + void SelectPreview( const IsoString& previewId ) + { + View v( PreviewById( previewId ) ), SelectPreview( v ); + } + + void SelectPreview( const IsoString::ustring_base& previewId ) + { + SelectPreview( IsoString( previewId ) ); + } + + /*! + * Creates a new preview in this image window. Returns the newly created + * preview as a View object. + * + * Calling this function is equivalent to: + * + * \code CreatePreview( r.x0, r.y0, r.x1, r.y1, previewId ); \endcode + */ + View CreatePreview( const Rect& r, const IsoString& previewId = IsoString() ) + { + return CreatePreview( r.x0, r.y0, r.x1, r.y1, previewId ); + } + + View CreatePreview( const Rect& r, const IsoString::ustring_base& previewId ) + { + return CreatePreview( r, IsoString( previewId ) ); + } + + /*! + * Creates a new preview in this image window. Returns the newly created + * preview as a View object. + * + * \param x0,y0 Position (horizontal, vertical) of the left-top corner of + * the preview rectangle in image coordinates. + * + * \param x1,y1 Position (horizontal, vertical) of the right-bottom corner + * of the preview rectangle in image coordinates. + * + * \param previewId Preview identifier. If an empty string is specified, + * the core application will generate an automatic identifier + * for the newly created preview. If the specified identifier is + * already in use, the core application will make it unique by + * appending an automatically generated suffix. + * + * The preview rectangle must define a non-empty rectangular area + * completely included in the boundaries of the image in this window. + */ + View CreatePreview( int x0, int y0, int x1, int y1, const IsoString& previewId = IsoString() ); + + View CreatePreview( int x0, int y0, int x1, int y1, const IsoString::ustring_base& previewId ) + { + return CreatePreview( x0, y0, x1, y1, IsoString( previewId ) ); + } + + /*! + * Modifies the identifier and rectangular area properties of an existing + * preview. + * + * Calling this function is equivalent to: + * + * \code ModifyPreview( previewId, r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void ModifyPreview( const IsoString& previewId, const Rect& r, const IsoString& newId = IsoString() ) + { + ModifyPreview( previewId, r.x0, r.y0, r.x1, r.y1, newId ); + } + + void ModifyPreview( const IsoString::ustring_base& previewId, const Rect& r ) + { + ModifyPreview( IsoString( previewId ), r ); + } + + void ModifyPreview( const IsoString::ustring_base& previewId, const Rect& r, const IsoString::ustring_base& newId ) + { + ModifyPreview( IsoString( previewId ), r, IsoString( newId ) ); + } + + /*! + * Modifies the identifier and rectangular area properties of an existing + * preview. + * + * \param previewId Identifier of a preview whose properties will be + * modified. + * + * \param x0,y0 Position (horizontal, vertical) of the left-top corner of + * the new preview rectangle in image coordinates. + * + * \param x1,y1 Position (horizontal, vertical) of the right-bottom corner + * of the new preview rectangle in image coordinates. + * + * \param newId New preview identifier. If an empty string is specified, + * this function will not modify the current preview identifier. + * If the specified identifier is already in use in this window, + * the core application will make it unique by appending an + * automatically generated suffix. + * + * The preview rectangle must define a rectangular area of at least one + * pixel, completely included in the boundaries of the image in this window. + */ + void ModifyPreview( const IsoString& previewId, int x0, int y0, int x1, int y1, + const IsoString& newId = IsoString() ); + + void ModifyPreview( const IsoString::ustring_base& previewId, int x0, int y0, int x1, int y1 ) + { + ModifyPreview( IsoString( previewId ), x0, y0, x1, y1 ); + } + + void ModifyPreview( const IsoString::ustring_base& previewId, int x0, int y0, int x1, int y1, + const IsoString::ustring_base& newId ) + { + ModifyPreview( IsoString( previewId ), x0, y0, x1, y1, IsoString( newId ) ); + } + + /*! + * Returns the rectangular area in image coordinates of a preview with the + * specified \a previewId identifier. + * + * If no preview is defined in this window with the specified identifier, + * this function returns an empty rectangle. + */ + Rect PreviewRect( const IsoString& previewId ) const; + + Rect PreviewRect( const IsoString::ustring_base& previewId ) const + { + return PreviewRect( IsoString( previewId ) ); + } + + /*! + * Destroys an existing preview in this window and frees all of its + * associated view resources. + * + * \param previewId Identifier of the preview that will be destroyed. + * + * The PixInsight core application might ask the user for permission before + * attempting to destroy a preview in an image window. + */ + void DeletePreview( const IsoString& previewId ); + + void DeletePreview( const IsoString::ustring_base& previewId ) + { + DeletePreview( IsoString( previewId ) ); + } + + /*! + * Destroys all previews in this image window. + * + * The PixInsight core application reserves the right to ask the user for + * permission before attempting to destroy all previews in an image window. + */ + void DeletePreviews(); + + /*! + * Retrieves the pixel sample data format used by the image in this window. + * + * \param[out] bitsPerSample On output, will be equal to the number of + * bits per sample in the image in this window. Can be 8, 16 or + * 32 for an integer image; 32 or 64 for a floating point image. + * + * \param[out] floatSample On output, will be true if the image in this + * window uses floating point samples; false if it uses integer + * samples. + */ + void GetSampleFormat( int& bitsPerSample, bool& floatSample ) const; + + /*! + * Converts the image in this window to the specified sample data format. + * + * \param bitsPerSample Number of bits per sample. Can be 8, 16 or 32 for + * an integer image; 32 or 64 for a floating point image. + * + * \param floatSample True to transform this image to a floating point + * data format; false to transform this image to an integer data + * format. + * + * This function does nothing if the image in this window already has the + * specified sample data format. + */ + void SetSampleFormat( int bitsPerSample, bool floatSample ); + + /*! + * Returns the image window that is currently acting as a mask for this + * window, or ImageWindow::Null() if this window has no assigned mask. + */ + ImageWindow Mask() const; + + /*! + * Selects an image as the current mask for this image window. + * + * \param w Reference to an image window whose image will be selected as + * a mask for this window. + * + * \param inverted True to activate mask inversion. + */ + void SetMask( ImageWindow& w, bool inverted = false ); + + /*! + * Removes the current mask selection of this image window. + */ + void RemoveMask() + { + SetMask( Null() ); + } + + /*! + * Returns true iff mask inversion is currently active for this image window. + */ + bool IsMaskInverted() const; + + /*! + * Activates or deactivates mask inversion for this image window. + */ + void InvertMask( bool invert = true ) + { + ImageWindow mask = Mask(); + SetMask( mask, invert ); + } + + /*! + * Returns true iff the mask is current enabled for this image window. + */ + bool IsMaskEnabled() const; + + /*! + * Enables the mask of this image window. + */ + void EnableMask( bool = true ); + + /*! + * Disables the mask of this image window. + */ + void DisableMask( bool disable = true ) + { + EnableMask( !disable ); + } + + /*! + * Returns true iff the mask is currently visible for this image window. + */ + bool IsMaskVisible() const; + + /*! + * Shows the mask of this image window, i.e. enables mask visibility. + */ + void ShowMask( bool = true ); + + /*! + * Hides the mask of this image window, i.e. disables mask visibility. + */ + void HideMask( bool hide = true ) + { + ShowMask( !hide ); + } + + /*! + * Returns true iff a specified image window could be selected as a mask for + * this image window. + * + * For a given image \a M to be a valid mask for an image \a I: + * + * \li Both \a I and \a M must have identical dimensions. + * \li If \a I is a RGB color image, \a M can be either a grayscale image + * or a RGB color image. + * \li If \a I is a grayscale image, \a M must be also a grayscale image. + */ + bool IsMaskCompatible( const ImageWindow& ); + + /*! + * Returns true iff this image window is acting as a mask for other image + * window(s). + */ + bool HasMaskReferences() const; + + /*! + * Removes all mask references for this image window. + * + * All images that were masked by this window will be unmasked after calling + * this function. Use it with great care, since removing masking relations + * without direct user intervention is potentially dangerous. + */ + void RemoveMaskReferences(); + + /*! + * Updates the screen renditions of all visible image windows that are + * currently masked by this window. This includes only masked image windows + * with enabled mask visibility. + */ + void UpdateMaskReferences(); + + /*! + * Obtains a copy of the RGB working space (RGBWS) associated with this + * image window. + * + * \param[out] rgbws Reference to an object where the parameters of the + * current RGBWS in this window will be copied. + */ + void GetRGBWS( RGBColorSystem& rgbws ) const; + + /*! + * Sets the RGB working space (RGBWS) for this image window. + * + * \param rgbws Reference to a RGBWS that will be associated with this + * image window. + */ + void SetRGBWS( const RGBColorSystem& rgbws ); + + /*! + * Returns true iff this image window is associated with the global RGB + * working space (RGBWS). + * + * See the documentation for GetGlobalRGBWS() for a description of the + * global RGBWS in PixInsight. + */ + bool UsingGlobalRGBWS() const; + + /*! + * Associates this image window with the global RGB working space. + * + * See the documentation for GetGlobalRGBWS() for a description of the + * global RGBWS in PixInsight. + */ + void UseGlobalRGBWS(); + + /*! + * Obtains a copy of the current global RGB working space (RGBWS) in the + * PixInsight core application. + * + * \param[out] rgbws Reference to an object where the parameters of the + * current global RGBWS will be copied. + * + * The global RGBWS is the default RGBWS that is associated with newly + * created image windows (both as new images and when images are loaded + * from disk files). Global RGBWS parameters can be modified by the user + * through the standard RGBWorkingSpace process in the core application. + */ + static void GetGlobalRGBWS( RGBColorSystem& rgbws ); + + /*! + * Sets the parameters of the global RGB working space (RGBWS) in the core + * PixInsight application. + * + * \param rgbws Reference to an object whose parameters will be copied to + * the global RGBWS. + * + * See the documentation for GetGlobalRGBWS() for a description of the + * global RGBWS in PixInsight. + */ + static void SetGlobalRGBWS( const RGBColorSystem& rgbws ); + + /*! + * Returns true iff color management is active for this image window. + */ + bool IsColorManagementEnabled() const; + + /*! + * Enables color management for this image window. + * + * Color management uses ICC profiles for this image (either a profile + * associated with this image or a global profile) and the monitor device to + * control how this image is rendered on the screen. Color management + * transformations are applied to yield a visual representation that takes + * into account the actual meaning of numerical pixel sample values, + * considering the chromatic responses of the screen and of the devices and + * color spaces that have originated this image. + * + * If color management is disabled for an image, its pixel sample values are + * sent directly to the screen, avoiding ICC profile transformations. This + * improves output performance, but may give a false representation of the + * image on the screen. + * + * If this image window is visible, its screen rendition is updated + * immediately after calling this function. + */ + void EnableColorManagement( bool = true ); + + /*! + * Disables color management for this image window. + * + * See the documentation for EnableColorManagement() for additional + * information on color management in PixInsight. + * + * If this image window is visible, its screen rendition is updated + * immediately after calling this function. + */ + void DisableColorManagement( bool disable = true ) + { + EnableColorManagement( !disable ); + } + + /*! + * Returns true iff soft-proofing is currently enabled for this + * image window. + */ + bool IsProofingEnabled() const; + + /*! + * Enables soft-proofing for this image window. + * + * Color proofing is used to emulate an output device (usually a printer) on + * the screen. Proofing requires three ICC profiles: the image profile + * (either an embedded profile or the default profile), the monitor profile, + * and a proofing profile that describes the emulated device. Color + * proofing is useful to preview the final printed result without rendering + * images to physical media. + * + * If this image window is visible and has color management enabled, its + * screen rendition is updated immediately after calling this function. + */ + void EnableProofing( bool = true ); + + /*! + * Disables soft-proofing for this image window. + * + * See the documentation for EnableProofing() for additional information on + * color proofing. + * + * If this image window is visible and has color management enabled, its + * screen rendition is updated immediately after calling this function. + */ + void DisableProofing( bool disable = true ) + { + EnableProofing( !disable ); + } + + /*! + * Returns true iff the gamut check soft-proofing feature is + * currently enabled for this image window. + */ + bool IsGamutCheckEnabled() const; + + /*! + * Enables the gamut check proofing feature for this image window. + * + * The gamut check feature represents out-of-gamut colors (i.e., + * colors that are not defined in the color space of the image) with a + * special color (selectable via global color management preferences) for + * quick visual detection. + * + * If this image window is visible, has color management enabled, and has + * proofing enabled, its screen rendition is updated immediately after + * calling this function. If color proofing is disabled, calling this + * function has no effect. + */ + void EnableGamutCheck( bool = true ); + + /*! + * Disables the gamut check proofing feature for this image window. + * + * See the documentation for EnableGamutCheck() for additional information + * on the gamut check color proofing feature. + * + * If this image window is visible, has color management enabled, and has + * proofing enabled, its screen rendition is updated immediately after + * calling this function. If color proofing is disabled, calling this + * function has no effect. + */ + void DisableGamutCheck( bool disable = true ) + { + EnableGamutCheck( !disable ); + } + + /*! + * Allows enabling or disabling all color management features at once. + * + * \param cmEnabled Enables (if true) or disables (if false) color + * management for this image window. + * + * \param proofing Enables (if true) or disables (if false) + * soft-proofing for this image window. + * + * \param gamutCheck Enables (if true) or disables (if false) the + * gamut check proofing feature for this image window. + * The state of this argument has no meaning if the + * \a proofing parameter is false. + * + * If this image window is visible, its screen rendition is updated + * immediately after calling this function. + */ + void SetColorManagementFeatures( bool cmEnabled, bool proofing, bool gamutCheck ); + + /*! + * Obtains a copy of the current ICC profile associated with this image. + * + * \param[out] icc Reference to an object where a copy of the current ICC + * profile in this image will be stored. + */ + bool GetICCProfile( ICCProfile& icc ) const; + + /*! + * Sets the current ICC profile for this image window as a copy of an + * existing ICC profile. + * + * \param icc Reference to an object that will be used to set the current + * ICC profile for this image. + * + * If this image window is visible and has color management enabled, its + * screen rendition is updated immediately after calling this function. + */ + void SetICCProfile( const ICCProfile& icc ); + + /*! + * Sets the current ICC profile for this image window as a copy of an + * ICC profile loaded from a disk file. + * + * \param filePath A file path specification to an ICC profile that will + * be loaded and copied to the ICC profile of this image window. + * + * If this image window is visible and has color management enabled, its + * screen rendition is updated immediately after calling this function. + */ + void SetICCProfile( const String& filePath ); + + /*! + * Causes this image window to be associated with the default ICC profile + * globally defined in the PixInsight core application. + * + * If this image window has its own associated ICC profile, this funtion + * destroys it and frees its allocated space. + * + * If this image window is visible and has color management enabled, its + * screen rendition is updated immediately after calling this function. + */ + void DeleteICCProfile(); + + /*! + * Returns a copy of the %FITS header keywords currently defined for the + * image in this window. Returns an empty array if this image has no %FITS + * keywords. + */ + FITSKeywordArray Keywords() const; + + /*! + * Obtains a copy of the %FITS header keywords currently defined for the + * image in this window. Returns true if this image has %FITS keywords. + * + * \param[out] keywords Reference to a container that will receive a copy of + * the %FITS keywords defined in this image. + * + * \deprecated This member function has been deprecated. It is left only to + * keep existing code working. Use Keywords() in newly produced code. + */ + bool GetKeywords( FITSKeywordArray& keywords ) const + { + keywords = Keywords(); + return !keywords.IsEmpty(); + } + + /*! + * Sets the %FITS header keywords for this image as a copy of the set of + * keywords in the specified container. + * + * \param keywords Reference to a %FITS keyword array whose contents will + * be copied to the list of %FITS keywords of this image. + * + * The previous set of %FITS keywords in this image, if any, is lost and + * replaced by the specified set. + */ + void SetKeywords( const FITSKeywordArray& keywords ); + + /*! + * Deletes all existing %FITS header keywords in this image window. + */ + void ResetKeywords(); + + /*! + * Returns true iff this image window has a valid astrometric solution. + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + bool HasAstrometricSolution() const; + + /*! + * Attempts to reconstruct the astrometric solution associated with this + * image from existing metadata and image properties. + * + * \param allowGUIMessages Whether to report possible error and warning + * messages through message boxes and other + * graphical resources that may block the core + * application's event loop. If this parameter is + * false, warning and error messages will only be + * shown on the process console. True by default. + * + * \param notify Whether to notify the platform on the property + * changes. This is true by default. + * + * Returns true iff a valid astrometric solution has been built for this + * image window. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + bool RegenerateAstrometricSolution( bool allowGUIMessages = true, bool notify = true ); + + /*! + * Removes an existing astrometric solution from this image window. + * + * \param notify Whether to notify the platform on the property changes. + * This is true by default. + * + * If the image has no valid astrometric solution, calling this member + * function has no effect. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + void ClearAstrometricSolution( bool notify = true ); + + /*! + * Updates the set of FITS header keywords and image properties of this + * image with metadata defining its current astrometric solution. + * + * \param notify Whether to notify the platform on the property changes. + * This is true by default. + * + * If the image has no valid astrometric solution, calling this member + * function has no effect. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + void UpdateAstrometryMetadata( bool notify = true ); + + /*! + * Converts the specified \a x and \a y coordinates from the image + * coordinate system to celestial equatorial coordinates. + * + * If the window has a valid astrometric solution and the image-to-celestial + * coordinate transformation succeeds, the values of the specified \a x and + * \a y variables are replaced with the corresponding right ascension and + * declination, respectively, and the function returns true. Right ascension + * and declination are provided expressed in degrees in the ranges [0,360) + * (if \a rawRA is false; see below) and [-90,+90], respectively. Note that + * both input image and output equatorial coordinates can legally be outside + * image bounds. Output equatorial coordinates will be referred to the + * reference system of the astrometric solution associated with this image + * window (ICRS or GCRS). + * + * If \a rawRA is true, the output right ascension is \e not constrained to + * the [0,360) range. This is useful for interpolation schemes where + * discontinuities caused by zero crossings in right ascension, i.e. abrupt + * changes from 360 to 0 degrees, are not admissible numerically. Right + * ascensions returned by this function when \a rawRA = true is specified + * can be larger than 360 degrees or less than zero, ensuring smooth + * transitions. + * + * If the window has no valid astrometric solution, or if the coordinate + * transformation cannot be performed, the \a x and \a y variables are not + * modified and the function returns false. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + bool ImageToCelestial( double& x, double& y, bool rawRA = false ) const; + + /*! + * Converts the specified point \a pI from the image coordinate system to + * celestial equatorial coordinates. + * + * If the conversion is successful, the computed right ascension and + * declination in degrees are stored in the \a pRD.x and \a pRD.y + * coordinates, respectively, and the function returns true. Otherwise the + * point \a pRD is not modified and the function returns false. + * + * See ImageToCelestial( double&, double&, bool ) const for complete + * information. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + template + bool ImageToCelestial( DPoint& pRD, const GenericPoint& pI, bool rawRA = false ) const + { + DPoint qI( double( pI.x ), double( pI.y ) ); + if ( ImageToCelestial( qI.x, qI.y, rawRA ) ) + { + pRD = qI; + return true; + } + return false; + } + + /*! + * Converts the specified \a ra and \a dec coordinates, expressed in + * degrees, from celestial equatorial coordinates to the image coordinate + * system. + * + * If the window has a valid astrometric solution and the celestial-to-image + * coordinate transformation succeeds, the values of the specified \a ra and + * \a dec variables are replaced with the corresponding \a x and \a y image + * coordinates, respectively, expressed in pixels. Note that both input + * equatorial and output image coordinates can legally be outside image + * bounds. Input equatorial coordinates are assumed to be referred to the + * reference system of the astrometric solution associated with this image + * window (ICRS or GCRS). + * + * If the window has no valid astrometric solution, or if the coordinate + * transformation cannot be performed, the \a ra and \a dec variables are + * not modified and the function returns false. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + bool CelestialToImage( double& ra, double& dec ) const; + + /*! + * Converts the specified point \a pRD from celestial equatorial coordinates + * in degrees to the image coordinate system. + * + * If the conversion is successful, the computed \a x and \a y image + * coordinates in pixels are stored in the \a pI.x and \a pI.y members, + * respectively, and the function returns true. Otherwise the point \a pI is + * not modified and the function returns false. + * + * See CelestialToImage( double&, double& ) const for detailed information. + * + * \ingroup astrometry_support + * \sa AstrometricMetadata + */ + bool CelestialToImage( DPoint& pI, const DPoint& pRD ) const + { + DPoint qI = pRD; + if ( CelestialToImage( qI.x, qI.y ) ) + { + pI = qI; + return true; + } + return false; + } + + /*! + * Gets the current image resolution parameters in this image window. + * + * \param[out] xRes Reference to a variable where the horizontal resolution + * will be stored. + * + * \param[out] yRes Reference to a variable where the vertical resolution + * will be stored. + * + * \param[out] metric Reference to a variable whose stored value will + * indicate the current resolution units in this image window. + * If this variable is true, resolution is expressed in pixels + * per centimeter; if it is false, resolution is expressed in + * pixels per inch. + * + * Resolution is expressed in pixels per resolution unit (centimeter if + * \a metric is true; inch if \a metric is false). + */ + void GetResolution( double& xRes, double& yRes, bool& metric ) const; + + /*! + * Sets image resolution parameters for this image window. + * + * \param xRes Horizontal resolution in pixels per resolution unit. + * Must be > 0. + * + * \param yRes Vertical resolution in pixels per resolution unit. + * Must be > 0. + * + * \param metric Indicates the resolution unit in which resolution is + * expressed for both axes. If this parameter is true, + * resolution is expressed in pixels per centimeter; if it is + * false, resolution is in pixels per inch. + */ + void SetResolution( double xRes, double yRes, bool metric = false ); + + /*! + * Sets equal image resolution parameters for both axes in this image + * window. + * + * \param r Resolution in pixels per resolution unit. This value is to be + * applied to both axes (horizontal, vertical) of the image in + * this window. + * + * \param metric Indicates the resolution unit in which resolution is + * expressed. If this parameter is true, resolution is expressed + * in pixels per centimeter; if it is false, resolution is in + * pixels per inch. + */ + void SetResolution( double r, bool metric = false ) + { + SetResolution( r, r, metric ); + } + + /*! + * Gets the current default image resolution parameters. + * + * \param[out] xRes Reference to a variable where the default horizontal + * resolution will be stored. + * + * \param[out] yRes Reference to a variable where the default vertical + * resolution will be stored. + * + * \param[out] metric Reference to a variable whose stored value will + * indicate the current default resolution units. If this + * variable is true, default resolution is expressed in pixels + * per centimeter; if it is false, resolution is expressed in + * pixels per inch. + * + * Resolution is expressed in pixels per resolution unit (centimeter if + * \a metric is true; inch if \a metric is false). + * + * Default resolution parameters are applied to all newly created images in + * the PixInsight core application. + */ + static void GetDefaultResolution( double& xRes, double& yRes, bool& metric ); + + /*! + * Returns true iff default ICC profile embedding is globally enabled for RGB + * images in the PixInsight core application. + * + * Modules implementing file format support may call this function to + * provide coherent default states for ICC profile embedding selectable + * options in their interfaces; e.g. "Embed ICC Profile" check boxes on + * format options dialogs presented to the user during file write + * operations. However, the PixInsight core application always provides + * coherent default states for all embedding flags to all modules, so this + * function is not frequently used. + */ + static bool IsDefaultICCProfileEmbeddingEnabledForRGBImages(); + + /*! + * Returns true iff default ICC profile embedding is globally enabled for + * grayscale images in the PixInsight core application. + * + * Modules implementing file format support may call this function to + * provide coherent default states for ICC profile embedding selectable + * options in their interfaces; e.g. "Embed ICC Profile" check boxes on + * format options dialogs presented to the user during file write + * operations. However, the PixInsight core application always provides + * coherent default states for all embedding flags to all modules, so this + * function is not frequently used. + */ + static bool IsDefaultICCProfileEmbeddingEnabledForGrayscaleImages(); + + /*! + * Returns true iff default thumbnail embedding is globally enabled in the + * PixInsight core application. + * + * Modules implementing file formats should call this function to provide + * coherent default states for thumbnail embedding selectable options in + * their interfaces; e.g. "Embed Thumbnail" check boxes on dialogs presented + * to the user to gather file and format-specific options during file write + * operations. + */ + static bool IsDefaultThumbnailEmbeddingEnabled(); + + /*! + * Returns true iff default properties embedding is globally enabled in the + * PixInsight core application. + * + * Modules implementing file formats should call this function to provide + * coherent default states for properties embedding selectable options in + * their interfaces; e.g. "Embed Properties" check boxes on dialogs + * presented to the user to gather file and format-specific options during + * file write operations. + */ + static bool IsDefaultPropertiesEmbeddingEnabled(); + + /*! + * Returns the current list of directories for storage of swap image files. + * + * Swap files are generated and maintained by the PixInsight core + * application to store temporary image data. By default, the returned list + * contains a single string with the system's temporary storage directory + * (usually the value of the TEMP or TMP environmental variables). + * + * When the returned list contains two or more directories, PixInsight uses + * parallel disk I/O operations to store and retrieve swap files on separate + * physical devices, which greatly improves performance of history traversal + * operations (as undo/redo operations). + */ + static StringList SwapDirectories(); + + /*! + * Attempts to set a new list of directories for storage of swap files. + * + * To be able to set a new list of directories for swap file storage, a + * module must have enough privileges to change global settings on the + * PixInsight platform. If the calling module has insufficient privileges, + * this function returns false and no changes are done. + * + * The specified list can contain zero or more path specifications to + * existing directories. If more than one directory is specified, all of + * them must be supported by different \e physical devices (usually hard + * disks) on the system. Read the documentation for the + * ImageVariant::WriteSwapFiles() member function for more information about + * parallel disk I/O operations and their associated risks. + * + * If the specified list is empty, the PixInsight platform will perform a + * reset of the swap directories list to its default settings. This usually + * means that all swap files will be generated and maintained on the + * system's temporary storage directory (the value of the TEMP or TMP + * environmental variables by default) using single-threaded disk I/O + * operations. + */ + static bool SetSwapDirectories( const StringList& directories ); + + /*! + * Returns the current cursor tolerance in viewport coordinates, as + * globally established in the PixInsight core application. + * + * This value is the threshold distance in pixels, in viewport coordinates, + * used to activate actions based on object proximity. + * + * For example, if an interface implements an interactive procedure for + * resizing a rectangle based on mouse movement events, when the mouse + * cursor gets closer to a given side of the rectangle by less than the + * current cursor tolerance, the cursor shape should be changed to give + * feedback to the user; e.g. to a double arrow shape corresponding to the + * side being resized. + */ + static int CursorTolerance(); + + /*! + * Returns the current GUI working mode in the PixInsight core application. + * + * The returned value can be identified with the symbolic constants defined + * in the ImageMode namespace. + */ + static gui_mode CurrentMode(); + + /*! + * Sets the current GUI working mode in the PixInsight core application. + * + * \param mode Specifies the new GUI mode. Supported modes are identified + * through symbolic constants defined in the ImageMode namespace. + * + * Not all GUI modes are valid in all contexts. For example, if the current + * view is a preview, the New Preview mode cannot be selected. If the + * specified mode is not currently valid, this function is simply ignored. + */ + static void SelectMode( gui_mode mode ); + + /*! + * Returns the current display channel in the core application's GUI. + * + * The returned value can be identified with the symbolic constants defined + * int the DisplayChannel namespace. + */ + display_channel CurrentChannel() const; + + /*! + * Returns true iff the current display channel (in the core application) + * corresponds to an alpha channel of the image in the current view. + */ + bool IsAlphaChannelDisplayed() const + { + return CurrentChannel() >= DisplayChannel::Alpha; + } + + /*! + * Returns the alpha channel index displayed for the image in the + * current view. If the current display channel does not correspond to an + * alpha channel, a negative integer value is returned. + * + * Alpha channel indices are relative to the first alpha channel in an + * image. For example, the first alpha channel is always indexed as alpha + * channel #0, and so on. + */ + int CurrentAlphaChannel() const + { + return CurrentChannel() - DisplayChannel::Alpha; + } + + /*! + * Selects the current display channel in the core application's GUI. + * + * \param c Specifies the new display channel. Supported display channels + * are identified through symbolic constants defined in the + * DisplayChannel namespace. + * + * Not all display channels are valid for all images in all contexts. For + * example, if the image in the current view is a grayscale image, the only + * valid display channels are the combined RGB/K channel + * (DisplayChannel::RGBK) and, if the image has \a n alpha channels, values + * in the range DisplayChannel::Alpha to DisplayChannel::Alpha+n-1. If an + * invalid display channel is specified, this function is simply ignored. + */ + void SelectChannel( display_channel c ); + + /*! + * Returns the current mask rendering mode for this image window. + * + * Supported mask rendering modes are defined in the MaskMode namespace. + */ + mask_mode MaskMode() const; + + /*! + * Sets the current mask rendering mode for this image window. + * + * \param mode Specifies the new mode that will be used to render + * masks. Supported mask rendition modes are identified + * through symbolic constants defined in the + * MaskMode namespace. + */ + void SetMaskMode( mask_mode mode ); + + /*! + * Returns the current transparency background brush and its foreground and + * background colors in the core application's GUI. + * + * \param[out] fgColor The foreground color of the background brush. + * \param[out] bgColor The background color of the background brush. + * + * The returned value can be identified with the symbolic constants defined + * int the BackgroundBrush namespace. + * + * The obtained colors are AARRGGBB values. The alpha values are always + * 0xff, since the background brush cannot be transparent. + * + * In PixInsight, pixel opacity is defined by the first alpha channel of the + * image: a pixel is opaque if the corresponding alpha channel value is + * white; a pixel is completely transparent if the corresponding alpha value + * is black. Intermediate alpha values define semitransparent pixels. + * + * The background brush is a two-color brush used to render transparent + * regions of images. It is a global object used for all images in the + * PixInsight core application. + */ + static background_brush GetBackgroundBrush( uint32& fgColor, uint32& bgColor ); + + /*! + * Sets the transparency background brush in the core application's GUI. + * + * \param brush Specifies the new background brush that will be used + * to render transparent regions of images. Supported + * background brushes are identified through symbolic + * constants defined in the BackgroundBrush namespace. + * + * \param fgColor New foreground color for the background brush. If zero is + * specified (the default value), the current foreground + * color will not be changed. + * + * \param bgColor New background color for the background brush. If zero is + * specified (the default value), the current background + * color will not be changed. + * + * For a definition of background brushes and their meaning in PixInsight, + * see the documentation of GetBackgroundBrush(). + * + * \note If no foreground and background colors are specified, this + * function will not change the current background brush colors. This is + * because the corresponding function arguments default to zero. + */ + static void SetBackgroundBrush( background_brush brush, uint32 fgColor = 0, uint32 bgColor = 0 ); + + /*! + * Returns the current transparency rendering mode for this image window. + * + * Supported transparency modes are defined in the TransparencyMode + * namespace. + */ + transparency_mode TransparencyMode() const; + + /*! + * Returns the color to be used in this image window to render transparent + * image regions, when the transparency mode is TransparencyMode::Color. + * + * The returned color is an AARRGGBB value. The alpha value is always 0xff, + * since the transparency background cannot be transparent. + */ + RGBA TransparencyColor() const; + + /*! + * Returns true iff transparent image areas are currently visible for this + * image window. + * + * Transparencies are visible if the current rendering mode is not + * TransparencyMode::Hide. + */ + bool IsTransparencyVisible() const + { + return TransparencyMode() != pcl::TransparencyMode::Hide; + } + + /*! + * Sets the current transparency rendering mode for this image window. + * + * \param mode Specifies the new mode that will be used to render + * transparent regions of images. Supported transparency + * modes are identified through symbolic constants defined in + * the TransparencyMode namespace. + * + * \param color New color that will be used when the transparency mode is + * TransparencyMode::Color. If zero is specified (the default + * value), the current color will not be changed. + */ + void SetTransparencyMode( transparency_mode mode, RGBA color = 0 ); + + /*! + * Disables transparency renditions for this image window. + * + * Calling this function is equivalent to: + * + * \code SetTransparencyMode( pcl::TransparencyMode::Hide ); \endcode + */ + void HideTransparency() + { + SetTransparencyMode( pcl::TransparencyMode::Hide ); + } + + /*! + * Sets new viewport central location coordinates and zoom factor for this + * image window. + * + * \param cx,cy Position (horizontal, vertical) of the new central + * viewport location in image coordinates. + * + * \param zoom New viewport zoom factor. Positive zoom factors are + * interpreted as magnifying factors; negative zoom factors + * are reduction factors: + * + *
+    * Zoom Factor    Screen Zoom (screen pixels : image pixels)
+    * ===========    ==========================================
+    *      0               Current zoom factor (no change)
+    *   1 or -1            1:1 (actual pixels)
+    *      2               2:1 (x2 magnification)
+    *      3               3:1 (x3 magnification)
+    *     ...
+    *     -2               1:2 (1/2 reduction)
+    *     -3               1:3 (1/3 reduction)
+    *     ...
+    * 
+ * + * A zoom factor of -1 should not be used explicitly; it is a + * reserved value for internal use, and there is no guarantee + * that future versions of PCL continue accepting it. + * + * If the specified viewport location cannot correspond to the viewport + * central position with the specified zoom factor, the nearest image + * coordinates are always selected automatically. For example, if you + * pass image coordinates \a cx=0 and \a cy=0 as arguments to this function, + * the GUI will set the viewport center to the necessary image location in + * order to display the upper left corner of the image just at the upper + * left corner of the viewport. + * + * If the \a zoom argument is not specified, the current zoom factor of the + * active view is not changed since the default value of this parameter is + * zero; see the table above. + * + * If this image window is visible, calling this function causes an + * immediate regeneration of the screen rendition for the visible viewport + * region. This includes regeneration of screen renditions depending on + * active dynamic interfaces. + */ + void SetViewport( double cx, double cy, int zoom = 0 ); + + /*! + * Sets new viewport central location and zoom factor for this image + * window. + * + * Calling this function is equivalent to: + * + * \code SetViewport( center.x, center.y, int ); \endcode + * + * See the documentation for SetViewport( double, double, int ). + */ + void SetViewport( const DPoint& center, int zoom = 0 ) + { + SetViewport( center.x, center.y, zoom ); + } + + /*! + * Adjusts this image window to the minimum size required to show the entire + * image at the current zoom factor or, if that cannot be achieved, to show + * the maximum possible portion of the image without exceeding the visible + * area of its parent workspace in the core application's GUI. + * + * This function will move the window on its parent workspace only if it is + * strictly necessary. + */ + void FitWindow(); + + /*! + * Selects the largest viewport zoom factor that allows showing the entire + * image in this image window, changing its size as necessary, but not its + * position on its parent workspace. + * + * \param optimalFit If true, the PixInsight core application will try to + * find an optimal zoom factor to fit the entire image + * window within the visible area of its parent + * workspace without causing too much obstruction of + * sibling windows and icons. This option is enabled by + * default. + * + * \param allowMagnification If false, this function will not select a zoom + * factor greater than one, even if doing so would be + * possible for this window without exceeding the + * visible area of its parent workspace. This option is + * true by default. + * + * \param allowAnimations If false, no graphical animation effects (such + * as fading effects) will be applied to the image + * window when resized, bypassing global preferences + * settings. Animations are enabled by default. + * + * \param noLimits If true, the window will be resized ignoring the + * current maximization limit set for its parent + * workspace, making possible to occupy the entire + * visible area of the workspace, just to the limits of + * the main application window. This option is disabled + * by default. + */ + void ZoomToFit( bool optimalFit = true, + bool allowMagnification = true, + bool allowAnimations = true, + bool noLimits = false ); + + /*! + * Returns the current zoom factor in the viewport of this image window. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + int ZoomFactor() const; + + /*! + * Sets the zoom factor for the viewport in this image window to the + * specified value \a z. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void SetZoomFactor( int z ); + + /*! + * Increments the current zoom factor for the viewport in this image window. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void ZoomIn() + { + int z = ZoomFactor() + 1; + SetZoomFactor( (z > 0) ? z : +1 ); + } + + /*! + * Decrements the current zoom factor for the viewport in this image window. + * + * To learn how zoom factors are interpreted in PixInsight, see the + * documentation for SetViewport( double, double, int ). + */ + void ZoomOut() + { + int z = ZoomFactor() - 1; + SetZoomFactor( (z > 0 || z < -1) ? z : -2 ); + } + + /*! + * Gets the current sizes of the viewport in this image window. + * + * \param[out] width Reference to a variable where the viewport width in + * pixels will be stored. + * + * \param[out] height Reference to a variable where the viewport height in + * pixels will be stored. + * + * The provided sizes represent the entire image in this image window, as + * represented on its viewport after applying the current zoom factor. + * Viewport sizes can also be thought of as the available navigation ranges + * in an image window. + */ + void GetViewportSize( int& width, int& height ) const; + + /*! + * Gets the current width of the viewport in this image window. + */ + int ViewportWidth() const + { + int w, dum; + GetViewportSize( w, dum ); + return w; + } + + /*! + * Gets the current height of the viewport in this image window. + */ + int ViewportHeight() const + { + int dum, h; + GetViewportSize( dum, h ); + return h; + } + + /*! + * Returns the current viewport position in this image window. + * + * The viewport position corresponds to the viewport coordinates of the + * upper left corner of the visible viewport region. These + * coordinates can be negative if the represented image is smaller than the + * size of the viewport control, that is, when the extended viewport + * space is visible around the screen rendition of the image. + */ + Point ViewportPosition() const; + + /*! + * Sets the viewport position in this image window to the specified \a x + * and \a y viewport coordinates. + * + * If this image window is visible, calling this function causes an + * immediate regeneration of the screen rendition for the visible viewport + * region. This includes regeneration of screen renditions depending on + * active dynamic interfaces. + */ + void SetViewportPosition( int x, int y ); + + /*! + * Sets the viewport position in this image window to the specified + * position \a p in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code SetViewportPosition( p.x, p.y ); \endcode + */ + void SetViewportPosition( const Point& p ) + { + SetViewportPosition( p.x, p.y ); + } + + /*! + * Gets the current visible viewport region in this image window. + * + * The returned rectangle corresponds to the visible region of the image in + * viewport coordinates. It depends on the current viewport zoom factor and + * on the positions of the viewport's scroll bars, if they are visible. + */ + Rect VisibleViewportRect() const; + + /*! + * Returns the width in pixels of the current visible viewport region in + * this image window. + */ + int VisibleViewportWidth() const + { + return VisibleViewportRect().Width(); + } + + /*! + * Returns the height in pixels of the current visible viewport region in + * this image window. + */ + int VisibleViewportHeight() const + { + return VisibleViewportRect().Height(); + } + + /*! + * Returns true iff this image window is currently visible. + */ + bool IsVisible() const; + + /*! + * Shows this image window on its parent workspace. + * + * \param fitWindow If true, this function will call ZoomToFit() with + * default parameters after showing the window on its + * parent workspace. This is useful to ensure that a + * newly created image window will be displayed + * optimally as soon as it is shown for the first time. + * This option is enabled by default. + * + * Image windows are normally visible in PixInsight. Under normal working + * conditions, an image window can only be hidden if it has never been shown + * since it was created, or if it has been hidden explicitly, which can only + * happen programmatically. + */ + void Show( bool fitWindow = true ); + + /*! + * Hides this image window if it is currently visible on its parent + * workspace. + */ + void Hide(); + + /*! + * Returns true iff this image window is iconic. + */ + bool IsIconic() const; + + /*! + * Iconizes this image window. + */ + void Iconize(); + + /*! + * Deiconizes this image window, if it was previously iconized. + */ + void Deiconize(); + + /*! + * Brings this image window to the top of the stack of image windows in its + * parent workspace of the PixInsight core application's GUI. + * + * Calling this function implicitly shows this image window, if it was + * previously hidden or iconized. If this window is a child of the current + * workspace, calling this function also activates it and gives it the + * keyboard focus. + */ + void BringToFront(); + + /*! + * Pushes this image window to the bottom of the stack of image windows in + * its parent workspace of the PixInsight core application's GUI. + * + * If this is the only visible image window in its parent workspace, calling + * this function has no effect. If there are more visible image windows in + * the parent workspace and it is the current workspace, calling this + * function implicitly deactivates this image window and gives the keyboard + * focus to the new topmost image window in the window stack. + */ + void SendToBack(); + + /*! + * Returns true iff a dynamic session is currently active in the core + * PixInsight application. + * + * A dynamic session is active if there is a processing interface working + * in dynamic mode, and one or more views have been selected by the active + * dynamic interface as dynamic targets. + */ + static bool IsDynamicSessionActive(); + + /*! + * Returns a pointer to the current active dynamic interface. + * + * The active dynamic interface is the interface that has been activated in + * dynamic mode. + * + * \warning Note that the returned pointer could point to an object that has + * not been created by the calling module; this is what we call a + * foreign object in the PixInsight/PCL framework. If a pointer to + * a foreign interface is returned by this function, the calling module + * cannot use that pointer to access the foreign object in any way, + * since direct intermodule communication is not supported in the current + * PixInsight/PCL framework. + */ + static ProcessInterface* ActiveDynamicInterface(); + + /*! + * Terminates the current dynamic session, if there is one active, and + * optionally closes the active dynamic interface. + * + * If the calling module is the owner of the active dynamic interface, the + * dynamic session is terminated immediately. + * + * If the calling module is not the owner of the active dynamic interface + * (i.e., if the active dynamic interface is a foreign object for + * the calling module), then the PixInsight core application will ask the + * user if it is ok to terminate the active dynamic session, providing + * complete information about the calling module. This is a security + * enforcement procedure. + */ + static bool TerminateDynamicSession( bool closeInterface = true ); + + /*! + * Sets the shape of the pointing device's cursor for the active dynamic + * session as an image in the XPM format. + * + * \param xpm Address of an image in the XPM format, which will be used + * as the new cursor shape in Dynamic Operation GUI mode. + * + * \param hx,hy Coordinates (horizontal, vertical) of the cursor hot spot + * relative to the upper left corner of the specified cursor + * shape image. + * + * See the documentation for SetDynamicCursor( const Bitmap&, int, int ) for + * more information on dynamic mode cursors. + * + * \deprecated This function has been deprecated and will be removed in a + * future version of PCL. Dynamic view cursors must always be specified as + * Bitmap objects in newly produced code. + */ + void SetDynamicCursor( const char** xpm, int hx = 0, int hy = 0 ); + + /*! + * Sets the shape of the pointing device's cursor for the active dynamic + * session as an image in the XPM format. + * + * Calling this function is equivalent to: + * + * \code SetDynamicCursor( xpm, p.x, p.y ); \endcode + * + * \deprecated This function has been deprecated and will be removed in a + * future version of PCL. Dynamic view cursors must always be specified as + * Bitmap objects in newly produced code. + */ + void SetDynamicCursor( const char** xpm, const Point& p ) + { + SetDynamicCursor( xpm, p.x, p.y ); + } + + /*! + * Sets the shape of the pointing device's cursor for the active dynamic + * session as an ARGB bitmap. + * + * \param bmp Reference to a bitmap that will be used as the new cursor + * shape for the Dynamic Operation GUI mode. + * + * \param hx,hy Coordinates (horizontal, vertical) of the cursor hot spot + * relative to the upper left corner of the specified cursor + * shape bitmap. + * + * If there is no active dynamic session, this function is ignored. + * + * Modules call this function to adapt the cursor shape to specific + * interactive operations during dynamic sessions. Custom cursor shapes + * must be used by dynamic interfaces to provide accurate and meaningful + * feedback to the user. + * + * The specified cursor shape will be used in the Dynamic Operation working + * GUI mode. It will not affect standard cursor shapes used by the GUI in + * other working modes (as Readout, Zoom In, etc). + */ + void SetDynamicCursor( const Bitmap& bmp, int hx = 0, int hy = 0 ); + + /*! + * Sets the shape of the pointing device's cursor for the active dynamic + * session as a RGBA bitmap. + * + * Calling this function is equivalent to: + * + * \code SetDynamicCursor( bmp, p.x, p.y ); \endcode + */ + void SetDynamicCursor( const Bitmap& bmp, const Point& p ) + { + SetDynamicCursor( bmp, p.x, p.y ); + } + + /*! + * Restores the default shape of the pointing device's cursor for the active + * dynamic session. + */ + void ResetDynamicCursor() + { + SetDynamicCursor( Bitmap::Null() ); + } + + /*! + * Returns a RGBA bitmap as a copy of the current shape of the pointing + * device's cursor for the active dynamic session. + */ + Bitmap DynamicCursorBitmap() const; + + /*! + * Returns the cursor hot spot position for the active dynamic session. + * + * Cursor hot spot coordinates are relative to the left-top corner of the + * cursor shape bitmap. + */ + Point DynamicCursorHotSpot() const; + + /*! + * Returns the ratio between physical screen pixels and device-independent + * coordinate units for this image window (actually, for the workspace that + * this window belongs to). + * + * The returned value is greater than or equal to one. Typical pixel ratios + * are 2.0 for high-dpi displays such as Retina monitors, or 1.0 for normal + * 96 dpi monitors. + * + * The display pixel ratio is never used by ImageWindow, since all viewport + * coordinates are always specified in physical display pixels. However, + * knowing this ratio is useful to properly scale interactive graphical + * contents generated by dynamic processes. For example, drawing vector + * graphics with one-pixel wide pens is fine for normal monitors, but may + * cause visibility problems on a 4K monitor, and is clearly inappropriate + * on a 5K monitor. + * + * The following example shows how to scale a Pen's width to adapt a drawing + * to the physical display where the window is being shown to the user: + * + * \code + * void MyStrokePolygon( VectorGraphics& G, + * const Array& points, RGBA color, + * const ImageWindow& window ) + * { + * G.StrokePolygon( points, Pen( color, window.DisplayPixelRatio() ) ); + * } + * \endcode + */ + double DisplayPixelRatio() const; + + /*! + * Converts the specified \a x and \a y integer coordinates from the + * viewport coordinate system to the image coordinate system. + * + * The converted image coordinates are rounded to the nearest integers. + */ + void ViewportToImage( int& x, int& y ) const; + + /*! + * Converts the specified \a x and \a y real floating point coordinates from + * the viewport coordinate system to the image coordinate system. + */ + void ViewportToImage( double& x, double& y ) const; + + /*! + * Converts a point \a p in the viewport coordinate system to the image + * coordinate system. Returns a point with the resulting floating point real + * image coordinates. + */ + template + DPoint ViewportToImage( const GenericPoint& p ) const + { + DPoint p1 = p; + ViewportToImage( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the viewport coordinate system to the image + * coordinate system. Returns a rectangle with the resulting floating point + * real image coordinates. + */ + template + DRect ViewportToImage( const GenericRectangle& r ) const + { + DRect r1 = r; + ViewportToImage( r1.x0, r1.y0 ); + ViewportToImage( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts a set of integer points from the viewport coordinate system to + * the image coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from viewport coordinates to image coordinates. + * + * \param n Number of points in the \a p array. + * + * Converted point image coordinates are rounded to the nearest integers. + */ + void ViewportToImage( Point* p, size_type n ) const; + + /*! + * Converts a set of real floating-point points from the viewport + * coordinate system to the image coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from viewport coordinates to image coordinates. + * + * \param n Number of points in the \a p array. + */ + void ViewportToImage( DPoint* p, size_type n ) const; + + /*! + * Converts a set of points in a dynamic array from the viewport coordinate + * system to the image coordinate system. + * + * \param a Reference to a dynamic array of points that will be converted + * from viewport coordinates to image coordinates. + */ + template + void ViewportToImage( Array >& a ) const + { + ViewportToImage( a.Begin(), a.Length() ); + } + + /*! + * Converts a set of integer scalars from the viewport coordinate system to + * the image coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from viewport coordinates to image + * coordinates. + * + * \param n Number of scalars in the \a p array. + * + * Converted scalars in image coordinates are rounded to the nearest + * integers. + */ + void ViewportScalarToImage( int* d, size_type n ) const; + + /*! + * Converts a set of real floating-point scalars from the viewport + * coordinate system to the image coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from viewport coordinates to image + * coordinates. + * + * \param n Number of scalars in the \a p array. + */ + void ViewportScalarToImage( double* d, size_type n ) const; + + /*! + * Converts a scalar \a d in the viewport coordinate system to the image + * coordinate system. Returns the resulting floating point real scalar in + * image coordinates. + */ + double ViewportScalarToImage( double d ) const; + + /*! + * Converts a scalar \a d in the viewport coordinate system to the image + * coordinate system. Returns the resulting floating point real scalar in + * image coordinates. + */ + template + double ViewportScalarToImage( T d ) const + { + return ViewportScalarToImage( double( d ) ); + } + + /*! + * Converts the specified \a x and \a y integer coordinates from the image + * coordinate system to the viewport coordinate system. + * + * The converted viewport coordinates are rounded to the nearest integers. + */ + void ImageToViewport( int& x, int& y ) const; + + /*! + * Converts the specified \a x and \a y real floating-point coordinates from + * the image coordinate system to the viewport coordinate system. + */ + void ImageToViewport( double& x, double& y ) const; + + /*! + * Converts a point \a p in the image coordinate system to the viewport + * coordinate system. Returns a point with the resulting viewport + * coordinates. + * + * If the template argument T corresponds to an integer type, the converted + * viewport coordinates in the resulting point are rounded to the nearest + * integers. + */ + template + GenericPoint ImageToViewport( const GenericPoint& p ) const + { + GenericPoint p1 = p; + ImageToViewport( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the image coordinate system to the viewport + * coordinate system. Returns a rectangle with the resulting viewport + * coordinates. + * + * If the template argument T corresponds to an integer type, the converted + * viewport coordinates in the resulting rectangle are rounded to the + * nearest integers. + */ + template + GenericRectangle ImageToViewport( const GenericRectangle& r ) const + { + GenericRectangle r1 = r; + ImageToViewport( r1.x0, r1.y0 ); + ImageToViewport( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts a set of integer points from the image coordinate system to + * the viewport coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from image coordinates to viewport coordinates. + * + * \param n Number of points in the \a p array. + * + * Converted point viewport coordinates are rounded to the nearest integers. + */ + void ImageToViewport( Point* p, size_type n ) const; + + /*! + * Converts a set of real floating-point points from the image coordinate + * system to the viewport coordinate system. + * + * \param p Pointer to the first point in the array of points that will + * be converted from image coordinates to viewport coordinates. + * + * \param n Number of points in the \a p array. + */ + void ImageToViewport( DPoint* p, size_type n ) const; + + /*! + * Converts a set of points in a dynamic array from the image coordinate + * system to the viewport coordinate system. + * + * \param a Reference to a dynamic array of points that will be converted + * from image coordinates to viewport coordinates. + */ + template + void ImageToViewport( Array >& a ) const + { + ImageToViewport( a.Begin(), a.Length() ); + } + + /*! + * Converts a set of integer scalars from the image coordinate system to + * the viewport coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from image coordinates to viewport + * coordinates. + * + * \param n Number of scalars in the \a p array. + * + * Converted scalars in viewport coordinates are rounded to the nearest + * integers. + */ + void ImageScalarToViewport( int* d, size_type n ) const; + + /*! + * Converts a set of real floating-point scalars from the image coordinate + * system to the viewport coordinate system. + * + * \param d Pointer to the first element in the array of scalars that + * will be converted from image coordinates to viewport + * coordinates. + * + * \param n Number of scalars in the \a p array. + */ + void ImageScalarToViewport( double* d, size_type n ) const; + + /*! + * Converts an integer scalar \a d in the image coordinate system to the + * viewport coordinate system. Returns the resulting scalar in viewport + * coordinates. + * + * The resulting scalar in viewport coordinates is rounded to the nearest + * integer. + */ + int ImageScalarToViewport( int ) const; + + /*! + * Converts a real floating-point scalar \a d in the image coordinate system + * to the viewport coordinate system. Returns the resulting scalar in + * viewport coordinates. + */ + double ImageScalarToViewport( double ) const; + + /*! + * Converts the specified \a x and \a y integer coordinates from the + * viewport coordinate system to the global coordinate system. + * + * The converted global coordinates are rounded to the nearest integers. + */ + void ViewportToGlobal( int& x, int& y ) const; + + /*! + * Converts a point \a p in the viewport coordinate system to the global + * coordinate system. Returns a point with the resulting global coordinates. + */ + Point ViewportToGlobal( const Point& p ) const + { + Point p1 = p; + ViewportToGlobal( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the viewport coordinate system to the global + * coordinate system. Returns a rectangle with the resulting global + * coordinates. + */ + Rect ViewportToGlobal( const Rect& r ) const + { + Rect r1 = r; + ViewportToGlobal( r1.x0, r1.y0 ); + ViewportToGlobal( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Converts the specified \a x and \a y integer coordinates from the global + * coordinate system to the viewport coordinate system. + * + * The converted viewport coordinates are rounded to the nearest integers. + */ + void GlobalToViewport( int& x, int& y ) const; + + /*! + * Converts a point \a p in the global coordinate system to the viewport + * coordinate system. Returns a point with the resulting viewport + * coordinates. + */ + Point GlobalToViewport( const Point& p ) const + { + Point p1 = p; + GlobalToViewport( p1.x, p1.y ); + return p1; + } + + /*! + * Converts a rectangle \a r in the global coordinate system to the viewport + * coordinate system. Returns a rectangle with the resulting viewport + * coordinates. + */ + Rect GlobalToViewport( const Rect& r ) const + { + Rect r1 = r; + GlobalToViewport( r1.x0, r1.y0 ); + GlobalToViewport( r1.x1, r1.y1 ); + return r1; + } + + /*! + * Causes a complete regeneration of the whole viewport and its associated + * UI resources. + * + * Calling this function may be necessary to force a regeneration after + * changing the geometry of the image in the current view of this image + * window. + */ + void Reset() + { + SetZoomFactor( ZoomFactor() ); + } + + /*! + * Regenerates the screen rendition for the visible viewport region in this + * image window. This includes regeneration of screen renditions depending + * on active dynamic interfaces. + */ + void Regenerate(); + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code RegenerateViewportRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void RegenerateViewportRect( const Rect& r ) + { + RegenerateViewportRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in viewport coordinates. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the regenerated region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the regenerated region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be regenerated and updated, that is, + * its intersection with the visible viewport region. + */ + void RegenerateViewportRect( int x0, int y0, int x1, int y1 ); + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in image coordinates. + * + * Calling this function is equivalent to: + * + * \code RegenerateImageRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void RegenerateImageRect( const pcl::DRect& r ) + { + RegenerateImageRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Regenerates the screen rendition for a rectangular region of the + * viewport, specified in image coordinates. + * + * \param x0,y0 %Image coordinates (horizontal, vertical) of the upper + * left corner of the regenerated region. + * + * \param x1,y1 %Image coordinates (horizontal, vertical) of the lower + * right corner of the regenerated region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be regenerated and updated, that is, + * its intersection with the visible viewport region. + */ + void RegenerateImageRect( double x0, double y0, double x1, double y1 ); + + /*! + * Requests a screen update for the entire visible viewport region in this + * image window. + */ + void UpdateViewport(); + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in viewport coordinates. + * + * Calling this function is equivalent to: + * + * \code UpdateViewportRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void UpdateViewportRect( const Rect& r ) + { + UpdateViewportRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in viewport coordinates. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the update region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the update region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be updated, that is, its + * intersection with the visible viewport region. + */ + void UpdateViewportRect( int x0, int y0, int x1, int y1 ); + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in image coordinates. + * + * Calling this function is equivalent to: + * + * \code UpdateImageRect( r.x0, r.y0, r.x1, r.y1 ); \endcode + */ + void UpdateImageRect( const pcl::DRect& r ) + { + UpdateImageRect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Requests a screen update for a rectangular region of the viewport, + * specified in image coordinates. + * + * \param x0,y0 %Image coordinates (horizontal, vertical) of the upper + * left corner of the update region. + * + * \param x1,y1 %Image coordinates (horizontal, vertical) of the lower + * right corner of the update region. + * + * The specified region will be updated on the screen. Only the visible + * portion of the specified region will be updated, that is, its + * intersection with the visible viewport region in the image coordinate + * system. + */ + void UpdateImageRect( double x0, double y0, double x1, double y1 ); + + /*! + * Returns true iff there are pending viewport updates for this image window. + */ + bool HasPendingUpdates() const; + + /*! + * Executes all pending viewport update requests for this image window. + * + * Viewport update requests are not executed immediately by the core + * PixInsight application. For the sake of performance, The GUI tries to + * optimize screen updates by performing the minimum possible redrawing + * work. + * + * This means that update requests are placed on a queue, waiting while the + * main GUI thread is busy or until a sufficiently large update region + * becomes available. + * + * With this function, an interface can force the immediate screen update + * for all pending update viewport regions. If multiple update regions are + * pending, the core application will still minimize the required drawing + * work by grouping all of them into the minimum possible amount of larger + * regions. + */ + void CommitPendingUpdates(); + + /*! + * Returns a rectangle in viewport coordinates that includes all pending + * viewport update regions for this image window. + */ + Rect ViewportUpdateRect() const; + + /*! + * Returns a RGBA bitmap with a screen rendition of a viewport region of + * this image window. + * + * Calling this function is equivalent to: + * + * \code ViewportBitmap( r.x0, r.y0, r.x1, r.y1, flags ); \endcode + */ + Bitmap ViewportBitmap( const Rect& r, uint32 flags = 0 ) const + { + return ViewportBitmap( r.x0, r.y0, r.x1, r.y1, flags ); + } + + /*! + * Returns a RGBA bitmap with a screen rendition of a viewport region of + * this image window. + * + * \param x0,y0 %Viewport coordinates (horizontal, vertical) of the upper + * left corner of the source viewport region. + * + * \param x1,y1 %Viewport coordinates (horizontal, vertical) of the lower + * right corner of the source viewport region. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + * + * The returned bitmap will contain a screen rendition for the specified + * source region of the image in the current view of this image window. It + * will be magnified or reduced according to the current zoom factor. It + * will not contain auxiliary vectorial elements (as preview rectangles), or + * other renditions of any kind that depend on active dynamic interfaces. + */ + Bitmap ViewportBitmap( int x0, int y0, int x1, int y1, uint32 flags = 0 ) const; + + /*! + * Begins a new interactive rectangular selection procedure on the viewport + * of this image window. + * + * Calling this function is equivalent to: + * + * \code BeginSelection( p.x, p.y, flags ); \endcode + */ + void BeginSelection( const Point& p, uint32 flags = 0 ) + { + BeginSelection( p.x, p.y, flags ); + } + + /*! + * Starts a new interactive rectangular selection procedure on the viewport + * of this image window. + * + * \param x,y %Image coordinates of the starting point of a new + * rectangular selection. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + * + * Dynamic interfaces use BeginSelection() in response to an OnMousePress + * event to start a rectangular selection. ModifySelection() is then called + * from an OnMouseMove event handler, and the final selection coordinates + * are obtained by calling SelectionRect() from an OnMouseRelease event + * handler. + */ + void BeginSelection( int x, int y, uint32 flags = 0 ); + + /*! + * Updates an ongoing interactive rectangular selection procedure on the + * viewport of this image window. + * + * Calling this function is equivalent to: + * + * \code ModifySelection( p.x, p.y, flags ); \endcode + */ + void ModifySelection( const Point& p, uint32 flags = 0 ) + { + ModifySelection( p.x, p.y, flags ); + } + + /*! + * Updates an ongoing interactive rectangular selection procedure on the + * viewport of this image window. + * + * \param x,y %Image coordinates to update the current rectangular + * selection. The selection rectangle is defined by this + * position and the starting position defined in the call to + * BeginSelection() that originated the current selection + * procedure. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to zero. + */ + void ModifySelection( int x, int y, uint32 flags = 0 ); + + /*! + * Requests a screen viewport update for the current rectangular selection. + */ + void UpdateSelection(); + + /*! + * Aborts the current interactive selection procedure. + */ + void CancelSelection(); + + /*! + * Terminates the current interactive selection procedure. + */ + void EndSelection(); + + /*! + * Returns the current rectangular selection in image coordinates. + * + * \param flags Currently not used; reserved for future extensions of PCL. + * Must be set to nullptr. + * + * Before calling this function, a rectangular selection procedure should + * have been started with BeginSelection(). + */ + Rect SelectionRect( uint32* flags = nullptr ) const; + + /*! + * Returns true iff an interactive selection procedure is currently active on + * the viewport of this image window. + */ + bool IsSelection() const; + + /*! + * Returns a image window with the specified image identifier. If no image + * exists with the specified identifier, this function returns + * ImageWindow::Null(). + */ + static ImageWindow WindowById( const IsoString& id ); + + static ImageWindow WindowById( const IsoString::ustring_base& id ) + { + return WindowById( IsoString( id ) ); + } + + /*! + * Returns the image window where the specified file path has been loaded. + * If no image has been loaded from the specified path, this function + * returns ImageWindow::Null(). + */ + static ImageWindow WindowByFilePath( const String& filePath ); + + /*! + * Returns the current active image window. Returns ImageWindow::Null() if + * there are no image windows, if all image windows are hidden, or if all + * image windows have been iconized. + * + * The active image window is the topmost image window of the stack of image + * windows in the current workspace. Most commands that apply to + * views, images and previews, are executed on the active image window by + * default, even if it doesn't have the keyboard focus. + */ + static ImageWindow ActiveWindow(); + + /*! + * Returns a container with all existing image windows, including visible + * and hidden windows, and optionally iconized windows. + * + * \param includeIconicWindows If this parameter is false, iconic image + * windows will not be included in the returned container. + */ + static Array AllWindows( bool includeIconicWindows = true ); + +private: + + ImageWindow( void* h ) : UIObject( h ) + { + } + + friend class View; + friend class ProcessInstance; // for IsMaskable() + friend class ProcessContextDispatcher; + friend class InternalWindowEnumerator; +}; + +// ---------------------------------------------------------------------------- + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_ImageWindow_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ImageWindow.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Indirect.h b/3rdparty/include/pcl/Indirect.h new file mode 100644 index 0000000..4fc4228 --- /dev/null +++ b/3rdparty/include/pcl/Indirect.h @@ -0,0 +1,323 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Indirect.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Indirect_h +#define __PCL_Indirect_h + +/// \file pcl/Indirect.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectUnaryFunction + * \brief A wrapper class that applies a unary function to pointers to objects. + * + * The UF template argument represents a unary function type of the form: + * + * void (*UF)( T ) + * + * The TPtr template argument represents a pointer to UF's argument type. TPtr + * is also the argument type of %IndirectUnaryFunction::operator ()(). + * + * %IndirectUnaryFunction can be used as UF, but acting on pointers to objects + * of type T. + */ +template +class PCL_CLASS IndirectUnaryFunction +{ +public: + + /*! + * Constructs an %IndirectUnaryFunction to wrap a unary m_function \a f. + */ + IndirectUnaryFunction( UF f ) + : m_function( f ) + { + } + + /*! + * Copy constructor. + */ + IndirectUnaryFunction( IndirectUnaryFunction& ) = default; + + /*! + * Function call operator. Applies the wrapped unary function to \a *ptr. + * + * If \a ptr is nullptr, the function is not invoked and calling this member + * function has no effect. + */ + void operator()( TPtr ptr ) const + { + if ( ptr != nullptr ) + m_function( *ptr ); + } + +private: + + UF m_function; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectBinaryFunction + * \brief A wrapper class that applies a binary function to pointers to objects. + * + * The BF template argument represents a binary function type of the form: + * + * void (*BF)( T1, T2 ) + * + * The T1Ptr and T2Ptr template arguments represent pointers to BF's first and + * second argument types, respectively. T1Ptr and T2Ptr are also the argument + * types of %IndirectBinaryFunction::operator ()(). + * + * %IndirectBinaryFunction can be used as BF, but acting on pointers to objects + * of the types T1 and T2. + */ +template +class PCL_CLASS IndirectBinaryFunction +{ +public: + + /*! + * Constructs an %IndirectBinaryFunction to wrap a binary function \a f. + */ + IndirectBinaryFunction( BF f ) + : m_function( f ) + { + } + + /*! + * Copy constructor. + */ + IndirectBinaryFunction( const IndirectBinaryFunction& ) = default; + + /*! + * Function call operator. Applies the wrapped binary function to \a *ptr1 + * and \a *ptr2. + * + * If either \a ptr1 or \a ptr2 is nullptr, the function is not invoked and + * calling this member function has no effect. + */ + void operator()( T1Ptr ptr1, T2Ptr ptr2 ) const + { + if ( ptr1 != nullptr ) + if ( ptr2 != nullptr ) + m_function( *ptr1, *ptr2 ); + } + +private: + + BF m_function; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectUnaryPredicate + * \brief A wrapper class that applies a unary predicate to pointers to objects. + * + * The UP template argument represents a unary predicate type of the form: + * + * bool (*UP)( T ) + * + * The TPtr template argument represents a pointer to UP's argument type. TPtr + * is also the argument type of %IndirectUnaryPredicate::operator ()(). + * + * %IndirectUnaryPredicate can be used as UP, but acting on pointers to objects + * of type T. + */ +template +class PCL_CLASS IndirectUnaryPredicate +{ +public: + + /*! + * Constructs an %IndirectUnaryFunction to wrap a unary predicate \a p. + */ + IndirectUnaryPredicate( UP p ) + : m_predicate( p ) + { + } + + /*! + * Copy constructor. + */ + IndirectUnaryPredicate( const IndirectUnaryPredicate& ) = default; + + /*! + * Function call operator. Applies the wrapped unary predicate to \a *ptr + * and returns its resulting value. + * + * If \a ptr is nullptr, the predicate is not invoked and false is returned. + */ + bool operator()( TPtr ptr ) const + { + return ptr != nullptr && m_predicate( *ptr ); + } + +private: + + UP m_predicate; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectBinaryPredicate + * \brief A wrapper class that applies a binary predicate to pointers to objects. + * + * The BP template argument represents a binary predicate type of the form: + * + * bool (*BP)( T1, T2 ) + * + * The T1Ptr and T2Ptr template arguments represent pointers to BP's first and + * second argument types, respectively. T1Ptr and T2Ptr are also the argument + * types of %IndirectBinaryPredicate::operator ()(). + * + * %IndirectBinaryPredicate can be used as BP, but acting on pointers to + * objects of the types T1 and T2. + */ +template +class PCL_CLASS IndirectBinaryPredicate +{ +public: + + /*! + * Constructs an %IndirectBinaryPredicate to wrap a binary predicate \a p. + */ + IndirectBinaryPredicate( BP p ) + : m_predicate( p ) + { + } + + /*! + * Copy constructor. + */ + IndirectBinaryPredicate( const IndirectBinaryPredicate& ) = default; + + /*! + * Function call operator. Applies the wrapped binary predicate to \a *ptr1 + * and \a *ptr2, and returns its resulting value. + * + * If either of \a ptr1 or \a ptr2 is nullptr, the predicate is not invoked + * and false is returned. + */ + bool operator()( T1Ptr ptr1, T2Ptr ptr2 ) const + { + return ptr1 != nullptr && ptr2 != nullptr && m_predicate( *ptr1, *ptr2 ); + } + +private: + + BP m_predicate; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectEqual + * \brief A functional class that tests two pointers for equality of the + * pointed objects. + */ +template +struct PCL_CLASS IndirectEqual +{ + /*! + * Function call operator. Returns true iff \a *ptr1 == \a *ptr2. + * + * If either of \a ptr1 or \a ptr2 is nullptr, no operation is performed on + * any pointed object and the return value is \a ptr1 == \a ptr2. + */ + bool operator ()( TPtr ptr1, TPtr ptr2 ) const + { + return (ptr1 != nullptr && ptr2 != nullptr) ? *ptr1 == *ptr2 : ptr1 == ptr2; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectLess + * \brief A functional class that applies the less than relational + * operator to the objects pointed to by two pointers. + */ +template +struct PCL_CLASS IndirectLess +{ + /*! + * Function call operator. Returns true iff \a *ptr1 < \a *ptr2. + * + * If either of \a ptr1 or \a ptr2 is nullptr, no operation is performed on + * any pointed object and the return value is \a ptr2 < \a ptr1. This + * ensures that when sorting lists of pointers indirectly, all null pointers + * will be packed at the bottom of the sorted list. + */ + bool operator ()( TPtr ptr1, TPtr ptr2 ) const + { + // When sorting a list, make sure all null pointers are packed at the bottom. + return ptr1 != nullptr && (ptr2 == nullptr || *ptr1 < *ptr2); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Indirect_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Indirect.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/IndirectArray.h b/3rdparty/include/pcl/IndirectArray.h new file mode 100644 index 0000000..2bfdf05 --- /dev/null +++ b/3rdparty/include/pcl/IndirectArray.h @@ -0,0 +1,2023 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/IndirectArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_IndirectArray_h +#define __PCL_IndirectArray_h + +/// \file pcl/IndirectArray.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectArray + * \brief Generic dynamic array of pointers to objects. + * + * %IndirectArray is a generic, finite ordered sequence of pointers to objects, + * implemented as a reference-counted, dynamic array of pointers to T + * instances. The type A provides dynamic allocation for contiguous sequences + * of void* (StandardAllocator is used by default). + * + * In the PixInsight/PCL platform, dynamic arrays of pointers to objects are + * powerful building blocks for the implementation of flexible data structures, + * including heterogeneous containers. + * + * Unlike ReferenceArray, %IndirectArray can contain null pointers because it + * does not require dereferencing pointers. Actually, %IndirectArray by itself + * does not need to know anything about the objects pointed to by its contained + * pointers, and precisely here lies its flexibility as a generic container. + * + * \sa IndirectSortedArray, ReferenceArray, ReferenceSortedArray, Array, + * SortedArray, ReferenceCounter + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS IndirectArray : public IndirectContainer +{ +public: + + /*! # + */ + typedef A block_allocator; + + /*! # + */ + typedef pcl::Allocator allocator; + + /*! # + */ + typedef T** iterator; + + /*! # + */ + typedef T* const* const_iterator; + + /*! # + */ + typedef Array array_implementation; + + /*! # + */ + typedef typename array_implementation::iterator + array_iterator; + + /*! # + */ + typedef typename array_implementation::const_iterator + const_array_iterator; + + /*! # + */ + typedef ReverseRandomAccessIterator + reverse_iterator; + + /*! # + */ + typedef ReverseRandomAccessIterator + const_reverse_iterator; + + /*! # + */ + typedef IndirectEqual equal; + + /*! # + */ + typedef IndirectLess less; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty indirect array. + */ + IndirectArray() = default; + + /*! + * Constructs an indirect array of length \a n. All contained pointers are + * initialized to \c nullptr. + */ + explicit + IndirectArray( size_type n ) + { + m_array.Append( (void*)nullptr, n ); + } + + /*! + * Constructs an indirect array that stores \a n copies of a pointer \a p. + */ + IndirectArray( size_type n, const T* p ) + { + m_array.Append( (void*)p, n ); + } + + /*! + * Constructs an indirect array as a copy of the sequence of pointers + * defined by the range [i,j) of forward iterators. + */ + template + IndirectArray( FI i, FI j ) + : m_array( i, j ) + { + } + + /*! + * Copy constructor. + */ + IndirectArray( const IndirectArray& ) = default; + + /*! + * Move constructor. + */ + IndirectArray( IndirectArray&& ) = default; + + /*! + * Destroys an %IndirectArray object. + * + * Deallocates the internal array of pointers to objects, but does not + * destroy the pointed objects. To destroy them, you have to call Destroy() + * or Delete() explicitly. + */ + ~IndirectArray() + { + } + + /*! + * Returns true iff this indirect array uniquely references its contained + * array of pointers to objects. + */ + bool IsUnique() const + { + return m_array.IsUnique(); + } + + /*! + * Returns true iff this indirect array is an alias of the indirect array + * \a x. + * + * Two objects are aliases if both share the same data. Two indirect + * containers are aliases if they share a unique set of data pointers. + */ + bool IsAliasOf( const IndirectArray& x ) const + { + return m_array.IsAliasOf( x.m_array ); + } + + /*! + * Ensures that this indirect array uniquely references its contained data + * pointers. + * + * If necessary, this member function generates a duplicate of the array + * of pointers, references it, and then decrements the reference counter of + * the original pointer array. + */ + void EnsureUnique() + { + m_array.EnsureUnique(); + } + + /*! + * Returns the total number of bytes required to store the array of data + * pointers contained by this indirect array. + */ + size_type Size() const + { + return m_array.Size(); + } + + /*! + * Returns the length of this indirect array. + */ + size_type Length() const + { + return m_array.Length(); + } + + /*! + * Returns the capacity of this indirect array. The capacity is the maximum + * number of pointers to objects that this indirect array can contain + * without requiring a reallocation. + */ + size_type Capacity() const + { + return m_array.Capacity(); + } + + /*! + * Returns the length of the space available in this indirect array, or zero + * if this indirect array cannot contain more pointers. The available space + * is the number of pointers to objects that can be added to this indirect + * array without requiring a reallocation. It is equal to + * Capacity() - Length() by definition. + */ + size_type Available() const + { + return m_array.Available(); + } + + /*! + * Returns true only if this indirect array is valid. An indirect array is + * valid if it references an internal structure with an array of pointers, + * even if it is an empty array. + * + * In general, all %IndirectArray objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other arrays. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid array object cannot be used and should be destroyed + * immediately. Invalid arrays are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const + { + return m_array.IsValid(); + } + + /*! + * Returns true iff this indirect array is empty. + */ + bool IsEmpty() const + { + return m_array.IsEmpty(); + } + + /*! + * Returns the minimum legal index in this array (always zero). For empty + * arrays, this function returns a meaningless value. + */ + size_type LowerBound() const + { + return m_array.LowerBound(); + } + + /*! + * Returns the maximum legal index in this array. It is equal to Length()-1. + * For empty arrays, this function returns a meaningless value. + */ + size_type UpperBound() const + { + return m_array.UpperBound(); + } + + /*! + * Returns a reference to the allocator object used by this indirect array. + */ + const allocator& Allocator() const + { + return m_array.Allocator(); + } + + /*! + * Sets a new allocator object for this array. + */ + void SetAllocator( const allocator& a ) + { + m_array.SetAllocator( a ); + } + + /*! + * Returns an array iterator located at the specified index \a i. + */ + iterator At( size_type i ) + { + return iterator( m_array.At( i ) ); + } + + /*! + * Returns an immutable array iterator located at the specified index \a i. + */ + const_iterator At( size_type i ) const + { + return const_iterator( m_array.At( i ) ); + } + + /*! + * Returns a mutable iterator pointing to the same array element as the + * specified immutable iterator \a i. + * + * \warning As a side-effect of calling this function, the specified + * immutable iterator \a i may become invalid. This happens when this + * function is called for a shared array, since in this case getting a + * mutable iterator involves a deep copy of the array through an implicit + * call to EnsureUnique(). + */ + iterator MutableIterator( const_iterator i ) + { + return iterator( m_array.MutableIterator( (const_array_iterator)i ) ); + } + + /*! + * Returns a reference to the pointer stored at the specified index \a i. No + * bounds checking is performed. + */ + T*& operator []( size_type i ) + { + return (T*&)m_array[i]; + } + + /*! + * Returns a copy of the pointer to an unmodifiable object stored at the + * specified index \a i. No bounds checking is performed. + */ + const T* operator []( size_type i ) const + { + return (const T*)m_array[i]; + } + + /*! + * Returns a reference to the first pointer stored in this indirect array. + */ + T*& operator *() + { + return (T*&)*Begin(); + } + + /*! + * Returns a copy of the first pointer to an unmodifiable object stored in + * this indirect array. + */ + const T* operator *() const + { + return (T*)*Begin(); + } + + /*! + * Returns a mutable iterator located at the beginning of this array. + */ + iterator Begin() + { + return iterator( m_array.Begin() ); + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator Begin() const + { + return const_iterator( m_array.Begin() ); + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator ConstBegin() const + { + return const_iterator( m_array.ConstBegin() ); + } + + /*! + * Returns a mutable iterator located at the end of this array. + */ + iterator End() + { + return iterator( m_array.End() ); + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator End() const + { + return const_iterator( m_array.End() ); + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator ConstEnd() const + { + return const_iterator( m_array.ConstEnd() ); + } + + /*! + * Returns a mutable reverse iterator located at the reverse + * beginning of this indirect array. + * + * The reverse beginning corresponds to the last pointer in the array. + */ + reverse_iterator ReverseBegin() + { + return iterator( (array_iterator)m_array.ReverseBegin() ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this indirect array. + * + * The reverse beginning corresponds to the last pointer in the array. + */ + const_reverse_iterator ReverseBegin() const + { + return const_iterator( (const_array_iterator)m_array.ReverseBegin() ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this indirect array. + * + * The reverse beginning corresponds to the last pointer in the array. + */ + const_reverse_iterator ConstReverseBegin() const + { + return const_iterator( (const_array_iterator)m_array.ConstReverseBegin() ); + } + + /*! + * Returns a mutable reverse iterator located at the reverse end of + * this indirect array. + * + * The reverse end corresponds to a (nonexistent) pointer immediately before + * the first pointer in the array. + */ + reverse_iterator ReverseEnd() + { + return iterator( (array_iterator)m_array.ReverseEnd() ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this indirect array. + * + * The reverse end corresponds to a (nonexistent) pointer immediately before + * the first pointer in the array. + */ + const_reverse_iterator ReverseEnd() const + { + return const_iterator( (const_array_iterator)m_array.ReverseEnd() ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this indirect array. + * + * The reverse end corresponds to a (nonexistent) pointer immediately before + * the first pointer in the array. + */ + const_reverse_iterator ConstReverseEnd() const + { + return const_iterator( (const_array_iterator)m_array.ConstReverseEnd() ); + } + + /*! + * Returns a copy of the first pointer in this indirect array, or \c nullptr + * if this array is empty. + */ + T* First() + { + return IsEmpty() ? nullptr : *Begin(); + } + + /*! + * Returns a copy of the first pointer to an unmodifiable object in this + * indirect array, or \c nullptr if this array is empty. + */ + const T* First() const + { + return IsEmpty() ? nullptr : *Begin(); + } + + /*! + * Returns a copy of the last pointer in this indirect array, or \c nullptr + * if this array is empty. + */ + T* Last() + { + return IsEmpty() ? nullptr : *ReverseBegin(); + } + + /*! + * Returns a copy of the last pointer to an unmodifiable object in this + * indirect array, or \c nullptr if this array is empty. + */ + const T* Last() const + { + return IsEmpty() ? nullptr : *ReverseBegin(); + } + + /*! + * Ensures that the specified iterator points to a uniquely referenced + * pointer. If necessary, this function builds a new, uniquely referenced + * copy of this indirect array by calling EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the pointer + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + m_array.UniquifyIterator( (array_iterator&)i ); + } + + /*! + * Ensures that the specified iterators point to uniquely referenced + * pointers. If necessary, this function builds a new, uniquely referenced + * copy of this indirect array by calling EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the pointers at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + m_array.UniquifyIterators( (array_iterator&)i, (array_iterator&)j ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this indirect array to reference the same set of pointers as + * another array \a x. Returns a reference to this object. + */ + IndirectArray& operator =( const IndirectArray& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns an indirect array \a x to this indirect array. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Increments the reference counter of the source array's data and + * references it in this array. + */ + void Assign( const IndirectArray& x ) + { + m_array.Assign( x.m_array ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + IndirectArray& operator =( IndirectArray&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another indirect array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( IndirectArray& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! + * Transfers data from another indirect array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( IndirectArray&& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! + * Replaces the contents of this indirect array with a sequence of \a n + * pointers equal to \a p. + */ + void Assign( const T* p, size_type n = 1 ) + { + m_array.Assign( (void*)p, n ); + } + + /*! + * Replaces the contents of this indirect array with a copy of the sequence + * of pointers defined by the range [i,j) of forward iterators. + * + * \note \a i and \a j must not be iterators into this array. + */ + template + void Assign( FI i, FI j ) + { + m_array.Assign( i, j ); + } + + /*! + * Replaces the contents of this indirect array with a set of pointers to + * newly created copies of the objects stored in the specified container + * \a x. This function works for both direct and indirect containers. + * + * Keep in mind that after calling this function (with a reference to a + * nonempty container) this array will store pointers to newly allocated + * objects. You should call Delete() or Destroy() to deallocate these + * objects before destructing this array, or copy the pointers somewhere, in + * order to avoid memory leaks. + */ + template + void CloneAssign( const C& x ) + { + PCL_ASSERT_CONTAINER( C, T ); + CloneObjects( x, (C*)nullptr ); + } + + /*! + * Causes this indirect array to store the sequence of pointers defined by + * the range [i,j) of indirect array iterators (pointers to pointers). The + * previously referenced data structure is dereferenced and deallocated if + * it becomes unreferenced. + */ + void Import( iterator i, iterator j ) + { + m_array.Import( (array_iterator)i, (array_iterator)j ); + } + + /*! + * Releases the set of pointers contained by this indirect array. + * + * This member function returns a pointer to the internal block of pointers + * stored in this object, after ensuring that it is uniquely referenced. + * If the array is empty, this function may return the null pointer. + * + * Before returning, this member function empties this array without + * deallocating its contained data. The caller is then responsible for + * deallocating the returned block when it is no longer required. + */ + iterator Release() + { + return iterator( m_array.Release() ); + } + + /*! + * Inserts a contiguous sequence of \a n null pointers at the specified + * location \a i in this indirect array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first newly created array element, or + * \a i if \a n is zero. + */ + iterator Grow( const_iterator i, size_type n = 1 ) + { + return iterator( m_array.Insert( (array_iterator)const_cast( i ), (void*)nullptr, n ) ); + } + + /*! + * Appends a contiguous sequence of \a n null pointers to this indirect + * array. This operation is equivalent to: + * + * \code Grow( End(), n ) \endcode + * + * Returns an iterator pointing to the first newly created array element, or + * End() if \a n is zero. + */ + iterator Expand( size_type n = 1 ) + { + return Grow( ConstEnd(), n ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing pointers from + * this indirect array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Shrink( size_type n = 1 ) + { + if ( n < Length() ) + Truncate( ConstEnd() - n ); + else + Clear(); + } + + /*! + * Resizes this indirect array to the specified length \a n, either by + * appending null pointers, or by removing existing trailing pointers. + * This operation is equivalent to: + * + * \code + * if ( n > Length() ) + * Expand( n - Length() ); + * else + * Shrink( Length() - n ); + * \endcode + * + * When the array length is reduced, only pointers are removed by this + * function; the pointed objects are not affected in any way. + */ + void Resize( size_type n ) + { + size_type l = Length(); + if ( n > l ) + Expand( n - l ); + else + Shrink( l - n ); + } + + /*! + * Inserts a copy of the sequence of pointers contained by the indirect + * array \a x at the specified location \a i in this indirect array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. The source array \a x can + * safely be a reference to this array. + * + * Returns an iterator pointing to the first newly created array element, or + * \a i if \a x is empty. + */ + iterator Insert( const_iterator i, const IndirectArray& x ) + { + return iterator( m_array.Insert( (array_iterator)const_cast( i ), x.m_array ) ); + } + + /*! + * Inserts a contiguous sequence of \a n pointers equal to \a p at the + * specified location \a i. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a n is zero. + */ + iterator Insert( const_iterator i, const T* p, size_type n = 1 ) + { + return iterator( m_array.Insert( (array_iterator)const_cast( i ), (void*)p, n ) ); + } + + /*! + * Inserts a copy of the sequence of pointers defined by the range [p,q) + * of forward iterators at the specified location \a i. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a q <= \a p. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Insert( const_iterator i, FI p, FI q ) + { + return iterator( m_array.Insert( (array_iterator)const_cast( i ), p, q ) ); + } + + /*! + * Appends a copy of the sequence of pointers contained by the indirect + * array \a x to this indirect array. + */ + void Append( const IndirectArray& x ) + { + m_array.Append( x.m_array ); + } + + /*! + * Appends a contiguous sequence of \a n pointers equal to \a p to this + * indirect array. + */ + void Append( const T* p, size_type n = 1 ) + { + m_array.Append( (void*)p, n ); + } + + /*! + * Appends a copy of the sequence of pointers defined by the range [p,q) + * of forward iterators to this indirect array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Append( FI p, FI q ) + { + m_array.Append( p, q ); + } + + /*! + * Inserts a copy of the sequence of pointers contained by the indirect + * array \a x at the beginning of this indirect array. + */ + void Prepend( const IndirectArray& x ) + { + m_array.Prepend( x.m_array ); + } + + /*! + * Inserts a contiguous sequence of \a n pointers equal to \a p at the + * beginning of this indirect array. + */ + void Prepend( const T* p, size_type n = 1 ) + { + m_array.Prepend( (void*)p, n ); + } + + /*! + * Inserts a copy of the sequence of pointers defined by the range [p,q) of + * forward iterators at the beginning of this indirect array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Prepend( FI p, FI q ) + { + m_array.Prepend( p, q ); + } + + /*! + * A synonym for Append( const IndirectArray<>& ) + */ + void Add( const IndirectArray& x ) + { + Append( x ); + } + + /*! + * A synonym for Append( const T*, size_type ) + */ + void Add( const T* p, size_type n = 1 ) + { + Append( p, n ); + } + + /*! + * A synonym for Append( FI, FI ) + */ + template + void Add( FI i, FI j ) + { + Append( i, j ); + } + + /*! + * Removes a sequence of \a n contiguous pointers starting at the specified + * location \a i in this indirect array. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a n is zero, this function does nothing. Otherwise \a i is + * constrained to stay in the range [Begin(),End()) of existing array + * elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, size_type n = 1 ) + { + m_array.Remove( (array_iterator)const_cast( i ), n ); + } + + /*! + * Removes a sequence of contiguous pointers in the range [i,j) of this + * indirect array. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, const_iterator j ) + { + m_array.Remove( (array_iterator)const_cast( i ), + (array_iterator)const_cast( j ) ); + } + + /*! + * Removes a trailing sequence of contiguous pointers from the specified + * iterator of this array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator is located at or after the end of this array, + * this function does nothing. Otherwise the iterator is constrained to stay + * in the range [Begin(),End()) of existing array elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Truncate( const_iterator i ) + { + m_array.Truncate( (array_iterator)const_cast( i ) ); + } + + /*! + * Removes all existing non-null pointers whose pointed objects are equal to + * the specified value \a v in this indirect array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const T& v ) + { + array_implementation r; + for ( const_iterator i = ConstBegin(); i < ConstEnd(); ++i ) + if ( *i == nullptr || **i != v ) + r.Add( (void*)*i ); + if ( r.Length() < m_array.Length() ) + m_array.Transfer( r ); + } + + /*! + * Removes every non-null pointer x in this array such that the binary + * predicate p( *x, \a v ) is true. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + template + void Remove( const T& v, BP p ) + { + array_implementation r; + for ( const_iterator i = ConstBegin(); i < ConstEnd(); ++i ) + if ( *i == nullptr || !p( **i, v ) ) + r.Add( (void*)*i ); + if ( r.Length() < m_array.Length() ) + m_array.Transfer( r ); + } + + /*! + * Removes all contained pointers equal to \a p in this indirect array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const T* p ) + { + m_array.Remove( (void*)p ); + } + + /*! + * Removes all pointers contained by this object, yielding an empty indirect + * array. + * + * If this array is empty, then calling this member function has no effect. + * + * If this array uniquely references its internal array data structure, all + * pointers contained are deallocated; otherwise its reference counter is + * decremented. Then a new, empty array data structure is created and + * uniquely referenced. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Clear() + { + m_array.Clear(); + } + + /*! + * Destroys a sequence of \a n contiguous pointed objects, starting at the + * specified location \a i in this indirect array. Null pointers are + * ignored. + * + * This function destroys and deallocates the pointed objects, then replaces + * the corresponding pointers by \c nullptr in this array. The array length + * is not modified. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Delete( iterator i, size_type n = 1 ) + { + Delete( i, i+n ); + } + + /*! + * Destroys the objects pointed to by a range [i,j) of pointers in this + * indirect array. Null pointers are ignored. + * + * This function destroys and deallocates the pointed objects, then replaces + * the corresponding pointers by \c nullptr in this array. The array length + * is not modified. + * + * \warning This function can be useful but is potentially dangerous. If the + * array contains duplicate non-null pointers in the specified range of + * iterators, this function will lead to a crash as a result of multiple + * deletions. To minimize the risk of multiple deletions, this function + * ignores the normal data sharing mechanism so that all objects sharing the + * same array data structure will correctly 'see' the deleted pointers as + * null pointers. However, be aware of potential problems if other indirect + * containers store pointers to deleted objects in different data + * structures, which will be invalid after calling this function. + */ + void Delete( iterator i, iterator j ) + { + // NB: Copy-on-write must *not* happen in this function. + if ( i < ConstEnd() ) + { + i = pcl::Max( const_cast( ConstBegin() ), i ); + j = pcl::Min( j, const_cast( ConstEnd() ) ); + allocator a; + for ( ; i < j; ++i ) + if ( *i != nullptr ) + DeleteObject( i, a ); + } + } + + /*! + * Destroys all objects equal to \a v pointed to by non-null pointers + * contained by this array. + * + * This function destroys and deallocates the pointed objects, then replaces + * the corresponding pointers by \c nullptr in this array. The array length + * is not modified. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Delete( const T& v ) + { + // NB: Copy-on-write must *not* happen in this function. + allocator a; + for ( iterator i = const_cast( ConstBegin() ); i < ConstEnd(); ++i ) + if ( *i != nullptr && **i == v ) + DeleteObject( i, a ); + } + + /*! + * Destroys every object pointed to by a pointer x in this array such that + * the binary predicate p( *x, \a v ) is true. + * + * This function destroys and deallocates the pointed objects, then replaces + * the corresponding pointers by \c nullptr in this array. The array length + * is not modified. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + template + void Delete( const T& v, BP p ) + { + // NB: Copy-on-write must *not* happen in this function. + allocator a; + for ( iterator i = const_cast( ConstBegin() ); i < ConstEnd(); ++i ) + if ( *i != nullptr && p( **i, v ) ) + DeleteObject( i, a ); + } + + /*! + * Destroys all objects pointed to by non-null pointers in this indirect + * array. All pointers contained are set equal to \c nullptr, and the array + * length is not modified. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Delete() + { + // NB: Copy-on-write must *not* happen in this function. + allocator a; + for ( iterator i = const_cast( ConstBegin() ); i < ConstEnd(); ++i ) + if ( *i != nullptr ) + DeleteObject( i, a ); + } + + /*! + * Destroys and removes a sequence of \a n contiguous pointed objects, + * starting at the specified location \a i in this indirect array. Null + * pointers are ignored. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( iterator i, size_type n = 1 ) + { + Delete( i, n ); + Remove( i, n ); + } + + /*! + * Destroys and removes the objects pointed to by a range [i,j) of pointers + * in this indirect array. Null pointers are ignored. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( iterator i, iterator j ) + { + Delete( i, j ); + Remove( i, j ); + } + + /*! + * Destroys and removes all objects equal to \a v pointed to by non-null + * pointers contained by this array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( const T& v ) + { + array_implementation r; + allocator a; + for ( iterator i = const_cast( ConstBegin() ); i < ConstEnd(); ++i ) + if ( *i != nullptr && **i == v ) + DeleteObject( i, a ); + else + r.Add( (void*)*i ); + // NB: Copy-on-write must *not* happen before this point. + if ( r.Length() < m_array.Length() ) + m_array.Transfer( r ); + } + + /*! + * Destroys and removes every object pointed to by a pointer x in this array + * such that the binary predicate p( *x, \a v ) is true. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + template + void Destroy( const T& v, BP p ) + { + array_implementation r; + allocator a; + for ( iterator i = const_cast( ConstBegin() ); i < ConstEnd(); ++i ) + if ( *i != nullptr && p( **i, v ) ) + DeleteObject( i, a ); + else + r.Add( (void*)*i ); + // NB: Copy-on-write must *not* happen before this point. + if ( r.Length() < m_array.Length() ) + m_array.Transfer( r ); + } + + /*! + * Destroys all objects pointed to by non-null pointers in this indirect + * array, and removes all pointers, yielding an empty array. + * + * \warning See Delete( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy() + { + Delete(); + Clear(); + } + + /*! + * Removes all null pointers from this array. + */ + void Pack() + { + m_array.Remove( (void*)nullptr ); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) of + * iterators in this array by the pointers stored in an indirect array \a x. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + */ + iterator Replace( const_iterator i, const_iterator j, const IndirectArray& x ) + { + return iterator( m_array.Replace( (array_iterator)const_cast( i ), + (array_iterator)const_cast( j ), x.m_array ) ); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) in + * this indirect array by \a n copies of the specified pointer \a p. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + */ + iterator Replace( const_iterator i, const_iterator j, const T* p, size_type n = 1 ) + { + return iterator( m_array.Replace( (array_iterator)const_cast( i ), + (array_iterator)const_cast( j ), (void*)p, n ) ); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) in + * this indirect array by the sequence of pointers in the range [p,q) of + * forward iterators. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or \c nullptr if the resulting array is + * empty. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Replace( const_iterator i, const_iterator j, FI p, FI q ) + { + return iterator( m_array.Replace( (array_iterator)const_cast( i ), + (array_iterator)const_cast( j ), p, q ) ); + } + + /*! + * Ensures that this indirect array has enough capacity to store \a n + * pointers. + * + * After calling this member function with \a n > 0, this object is + * guaranteed to uniquely reference its pointer array data. + */ + void Reserve( size_type n ) + { + m_array.Reserve( n ); + } + + /*! + * Causes this indirect array to allocate the exact required memory space to + * store its contained pointers. + * + * If the array has excess capacity, a new copy of its contained pointers is + * generated and stored in a newly allocated memory block that fits them + * exactly, then the previous memory block is deallocated. + * + * If the array is empty, calling this function is equivalent to Clear(). + * Note that in this case a previously allocated memory block (by a call to + * Reserve()) may also be deallocated. + */ + void Squeeze() + { + m_array.Squeeze(); + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + Apply( [v]( T* x ){ *x = v; } ); + } + + /*! + * Calls f( T& x ) for every object x pointed to by non-null pointers in + * this array, successively from the first contained pointer to the last. + */ + template + void Apply( F f ) + { + pcl::Apply( Begin(), End(), IndirectUnaryFunction( f ) ); + } + + /*! + * Calls f( const T& x ) for every object x pointed to by non-null pointers + * in this array, successively from the first contained pointer to the last. + */ + template + void Apply( F f ) const + { + pcl::Apply( Begin(), End(), IndirectUnaryFunction( f ) ); + } + + /*! + * Returns an iterator pointing to the first non-null pointer in this array + * that points to an object x such that f( const T& x ) is true. Returns + * End() if such pointer does not exist. + */ + template + iterator FirstThat( F f ) const + { + return const_cast( pcl::FirstThat( Begin(), End(), IndirectUnaryPredicate( f ) ) ); + } + + /*! + * Returns an iterator pointing to the last non-null pointer in this array + * that points to an object x such that f( const T& x ) is true. Returns + * End() if such pointer does not exist. + */ + template + iterator LastThat( F f ) const + { + return const_cast( pcl::LastThat( Begin(), End(), IndirectUnaryPredicate( f ) ) ); + } + + /*! + * Returns the number of objects equal to \a v pointed to by non-null + * pointers stored in this indirect array. + */ + size_type Count( const T& v ) const + { + return pcl::Count( Begin(), End(), &v, equal() ); + } + + /*! + * Returns the number of pointers equal to \a p stored in this indirect + * array. + */ + size_type Count( const T* p ) const + { + return m_array.Count( (void*)p ); + } + + /*! + * Returns the number of objects pointed to by non-null pointers stored in + * this indirect array such that for each counted pointer x the binary + * predicate p( *x, v ) returns true. + */ + template + size_type Count( const T& v, BP p ) const + { + return pcl::Count( Begin(), End(), &v, IndirectBinaryPredicate( p ) ); + } + + /*! + * Returns the number of objects pointed to by non-null pointers stored in + * this indirect array such that for each counted pointer x the unary + * predicate p( *x ) returns true. + */ + template + size_type CountIf( UP p ) const + { + return pcl::CountIf( Begin(), End(), IndirectUnaryPredicate( p ) ); + } + + /*! # + */ + iterator MinItem() const + { + return const_cast( pcl::MinItem( Begin(), End(), less() ) ); + } + + /*! # + */ + template + iterator MinItem( BP p ) const + { + return const_cast( pcl::MinItem( Begin(), End(), + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + iterator MaxItem() const + { + return const_cast( pcl::MaxItem( Begin(), End(), less() ) ); + } + + /*! # + */ + template + iterator MaxItem( BP p ) const + { + return const_cast( pcl::MaxItem( Begin(), End(), + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + void Reverse() + { + m_array.Reverse(); + } + + /*! # + */ + void Rotate( distance_type n ) + { + m_array.Rotate( n ); + } + + /*! # + */ + void ShiftLeft( const T* p, size_type n = 1 ) + { + m_array.ShiftLeft( (void*)p, n ); + } + + /*! # + */ + void ShiftRight( const T* p, size_type n = 1 ) + { + m_array.ShiftRight( (void*)p, n ); + } + + /*! # + */ + iterator Search( const T& v ) const + { + return const_cast( pcl::LinearSearch( Begin(), End(), &v, equal() ) ); + } + + /*! # + */ + iterator Search( const T* p ) const + { + return iterator( m_array.Search( (void*)p ) ); + } + + /*! # + */ + template + iterator Search( const T& v, BP p ) const + { + return const_cast( pcl::LinearSearch( Begin(), End(), &v, + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + iterator SearchLast( const T& v ) const + { + return const_cast( pcl::LinearSearchLast( Begin(), End(), &v, equal() ) ); + } + + /*! # + */ + iterator SearchLast( const T* p ) const + { + return iterator( m_array.SearchLast( (void*)p ) ); + } + + /*! # + */ + template + iterator SearchLast( const T& v, BP p ) const + { + return const_cast( pcl::LinearSearchLast( Begin(), End(), &v, + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j ) const + { + return const_cast( pcl::Search( Begin(), End(), i, j, equal() ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j, BP p ) const + { + return const_cast( pcl::Search( Begin(), End(), i, j, + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& c ) const + { + return const_cast( pcl::Search( Begin(), End(), c.Begin(), c.End(), equal() ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& c, BP p ) const + { + return const_cast( pcl::Search( Begin(), End(), c.Begin(), c.End(), + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j ) const + { + return const_cast( pcl::SearchLast( Begin(), End(), i, j, equal() ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j, BP p ) const + { + return const_cast( pcl::SearchLast( Begin(), End(), i, j, + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& c ) const + { + return const_cast( pcl::SearchLast( Begin(), End(), c.Begin(), c.End(), equal() ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& c, BP p ) const + { + return const_cast( pcl::SearchLast( Begin(), End(), c.Begin(), c.End(), + IndirectBinaryPredicate( p ) ) ); + } + + /*! # + */ + bool Contains( const T& v ) const + { + return Search( v ) != End(); + } + + /*! # + */ + bool Contains( const T* p ) const + { + return m_array.Contains( (void*)p ); + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const + { + return Search( v, p ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j ) const + { + return SearchSubset( i, j ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j, BP p ) const + { + return SearchSubset( i, j, p ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( const C& c ) const + { + return SearchSubset( c ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( const C& c, BP p ) const + { + return SearchSubset( c, p ) != End(); + } + + /*! # + */ + void Sort() + { + pcl::QuickSort( Begin(), End(), less() ); + } + + /*! # + */ + template + void Sort( BP p ) + { + pcl::QuickSort( Begin(), End(), IndirectBinaryPredicate( p ) ); + } + + /*! + * Exchanges two indirect arrays \a x1 and \a x2. + */ + friend void Swap( IndirectArray& x1, IndirectArray& x2 ) + { + pcl::Swap( x1.m_array, x2.m_array ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each non-null pointer in this indirect array, this function appends a + * string representation of the pointed object (known as a \e token) to the + * target string \a s. If the array contains more than one non-null pointer, + * successive tokens are separated with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + const_iterator i = Begin(); + if ( i < End() ) + { + while ( *i == nullptr ) + if ( ++i == End() ) + return s; + s.Append( S( **i ) ); + if ( ++i < End() ) + do + if ( *i != nullptr ) + { + s.Append( separator ); + s.Append( S( **i ) ); + } + while ( ++i < End() ); + } + return s; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each non-null pointer p in this indirect array, this function appends + * a string representation of the pointed object (known as a \e token) to + * the target string \a s by calling the \a append function: + * + *\code append( s, S( *p ) ); \endcode + * + * If the array contains more than one non-null pointer, successive tokens + * are separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + const_iterator i = Begin(); + if ( i < End() ) + { + while ( *i == nullptr ) + if ( ++i == End() ) + return s; + append( s, S( **i ) ); + if ( ++i < End() ) + { + S p( separator ); + do + if ( *i != nullptr ) + { + append( s, p ); + append( s, S( **i ) ); + } + while ( ++i < End() ); + } + } + return s; + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return ToSeparated( s, ',' ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return ToSeparated( s, ' ' ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return ToSeparated( s, '\t' ); + } + + /*! + * Generates a newline-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\n' ); \endcode + */ + template + S& ToNewLineSeparated( S& s ) const + { + return ToSeparated( s, '\n' ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this indirect + * array. + * + * This function calls pcl::Hash64() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return m_array.Hash64( seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this indirect + * array. + * + * This function calls pcl::Hash32() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const + { + return m_array.Hash32( seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this indirect array. + * This function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const + { + return Hash64( seed ); + } + + // ------------------------------------------------------------------------- + +private: + + array_implementation m_array; + + void DeleteObject( iterator i, allocator& a ) + { + pcl::Destroy( *i ); + a.Deallocate( *i ); + *i = nullptr; + } + + template + void CloneObjects( const C& x, DirectContainer* ) + { + Clear(); + Reserve( x.Length() ); + Append( static_cast( nullptr ), x.Length() ); + iterator i = Begin(), j = End(); + typename C::const_iterator p = x.Begin(), q = x.End(); + for ( allocator a; i < j && p != q; ++i, ++p ) + { + *i = a.Allocate( 1 ); + pcl::Construct( *i, *p, a ); + } + } + + template + void CloneObjects( const C& x, IndirectContainer* ) + { + Clear(); + Reserve( x.Length() ); + Append( static_cast( nullptr ), x.Length() ); + iterator i = Begin(), j = End(); + typename C::const_iterator p = x.Begin(), q = x.End(); + for ( allocator a; i < j && p != q; ++i, ++p ) + if ( *p != nullptr ) + { + *i = a.Allocate( 1 ); + pcl::Construct( *i, **p, a ); + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * Returns true only if two indirect arrays \a x1 and \a x2 are equal. This + * operator compares the objects pointed to by the pointers stored in the + * indirect arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator ==( const IndirectArray& x1, const IndirectArray& x2 ) +{ + return x1.Length() == x2.Length() && pcl::Equal( x1.Begin(), x2.Begin(), x2.End(), IndirectArray::equal() ); +} + +/*! + * Returns true only if an indirect array \a x1 precedes another indirect array + * \a x2. This operator compares the objects pointed to by the pointers stored + * in the indirect arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator <( const IndirectArray& x1, const IndirectArray& x2 ) +{ + return pcl::Compare( x1.Begin(), x1.End(), x2.Begin(), x2.End(), IndirectArray::less() ) < 0; +} + +/*! + * Appends a pointer \a p to an indirect array \a x. Returns a reference to the + * left-hand indirect array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +IndirectArray& operator <<( IndirectArray& x, const V* p ) +{ + x.Append( static_cast( p ) ); + return x; +} + +/*! + * Appends a pointer \a p to a temporary indirect array \a x. Returns a + * reference to the left-hand indirect array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +IndirectArray& operator <<( IndirectArray&& x, const V* p ) +{ + x.Append( static_cast( p ) ); + return x; +} + +/*! + * Appends an indirect array \a x2 to an indirect array \a x1. Returns a + * reference to the left-hand indirect array. + * \ingroup array_insertion_operators + */ +template inline +IndirectArray& operator <<( IndirectArray& x1, const IndirectArray& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +/*! + * Appends an indirect array \a y to a temporary indirect array \a x. Returns a + * reference to the left-hand indirect array. + * \ingroup array_insertion_operators + */ +template inline +IndirectArray& operator <<( IndirectArray&& x1, const IndirectArray& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_IndirectArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/IndirectArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/IndirectSortedArray.h b/3rdparty/include/pcl/IndirectSortedArray.h new file mode 100644 index 0000000..91f4cb9 --- /dev/null +++ b/3rdparty/include/pcl/IndirectSortedArray.h @@ -0,0 +1,1311 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/IndirectSortedArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_IndirectSortedArray_h +#define __PCL_IndirectSortedArray_h + +/// \file pcl/IndirectSortedArray.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class IndirectSortedArray + * \brief Generic dynamic sorted array of pointers to objects. + * + * %IndirectSortedArray is a generic, finite sorted sequence of pointers to + * objects, implemented as a reference-counted, dynamic array of T pointers + * with automatic sorting of inserted array elements. The type A provides + * dynamic allocation for contiguous sequences of void* elements + * (StandardAllocator is used by default). + * + * Ordering of array elements is implemented by indirection, that is, the + * pointed-to objects are compared for sorting, not the contained pointers. + * + * Unlike ReferenceArray and ReferenceSortedArray, %IndirectSortedArray can + * contain null pointers, which are ignored automatically in all internal + * operations controlling the implicit ordering of the (indirectly) contained + * elements. + * + * \sa IndirectArray, ReferenceArray, ReferenceSortedArray, Array, SortedArray, + * ReferenceCounter + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS IndirectSortedArray : public IndirectSortedContainer +{ +public: + + /*! # + */ + typedef IndirectArray array_implementation; + + /*! # + */ + typedef typename array_implementation::block_allocator + block_allocator; + + /*! # + */ + typedef typename array_implementation::allocator + allocator; + + /*! # + */ + typedef typename array_implementation::iterator + iterator; + + /*! # + */ + typedef typename array_implementation::const_iterator + const_iterator; + + /*! # + */ + typedef typename array_implementation::reverse_iterator + reverse_iterator; + + /*! # + */ + typedef typename array_implementation::const_reverse_iterator + const_reverse_iterator; + + /*! # + */ + typedef typename array_implementation::equal + equal; + + /*! # + */ + typedef typename array_implementation::less + less; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty indirect sorted array. + */ + IndirectSortedArray() = default; + + /*! + * Constructs an indirect sorted array of length \a n. All contained + * pointers are initialized to \c nullptr. + */ + explicit + IndirectSortedArray( size_type n ) + : m_array( n ) + { + } + + /*! + * Constructs an indirect sorted array that stores \a n copies of a pointer + * \a p. + */ + IndirectSortedArray( size_type n, const T* p ) + : m_array( n, p ) + { + } + + /*! + * Constructs an indirect sorted array as a copy of the sequence of pointers + * defined by the range [i,j). The stored sequence of pointers is sorted by + * comparing the pointed objects. + */ + template + IndirectSortedArray( FI i, FI j ) + : m_array( i, j ) + { + Sort(); + } + + /*! + * Copy constructor. + */ + IndirectSortedArray( const IndirectSortedArray& ) = default; + + /*! + * Move constructor. + */ + IndirectSortedArray( IndirectSortedArray&& ) = default; + + /*! + * Destroys an %IndirectSortedArray object. + * + * Deallocates the internal array of pointers to objects, but does not + * destroy the pointed objects. To destroy them, you have to call Destroy() + * or Delete() explicitly. + */ + ~IndirectSortedArray() + { + } + + /*! + * Returns true iff this indirect sorted array uniquely references its + * contained array of data pointers. + */ + bool IsUnique() const + { + return m_array.IsUnique(); + } + + /*! + * Returns true iff this indirect sorted array is an alias of the indirect + * sorted array \a x. + * + * Two objects are aliases if both share the same data. Two indirect + * containers are aliases if they share a unique set of data pointers. + */ + bool IsAliasOf( const IndirectSortedArray& x ) const + { + return m_array.IsAliasOf( x.m_array ); + } + + /*! + * Ensures that this indirect array uniquely references its contained data + * pointers. + * + * If necessary, this member function generates a duplicate of the array + * of pointers, references it, and then decrements the reference counter of + * the original pointers array. + */ + void EnsureUnique() + { + m_array.EnsureUnique(); + } + + /*! + * Returns the total number of bytes required to store the array of data + * pointers in this indirect array. + */ + size_type Size() const + { + return m_array.Size(); + } + + /*! # + */ + size_type Length() const + { + return m_array.Length(); + } + + /*! # + */ + size_type Capacity() const + { + return m_array.Capacity(); + } + + /*! # + */ + size_type Available() const + { + return m_array.Available(); + } + + /*! # + */ + bool IsValid() const + { + return m_array.IsValid(); + } + + /*! # + */ + bool IsEmpty() const + { + return m_array.IsEmpty(); + } + + /*! # + */ + size_type LowerBound() const + { + return m_array.LowerBound(); + } + + /*! # + */ + size_type UpperBound() const + { + return m_array.UpperBound(); + } + + /*! # + */ + const allocator& Allocator() const + { + return m_array.Allocator(); + } + + /*! # + */ + void SetAllocator( const allocator& a ) + { + m_array.SetAllocator( a ); + } + + /*! # + */ + const_iterator At( size_type i ) const + { + return m_array.At( i ); + } + + /*! # + */ + iterator MutableAt( size_type i ) + { + return m_array.At( i ); + } + + /*! # + */ + iterator MutableIterator( const_iterator i ) + { + return m_array.MutableIterator( i ); + } + + /*! # + */ + const T* operator []( size_type i ) const + { + return m_array[i]; + } + + /*! # + */ + const T* operator *() const + { + return *Begin(); + } + + /*! # + */ + const_iterator Begin() const + { + return m_array.ConstBegin(); + } + + /*! # + */ + iterator MutableBegin() + { + return m_array.Begin(); + } + + /*! # + */ + const_iterator End() const + { + return m_array.ConstEnd(); + } + + /*! # + */ + iterator MutableEnd() + { + return m_array.End(); + } + + /*! # + */ + const_reverse_iterator ReverseBegin() const + { + return m_array.ConstReverseBegin(); + } + + /*! # + */ + reverse_iterator MutableReverseBegin() + { + return m_array.ReverseBegin(); + } + + /*! # + */ + const_reverse_iterator ReverseEnd() const + { + return m_array.ConstReverseEnd(); + } + + /*! # + */ + reverse_iterator MutableReverseEnd() + { + return m_array.ReverseEnd(); + } + + /*! # + */ + const T* First() const + { + return m_array.First(); + } + + /*! # + */ + T* MutableFirst() + { + return IsEmpty() ? nullptr : *MutableBegin(); + } + + /*! # + */ + const T* Last() const + { + return m_array.Last(); + } + + /*! # + */ + T* MutableLast() + { + return IsEmpty() ? nullptr : *MutableReverseBegin(); + } + + /*! + * Ensures that the specified iterator points to a uniquely referenced + * pointer. If necessary, this function builds a new, uniquely referenced + * copy of this indirect array by calling EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the pointer + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + m_array.UniquifyIterator( i ); + } + + /*! + * Ensures that the specified iterators point to uniquely referenced + * pointers. If necessary, this function builds a new, uniquely referenced + * copy of this indirect array by calling EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the pointers at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + m_array.UniquifyIterators( i, j ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this indirect array to reference the same set of pointers as + * another array \a x. Returns a reference to this object. + */ + IndirectSortedArray& operator =( const IndirectSortedArray& x ) + { + Assign( x ); + return *this; + } + + /*! # + */ + void Assign( const IndirectSortedArray& x ) + { + m_array.Assign( x.m_array ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + IndirectSortedArray& operator =( IndirectSortedArray&& x ) + { + Transfer( x ); + return *this; + } + + /*! # + */ + void Transfer( IndirectSortedArray& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! # + */ + void Transfer( IndirectSortedArray&& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! # + */ + IndirectSortedArray& operator =( const array_implementation& x ) + { + Assign( x ); + return *this; + } + + /*! # + */ + void Assign( const array_implementation& x ) + { + m_array.Assign( x ); + Sort(); + } + + /*! # + */ + IndirectSortedArray& operator =( array_implementation&& x ) + { + Transfer( x ); + return *this; + } + + /*! # + */ + void Transfer( array_implementation& x ) + { + m_array.Transfer( x ); + Sort(); + } + + /*! # + */ + void Transfer( array_implementation&& x ) + { + m_array.Transfer( x ); + Sort(); + } + + /*! # + */ + void Assign( const T* p, size_type n = 1 ) + { + m_array.Assign( p, n ); + } + + /*! # + */ + template + void Assign( FI i, FI j ) + { + m_array.Assign( i, j ); + Sort(); + } + + /*! # + */ + template + void CloneAssign( const C& x ) + { + m_array.CloneAssign( x ); + Sort(); + } + + /*! # + */ + void CloneAssign( SortedArray& x ) + { + m_array.CloneAssign( x ); + } + + /*! # + */ + void CloneAssign( IndirectSortedArray& x ) + { + m_array.CloneAssign( x ); + } + + /*! # + */ + void Import( iterator i, iterator j ) + { + m_array.Import( i, j ); + Sort(); + } + + /*! # + */ + iterator Release() + { + return m_array.Release(); + } + + /*! # + */ + void Add( const IndirectSortedArray& x ) + { + const_iterator p = x.m_array.Begin(), q = x.m_array.End(); + less cmp; + for ( iterator i = m_array.Begin(); i < m_array.End() && p < q; ++i ) + if ( cmp( *p, *i ) ) + i = m_array.Insert( i, *p++ ); + if ( p < q ) + m_array.Append( p, q ); + } + + /*! # + */ + void Add( const IndirectArray& x ) + { + Add( x.Begin(), x.End() ); + } + + /*! # + */ + const_iterator Add( const T* p, size_type n = 1 ) + { + return m_array.Insert( pcl::InsertionPoint( m_array.Begin(), m_array.End(), p, less() ), p, n ); + } + + /*! # + */ + template + void Add( FI i, FI j ) + { + if ( i != j ) + { + m_array.EnsureUnique(); + for ( const_iterator l = m_array.Begin(), r = m_array.End(); ; ) + { + FI h = i; + const_iterator m = m_array.Insert( pcl::InsertionPoint( l, r, *i, less() ), *i ); + + if ( ++i == j ) + break; + + if ( less()( *i, *h ) ) + { + l = m_array.Begin(); + r = m; + } + else + { + l = m+1; + r = m_array.End(); + } + } + } + } + + /*! # + */ + void Remove( const_iterator i, size_type n = 1 ) + { + m_array.Remove( i, n ); + } + + /*! # + */ + void Remove( const_iterator i, const_iterator j ) + { + m_array.Remove( i, j ); + } + + /*! + * Removes a trailing sequence of contiguous pointers from the specified + * iterator of this indirect array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator is located at or after the end of this array, + * this function does nothing. Otherwise the iterator is constrained to stay + * in the range [Begin(),End()) of existing array elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Truncate( const_iterator i ) + { + m_array.Truncate( i ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing pointers from + * this indirect array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Shrink( size_type n = 1 ) + { + m_array.Shrink( n ); + } + + /*! # + */ + void Remove( const T& v ) + { + const_iterator i = pcl::BinarySearch( Begin(), End(), &v, less() ); + if ( i != End() ) + m_array.Remove( i, pcl::InsertionPoint( i+1, End(), &v, less() ) ); + } + + /*! # + */ + template + void Remove( const T& v, BP p ) + { + m_array.Remove( v, p ); + } + + /*! # + */ + void Remove( const T* p ) + { + m_array.Remove( p ); + } + + /*! # + */ + void Clear() + { + m_array.Clear(); + } + + /*! # + */ + void Delete( iterator i, size_type n = 1 ) + { + Delete( i, i+n ); + } + + /*! # + */ + void Delete( iterator i, iterator j ) + { + // NB: Copy-on-write must *not* happen in this function. + if ( i < End() ) + { + i = pcl::Max( const_cast( Begin() ), i ); + j = pcl::Min( j, const_cast( End() ) ); + m_array.Delete( i, j ); + if ( j < End() ) + pcl::Fill( pcl::Copy( i, j, const_cast( End() ) ), + const_cast( End() ), + static_cast( nullptr ) ); + } + } + + /*! # + */ + void Delete( const T& v ) + { + // NB: Copy-on-write must *not* happen in this function. + const_iterator i = pcl::BinarySearch( Begin(), End(), &v, less() ); + if ( i != End() ) + Delete( const_cast( i ), + const_cast( pcl::InsertionPoint( i+1, Begin(), &v, less() ) ) ); + } + + /*! # + */ + template + void Delete( const T& v, BP p ) + { + // NB: Copy-on-write must *not* happen in this function. + m_array.Delete( v, p ); + pcl::QuickSort( Begin(), End(), less() ); + } + + /*! # + */ + void Delete() + { + m_array.Delete(); + } + + /*! # + */ + void Destroy( iterator i, size_type n = 1 ) + { + m_array.Destroy( i, n ); + } + + /*! # + */ + void Destroy( iterator i, iterator j ) + { + m_array.Destroy( i, j ); + } + + /*! # + */ + void Destroy( const T& v ) + { + const_iterator i = pcl::BinarySearch( Begin(), End(), &v, less() ); + if ( i != End() ) + Destroy( const_cast( i ), + const_cast( pcl::InsertionPoint( i+1, End(), &v, less() ) ) ); + } + + /*! # + */ + template + void Destroy( const T& v, BP p ) + { + m_array.Destroy( v, p ); + pcl::QuickSort( Begin(), End(), less() ); + } + + /*! # + */ + void Destroy() + { + m_array.Destroy(); + } + + /*! # + */ + void Pack() + { + m_array.Pack(); + } + + /*! # + */ + void Reserve( size_type n ) + { + m_array.Reserve( n ); + } + + /*! # + */ + void Squeeze() + { + m_array.Squeeze(); + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + m_array.Fill( v ); + } + + /*! # + */ + template + void Apply( F f ) const + { + m_array.Apply( f ); + } + + /*! # + */ + template + const_iterator FirstThat( F f ) const + { + return m_array.FirstThat( f ); + } + + /*! # + */ + template + const_iterator LastThat( F f ) const + { + return m_array.LastThat( f ); + } + + /*! # + */ + size_type Count( const T& v ) const + { + const_iterator i = pcl::BinarySearch( Begin(), End(), &v, less() ); + return (i != End()) ? pcl::InsertionPoint( i+1, End(), &v, less() ) - i : 0; + } + + /*! # + */ + size_type Count( const T* p ) const + { + return m_array.Count( p ); + } + + /*! # + */ + template + size_type Count( const T& v, BP p ) const + { + return m_array.Count( v, p ); + } + + /*! # + */ + template + size_type CountIf( UP p ) const + { + return m_array.CountIf( p ); + } + + /*! # + */ + const_iterator MinItem() const + { + return Begin(); + } + + /*! # + */ + template + const_iterator MinItem( BP p ) const + { + return m_array.MinItem( p ); + } + + /*! # + */ + const_iterator MaxItem() const + { + return IsEmpty() ? End() : End()-1; + } + + /*! # + */ + template + const_iterator MaxItem( BP p ) const + { + return m_array.MaxItem( p ); + } + + /*! # + */ + const_iterator Search( const T& v ) const + { + return pcl::BinarySearch( Begin(), End(), &v, less() ); + } + + /*! # + */ + const_iterator Search( const T* p ) const + { + return m_array.Search( p ); + } + + /*! # + */ + template + const_iterator Search( const T& v, BP p ) const + { + return m_array.Search( v, p ); + } + + /*! # + */ + const_iterator SearchLast( const T& v ) const + { + return pcl::BinarySearchLast( Begin(), End(), &v, less() ); + } + + /*! # + */ + const_iterator SearchLast( const T* p ) const + { + return m_array.SearchLast( p ); + } + + /*! # + */ + template + const_iterator SearchLast( const T& v, BP p ) const + { + return m_array.SearchLast( v, p ); + } + + /*! # + */ + bool Contains( const T& v ) const + { + return Search( v ) != End(); + } + + /*! # + */ + bool Contains( const T* p ) const + { + return m_array.Contains( p ); + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const + { + return Search( v, p ) != End(); + } + + /*! # + */ + void Sort() + { + m_array.Sort(); + } + + /*! + * Exchanges two indirect sorted arrays \a x1 and \a x2. + */ + friend void Swap( IndirectSortedArray& x1, IndirectSortedArray& x2 ) + { + pcl::Swap( x1.m_array, x2.m_array ); + } + + /*! + * Returns true only if two indirect sorted arrays \a x1 and \a x2 are + * equal. + * \ingroup array_relational_operators + */ + friend bool operator ==( const IndirectSortedArray& x1, const IndirectSortedArray& x2 ) + { + return x1.m_array == x2.m_array; + } + + /*! + * Returns true only if an indirect sorted array \a x1 is equal to an + * indirect array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const IndirectSortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array == x2; + } + + /*! + * Returns true only if an indirect array \a x1 is equal to an indirect + * sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const array_implementation& x1, const IndirectSortedArray& x2 ) + { + return x1 == x2.m_array; + } + + /*! + * Returns true only if an indirect sorted array \a x1 precedes another + * indirect sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const IndirectSortedArray& x1, const IndirectSortedArray& x2 ) + { + return x1.m_array < x2.m_array; + } + + /*! + * Returns true only if an indirect sorted array \a x1 precedes an indirect + * array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const IndirectSortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array < x2; + } + + /*! + * Returns true only if an indirect array \a x1 precedes an indirect sorted + * array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const array_implementation& x1, const IndirectSortedArray& x2 ) + { + return x1 < x2.m_array; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each non-null pointer in this indirect array, this function appends a + * string representation of the pointed object (known as a \e token) to the + * target string \a s. If the array contains more than one non-null pointer, + * successive tokens are separated with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + return m_array.ToSeparated( s, separator ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each non-null pointer p in this indirect array, this function appends + * a string representation of the pointed object (known as a \e token) to + * the target string \a s by calling the \a append function: + * + *\code append( s, S( *p ) ); \endcode + * + * If the array contains more than one non-null pointer, successive tokens + * are separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + return m_array.ToSeparated( s, separator, append ); + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return m_array.ToCommaSeparated( s ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return m_array.ToSpaceSeparated( s ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return m_array.ToTabSeparated( s ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this indirect + * array. + * + * This function calls pcl::Hash64() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return m_array.Hash64( seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this indirect + * array. + * + * This function calls pcl::Hash32() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const + { + return m_array.Hash32( seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this indirect array. + * This function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const + { + return Hash64( seed ); + } + + // ------------------------------------------------------------------------- + +private: + + array_implementation m_array; +}; + +// ---------------------------------------------------------------------------- + +/*! + * Adds a pointer \a p to an indirect sorted array \a x. Returns a reference to + * the left-hand indirect sorted array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray& x, const V* p ) +{ + x.Add( static_cast( p ) ); + return x; +} + +/*! + * Adds a pointer \a p to a temporary indirect sorted array \a x. Returns a + * reference to the left-hand indirect sorted array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray&& x, const V* p ) +{ + x.Add( static_cast( p ) ); + return x; +} + +/*! + * Adds an indirect sorted array \a x2 to an indirect sorted array \a x1. + * Returns a reference to the left-hand indirect sorted array. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray& x1, const IndirectSortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds an indirect sorted array \a x2 to a temporary indirect sorted array + * \a x1. Returns a reference to the left-hand indirect sorted array. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray&& x1, const IndirectSortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds an indirect array \a x2 to an indirect sorted array \a x1. Returns a + * reference to the left-hand indirect sorted array. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray& x1, const IndirectArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds an indirect array \a x2 to a temporary indirect sorted array \a x1. + * Returns a reference to the left-hand indirect sorted array. + * \ingroup array_insertion_operators + */ +template inline +IndirectSortedArray& operator <<( IndirectSortedArray&& x1, const IndirectArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_IndirectSortedArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/IndirectSortedArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/IntegerResample.h b/3rdparty/include/pcl/IntegerResample.h new file mode 100644 index 0000000..f1a42eb --- /dev/null +++ b/3rdparty/include/pcl/IntegerResample.h @@ -0,0 +1,220 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/IntegerResample.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_IntegerResample_h +#define __PCL_IntegerResample_h + +/// \file pcl/IntegerResample.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::IntegerDownsampleMode + * \brief Downsampling operations for IntegerResample. + * + * + * + * + * + * + *
IntegerDownsampleMode::Average Downsample by averaging source pixels
IntegerDownsampleMode::Median Downsample by calculating the median of source pixels
IntegerDownsampleMode::Maximum Downsample by the maximum source pixel value
IntegerDownsampleMode::Minimum Downsample by the minimum source pixel value
+ */ +namespace IntegerDownsampleMode +{ + enum value_type + { + Average, + Median, + Maximum, + Minimum + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class IntegerResample + * \brief A geometric transformation to resample images by integer ratios. + * + * ### TODO: Write a detailed description for %IntegerResample. + */ +class PCL_CLASS IntegerResample : public GeometricTransformation +{ +public: + + /*! + * Represents a downsample operation. + */ + typedef IntegerDownsampleMode::value_type downsample_mode; + + /*! + * Constructs an %IntegerResample object with zoom factor \a z and + * downsampling mode \a m. + */ + IntegerResample( int zoom = 0, downsample_mode mode = IntegerDownsampleMode::Average ) + : m_zoomFactor( zoom ) + , m_downsampleMode( mode ) + { + } + + /*! + * Copy constructor. + */ + IntegerResample( const IntegerResample& ) = default; + + /*! + * Returns the current zoom factor of this %IntegerResample object. + */ + int ZoomFactor() const + { + return m_zoomFactor; + } + + /*! + * Sets the \a zoom factor for this %IntegerResample object. + * + * Positive zoom factors are interpreted as magnifying factors; negative + * zoom factors are reduction factors. For example: + * + * + * + * + * + * + * + * + *
Zoom Factor Resampling ratio (original pixels : resampled pixels)
-3 1:3 (1/3 reduction)
-2 1:2 (1/2 reduction)
1 1:1 (actual pixels)
2 2:1 (x2 magnification)
3 3:1 (x3 magnification)
+ * + * \note Zoom factors 0 and -1 should not be used explicitly; they are + * reserved for internal use, and there is no guarantee that future versions + * of PCL will continue accepting them. + */ + void SetZoomFactor( int zoom ) + { + m_zoomFactor = (zoom < -1 || zoom > +1) ? zoom : +1; + } + + /*! + * Returns the pixel scaling factor applied by this instance, or the + * equivalent image resampling ratio. See SetZoomFactor() for the + * correspondence between zoom factors and resampling ratios. + */ + double ScalingFactor() const + { + if ( m_zoomFactor == 0 ) + return 1; + return (m_zoomFactor < 0) ? 1.0/(-m_zoomFactor) : double( m_zoomFactor ); + } + + /*! + * Returns the current downsample mode of this %IntegerResample object. + */ + downsample_mode DownsampleMode() const + { + return m_downsampleMode; + } + + /*! + * Sets the downsample \e mode for this %IntegerResample object. + * + * The downsample mode defines an statistical operation that the integer + * resampling algorithms applies to the set of original pixels that produce + * each pixel in the subsampled image. The default mode is + * IntegerDownsampleMode::Average, which calculates the mean of source + * pixels. The Median, Minimum and Maximum modes turn the integer + * downsampling algorithm into a morphological downsampling + * operation with very interesting properties and applications. + */ + void SetDownsampleMode( downsample_mode mode ) + { + m_downsampleMode = mode; + } + + /*! + */ + void GetNewSizes( int& width, int& height ) const override; + +protected: + + /* + * Zoom factor: > 1 -> zoom in, < 1 -> zoom out, from -1 to +1 -> no change. + */ + int m_zoomFactor = 0; + + /* + * Downsample mode: average, median, maximum, minimum; see enumeration above. + */ + downsample_mode m_downsampleMode = IntegerDownsampleMode::Average; + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_IntegerResample_h + +// ---------------------------------------------------------------------------- +// EOF pcl/IntegerResample.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/IntegrationMetadata.h b/3rdparty/include/pcl/IntegrationMetadata.h new file mode 100644 index 0000000..3d41b51 --- /dev/null +++ b/3rdparty/include/pcl/IntegrationMetadata.h @@ -0,0 +1,426 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/IntegrationMetadata.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_IntegrationMetadata_h +#define __PCL_IntegrationMetadata_h + +/// \file pcl/IntegrationMetadata.h + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ConsistentlyDefined + * \brief An object that can be in consistently defined or undefined/inconsistent states. + * + * %ConsistentlyDefined is similar to Optional: it stores an instance of the + * template argument T, along with a defined state Boolean flag. In + * addition, this class includes a \e consistency state flag. A + * consistently defined object has been both defined and optionally + * ckecked for consistency against other objects or values. Two objects are + * considered consistent if an equality operator is true for them. + * + * As happens with %Optional, %ConsistentlyDefined objects update their defined + * and consistency states automatically as they are created, copied and + * assigned. + * + * \note This is a support utility class used internally by several modules, + * made public mainly for code organization purposes. We make this class public + * because it can be useful, but it still has not been fully developed as it + * should to fulfill standard PCL quality standards. + */ +template +class PCL_CLASS ConsistentlyDefined +{ +public: + + /*! + * Constructs an undefined, consistent %ConsistentlyDefined object. + * + * The value instance will be default-constructed implicitly, which means + * that the type T must provide valid default construction semantics. + */ + ConsistentlyDefined() + : m_value() // N.B: this initialization prevents warnings such as + { // 'ConsistentlyDefined<>::m_value may be used uninitialized...' + } + + /*! + * Copy constructor. + * + * The value instance will be copy-constructed implicitly, which means that + * the type T must provide valid copy construction semantics if this + * constructor is invoked. + */ + ConsistentlyDefined( const ConsistentlyDefined& ) = default; + + /* + * Move constructor. + */ + ConsistentlyDefined( ConsistentlyDefined&& ) = default; + + /*! + * Constructs a defined, consistent %ConsistentlyDefined object with the + * specified \a value. + */ + ConsistentlyDefined( const T& value ) + : m_value( value ) + , m_defined( true ) + { + } + + /*! + * Assigns the specified \a value to this object. Returns a reference to + * this object. After assigning a value, a %ConsistentlyDefined object will + * be in defined/consistent state. + */ + T& operator =( const T& value ) + { + m_value = value; + m_defined = m_consistent = true; + return m_value; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * If this object is inconsistent, then this function does nothing but + * returning a reference to this. + * + * If this object is consistent, then: + * + * - If \a other is defined and this is defined, then if the values of both + * objects are different, this object will be in defined/inconsistent state. + * + * - If \a other is defined and this is not defined, then the value of + * \a other will be assigned to this object, and this object will be in + * defined/consistent state. + * + * - If \a other is not defined and this is defined, then this object will + * be in defined/inconsistent state. + */ + ConsistentlyDefined& operator =( const ConsistentlyDefined& other ) + { + if ( m_consistent ) + if ( other.m_defined ) + { + if ( m_defined ) + { + if ( m_value != other.m_value ) + m_consistent = false; + } + else + { + m_value = other.m_value; + m_defined = true; + } + } + else + { + if ( m_defined ) + m_consistent = false; + } + + return *this; + } + + /*! + * Addition/assignment operator. Returns a reference to this object. + * + * If this object is inconsistent, then this function does nothing but + * returning a reference to this. + * + * If this object is consistent, then: + * + * - If \a other is defined and this is defined, then the value of \a other + * will be added to this object's value, and this object will remain in + * defined/consistent state. + * + * - If \a other is defined and this is not defined, then the value of + * \a other will be assigned to this object, and this object will be in + * defined/consistent state. + * + * - If \a other is not defined and this is defined, then this object will + * be in defined/inconsistent state. + */ + ConsistentlyDefined& operator +=( const ConsistentlyDefined& other ) + { + if ( m_consistent ) + if ( other.m_defined ) + { + if ( m_defined ) + m_value += other.m_value; + else + { + m_value = other.m_value; + m_defined = true; + } + } + else + { + if ( m_defined ) + m_consistent = false; + } + + return *this; + } + + /*! + * Addition/assignment operator. Returns a reference to this object. + * + * If this object is inconsistent, then this function does nothing but + * returning a reference to this. + * + * If this object is consistent, then: + * + * - If this object is defined, then \a otherValue will be added to this + * object's value, and this object will remain in defined/consistent state. + * + * - If this object is not defined, then \a otherValue will be assigned to + * this object, and this object will be in defined/consistent state. + */ + ConsistentlyDefined& operator +=( const T& otherValue ) + { + if ( m_consistent ) + if ( m_defined ) + m_value += otherValue; + else + { + m_value = otherValue; + m_defined = true; + } + + return *this; + } + + /*! + * Returns a reference to the value stored in this object. + * + * If this object is undefined, the returned value may be unpredictable, + * depending on construction semantics for the type T. + */ + const T& operator ()() const + { + return m_value; + } + + /*! + * Returns true iff this object has been defined, even if it's inconsistent. + */ + bool IsDefined() const + { + return m_defined; + } + + /*! + * Returns true iff this object is consistent, even if it has not been + * defined. + */ + bool IsConsistent() const + { + return m_consistent; + } + + /*! + * If this object is in defined/consistent state, then this function returns + * true. + * + * If this object is in undefined state, this function returns false. + * + * If this object is in defined/inconsistent state, this function returns + * false. In this case, if the \a what string is not empty, a warning + * message will be written to the core platform's console alerting about the + * inconsistent state. + */ + bool IsConsistentlyDefined( const String& what = String() ) const + { + if ( m_defined ) + { + if ( m_consistent ) + return true; + if ( !what.IsEmpty() ) + Console().WarningLn( "** Warning: Inconsistent " + what + " value(s) - metadata not generated." ); + } + return false; + } + + /*! + * Force this object to be in undefined state. + */ + void Undefine() + { + m_defined = false; + } + + /*! + * Force this object to be in inconsistent state. + */ + void SetInconsistent() + { + m_consistent = false; + } + + /*! + * Changes the value in this object in a forcible way, i.e. without checking + * for consistency. + */ + void ForceValue( const T& value ) + { + m_value = value; + } + + /*! + * Returns a String representation of the value in this object if it has + * been defined (even if it's inconsistent). Otherwise returns an empty + * string. + */ + String ToString() const + { + return m_defined ? String( m_value ) : String(); + } + +private: + + T m_value; + bool m_defined = false; + bool m_consistent = true; +}; + +// ---------------------------------------------------------------------------- + +#define __PCL_INTEGRATION_METADATA_VERSION "1.2" + +/* + * Optional, consistently defined metadata of an integrable image. + * + * ### N.B. Internal use - Not a public interface. + */ +class IntegrationMetadata +{ +public: + + String version = __PCL_INTEGRATION_METADATA_VERSION; + ConsistentlyDefined author; + ConsistentlyDefined observer; + ConsistentlyDefined instrumentName; + ConsistentlyDefined frameType; + ConsistentlyDefined filterName; + ConsistentlyDefined cfaPatternName; + ConsistentlyDefined cfaPattern; + ConsistentlyDefined cfaXOffset; // px + ConsistentlyDefined cfaYOffset; // px + ConsistentlyDefined pedestal; // DN + ConsistentlyDefined expTime; // s + ConsistentlyDefined sensorTemp; // C + ConsistentlyDefined xPixSize; // um + ConsistentlyDefined yPixSize; // um + ConsistentlyDefined cameraGain; + ConsistentlyDefined cameraISO; + ConsistentlyDefined xBinning; + ConsistentlyDefined yBinning; + ConsistentlyDefined xOrigin; // px + ConsistentlyDefined yOrigin; // px + ConsistentlyDefined telescopeName; + ConsistentlyDefined focalLength; // mm + ConsistentlyDefined aperture; // mm + ConsistentlyDefined apertureArea; // mm^2 + ConsistentlyDefined objectName; + ConsistentlyDefined startTime; // UTC + ConsistentlyDefined endTime; // UTC + ConsistentlyDefined ra; // deg (-180,+180] + ConsistentlyDefined dec; // deg [-90,+90] + ConsistentlyDefined celCrdSys; // ICRS, FK5 + ConsistentlyDefined equinox; // yr + ConsistentlyDefined longObs; // deg (-180,+180] + ConsistentlyDefined latObs; // deg [-90,+90] + ConsistentlyDefined altObs; // m + + IntegrationMetadata() = default; + IntegrationMetadata( const IntegrationMetadata& ) = default; + + IntegrationMetadata( const PropertyArray&, const FITSKeywordArray& ); + IntegrationMetadata( const String& serialization ); + + String Serialize() const; + + bool IsValid() const + { + return m_valid; + } + + void UpdatePropertiesAndKeywords( PropertyArray&, FITSKeywordArray& ) const; + + static IntegrationMetadata Summary( const Array& ); + +private: + + bool m_valid = false; + + // Block separators for text metadata serialization (UTF-16). + constexpr static char16_type ItemSeparator = char16_type( 0x2028 ); // Unicode Line Separator + constexpr static char16_type TokenSeparator = char16_type( 0x2029 ); // Unicode Paragraph Separator +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_IntegrationMetadata_h + +// ---------------------------------------------------------------------------- +// EOF pcl/IntegrationMetadata.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/InterlacedTransformation.h b/3rdparty/include/pcl/InterlacedTransformation.h new file mode 100644 index 0000000..779c390 --- /dev/null +++ b/3rdparty/include/pcl/InterlacedTransformation.h @@ -0,0 +1,181 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/InterlacedTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_InterlacedTransformation_h +#define __PCL_InterlacedTransformation_h + +/// \file pcl/InterlacedTransformation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class InterlacedTransformation + * \brief Interlaced image transformation in the spatial domain. + * + * %InterlacedTransformation represents an interlaced image + * transformation in PCL. An interlaced transformation can be applied to a + * subset of the pixels in a target image by acting exclusively on selected + * rows and columns of pixels, distributed at regular intervals. + * + * The distance between two consecutive rows or columns of transformed pixels + * is the interlacing distance that characterizes an interlaced + * transformation. Intermediate pixels falling between selected rows or columns + * are ignored during the transformation. + * + * In PCL, convolutions in the spatial domain and morphological transformations + * have been implemented as interlaced transformations. A good example of + * interlaced image transformation algorithm is the starlet transform (see the + * StarletTransform class), which uses interlaced convolutions to perform a + * multiscale decomposition. + */ +class PCL_CLASS InterlacedTransformation : public virtual ImageTransformation +{ +public: + + /*! + * Constructs an %InterlacedTransformation object with the specified + * interlacing distance \a n > 0 in pixels. + */ + InterlacedTransformation( int n = 1 ) + : m_distance( pcl::Max( 1, n ) ) + { + PCL_PRECONDITION( n > 0 ) + } + + /*! + * Copy constructor. + */ + InterlacedTransformation( const InterlacedTransformation& ) = default; + + /*! + * Destroys an %InterlacedTransformation object. + */ + virtual ~InterlacedTransformation() + { + } + + /*! + * Returns true iff this transformation is currently interlaced. + * + * The transformation is interlaced if the current interlacing distance is + * greater than one pixel. + * + * \sa InterlacingDistance() + */ + bool IsInterlaced() const + { + return m_distance > 1; + } + + /*! + * Returns the current interlacing distance of this transformation in + * pixels. + * + * \sa SetInterlacingDistance(), IsInterlaced() + */ + int InterlacingDistance() const + { + return m_distance; + } + + /*! + * Sets the current interlacing distance of this transformation to the + * specified value \a n > 0 in pixels. + * + * The interlacing distance is the distance in pixels between two + * consecutive rows or columns of transformed pixels. Intermediate pixels + * falling between selected rows or columns are ignored. + * + * \sa InterlacingDistance(), DisableInterlacing(), IsInterlaced() + */ + void SetInterlacingDistance( int n ) + { + PCL_PRECONDITION( n > 0 ) + m_distance = pcl::Max( 1, n ); + } + + /*! + * Disables interlacing for this transformation. + * + * This is a convenience function, equivalent to: + * + * \code SetInterlacingDistance( 1 ); \endcode + */ + void DisableInterlacing() + { + SetInterlacingDistance( 1 ); + } + +private: + + /* + * Interlacing distance in pixels + */ + int m_distance = 1; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_InterlacedTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/InterlacedTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Interpolation.h b/3rdparty/include/pcl/Interpolation.h new file mode 100644 index 0000000..b0ede84 --- /dev/null +++ b/3rdparty/include/pcl/Interpolation.h @@ -0,0 +1,112 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Interpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Interpolation_h +#define __PCL_Interpolation_h + +/// \file pcl/Interpolation.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::InterpolationAlgorithm + * \brief Standard pixel interpolation algorithms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
InterpolationAlgorithm::NearestNeighbor Nearest neighbor interpolation
InterpolationAlgorithm::Bilinear Bilinear interpolation
InterpolationAlgorithm::BicubicSpline Bicubic spline interpolation (usually the default algorithm)
InterpolationAlgorithm::Bicubic A synonym for bicubic spline interpolation
InterpolationAlgorithm::BicubicBSpline Bicubic B-spline interpolation
InterpolationAlgorithm::Lanczos3 Lanczos-3 interpolation
InterpolationAlgorithm::Lanczos4 Lanczos-4 interpolation
InterpolationAlgorithm::Lanczos5 Lanczos-5 interpolation
InterpolationAlgorithm::MitchellNetravaliFilter Mitchell-Netravali cubic filter interpolation
InterpolationAlgorithm::CatmullRomSplineFilter Catmull-Rom spline filter interpolation
InterpolationAlgorithm::CubicBSplineFilter Cubic B-spline filter interpolation
InterpolationAlgorithm::Auto Used to indicate an automatic algorithm selection (often the default option)
InterpolationAlgorithm::Default Used to indicate a default interpolation algorithm (currently bicubic spline)
+ */ +namespace InterpolationAlgorithm +{ + enum value_type + { + Auto = -1, + NearestNeighbor = 0, + Bilinear, + BicubicSpline, + Bicubic = BicubicSpline, + BicubicBSpline, + Lanczos3, + Lanczos4, + Lanczos5, + MitchellNetravaliFilter, + CatmullRomSplineFilter, + CubicBSplineFilter, + NumberOfInterpolationAlgorithms, + Default = BicubicSpline + }; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Interpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Interpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Iterator.h b/3rdparty/include/pcl/Iterator.h new file mode 100644 index 0000000..be19791 --- /dev/null +++ b/3rdparty/include/pcl/Iterator.h @@ -0,0 +1,734 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Iterator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Iterator_h +#define __PCL_Iterator_h + +/// \file pcl/Iterator.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup iterator_classification Iterator Classification + */ + +/*! + * \class ForwardIterator + * \brief Forward iterator class. + * \ingroup iterator_classification + */ +class PCL_CLASS ForwardIterator +{ +}; + +/*! + * \class BidirectionalIterator + * \brief Bidirectional iterator class. + * \ingroup iterator_classification + */ +class PCL_CLASS BidirectionalIterator : public ForwardIterator +{ +}; + +/*! + * \class RandomAccessIterator + * \brief Random access iterator class. + * \ingroup iterator_classification + */ +class PCL_CLASS RandomAccessIterator : public BidirectionalIterator +{ +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Iterator + * \brief Generic container iterator. + */ +template +struct PCL_CLASS Iterator +{ + typedef C iterator_class; //!< Represents the iterator class + typedef T item_type; //!< Represents the item type +}; + +// ---------------------------------------------------------------------------- + +/*! + * Returns an instance of the iterator class corresponding to an instantiation + * of the %Iterator class. + */ +template inline +C IteratorClass( const Iterator& ) +{ + return C(); +} + +/*! + * Returns an instance of the iterator class for a pointer iterator, which is + * RandomAccessIterator. + */ +template inline +RandomAccessIterator IteratorClass( const T* ) +{ + return RandomAccessIterator(); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a pointer to the item type of an instantiation of the %Iterator + * class. The returned pointer has always a \c nullptr value. + */ +template inline +T* ItemType( const Iterator& ) +{ + return nullptr; +} + +/*! + * Returns a pointer to the item type of a pointer iterator, which is the same + * pointer. The returned pointer has always a \c nullptr value. + */ +template inline +T* ItemType( const T* ) +{ + return nullptr; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the existing distance in items from an iterator \a i to another + * iterator \a j. + */ +template inline +distance_type Distance( FI i, FI j ) +{ + return __pcl_distance__( i, j, IteratorClass( i ) ); +} + +template inline +distance_type __pcl_distance__( FI i, FI j, ForwardIterator ) +{ + distance_type d = 0; + for ( ; i != j; ++i, ++d ) {} + return d; +} + +template inline +distance_type __pcl_distance__( RI i, RI j, RandomAccessIterator ) +{ + return j - i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Advances an iterator \a i by the specified distance \a d. + */ +template inline +void Advance( FI& i, distance_type d ) +{ + __pcl_advance__( i, d, IteratorClass( i ) ); +} + +template inline +void __pcl_advance__( FI& i, distance_type d, ForwardIterator ) +{ + PCL_PRECONDITION( d >= 0 ) + for ( ; d > 0; --d, ++i ) {} +} + +template inline +void __pcl_advance__( BI& i, distance_type d, BidirectionalIterator ) +{ + if ( d > 0 ) + for ( ; ++i, --d > 0; ) {} + else + for ( ; d < 0; ++d, --i ) {} +} + +template inline +void __pcl_advance__( RI& i, distance_type d, RandomAccessIterator ) +{ + i += d; +} + +// ---------------------------------------------------------------------------- + +/*! + * Moves an iterator \a i forward by the specified number \a n of items. + */ +template inline +void MoveForward( FI& i, size_type n ) +{ + __pcl_move_forward__( i, n, IteratorClass( i ) ); +} + +template inline +void __pcl_move_forward__( FI& i, size_type n, ForwardIterator ) +{ + for ( ; n > 0; --n, ++i ) {} +} + +template inline +void __pcl_move_forward__( RI& i, size_type n, RandomAccessIterator ) +{ + i += n; +} + +// ---------------------------------------------------------------------------- + +/*! + * Moves an iterator \a i backward by the specified number \a n of items. + */ +template inline +void MoveBackward( BI& i, size_type n ) +{ + __pcl_move_backward__( i, n, IteratorClass( i ) ); +} + +template inline +void __pcl_move_backward__( BI& i, size_type n, BidirectionalIterator ) +{ + for ( ; n > 0; --n, --i ) {} +} + +template inline +void __pcl_move_backward__( RI& i, size_type n, RandomAccessIterator ) +{ + i -= n; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class ReverseIteratorBase + * \brief Base class of reverse iterators. + */ +template +class PCL_CLASS ReverseIteratorBase : public pcl::Iterator +{ +public: + + /*! + * Constructs a default %ReverseIteratorBase object. + */ + ReverseIteratorBase() = default; + + /*! + * Copy constructor. + */ + ReverseIteratorBase( const ReverseIteratorBase& i ) + : pcl::Iterator( i ) + , iterator( i.iterator ) + { + } + + /*! + * Constructs a %ReverseIteratorBase object as a duplicate of the specified + * bidirectional iterator \a i. + */ + ReverseIteratorBase( const BI& i ) + : iterator( i ) + { + } + + /*! + * Indirection operator. Returns a reference to the object pointed to by + * this reverse iterator. + */ + T& operator *() const + { + return (T&)*iterator; + } + + /*! + * Structure selection operator. Returns a copy of the bidirectional + * iterator contained by this reverse iterator. + */ + BI operator ->() const + { + return this->Iterator(); + } + + /*! + * Returns a bidirectional iterator that points to the object pointed by + * this %ReverseIteratorBase object. + */ + operator BI() const + { + return this->Iterator(); + } + + /*! + * A synonym for operator BI() const. + */ + BI Iterator() const + { + return iterator; + } + +protected: + + BI iterator; + + void PreIncrement() + { + --iterator; + } + + BI PostIncrement() + { + BI tmp = iterator; + --iterator; + return tmp; + } + + void PreDecrement() + { + ++iterator; + } + + BI PostDecrement() + { + BI tmp = iterator; + ++iterator; + return tmp; + } +}; + +/*! + * Returns true iff two reverse iterators \a i and \a j are equal. Two reverse + * iterators are equal if they point to the same item. + */ +template inline +bool operator ==( const ReverseIteratorBase& i, const ReverseIteratorBase& j ) +{ + return i.Iterator() == j.Iterator(); +} + +// ---------------------------------------------------------------------------- + +#define IMPLEMENT_INCDEC_OPERATORS \ + __I__& operator ++() { __R__::PreIncrement(); return *this; } \ + __I__ operator ++( int ) { return __I__( __R__::PostIncrement() ); } \ + __I__& operator --() { __R__::PreDecrement(); return *this; } \ + __I__ operator --( int ) { return __I__( __R__::PostDecrement() ); } + +/*! + * \class ReverseBidirectionalIterator + * \brief Reverse bidirectional iterator. + */ +template +class PCL_CLASS ReverseBidirectionalIterator : public ReverseIteratorBase +{ + typedef ReverseIteratorBase __R__; + typedef ReverseBidirectionalIterator __I__; + +public: + + /*! + * Constructs a %ReverseBidirectionalIterator object. + */ + ReverseBidirectionalIterator() = default; + + /*! + * Copy constructor. + */ + ReverseBidirectionalIterator( const ReverseBidirectionalIterator& i ) + : __R__( i ) + { + } + + /*! + * Constructs a %ReverseBidirectionalIterator object as a duplicate of the + * specified bidirectional iterator \a i. + */ + ReverseBidirectionalIterator( const BI& i ) + : __R__( i ) + { + } + + IMPLEMENT_INCDEC_OPERATORS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ReverseRandomAccessIterator + * \brief Reverse random access iterator. + */ +template +class PCL_CLASS ReverseRandomAccessIterator : public ReverseIteratorBase +{ + typedef ReverseIteratorBase __R__; + typedef ReverseRandomAccessIterator __I__; + +public: + + /*! + * Constructs a %ReverseRandomAccessIterator object. + */ + ReverseRandomAccessIterator() = default; + + /*! + * Copy constructor. + */ + ReverseRandomAccessIterator( const ReverseRandomAccessIterator& i ) + : __R__( i ) + { + } + + /*! + * Constructs a %ReverseRandomAccessIterator object as a duplicate of the + * specified random access iterator \a i. + */ + ReverseRandomAccessIterator( const RI& i ) + : __R__( i ) + { + } + + /*! + * Subscript operator. Returns a reference to the object at a distance \a d + * from the current iterator position. + */ + T& operator[]( size_type d ) const + { + return (T&)*(__R__::iterator - d); + } + + /*! + * Increments this interator by the specified distance \a d. Returns a + * reference to this object. + */ + ReverseRandomAccessIterator& operator +=( distance_type d ) + { + __R__::iterator -= d; + return *this; + } + + /*! + * Decrements this interator by the specified distance \a d. Returns a + * reference to this object. + */ + ReverseRandomAccessIterator& operator -=( distance_type d ) + { + __R__::iterator += d; + return *this; + } + + IMPLEMENT_INCDEC_OPERATORS +}; + +#undef IMPLEMENT_INCDEC_OPERATORS + +/*! # + */ +template inline +bool operator <( const ReverseRandomAccessIterator& i, const ReverseRandomAccessIterator& j ) +{ + return j.Iterator() < i.Iterator(); +} + +/*! # + */ +template inline +ReverseRandomAccessIterator operator +( const ReverseRandomAccessIterator& i, distance_type d ) +{ + RI r = i.Iterator(); + return r -= d; +} + +/*! # + */ +template inline +ReverseRandomAccessIterator operator +( distance_type d, const ReverseRandomAccessIterator& i ) +{ + return i + d; +} + +/*! # + */ +template inline +ReverseRandomAccessIterator operator -( const ReverseRandomAccessIterator& i, distance_type d ) +{ + RI r = i.Iterator(); + return r += d; +} + +/*! # + */ +template inline +distance_type operator -( const ReverseRandomAccessIterator& i, const ReverseRandomAccessIterator& j ) +{ + return j.Iterator() - i.Iterator(); +} + +// ---------------------------------------------------------------------------- + +/*! + * \class ReverseIterable + * \brief Reverse container adaptor + * + * A utility template class to facilitate the use of ranged-based for loops + * with reverse container iteration. Example of use: + * + * \code + * Array A{ 1, 2, 3, 4, 5 }; + * for ( auto a : A ) + * cout << a << ' '; + * cout << '\n'; + * for ( auto a : ReverseIterable( A ) ) + * cout << a << ' '; + * cout << '\n'; + * \endcode + * + * The output is: + * + * 1 2 3 4 5 \n + * 5 4 3 2 1 + * + * \note This class requires a compiler with C++14 support. In addition, the + * above example assumes a compiler with support for class template argument + * deduction, which is a C++17 feature. + */ +template +class PCL_CLASS ReverseIterable +{ +public: + + typedef C container; + + ReverseIterable( container& c ) + : m_container( c ) + { + } + + ReverseIterable( const ReverseIterable& ) = default; + + /*! + * Returns a mutable reverse iterator located at the reverse + * beginning of the iterated container. + * + * The reverse beginning corresponds to the last element in the container. + */ + auto Begin() + { + return m_container.ReverseBegin(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of the iterated container. + * + * The reverse beginning corresponds to the last element in the container. + */ + auto Begin() const + { + return m_container.ReverseBegin(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of the iterated container. + * + * The reverse beginning corresponds to the last element in the container. + */ + auto ConstBegin() const + { + return m_container.ConstReverseBegin(); + } + + /*! + * Returns a mutable reverse iterator located at the reverse end of + * the iterated container. + * + * The reverse end corresponds to a nonexistent element immediately before + * the first element in the container. + */ + auto End() + { + return m_container.ReverseEnd(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of the iterated container. + * + * The reverse end corresponds to a nonexistent element immediately before + * the first element in the container. + */ + auto End() const + { + return m_container.ReverseEnd(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of the iterated container. + * + * The reverse end corresponds to a nonexistent element immediately before + * the first element in the container. + */ + auto ConstEnd() const + { + return m_container.ConstReverseEnd(); + } + + /*! + * Returns a mutable iterator located at the beginning of the iterated + * container. + */ + auto ReverseBegin() + { + return m_container.Begin(); + } + + /*! + * Returns an immutable iterator located at the beginning of the iterated + * container. + */ + auto ReverseBegin() const + { + return m_container.Begin(); + } + + /*! + * Returns an immutable iterator located at the beginning of the iterated + * container. + */ + auto ConstReverseBegin() const + { + return m_container.ConstBegin(); + } + + /*! + * Returns a mutable iterator located at the end of the iterated container. + */ + auto ReverseEnd() + { + return m_container.End(); + } + + /*! + * Returns an immutable iterator located at the end of the iterated + * container. + */ + auto ReverseEnd() const + { + return m_container.End(); + } + + /*! + * Returns an immutable iterator located at the end of the iterated + * container. + */ + auto ConstReverseEnd() const + { + return m_container.ConstEnd(); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + auto begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + auto begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + auto end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + auto end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + +private: + + container& m_container; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Iterator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Iterator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/JPLEphemeris.h b/3rdparty/include/pcl/JPLEphemeris.h new file mode 100644 index 0000000..13c0758 --- /dev/null +++ b/3rdparty/include/pcl/JPLEphemeris.h @@ -0,0 +1,611 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/JPLEphemeris.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_JPLEphemeris_h +#define __PCL_JPLEphemeris_h + +/// \file pcl/JPLEphemeris.h + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup solar_system_ephemerides Solar System Ephemerides + */ + +/*! + * \namespace pcl::JPLEphemerisItem + * \brief JPL planetary ephemeris items + * + * Defines symbolic constants for native and derived JPL planetary ephemeris + * items. All items defined by DE438t/LE438t are currently supported. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
JPLEphemerisItem::Unknown Unknown ephemeris item.
JPLEphemerisItem::Mercury
JPLEphemerisItem::Venus
JPLEphemerisItem::EarthMoonBarycenter
JPLEphemerisItem::Mars
JPLEphemerisItem::Jupiter
JPLEphemerisItem::Saturn
JPLEphemerisItem::Uranus
JPLEphemerisItem::Neptune
JPLEphemerisItem::Pluto
JPLEphemerisItem::Moon Geocentric Moon.
JPLEphemerisItem::Sun
JPLEphemerisItem::Nutations Nutation angles dpsi and deps.
JPLEphemerisItem::LunarLibration Lunar libration angles phi, theta and psi.
JPLEphemerisItem::LunarMantleVelocity Lunar mantle velocity components omega_x, omega_y and omega_z.
JPLEphemerisItem::TT_TDB Difference TT-TDB at the geocenter in seconds
JPLEphemerisItem::NumberOfNativeItems Number of items directly available in JPL DE/LE ASCII files.
JPLEphemerisItem::NumberOfRequiredItems Number of required items in a valid JPL DE/LE ASCII file.
JPLEphemerisItem::Earth Geocenter relative to the solar system barycenter, synthesized from Earth-Moon barycenter and geocentric Moon.
JPLEphemerisItem::SSBMoon Moon relative to the solar system barycenter, synthesized from Earth-Moon barycenter and geocentric Moon.
+ * + * \ingroup solar_system_ephemerides + */ +namespace JPLEphemerisItem +{ + enum value_type + { + Unknown = -1, + + // Native JPL DE/LE items, as of 438t + Mercury = 0, + Venus, + EarthMoonBarycenter, + Mars, + Jupiter, + Saturn, + Uranus, + Neptune, + Pluto, + Moon, + Sun, + Nutations, + LunarLibration, + LunarMantleVelocity, + TT_TDB, + + NumberOfNativeItems, + NumberOfRequiredItems = Sun + 1, + + // Special items synthesized from EMB and Moon + Earth = 100, // Geocenter with respect to solar system barycenter + SSBMoon = 101 // Moon with respect to solar system barycenter + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class JPLEphemeris + * \brief JPL planetary ephemeris + * + * This class implements JPL DE/LE planetary ephemerides computed from original + * files in ASCII format. On the PixInsight/PCL platform, this is a utility + * class used to generate truncated binary ephemeris files in XEPH format by + * reinterpolation with Chebyshev polynomials from the original ephemeris data. + * + * Source JPL ephemeris ASCII files, documentation, and original test and + * utility programs and examples, are available at: + * + * ftp://ssd.jpl.nasa.gov/pub/eph/planets/ + * + * \ingroup solar_system_ephemerides + * + * \sa EphemerisFile + */ +class JPLEphemeris +{ +public: + + /*! + * Represents an ephemeris item. See the JPLEphemerisItem namespace for a + * list of the available items. + */ + typedef JPLEphemerisItem::value_type item_index; + + /*! + * Represents a numerical integration ephemeris constant defined by its + * name and value. + */ + typedef EphemerisConstant constant; + + /*! + * Represents a list of integration ephemeris constants. + */ + typedef EphemerisConstantList constant_list; + + /*! + * Constructs a &JPLEphemeris instance initialized from the specified DE/LE + * ephemeris header file in ASCII format. + * + * In the event of errors or invalid header data, this constructor throws + * the appropriate Error exceptions. + */ + JPLEphemeris( const String& filePath ); + + /*! + * Adds new ephemeris Chebyshev coefficients from the specified JPL DE/LE + * ephemeris data file in ASCII format. + * + * If this is not the first call to this member function for this object, + * the specified data file must cover a time span contiguous to the existing + * coefficients, that is, you must call this function successively with a + * list of consecutive ephemeris data files. For example, for DE/LE 432, you + * can call this function in sequence for the following file names: + * + * ascp01550.432, ascp01650.432, ascp01750.432, ..., ascp02550.432 + * + * to cover the entire ephemeris time span from JDE 2287184.5 to 2688976.5. + * You can also call this function to load a smaller time span; for example, + * calling it with the two file names: + * + * ascp02050.432, ascp02150.432 + * + * will cover a limited range from JDE 2469776.5 to 2542864.5. + */ + void AddData( const String& filePath ); + +#ifndef __PCL_NO_JPL_EPHEMERIS_TEST_ROUTINES + + /*! + * Verifies validity of the calculated ephemerides for a standard JPL DE/LE + * test file in ASCII format. Returns true iff the test was performed and it + * was successful. + * + * A test is successful if the computed coordinates and components do not + * differ from the values provided by the test file by more than 1e-13 in + * absolute value. If this member function returns true, you can be + * confident that the ephemerides being calculated with this object are + * correct. + * + * The specified file must be a standard "testpo" JPL ephemeris file + * corresponding to the DE/LE ephemeris loaded by this object. For example, + * for DE/LE 432, the required test file is "testpo.432". + * + * The test is only performed within the time span covered by this object, + * and unavailable target and center items are ignored. See the AddData() + * member function for more information. + * + * If the \a verbose argument is \c true, the function will output + * diagnostics information to stdout. + */ + bool Test( const String& filePath, bool verbose = true ) const; + +#endif // !__PCL_NO_JPL_EPHEMERIS_TEST_ROUTINES + + /*! + * Returns the DE (Development Ephemeris) number for the data loaded by this + * object. The returned number is the value of the "DENUM" integration + * constant. + */ + int DENumber() const + { + return TruncInt( ConstantValue( "DENUM" ) ); + } + + /*! + * Returns the LE (Lunar Ephemeris) number for the data loaded by this + * object. The returned number is the value of the "LENUM" integration + * constant. + */ + int LENumber() const + { + return TruncInt( ConstantValue( "LENUM" ) ); + } + + /*! + * Returns a Julian date corresponding to the first date covered by the JPL + * ephemeris for which this object has been initialized. + * + * The value returned by this function is for informative purposes only. + * Note that the ephemeris time span does not have to be the same as the + * effective time span covered by the data loaded in this object. See the + * AddData() member function for more information on ephemeris data. + */ + double EphemerisStartJD() const + { + return m_ephStartJD; + } + + /*! + * Returns a Julian date corresponding to the last date covered by the JPL + * ephemeris for which this object has been initialized. + * + * The value returned by this function is for informative purposes only. + * Note that the ephemeris time span does not have to be the same as the + * effective time span covered by the data loaded in this object. See the + * AddData() member function for more information on ephemeris data. + */ + double EphemerisEndJD() const + { + return m_ephEndJD; + } + + /*! + * Returns a Julian date corresponding to the first date covered by the + * ephemeris data loaded in this object. + * + * The value returned by this function is the smallest time point for which + * this object can compute ephemerides. The effective ephemeris time span is + * defined by the data loaded in successive calls to AddData(). + */ + double StartJD() const + { + return m_startJD; + } + + /*! + * Returns a Julian date corresponding to the last date covered by the + * ephemeris data loaded in this object. + * + * The value returned by this function is the largest time point for which + * this object can compute ephemerides. The effective ephemeris time span is + * defined by the data loaded in successive calls to AddData(). + */ + double EndJD() const + { + return m_endJD; + } + + /*! + * Returns a reference to the list of numerical integration constants used + * by this DE/LE ephemeris. The integration constants are loaded from an + * ASCII header file by the class constructor. + * + * The returned list is sorted by constant name in ascending order. + */ + const constant_list& Constants() const + { + return m_constants; + } + + /*! + * Returns the value of an integration constant given by its \a name. + * + * If no integration constant is available with the specified \a name + * (case-insensitive), this function throws an Error exception. + */ + double ConstantValue( const IsoString& name ) const + { + constant_list::const_iterator i = + BinarySearch( m_constants.Begin(), m_constants.End(), EphemerisConstant( name ) ); + if ( i == m_constants.End() ) + throw Error( "Undefined integration constant '" + name + '\'' ); + return i->value; + } + + /*! + * Returns true if the specified ephemeris item is available in the data + * loaded by this object. See the JPLEphemerisItem namespace for information + * on ephemeris items. + */ + bool IsItemAvailable( int i ) const + { + if ( i == JPLEphemerisItem::Earth || i == JPLEphemerisItem::SSBMoon ) + return IsItemAvailable( JPLEphemerisItem::EarthMoonBarycenter ) && IsItemAvailable( JPLEphemerisItem::Moon ); + return i >= 0 && i < JPLEphemerisItem::NumberOfNativeItems && m_blockIndex[i].subblocks > 0; + } + + /*! + * Returns the number of components calculated for the specified ephemeris + * item: + * + * 3 for the position and velocity of all major solar system bodies: Sun, + * Mercury to Pluto, and Moon. + * + * 2 for nutation angles. + * + * 3 for lunar libration angles and lunar mantle velocity. + * + * 1 for the difference TT-TDB. + */ + static int ComponentsForItem( int i ) + { + return (i == JPLEphemerisItem::Nutations) ? 2 : (i == JPLEphemerisItem::TT_TDB ? 1 : 3); + } + + /*! + * Computes a state vector. + * + * \param[out] r Reference to a vector where the components of the + * computed state will be stored. + * + * \param jd1,jd2 The requested time point in the TDB time scale, equal + * to jd1+jd2. + * + * \param i Index of the requested ephemeris item. + * + * Rectangular position coordinates are provided in au, except for the + * geocentric Moon, whose position is provided in km. + * + * Angles are provided in radians. + * + * TT-TDB differences are provided in seconds. + */ + void ComputeState( Vector& r, double jd1, double jd2, item_index i ) const + { + if ( i == JPLEphemerisItem::Earth ) + { + Vector rm( 3 ); + Interpolate( r.Begin(), nullptr, jd1, jd2, JPLEphemerisItem::EarthMoonBarycenter ); + Interpolate( rm.Begin(), nullptr, jd1, jd2, JPLEphemerisItem::Moon ); + rm *= m_emb2Earth; + r -= rm; + } + else if ( i == JPLEphemerisItem::SSBMoon ) + { + Vector re( 3 ); + Interpolate( re.Begin(), nullptr, jd1, jd2, JPLEphemerisItem::EarthMoonBarycenter ); + Interpolate( r.Begin(), nullptr, jd1, jd2, JPLEphemerisItem::Moon ); + r += re - m_emb2Earth*r; + } + else + Interpolate( r.Begin(), nullptr, jd1, jd2, i ); + + if ( i != JPLEphemerisItem::Moon ) + if ( i != JPLEphemerisItem::LunarLibration ) + if ( i != JPLEphemerisItem::Nutations ) + r *= m_km2au; + } + + /*! + * Computes a state vector and its first derivative. + * + * \param[out] r Reference to a vector where the components of the + * computed state will be stored. + * + * \param[out] v Reference to a vector where the components of the + * computed first derivative will be stored. + * + * \param jd1,jd2 The requested time point in the TDB time scale, equal + * to jd1+jd2. + * + * \param i Index of the requested ephemeris item. + * + * Rectangular position and velocity coordinates are provided in au and + * au/day, respectively, except for the geocentric Moon, whose position and + * velocity are provided in km and km/day, respectively. + * + * Angles and their variations are provided in radians and radians/day. + * + * TT-TDB differences and their variations are provided in seconds and + * seconds/day. + */ + void ComputeState( Vector& r, Vector& v, double jd1, double jd2, item_index i ) const + { + if ( i == JPLEphemerisItem::Earth ) + { + Vector rm( 3 ), vm( 3 ); + Interpolate( r.Begin(), v.Begin(), jd1, jd2, JPLEphemerisItem::EarthMoonBarycenter ); + Interpolate( rm.Begin(), vm.Begin(), jd1, jd2, JPLEphemerisItem::Moon ); + rm *= m_emb2Earth; + vm *= m_emb2Earth; + r -= rm; + v -= vm; + } + else if ( i == JPLEphemerisItem::SSBMoon ) + { + Vector re( 3 ), ve( 3 ); + Interpolate( re.Begin(), ve.Begin(), jd1, jd2, JPLEphemerisItem::EarthMoonBarycenter ); + Interpolate( r.Begin(), v.Begin(), jd1, jd2, JPLEphemerisItem::Moon ); + r += re - m_emb2Earth*r; + v += ve - m_emb2Earth*v; + } + else + Interpolate( r.Begin(), v.Begin(), jd1, jd2, i ); + + if ( i != JPLEphemerisItem::Moon ) + if ( i != JPLEphemerisItem::LunarLibration ) + if ( i != JPLEphemerisItem::Nutations ) + { + r *= m_km2au; + v *= m_km2au; + } + } + + /*! + * Computes a state vector for the specified time coordinate \a t. + * + * Calling this member function is equivalent to: + * + * \code ComputeState( r, t.JDI(), t.JDF(), i ); \endcode + */ + void ComputeState( Vector& r, TimePoint t, item_index i ) const + { + ComputeState( r, t.JDI(), t.JDF(), i ); + } + + /*! + * Computes a state vector and its first derivative for the specified time + * coordinate \a t. + * + * Calling this member function is equivalent to: + * + * \code ComputeState( r, v, t.JDI(), t.JDF(), i ); \endcode + */ + void ComputeState( Vector& r, Vector& v, TimePoint t, item_index i ) const + { + ComputeState( r, v, t.JDI(), t.JDF(), i ); + } + + /*! + * Generates a summary of the ephemeris loaded by this object, giving + * information on general ephemeris properties and a list of integration + * constants. + * + * The generated information is organized as a sequence of text lines + * terminated with UNIX end-of-line characters. + */ + IsoString Summary() const; + +private: + + struct block_index_item + { + int offset = 0; // offset of this ephemeris item in a block + int coefficients = 0; // number of coefficients per subblock + int subblocks = 0; // number of subblocks + }; + + typedef Array block_index; + + typedef MultiVector block_list; + + double m_ephStartJD = 0; // ephemeris start time + double m_ephEndJD = 0; // ephemeris end time + int m_blockDelta = 0; // block time span in days + constant_list m_constants; // integration constants + block_index m_blockIndex; // coefficients block index + block_list m_blocks; // coefficients blocks + double m_startJD = 0; // start time of the first coefficients block + double m_endJD = 0; // end time of the last coefficients block + double m_km2au = 0; // astronomical unit in kilometers + double m_emb2Earth = 0; // scale factor for translation Earth-Moon barycenter -> Earth + + /*! + * \internal + * Chebyshev polynomial evaluation. Special function adapted to work + * directly with JPL DE/LE ephemeris data. + */ + void Interpolate( double* r, double* v, double jd1, double jd2, item_index n ) const + { + // block index + int ix = TruncInt( ((jd1 - m_startJD) + jd2)/m_blockDelta ); + if ( ix < 0 || ix > int( m_blocks.Length() ) ) + throw Error( String().Format( "Time point out of range: %.15g", jd1+jd2 ) ); + if ( ix == int( m_blocks.Length() ) ) + --ix; + + // block coefficients + const double* block = m_blocks[ix].Begin(); + + // block index item + const block_index_item& index = m_blockIndex[n]; + + // block starting time + double jd0 = *block; + + // number of components + int nv = ComponentsForItem( n ); + + // number of coefficients per subblock + int nk = index.coefficients; + + // subblock time span in days + int dx = m_blockDelta/index.subblocks; + + // subblock index + ix = ((jd1 - jd0) + jd2)/dx; + if ( ix == index.subblocks ) + --ix; + + // subblock coefficients + const double* k = block + index.offset + ix*nv*nk; + + // compute state variables + Vector pc( nk ); + pc[0] = 1; + pc[1] = (2*((jd1 - (jd0 + ix*dx)) + jd2) - dx)/dx; + double y2 = 2*pc[1]; + for ( int i = 2; i < nk; ++i ) + pc[i] = y2*pc[i-1] - pc[i-2]; + for ( int i = 0; i < nv; ++i ) + { + r[i] = 0; + for ( int j = 0; j < nk; ++j ) + r[i] += pc[j] * *k++; + } + + // if requested, compute first derivatives. + if ( v != nullptr ) + { + double vf = 2.0*index.subblocks/m_blockDelta; + Vector vc( nk ); + vc[0] = 0; + vc[1] = 1; + vc[2] = 2*y2; + for ( int i = 3; i < nk; ++i ) + vc[i] = y2*vc[i-1] + 2*pc[i-1] - vc[i-2]; + for ( int i = nv; --i >= 0; ) + { + v[i] = 0; + for ( int j = nk; --j >= 0; ) + v[i] += vc[j] * *--k; + v[i] *= vf; + } + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_JPLEphemeris_h + +// ---------------------------------------------------------------------------- +// EOF pcl/JPLEphemeris.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/KDTree.h b/3rdparty/include/pcl/KDTree.h new file mode 100644 index 0000000..b4171a8 --- /dev/null +++ b/3rdparty/include/pcl/KDTree.h @@ -0,0 +1,607 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/KDTree.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_KDTree_h +#define __PCL_KDTree_h + +/// \file pcl/KDTree.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class KDTree + * \brief Bucket PR K-d tree for point data in arbitrary dimensions. + * + * An n-dimensional K-d tree is a specialized binary tree for partitioning of + * a set of points in an n-dimensional space. K-d trees have important + * applications in computational geometry problems requiring efficient + * rectangular range searching. + * + * This class implements a bucket point region K-d tree structure + * (see Reference 2). + * + * The template type argument T represents the type of a \e point object stored + * in a %KDTree structure. The type T must have the following properties: + * + * \li The standard default and copy constructors are required:\n + * \n + * T::T() \n + * T::T( const T& ) + * + * \li The \c T::component subtype must be defined. It represents a component + * of an object of type T. For example, if T is a vector type, T::component + * must be the type of a vector component. + * + * \li The array subscript operator must be defined as follows:\n + * \n + * component T::operator []( int i ) const \n + * \n + * This operator must return the value of the i-th component of an object being + * stored in the K-d tree, such that 0 <= i < N, where N > 0 is the dimension + * of the point space. + * + * \note We use this implementation of K-d trees in some essential PixInsight + * tools with success (e.g., StarAlignment), and hopefully it will be also + * useful for you, but we don't claim it to be complete. This is a practical + * and relatively simple implementation, where only the construction, + * destruction and range search operations are available. In particular, this + * implementation does not include point addition, deletion and iteration + * operations. Future versions of PCL will include more complete + * implementations of this fundamental data structure. + * + * \b References + * + * \li 1. Mark de Berg et al., Computational Geometry: Algorithms and + * Applications Third Edition, Springer, 2010, Section 5.2. + * + * \li 2. Hanan Samet, Foundations of Multidimensional and Metric Data + * Structures, Morgan Kaufmann, 2006, Section 1.5. + * + * \sa QuadTree + */ +template +class PCL_CLASS KDTree +{ +public: + + /*! + * Represents an N-dimensional point stored in this K-d tree. + */ + typedef T point; + + /*! + * Represents a point component. + */ + typedef typename point::component component; + + /*! + * A vector of point components. Used internally for tree build and range + * search operations. + */ + typedef GenericVector component_vector; + + /*! + * A list of points. Used for tree build and search operations. + */ + typedef Array point_list; + + /*! + * Constructs an empty K-d tree. + */ + KDTree() = default; + + /*! + * Constructs a K-d tree and builds it for the specified list of \a points. + * + * \param points A list of points that will be stored in this + * K-d tree. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be >= 1. The default value is 16. + * + * The dimension of the point space is taken as the length of the first + * point in the list (by calling points[0].Length()), and must be > 0. All + * points in the \a points list must be able to provide at least + * \a dimension components through a zero-based array subscript operator. + * + * If the specified list of \a points is empty, this constructor yields an + * empty K-d tree. If the dimension of the point space is less than one, an + * Error exception is thrown. + */ + KDTree( const point_list& points, int bucketCapacity = 16 ) + { + Build( points, bucketCapacity ); + } + + /*! + * Constructs a K-d tree of the specified \a dimension and builds it for a + * list of \a points. + * + * \param points A list of points that will be stored in this + * K-d tree. + * + * \param dimension The dimension of the point space. Must be > 0. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be >= 1. + * + * All points in the \a points list must be able to provide at least + * \a dimension components through a zero-based array subscript operator. + * + * If the specified list of \a points is empty, this constructor yields an + * empty K-d tree. If the dimension of the point space is less than one, an + * Error exception is thrown. + */ + KDTree( const point_list& points, int dimension, int bucketCapacity ) + { + Build( points, dimension, bucketCapacity ); + } + + /*! + * Copy constructor. Copy construction is disabled because this class uses + * internal data structures that cannot be copy-constructed. However, + * %KDTree implements move construction and move assignment. + */ + KDTree( const KDTree& ) = delete; + + /*! + * Copy assignment operator. Copy assignment is disabled because this class + * uses internal data structures that cannot be copy-assigned. However, + * %KDTree implements move assignment and move construction. + */ + KDTree& operator =( const KDTree& ) = delete; + + /*! + * Move constructor. + */ + KDTree( KDTree&& x ) + : m_root( x.m_root ) + , m_dimension( x.m_dimension ) + , m_bucketCapacity( x.m_bucketCapacity ) + , m_length( x.m_length ) + { + x.m_root = nullptr; + x.m_length = 0; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + KDTree& operator =( KDTree&& x ) + { + if ( &x != this ) + { + DestroyTree( m_root ); + m_root = x.m_root; + m_dimension = x.m_dimension; + m_bucketCapacity = x.m_bucketCapacity; + m_length = x.m_length; + x.m_root = nullptr; + x.m_length = 0; + } + return *this; + } + + /*! + * Destroys a K-d tree. All the stored point objects are deleted. + */ + ~KDTree() + { + Clear(); + } + + /*! + * Removes all the stored point objects, yielding an empty K-d tree. + */ + void Clear() + { + DestroyTree( m_root ); + m_root = nullptr; + m_length = 0; + } + + /*! + * Builds a new K-d tree for the specified list of \a points. + * + * \param points A list of points that will be stored in this + * K-d tree. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be >= 1. The default value is 16. + * + * The dimension of the point space is taken as the length of the first + * point in the list (by calling points[0].Length()), and must be > 0. All + * points in the \a points list must be able to provide at least + * \a dimension components through a zero-based array subscript operator. + * + * If the tree stores point objects before calling this function, they are + * destroyed and removed before building a new tree. + * + * If the specified list of \a points is empty, this member function yields + * an empty K-d tree. If the dimension of the point space is less than one, + * an Error exception is thrown. + */ + void Build( const point_list& points, int bucketCapacity = 16 ) + { + Clear(); + m_bucketCapacity = Max( 1, bucketCapacity ); + if ( !points.IsEmpty() ) + { + m_dimension = points[0].Length(); + if ( m_dimension < 1 ) + throw Error( "KDTree::Build(): Invalid point space dimension." ); + m_root = BuildTree( points, 0 ); + } + } + + /*! + * Builds a new K-d tree of the specified \a dimension for a list of + * \a points. + * + * \param points A list of points that will be stored in this + * K-d tree. + * + * \param dimension The dimension of the point space. Must be > 0. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be >= 1. + * + * All points in the \a points list must be able to provide at least + * \a dimension components through a zero-based array subscript operator. + * + * If the tree stores point objects before calling this function, they are + * destroyed and removed before building a new tree. + * + * If the specified list of \a points is empty, this member function yields + * an empty K-d tree. If the dimension of the point space is less than one, + * an Error exception is thrown. + */ + void Build( const point_list& points, int dimension, int bucketCapacity ) + { + Clear(); + m_bucketCapacity = Max( 1, bucketCapacity ); + if ( (m_dimension = dimension) < 1 ) + throw Error( "KDTree::Build(): Invalid point space dimension." ); + m_root = BuildTree( points, 0 ); + } + + /*! + * Performs a range search in this K-d tree. + * + * \param pt Reference to the point being searched for. The coordinates + * of this point define the center of the hyper-rectangular + * search range in the N-dimensional point space. + * + * \param epsilon Search tolerance, or half-side of the search + * hyperrectangle. + * + * Returns a (possibly empty) list with all the points found in the tree + * within the search range. In two dimensions, the search range would be the + * rectangle defined by the points: + * + * (pt[0] - epsilon, pt[1] - epsilon) and \n + * (pt[0] + epsilon, pt[1] + epsilon) + * + * with an obvious extension to higher dimensions. If \a epsilon is zero, + * the search can only return the set of stored points that are identical to + * the specified search point. + */ + point_list Search( const point& pt, component epsilon ) const + { + component_vector p0( m_dimension ); + component_vector p1( m_dimension ); + for ( int i = 0; i < m_dimension; ++i ) + { + p0[i] = pt[i] - epsilon; + p1[i] = pt[i] + epsilon; + } + point_list found; + SearchTree( found, p0, p1, m_root, 0 ); + return found; + } + + /*! + * Performs a range search in this K-d tree. + * + * \param pt Reference to the point being searched for. The + * coordinates of this point define the center of the + * hyper-rectangular search range in the N-dimensional + * point space. + * + * \param epsilon Search tolerance, or half-side of the search + * hyperrectangle. + * + * \param callback Callback functional. + * + * \param data Callback data. + * + * The callback function prototype should be: + * + * \code void callback( const point& pt, void* data ) \endcode + * + * The callback function will be called once for each point found in the + * tree within the specified search range. In two dimensions, the search + * range would be the rectangle defined by the points: + * + * (pt[0] - epsilon, pt[1] - epsilon) and \n + * (pt[0] + epsilon, pt[1] + epsilon) + * + * with an obvious extension to higher dimensions. If \a epsilon is zero, + * the search can only return the set of stored points that are identical to + * the specified search point. + */ + template + void Search( const point& pt, component epsilon, F callback, void* data ) const + { + component_vector p0( m_dimension ); + component_vector p1( m_dimension ); + for ( int i = 0; i < m_dimension; ++i ) + { + p0[i] = pt[i] - epsilon; + p1[i] = pt[i] + epsilon; + } + SearchTree( p0, p1, callback, data, m_root, 0 ); + } + + /*! + * Returns the dimension of this K-d tree. This is the number of components + * in a point stored in the tree. + */ + int Dimension() const + { + return m_dimension; + } + + /*! + * Returns the total number of points stored in this K-d tree. + */ + size_type Length() const + { + return m_length; + } + + /*! + * Returns true iff this K-d tree is empty. + */ + bool IsEmpty() + { + return m_root == nullptr; + } + + /*! + * Exchanges two %KDTree objects \a x1 and \a x2. + */ + friend void Swap( KDTree& x1, KDTree& x2 ) + { + pcl::Swap( x1.m_root, x2.m_root ); + pcl::Swap( x1.m_dimension, x2.m_dimension ); + pcl::Swap( x1.m_bucketCapacity, x2.m_bucketCapacity ); + pcl::Swap( x1.m_length, x2.m_length ); + } + +private: + + struct Node + { + double split = 0; // position of this node's splitting hyperplane + Node* left = nullptr; // child points at coordinates <= split + Node* right = nullptr; // child points at coordinates > split + + Node( double s = 0 ) + : split( s ) + { + } + + bool IsLeaf() const + { + return left == nullptr && right == nullptr; + } + }; + + struct LeafNode : public Node + { + point_list points; + + LeafNode( const point_list& p ) + : points( p ) + { + } + }; + + Node* m_root = nullptr; + int m_dimension = 0; + int m_bucketCapacity = 0; + size_type m_length = 0; + + LeafNode* NewLeafNode( const point_list& points ) + { + m_length += points.Length(); + return new LeafNode( points ); + } + + Node* BuildTree( const point_list& points, int depth ) + { + if ( points.IsEmpty() ) + return nullptr; + + if ( points.Length() <= size_type( m_bucketCapacity ) ) + return NewLeafNode( points ); + + int index = depth % m_dimension; + + Node* node = new Node( SplitValue( points, index ) ); + + point_list left, right; + for ( const point& p : points ) + if ( p[index] <= node->split ) + left.Add( p ); + else + right.Add( p ); + + // If we are about to build a degenerate subtree, abort this branch of + // recursion right now. + if ( left.IsEmpty() || right.IsEmpty() ) + { + delete node; + return NewLeafNode( points ); + } + + node->left = BuildTree( left, depth+1 ); + node->right = BuildTree( right, depth+1 ); + + // Further degeneracies cannot happen in theory, but let's prevent them + // for extra safety. + if ( node->IsLeaf() ) + { + delete node; + return NewLeafNode( points ); + } + + return node; + } + + void SearchTree( point_list& found, const component_vector& p0, const component_vector& p1, const Node* node, int depth ) const + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + { + const LeafNode* leaf = static_cast( node ); + for ( const point& p : leaf->points ) + for ( int j = 0; ; ) + { + component x = p[j]; + if ( x < p0[j] || p1[j] < x ) + break; + if ( ++j == m_dimension ) + { + found.Add( p ); + break; + } + } + } + else + { + int index = depth % m_dimension; + if ( p0[index] <= node->split ) + SearchTree( found, p0, p1, node->left, depth+1 ); + if ( p1[index] > node->split ) + SearchTree( found, p0, p1, node->right, depth+1 ); + } + } + + template + void SearchTree( const component_vector& p0, const component_vector& p1, F callback, void* data, const Node* node, int depth ) const + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + { + const LeafNode* leaf = static_cast( node ); + for ( const point& p : leaf->points ) + for ( int j = 0; ; ) + { + component x = p[j]; + if ( x < p0[j] || p1[j] < x ) + break; + if ( ++j == m_dimension ) + { + callback( p, data ); + break; + } + } + } + else + { + int index = depth % m_dimension; + if ( p0[index] <= node->split ) + SearchTree( p0, p1, callback, data, node->left, depth+1 ); + if ( p1[index] > node->split ) + SearchTree( p0, p1, callback, data, node->right, depth+1 ); + } + } + + void DestroyTree( Node* node ) + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + delete static_cast( node ); + else + { + DestroyTree( node->left ); + DestroyTree( node->right ); + delete node; + } + } + + double SplitValue( const point_list& points, int index ) + { + component_vector v( points.Length() ); + for ( int i = 0; i < v.Length(); ++i ) + v[i] = points[i][index]; + return v.Median(); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_KDTree_h + +// ---------------------------------------------------------------------------- +// EOF pcl/KDTree.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/KernelFilter.h b/3rdparty/include/pcl/KernelFilter.h new file mode 100644 index 0000000..f35a51a --- /dev/null +++ b/3rdparty/include/pcl/KernelFilter.h @@ -0,0 +1,583 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/KernelFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_KernelFilter_h +#define __PCL_KernelFilter_h + +/// \file pcl/KernelFilter.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE 1.0e-06F + +/*! + * \class KernelFilter + * \brief Kernel filter in two dimensions. + * + * %KernelFilter stores a square matrix of floating point filter coefficients + * and an optional filter name. This class provides automatic allocation and + * deallocation of coefficients, implicit data sharing, thread-safe access and + * a number of utility functions for filter management. + * + * %KernelFilter can be used along with a variety of PCL classes, such as + * Convolution and ATrousWaveletTransform. + * + * For separable filters and convolutions, see the SeparableFilter and + * SeparableConvolution PCL classes. + * + * \sa GaussianFilter, VariableShapeFilter, Convolution, ATrousWaveletTransform + */ +class PCL_CLASS KernelFilter +{ +public: + + /*! + * Represents a filter coefficient. + */ + typedef float coefficient; + + /*! + * Represents a filter coefficient matrix. + */ + typedef GenericMatrix coefficient_matrix; + + /*! + * Constructs an empty %KernelFilter object with optional \a name. + */ + KernelFilter( const String& name = String() ) + : filterName( name ) + { + } + + /*! + * Constructs a %KernelFilter object with the specified size \a n and + * optional \a name. Filter elements are not initialized, so they will + * contain unpredictable values. + * + * A %KernelFilter object must be initialized with either a zero size + * (which yields an empty filter), or an odd size >= 3. + */ + KernelFilter( int n, const String& name = String() ) + : coefficients( PCL_VALID_KERNEL_SIZE( n ), PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Constructs a %KernelFilter object with the specified size \a n, initial + * element value \a x, and optional \a name. + */ + template + KernelFilter( int n, const T& x, const String& name = String() ) + : coefficients( x, PCL_VALID_KERNEL_SIZE( n ), PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Constructs a %KernelFilter object with the specified filter coefficient + * matrix \a F and optional \a name. + */ + KernelFilter( const coefficient_matrix& F, const String& name = String() ) + : filterName( name ) + { + if ( !F.IsEmpty() && (F.Rows() != F.Cols() || (F.Rows() & 1) == 0) ) + throw Error( "KernelFilter: Invalid coefficient matrix in constructor." ); + coefficients = F; + } + + /*! + * Constructs a %KernelFilter object with the specified size \a n and + * optional \a name. Copies \a nxn filter coefficients from the specified + * static array \a k. + */ + template + KernelFilter( const T* k, int n, const String& name = String() ) + : coefficients( k, PCL_VALID_KERNEL_SIZE( n ), PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Copy constructor. + */ + KernelFilter( const KernelFilter& ) = default; + + /*! + * Move constructor. + */ + KernelFilter( KernelFilter&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~KernelFilter() + { + } + + /*! + * Returns a pointer to a dynamically allocated duplicate of this kernel + * filter. + * + * \note All derived classes from %KernelFilter must reimplement this + * virtual member function. + */ + virtual KernelFilter* Clone() const + { + return new KernelFilter( *this ); + } + + /*! + * Returns a separable filter equivalent to this kernel filter matrix. + * + * The default implementation computes the singular value decomposition of + * the filter matrix, which yields the separable filter as a couple of row + * and column vectors. Filter separability is then verified by computing the + * resulting filter by matrix multiplication of the separable filter + * components. If the resulting filter differs by more than the specified + * \a tolerance from the original, then the filter is non-separable and an + * empty SeparableFilter object is returned. + * + * For known separable filters, this member function must be reimplemented + * in derived classes to bypass the default (and expensive) separability + * tests. For example, Gaussian filters are separable, so this function is + * conveniently reimplemented by the GaussianFilter class to return a + * separable filter consisting of the central row and column vectors of the + * Gaussian filter matrix representation. + */ + virtual SeparableFilter AsSeparableFilter( float tolerance = __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE ) const; + + /*! + * Returns true iff this filter is separable, + * + * A two-dimensional filter matrix is separable if it can be expressed as + * the product of two vectors. The default implementation of this function + * tries to compute a separable filter by calling AsSeparable(). Then it + * returns true if the computed separable filter is nonempty. + * + * For known separable (and non-separable) filters, this member function + * must be reimplemented in derived classes to bypass the above, expensive + * procedure. + */ + virtual bool IsSeparable() const + { + return !AsSeparableFilter().IsEmpty(); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + KernelFilter& operator =( const KernelFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + KernelFilter& operator =( KernelFilter&& ) = default; + + /*! + * Assigns the specified filter coefficient matrix \a F to this object. + * Returns a reference to this object. + * + * The specified matrix \a F must be either an empty matrix or a square + * matrix of odd size. If these conditions are not met, this member + * function throws an Error exception. + */ + KernelFilter& operator =( const coefficient_matrix& F ) + { + if ( !F.IsEmpty() && (F.Rows() != F.Cols() || (F.Rows() & 1) == 0) ) + throw Error( "KernelFilter: Invalid coefficient matrix assignment." ); + coefficients = F; + flipped = false; + return *this; + } + + /*! + * Assigns the specified scalar \a x to all filter coefficients. Returns a + * reference to this object. + */ + KernelFilter& operator =( const coefficient& x ) + { + coefficients = x; + flipped = false; + return *this; + } + + /*! + * Returns true iff this %KernelFilter object is equal to another instance + * \a f. Two %KernelFilter instances are equal if their name and filter + * coefficients are equal. + */ + bool operator ==( const KernelFilter& f ) const + { + return Name() == f.Name() && SameCoefficients( f ); + } + + /*! + * Returns the name of this %KernelFilter object. + */ + String Name() const + { + return filterName; + } + + /*! + * Sets the name of this %KernelFilter object. + */ + virtual void Rename( const String& newName ) + { + filterName = newName.Trimmed(); + } + + /*! + * Returns the size of this filter kernel. + */ + int Size() const + { + return coefficients.Rows(); // coefficients *must* be a square matrix + } + + /*! + * Sets the size of this filter kernel. Previous filter contents are lost; + * the internal matrix of filter coefficients will contain unpredictable + * values after calling this function. + */ + virtual void Resize( int n ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + if ( n == 0 ) + coefficients = coefficient_matrix(); + else + { + n = PCL_VALID_KERNEL_SIZE( n ); + coefficients = coefficient_matrix( n, n ); + } + flipped = false; + } + + /*! + * Returns true iff this is an empty filter, that is, if it has no filter + * coefficients. + */ + bool IsEmpty() const + { + return coefficients.IsEmpty(); + } + + /*! + * Returns true iff this is a non-empty filter. Equivalent to !IsEmpty(). + */ + operator bool() const + { + return !IsEmpty(); + } + + /*! + * Returns the total number of filter coefficients, or Size()*Size(). + */ + int NumberOfCoefficients() const + { + return coefficients.Rows()*coefficients.Cols(); + } + + /*! + * Returns a copy of the internal matrix of filter coefficients. + */ + coefficient_matrix Coefficients() const + { + return coefficients; + } + + /*! + * Returns a pointer to the beginning of the internal matrix of (immutable) + * filter coefficients. + * + * All filter coefficients are guaranteed to be stored at consecutive + * locations addressable from the pointer returned by this function. Filter + * coefficients are stored in row order (all coefficients of row 0 + * followed by all coefficients of row 1, and so on). + */ + const coefficient* Begin() const + { + return coefficients.Begin(); + } + + /*! + * Returns a pointer to the end of the internal matrix of (immutable) filter + * coefficients. + * + * All filter coefficients are guaranteed to be stored at consecutive + * locations in reverse order, addressable from the pointer returned by this + * function minus one. Filter coefficients are stored in + * row order (all coefficients of row 0 followed by all + * coefficients of row 1, etc.). + */ + const coefficient* End() const + { + return coefficients.End(); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const coefficient* begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const coefficient* end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Subscript operator. Returns a pointer to the first (immutable) filter + * coefficient of the specified \a row in this filter. \a row must be a + * valid vertical index: it must be 0 <= \a row < Size(). + */ + const coefficient* operator[]( int row ) const + { + return coefficients[row]; + } + + /*! + * Returns the \e weight of this kernel filter. The weight is equal to the + * sum of all filter coefficients. + */ + double Weight() const + { + return coefficients.Sum(); + } + + /*! + * Returns the sum of the absolute values of all filter coefficients. + */ + double Modulus() const + { + return coefficients.Modulus(); + } + + /*! + * Normalizes filter coefficients. Divides each filter coefficient by the + * result of the Modulus() member function. If Modulus() is zero or + * insignificant this function does nothing. + */ + void Normalize() + { + double m = Modulus(); + if ( 1 + m != 1 ) + coefficients /= m; + } + + /*! + * Returns the normalization of this kernel filter. This member function + * creates a new %KernelFilter instance as a copy of this object, normalizes + * it, and returns it. + */ + KernelFilter Normalized() const + { + KernelFilter f( *this ); + f.Normalize(); + return f; + } + + /*! + * Flips this kernel filter. Flipping a filter consists of rotating its + * coefficients by 180 degrees. + */ + void Flip() + { + coefficients.Flip(); + flipped = !flipped; + } + + /*! + * Returns a flipped copy of this filter. Flipping a filter consists of + * rotating its coefficients by 180 degrees. + */ + KernelFilter Flipped() const + { + KernelFilter f( *this ); + f.Flip(); + return f; + } + + /*! + * Returns true iff this kernel filter has been flipped (rotated by 180 + * degrees). Note that after an even number of successive flippings (which + * is a no-op) this member function will return false. + */ + bool IsFlipped() const + { + return flipped; + } + + /*! + * Returns true if this is a high-pass kernel filter; false if this is a + * low-pass kernel filter. + * + * A high-pass kernel filter has one or more negative coefficients. A + * low-pass kernel filter is either empty or all of its coefficients are + * positive or zero. + */ + bool IsHighPassFilter() const + { + const coefficient* a = coefficients.Begin(); + const coefficient* b = coefficients.End(); + //while ( a < b ) + // if ( *a++ < 0 || *--b < 0 ) + // The above loop is better for nonsymmetrical filters, which are seldom used. + while ( a < b ) + if ( *a++ < 0 ) + return true; + return false; + } + + /*! + * Returns true iff this %KernelFilter object has the same coefficients as + * other instance \a f. + */ + bool SameCoefficients( const KernelFilter& f ) const + { + return coefficients.SameElements( f.coefficients ); + } + + /*! + * Deallocates filter coefficients and yields an empy %KernelFilter object. + * Note that this member function does not change the current filter name. + */ + virtual void Clear() + { + coefficients = coefficient_matrix(); + flipped = false; + } + +#ifndef __PCL_NO_MATRIX_IMAGE_RENDERING + + /*! + * Renders this filter as an image. The contents of the specified target + * \a image will be replaced with a grayscale rendition of this filter, + * where each image pixel has a value proportional to its corresponding + * filter coefficient counterpart. + * + * Note that if this filter has out-of-range values for the pixel sample + * type of the target image, pixel saturation will occur at either the white + * or black points, or at both. This only happens when the target image is + * of an integer type and this filter contains floating point values outside + * the normalized [0,1] range. + * + * If the target image is of a floating-point type (either real or complex), + * it may require a rescaling or normalization operation to constrain all + * pixel values to the normalized [0,1] range after calling this function. + */ + template + void ToImage( GenericImage

& image ) const + { + coefficients.ToImage( image ); + } + + /*! + * Renders this filter as an image. The contents of the image transported by + * the specified %ImageVariant object \a v will be replaced with a grayscale + * rendition of this filter, where each image pixel has a value proportional + * to its corresponding filter coefficient counterpart. + * + * If the %ImageVariant object \a v does not transport an image, a new one + * is created in 32-bit floating point format. + * + * Also take into account the information given for + * ToImage( GenericImage

& ), relative to out-of-range values, which is + * entirely applicable to this member function. + */ + void ToImage( ImageVariant& v ) const + { + coefficients.ToImage( v ); + } + +#endif // !__PCL_NO_MATRIX_IMAGE_RENDERING + +protected: + + coefficient_matrix coefficients; // filter coefficients, size*size elements + String filterName; // identifying name + bool flipped = false; // flag true when filter rotated +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_KernelFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/KernelFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/KeyCodes.h b/3rdparty/include/pcl/KeyCodes.h new file mode 100644 index 0000000..6576c64 --- /dev/null +++ b/3rdparty/include/pcl/KeyCodes.h @@ -0,0 +1,481 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/KeyCodes.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_KeyCodes_h +#define __PCL_KeyCodes_h + +/// \file pcl/KeyCodes.h + +#include + +#ifndef __PCL_NO_KEY_QUERY_UTILITIES +# ifdef __PCL_WINDOWS +# include // for virtual key codes +# endif +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::KeyCode + * \brief Defines PCL key codes. + * + * The %KeyCode namespace defines platform-independent keyboard key identifiers + * on the PixInsight/PCL framework. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
KeyCode::Backspace 0x00000008
KeyCode::Tab 0x00000009
KeyCode::Clear 0x0000000c
KeyCode::Return 0x0000000d
KeyCode::Enter 0x0000000d
KeyCode::Escape 0x0000001b
KeyCode::Shift 0x70000001
KeyCode::Control 0x70000002
KeyCode::Alt 0x70000003
KeyCode::Meta 0x70000004
KeyCode::CapsLock 0x70000010
KeyCode::NumLock 0x70000020
KeyCode::ScrollLock 0x70000030
KeyCode::Pause 0x70000100
KeyCode::Print 0x70000200
KeyCode::Help 0x70000300
KeyCode::SysReq 0x70000400
KeyCode::Left 0x10000001
KeyCode::Up 0x10000002
KeyCode::Right 0x10000003
KeyCode::Down 0x10000004
KeyCode::Insert 0x10000010
KeyCode::Delete 0x10000020
KeyCode::Home 0x10000100
KeyCode::End 0x10000200
KeyCode::PageUp 0x10000300
KeyCode::PageDown 0x10000400
KeyCode::F1 0x08000001
KeyCode::F2 0x08000002
KeyCode::F3 0x08000003
KeyCode::F4 0x08000004
KeyCode::F5 0x08000005
KeyCode::F6 0x08000006
KeyCode::F7 0x08000007
KeyCode::F8 0x08000008
KeyCode::F9 0x08000009
KeyCode::F10 0x0800000a
KeyCode::F11 0x0800000b
KeyCode::F12 0x0800000c
KeyCode::F13 0x0800000d
KeyCode::F14 0x0800000e
KeyCode::F15 0x0800000f
KeyCode::F16 0x08000010
KeyCode::F17 0x08000020
KeyCode::F18 0x08000030
KeyCode::F19 0x08000040
KeyCode::F20 0x08000050
KeyCode::F21 0x08000060
KeyCode::F22 0x08000070
KeyCode::F23 0x08000080
KeyCode::F24 0x08000090
KeyCode::Space 0x00000020
KeyCode::Exclamation 0x00000021
KeyCode::DoubleQuote 0x00000022
KeyCode::NumberSign 0x00000023
KeyCode::Dollar 0x00000024
KeyCode::Percent 0x00000025
KeyCode::Ampersand 0x00000026
KeyCode::Apostrophe 0x00000027
KeyCode::LeftParenthesis 0x00000028
KeyCode::RightParenthesis 0x00000029
KeyCode::Asterisk 0x0000002a
KeyCode::Plus 0x0000002b
KeyCode::Comma 0x0000002c
KeyCode::Minus 0x0000002d
KeyCode::Period 0x0000002e
KeyCode::Slash 0x0000002f
KeyCode::Zero 0x00000030
KeyCode::One 0x00000031
KeyCode::Two 0x00000032
KeyCode::Three 0x00000033
KeyCode::Four 0x00000034
KeyCode::Five 0x00000035
KeyCode::Six 0x00000036
KeyCode::Seven 0x00000037
KeyCode::Eight 0x00000038
KeyCode::Nine 0x00000039
KeyCode::Colon 0x0000003a
KeyCode::Semicolon 0x0000003b
KeyCode::Less 0x0000003c
KeyCode::Equal 0x0000003d
KeyCode::Greater 0x0000003e
KeyCode::Question 0x0000003f
KeyCode::At 0x00000040
KeyCode::A 0x00000041
KeyCode::B 0x00000042
KeyCode::C 0x00000043
KeyCode::D 0x00000044
KeyCode::E 0x00000045
KeyCode::F 0x00000046
KeyCode::G 0x00000047
KeyCode::H 0x00000048
KeyCode::I 0x00000049
KeyCode::J 0x0000004a
KeyCode::K 0x0000004b
KeyCode::L 0x0000004c
KeyCode::M 0x0000004d
KeyCode::N 0x0000004e
KeyCode::O 0x0000004f
KeyCode::P 0x00000050
KeyCode::Q 0x00000051
KeyCode::R 0x00000052
KeyCode::S 0x00000053
KeyCode::T 0x00000054
KeyCode::U 0x00000055
KeyCode::V 0x00000056
KeyCode::W 0x00000057
KeyCode::X 0x00000058
KeyCode::Y 0x00000059
KeyCode::Z 0x0000005a
KeyCode::LeftBracket 0x0000005b
KeyCode::Backslash 0x0000005c
KeyCode::RightBracket 0x0000005d
KeyCode::Circumflex 0x0000005e
KeyCode::Underscore 0x0000005f
KeyCode::LeftQuote 0x00000060
KeyCode::LeftBrace 0x0000007b
KeyCode::Bar 0x0000007c
KeyCode::RightBrace 0x0000007d
KeyCode::Tilde 0x0000007e
KeyCode::Unknown 0x7fffffff
+ */ +namespace KeyCode +{ + enum value_type + { + Backspace = 0x00000008, + Tab = 0x00000009, + Clear = 0x0000000c, + Return = 0x0000000d, + Enter = 0x0000000d, + Escape = 0x0000001b, + Shift = 0x70000001, + Control = 0x70000002, + Alt = 0x70000003, + Meta = 0x70000004, + CapsLock = 0x70000010, + NumLock = 0x70000020, + ScrollLock = 0x70000030, + Pause = 0x70000100, + Print = 0x70000200, + Help = 0x70000300, + SysReq = 0x70000400, + Left = 0x10000001, + Up = 0x10000002, + Right = 0x10000003, + Down = 0x10000004, + Insert = 0x10000010, + Delete = 0x10000020, + Home = 0x10000100, + End = 0x10000200, + PageUp = 0x10000300, + PageDown = 0x10000400, + F1 = 0x08000001, + F2 = 0x08000002, + F3 = 0x08000003, + F4 = 0x08000004, + F5 = 0x08000005, + F6 = 0x08000006, + F7 = 0x08000007, + F8 = 0x08000008, + F9 = 0x08000009, + F10 = 0x0800000a, + F11 = 0x0800000b, + F12 = 0x0800000c, + F13 = 0x0800000d, + F14 = 0x0800000e, + F15 = 0x0800000f, + F16 = 0x08000010, + F17 = 0x08000020, + F18 = 0x08000030, + F19 = 0x08000040, + F20 = 0x08000050, + F21 = 0x08000060, + F22 = 0x08000070, + F23 = 0x08000080, + F24 = 0x08000090, + Space = 0x00000020, + Exclamation = 0x00000021, + DoubleQuote = 0x00000022, + NumberSign = 0x00000023, + Dollar = 0x00000024, + Percent = 0x00000025, + Ampersand = 0x00000026, + Apostrophe = 0x00000027, + LeftParenthesis = 0x00000028, + RightParenthesis = 0x00000029, + Asterisk = 0x0000002a, + Plus = 0x0000002b, + Comma = 0x0000002c, + Minus = 0x0000002d, + Period = 0x0000002e, + Slash = 0x0000002f, + Zero = 0x00000030, + One = 0x00000031, + Two = 0x00000032, + Three = 0x00000033, + Four = 0x00000034, + Five = 0x00000035, + Six = 0x00000036, + Seven = 0x00000037, + Eight = 0x00000038, + Nine = 0x00000039, + Colon = 0x0000003a, + Semicolon = 0x0000003b, + Less = 0x0000003c, + Equal = 0x0000003d, + Greater = 0x0000003e, + Question = 0x0000003f, + At = 0x00000040, + A = 0x00000041, + B = 0x00000042, + C = 0x00000043, + D = 0x00000044, + E = 0x00000045, + F = 0x00000046, + G = 0x00000047, + H = 0x00000048, + I = 0x00000049, + J = 0x0000004a, + K = 0x0000004b, + L = 0x0000004c, + M = 0x0000004d, + N = 0x0000004e, + O = 0x0000004f, + P = 0x00000050, + Q = 0x00000051, + R = 0x00000052, + S = 0x00000053, + T = 0x00000054, + U = 0x00000055, + V = 0x00000056, + W = 0x00000057, + X = 0x00000058, + Y = 0x00000059, + Z = 0x0000005a, + LeftBracket = 0x0000005b, + Backslash = 0x0000005c, + RightBracket = 0x0000005d, + Circumflex = 0x0000005e, + Underscore = 0x0000005f, + LeftQuote = 0x00000060, + LeftBrace = 0x0000007b, + Bar = 0x0000007c, + RightBrace = 0x0000007d, + Tilde = 0x0000007e, + + Unknown = 0x7fffffff + }; +} + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +/*! + * \defgroup keyboard_utilities Keyboard Utilities + */ + +/*! + * Returns true iff the specified keyboard key is currently pressed. + * + * The \a key1 and (optional) \a key2 parameters are platform-dependent + * keyboard scan codes or virtual key identifiers. + * + * \ingroup keyboard_utilities + */ +bool IsKeyPressed( int key1, int key2 = 0 ); // implemented in pcl/Keyboard.cpp + +#ifndef __PCL_NO_KEY_QUERY_UTILITIES + +/*! + * Returns true iff the Space Bar key is currently pressed. + * \ingroup keyboard_utilities + */ +inline bool IsSpaceBarPressed() +{ + return IsKeyPressed( +#if defined( __PCL_X11 ) + 65 +#endif +#if defined( __PCL_MACOSX ) + 0x31 // kVK_Space +#endif +#if defined( __PCL_WINDOWS ) + VK_SPACE +#endif + ); +} + +/*! + * Returns true iff a Control key (also known as Meta key on Mac OS X) is + * currently pressed. + * \ingroup keyboard_utilities + */ +inline bool IsControlPressed() +{ + return IsKeyPressed( +#if defined( __PCL_X11 ) + 37, 109 +#endif +#if defined( __PCL_MACOSX ) + 0x3B // kVK_Control +#endif +#if defined( __PCL_WINDOWS ) + VK_CONTROL +#endif + ); +} + +/*! + * Returns true iff a Shift key is currently pressed. + * \ingroup keyboard_utilities + */ +inline bool IsShiftPressed() +{ + return IsKeyPressed( +#if defined( __PCL_X11 ) + 50, 62 +#endif +#if defined( __PCL_MACOSX ) + 0x38 // kVK_Shift +#endif +#if defined( __PCL_WINDOWS ) + VK_SHIFT +#endif + ); +} + +/*! + * Returns true iff an Alt key (also known as Option key on Mac OS X) is + * currently pressed. + * \ingroup keyboard_utilities + */ +inline bool IsAltPressed() +{ + return IsKeyPressed( +#if defined( __PCL_X11 ) + 64, 113 +#endif +#if defined( __PCL_MACOSX ) + 0x3A // kVK_Option +#endif +#if defined( __PCL_WINDOWS ) + VK_MENU +#endif + ); +} + +#if defined( __PCL_MACOSX ) + +/*! + * Returns true iff the Command key (Mac keyboard only) is currently pressed. + * + * \note This function is only defined on Mac OS X. + * \ingroup keyboard_utilities + */ +inline bool IsCmdPressed() +{ + return IsKeyPressed( 0x37 ); // kVK_Command +} + +/*! + * Returns true iff the Meta key is currently pressed on the Mac keyboard. + * + * This function is a convenient alias for IsControlPressed(), only available + * on Mac OS X. + * + * \ingroup keyboard_utilities + */ +inline bool IsMetaPressed() +{ + return IsControlPressed(); +} + +#endif // __PCL_MACOSX + +/*! + * On UNIX, Linux and Windows platforms, returns true iff a Control key is + * currently pressed. On macOS, returns true iff the Command key is currently + * pressed. + * + * \ingroup keyboard_utilities + */ +inline bool IsControlOrCmdPressed() +{ +#if defined( __PCL_MACOSX ) + return IsCmdPressed(); +#else + return IsControlPressed(); +#endif +} + +#endif // !__PCL_NO_KEY_QUERY_UTILITIES + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_KeyCodes_h + +// ---------------------------------------------------------------------------- +// EOF pcl/KeyCodes.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/KeyValue.h b/3rdparty/include/pcl/KeyValue.h new file mode 100644 index 0000000..ae220bc --- /dev/null +++ b/3rdparty/include/pcl/KeyValue.h @@ -0,0 +1,184 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/KeyValue.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_KeyValue_h +#define __PCL_KeyValue_h + +/// \file pcl/KeyValue.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class KeyValue + * \brief Generic key-value association. + */ +template +class PCL_CLASS KeyValue +{ +public: + + T1 key; //!< The key member of this key-value association + T2 value; //!< The value member of this key-value association + + /*! + * Constructs a key-value association with default key and value members. + */ + KeyValue() + : key() + , value() + { + } + + /*! + * Constructs a key-value association with the specified key and value. + */ + KeyValue( const T1& k, const T2& v ) + : key( k ) + , value( v ) + { + } + + /*! + * Constructs a key-value association with the specified key and a + * default-constructed value. + */ + KeyValue( const T1& k ) + : key( k ) + , value() + { + } + + /*! + * Copy constructor. + */ + KeyValue( const KeyValue& ) = default; + + /*! + * Move constructor. + */ + KeyValue( KeyValue&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + KeyValue& operator =( const KeyValue& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + KeyValue& operator =( KeyValue&& ) = default; + + /*! + * Returns true iff this key-value association is equal to another object + * \a x. key-value associations are equal if their respective key and value + * members are equal. + */ + bool operator ==( const KeyValue& x ) const + { + return key == x.key && value == x.value; + } + + /*! + * Returns true iff this key-value association precedes another object \a x. + * In key-value comparisons, key members have precedence over value members. + * The comparison algorithm is as follows: + * + * \code + * if ( this->key != x.key ) + * return this->key < x.key; + * else + * return this->value < x.value; + * \endcode + * + * The implementation of this operator only requires less than + * semantics for the two types T1 and T2; it doesn't use equality operators. + */ + bool operator <( const KeyValue& x ) const + { + return (key < x.key) ? true : ((x.key < key) ? false : value < x.value); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup string_key_value_associations String Key-Value Associations + */ + +/*! + * \class pcl::StringKeyValue + * \ingroup string_key_value_associations + * \brief Key-value association of two Unicode (UTF-16) strings. + */ +typedef KeyValue StringKeyValue; + +/*! + * \class pcl::IsoStringKeyValue + * \ingroup string_key_value_associations + * \brief Key-value association of two 8-bit strings. + */ +typedef KeyValue IsoStringKeyValue; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_KeyValue_h + +// ---------------------------------------------------------------------------- +// EOF pcl/KeyValue.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Label.h b/3rdparty/include/pcl/Label.h new file mode 100644 index 0000000..0a9d6da --- /dev/null +++ b/3rdparty/include/pcl/Label.h @@ -0,0 +1,170 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Label.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Label_h +#define __PCL_Label_h + +/// \file pcl/Label.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Label + * \brief Client-side interface to a PixInsight %Label control. + * + * ### TODO: Write a detailed description for %Label. + */ +class PCL_CLASS Label : public Frame +{ +public: + + /*! + * Constructs a %Label object with the specified \a text, as a child control + * of \a parent. + */ + Label( const String& text = String(), Control& parent = Control::Null() ); + + /*! + * Destroys a %Label object. + */ + virtual ~Label() + { + } + + /*! # + */ + String Text() const; + + /*! # + */ + void SetText( const String& ); + + /*! # + */ + void Clear() + { + SetText( String() ); + } + + /*! # + */ + int Margin() const; + + /*! # + */ + void SetMargin( int ); + + /*! # + */ + void ClearMargin() + { + SetMargin( 0 ); + } + + /*! # + */ + int TextAlignment() const; + + /*! # + */ + void SetTextAlignment( int ); + + /*! # + */ + bool IsWordWrappingEnabled() const; + + /*! # + */ + void EnableWordWrapping( bool = true ); + + /*! # + */ + void DisableWordWrapping( bool disable = true ) + { + EnableWordWrapping( !disable ); + } + + /*! # + */ + bool IsRichTextEnabled() const; + + /*! # + */ + void EnableRichText( bool = true ); + + /*! # + */ + void DisableRichText( bool disable = true ) + { + EnableRichText( !disable ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Label_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Label.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LanczosInterpolation.h b/3rdparty/include/pcl/LanczosInterpolation.h new file mode 100644 index 0000000..6fd1a18 --- /dev/null +++ b/3rdparty/include/pcl/LanczosInterpolation.h @@ -0,0 +1,976 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LanczosInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LanczosInterpolation_h +#define __PCL_LanczosInterpolation_h + +/// \file pcl/LanczosInterpolation.h + +#include +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_width this->m_width +#define m_height this->m_height +#define m_fillBorder this->m_fillBorder +#define m_fillValue this->m_fillValue +#define m_data this->m_data + +// ---------------------------------------------------------------------------- + +/* + * Default clamping threshold for Lanczos interpolation. This value has been + * selected as the best trade-off for a large set of test linear images. + */ +#ifndef __PCL_LANCZOS_CLAMPING_THRESHOLD +#define __PCL_LANCZOS_CLAMPING_THRESHOLD 0.3F +#endif + +// ---------------------------------------------------------------------------- + +/* + * Floating point and integer LUT-based interpolations for 3rd, 4th and 5th + * order Lanczos functions. LUTs are initialized automatically on-demand by + * thread-safe internal routines. + * + * Real Lanczos LUTs are accurate to +/- 1e-7 DN + * Integer Lanczos LUTs are accurate to +/- 1 16-bit DN + */ +#define __PCL_LANCZOS_LUT_REAL_RESOLUTION 4096 +const double** PCL_FUNC PCL_InitializeLanczosRealLUT( int ); +#define __PCL_LANCZOS_LUT_INT_RESOLUTION 65535 +const float* PCL_FUNC PCL_InitializeLanczosIntLUT( int ); + +// ---------------------------------------------------------------------------- + +#define PCL_LANCZOS_ACC() \ + if ( s < 0 ) \ + sn -= s, wn -= L; \ + else \ + sp += s, wp += L; + +/*! + * \class LanczosInterpolation + * \brief Two dimensional Lanczos interpolation algorithm. + * + * This class uses Lanczos filters to interpolate pixel values at arbitrary + * coordinates within a two-dimensional data matrix. A one-dimensional Lanczos + * filter of order \e n is defined by the following equations: + * + *

+ * L(x;n) = sinc(x)*sinc(x/n)    for |x| < n
+ * L(x;n) = 0                    for |x| >= n
+ * 
+ * + * where sinc() is the normalized sinc function: + * + *
+ * sinc(x;n) = 1                 for x = 0
+ * sinc(x;n) = sin(pi*x)/(pi*x)  for x != 0
+ * 
+ * + * The Lanczos function has alternating positive and negative lobes toward + * positive and negative infinity. The order \e n defines the number of lobes + * preserved in the interpolation filter function: n=1 only includes the + * central, positive lobe; n=2 includes the first two lobes (one positive and + * one negative), and so on. The default filter order is three. + * + * Lanczos interpolation has excellent detail preservation performance with + * minimal generation of aliasing patterns for noisy data. Its main drawback is + * generation of strong undershoot (aka ringing) artifacts when negative + * function lobes fall over bright pixels and edges. This usually happens with + * linear data. In the current PCL implementation we have included a clamping + * mechanism that prevents negative interpolated values and ringing problems + * for most images. + * + * \sa BidimensionalInterpolation, NearestNeighborInterpolation, + * BilinearInterpolation, BicubicSplineInterpolation, + * BicubicBSplineInterpolation, BicubicFilterInterpolation, + * Lanczos3LUTInterpolation, Lanczos4LUTInterpolation, Lanczos5LUTInterpolation + */ +template +class PCL_CLASS LanczosInterpolation : public BidimensionalInterpolation +{ +private: + + struct Default + { + template static bool UseLUT( _T* ) { return false; } + static bool UseLUT( uint8* ) { return true; } + static bool UseLUT( int8* ) { return true; } + static bool UseLUT( uint16* ) { return true; } + static bool UseLUT( int16* ) { return true; } + static bool UseLUT( float* ) { return true; } + }; + +public: + + /*! + * Constructs a %LanczosInterpolation instance. + * + * \param n Filter order (n >= 1). The Lanczos filter interpolates + * from the nearest (2*n)^2 mapped source pixels for each + * interpolation point. The default filter order is 3, so the + * interpolation uses a neighborhood of 36 pixels by default. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggressive deringing effect is + * achieved. A negative threshold value disables the clamping + * feature. The default value is 0.3. For more information, + * refer to the documentation for the + * SetClampingThreshold( float ) member function. + * + * \param useLUT If true, the interpolation will use a precomputed LUT of + * function values at discrete intervals. This greatly + * improves performance, increasing execution speed by about + * a factor of 2. In current PCL versions, the Lanczos + * functions are sampled at 0.00025 px resolution, which + * provides an interpolation accuracy of about 1.0e-07. This + * is valid for interpolation of 32-bit floating point data, + * but can be insufficient for 32-bit integers and double + * precision, depending on the application. If this parameter + * is false, the interpolation will compute actual function + * values for each interpolation point. This parameter is + * true by default for the uint8, int8, uint16, int16, and + * float template specializations; false by default for other + * types. + */ + LanczosInterpolation( int n = 3, float clamp = __PCL_LANCZOS_CLAMPING_THRESHOLD, bool useLUT = Default::UseLUT( (T*)0 ) ) + : m_n( Max( 1, n ) ) + , m_lut( useLUT ? PCL_InitializeLanczosRealLUT( m_n ) : nullptr ) + , m_Lx( 2*m_n ) + , m_clampTh( Range( clamp, 0.0F, 1.0F ) ) + , m_clampThInv( 1 - m_clampTh ) + , m_clamp( clamp >= 0 ) + { + PCL_PRECONDITION( n >= 1 ) + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + LanczosInterpolation( const LanczosInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~LanczosInterpolation() + { + } + + /*! + * Interpolated value at \a {x,y} location. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + PCL_PRECONDITION( x >= 0 && x < m_width ) + PCL_PRECONDITION( y >= 0 && y < m_height ) + PCL_CHECK( m_n >= 1 ) + + // Central grid coordinates + int x0 = Range( TruncInt( x ), 0, m_width-1 ); + int y0 = Range( TruncInt( y ), 0, m_height-1 ); + + double sp = 0; // positive filter values + double sn = 0; // negative filter values + double wp = 0; // positive filter weight + double wn = 0; // negative filter weight + int i; // row index + + if ( m_lut != nullptr ) + { + // Discrete interpolation increments + int dx = TruncInt( __PCL_LANCZOS_LUT_REAL_RESOLUTION*(x - x0) ); + int dy = TruncInt( __PCL_LANCZOS_LUT_REAL_RESOLUTION*(y - y0) ); + + // Precalculate horizontal filter values + for ( int j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + m_Lx[k] = m_lut[k][dx]; + + int k; // LUT node index + + // Clipped rows at top + for ( i = -m_n + 1, k = 0; i <= m_n; ++i, ++k ) + { + int y = y0 + i; + if ( y >= 0 ) + break; + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, m_lut[k][dy] ); + else + InterpolateRow( sp, sn, wp, wn, m_data - 2*int64( y )*m_width, x0, m_lut[k][dy] ); + } + + // Unclipped rows + for ( ; i <= m_n; ++i, ++k ) + { + int y = y0 + i; + if ( y == m_height ) + break; + InterpolateRow( sp, sn, wp, wn, m_data + int64( y )*m_width, x0, m_lut[k][dy] ); + } + + // Clipped rows at bottom + for ( ; i <= m_n; ++i, ++k ) + { + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, m_lut[k][dy] ); + else + InterpolateRow( sp, sn, wp, wn, m_data + int64( 2*m_height - 2 - y0 - i )*m_width, x0, m_lut[k][dy] ); + } + } + else + { + // Interpolation increments + double dx = x - x0; + double dy = y - y0; + + // Precalculate horizontal filter values + for ( int j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + m_Lx[k] = Lanczos( j - dx ); + + // Clipped rows at top + for ( i = -m_n + 1; i <= m_n; ++i ) + { + int y = y0 + i; + if ( y >= 0 ) + break; + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, Lanczos( i - dy ) ); + else + InterpolateRow( sp, sn, wp, wn, m_data - 2*int64( y )*m_width, x0, Lanczos( i - dy ) ); + } + + // Unclipped rows + for ( ; i <= m_n; ++i ) + { + int y = y0 + i; + if ( y == m_height ) + break; + InterpolateRow( sp, sn, wp, wn, m_data + int64( y )*m_width, x0, Lanczos( i - dy ) ); + } + + // Clipped rows at bottom + for ( ; i <= m_n; ++i ) + { + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, Lanczos( i - dy ) ); + else + InterpolateRow( sp, sn, wp, wn, m_data + int64( 2*m_height - 2 - y0 - i )*m_width, x0, Lanczos( i - dy ) ); + } + } + + // Clamping + if ( m_clamp ) + { + // Empty data? + if ( sp == 0 ) + return 0; + + // Clamping ratio: s-/s+ + double r = sn/sp; + + // Clamp for s- >= s+ + if ( r >= 1 ) + return sp/wp; + + // Clamp for c < s- < s+ + if ( r > m_clampTh ) + { + r = (r - m_clampTh)/m_clampThInv; + double c = 1 - r*r; + sn *= c, wn *= c; + } + } + + // Weighted convolution + return (sp - sn)/(wp - wn); + } + + /*! + * Returns true iff the interpolation clamping feature has been enabled for + * this object. + * + * \sa EnableClamping(), ClampingThreshold() + */ + bool IsClampingEnabled() const noexcept + { + return m_clamp; + } + + /*! + * Enables (or disables) the interpolation clamping feature. + * + * \sa IsClampingEnabled(), DisableClamping(), SetClampingThreshold() + */ + void EnableClamping( bool enable = true ) noexcept + { + m_clamp = enable; + } + + /*! + * Disables (or enables) the interpolation clamping feature. + * + * \sa IsClampingEnabled(), EnableClamping(), SetClampingThreshold() + */ + void DisableClamping( bool disable = true ) noexcept + { + EnableClamping( !disable ); + } + + /*! + * Returns the current clamping threshold for this object. + * + * See the documentation for SetClampingThreshold( float ) for a detailed + * description of the clamping mechanism. + * + * \sa SetClampingThreshold(), IsClampingEnabled(), EnableClamping() + */ + float ClampingThreshold() const noexcept + { + return m_clampTh; + } + + /*! + * Defines a threshold to trigger interpolation \e clamping. + * + * Lanczos interpolation generates strong undershoot (aka ringing) artifacts + * when the negative lobes of the interpolation function fall over bright + * isolated pixels or edges. The clamping mechanism acts by limiting the + * high-pass component of the interpolation filter selectively to fix these + * problems. + * + * The specified clamping threshold \e clamp must be in the [0,1] range. + * Lower values cause a more aggressive deringing effect. Too strong of a + * clamping threshold can degrade performance of the Lanczos filter to some + * degree, since it tends to block its high-pass behavior. + * + * \note The interpolation clamping feature must be enabled for this + * threshold to have any effect. See the constructor for this class and the + * documentation for IsClampingEnabled(). + * + * \sa ClampingThreshold(), IsClampingEnabled(), EnableClamping() + */ + void SetClampingThreshold( float clamp ) noexcept + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + m_clampTh = Range( clamp, 0.0F, 1.0F ); + } + +private: + + int m_n; // filter order + const double** m_lut; // precomputed function values + mutable DVector m_Lx; // precalculated row of function values + double m_clampTh; // clamping threshold in [0,1] + double m_clampThInv; // 1 - m_clampTh + bool m_clamp; // clamping enabled ? + + /* + * Sinc function for x > 0 + */ + static double Sinc( double x ) noexcept + { + x *= Const::pi(); + return (x > 1.0e-07) ? Sin( x )/x : 1.0; + } + + /* + * Evaluate Lanczos function at x. + */ + double Lanczos( double x ) const noexcept + { + if ( x < 0 ) + x = -x; + if ( x < m_n ) + return Sinc( x ) * Sinc( x/m_n ); + return 0; + } + + /* + * Interpolate a row of pixels. + * Can be either an unclipped row or a mirrored border row. + */ + void InterpolateRow( double& sp, double& sn, double& wp, double& wn, const T* f, int x0, double Ly ) const noexcept + { + int j, k; + + // Clipped pixels at the left border + for ( j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + if ( x >= 0 ) + break; + double L = m_Lx[k] * Ly; + double s = (m_fillBorder ? m_fillValue : double( f[-x] )) * L; + PCL_LANCZOS_ACC() + } + + // Unclipped pixels + for ( ; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + if ( x == m_width ) + break; + double L = m_Lx[k] * Ly; + double s = f[x] * L; + PCL_LANCZOS_ACC() + } + + // Clipped pixels at the right border + for ( ; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + double L = m_Lx[k] * Ly; + double s = (m_fillBorder ? m_fillValue : double( f[2*m_width - 2 - x] )) * L; + PCL_LANCZOS_ACC() + } + } + + /* + * Interpolate a clipped pixel row with border filling. + */ + void FillRow( double& sp, double& sn, double& wp, double& wn, double Ly ) const noexcept + { + for ( int j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + { + double L = m_Lx[k] * Ly; + double s = m_fillValue * L; + PCL_LANCZOS_ACC() + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \internal + * \class LanczosLUTInterpolationBase + * \brief Base class of two dimensional LUT-based Lanczos interpolation algorithms. + * + * This is the base class for fixed-order Lanczos interpolation algorithms + * implemented through precalculated look-up tables (LUTs). The filter order + * \a n is specified as the second template class argument. For a description + * of the Lanczos algorithm and information on its performance and features, + * refer to the documentation for the LanczosInterpolation class. + * + * LUT-based Lanczos interpolations are about three times faster than the + * corresponding function evaluation interpolations. Interpolation from the + * implemented LUTs provides a maximum error of +/- 1/2^16, so this class and + * its derived classes are fully accurate for 8-bit and 16-bit integer images. + * + * \sa BidimensionalInterpolation, LanczosInterpolation, + * Lanczos3LUTInterpolation, Lanczos4LUTInterpolation, Lanczos5LUTInterpolation + */ +template +class PCL_CLASS LanczosLUTInterpolationBase : public BidimensionalInterpolation +{ +public: + + /*! + * Constructs a %LanczosLUTInterpolationBase instance. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggressive deringing effect is + * achieved. A negative threshold value disables the clamping + * feature. The default value is 0.3. For more information, + * refer to the documentation for the + * SetClampingThreshold( float ) member function. + */ + LanczosLUTInterpolationBase( float clamp ) + : m_lut( PCL_InitializeLanczosIntLUT( m_n ) ) + , m_Lx( 2*m_n ) + , m_Ly( 2*m_n ) + , m_clampTh( Range( clamp, 0.0F, 1.0F ) ) + , m_clampThInv( 1 - m_clampTh ) + , m_clamp( clamp >= 0 ) + { + PCL_PRECONDITION( m_n >= 1 ) + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + PCL_CHECK( m_lut != nullptr ) + } + + /*! + * Copy constructor. + */ + LanczosLUTInterpolationBase( const LanczosLUTInterpolationBase& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~LanczosLUTInterpolationBase() + { + } + + /*! + * Interpolated value at \a {x,y} location. + * + * \param x,y %Coordinates of the interpolation point (horizontal, + * vertical). + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + PCL_PRECONDITION( x >= 0 && x < m_width ) + PCL_PRECONDITION( y >= 0 && y < m_height ) + + // Central grid coordinates + int x0 = Range( TruncInt( x ), 0, m_width-1 ); + int y0 = Range( TruncInt( y ), 0, m_height-1 ); + + // Precalculate function values + int dx = RoundInt( (x - x0)*__PCL_LANCZOS_LUT_INT_RESOLUTION ); + int dy = RoundInt( (y - y0)*__PCL_LANCZOS_LUT_INT_RESOLUTION ); + for ( int j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + { + int d0 = j*__PCL_LANCZOS_LUT_INT_RESOLUTION; + m_Lx[k] = m_lut[Abs( d0 - dx )]; + m_Ly[k] = m_lut[Abs( d0 - dy )]; + } + + double sp = 0; // positive filter values + double sn = 0; // negative filter values + double wp = 0; // positive filter weight + double wn = 0; // negative filter weight + int i, k; // row and coefficient indices + + // Clipped rows at top + for ( i = -m_n + 1, k = 0; i <= m_n; ++i, ++k ) + { + int y = y0 + i; + if ( y >= 0 ) + break; + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, m_Ly[k] ); + else + InterpolateRow( sp, sn, wp, wn, m_data - 2*int64( y )*m_width, x0, m_Ly[k] ); + } + + // Unclipped rows + for ( ; i <= m_n; ++i, ++k ) + { + int y = y0 + i; + if ( y == m_height ) + break; + InterpolateRow( sp, sn, wp, wn, m_data + int64( y )*m_width, x0, m_Ly[k] ); + } + + // Clipped rows at bottom + for ( ; i <= m_n; ++i, ++k ) + { + if ( m_fillBorder ) + FillRow( sp, sn, wp, wn, m_Ly[k] ); + else + InterpolateRow( sp, sn, wp, wn, m_data + int64( 2*m_height - 2 - y0 - i )*m_width, x0, m_Ly[k] ); + } + + // Clamping + if ( m_clamp ) + { + // Empty data? + if ( sp == 0 ) + return 0; + + // Clamping ratio: s-/s+ + double r = sn/sp; + + // Clamp for s- >= s+ + if ( r >= 1 ) + return sp/wp; + + // Clamp for c < s- < s+ + if ( r > m_clampTh ) + { + r = (r - m_clampTh)/m_clampThInv; + double c = 1 - r*r; + sn *= c, wn *= c; + } + } + + // Weighted convolution + return (sp - sn)/(wp - wn); + } + + /*! + * Returns true iff the interpolation clamping feature has been enabled for + * this object. + * + * \sa EnableClamping(), ClampingThreshold() + */ + bool IsClampingEnabled() const noexcept + { + return m_clamp; + } + + /*! + * Enables (or disables) the interpolation clamping feature. + * + * \sa IsClampingEnabled(), DisableClamping(), SetClampingThreshold() + */ + void EnableClamping( bool enable = true ) noexcept + { + m_clamp = enable; + } + + /*! + * Disables (or enables) the interpolation clamping feature. + * + * \sa IsClampingEnabled(), EnableClamping(), SetClampingThreshold() + */ + void DisableClamping( bool disable = true ) noexcept + { + EnableClamping( !disable ); + } + + /*! + * Returns the current clamping threshold for this object. + * + * See the documentation for SetClampingThreshold( float ) for a detailed + * description of the clamping mechanism. + * + * \sa SetClampingThreshold(), IsClampingEnabled(), EnableClamping() + */ + float ClampingThreshold() const noexcept + { + return m_clampTh; + } + + /*! + * Defines a threshold to trigger interpolation \e clamping. + * + * Lanczos interpolation generates strong undershoot (aka ringing) artifacts + * when the negative lobes of the interpolation function fall over bright + * isolated pixels or edges. The clamping mechanism acts by limiting the + * high-pass component of the interpolation filter selectively to fix these + * problems. + * + * The specified clamping threshold \e clamp must be in the [0,1] range. + * Lower values cause a more aggressive deringing effect. Too strong of a + * clamping threshold can degrade performance of the Lanczos filter to some + * degree, since it tends to block its high-pass behavior. + * + * \note The interpolation clamping feature must be enabled for this + * threshold to have any effect. See the constructor for this class and the + * documentation for IsClampingEnabled(). + * + * \sa ClampingThreshold(), IsClampingEnabled(), EnableClamping() + */ + void SetClampingThreshold( float clamp ) noexcept + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + m_clampTh = Range( clamp, 0.0F, 1.0F ); + } + +private: + + const float* m_lut; // filter LUT + mutable FVector m_Lx, m_Ly; // precalculated function values + double m_clampTh; // clamping threshold in [0,1] + double m_clampThInv; // 1 - m_clampTh + bool m_clamp; // clamping enabled ? + + /* + * Interpolate a row of pixels. + * Can be either an unclipped row or a mirrored border row. + */ + void InterpolateRow( double& sp, double& sn, double& wp, double& wn, const T* f, int x0, float Ly ) const noexcept + { + int j, k; + + // Clipped pixels at the left border + for ( j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + if ( x >= 0 ) + break; + double L = m_Lx[k] * Ly; + double s = (m_fillBorder ? m_fillValue : double( f[-x] )) * L; + PCL_LANCZOS_ACC() + } + + // Unclipped pixels + for ( ; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + if ( x == m_width ) + break; + double L = m_Lx[k] * Ly; + double s = f[x] * L; + PCL_LANCZOS_ACC() + } + + // Clipped pixels at the right border + for ( ; j <= m_n; ++j, ++k ) + { + int x = x0 + j; + double L = m_Lx[k] * Ly; + double s = (m_fillBorder ? m_fillValue : double( f[2*m_width - 2 - x] )) * L; + PCL_LANCZOS_ACC() + } + } + + /* + * Interpolate a clipped pixel row with border filling. + */ + void FillRow( double& sp, double& sn, double& wp, double& wn, float Ly ) const noexcept + { + for ( int j = -m_n + 1, k = 0; j <= m_n; ++j, ++k ) + { + double L = m_Lx[k] * Ly; + double s = m_fillValue * L; + PCL_LANCZOS_ACC() + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos3LUTInterpolation + * \brief Two dimensional LUT-based 3rd-order Lanczos interpolation algorithm. + * + * This class implements 3rd-order Lanczos interpolation through precalculated + * look-up tables. For a description of the Lanczos algorithm and information + * on its performance and features, refer to the documentation for the + * LanczosInterpolation class. + * + * LUT-based Lanczos interpolations are about three times faster than the + * corresponding function evaluation interpolations. Interpolation from the + * implemented LUTs provides a maximum error of +/- 1/2^16, so this class is + * fully accurate for 8-bit and 16-bit integer images. + * + * \sa LanczosInterpolation, LanczosLUTInterpolationBase, + * Lanczos4LUTInterpolation, Lanczos5LUTInterpolation + */ +template +class PCL_CLASS Lanczos3LUTInterpolation : public LanczosLUTInterpolationBase +{ +public: + + /*! + * Constructs a %Lanczos3LUTInterpolation instance. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggressive deringing effect is + * achieved. A negative threshold value disables the clamping + * feature. The default value is 0.3. For more information, + * refer to the documentation for the + * SetClampingThreshold( float ) member function. + */ + Lanczos3LUTInterpolation( float clamp = __PCL_LANCZOS_CLAMPING_THRESHOLD ) + : LanczosLUTInterpolationBase( clamp ) + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos3LUTInterpolation( const Lanczos3LUTInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~Lanczos3LUTInterpolation() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos4LUTInterpolation + * \brief Two dimensional LUT-based 4th-order Lanczos interpolation algorithm. + * + * This class implements 4th-order Lanczos interpolation through precalculated + * look-up tables. For a description of the Lanczos algorithm and information + * on its performance and features, refer to the documentation for the + * LanczosInterpolation class. + * + * LUT-based Lanczos interpolations are about three times faster than the + * corresponding function evaluation interpolations. Interpolation from the + * implemented LUTs provides a maximum error of +/- 1/2^16, so this class is + * fully accurate for 8-bit and 16-bit integer images. + * + * \sa LanczosInterpolation, LanczosLUTInterpolationBase, + * Lanczos3LUTInterpolation, Lanczos5LUTInterpolation + */ +template +class PCL_CLASS Lanczos4LUTInterpolation : public LanczosLUTInterpolationBase +{ +public: + + /*! + * Constructs a %Lanczos4LUTInterpolation instance. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggressive deringing effect is + * achieved. A negative threshold value disables the clamping + * feature. The default value is 0.3. For more information, + * refer to the documentation for the + * SetClampingThreshold( float ) member function. + */ + Lanczos4LUTInterpolation( float clamp = __PCL_LANCZOS_CLAMPING_THRESHOLD ) + : LanczosLUTInterpolationBase( clamp ) + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos4LUTInterpolation( const Lanczos4LUTInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~Lanczos4LUTInterpolation() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos5LUTInterpolation + * \brief Two dimensional LUT-based 5th-order Lanczos interpolation algorithm. + * + * This class implements 5th-order Lanczos interpolation through precalculated + * look-up tables. For a description of the Lanczos algorithm and information + * on its performance and features, refer to the documentation for the + * LanczosInterpolation class. + * + * LUT-based Lanczos interpolations are about three times faster than the + * corresponding function evaluation interpolations. Interpolation from the + * implemented LUTs provides a maximum error of +/- 1/2^16, so this class is + * fully accurate for 8-bit and 16-bit integer images. + * + * \sa LanczosInterpolation, LanczosLUTInterpolationBase, + * Lanczos3LUTInterpolation, Lanczos4LUTInterpolation + */ +template +class PCL_CLASS Lanczos5LUTInterpolation : public LanczosLUTInterpolationBase +{ +public: + + /*! + * Constructs a %Lanczos5LUTInterpolation instance. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggressive deringing effect is + * achieved. A negative threshold value disables the clamping + * feature. The default value is 0.3. For more information, + * refer to the documentation for the + * SetClampingThreshold( float ) member function. + */ + Lanczos5LUTInterpolation( float clamp = __PCL_LANCZOS_CLAMPING_THRESHOLD ) + : LanczosLUTInterpolationBase( clamp ) + { + PCL_PRECONDITION( 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos5LUTInterpolation( const Lanczos5LUTInterpolation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~Lanczos5LUTInterpolation() + { + } +}; + +// ---------------------------------------------------------------------------- + +#undef PCL_LANCZOS_ACC + +#undef m_width +#undef m_height +#undef m_fillBorder +#undef m_fillValue +#undef m_data + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_LanczosInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LanczosInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LinearFilter.h b/3rdparty/include/pcl/LinearFilter.h new file mode 100644 index 0000000..bdbb0ea --- /dev/null +++ b/3rdparty/include/pcl/LinearFilter.h @@ -0,0 +1,203 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LinearFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LinearFilter_h +#define __PCL_LinearFilter_h + +/// \file pcl/LinearFilter.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class LinearFilter + * \brief A kernel filter that follows a discrete linear distribution with + * radial symmetry in two dimensions. + * + * A %LinearFilter object is a KernelFilter whose elements are calculated + * following a radial linear gradient function controlled by the following + * parameters: + * + * + * + * + * + *
\e size Odd filter size in pixels (size >= 3).
\e centralValue Value of the central filter element.
\e outerValue Value of outer (radial) elements.
+ * + * \sa KernelFilter, GaussianFilter, MoffatFilter, VariableShapeFilter + */ +class PCL_CLASS LinearFilter : public KernelFilter +{ +public: + + /*! + * Constructs an empty %LinearFilter object with default functional + * parameters: size=5, centralValue=1, outerValue=0.01. + */ + LinearFilter() = default; + + /*! + * Constructs a %LinearFilter object given the odd filter size \a n >= 3, + * central value \a v0, and outer value \a v1. Assigns an optional \a name + * to the new filter object. + */ + LinearFilter( int n, float v0 = 1.0F, float v1 = 0.01F, const String& name = String() ) + : KernelFilter( n, name ) + { + Initialize( v0, v1 ); + } + + /*! + * Copy constructor. + */ + LinearFilter( const LinearFilter& ) = default; + + /*! + * Move constructor. + */ + LinearFilter( LinearFilter&& ) = default; + + /*! + */ + KernelFilter* Clone() const override + { + return new LinearFilter( *this ); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + LinearFilter& operator =( const LinearFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + LinearFilter& operator =( LinearFilter&& ) = default; + + /*! + * Returns the central filter coefficient value. + */ + float CentralValue() const + { + return m_centralValue; + } + + /*! + * Returns the outer filter coefficient value. + */ + float OuterValue() const + { + return m_outerValue; + } + + /*! + * Recalculates filter coefficients for the specified central and outer + * coefficient values, \a v0 and \a v1, respectively. + */ + void Set( float v0, float v1 ) + { + Initialize( v0, v1 ); + } + + /*! + * Recalculates filter coefficients for the specified outer coefficient + * value \a v1. The current central coefficient value is not varied. + */ + void Set( float v1 ) + { + Initialize( m_centralValue, v1 ); + } + + /*! + * Recalculates filter coefficients for the given kernel size \a n >= 3. The + * current central and outer coefficient values are not varied. + */ + void Resize( int n ) override + { + KernelFilter::Resize( n ); + Initialize( m_centralValue, m_outerValue ); + } + +private: + + float m_centralValue = 1.0F; + float m_outerValue = 0.01F; + + void Initialize( float v0, float v1 ) + { + m_centralValue = v0; + m_outerValue = v1; + float* h = *coefficients; + if ( h != nullptr ) + { + int n2 = Size() >> 1; + float dvn2 = (v1 - v0)/n2; + for ( int y = -n2; y <= n2; ++y ) + for ( int x = -n2; x <= n2; ++x ) + *h++ = v0 + Sqrt( float( x*x + y*y ) ) * dvn2; + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_LinearFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LinearFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LinearFit.h b/3rdparty/include/pcl/LinearFit.h new file mode 100644 index 0000000..9cae1c3 --- /dev/null +++ b/3rdparty/include/pcl/LinearFit.h @@ -0,0 +1,251 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LinearFit.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LinearFit_h +#define __PCL_LinearFit_h + +/// \file pcl/LinearFit.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS StatusMonitor; + +/*! + * \class LinearFit + * \brief Robust straight line fitting by minimization of mean absolute + * deviation + * + * Given a set of N data points {xi,yi} for i = {0,...,N-1}, %LinearFit finds + * the parameters a,b of the linear function: + * + *
y = L(x) := a + b*x
+ * + * that minimizes mean absolute deviation for all the data points. The \e a + * parameter of L() is the ordinate of its intersection with the Y axis. The + * \e b parameter is the slope of the fitted straight line. + */ +class PCL_CLASS LinearFit +{ +public: + + /*! + * The \e a parameter of the fitted straight line: + * + *
y = a + b*x
+ * + * is the ordinate of its intersection with the Y axis. It represents a + * constant additive pedestal present in the whole dataset. + */ + double a = 0; + + /*! + * The \e b parameter is the slope of the fitted straight line: + * + *
y = a + b*x
+ * + * If the fitted line passes through two points {x1,y1} and {x2,y2}, then + * its slope is equal to (y2 - y1)/(x2 - x1). + */ + double b = 0; + + /*! + * Mean absolute deviation of the linear fit. This is the mean absolute + * deviation computed for all data points with respect to the fitted + * straight line function. + */ + double adev = 0; + + /*! + * Returns true iff the fitted straight line model is valid. The model + * function is valid if the slope parameter is finite, i.e., if the fitted + * line is not vertical. + */ + bool IsValid() const + { + return IsFinite( b ); + } + + /*! + * Evaluates the fitted line function for the specified abscissa \a x. + */ + double operator ()( double x ) const + { + return a + b*x; + } + + /*! + * Constructs a default %LinearFit object. The resulting object corresponds + * to a horizontal line crossing at the origin, i.e. the X axis. + */ + LinearFit() = default; + + /*! + * Copy constructor. + */ + LinearFit( const LinearFit& ) = default; + + /*! + * Constructs a %LinearFit object representing the straight line that passes + * through two points {x1,y1} and {x2,y2}. + * + * \warning Do not specify a vertical line, that is, make sure that + * x1 != x2 w.r.t. the machine epsilon, or this constructor will perform a + * division by zero. + */ + template + LinearFit( T x1, T y1, T x2, T y2 ) + { + b = double( y2 - y1 )/double( x2 - x1 ); + a = (y2 - b*x2 + y1 - b*x1)/2; + adev = 0; + } + + /*! + * Constructs a %LinearFit object to fit a straight line for the specified + * set of data points. + * + * \param x %Array of abscissae values. + * + * \param y %Array of ordinate values. + * + * \param n Number of data points. Must be >= 2. + * + * \param status If nonzero, pointer to a StatusMonitor object that will be + * updated during the fitting process. The linear fit process + * is \e unbounded, i.e., the total number of monitoring + * steps cannot be known in advance. The default value is + * zero (no monitoring). + * + * When n >= 3, this constructor fits the straight line that minimizes mean + * absolute deviation for all the source data points. When n == 2, this + * function finds the straight line that passes through the two data points. + * When n < 2, this constructor throws an Error exception. + */ + template + LinearFit( const T* x, const T* y, size_type n, StatusMonitor* status = nullptr ) + { + if ( n < 2 ) + throw Error( "LinearFit::LinearFit(): Less than two data points specified." ); + + if ( n == 2 ) + { + b = double( y[1] - y[0] )/double( x[1] - x[0] ); + a = (y[1] - b*x[1] + y[0] - b*x[0])/2; + adev = 0; + } + else + Fit( a, b, adev, x, y, n, status ); + } + + /*! + * Constructs a %LinearFit object to fit a straight line for the specified + * data containers. + * + * \param x %Container of abscissae values. + * + * \param y %Container of ordinate values. + * + * \param status If nonzero, pointer to a StatusMonitor object that will be + * updated during the fitting process. The linear fit process + * is \e unbounded, i.e., the total number of monitoring + * steps cannot be known in advance. The default value is + * zero (no monitoring). + * + * The number \a n of data points is the minimum container length, i.e.: + * + *
n = Min( x.Length(), y.Length() )
+ * + * When n >= 3, this constructor fits the straight line that minimizes mean + * absolute deviation for all the source data points. When n == 2, this + * function finds the straight line that passes through the two data points. + * When n < 2, this constructor throws an Error exception. + */ + template + LinearFit( const C& x, const C& y, StatusMonitor* status = nullptr ) + { + size_type n = Min( x.Length(), y.Length() ); + if ( n < 2 ) + throw Error( "LinearFit::LinearFit(): Less than two data points specified." ); + + if ( n == 2 ) + { + b = double( y[1] - y[0] )/double( x[1] - x[0] ); + a = (y[1] - b*x[1] + y[0] - b*x[0])/2; + adev = 0; + } + else + Fit( a, b, adev, x.Begin(), y.Begin(), n, status ); + } + +private: + + static void Fit( double& a, double& b, double& adev, + const float* fx, const float* fy, size_type n, StatusMonitor* status ); + static void Fit( double& a, double& b, double& adev, + const double* fx, const double* fy, size_type n, StatusMonitor* status ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __LinearFit_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LinearFit.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LinearInterpolation.h b/3rdparty/include/pcl/LinearInterpolation.h new file mode 100644 index 0000000..be1fa0d --- /dev/null +++ b/3rdparty/include/pcl/LinearInterpolation.h @@ -0,0 +1,161 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LinearInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LinearInterpolation_h +#define __PCL_LinearInterpolation_h + +/// \file pcl/LinearInterpolation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class LinearInterpolation + * \brief Linear interpolation algorithm. + * + * The linear interpolation algorithm interpolates from two adjacent mapped + * source data items. It evaluates a linear function defined by the two + * adjacent points. + * + * \sa AkimaInterpolation, CubicSplineInterpolation + */ +template +class PCL_CLASS LinearInterpolation : public UnidimensionalInterpolation +{ +public: + + typedef typename UnidimensionalInterpolation::vector_type vector_type; + + /*! + * Constructs a %LinearInterpolation object. + */ + LinearInterpolation() = default; + + /*! + * Copy constructor. + */ + LinearInterpolation( const LinearInterpolation& ) = default; + + /*! + * Destroys a %LinearInterpolation object. + */ + virtual ~LinearInterpolation() + { + } + + /*! + * Returns true iff this interpolation is valid, i.e. if it has been + * correctly initialized and is ready to interpolate function values. + */ + bool IsValid() const override + { + return this->m_y.Length() > 1; + } + + /*! + * Interpolated value at \a x location. + */ + double operator()( double x ) const override + { + PCL_PRECONDITION( IsValid() ) + + if ( this->m_x ) + { + // Interpolation with monotonically increasing, explicit x[i]. + + PCL_CHECK( this->m_x.Length() >= this->m_y.Length() ) + int i0 = 0; + int i1 = this->m_x.Length() - 1; + while ( i1-i0 > 1 ) + { + int im = (i0 + i1) >> 1; + if ( x < this->m_x[im] ) + i1 = im; + else + i0 = im; + } + double x0( this->m_x[i0] ); + double y0( this->m_y[i0] ); + double dx = double( this->m_x[i1] ) - x0; + if ( 1 + dx != 1 ) // if no infinite slope (to within roundoff) + y0 += (x - x0)*(double( this->m_y[i1] ) - y0)/dx; + return y0; + } + else + { + // Interpolation with implicit x[i] = i for i = {0,1,...,n-1}. + + if ( x <= 0 ) + return this->m_y[0]; + if ( x >= this->m_y.Length()-1 ) + return this->m_y[this->m_y.Length()-1]; + int i0 = TruncInt( x ); + double y0( this->m_y[i0] ); + return y0 + (x - i0)*(double( this->m_y[i0+1] ) - y0); + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_LinearInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LinearInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LinearTransformation.h b/3rdparty/include/pcl/LinearTransformation.h new file mode 100644 index 0000000..af08548 --- /dev/null +++ b/3rdparty/include/pcl/LinearTransformation.h @@ -0,0 +1,287 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LinearTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LinearTransformation_h +#define __PCL_LinearTransformation_h + +/// \file pcl/LinearTransformation.h + +#include + +#include +#include +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class LinearTransformation + * \brief A linear geometric transformation on the plane defined as a 2x3 + * matrix of 64-bit floating point scalars. + * + * %LinearTransformation is a simple structure where the six transformation + * coefficients are stored directly as \c double scalars. Since the third row + * of the transformation matrix is (0, 0, 1) implicitly, this class can only + * represent translations, rotations and scale changes. This class is primarily + * intended to support WCS coordinate transformations. + * + * \ingroup astrometry_support + */ +class LinearTransformation +{ +public: + + /*! + * Default constructor. Constructs a unit linear transformation. + */ + LinearTransformation() = default; + + /*! + * Copy constructor. + */ + LinearTransformation( const LinearTransformation& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + LinearTransformation& operator =( const LinearTransformation& ) = default; + + /*! + * Constructs a linear transformation with the specified matrix elements. + */ + LinearTransformation( double a00, double a01, double a02, double a10, double a11, double a12 ) + : m_a00( a00 ), m_a01( a01 ), m_a02( a02 ) + , m_a10( a10 ), m_a11( a11 ), m_a12( a12 ) + , m_det( a00*a11 - a01*a10 ) + { + } + + /*! + * Returns true if this transformation has been defined by a singular + * matrix. A singular matrix has zero or insignificant (with respect to the + * machine epsilon for \c double) determinant and hence cannot be inverted. + */ + bool IsSingularMatrix() const + { + return 1 + m_det == 1; + } + + /*! + * Returns the transformation of the specified point \a p. + */ + DPoint Transform( const DPoint& p ) const + { + return DPoint( m_a00*p.x + m_a01*p.y + m_a02, + m_a10*p.x + m_a11*p.y + m_a12 ); + } + + /*! + * Returns the transformation of the specified point \a p. This operator is + * equivalent to the Transform() member function. + */ + DPoint operator ()( const DPoint& p ) const + { + return Transform( p ); + } + + /*! + * Returns the inverse transformation of the specified point \a p. + * + * If the transformation matrix is singular, this member function throws an + * Error exception. + */ + DPoint TransformInverse( const DPoint& p ) const + { + if ( IsSingularMatrix() ) + throw Error( "Invalid call to LinearTransformation::TransformInverse(): Singular matrix" ); + return DPoint( ( m_a11*p.x - m_a01*p.y + m_a01*m_a12 - m_a02*m_a11)/m_det, + (-m_a10*p.x + m_a00*p.y + m_a02*m_a10 - m_a00*m_a12)/m_det ); + } + + /*! + * Returns the product of this transformation by a transformation \a T. + */ + LinearTransformation Multiply( const LinearTransformation& T ) const + { + return LinearTransformation( m_a00*T.m_a00 + m_a01*T.m_a10, + m_a00*T.m_a01 + m_a01*T.m_a11, + m_a00*T.m_a02 + m_a01*T.m_a12 + m_a02, + m_a10*T.m_a00 + m_a11*T.m_a10, + m_a10*T.m_a01 + m_a11*T.m_a11, + m_a10*T.m_a02 + m_a11*T.m_a12 + m_a12 ); + } + + /*! + * Returns the inverse of this transformation. + * + * If the transformation matrix is singular, this member function throws an + * Error exception. + */ + LinearTransformation Inverse() const + { + if ( IsSingularMatrix() ) + throw Error( "Invalid call to LinearTransformation::Inverse(): Singular matrix" ); + return LinearTransformation( m_a11/m_det, + -m_a01/m_det, + (m_a01*m_a12 - m_a02*m_a11)/m_det, + -m_a10/m_det, + m_a00/m_det, + (m_a02*m_a10 - m_a00*m_a12)/m_det ); + } + + /*! + * Returns the transformation coefficient at the first row, first column. + */ + double A00() const + { + return m_a00; + } + + /*! + * Returns the transformation coefficient at the first row, second column. + */ + double A01() const + { + return m_a01; + } + + /*! + * Returns the transformation coefficient at the first row, third column. + */ + double A02() const + { + return m_a02; + } + + /*! + * Returns the transformation coefficient at the second row, first column. + */ + double A10() const + { + return m_a10; + } + + /*! + * Returns the transformation coefficient at the second row, second column. + */ + double A11() const + { + return m_a11; + } + + /*! + * Returns the transformation coefficient at the third row, third column. + */ + double A12() const + { + return m_a12; + } + + /*! + * Returns a 3x3 matrix initialized with the transformation coefficients in + * this object. + */ + Matrix ToMatrix() const + { + return Matrix( m_a00, m_a01, m_a02, + m_a10, m_a11, m_a12, + 0.0, 0.0, 1.0 ); + } + + /*! + * Returns a six-component vector initialized with the transformation + * coefficients in this object. + */ + Vector ToVector() const + { + return Vector( { m_a00, m_a01, m_a02, m_a10, m_a11, m_a12 } ); + } + + /*! + * Returns a string representation of the transformation matrix. The + * representation consists of two text lines, each with \a indent leading + * spaces, separated by a newline character. + */ + String ToString( int indent = 0 ) const + { + String text; + if ( indent > 0 ) + text << String( ' ', indent ); + text.AppendFormat( "%+16.8e %+16.8e %+16.8e\n", m_a00, m_a01, m_a02 ); + if ( indent > 0 ) + text << String( ' ', indent ); + text.AppendFormat( "%+16.8e %+16.8e %+16.8e", m_a10, m_a11, m_a12 ); + return text; + } + +private: + + double m_a00 = 1, m_a01 = 0, m_a02 = 0, + m_a10 = 0, m_a11 = 1, m_a12 = 0; + double m_det = 1; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_LinearTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LinearTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/LocalNormalizationData.h b/3rdparty/include/pcl/LocalNormalizationData.h new file mode 100644 index 0000000..7cfd9ae --- /dev/null +++ b/3rdparty/include/pcl/LocalNormalizationData.h @@ -0,0 +1,795 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/LocalNormalizationData.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_LocalNormalizationData_h +#define __PCL_LocalNormalizationData_h + +/// \file pcl/LocalNormalizationData.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS XMLDocument; +class PCL_CLASS XMLElement; + +/*! + * \class LocalNormalizationData + * \brief Normalization data parser and generator + * + * %LocalNormalizationData implements support for the %XML normalization data + * format (XNML format, .xnml file suffix). + * + * An XNML file stores local normalization function data suitable for pixel + * rejection and image integration tasks, including drizzle integration. The + * %LocalNormalizationData class is a high-level interface for parsing and + * generation of these special files. + * + * Local normalization functions are serialized as floating point real images, + * where each channel stores scaling and zero offset coefficients, sampled at a + * prescribed normalization scale, for a channel of a specific image. + * + * For a channel index c and position vector i on a given input image, the + * local normalization function is: + * + * v'(c,i) = U(A(c,i))*(v(c,i) - C(c)) + U(B(c,i)) + * + * where A(c) is the matrix of scaling coefficients, B(c) is the matrix of zero + * offset coefficients, C(c) is the bias level (C = 0 by default), U() is a + * scale-dependent interpolation functional, v is an input pixel value, and v' + * is the normalized pixel value. + * + * This implementation can also apply an optional global normalization function + * after the local normalization. If the corresponding parameters are defined, + * the global normalization function is: + * + * v''(c,i) = S(c)*(v'(c,i) - T(c)) + R(c) + * + * where S is a vector of global scaling factors, T is a vector of target + * locations, and R is a vector of reference locations. v' is the locally + * normalized pixel value, as defined above, and v'' is the output value after + * local and global normalization. + * + * Local normalization matrices are conveniently stored as multichannel, + * two-dimensional images, which facilitates two-dimensional interpolation with + * smooth pixel interpolation algorithms. Normalization matrices are normally + * much smaller than the reference image dimensions. This happens because we + * define local normalization functions at a specific dimensional scale, which + * typically corresponds to a large dyadic scale of 64, 128, or 256 pixels. For + * this reason, normalization matrices require a smooth interpolation to + * compute normalization coefficients at reference image coordinates. + * + * \sa DrizzleData + */ +class PCL_CLASS LocalNormalizationData +{ +public: + + /*! + * Represents a per-channel set of local image normalization matrices. + */ + typedef Image normalization_matrices; + + /*! + * Represents a local normalization function coefficient. + */ + typedef normalization_matrices::sample normalization_coefficient; + + /*! + * Represents a smooth interpolation used for calculation of local + * normalization function values at image pixel coordinates. + */ + typedef BicubicBSplineInterpolation + matrix_interpolation; + + /*! + * Represents an array of local normalization interpolators. + */ + typedef Array matrix_interpolations; + + /*! + * Constructs an empty %LocalNormalizationData object. + */ + LocalNormalizationData() = default; + + /*! + * Copy constructor. + */ + LocalNormalizationData( const LocalNormalizationData& ) = default; + + /*! + * Move constructor. + */ + LocalNormalizationData( LocalNormalizationData&& ) = default; + + /*! + * Constructs a new %LocalNormalizationData instance by loading and parsing + * a file in XNML format. + * + * \param filePath Path to an existing file that will be parsed. The file + * contents must be in %XML normalization data format + * (usually, a file with the .xnml suffix). + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * This constructor validates the data retrieved from the specified file. It + * throws the appropriate Error exceptions in the event of parsing errors or + * invalid data. + */ + LocalNormalizationData( const String& filePath, bool ignoreNormalizationData = false ) + { + Parse( filePath, ignoreNormalizationData ); + } + + /*! + * Constructs a new %LocalNormalizationData instance by parsing a + * well-formed %XML document in XNML format. + * + * \param xml Reference to the source %XML document. This constructor + * expects an %XML document in valid %XML normalization + * data format (.xnml). + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * This constructor validates the data retrieved from the specified %XML + * document. It throws an Error exception in the event of an invalid + * document or invalid data. + */ + LocalNormalizationData( const XMLDocument& xml, bool ignoreNormalizationData = false ) + { + Parse( xml, ignoreNormalizationData ); + } + + /*! + * Constructs a new %LocalNormalizationData instance by parsing an %XML + * element in XNML format. + * + * \param element Reference to the source %XML element. This constructor + * expects an %XML document tree in valid %XML + * normalization data format (.xnml) rooted at the + * specified element. + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * This constructor validates the data retrieved from the specified %XML + * element. It throws an Error exception in the event of invalid data. + */ + LocalNormalizationData( const XMLElement& element, bool ignoreNormalizationData = false ) + { + Parse( element, ignoreNormalizationData ); + } + + /*! + * Virtual destructor. + */ + virtual ~LocalNormalizationData() + { + } + + /*! + * Returns the full path to the reference image file used for calculation of + * the normalization data represented by this instance, or an empty string + * if that file path is not available. + * + * \sa SetReferenceFilePath() + */ + const String& ReferenceFilePath() const + { + return m_referenceFilePath; + } + + /*! + * Sets the path to the reference image file used for calculation of the + * normalization data stored in this instance. + * + * \sa ReferenceFilePath() + */ + void SetReferenceFilePath( const String& filePath ) + { + m_referenceFilePath = File::FullPath( filePath ); + } + + /*! + * Returns the full path to the image file for which the normalization data + * represented by this instance was calculated, or an empty string if such + * file path is not available. + * + * The file identified by this function stores the input image of the image + * normalization task that created this object. This file can be used as + * input for a regular (non-drizzle) integration task, and the data + * transported by this object can then be used for normalization of pixel + * values in pixel rejection and/or integration output generation, including + * drizzle integration. + * + * \sa SetTargetFilePath() + */ + const String& TargetFilePath() const + { + return m_targetFilePath; + } + + /*! + * Sets the path to the image file for which the normalization data stored + * in this instance was calculated. + * + * \sa TargetFilePath() + */ + void SetTargetFilePath( const String& filePath ) + { + m_targetFilePath = File::FullPath( filePath ); + } + + /*! + * Returns the scale in pixels at which the local normalization functions + * were sampled and calculated. For valid normalization data, the returned + * value must be larger than zero, and should normally be larger than or + * equal to 32 pixels. + * + * \sa SetNormalizationScale() + */ + int NormalizationScale() const + { + return m_scale; + } + + /*! + * Sets the scale in pixels at which the local normalization functions have + * been sampled and calculated. + * + * \sa NormalizationScale() + */ + void SetNormalizationScale( int scale ) + { + m_scale = scale; + } + + /*! + * Returns the width in pixels of the normalization reference and target + * images, or -1 if this object has not been initialized with valid data. + * + * \sa ReferenceHeight(), SetReferenceDimensions() + */ + int ReferenceWidth() const + { + return m_referenceWidth; + } + + /*! + * Returns the height in pixels of the normalization reference and target + * images, or -1 if this object has not been initialized with valid data. + * + * \sa ReferenceWidth(), SetReferenceDimensions() + */ + int ReferenceHeight() const + { + return m_referenceHeight; + } + + /*! + * Sets new normalization image dimensions in pixels, \a width and + * \a height, respectively. + * + * \sa ReferenceWidth(), ReferenceHeight() + */ + void SetReferenceDimensions( int width, int height ) + { + m_referenceWidth = width; + m_referenceHeight = height; + } + + /*! + * Returns the number of channels or pixel sample planes in the image + * represented by this instance, or zero if this object has not been + * initialized with valid data. + */ + int NumberOfChannels() const + { + return m_A.NumberOfChannels(); + } + + /*! + * Returns a reference to the set of matrices of zero offset coefficients in + * the local normalization function. + * + * See the class description for detailed information on local normalization + * functions. + * + * \sa Scale(), SetLocalNormalizationParameters(), NormalizationScale() + */ + const normalization_matrices& ZeroOffset() const + { + return m_B; + } + + /*! + * Returns a reference to the set of matrices of scaling coefficients in the + * local normalization function. + * + * See the class description for detailed information on local normalization + * functions. + * + * \sa ZeroOffset(), SetLocalNormalizationParameters(), NormalizationScale() + */ + const normalization_matrices& Scale() const + { + return m_A; + } + + /*! + * Returns a reference to the vector of per-channel bias levels. Each bias + * is a constant scalar subtracted from input pixel sample values before + * applying the local normalization function. This allows to remove any + * systematic offset or additive pedestal that could be present in the data + * to be normalized. The possibility to remove a constant value also adds + * flexibility to the local normalization function. + * + * If not specified, the target bias is always zero by default. + */ + const Vector& Bias() const + { + return m_C; + } + + /*! + * Sets new local normalization function parameters. + * + * \param A Reference to an image storing the matrices of scaling + * normalization coefficients. + * + * \param B Reference to an image storing the matrices of zero + * offset normalization coefficients. + * + * \param C Reference to an optional vector of per-channel biases. + * If not specified, the bias will be set to zero for each + * channel by default. + * + * See the class description for detailed information on local normalization + * functions. + * + * This function throws an Error exception if some of the specified local + * normalization parameters are invalid or incongruent. + * + * \sa ZeroOffset(), Scale(), Bias(), SetGlobalNormalizationParameters() + */ + void SetLocalNormalizationParameters( const normalization_matrices& A, const normalization_matrices& B, const Vector& C = Vector() ) + { + if ( A.Bounds() != B.Bounds() ) + throw Error( "LocalNormalizationData::SetLocalNormalizationParameters(): Incompatible matrix dimensions." ); + if ( A.NumberOfChannels() != B.NumberOfChannels() ) + throw Error( "LocalNormalizationData::SetLocalNormalizationParameters(): Incompatible number of normalization matrices." ); + m_A = A; + m_B = B; + if ( !C.IsEmpty() ) + { + if ( C.Length() != A.NumberOfChannels() ) + throw Error( "LocalNormalizationData::SetLocalNormalizationParameters(): Incompatible bias vector length." ); + m_C = C; + } + } + + /*! + * Returns a reference to the vector of per-channel global reference + * locations (or zero-offsets). + * + * \sa GlobalTargetLocation(), GlobalScalingFactors(), + * SetGlobalNormalizationParameters() + */ + const Vector& GlobalReferenceLocation() const + { + return m_Rc; + } + + /*! + * Returns a reference to the vector of per-channel global target locations + * (or zero-offsets). + * + * \sa GlobalReferenceLocation(), GlobalScalingFactors(), + * SetGlobalNormalizationParameters() + */ + const Vector& GlobalTargetLocation() const + { + return m_Rc; + } + + /*! + * Returns a reference to the vector of per-channel global scaling factors. + * + * \sa GlobalReferenceLocation(), GlobalTargetLocation(), + * SetGlobalNormalizationParameters() + */ + const Vector& GlobalScalingFactors() const + { + return m_S; + } + + /*! + * Sets new global normalization vectors. + * + * \param Rc Reference to a vector of per-channel reference global + * locations. + * + * \param Tc Reference to a vector of per-channel target global + * locations. + * + * \param S Reference to a vector of per-channel global scaling + * factors. + * + * See the class description for detailed information on local normalization + * functions. + * + * This function throws an Error exception if some of the specified global + * normalization parameters are invalid or incongruent. + * + * \sa GlobalReferenceLocation(), GlobalTargetLocation(), + * GlobalScalingFactors(), SetLocalNormalizationParameters() + */ + void SetGlobalNormalizationParameters( const Vector& Rc, const Vector& Tc, const Vector& S ) + { + if ( m_B.IsEmpty() ) + throw Error( "LocalNormalizationData::SetGlobalNormalizationParameters(): No zero offset coefficient matrix has been defined." ); + if ( Rc.Length() != m_B.NumberOfChannels() || Tc.Length() != m_B.NumberOfChannels() || S.Length() != m_B.NumberOfChannels() ) + throw Error( "LocalNormalizationData::SetGlobalNormalizationParameters(): Incompatible vector lengths." ); + m_Rc = Rc; + m_Tc = Tc; + m_S = S; + } + + /*! + * Returns a reference to the vector of per-channel relative scale factors. + */ + const Vector& RelativeScaleFactors() const + { + return m_relScale; + } + + /*! + * Sets a new relative scale factors vector. + * + * \param Rc Reference to a vector of per-channel relative scale factors. + * + * See the class description for detailed information on local normalization + * functions. + * + * This function throws an Error exception if the specified vector is + * invalid or incongruent with normalization data. + */ + void SetRelativeScaleFactors( const Vector& s ) + { + if ( m_B.IsEmpty() ) + throw Error( "LocalNormalizationData::SetRelativeScaleFactors(): No zero offset coefficient matrix has been defined." ); + if ( s.Length() != m_B.NumberOfChannels() ) + throw Error( "LocalNormalizationData::SetRelativeScaleFactors(): Incompatible vector lengths." ); + m_relScale = s; + } + + /*! + * Initializes the internal local normalization function interpolators. + * After this initialization, operator()() can be called repeatedly to apply + * the local normalization function to pixel sample values in reference + * image coordinates. + * + * Calling this member function is not necessary when valid local + * normalization data have been loaded from an XNML file or %XML document, + * since in this case the internal interpolators are always initialized + * automatically. This function must be called, however, for newly defined + * normalization data set by calling SetReferenceDimensions() and + * SetLocalNormalizationParameters(). + * + * If this object has not been initialized with valid local normalization + * data, this member function throws an Error exception. + * + * \sa operator()() + */ + void InitInterpolations(); + + /*! + * Returns true iff valid local normalization function data have been loaded + * and the internal interpolators have been initialized. + */ + bool HasInterpolations() const + { + return !m_UA.IsEmpty() && !m_UB.IsEmpty(); + } + + /*! + * Returns a locally normalized pixel sample value. + * + * \param z Input pixel sample value (unnormalized). + * \param x Horizontal image pixel coordinate. + * \param y Vertical image pixel coordinate. + * \param c Channel index. + * + * This operator interpolates local normalization functions and applies the + * corresponding linear transformation to the input value \a z, which gives + * the return value. Note that the normalized value might be out of the + * input pixel sample range. In such case the normalized value should be + * truncated or rescaled as appropriate. + * + * For performance reasons, this operator does not check that the required + * normalization and interpolation data have been initialized; if they are + * not, calling this operator will most likely lead to a crash. + * Interpolation data are automatically initialized when a valid XNML file + * or %XML element is loaded and parsed. For newly constructed objects, make + * sure you define the required reference dimensions and normalization + * matrices. Then call InitInterpolations() before starting to call this + * operator. + */ + double operator()( double z, int x, int y, int c = 0 ) const + { + double sx = m_sx*x; + double sy = m_sy*y; + if ( likely( m_S.IsEmpty() ) ) + return m_UA[c]( sx, sy )*(z - m_C[c]) + m_UB[c]( sx, sy ); + return (m_UA[c]( sx, sy )*(z - m_C[c]) + m_UB[c]( sx, sy ) - m_Tc[c])*m_S[c] + m_Rc[c]; + } + + /*! + * Returns the UTC time this normalization data was created, or an invalid + * TimePoint instance if creation time information is not available. + */ + TimePoint CreationTime() const + { + return m_creationTime; + } + + /*! + * Clears all of the image normalization data transported by this instance, + * yielding an empty %LocalNormalizationData object. + */ + void Clear(); + + /*! + * Loads and parses a normalization data file in XNML format. + * + * \param filePath Path to an existing file that will be parsed. The file + * contents must be in %XML normalization data format + * (usually, a file with the .xnml suffix). + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified file. + * + * This function validates the data retrieved from the specified file. It + * throws an Error exception in the event of parsing errors or invalid data. + */ + void Parse( const String& filePath, bool ignoreNormalizationData = false ); + + /*! + * Parses a well-formed %XML document in XNML format. + * + * \param xml Reference to the source %XML document. This member + * function expects an %XML document in valid %XML + * normalization data format (.xnml). + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified %XML contents. + * + * This function validates the data retrieved from the specified %XML + * document. It throws an Error exception in the event of an invalid + * document or invalid data. + */ + void Parse( const XMLDocument& xml, bool ignoreNormalizationData = false ); + + /*! + * Parses an %XML element in XNML format. + * + * \param element Reference to the source %XML element. This member + * function expects an %XML document tree in valid %XML + * normalization data format (.xnml) rooted at the + * specified element. + * + * \param ignoreNormalizationData If true, local normalization data will + * be ignored and not parsed. This includes matrices of + * normalization function coefficients. Setting this + * parameter to true can be useful when the caller only + * needs to retrieve information on file paths and + * reference dimensions. + * + * All of the previous data transported by this instance will be replaced + * with new data acquired from the specified %XML contents. + * + * This function validates the data retrieved from the specified %XML + * element. It throws an Error exception in the event of invalid data. + */ + void Parse( const XMLElement& element, bool ignoreNormalizationData = false ); + + /*! + * Returns true if data compression is enabled for serializations performed + * with this object. + * + * Data compression is enabled by default for newly constructed + * %LocalNormalizationData objects. Currently the LZ4 compression codec is + * applied for serialization of local normalization matrices. + * + * \sa EnableCompression(), DisableCompression() + */ + bool IsCompressionEnabled() const + { + return m_compressionEnabled; + } + + /*! + * Enables compression of serialized local normalization data. + * + * \sa IsCompressionEnabled(), DisableCompression() + */ + void EnableCompression( bool enable = true ) + { + m_compressionEnabled = enable; + } + + /*! + * Returns a version number corresponding to the normalization data + * transported by this object. + * + * Version numbers can be used to control the use and propagation of + * normalization data generated by different versions of a normalization + * tool or process, such as the standard LocalNormalization process in + * PixInsight. The version number is zero by default, meaning that the + * version is unspecified. An appropriate version number > 0 can be set + * by calling SetVersion(), which is recommended before serializing + * normalization data to a new XNML file. When an XNML file is loaded and it + * contains a valid version number tag, it is loaded and will be returned by + * this function. Otherwise the returned value will be zero. + */ + int Version() const + { + return m_version; + } + + /*! + * Sets the normalization data version. See Version() for information on + * normalization data versions. + */ + void SetVersion( int version ) + { + m_version = version; + } + + /*! + * Disables compression of serialized local normalization data. + * + * \sa IsCompressionEnabled(), EnableCompression() + */ + void DisableCompression( bool disable = true ) + { + EnableCompression( !disable ); + } + + /*! + * Serializes the normalization data transported by this object as a new + * %XML document in XNML format. + * + * The returned XMLDocument object has been allocated dynamically. The + * caller is responsible for destroying and deallocating it as appropriate. + */ + XMLDocument* Serialize() const; + + /*! + * Serializes the normalization data transported by this object as a new + * %XML document file in XNML format (.xnml). The file will be newly created + * at the specified file \a path. + * + * \warning If a file already exists at the specified \a path, its previous + * contents will be lost after calling this function. + */ + void SerializeToFile( const String& path ) const; + +private: + + String m_referenceFilePath; // path to the normalization reference image + String m_targetFilePath; // path to the normalization target image + int m_scale = -1; // normalization scale in px + int m_referenceWidth = -1; // reference image width in px + int m_referenceHeight = -1; // reference image height in px + normalization_matrices m_A; // scaling coefficients + normalization_matrices m_B; // zero offset coefficients + Vector m_C; // input bias + matrix_interpolations m_UA; // interpolators for m_A + matrix_interpolations m_UB; // interpolators for m_B + Vector m_Rc; // global normalization, reference center + Vector m_Tc; // global normalization, target center + Vector m_S; // global normalization, scale factor + Vector m_relScale; // relative scale factor + double m_sx; // coordinate scaling factor, X axis + double m_sy; // coordinate scaling factor, Y axis + TimePoint m_creationTime; + bool m_compressionEnabled = true; + int m_version = 0; + + void ParseNormalizationMatrices( normalization_matrices&, const XMLElement& ) const; + void SerializeNormalizationMatrices( XMLElement*, const normalization_matrices& ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_LocalNormalizationData_h + +// ---------------------------------------------------------------------------- +// EOF pcl/LocalNormalizationData.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Math.h b/3rdparty/include/pcl/Math.h new file mode 100644 index 0000000..fb747fc --- /dev/null +++ b/3rdparty/include/pcl/Math.h @@ -0,0 +1,4996 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Math.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Math_h +#define __PCL_Math_h + +/// \file pcl/Math.h + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#ifdef _MSC_VER +# include // for __cpuid() +#endif + +#if defined( __x86_64__ ) || defined( _M_X64 ) || defined( __PCL_MACOSX ) +# define __PCL_HAVE_SSE2 1 +# include +#endif + +/* + * sincos() is only available as a GNU extension: + * + * http://man7.org/linux/man-pages/man3/sincos.3.html + * + * Unfortunately, it is not part of the C++ standard library because of the + * anachronic dependency on errno. + */ +#if !defined( _MSC_VER ) && !defined( __clang__ ) && defined( __GNUC__ ) +# define __PCL_HAVE_SINCOS 1 +#endif + +#ifdef __PCL_QT_INTERFACE +# include +#endif + +/* + * Number of histogram bins used by fast histogram-based median calculation + * algorithm implementations. + */ +#define __PCL_MEDIAN_HISTOGRAM_LENGTH 8192 + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup hw_identification_functions Hardware Identification Routines + */ + +/*! + * Returns an integer representing the highest set of Streaming SIMD Extensions + * instructions (SSE) supported by the running processor. This function is a + * portable wrapper to the CPUID x86 instruction. + * + * The returned value can be one of: + * + *
+ *  0 : No SSE instructions supported
+ *  1 : SSE instructions set supported
+ *  2 : SSE2 instructions set supported
+ *  3 : SSE3 instructions set supported
+ * 41 : SSE4.1 instructions set supported
+ * 42 : SSE4.2 instructions set supported
+ * 
+ * + * \ingroup hw_identification_functions + */ +inline int MaxSSEInstructionSetSupported() noexcept +{ + int32 edxFlags = 0; + int32 ecxFlags = 0; + +#ifdef _MSC_VER + int cpuInfo[ 4 ]; + __cpuid( cpuInfo, 1 ); + edxFlags = cpuInfo[3]; + ecxFlags = cpuInfo[2]; +#else + asm volatile( "mov $0x00000001, %%eax\n\t" + "cpuid\n\t" + "mov %%edx, %0\n\t" + "mov %%ecx, %1\n" + : "=r" (edxFlags), "=r" (ecxFlags) // output operands + : // input operands + : "%eax", "%ebx", "%ecx", "%edx" ); // clobbered registers +#endif + + if ( ecxFlags & (1u << 20) ) // SSE4.2 + return 42; + if ( ecxFlags & (1u << 19) ) // SSE4.1 + return 41; + if ( ecxFlags & 1u ) // SSE3 + return 3; + if ( edxFlags & (1u << 26) ) // SSE2 + return 2; + if ( edxFlags & (1u << 25) ) // SSE + return 1; + return 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup fpclassification_functions Floating Point Number Classification + */ + +#define __PCL_FLOAT_SGNMASK 0x80000000 +#define __PCL_FLOAT_EXPMASK 0x7f800000 +#define __PCL_FLOAT_SIGMASK 0x007fffff + +/*! + * Returns true iff the specified 32-bit floating point number is \e finite. + * A number is finite if it is neither NaN (Not a Number) nor positive or + * negative infinity. + * + * \ingroup fpclassification_functions + * \sa IsNaN( float ), IsInfinity( float ) + */ +inline bool IsFinite( float x ) noexcept +{ + union { float f; uint32 u; } v = { x }; + return (v.u & __PCL_FLOAT_EXPMASK) != __PCL_FLOAT_EXPMASK; +} + +/*! + * Returns true iff the specified 32-bit floating point number is \e NaN. A NaN + * (Not A Number) is a special value in the IEEE 754 standard used to represent + * an undefined or unrepresentable value, such as the result of invalid + * operations like 0/0, or real operations with complex results as the square + * root of a negative number. + * + * \ingroup fpclassification_functions + * \sa IsFinite( float ), IsInfinity( float ) + */ +inline bool IsNaN( float x ) noexcept +{ + union { float f; uint32 u; } v = { x }; + return (v.u & __PCL_FLOAT_EXPMASK) == __PCL_FLOAT_EXPMASK && + (v.u & __PCL_FLOAT_SIGMASK) != 0; +} + +/*! + * Returns a nonzero integer value if the specified 32-bit floating point + * number is an \e infinity. + * + * This function returns: + * + *
+ * +1 if \a x is positive infinity.
+ * -1 if \a x is negative infinity.
+ *  0 if \a x is either NaN or a finite value.
+ * 
+ * + * \ingroup fpclassification_functions + * \sa IsFinite( float ), IsNaN( float ) + */ +inline int IsInfinity( float x ) noexcept +{ + union { float f; uint32 u; } v = { x }; + if ( (v.u & __PCL_FLOAT_EXPMASK) == __PCL_FLOAT_EXPMASK && + (v.u & __PCL_FLOAT_SIGMASK) == 0 ) + return ((v.u & __PCL_FLOAT_SGNMASK) == 0) ? +1 : -1; + return 0; +} + +/*! + * Returns true iff the specified 32-bit floating point number is a negative + * zero. + * + * \ingroup fpclassification_functions + */ +inline bool IsNegativeZero( float x ) noexcept +{ + union { float f; uint32 u; } v = { x }; + return v.u == __PCL_FLOAT_SGNMASK; +} + +#define __PCL_DOUBLE_SGNMASK 0x80000000 +#define __PCL_DOUBLE_EXPMASK 0x7ff00000 +#define __PCL_DOUBLE_SIGMASK 0x000fffff + +/*! + * Returns true iff the specified 64-bit floating point number is \e finite. + * A number is finite if it is neither NaN (Not a Number) nor positive or + * negative infinity. + * + * \ingroup fpclassification_functions + * \sa IsNaN( double ), IsInfinity( double ) + */ +inline bool IsFinite( double x ) noexcept +{ + union { double d; uint32 u[2]; } v = { x }; + return (v.u[1] & __PCL_DOUBLE_EXPMASK) != __PCL_DOUBLE_EXPMASK; +} + +/*! + * Returns true iff the specified 64-bit floating point number is \e NaN. A NaN + * (Not A Number) is a special value in the IEEE 754 standard used to represent + * an undefined or unrepresentable value, such as the result of invalid + * operations like 0/0, or real operations with complex results as the square + * root of a negative number. + * + * \ingroup fpclassification_functions + * \sa IsFinite( double ), IsInfinity( double ) + */ +inline bool IsNaN( double x ) noexcept +{ + union { double d; uint32 u[2]; } v = { x }; + return (v.u[1] & __PCL_DOUBLE_EXPMASK) == __PCL_DOUBLE_EXPMASK && + (v.u[0] != 0 || (v.u[1] & __PCL_DOUBLE_SIGMASK) != 0); +} + +/*! + * Returns a nonzero integer value if the specified 64-bit floating point + * number is an \e infinity. + * + * This function returns: + * + *
+ * +1 if \a x is positive infinity.
+ * -1 if \a x is negative infinity.
+ *  0 if \a x is either NaN or a finite value.
+ * 
+ * + * \ingroup fpclassification_functions + * \sa IsFinite( double ), IsNaN( double ) + */ +inline int IsInfinity( double x ) noexcept +{ + union { double d; uint32 u[2]; } v = { x }; + if ( v.u[0] == 0 && + (v.u[1] & __PCL_DOUBLE_SIGMASK) == 0 && + (v.u[1] & __PCL_DOUBLE_EXPMASK) == __PCL_DOUBLE_EXPMASK ) + return ((v.u[1] & __PCL_DOUBLE_SGNMASK) == 0) ? +1 : -1; + return 0; +} + +/*! + * Returns true iff the specified 64-bit floating point number is a negative + * zero. + * + * \ingroup fpclassification_functions + */ +inline bool IsNegativeZero( double x ) noexcept +{ + union { double d; uint32 u[2]; } v = { x }; + return v.u[1] == __PCL_DOUBLE_SGNMASK && + v.u[0] == 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup mathematical_functions Mathematical Functions + */ + +/*! + * Absolute value of \a x. + * \ingroup mathematical_functions + */ +inline float Abs( float x ) noexcept +{ + return std::fabs( x ); +} + +/*! + * \ingroup mathematical_functions + */ +inline double Abs( double x ) noexcept +{ + return std::fabs( x ); +} + +/*! + * \ingroup mathematical_functions + */ +inline long double Abs( long double x ) noexcept +{ + return std::fabs( x ); +} + +/*! + * \ingroup mathematical_functions + */ +inline signed int Abs( signed int x ) noexcept +{ + return ::abs( x ); +} + +/*! + * \ingroup mathematical_functions + */ +#if defined( __PCL_MACOSX ) && defined( __clang__ ) // turn off warning due to broken cstdlib in Xcode +_Pragma("clang diagnostic push") +_Pragma("clang diagnostic ignored \"-Wabsolute-value\"") +#endif +inline signed long Abs( signed long x ) noexcept +{ + return ::abs( x ); +} +#if defined( __PCL_MACOSX ) && defined( __clang__ ) +_Pragma("clang diagnostic pop") +#endif + +/*! + * \ingroup mathematical_functions + */ +#if defined( _MSC_VER ) +inline __int64 Abs( __int64 x ) noexcept +{ + return (x < 0) ? -x : +x; +} +#elif defined( __PCL_MACOSX ) && defined( __clang__ ) +inline constexpr signed long long Abs( signed long long x ) noexcept +{ + return (x < 0) ? -x : +x; +} +#else +inline signed long long Abs( signed long long x ) noexcept +{ + return ::abs( x ); +} +#endif + +/*! + * \ingroup mathematical_functions + */ +inline signed short Abs( signed short x ) noexcept +{ + return (signed short)::abs( int( x ) ); +} + +/*! + * \ingroup mathematical_functions + */ +inline signed char Abs( signed char x ) noexcept +{ + return (signed char)::abs( int( x ) ); +} + +/*! + * \ingroup mathematical_functions + */ +inline wchar_t Abs( wchar_t x ) noexcept +{ + return (wchar_t)::abs( int( x ) ); +} + +/*! + * \ingroup mathematical_functions + */ +inline constexpr unsigned int Abs( unsigned int x ) noexcept +{ + return x; +} + +/*! + * \ingroup mathematical_functions + */ +inline constexpr unsigned long Abs( unsigned long x ) noexcept +{ + return x; +} + +/*! + * \ingroup mathematical_functions + */ +#ifdef _MSC_VER +inline unsigned __int64 Abs( unsigned __int64 x ) noexcept +{ + return x; +} +#else +inline constexpr unsigned long long Abs( unsigned long long x ) noexcept +{ + return x; +} +#endif + +/*! + * \ingroup mathematical_functions + */ +inline constexpr unsigned short Abs( unsigned short x ) noexcept +{ + return x; +} + +/*! + * \ingroup mathematical_functions + */ +inline constexpr unsigned char Abs( unsigned char x ) noexcept +{ + return x; +} + +// ---------------------------------------------------------------------------- + +/*! + * The pi constant: 3.141592... + * \ingroup mathematical_functions + */ +inline constexpr long double Pi() noexcept +{ + return (long double)( 0.31415926535897932384626433832795029e+01L ); +} + +/*! + * Twice the pi constant: 0.6283185... + * \ingroup mathematical_functions + */ +inline constexpr long double TwoPi() noexcept +{ + return (long double)( 0.62831853071795864769252867665590058e+01L ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Merges a complex angle given by degrees and arcminutes into single degrees. + * \ingroup mathematical_functions + */ +template inline constexpr T Angle( int d, T m ) noexcept +{ + return d + m/60; +} + +/*! + * Merges a complex angle given by degrees, arcminutes and arcseconds into + * single degrees. + * \ingroup mathematical_functions + */ +template inline constexpr T Angle( int d, int m, T s ) noexcept +{ + return Angle( d, m + s/60 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse cosine function (arccosine). + * \ingroup mathematical_functions + */ +template inline constexpr T ArcCos( T x ) noexcept +{ + PCL_PRECONDITION( T( -1 ) <= x && x <= T( 1 ) ) + return std::acos( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse sine function (arcsine). + * \ingroup mathematical_functions + */ +template inline constexpr T ArcSin( T x ) noexcept +{ + PCL_PRECONDITION( T( -1 ) <= x && x <= T( 1 ) ) + return std::asin( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse tangent function (arctangent). + * \ingroup mathematical_functions + */ +template inline constexpr T ArcTan( T x ) noexcept +{ + return std::atan( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Arctangent of y/x, result in the proper quadrant. + * \ingroup mathematical_functions + */ +template inline constexpr T ArcTan( T y, T x ) noexcept +{ + return std::atan2( y, x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Arctangent of y/x, proper quadrant, result in the interval [0,2pi). + * \ingroup mathematical_functions + */ +template inline T ArcTan2Pi( T y, T x ) noexcept +{ + T r = ArcTan( y, x ); + if ( r < 0 ) + r = static_cast( r + TwoPi() ); + return r; +} + +// ---------------------------------------------------------------------------- + +/*! + * The ceil function: lowest integer >= x. + * \ingroup mathematical_functions + */ +template inline constexpr T Ceil( T x ) noexcept +{ + return std::ceil( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Cosine function. + * \ingroup mathematical_functions + */ +template inline constexpr T Cos( T x ) noexcept +{ + return std::cos( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Hyperbolic Cosine function. + * \ingroup mathematical_functions + */ +template inline constexpr T Cosh( T x ) noexcept +{ + return std::cosh( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Cotangent of x, equal to Cos(x)/Sin(x) or 1/Tan(x). + * \ingroup mathematical_functions + */ +template inline constexpr T Cotan( T x ) noexcept +{ + return T( 1 )/std::tan( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from radians to degrees. + * \ingroup mathematical_functions + */ +template inline constexpr T Deg( T x ) noexcept +{ + return static_cast( 0.572957795130823208767981548141051700441964e+02L * x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * The exponential function e**x. + * \ingroup mathematical_functions + */ +template inline constexpr T Exp( T x ) noexcept +{ + return std::exp( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * The floor function: highest integer <= x. + * \ingroup mathematical_functions + */ +template inline constexpr T Floor( T x ) noexcept +{ + return std::floor( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Fractional part of x. + * The returned value is within (-1,+1), and has the same sign as x. + * \ingroup mathematical_functions + */ +template inline constexpr T Frac( T x ) noexcept +{ + return std::modf( x, &x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Calculates base-2 mantissa and exponent. + * The arguments \a m and \a p receive the values of the base-2 mantissa and + * exponent, respectively, such that: 0.5 <= m < 1.0, x = m * 2**p + * \ingroup mathematical_functions + */ +template inline void Frexp( T x, T& m, int& p ) noexcept +{ + m = std::frexp( x, &p ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Haversine function: + * + * Hav( x ) = (1 - Cos( x ))/2 + * + * The haversine is useful to work with tiny angles. + * + * \ingroup mathematical_functions + */ +template inline constexpr T Hav( T x ) noexcept +{ + return (1 - Cos( x ))/2; +} + +// ---------------------------------------------------------------------------- + +/*! + * Calculates m * 2**p. + * \ingroup mathematical_functions + */ +template inline constexpr T Ldexp( T m, int p ) noexcept +{ + return std::ldexp( m, p ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Natural (base e) logarithm of \a x. + * \ingroup mathematical_functions + */ +template inline constexpr T Ln( T x ) noexcept +{ + PCL_PRECONDITION( x >= 0 ) + return std::log( x ); +} + +// ---------------------------------------------------------------------------- + +struct PCL_CLASS FactorialCache +{ + constexpr static int s_cacheSize = 127; + static const double s_lut[ s_cacheSize+1 ]; +}; + +/*! + * The factorial of \a n ≥ 0. + * + * A static lookup table is used to speed up for \a n <= 127. + * + * \ingroup mathematical_functions + */ +inline double Factorial( int n ) noexcept +{ + PCL_PRECONDITION( n >= 0 ) + if ( n <= FactorialCache::s_cacheSize ) + return FactorialCache::s_lut[n]; + double x = FactorialCache::s_lut[FactorialCache::s_cacheSize]; + for ( int m = FactorialCache::s_cacheSize; ++m <= n; ) + x *= m; + return x; +} + +/*! + * The natural logarithm of the factorial of \a n ≥ 0. + * + * For \a n <= 127 computes the natural logarithm of the factorial function + * directly. For \a n > 127 computes a series approximation, so that the + * function won't overflow even for very large arguments. + * + * \ingroup mathematical_functions + */ +inline double LnFactorial( int n ) noexcept +{ + PCL_PRECONDITION( n >= 0 ) + if ( n <= FactorialCache::s_cacheSize ) + return Ln( FactorialCache::s_lut[n] ); + double x = n + 1; +// return (x - 0.5)*Ln( x ) - x + 0.5*Ln( TwoPi() ) + 1/12/x - 1/(360*x*x*x); + return (x - 0.5)*Ln( x ) - x + 0.91893853320467267 + 1/12/x - 1/(360*x*x*x); +} + +/*! + * \class Fact + * \brief Factorial function. + * + * We use a static lookup table to speed up for \a n <= 127. + * + * Example of use: + * + * \code double factorialOfEight = Fact()( 8 ); // = 40320 \endcode + * + * The implementation of this class is thread-safe. + * + * \deprecated This class is deprecated and subject to removal in a future + * version of PCL. For newly produced code, use the pcl::Factorial() and + * pcl::LnFactorial() functions instead. + * + * \ingroup mathematical_functions + */ +template struct PCL_CLASS Fact : public FactorialCache +{ + /*! + * Returns the factorial of \a n ≥ 0. + */ + T operator()( int n ) const noexcept + { + PCL_PRECONDITION( n >= 0 ) + if ( n <= s_cacheSize ) + return T( s_lut[n] ); + double x = s_lut[s_cacheSize]; + for ( int m = s_cacheSize; ++m <= n; ) + x *= m; + return T( x ); + } + + /*! + * Returns the natural logarithm of the factorial of \a n ≥ 0. For + * \a n <= 127 computes the natural logarithm of the factorial function + * directly. For \a n > 127 computes a series approximation, so that the + * function won't overflow even for very large arguments. + */ + T Ln( int n ) const noexcept + { + PCL_PRECONDITION( n >= 0 ) + if ( n <= s_cacheSize ) + return T( pcl::Ln( s_lut[n] ) ); + double x = n + 1; +// return T( (x - 0.5)*pcl::Ln( x ) - x + 0.5*pcl::Ln( TwoPi() ) + 1/12/x - 1/(360*x*x*x) ); + return T( (x - 0.5)*pcl::Ln( x ) - x + 0.91893853320467267 + 1/12/x - 1/(360*x*x*x) ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * Natural (base e) logarithm of two. + * \ingroup mathematical_functions + */ +inline constexpr long double Ln2() noexcept +{ + return (long double)( 0.6931471805599453094172321214581766e+00L ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base 10 Logarithm of x. + * \ingroup mathematical_functions + */ +template inline constexpr T Log( T x ) noexcept +{ + PCL_PRECONDITION( x >= 0 ) + return std::log10( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base 10 Logarithm of two. + * \ingroup mathematical_functions + */ +inline constexpr long double Log2() noexcept +{ + // Use the relation: + // log10(2) = ln(2)/ln(10) + return (long double)( 0.3010299956639811952137388947244930416265e+00L ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base 2 Logarithm of x. + * \ingroup mathematical_functions + */ +template inline constexpr T Log2( T x ) noexcept +{ + // Use the relation: + // log2(x) = ln(x)/ln(2) + PCL_PRECONDITION( x >= 0 ) + return std::log( x )/Ln2(); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base 2 Logarithm of e. + * \ingroup mathematical_functions + */ +inline constexpr long double Log2e() noexcept +{ + // Use the relation: + // log2(e) = 1/ln(2) + return (long double)( 0.14426950408889634073599246810018920709799e+01L ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base 2 Logarithm of ten. + * \ingroup mathematical_functions + */ +inline constexpr long double Log2T() noexcept +{ + // Use the relation: + // log2(10) = 1/log(2) + return (long double)( 0.33219280948873623478703194294893900118996e+01L ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Base \a n logarithm of \a x. + * \ingroup mathematical_functions + */ +template inline constexpr T LogN( T n, T x ) noexcept +{ + PCL_PRECONDITION( x >= 0 ) + return std::log( x )/std::log( n ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Remainder of x/y. + * \ingroup mathematical_functions + */ +template inline constexpr T Mod( T x, T y ) noexcept +{ + return std::fmod( x, y ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Horner's algorithm to evaluate the polynomial function with the specified + * array \a c of \a n + 1 coefficients: + * + *
+ * y = c[0] + c[1]*x + c[2]*x**2 + ... + c[n]*x**n
+ * 
+ * + * The array \a c of coefficients must provide contiguous storage for at least + * \a n + 1 values of type T. The degree \a n must be >= 0; otherwise this + * function invokes undefined behavior. + * + * \ingroup mathematical_functions + */ +template inline T Poly( T x, C c, int n ) noexcept +{ + PCL_PRECONDITION( n >= 0 ) + T y; + for ( c += n, y = *c; n > 0; --n ) + { + y *= x; + y += *--c; + } + return y; +} + +/*! + * Horner's algorithm to evaluate the polynomial function: + * + *
+ * y = c[0] + c[1]*x + c[2]*x**2 + ... + c[n]*x**n
+ * 
+ * + * The specified coefficients initializer list \a c must not be empty; + * otherwise this function invokes undefined behavior. + * + * \ingroup mathematical_functions + */ +template inline T Poly( T x, std::initializer_list c ) noexcept +{ + PCL_PRECONDITION( c.size() > 0 ) + return Poly( x, c.begin(), int( c.size() )-1 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Sign function: + * + *
+ * -1 if x ≤ 0
+ *  0 if x = 0
+ * +1 if x ≥ 0
+ * 
+ * + * \ingroup mathematical_functions + */ +template inline constexpr int Sign( T x ) noexcept +{ + return (x < 0) ? -1 : ((x > 0) ? +1 : 0); +} + +// ---------------------------------------------------------------------------- + +/*! + * Sign character: + * + *
+ * '-' if x ≤ 0
+ * ' ' if x = 0
+ * '+' if x ≥ 0
+ * 
+ * + * \ingroup mathematical_functions + */ +template inline constexpr char SignChar( T x ) noexcept +{ + return (x < 0) ? '-' : ((x > 0) ? '+' : ' '); +} + +// ---------------------------------------------------------------------------- + +/*! + * Sine function + * \ingroup mathematical_functions + */ +template inline constexpr T Sin( T x ) noexcept +{ + return std::sin( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Hyperbolic Sine function. + * \ingroup mathematical_functions + */ +template inline constexpr T Sinh( T x ) noexcept +{ + return std::sinh( x ); +} + +// ---------------------------------------------------------------------------- + +#ifdef __PCL_HAVE_SINCOS + +inline void __pcl_sincos__( float x, float& sx, float& cx ) noexcept +{ + ::sincosf( x, &sx, &cx ); +} + +inline void __pcl_sincos__( double x, double& sx, double& cx ) noexcept +{ + ::sincos( x, &sx, &cx ); +} + +inline void __pcl_sincos__( long double x, long double& sx, long double& cx ) noexcept +{ + ::sincosl( x, &sx, &cx ); +} + +#endif + +/*! + * Sine and cosine of \a x. + * + * The arguments \a sx and \a cx will receive, respectively, the values of the + * sine and cosine of x. + * + * If supported by the underlying standard math library, this function is + * roughly twice as fast as calling Sin() and Cos() separately. For code that + * spend a significant amount of time calculating sines and cosines, this + * optimization is critical. + * + * \ingroup mathematical_functions + */ +template inline void SinCos( T x, T& sx, T& cx ) noexcept +{ +#ifdef __PCL_HAVE_SINCOS + __pcl_sincos__( x, sx, cx ); +#else + sx = std::sin( x ); + cx = std::cos( x ); +#endif +} + +// ---------------------------------------------------------------------------- + +/*! + * Integer and fractional parts of \a x. + * + * The arguments \a i and \a f receive, respectively, the integer (truncated) + * part and the fractional part of \a x. It holds that \a x = \a i + \a f, i.e. + * both \a i and \a f have the same sign as \a x. + * + * \ingroup mathematical_functions + */ +template inline void Split( T x, T& i, T& f ) noexcept +{ + f = std::modf( x, &i ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Square root function. + * \ingroup mathematical_functions + */ +template inline constexpr T Sqrt( T x ) noexcept +{ + return sqrt( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Tangent function. + * \ingroup mathematical_functions + */ +template inline constexpr T Tan( T x ) noexcept +{ + return std::tan( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Hyperbolic Tangent function. + * \ingroup mathematical_functions + */ +template inline constexpr T Tanh( T x ) noexcept +{ + return std::tanh( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Truncated integer part of \a x. + * \ingroup mathematical_functions + */ +template inline T Trunc( T x ) noexcept +{ + (void)std::modf( x, &x ); + return x; +} + +// ---------------------------------------------------------------------------- + +#ifdef __PCL_HAVE_SSE2 + +inline int __pcl_trunci__( float x ) noexcept +{ + return _mm_cvtt_ss2si( _mm_load_ss( &x ) ); +} + +inline int __pcl_trunci__( double x ) noexcept +{ + return _mm_cvttsd_si32( _mm_load_sd( &x ) ); +} + +inline int __pcl_trunci__( long double x ) noexcept +{ + return int( x ); +} + +#endif + +/*! + * TruncInt function: Truncated integer part of \a x as a 32-bit signed + * integer. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +template inline int TruncInt( T x ) noexcept +{ + PCL_PRECONDITION( x >= int_min && x <= int_max ) +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + return int( x ); +#else +# ifdef __PCL_HAVE_SSE2 + return __pcl_trunci__( x ); +# else + return int( x ); +# endif +#endif +} + +/*! + * TruncI function: Truncated integer part of \a x as a 32-bit signed integer. + * to a 32-bit signed integer. + * + * \deprecated Use TruncInt() in newly produced code. + * + * \ingroup mathematical_functions + */ +template inline int TruncI( T x ) noexcept +{ + return TruncInt( x ); +} + +#define TruncInt32( x ) TruncInt( x ) +#define TruncI32( x ) TruncInt( x ) + +// ---------------------------------------------------------------------------- + +#ifdef __PCL_HAVE_SSE2 + +#if defined( __x86_64__ ) || defined( _M_X64 ) + +inline int64 __pcl_trunci64__( float x ) noexcept +{ + return _mm_cvttss_si64( _mm_load_ss( &x ) ); +} + +inline int64 __pcl_trunci64__( double x ) noexcept +{ + return _mm_cvttsd_si64( _mm_load_sd( &x ) ); +} + +#else + +inline int64 __pcl_trunci64__( float x ) noexcept +{ + return int64( _mm_cvtt_ss2si( _mm_load_ss( &x ) ) ); +} + +inline int64 __pcl_trunci64__( double x ) noexcept +{ + return int64( x ); +} + +#endif + +inline int64 __pcl_trunci64__( long double x ) noexcept +{ + return int64( x ); +} + +#endif // __PCL_HAVE_SSE2 + +/*! + * TruncInt64 function: Truncated integer part of \a x as a 64-bit signed + * integer. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +template inline int64 TruncInt64( T x ) noexcept +{ + PCL_PRECONDITION( x >= int64_min && x <= int64_max ) +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + return int64( Trunc( x ) ); +#else +# ifdef __PCL_HAVE_SSE2 + return __pcl_trunci64__( x ); +# else + return int64( Trunc( x ) ); +# endif +#endif +} + +/*! + * TruncI64 function: Truncated integer part of \a x as a 64-bit signed + * integer. + * + * \deprecated Use TruncInt64() in newly produced code. + * + * \ingroup mathematical_functions + */ +template inline int64 TruncI64( T x ) noexcept +{ + return TruncInt64( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * General power function: \a x raised to \a y. + * + * When you know some of the arguments in advance, faster alternatives are: + * + * \li Use Pow10I\()( y ) when x == 10 and y is an integer + * \li Use PowI( x, y ) when x != 10 and y is an integer + * \li Use Pow10( y ) when x == 10 and y is not an integer + * + * Otherwise, you can also use: Pow2( y*Log2( x ) ) + * + * \ingroup mathematical_functions + */ +template inline constexpr T Pow( T x, T y ) noexcept +{ + PCL_PRECONDITION( y < T( int_max ) ) + return std::pow( x, y ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Pow10I + * \brief Exponential function 10**n, \a n being a signed integer. + * + * Example of use: + * + * \code double x = Pow10I()( 5 ); // x = 10^5 \endcode + * + * \ingroup mathematical_functions + */ +template struct PCL_CLASS Pow10I +{ + T operator ()( int n ) const noexcept + { + // Use fast table lookups and squaring up to |n| <= 50. + static const T lut[] = + { +#define ___( x ) static_cast( x ) + ___( 1.0e+00 ), ___( 1.0e+01 ), ___( 1.0e+02 ), ___( 1.0e+03 ), ___( 1.0e+04 ), + ___( 1.0e+05 ), ___( 1.0e+06 ), ___( 1.0e+07 ), ___( 1.0e+08 ), ___( 1.0e+09 ), + ___( 1.0e+10 ), ___( 1.0e+11 ), ___( 1.0e+12 ), ___( 1.0e+13 ), ___( 1.0e+14 ), + ___( 1.0e+15 ), ___( 1.0e+16 ), ___( 1.0e+17 ), ___( 1.0e+18 ), ___( 1.0e+19 ), + ___( 1.0e+20 ), ___( 1.0e+21 ), ___( 1.0e+22 ), ___( 1.0e+23 ), ___( 1.0e+24 ), + ___( 1.0e+25 ), ___( 1.0e+26 ), ___( 1.0e+27 ), ___( 1.0e+28 ), ___( 1.0e+29 ), + ___( 1.0e+30 ), ___( 1.0e+31 ), ___( 1.0e+32 ), ___( 1.0e+33 ), ___( 1.0e+34 ), + ___( 1.0e+35 ), ___( 1.0e+36 ), ___( 1.0e+37 ), ___( 1.0e+38 ), ___( 1.0e+39 ), + ___( 1.0e+40 ), ___( 1.0e+41 ), ___( 1.0e+42 ), ___( 1.0e+43 ), ___( 1.0e+44 ), + ___( 1.0e+45 ), ___( 1.0e+46 ), ___( 1.0e+47 ), ___( 1.0e+48 ), ___( 1.0e+49 ) +#undef ___ + }; + static const int N = ItemsInArray( lut ); + int i = ::abs( n ); + double x; + if ( i < N ) + x = lut[i]; + else + { + x = lut[N-1]; + while ( (i -= N-1) >= N ) + x *= x; + if ( i != 0 ) + x *= lut[i]; + } + return T( (n >= 0) ? x : 1/x ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * The exponential function 10**x. + * \ingroup mathematical_functions + */ +template inline T Pow10( T x ) noexcept +{ + int i = TruncInt( x ); + return (i == x) ? Pow10I()( i ) : T( std::pow( 10, x ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Bitwise rotate left function: Rotates \a x to the left by \a n bits. + * + * The template argument T must be an unsigned arithmetic type (uint8, uint16, + * uint32 or uint64). The bit count \a n must be smaller than the number of + * bits required to store an instance of T; for example, if T is uint32, \a n + * must be in the range [0,31]. + * + * \ingroup mathematical_functions + */ +template inline T RotL( T x, uint32 n ) noexcept +{ + static_assert( std::is_unsigned::value, + "RotL() can only be used for unsigned integer scalar types" ); + const uint8 mask = 8*sizeof( x ) - 1; + const uint8 r = uint8( n & mask ); + return (x << r) | (x >> ((-r) & mask)); + // Or equivalently, but less optimized: + //return (x << r) | (x >> (1+mask-r)); +} + +/*! + * Bitwise rotate right function: Rotates \a x to the right by \a n bits. + * + * The template argument T must be an unsigned arithmetic type (uint8, uint16, + * uint32 or uint64). The bit count \a n must be smaller than the number of + * bits required to store an instance of T; for example, if T is uint32, \a n + * must be in the range [0,31]. + * + * \ingroup mathematical_functions + */ +template inline T RotR( T x, uint32 n ) noexcept +{ + static_assert( std::is_unsigned::value, + "RotR() can only be used for unsigned integer scalar types" ); + const uint8 mask = 8*sizeof( x ) - 1; + const uint8 r = uint8( n & mask ); + return (x >> r) | (x << ((-r) & mask)); + // Or equivalently, but less optimized: + //return (x >> r) | (x << (1+mask-r)); +} + +// ---------------------------------------------------------------------------- + +/*! + * Round function: x rounded to the nearest integer (double precision version). + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +inline double Round( double x ) noexcept +{ +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + + return floor( x + 0.5 ); + +#else + +# ifdef _MSC_VER +# ifdef _M_X64 + return double( _mm_cvtsd_si64( _mm_load_sd( &x ) ) ); +# else + __asm fld x + __asm frndint +# endif +# else + double r; + asm volatile( "frndint\n": "=t" (r) : "0" (x) ); + return r; +# endif + +#endif +} + +/*! + * Round function: x rounded to the nearest integer (single precision version). + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +inline float Round( float x ) noexcept +{ +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + + return floorf( x + 0.5F ); + +#else + +# ifdef _MSC_VER +# ifdef _M_X64 + return float( _mm_cvtss_si32( _mm_load_ss( &x ) ) ); +# else + __asm fld x + __asm frndint +# endif +# else + float r; + asm volatile( "frndint\n": "=t" (r) : "0" (x) ); + return r; +# endif + +#endif +} + +/*! + * Round function: x rounded to the nearest integer (long double version). + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +inline long double Round( long double x ) noexcept +{ +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + + return floorl( x + 0.5L ); + +#else + +# ifdef _MSC_VER +# ifdef _M_X64 + double _x = x; + return (long double)_mm_cvtsd_si64( _mm_load_sd( &_x ) ); +# else + __asm fld x + __asm frndint +# endif +# else + long double r; + asm volatile( "frndint\n": "=t" (r) : "0" (x) ); + return r; +# endif + +#endif +} + +// ---------------------------------------------------------------------------- + +/*! + * RoundInt function: Rounds \a x to the nearest integer and converts the + * result to a 32-bit signed integer. + * + * This function follows the Banker's rounding rule: a perfect half is always + * rounded to the nearest even digit. Some examples: + * + *
+ * RoundInt( 0.5 ) -> 0
+ * RoundInt( 1.5 ) -> 2
+ * RoundInt( 2.5 ) -> 2
+ * RoundInt( 3.5 ) -> 4
+ * 
+ * + * By contrast, arithmetic rounding rounds a perfect half to the nearest digit, + * either odd or even. For example: + * + *
+ * RoundIntArithmetic( 0.5 ) -> 1
+ * RoundIntArithmetic( 1.5 ) -> 2
+ * RoundIntArithmetic( 2.5 ) -> 3
+ * RoundIntArithmetic( 3.5 ) -> 4
+ * 
+ * + * Banker's rounding (also known as Gaussian rounding) is statistically more + * accurate than the usual arithmetic rounding, but it causes aliasing problems + * in some specific algorithms that depend critically on uniform rounding, such + * as nearest neighbor upsampling. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \sa RoundIntArithmetic(), RoundIntBanker() + * + * \ingroup mathematical_functions + */ +template inline int RoundInt( T x ) noexcept +{ + PCL_PRECONDITION( x >= int_min && x <= int_max ) + +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + + return int( Round( x ) ); + +#else + + volatile union { double d; int32 i; } v = { x + 6755399441055744.0 }; + return v.i; // ### NB: Assuming little-endian architecture. + +/* + ### Deprecated code - The above code based on magic numbers is faster and + more portable across platforms and compilers. + + // Default FPU rounding mode assumed to be nearest integer. + int r; + +# ifdef _MSC_VER + __asm fld x + __asm fistp dword ptr r +# else + asm volatile( "fistpl %0\n" : "=m" (r) : "t" (x) : "st" ); +# endif + + return r; +*/ + +#endif +} + +/*! + * RoundI function: Rounds \a x to the nearest integer and converts the result + * to a 32-bit signed integer. + * + * \deprecated Use RoundInt() in newly produced code. + * + * \ingroup mathematical_functions + */ +template inline int RoundI( T x ) noexcept +{ + return RoundInt( x ); +} + +/*! + * Rounds \a x to the nearest integer using the Banker's rounding rule, and + * converts the result to a 32-bit signed integer. + * + * This function is a convenience synonym for RoundInt(). + * + * \ingroup mathematical_functions + */ +template inline int RoundIntBanker( T x ) noexcept +{ + return RoundInt( x ); +} + +/*! + * Rounds \a x to the nearest integer using the arithmetic rounding rule, and + * converts the result to a 32-bit signed integer. + * + * Arithmetic rounding rounds a perfect half to the nearest digit, either odd + * or even. For example: + * + *
+ * RoundIntArithmetic( 0.5 ) -> 1
+ * RoundIntArithmetic( 1.5 ) -> 2
+ * RoundIntArithmetic( 2.5 ) -> 3
+ * RoundIntArithmetic( 3.5 ) -> 4
+ * 
+ * + * See the RoundInt() function for more information on rounding rules. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \sa RoundInt(), RoundIntBanker() + * + * \ingroup mathematical_functions + */ +template inline int RoundIntArithmetic( T x ) noexcept +{ + PCL_PRECONDITION( x >= int_min && x <= int_max ) + + int i = TruncInt( x ); + if ( i < 0 ) + { + if ( x - i <= T( -0.5 ) ) + return i-1; + } + else + { + if ( x - i >= T( +0.5 ) ) + return i+1; + } + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * RoundInt64 function: Rounds \a x to the nearest integer and converts the + * result to a 64-bit signed integer. + * + * Since the default IEEE 754 rounding mode follows Banker's rounding rule, + * this is what you should expect when calling this function. See the + * documentation for RoundInt() for more information on rounding modes. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \ingroup mathematical_functions + */ +inline int64 RoundInt64( double x ) noexcept +{ +#ifdef __PCL_NO_PERFORMANCE_CRITICAL_MATH_ROUTINES + + return int64( Round( x ) ); + +#else + + // ### N.B.: Default FPU rounding mode assumed to be nearest integer. + +# ifdef _MSC_VER +# ifdef _M_X64 + return _mm_cvtsd_si64( _mm_load_sd( &x ) ); +# else + int64 r; + __asm fld x + __asm fistp qword ptr r + return r; +# endif +# else + int64 r; + asm volatile( "fistpll %0\n" : "=m" (r) : "t" (x) : "st" ); + return r; +# endif + +#endif +} + +/*! + * RoundI64 function: Rounds \a x to the nearest integer and converts the + * result to a 64-bit signed integer. + * + * \deprecated Use RoundInt64() in newly produced code. + */ +inline int64 RoundI64( double x ) noexcept +{ + return RoundInt64( x ); +} + +/*! + * Rounds \a x to the nearest integer using the arithmetic rounding rule, and + * converts the result to a 64-bit signed integer. + * + * Arithmetic rounding rounds a perfect half to the nearest digit, either odd + * or even. For example: + * + *
+ * RoundIntArithmetic( 0.5 ) -> 1
+ * RoundIntArithmetic( 1.5 ) -> 2
+ * RoundIntArithmetic( 2.5 ) -> 3
+ * RoundIntArithmetic( 3.5 ) -> 4
+ * 
+ * + * See the RoundInt() function for more information on rounding rules. + * + * \note This is a performance-critical routine. It has been implemented using + * high-performance, low-level techniques that may include inline assembly code + * and/or compiler intrinsic functions. + * + * \sa RoundInt(), RoundIntBanker() + * + * \ingroup mathematical_functions + */ +inline int64 RoundInt64Arithmetic( double x ) noexcept +{ + int64 i = TruncInt64( x ); + if ( i < 0 ) + { + if ( x - i <= -0.5 ) + return i-1; + } + else + { + if ( x - i >= +0.5 ) + return i+1; + } + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * General rounding function: \a x rounded to \a n fractional digits. + * \ingroup mathematical_functions + */ +template inline T Round( T x, int n ) noexcept +{ + PCL_PRECONDITION( n >= 0 ) + T p = Pow10I()( n ); return Round( p*x )/p; +} + +// ---------------------------------------------------------------------------- + +/*! + * The exponential function 2**x. + * \ingroup mathematical_functions + */ +template inline constexpr T Pow2( T x ) noexcept +{ + // Use the relation: + // 2**x = e**(x*ln(2)) + return Exp( x*Ln2() ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Pow2I + * \brief Exponential function 2**n, \a n being a signed integer. + * + * Example of use: + * + * \code float x = Pow2I()( -2 ); // x = 1/4 \endcode + * + * \ingroup mathematical_functions + */ +template struct PCL_CLASS Pow2I +{ + T operator ()( int n ) const noexcept + { + // We shift left a single bit in 31-bit chunks. + int i = ::abs( n ), p; + double x = uint32( 1 ) << (p = Min( i, 31 )); + while ( (i -= p) != 0 ) + x *= uint32( 1 ) << (p = Min( i, 31 )); + return T( (n >= 0) ? x : 1/x ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * The exponential function x**n, where \a n is a signed integer. + * \ingroup mathematical_functions + */ +template inline T PowI( T x, int n ) noexcept +{ + if ( n == 0 ) + return T( 1 ); + + T r = x; + int i = ::abs( n ); + if ( i > 1 ) + { + do + r *= r; + while ( (i >>= 1) > 1 ); + if ( n & 1 ) + r *= x; + } + return (n > 0) ? r : T( 1/r ); +} + +/*! + * Returns \a x raised to the 4th power. + * \ingroup mathematical_functions + */ +template inline T PowI4( T x ) noexcept +{ + x *= x; return x*x; +} + +/*! + * Returns \a x raised to the 6th power. + * \ingroup mathematical_functions + */ +template inline T PowI6( T x ) noexcept +{ + x *= x*x; return x*x; +} + +/*! + * Returns \a x raised to the 8th power. + * \ingroup mathematical_functions + */ +template inline T PowI8( T x ) noexcept +{ + x *= x*x*x; return x*x; +} + +/*! + * Returns \a x raised to the 10th power. + * \ingroup mathematical_functions + */ +template inline T PowI10( T x ) noexcept +{ + x *= x*x*x*x; return x*x; +} + +/*! + * Returns \a x raised to the 12th power. + * \ingroup mathematical_functions + */ +template inline T PowI12( T x ) noexcept +{ + x *= x*x*x*x*x; return x*x; +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse hyperbolic sine function. + * + * ArcSinh( x ) = Ln( x + Sqrt( 1 + x**2 ) ) + * + * \ingroup mathematical_functions + */ +template inline constexpr T ArcSinh( T x ) noexcept +{ +#ifndef __PCL_NO_STD_INV_HYP_TRIG_FUNCTIONS + return std::asinh( x ); +#else + return Ln( x + Sqrt( 1 + x*x ) ); +#endif +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse hyperbolic cosine function. + * + * ArcCosh( x ) = 2*Ln( Sqrt( (x + 1)/2 ) + Sqrt( (x - 1)/2 ) ) + * + * \ingroup mathematical_functions + */ +template inline constexpr T ArcCosh( T x ) noexcept +{ +#ifndef __PCL_NO_STD_INV_HYP_TRIG_FUNCTIONS + return std::acosh( x ); +#else + return 2*Ln( Sqrt( (x + 1)/2 ) + Sqrt( (x - 1)/2 ) ); +#endif +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse hyperbolic tangent function. + * + * ArcTanh( x ) = (Ln( 1 + x ) - Ln( 1 - x ))/2 + * + * \ingroup mathematical_functions + */ +template inline constexpr T ArcTanh( T x ) noexcept +{ +#ifndef __PCL_NO_STD_INV_HYP_TRIG_FUNCTIONS + return std::atanh( x ); +#else + return (Ln( 1 + x ) - Ln( 1 - x ))/2; +#endif +} + +// ---------------------------------------------------------------------------- + +/*! + * Inverse haversine (archaversine) function: + * + * ArcHav( x ) = 2*ArcSin( Sqrt( x ) ) + * + * The haversine is useful to work with tiny angles. + * + * \ingroup mathematical_functions + */ +template inline constexpr T ArcHav( T x ) noexcept +{ + return 2*ArcSin( Sqrt( x ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from degrees to radians. + * \ingroup mathematical_functions + */ +template inline constexpr T Rad( T x ) noexcept +{ + return static_cast( 0.174532925199432957692369076848861272222e-01L * x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from radians to arcminutes. + * \ingroup mathematical_functions + */ +template inline constexpr T RadMin( T x ) noexcept +{ + return Deg( x )*60; +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from radians to arcseconds. + * \ingroup mathematical_functions + */ +template inline constexpr T RadSec( T x ) noexcept +{ + return Deg( x )*3600; +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from arcminutes to radians. + * \ingroup mathematical_functions + */ +template inline constexpr T MinRad( T x ) noexcept +{ + return Rad( x/60 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from arcseconds to radians. + * \ingroup mathematical_functions + */ +template inline constexpr T SecRad( T x ) noexcept +{ + return Rad( x/3600 ); +} + +/*! + * Conversion from arcseconds to radians (a synonym for SecRad()). + * \ingroup mathematical_functions + */ +template inline constexpr T AsRad( T x ) noexcept +{ + return SecRad( x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from milliarcseconds (mas) to radians. + * \ingroup mathematical_functions + */ +template inline constexpr T MasRad( T x ) noexcept +{ + return Rad( x/3600000 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion from microarcseconds (uas) to radians. + * \ingroup mathematical_functions + */ +template inline constexpr T UasRad( T x ) noexcept +{ + return Rad( x/3600000000 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * An angle in radians reduced to the [-pi,+pi] range. + * \ingroup mathematical_functions + */ +template inline constexpr T ModPi( T x ) noexcept +{ + x = Mod( x + static_cast( Pi() ), static_cast( TwoPi() ) ) - static_cast( Pi() ); + return (x < -static_cast( Pi() )) ? x + static_cast( TwoPi() ) : x; +} + +// ---------------------------------------------------------------------------- + +/*! + * An angle in radians reduced to the (-2pi,+2pi) range, that is, the remainder + * of x/(2*pi). + * \ingroup mathematical_functions + */ +template inline constexpr T Mod2Pi( T x ) noexcept +{ + return Mod( x, static_cast( TwoPi() ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * An angle in radians normalized to the [0,2pi) range. + * \ingroup mathematical_functions + */ +template inline constexpr T Norm2Pi( T x ) noexcept +{ + return ((x = Mod2Pi( x )) < 0) ? x + static_cast( TwoPi() ) : x; +} + +// ---------------------------------------------------------------------------- + +/*! + * Rotates a point on the plane. + * + * \param[out] x,y %Point coordinates. On output, these variables will + * receive the corresponding rotated coordinates. + * + * \param sa, ca Sine and cosine of the rotation angle. + * + * \param xc,yc Coordinates of the center of rotation. + * + * \ingroup mathematical_functions + */ +template +inline void Rotate( T& x, T& y, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + T1 dx = T1( x ) - T1( xc ); + T1 dy = T1( y ) - T1( yc ); + x = T( T1( xc ) + ca*dx - sa*dy ); + y = T( T1( yc ) + sa*dx + ca*dy ); +} + +/*! + * Rotates a point on the plane. + * + * This is a template instantiation of Rotate( T&, T&, T1, T1, T2, T2 ) for + * the \c int type. + * + * Rotated coordinates are rounded to the nearest integers. + * + * \ingroup mathematical_functions + */ +template +inline void Rotate( int& x, int& y, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + T1 dx = T1( x ) - T1( xc ); + T1 dy = T1( y ) - T1( yc ); + x = RoundInt( T1( xc ) + ca*dx - sa*dy ); + y = RoundInt( T1( yc ) + sa*dx + ca*dy ); +} + +/*! + * Rotates a point on the plane. + * + * This is a template instantiation of Rotate( T&, T&, T1, T1, T2, T2 ) for + * the \c long type. + * + * Rotated coordinates are rounded to the nearest integers. + * + * \ingroup mathematical_functions + */ +template +inline void Rotate( long& x, long& y, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + T1 dx = T1( x ) - T1( xc ); + T1 dy = T1( y ) - T1( yc ); + x = (long)RoundInt( T1( xc ) + ca*dx - sa*dy ); + y = (long)RoundInt( T1( yc ) + sa*dx + ca*dy ); +} + +/*! + * Rotates a point on the plane. + * + * This is a template instantiation of Rotate( T&, T&, T1, T1, T2, T2 ) for + * the \c int64 type. + * + * Rotated coordinates are rounded to the nearest integers. + * + * \ingroup mathematical_functions + */ +template +inline void Rotate( int64& x, int64& y, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + T1 dx = T1( x ) - T1( xc ); + T1 dy = T1( y ) - T1( yc ); + x = RoundInt64( T1( xc ) + ca*dx - sa*dy ); + y = RoundInt64( T1( yc ) + sa*dx + ca*dy ); +} + +/*! + * Rotates a point on the plane. + * + * \param[out] x,y %Point coordinates. On output, these variables will + * receive the corresponding rotated coordinates. + * + * \param a Rotation angle in radians. + * + * \param xc,yc Coordinates of the center of rotation. + * + * Instantiations for integer types round rotated coordinated to the nearest + * integers. + * + * \ingroup mathematical_functions + */ +template +inline void Rotate( T& x, T& y, T1 a, T2 xc, T2 yc ) noexcept +{ + T1 sa, ca; SinCos( a, sa, ca ); Rotate( x, y, sa, ca, xc, yc ); +} + +// ---------------------------------------------------------------------------- + +template inline +N __pcl_norm__( const T* i, const T* j, const P& p, N* ) noexcept +{ + PCL_PRECONDITION( p > P( 0 ) ) + N n = N( 0 ); + for ( ; i < j; ++i ) + n += Pow( Abs( N( *i ) ), N( p ) ); + return Pow( n, N( 1/p ) ); +} + +/*! + * Computes the norm of the elements in the sequence [i,j). For any real p > 0, + * the norm N is given by: + * + *
+ * N = sum( abs( x )^p )^(1/p)
+ * 
+ * + * for all x in [i,j). + * + * \ingroup mathematical_functions + * \sa L1Norm(), L2Norm() + */ +template inline T Norm( const T* i, const T* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (T*)( 0 ) ); +} + +template inline double Norm( const float* i, const float* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const int* i, const int* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const unsigned* i, const unsigned* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const int8* i, const int8* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const uint8* i, const uint8* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const int16* i, const int16* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const uint16* i, const uint16* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const int64* i, const int64* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} +template inline double Norm( const uint64* i, const uint64* j, const P& p ) noexcept +{ + return __pcl_norm__( i, j, p, (double*)( 0 ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +N __pcl_l1norm__( const T* i, const T* j, N* ) noexcept +{ + N n = N( 0 ); + for ( ; i < j; ++i ) + n += N( Abs( *i ) ); + return n; +} + +/*! + * Computes the L1 norm (or Manhattan norm) of the elements in the sequence + * [i,j). The L1 norm is the sum of the absolute values of the elements. + * + * \ingroup mathematical_functions + */ +template inline T L1Norm( const T* i, const T* j ) noexcept +{ + return __pcl_l1norm__( i, j, (T*)( 0 ) ); +} + +inline double L1Norm( const float* i, const float* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const int* i, const int* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const unsigned* i, const unsigned* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const int8* i, const int8* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const uint8* i, const uint8* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const int16* i, const int16* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const uint16* i, const uint16* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const int64* i, const int64* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} +inline double L1Norm( const uint64* i, const uint64* j ) noexcept +{ + return __pcl_l1norm__( i, j, (double*)( 0 ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +N __pcl_l2norm__( const T* i, const T* j, N* ) noexcept +{ + N n = N( 0 ); + for ( ; i < j; ++i ) + n += N( *i ) * N( *i ); + return Sqrt( n ); +} + +/*! + * Computes the L2 norm (or Euclidean norm) of the elements in the sequence + * [i,j). The L2 norm is the square root of the sum of squared elements. + * + * \ingroup mathematical_functions + */ +template inline T L2Norm( const T* i, const T* j ) noexcept +{ + return __pcl_l2norm__( i, j, (T*)( 0 ) ); +} + +inline double L2Norm( const float* i, const float* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const int* i, const int* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const unsigned* i, const unsigned* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const int8* i, const int8* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const uint8* i, const uint8* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const int16* i, const int16* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const uint16* i, const uint16* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const int64* i, const int64* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double L2Norm( const uint64* i, const uint64* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Computes the L2 norm (or Euclidean norm) of the elements in the sequence + * [i,j). This function is a synonym for L2Norm(). + * + * \ingroup mathematical_functions + */ +template inline T Norm( const T* i, const T* j ) noexcept +{ + return L2Norm( i, j ); +} + +inline double Norm( const float* i, const float* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const int* i, const int* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const unsigned* i, const unsigned* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const int8* i, const int8* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const uint8* i, const uint8* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const int16* i, const int16* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const uint16* i, const uint16* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const int64* i, const int64* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} +inline double Norm( const uint64* i, const uint64* j ) noexcept +{ + return __pcl_l2norm__( i, j, (double*)( 0 ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Computes the Julian date (JD) corresponding to a time point expressed as a + * date and a day fraction, providing the result by its separate integer and + * fractional parts. + * + * \param[out] jdi On output, the integer part of the resulting JD. + * + * \param[out] jdf On output, the fractional part of the resulting JD. + * + * \param year The year of the date. Positive and negative years are + * supported. Years are counted arithmetically: the year zero + * is the year before the year +1, that is, what historians + * call the year 1 B.C. + * + * \param month The month of the date. Usually in the [1,12] range but can + * be any integer number. + * + * \param day The day of the date. Usually in the [1,31] range but can + * be any integer number. + * + * \param dayf The day fraction. The default value is zero, which + * computes the JD at zero hours. Usually in the [0,1) range + * but can be any real number. + * + * This routine, as well as JDToCalendarTime(), implement modified versions of + * the original algorithms due to Jean Meeus. Our modifications allow for + * negative Julian dates, which extends the range of allowed dates to the past + * considerably. We developed these modifications in the context of large-scale + * solar system ephemeris calculations. + * + * The computed value is the JD corresponding to the specified date and day + * fraction, which is equal to the sum of the \a jdi and \a jdf variables. + * + * \b References + * + * Meeus, Jean (1991), Astronomical Algorithms, Willmann-Bell, Inc., + * chapter 7. + * + * \ingroup mathematical_functions + */ +void PCL_FUNC CalendarTimeToJD( int& jdi, double& jdf, int year, int month, int day, double dayf = 0 ) noexcept; + +/*! + * Computes the Julian date (JD) corresponding to a time point expressed as a + * date and a day fraction. + * + * \param year The year of the date. Positive and negative years are + * supported. Years are counted arithmetically: the year zero is + * the year before the year +1, that is, what historians call + * the year 1 B.C. + * + * \param month The month of the date. Usually in the [1,12] range but can be + * any integer number. + * + * \param day The day of the date. Usually in the [1,31] range but can be + * any integer number. + * + * \param dayf The day fraction. The default value is zero, which computes + * the JD at zero hours. Usually in the [0,1) range but can be + * any real number. + * + * This routine, as well as JDToCalendarTime(), implement modified versions of + * the original algorithms due to Jean Meeus. Our modifications allow for + * negative Julian dates, which extends the range of allowed dates to the past + * considerably. We developed these modifications in the context of large-scale + * solar system ephemeris calculations. + * + * The returned value is the JD corresponding to the specified date and day + * fraction. + * + * Because of the numerical precision of the double type (IEEE 64-bit floating + * point), this routine can return JD values accurate only to within one + * millisecond. + * + * \b References + * + * Meeus, Jean (1991), Astronomical Algorithms, Willmann-Bell, Inc., + * chapter 7. + * + * \ingroup mathematical_functions + */ +inline double CalendarTimeToJD( int year, int month, int day, double dayf = 0 ) noexcept +{ + int jdi; + double jdf; + CalendarTimeToJD( jdi, jdf, year, month, day, dayf ); + return jdi + jdf; +} + +/*! + * Computes the date and day fraction corresponding to a time point expressed + * as a Julian date (JD), specified by its separate integer and fractional + * parts. + * + * \param[out] year On output, this variable receives the year of the + * resulting date. + * + * \param[out] month On output, this variable receives the month of the + * resulting date in the range [1,12]. + * + * \param[out] day On output, this variable receives the day of the + * resulting date in the range [1,31]. Different month day + * counts and leap years are taken into account, so the + * returned day corresponds to an existing calendar date. + * + * \param[out] dayf On output, this variable receives the day fraction for the + * specified time point, in the [0,1) range. + * + * \param jdi The integer part of the input Julian date. + * + * \param jdf The fractional part of the input Julian date. + * + * The input time point must be equal to the sum of \a jdi and \a jdf. + * + * For more information about the implemented algorithms and references, see + * the documentation for CalendarTimeToJD(). + * + * \ingroup mathematical_functions + */ +void PCL_FUNC JDToCalendarTime( int& year, int& month, int& day, double& dayf, int jdi, double jdf ) noexcept; + +/*! + * Computes the date and day fraction corresponding to a time point expressed + * as a Julian date (JD). + * + * \param[out] year On output, this variable receives the year of the + * resulting date. + * + * \param[out] month On output, this variable receives the month of the + * resulting date in the range [1,12]. + * + * \param[out] day On output, this variable receives the day of the + * resulting date in the range [1,31]. Different month day + * counts and leap years are taken into account, so the + * returned day corresponds to an existing calendar date. + * + * \param[out] dayf On output, this variable receives the day fraction for the + * specified time point, in the [0,1) range. + * + * \param jd The input time point as a Julian date. + * + * Because of the numerical precision of the double type (IEEE 64-bit floating + * point), this routine can handle JD values accurate only to within one + * millisecond. + * + * For more information about the implemented algorithms and references, see + * the documentation for CalendarTimeToJD(). + * + * \ingroup mathematical_functions + */ +inline void JDToCalendarTime( int& year, int& month, int& day, double& dayf, double jd ) noexcept +{ + JDToCalendarTime( year, month, day, dayf, TruncInt( jd ), Frac( jd ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Conversion of a decimal scalar \a d to the equivalent sexagesimal decimal + * components \a sign, \a s1, \a s2 and \a s3, such that: + * + *
+ * d = sign * (s1 + (s2 + s3/60)/60)
+ * 
+ * + * with the following constraints: + * + *
+ * sign = -1 iff d < 0
+ * sign = +1 iff d ≥ 0
+ * 0 ≤ s1
+ * 0 ≤ s2 < 60
+ * 0 ≤ s3 < 60
+ * 
+ * + * \ingroup mathematical_functions + */ +template +inline void DecimalToSexagesimal( int& sign, S1& s1, S2& s2, S3& s3, const D& d ) noexcept +{ + double t1 = Abs( d ); + double t2 = Frac( t1 )*60; + double t3 = Frac( t2 )*60; + sign = (d < 0) ? -1 : +1; + s1 = S1( TruncInt( t1 ) ); + s2 = S2( TruncInt( t2 ) ); + s3 = S3( t3 ); +} + +/*! + * Conversion of the sexagesimal decimal components \a sign, \a s1, \a s2 and + * \a s3 to their equivalent decimal scalar. The returned value is equal to: + * + *
+ * ((sign < 0) ? -1 : +1)*(Abs( s1 ) + (s2 + s3/60)/60);
+ * 
+ * + * \ingroup mathematical_functions + */ +template +inline double SexagesimalToDecimal( int sign, const S1& s1, const S2& s2 = S2( 0 ), const S3& s3 = S3( 0 ) ) noexcept +{ + double d = Abs( s1 ) + (s2 + s3/60)/60; + return (sign < 0) ? -d : d; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup statistical_functions Statistical Functions + */ + +/*! + * Returns the sum of elements in a sequence [i,j). + * + * For empty sequences, this function returns zero. + * + * This is a straight implementation of a floating point sum, which is subject + * to severe roundoff errors if the number of summed elements is large. One way + * to improve on this problem is to sort the input set by decreasing order of + * absolute value \e before calling this function. A much better solution, but + * computationally expensive, is a compensated summation algorithm such as + * Kahan summation, which we have implemented in the StableSum() routine. + * + * \ingroup statistical_functions + */ +template inline double Sum( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double sum = 0; + while ( i < j ) + sum += double( *i++ ); + return sum; +} + +/*! + * Computes the sum of elements in a sequence [i,j) using a numerically stable + * summation algorithm to minimize roundoff error. + * + * For empty sequences, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \ingroup statistical_functions + */ +template inline double StableSum( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double sum = 0; + double eps = 0; + while ( i < j ) + { + double y = double( *i++ ) - eps; + double t = sum + y; + eps = (t - sum) - y; + sum = t; + } + return sum; +} + +/*! + * Returns the sum of the absolute values of the elements in a sequence [i,j). + * + * For empty sequences, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableModulus() for a (slow) numerically stable version of + * this function. + * + * \ingroup statistical_functions + */ +template inline double Modulus( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double S = 0; + while ( i < j ) + S += Abs( double( *i++ ) ); + return S; +} + +/*! + * Computes the sum of the absolute values of the elements in a sequence [i,j) + * using a numerically stable summation algorithm to minimize roundoff error. + * + * For empty sequences, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \ingroup statistical_functions + */ +template inline double StableModulus( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double sum = 0; + double eps = 0; + while ( i < j ) + { + double y = Abs( double( *i++ ) ) - eps; + double t = sum + y; + eps = (t - sum) - y; + sum = t; + } + return sum; +} + +/*! + * Returns the sum of the squares of the elements in a sequence [i,j). + * + * For empty sequences, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableSumOfSquares() for a (slow) numerically stable version + * of this function. + * + * \ingroup statistical_functions + */ +template inline double SumOfSquares( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double Q = 0; + while ( i < j ) + { + double f = double( *i++ ); + Q += f*f; + } + return Q; +} + +/*! + * Computes the sum of the squares of the elements in a sequence [i,j) using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty sequences, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \ingroup statistical_functions + */ +template inline double StableSumOfSquares( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + double sum = 0; + double eps = 0; + while ( i < j ) + { + double f = double( *i++ ); + double y = f*f - eps; + double t = sum + y; + eps = (t - sum) - y; + sum = t; + } + return sum; +} + +/*! + * Returns the arithmetic mean of a sequence [i,j). + * + * For empty sequences, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableMean() for a (slow) numerically stable version of this + * function. + * + * \ingroup statistical_functions + */ +template inline double Mean( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + return Sum( i, j )/n; +} + +/*! + * Computes the arithmetic mean of a sequence [i,j) using a numerically stable + * summation algorithm to minimize roundoff error. + * + * For empty sequences, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \ingroup statistical_functions + */ +template inline double StableMean( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + return StableSum( i, j )/n; +} + +/*! + * Returns the variance of a sequence [i,j) with respect to the specified + * \a center value. + * + * For sequences of less than two elements, this function returns zero. + * + * This implementation uses a two-pass compensated summation algorithm to + * minimize roundoff errors (see the references). + * + * \b References + * + * William H. Press et al., Numerical Recipes in C: The Art of Scientific + * Computing, Second Edition (1997 reprint) Cambridge University Press, + * page 613. + * + * \ingroup statistical_functions + */ +template inline double Variance( const T* __restrict__ i, const T* __restrict__ j, double center ) noexcept +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double var = 0, eps = 0; + do + { + double d = double( *i++ ) - center; + var += d*d; + eps += d; + } + while ( i < j ); + return (var - eps*eps/n)/(n - 1); +} + +/*! + * Returns the variance from the mean of a sequence [i,j). + * + * For sequences of less than two elements, this function returns zero. + * + * This implementation uses a two-pass compensated summation algorithm to + * minimize roundoff errors (see References). + * + * \b References + * + * William H. Press et al., Numerical Recipes in C: The Art of Scientific + * Computing, Second Edition (1997 reprint) Cambridge University Press, + * page 613. + * + * \ingroup statistical_functions + */ +template inline double Variance( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double m = 0; + for ( const T* f = i; f < j; ++f ) + m += double( *f ); + m /= n; + double var = 0, eps = 0; + do + { + double d = double( *i++ ) - m; + var += d*d; + eps += d; + } + while ( i < j ); + return (var - eps*eps/n)/(n - 1); +} + +/*! + * Returns the standard deviation of a sequence [i,j) with respect to the + * specified \a center value. + * + * For sequences of less than two elements, this function returns zero. + * + * \ingroup statistical_functions + */ +template inline double StdDev( const T* __restrict__ i, const T* __restrict__ j, double center ) noexcept +{ + return Sqrt( Variance( i, j, center ) ); +} + +/*! + * Returns the standard deviation from the mean of a sequence [i,j). + * + * For sequences of less than two elements, this function returns zero. + * + * \ingroup statistical_functions + */ +template inline double StdDev( const T* __restrict__ i, const T* __restrict__ j ) noexcept +{ + return Sqrt( Variance( i, j ) ); +} + +/*! + * Returns the median value of a sequence [i,j). + * + * For scalar data types the following algorithms are used: + * + * \li Hard-coded, fast selection networks for small sequences of 32 or less + * elements. + * + * \li A quick selection algorithm for sequences of up to about 2M elements. + * The actual limit has been determined empirically and can vary across PCL + * versions. This single-threaded algorithm can use up to 16 MiB of additional + * memory allocated dynamically (for 8-byte types such as \c double). + * + * \li A parallelized, fast histogram-based algorithm for sequences larger than + * the limit described above. This algorithm has negligible additional memory + * space requirements. + * + * For non-scalar data types, this function requires the following type + * conversion operator publicly defined for the type T: + * + * \code T::operator double() const; \endcode + * + * This operator will be used to generate a temporary dynamic array of + * \c double values with the length of the input sequence, which will be used + * to compute the median with the algorithms enumerated above. + * + * \b References (selection networks) + * + * \li Knuth, D. E., The Art of Computer Programming, volume 3: + * Sorting and Searching, Addison Wesley, 1973. + * + * \li Hillis, W. D., Co-evolving parasites improve simulated + * evolution as an optimization procedure. Langton, C. et al. (Eds.), + * Artificial Life II. Addison Wesley, 1992. + * + * \li Hugues Juille, Evolution of Non-Deterministic Incremental + * Algorithms as a New Approach for Search in State Spaces, 1995 + * + * \b References (quick select algorithm) + * + * \li William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * \li Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, + * Addison-Wesley Professional, 2011, pp 345-347. + * + * \ingroup statistical_functions + */ +template inline double Median( const T* __restrict__ i, const T* __restrict__ j ) +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + if ( n == 1 ) + return double( *i ); + double* d = new double[ n ]; + double* __restrict__ t = d; + do + *t++ = double( *i++ ); + while ( i < j ); + double m = double( *pcl::Select( d, t, n >> 1 ) ); + if ( (n & 1) == 0 ) + m = (m + double( *pcl::Select( d, t, (n >> 1)-1 ) ))/2; + delete [] d; + return m; +} + +double PCL_FUNC Median( const unsigned char* __restrict__ i, const unsigned char* __restrict__ j ); +double PCL_FUNC Median( const signed char* __restrict__ i, const signed char* __restrict__ j ); +double PCL_FUNC Median( const wchar_t* __restrict__ i, const wchar_t* __restrict__ j ); +double PCL_FUNC Median( const unsigned short* __restrict__ i, const unsigned short* __restrict__ j ); +double PCL_FUNC Median( const signed short* __restrict__ i, const signed short* __restrict__ j ); +double PCL_FUNC Median( const unsigned int* __restrict__ i, const unsigned int* __restrict__ j ); +double PCL_FUNC Median( const signed int* __restrict__ i, const signed int* __restrict__ j ); +double PCL_FUNC Median( const unsigned long* __restrict__ i, const unsigned long* __restrict__ j ); +double PCL_FUNC Median( const signed long* __restrict__ i, const signed long* __restrict__ j ); +double PCL_FUNC Median( const unsigned long long* __restrict__ i, const unsigned long long* __restrict__ j ); +double PCL_FUNC Median( const signed long long* __restrict__ i, const signed long long* __restrict__ j ); +double PCL_FUNC Median( const float* __restrict__ i, const float* __restrict__ j ); +double PCL_FUNC Median( const double* __restrict__ i, const double* __restrict__ j ); +double PCL_FUNC Median( const long double* __restrict__ i, const long double* __restrict__ j ); + +#define CMPXCHG( a, b ) \ + if ( i[b] < i[a] ) pcl::Swap( i[a], i[b] ) + +#define MEAN( a, b ) \ + (double( a ) + double( b ))/2 + +/*! + * Returns the median value of a sequence [i,j), altering the existing order of + * elements in the input sequence. + * + * This function is intended for sequences of non-scalar objects where the + * order of elements is irrelevant, and hence generation of a working duplicate + * is unnecessary. The following type conversion operator must be publicly + * defined for the type T: + * + * \code T::operator double() const; \endcode + * + * The following algorithms are used: + * + * \li Hard-coded, fast selection networks for sequences of 9 or less elements. + * + * \li A quick selection algorithm for sequences larger than 9 elements. + * + * \note This is a \e destructive median calculation algorithm: it alters the + * existing order of items in the input [i,j) sequence. + * + * \b References (selection networks) + * + * \li Knuth, D. E., The Art of Computer Programming, volume 3: + * Sorting and Searching, Addison Wesley, 1973. + * + * \li Hillis, W. D., Co-evolving parasites improve simulated + * evolution as an optimization procedure. Langton, C. et al. (Eds.), + * Artificial Life II. Addison Wesley, 1992. + * + * \li Hugues Juille, Evolution of Non-Deterministic Incremental + * Algorithms as a New Approach for Search in State Spaces, 1995 + * + * \b References (quick select algorithm) + * + * \li William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * \li Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, + * Addison-Wesley Professional, 2011, pp 345-347. + * + * \ingroup statistical_functions + */ +template inline double MedianDestructive( T* __restrict__ i, T* __restrict__ j ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + + switch ( n ) + { + case 1: // !? + return i[0]; + case 2: + return MEAN( i[0], i[1] ); + case 3: + CMPXCHG( 0, 1 ); CMPXCHG( 1, 2 ); + return pcl::Max( i[0], i[1] ); + case 4: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); + return MEAN( i[1], i[2] ); + case 5: + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 0, 3 ); + CMPXCHG( 1, 4 ); CMPXCHG( 1, 2 ); CMPXCHG( 2, 3 ); + return pcl::Max( i[1], i[2] ); + case 6: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 1, 4 ); + CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); CMPXCHG( 3, 4 ); + return MEAN( i[2], i[3] ); + case 7: + CMPXCHG( 0, 5 ); CMPXCHG( 0, 3 ); CMPXCHG( 1, 6 ); + CMPXCHG( 2, 4 ); CMPXCHG( 0, 1 ); CMPXCHG( 3, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 2, 3 ); CMPXCHG( 3, 6 ); + CMPXCHG( 4, 5 ); CMPXCHG( 1, 4 ); CMPXCHG( 1, 3 ); + return pcl::Min( i[3], i[4] ); + case 8: + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); + CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 1, 4 ); + CMPXCHG( 3, 6 ); + return MEAN( i[3], i[4] ); + case 9: + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 6, 7 ); + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 3 ); CMPXCHG( 5, 8 ); CMPXCHG( 4, 7 ); + CMPXCHG( 3, 6 ); CMPXCHG( 1, 4 ); CMPXCHG( 2, 5 ); + CMPXCHG( 4, 7 ); CMPXCHG( 4, 2 ); CMPXCHG( 6, 4 ); + return pcl::Min( i[2], i[4] ); + default: + { + double m = double( *pcl::Select( i, j, n >> 1 ) ); + if ( n & 1 ) + return m; + return MEAN( m, double( *pcl::Select( i, j, (n >> 1)-1 ) ) ); + } + } +} + +#undef CMPXCHG + +#define CMPXCHG( a, b ) \ + if ( p( i[b], i[a] ) ) pcl::Swap( i[a], i[b] ) + +/*! + * Returns the median value of a sequence [i,j), altering the existing order of + * elements in the input sequence. + * + * Element comparison is given by a binary predicate \a p such that p( a, b ) + * is true for any pair a, b of elements such that a precedes b. + * + * We use fast, hard-coded selection networks for sequences of 9 or less + * elements, and a quick selection algorithm for larger sets. + * + * See the documentation of MedianDestructive( T*, T* ) for more information + * and references. + * + * \ingroup statistical_functions + */ +template inline double MedianDestructive( T* __restrict__ i, T* __restrict__ j, BP p ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + + switch ( n ) + { + case 1: // !? + return i[0]; + case 2: + return MEAN( i[0], i[1] ); + case 3: + CMPXCHG( 0, 1 ); CMPXCHG( 1, 2 ); + return pcl::Max( i[0], i[1] ); + case 4: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); + return MEAN( i[1], i[2] ); + case 5: + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 0, 3 ); + CMPXCHG( 1, 4 ); CMPXCHG( 1, 2 ); CMPXCHG( 2, 3 ); + return pcl::Max( i[1], i[2] ); + case 6: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 1, 4 ); + CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); CMPXCHG( 3, 4 ); + return MEAN( i[2], i[3] ); + case 7: + CMPXCHG( 0, 5 ); CMPXCHG( 0, 3 ); CMPXCHG( 1, 6 ); + CMPXCHG( 2, 4 ); CMPXCHG( 0, 1 ); CMPXCHG( 3, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 2, 3 ); CMPXCHG( 3, 6 ); + CMPXCHG( 4, 5 ); CMPXCHG( 1, 4 ); CMPXCHG( 1, 3 ); + return pcl::Min( i[3], i[4] ); + case 8: + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); + CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 1, 4 ); + CMPXCHG( 3, 6 ); + return MEAN( i[3], i[4] ); + case 9: + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 6, 7 ); + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 3 ); CMPXCHG( 5, 8 ); CMPXCHG( 4, 7 ); + CMPXCHG( 3, 6 ); CMPXCHG( 1, 4 ); CMPXCHG( 2, 5 ); + CMPXCHG( 4, 7 ); CMPXCHG( 4, 2 ); CMPXCHG( 6, 4 ); + return pcl::Min( i[2], i[4] ); + default: + { + double m = double( *pcl::Select( i, j, n >> 1, p ) ); + if ( n & 1 ) + return m; + return MEAN( m, double( *pcl::Select( i, j, (n >> 1)-1, p ) ) ); + } + } +} + +#undef CMPXCHG +#undef MEAN + +/*! + * Returns the k-th order statistic of a sequence [i,j). + * + * For scalar data types the following algorithms are used: + * + * \li A quick selection algorithm for sequences of up to about 2M elements. + * The actual limit has been determined empirically and can vary across PCL + * versions. This single-threaded algorithm can use up to 16 MiB of additional + * memory allocated dynamically (for 8-byte types such as \c double). + * + * \li A parallelized, fast histogram-based algorithm for sequences larger than + * the limit described above. This algorithm has negligible additional memory + * space requirements. + * + * For non-scalar data types, this function requires the following type + * conversion operator publicly defined for the type T: + * + * \code T::operator double() const; \endcode + * + * This operator will be used to generate a temporary dynamic array of + * \c double values with the length of the input sequence, which will be used + * to compute the median with the quick selection algorithm. + * + * \b References (quick select algorithm) + * + * \li William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * \li Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, + * Addison-Wesley Professional, 2011, pp 345-347. + * + * \ingroup statistical_functions + */ +template inline double OrderStatistic( const T* __restrict__ i, const T* __restrict__ j, distance_type k ) +{ + distance_type n = j - i; + if ( n < 1 || k < 0 || k >= n ) + return 0; + if ( n == 1 ) + return double( *i ); + double* d = new double[ n ]; + double* t = d; + do + *t++ = double( *i++ ); + while ( i < j ); + double s = *pcl::Select( d, t, k ); + delete [] d; + return s; +} + +double PCL_FUNC OrderStatistic( const unsigned char* __restrict__ i, const unsigned char* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const signed char* __restrict__ i, const signed char* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const wchar_t* __restrict__ i, const wchar_t* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const unsigned short* __restrict__ i, const unsigned short* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const signed short* __restrict__ i, const signed short* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const unsigned int* __restrict__ i, const unsigned int* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const signed int* __restrict__ i, const signed int* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const unsigned long* __restrict__ i, const unsigned long* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const signed long* __restrict__ i, const signed long* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const unsigned long long* __restrict__ i, const unsigned long long* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const signed long long* __restrict__ i, const signed long long* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const float* __restrict__ i, const float* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const double* __restrict__ i, const double* __restrict__ j, distance_type k ); +double PCL_FUNC OrderStatistic( const long double* __restrict__ i, const long double* __restrict__ j, distance_type k ); + +/*! + * Returns the k-th order statistic of a sequence [i,j), altering the existing + * order of elements in the input sequence. + * + * This function is intended for sequences of non-scalar objects where the + * order of elements is irrelevant, and hence generation of a working duplicate + * is unnecessary. The following type conversion operator must be publicly + * defined for the type T: + * + * <\code> T::operator double() const; \endcode + * + * The quick selection algorithm is used to find the k-th element in the + * ordered sequence. + * + * \note This is a \e destructive algorithm: it alters the existing order of + * items in the input [i,j) sequence. + * + * \b References (quick select algorithm) + * + * \li William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * \li Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, + * Addison-Wesley Professional, 2011, pp 345-347. + * + * \ingroup statistical_functions + */ +template inline double OrderStatisticDestructive( T* __restrict__ i, T* __restrict__ j, distance_type k ) noexcept +{ + distance_type n = j - i; + if ( n < 1 || k < 0 || k >= n ) + return 0; + if ( n == 1 ) + return double( *i ); + return double( *pcl::Select( i, j, k ) ); +} + +/*! + * Returns the k-th order statistic of a sequence [i,j), altering the existing + * order of elements in the input sequence. + * + * Element comparison is given by a binary predicate \a p such that p( a, b ) + * is true for any pair a, b of elements such that a precedes b. + * + * See the documentation of OrderStatisticDestructive( T*, T*, distance_type ) + * for more information and references. + * + * \ingroup statistical_functions + */ +template inline double OrderStatisticDestructive( const T* __restrict__ i, const T* __restrict__ j, distance_type k, BP p ) noexcept +{ + distance_type n = j - i; + if ( n < 1 || k < 0 || k >= n ) + return 0; + if ( n == 1 ) + return double( *i ); + return double( *pcl::Select( i, j, k, p ) ); +} + +/*! + * Computes the two-sided, asymmetric trimmed mean of a sequence [i,j). + * + * The returned value is the arithmetic mean of a sequence [I+l,J-h-1], where + * [I,J) is the input sequence [i,j) sorted in ascending order. + * + * Let n = j-i be the length of the input sequence. For empty sequences + * (n ≤ 0) or completely truncated sequences (l+h >= n), this function + * returns zero. Otherwise the returned value is the arithmetic mean of the + * nonrejected n-l-h elements in the sorted sequence, as described above. + * + * \ingroup statistical_functions + */ +template inline double TrimmedMean( const T* __restrict__ i, const T* __restrict__ j, distance_type l = 1, distance_type h = 1 ) +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + if ( l+h < 1 ) + return Sum( i, j )/n; + if ( l+h >= n ) + return 0; + for ( double s = 0, + t0 = OrderStatistic( i, j, l ), + t1 = OrderStatistic( i, j, n-h-1 ); ; ) + { + double x = double( *i ); + if ( x >= t0 ) + if ( x <= t1 ) + s += x; + if ( ++i == j ) + return s/(n - l - h); + } +} + +/*! + * Computes the two-sided, asymmetric trimmed mean of a sequence [i,j), + * possibly altering the existing order of elements in the input sequence. + * + * The returned value is the arithmetic mean of a sequence [I+l,J-h-1], where + * [I,J) represents the input sequence [i,j) sorted in ascending order. + * + * Let n = j-i be the length of the input sequence. For empty sequences + * (n ≤ 0) or completely truncated sequences (l+h >= n), this function + * returns zero. Otherwise the returned value is the arithmetic mean of the + * nonrejected n-l-h elements in the sorted sequence, as described above. + * + * \note This is a \e destructive trimmed mean calculation algorithm: it may + * alter the existing order of items in the input [i,j) sequence. + * + * \ingroup statistical_functions + */ +template inline double TrimmedMeanDestructive( T* __restrict__ i, T* __restrict__ j, distance_type l = 1, distance_type h = 1 ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + if ( l+h < 1 ) + return Sum( i, j )/n; + if ( l+h >= n ) + return 0; + for ( double s = 0, + t0 = OrderStatisticDestructive( i, j, l ), + t1 = OrderStatisticDestructive( i, j, n-h-1 ); ; ) + { + double x = double( *i ); + if ( x >= t0 ) + if ( x <= t1 ) + s += x; + if ( ++i == j ) + return s/(n - l - h); + } +} + +/*! + * Computes the two-sided, asymmetric trimmed mean of squares of a sequence + * [i,j). + * + * The returned value is the arithmetic mean of squares of a sequence + * [I+l,J-h-1], where [I,J) represents the input sequence [i,j) sorted in + * ascending order. + * + * Let n = j-i be the length of the input sequence. For empty sequences + * (n ≤ 0) or completely truncated sequences (l+h >= n), this function + * returns zero. Otherwise the returned value is the arithmetic mean of the + * squared nonrejected n-l-h elements in the sorted sequence, as described + * above. + * + * \ingroup statistical_functions + */ +template inline double TrimmedMeanOfSquares( const T* __restrict__ i, const T* __restrict__ j, distance_type l = 1, distance_type h = 1 ) +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + if ( l+h < 1 ) + return Sum( i, j )/n; + if ( l+h >= n ) + return 0; + for ( double s = 0, + t0 = OrderStatistic( i, j, l ), + t1 = OrderStatistic( i, j, n-h-1 ); ; ) + { + double x = double( *i ); + if ( x >= t0 ) + if ( x <= t1 ) + s += x*x; + if ( ++i == j ) + return s/(n - l - h); + } +} + +/*! + * Computes the two-sided, asymmetric trimmed mean of squares of a sequence + * [i,j), possibly altering the existing order of elements in the input + * sequence. + * + * The returned value is the arithmetic mean of squares of a sequence + * [I+l,J-h-1], where [I,J) represents the input sequence [i,j) sorted in + * ascending order. + * + * Let n = j-i be the length of the input sequence. For empty sequences + * (n ≤ 0) or completely truncated sequences (l+h >= n), this function + * returns zero. Otherwise the returned value is the arithmetic mean of the + * squared nonrejected n-l-h elements in the sorted sequence, as described + * above. + * + * \note This is a \e destructive trimmed mean of squares calculation + * algorithm: it may alter the existing order of items in the input [i,j) + * sequence. + * + * \ingroup statistical_functions + */ +template inline double TrimmedMeanOfSquaresDestructive( T* __restrict__ i, T* __restrict__ j, distance_type l = 1, distance_type h = 1 ) noexcept +{ + distance_type n = j - i; + if ( n < 1 ) + return 0; + if ( l+h < 1 ) + return Sum( i, j )/n; + if ( l+h >= n ) + return 0; + for ( double s = 0, + t0 = OrderStatisticDestructive( i, j, l ), + t1 = OrderStatisticDestructive( i, j, n-h-1 ); ; ) + { + double x = double( *i ); + if ( x >= t0 ) + if ( x <= t1 ) + s += x*x; + if ( ++i == j ) + return s/(n - l - h); + } +} + +/*! + * Returns the average absolute deviation of the values in a sequence [i,j) + * with respect to the specified \a center value. + * + * When the median of the sequence is used as the center value, this function + * returns the average absolute deviation from the median, which is a + * well-known estimator of dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableAvgDev() for a (slow) numerically stable version of + * this function. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline double AvgDev( const T* __restrict__ i, const T* __restrict__ j, double center ) noexcept +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double d = 0; + do + d += Abs( double( *i++ ) - center ); + while ( i < j ); + return d/n; +} + +/*! + * Returns the average absolute deviation of the values in a sequence [i,j) + * with respect to the specified \a center value, using a numerically stable + * summation algorithm to minimize roundoff error. + * + * When the median of the sequence is used as the center value, this function + * returns the average absolute deviation from the median, which is a + * well-known estimator of dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline double StableAvgDev( const T* __restrict__ i, const T* __restrict__ j, double center ) noexcept +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double sum = 0; + double eps = 0; + do + { + double y = Abs( double( *i++ ) - center ) - eps; + double t = sum + y; + eps = (t - sum) - y; + sum = t; + } + while ( i < j ); + return sum/n; +} + +/*! + * Returns the average absolute deviation from the median of the values in a + * sequence [i,j). + * + * The average absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableAvgDev() for a (slow) numerically stable version of + * this function. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline double AvgDev( const T* __restrict__ i, const T* __restrict__ j ) +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double m = Median( i, j ); + double d = 0; + do + d += Abs( double( *i++ ) - m ); + while ( i < j ); + return d/n; +} + +/*! + * Computes the average absolute deviation from the median of the values in a + * sequence [i,j) using a numerically stable summation algorithm to minimize + * roundoff error. + * + * The average absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * In the current PCL versions, this function implements the Kahan summation + * algorithm to reduce roundoff error to the machine's floating point error. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline double StableAvgDev( const T* __restrict__ i, const T* __restrict__ j ) +{ + return pcl::StableAvgDev( i, j, pcl::Median( i, j ) ); +} + +/*! + * \struct TwoSidedEstimate + * \brief Two-sided descriptive statistical estimate. + * + * This POD structure is returned by functions implementing two-sided scale + * estimators. Given a sample X = {x_0,...,x_n-1} and a reference center value + * m (typically, the median of X), a two-sided scale estimate is computed as + * two separate components: A low estimate for all x in X such that + * x ≤ m, and a high estimate for all x in X such that x > m. + * + * Two-sided scale estimates are important in normalization for accurate + * outlier rejection and sample distribution characterization, especially for + * skewed or asymmetric distributions. + * + * \ingroup statistical_functions + * \sa TwoSidedAvgDev(), TwoSidedMAD(), TwoSidedBiweightMidvariance() + */ +struct TwoSidedEstimate +{ + double low = 0; //!< Low estimate component. + double high = 0; //!< High estimate component. + + /*! + * Default constructor. Both components are initialized to zero. + */ + TwoSidedEstimate() = default; + + /*! + * Copy constructor. + */ + TwoSidedEstimate( const TwoSidedEstimate& ) = default; + + /*! + * Move constructor. + */ + TwoSidedEstimate( TwoSidedEstimate&& ) = default; + + /*! + * Copy assignment operator. + */ + TwoSidedEstimate& operator =( const TwoSidedEstimate& ) = default; + + /*! + * Move assignment operator. + */ + TwoSidedEstimate& operator =( TwoSidedEstimate&& ) = default; + + /*! + * Constructor from separate low and high components. + */ + template + TwoSidedEstimate( const T1& l, const T2& h ) + : low( double( l ) ) + , high( double( h ) ) + { + } + + /*! + * Constructor from a unique component value \a x, which is assigned to both + * the low and high estimate components. + */ + template + TwoSidedEstimate( const T& x ) + { + low = high = double( x ); + } + + /*! + * Returns true iff this two-sided scale estimate is valid. A two-sided + * scale estimate is valid if both the low and high components are finite, + * positive and nonzero with respect to the machine epsilon for the type + * \c double. + */ + bool IsValid() const noexcept + { + return IsFinite( low ) && low > std::numeric_limits::epsilon() + && IsFinite( high ) && high > std::numeric_limits::epsilon(); + } + + /*! + * Returns the sum of the low and high estimate components. + */ + double Total() const noexcept + { + return low + high; + } + + /*! + * Returns the arithmetic mean of the low and high estimate components if + * both are nonzero. Otherwise returns the maximum component. + */ + double Mean() const noexcept + { + if ( low != 0 ) + { + if ( high != 0 ) + return (low + high)/2; + return low; + } + return high; + } + + /*! + * Conversion to scalar. Equivalent to Mean(). + */ + explicit operator double() const noexcept + { + return Mean(); + } + + /*! + * Assignment-multiplication by a scalar. Returns a reference to this + * object. + */ + TwoSidedEstimate& operator *=( double x ) noexcept + { + low *= x; + high *= x; + return *this; + } + + /*! + * Assignment-division by a scalar. Returns a reference to this object. + */ + TwoSidedEstimate& operator /=( double x ) noexcept + { + low /= x; + high /= x; + return *this; + } + + /*! + * Assignment-division by a two-sided estimate. Returns a reference to this + * object. + */ + TwoSidedEstimate& operator /=( const TwoSidedEstimate& e ) noexcept + { + low /= e.low; + high /= e.high; + return *this; + } + + /*! + * Returns the result of multiplying this two-sided estimate by a scalar. + */ + TwoSidedEstimate operator *( double x ) const noexcept + { + return { low*x, high*x }; + } + + /*! + * Returns the result of dividing this two-sided estimate by a scalar. + */ + TwoSidedEstimate operator /( double x ) const noexcept + { + return { low/x, high/x }; + } + + /*! + * Returns the result of the component wise division of this two-sided + * estimate by another two-sided estimate. + */ + TwoSidedEstimate operator /( const TwoSidedEstimate& e ) const noexcept + { + return { low/e.low, high/e.high }; + } +}; + +/*! + * Returns the component wise square root of a two-sided estimate. + * \ingroup statistical_functions + */ +inline TwoSidedEstimate Sqrt( const TwoSidedEstimate& e ) noexcept +{ + return { Sqrt( e.low ), Sqrt( e.high ) }; +} + +/*! + * Returns the component wise exponent function of a two-sided estimate. + * \ingroup statistical_functions + */ +template inline TwoSidedEstimate Pow( const TwoSidedEstimate& e, T x ) noexcept +{ + double x_ = double( x ); + return { Pow( e.low, x_ ), Pow( e.high, x_ ) }; +} + +/*! + * Returns the two-sided average absolute deviation of the values in a sequence + * [i,j) with respect to the specified \a center value. + * + * When the median of the sequence is used as the center value, this function + * returns the average absolute deviation from the median, which is a + * well-known estimator of dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableAvgDev() for a (slow) numerically stable version of + * this function. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline TwoSidedEstimate TwoSidedAvgDev( const T* __restrict__ i, const T* __restrict__ j, double center ) noexcept +{ + double dl = 0, dh = 0; + distance_type nl = 0, nh = 0; + while ( i < j ) + { + double x = double( *i++ ); + if ( x <= center ) + { + dl += center - x; + ++nl; + } + else + { + dh += x - center; + ++nh; + } + } + return { (nl > 1) ? dl/nl : 0.0, + (nh > 1) ? dh/nh : 0.0 }; +} + +/*! + * Returns the two-sided average absolute deviation from the median of the + * values in a sequence [i,j). + * + * The average absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For sequences of less than two elements, this function returns zero. + * + * See the remarks made for the Sum() function, which are equally applicable in + * this case. See StableAvgDev() for a (slow) numerically stable version of + * this function. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + * + * \ingroup statistical_functions + */ +template inline TwoSidedEstimate TwoSidedAvgDev( const T* __restrict__ i, const T* __restrict__ j ) +{ + return pcl::TwoSidedAvgDev( i, j, pcl::Median( i, j ) ); +} + +/*! + * Returns the median absolute deviation (MAD) of the values in a sequence + * [i,j) with respect to the specified \a center value. + * + * The MAD is a well-known robust estimator of scale. + * + * For sequences of less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, its result must be multiplied by the constant 1.4826. + * + * \ingroup statistical_functions + */ +template inline double MAD( const T* __restrict__ i, const T* __restrict__ j, double center ) +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double* d = new double[ n ]; + double* p = d; + do + *p++ = Abs( double( *i++ ) - center ); + while ( i < j ); + double m = pcl::Median( d, d+n ); + delete [] d; + return m; +} + +double PCL_FUNC MAD( const unsigned char* __restrict__ i, const unsigned char* __restrict__ j, double center ); +double PCL_FUNC MAD( const signed char* __restrict__ i, const signed char* __restrict__ j, double center ); +double PCL_FUNC MAD( const wchar_t* __restrict__ i, const wchar_t* __restrict__ j, double center ); +double PCL_FUNC MAD( const unsigned short* __restrict__ i, const unsigned short* __restrict__ j, double center ); +double PCL_FUNC MAD( const signed short* __restrict__ i, const signed short* __restrict__ j, double center ); +double PCL_FUNC MAD( const unsigned int* __restrict__ i, const unsigned int* __restrict__ j, double center ); +double PCL_FUNC MAD( const signed int* __restrict__ i, const signed int* __restrict__ j, double center ); +double PCL_FUNC MAD( const unsigned long* __restrict__ i, const unsigned long* __restrict__ j, double center ); +double PCL_FUNC MAD( const signed long* __restrict__ i, const signed long* __restrict__ j, double center ); +double PCL_FUNC MAD( const unsigned long long* __restrict__ i, const unsigned long long* __restrict__ j, double center ); +double PCL_FUNC MAD( const signed long long* __restrict__ i, const signed long long* __restrict__ j, double center ); +double PCL_FUNC MAD( const float* __restrict__ i, const float* __restrict__ j, double center ); +double PCL_FUNC MAD( const double* __restrict__ i, const double* __restrict__ j, double center ); +double PCL_FUNC MAD( const long double* __restrict__ i, const long double* __restrict__ j, double center ); + +/*! + * Returns the median absolute deviation from the median (MAD) for the values + * in a sequence [i,j). + * + * The MAD is a well-known robust estimator of scale. + * + * For sequences of less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, its result must be multiplied by the constant 1.4826. + * + * \ingroup statistical_functions + */ +template inline double MAD( const T* __restrict__ i, const T* __restrict__ j ) +{ + return pcl::MAD( i, j, pcl::Median( i, j ) ); +} + +/*! + * Returns the two-sided median absolute deviation (MAD) of the values in a + * sequence [i,j) with respect to the specified \a center value. + * + * The MAD is a well-known robust estimator of scale. + * + * For sequences of less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, its result must be multiplied by the constant 1.4826. + * + * \ingroup statistical_functions + */ +template inline TwoSidedEstimate TwoSidedMAD( const T* __restrict__ i, const T* __restrict__ j, double center ) +{ + distance_type n = j - i; + if ( n < 2 ) + return 0; + double* d = new double[ n ]; + double* __restrict__ p = d; + double* __restrict__ q = d + n; + do + { + double x = double( *i++ ); + if ( x <= center ) + *p++ = center - x; + else + *--q = x - center; + } + while( i < j ); + double l = pcl::Median( d, p ); + double h = pcl::Median( q, d+n ); + delete [] d; + return { l, h }; +} + +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const unsigned char* __restrict__ i, const unsigned char* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const signed char* __restrict__ i, const signed char* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const wchar_t* __restrict__ i, const wchar_t* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const unsigned short* __restrict__ i, const unsigned short* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const signed short* __restrict__ i, const signed short* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const unsigned int* __restrict__ i, const unsigned int* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const signed int* __restrict__ i, const signed int* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const unsigned long* __restrict__ i, const unsigned long* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const signed long* __restrict__ i, const signed long* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const unsigned long long* __restrict__ i, const unsigned long long* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const signed long long* __restrict__ i, const signed long long* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const float* __restrict__ i, const float* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const double* __restrict__ i, const double* __restrict__ j, double center ); +TwoSidedEstimate PCL_FUNC TwoSidedMAD( const long double* __restrict__ i, const long double* __restrict__ j, double center ); + +/*! + * Returns the two-sided median absolute deviation from the median (MAD) for + * the values in a sequence [i,j). + * + * The MAD is a well-known robust estimator of scale. + * + * For sequences of less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, its result must be multiplied by the constant 1.4826. + * + * \ingroup statistical_functions + */ +template inline TwoSidedEstimate TwoSidedMAD( const T* __restrict__ i, const T* __restrict__ j ) +{ + return pcl::TwoSidedMAD( i, j, pcl::Median( i, j ) ); +} + +/*! + * Returns the Sn scale estimator of Rousseeuw and Croux for a sequence [x,xn): + * + *
+ * Sn = c * low_median( high_median( |x_i - x_j| ) )
+ * 
+ * + * where low_median() is the order statistic of rank (n + 1)/2, and + * high_median() is the order statistic of rank n/2 + 1. n >= 2 is the number + * of elements in the sequence: n = xn - x. + * + * This implementation is a direct C++ translation of the original FORTRAN + * code by the authors (see References). The algorithm has O(n*log_2(n)) time + * complexity and uses O(n) additional storage. + * + * The constant c = 1.1926 must be used to make the Sn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median Absolute + * Deviation, Journal of the American Statistical Association, Vol. 88, + * pp. 1273-1283. + * + * \note This is a \e destructive algorithm: it may alter the initial order of + * items in the specified [x,xn) sequence. + * + * \ingroup statistical_functions + */ +template double Sn( T* __restrict__ x, T* __restrict__ xn ) +{ + /* + * N.B.: In the code below, lines commented with an asterisk (*) have been + * modified with respect to the FORTRAN original to account for zero-based + * array indices. + */ + + distance_type n = xn - x; + if ( n < 2 ) + return 0; + + pcl::Sort( x, xn ); + + double* a2 = new double[ n ]; + a2[0] = double( x[n >> 1] ) - double( x[0] ); // * + + distance_type nh = (n + 1) >> 1; + + for ( distance_type i = 2; i <= nh; ++i ) + { + distance_type nA = i-1; + distance_type nB = n - i; + distance_type diff = nB - nA; + distance_type leftA = 1; + distance_type leftB = 1; + distance_type rightA = nB; + distance_type Amin = (diff >> 1) + 1; + distance_type Amax = (diff >> 1) + nA; + + while ( leftA < rightA ) + { + distance_type length = rightA - leftA + 1; + distance_type even = (length & 1) == 0; + distance_type half = (length - 1) >> 1; + distance_type tryA = leftA + half; + distance_type tryB = leftB + half; + + if ( tryA < Amin ) + leftA = tryA + even; + else + { + if ( tryA > Amax ) + { + rightA = tryA; + leftB = tryB + even; + } + else + { + double medA = double( x[i-1] ) - double( x[i-2 - tryA + Amin] ); // * + double medB = double( x[tryB + i-1] ) - double( x[i-1] ); // * + if ( medA >= medB ) + { + rightA = tryA; + leftB = tryB + even; + } + else + leftA = tryA + even; + } + } + } + + if ( leftA > Amax ) + a2[i-1] = double( x[leftB + i-1] ) - double( x[i-1] ); // * + else + { + double medA = double( x[i-1] ) - double( x[i-2 - leftA + Amin] ); // * + double medB = double( x[leftB + i-1] ) - double( x[i-1] ); + a2[i-1] = pcl::Min( medA, medB ); // * + } + } + + for ( distance_type i = nh + 1; i < n; ++i ) + { + distance_type nA = n - i; + distance_type nB = i - 1; + distance_type diff = nB - nA; + distance_type leftA = 1; + distance_type leftB = 1; + distance_type rightA = nB; + distance_type Amin = (diff >> 1) + 1; + distance_type Amax = (diff >> 1) + nA; + + while ( leftA < rightA ) + { + distance_type length = rightA - leftA + 1; + distance_type even = (length & 1) == 0; + distance_type half = (length - 1) >> 1; + distance_type tryA = leftA + half; + distance_type tryB = leftB + half; + + if ( tryA < Amin) + leftA = tryA + even; + else + { + if ( tryA > Amax ) + { + rightA = tryA; + leftB = tryB + even; + } + else + { + double medA = double( x[i + tryA - Amin] ) - double( x[i-1] ); // * + double medB = double( x[i-1] ) - double( x[i-1 - tryB] ); // * + if ( medA >= medB ) + { + rightA = tryA; + leftB = tryB + even; + } + else + leftA = tryA + even; + } + } + } + + if ( leftA > Amax ) + a2[i-1] = double( x[i-1] ) - double( x[i-1 - leftB] ); // * + else + { + double medA = double( x[i + leftA - Amin] ) - double( x[i-1] ); // * + double medB = double( x[i-1] ) - double( x[i-1 - leftB] ); // * + a2[i-1] = pcl::Min( medA, medB ); // * + } + } + + a2[n-1] = double( x[n-1] ) - double( x[nh-1] ); // * + + /* + * Correction for a finite sample + */ + double cn; + switch ( n ) + { + case 2: cn = 0.743; break; + case 3: cn = 1.851; break; + case 4: cn = 0.954; break; + case 5: cn = 1.351; break; + case 6: cn = 0.993; break; + case 7: cn = 1.198; break; + case 8: cn = 1.005; break; + case 9: cn = 1.131; break; + default: cn = (n & 1) ? n/(n - 0.9) : 1.0; break; + } + + double sn = cn * *pcl::Select( a2, a2+n, nh-1 ); + + delete [] a2; + return sn; +} + +/*! + * \internal + * Auxiliary routine for Qn(). + * + * Algorithm to compute the weighted high median in O(n) time. + * + * The weighted high median is defined as the smallest a[j] such that the sum + * of the weights of all a[i] <= a[j] is strictly greater than half of the + * total weight. + */ +inline double __pcl_whimed__( double* a, distance_type* iw, distance_type n, + double* acand, distance_type* iwcand ) +{ + distance_type wtotal = 0; + for ( distance_type i = 0; i < n; ++i ) + wtotal += iw[i]; + + for ( distance_type nn = n, wrest = 0; ; ) + { + double trial = *pcl::Select( a, a+nn, nn >> 1 ); // * + + distance_type wleft = 0; + distance_type wmid = 0; + distance_type wright = 0; + for ( distance_type i = 0; i < nn; ++i ) + if ( a[i] < trial ) + wleft += iw[i]; + else if ( a[i] > trial ) + wright += iw[i]; + else + wmid += iw[i]; + + if ( 2*(wrest + wleft) > wtotal ) + { + distance_type kcand = 0; + for ( distance_type i = 0; i < nn; ++i ) + if ( a[i] < trial ) + { + acand[kcand] = a[i]; + iwcand[kcand] = iw[i]; + ++kcand; + } + nn = kcand; + } + else + { + if ( 2*(wrest + wleft + wmid) > wtotal ) + return trial; + + distance_type kcand = 0; + for ( distance_type i = 0; i < nn; ++i ) + if ( a[i] > trial ) + { + acand[kcand] = a[i]; + iwcand[kcand] = iw[i]; + ++kcand; + } + nn = kcand; + wrest += wleft + wmid; + } + + for ( distance_type i = 0; i < nn; ++i ) + { + a[i] = acand[i]; + iw[i] = iwcand[i]; + } + } +} + +/*! + * Returns the Qn scale estimator of Rousseeuw and Croux for a sequence [x,xn): + * + *
+ * Qn = c * first_quartile( |x_i - x_j| : i < j )
+ * 
+ * + * where first_quartile() is the order statistic of rank (n + 1)/4. n >= 2 is + * the number of elements in the sequence: n = xn - x. + * + * This implementation is a C++ translation of the original FORTRAN code by the + * authors (see References). The algorithm has O(n*log_2(n)) time complexity + * and the implementation requires about O(9*n) additional storage. + * + * The constant c = 2.2219 must be used to make the Qn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for consistency + * with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median Absolute + * Deviation, Journal of the American Statistical Association, Vol. 88, + * pp. 1273-1283. + * + * \note This is a \e destructive algorithm: it may alter the initial order of + * items in the specified [x,xn) sequence. + * + * \ingroup statistical_functions + */ +template double Qn( T* __restrict__ x, T* __restrict__ xn ) +{ + distance_type n = xn - x; + if ( n < 2 ) + return 0; + + double* y = new double[ n ]; + double* work = new double[ n ]; + double* acand = new double[ n ]; + distance_type* iwcand = new distance_type[ n ]; + distance_type* left = new distance_type[ n ]; + distance_type* right = new distance_type[ n ]; + distance_type* P = new distance_type[ n ]; + distance_type* Q = new distance_type[ n ]; + distance_type* weight = new distance_type[ n ]; + + distance_type h = (n >> 1) + 1; + distance_type k = (h*(h - 1)) >> 1; + for ( distance_type i = 0; i < n; ++i ) + { + y[i] = double( x[i] ); + left[i] = n - i + 1; // * + right[i] = (i <= h) ? n : n - i + h; // N.B. The original code is "right[i] = n" + } + + pcl::Sort( y, y+n ); + + distance_type nL = (n*(n + 1)) >> 1; + distance_type nR = n*n; + distance_type knew = k + nL; + + bool found = false; + double qn; + + while ( nR-nL > n ) + { + distance_type j = 0; // * + for ( distance_type i = 1; i < n; ++i ) // * + if ( left[i] <= right[i] ) + { + weight[j] = right[i] - left[i] + 1; + work[j] = double( y[i] ) - y[n - left[i] - (weight[j] >> 1)]; + ++j; + } + qn = __pcl_whimed__( work, weight, j, acand, iwcand ); + + for ( distance_type i = n-1, j = 0; i >= 0; --i ) // * + { + while ( j < n && double( y[i] ) - y[n-j-1] < qn ) + ++j; + P[i] = j; + } + + for ( distance_type i = 0, j = n+1; i < n; ++i ) // * + { + while ( double( y[i] ) - y[n-j+1] > qn ) + --j; + Q[i] = j; + } + + double sumP = 0; + double sumQ = 0; + for ( distance_type i = 0; i < n; ++i ) + { + sumP += P[i]; + sumQ += Q[i] - 1; + } + + if ( knew <= sumP ) + { + for ( distance_type i = 0; i < n; ++i ) + right[i] = P[i]; + nR = sumP; + } + else if ( knew > sumQ ) + { + for ( distance_type i = 0; i < n; ++i ) + left[i] = Q[i]; + nL = sumQ; + } + else + { + found = true; + break; + } + } + + if ( !found ) + { + distance_type j = 0; + for ( distance_type i = 1; i < n; ++i ) + for ( distance_type jj = left[i]; jj <= right[i]; ++jj, ++j ) + work[j] = double( y[i] ) - y[n-jj]; // * + qn = *pcl::Select( work, work+j, knew-nL-1 ); // * + } + + /* + * Correction for a finite sample + */ + double dn; + switch ( n ) + { + case 2: dn = 0.399; break; + case 3: dn = 0.994; break; + case 4: dn = 0.512; break; + case 5: dn = 0.844; break; + case 6: dn = 0.611; break; + case 7: dn = 0.857; break; + case 8: dn = 0.669; break; + case 9: dn = 0.872; break; + default: dn = (n & 1) ? n/(n + 1.4) : n/(n + 3.8); break; + } + qn *= dn; + + delete [] y; + delete [] work; + delete [] acand; + delete [] iwcand; + delete [] left; + delete [] right; + delete [] P; + delete [] Q; + delete [] weight; + + return qn; +} + +/*! + * Returns a biweight midvariance (BWMV) for the elements in a sequence [x,xn). + * + * \param x, xn Define a sequence of sample data points for which the BWMV + * estimator will be calculated. + * + * \param center Reference center value. Normally, the median of the sample + * should be used. + * + * \param sigma A reference estimate of dispersion. Normally, the median + * absolute deviation from the median (MAD) of the sample should + * be used. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude rejected + * elements. This tends to approximate the true dispersion of + * the data more accurately for relatively small samples, or + * samples with large amounts of outliers. Note that this + * departs from the standard definition of biweight midvariance, + * where the total number of data items is used to scale the + * variance estimate. If false, use the full sample size, + * including rejected elements, which gives a standard biweight + * midvariance estimate. + * + * The square root of the biweight midvariance is a robust estimator of scale. + * It is an efficient estimator with respect to many statistical distributions + * (about 87% Gaussian efficiency), and appears to have a breakdown point close + * to 0.5 (the same as MAD). + * + * For sequences of less than two elements, this function returns zero. + * + * \note To make the BWMV estimator consistent with the standard deviation of + * a normal distribution, its square root must be multiplied by the constant + * 0.991. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and Hypothesis + * Testing, 4th Edition, Elsevier Inc., Section 3.12.1. + * + * \ingroup statistical_functions + */ +template +double BiweightMidvariance( const T* __restrict__ x, const T* __restrict__ xn, double center, + double sigma, int k = 9, bool reducedLength = false ) noexcept +{ + distance_type n = xn - x; + if ( n < 2 ) + return 0; + + double kd = k * sigma; + if ( kd < 0 || 1 + kd == 1 ) + return 0; + + double num = 0, den = 0; + distance_type nr = 0; + for ( ; x < xn; ++x ) + { + double xc = double( *x ) - center; + double y = xc/kd; + if ( Abs( y ) < 1 ) + { + double y2 = y*y; + double y21 = 1 - y2; + num += xc*xc * y21*y21*y21*y21; + den += y21 * (1 - 5*y2); + ++nr; + } + } + + den *= den; + return (1 + den != 1) ? (reducedLength ? nr : n)*num/den : 0.0; +} + +/*! + * Returns a two-sided biweight midvariance (BWMV) for the elements in a + * sequence [x,xn). + * + * \param x, xn Define a sequence of sample data points for which the + * two-sided BWMV estimator will be calculated. + * + * \param center Reference center value. Normally, the median of the sample + * should be used. + * + * \param sigma A reference two-sided estimate of dispersion. Normally, the + * two-sided median absolute deviation from the median (MAD) of + * the sample should be used. See the TwoSidedMAD() function. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude rejected + * elements. Size reduction is performed separately for the low + * and high halves of the data. This tends to approximate the + * true dispersion of the data more accurately for relatively + * small samples, or samples with large amounts of outliers. + * Note that this departs from the standard definition of + * biweight midvariance, where the total number of data items is + * used to scale the variance estimate. If false, use the full + * sample size, including rejected elements, which gives a + * standard biweight midvariance estimate. + * + * See BiweightMidvariance() for more information and references. + * + * \ingroup statistical_functions + */ +template +TwoSidedEstimate TwoSidedBiweightMidvariance( const T* __restrict__ x, const T* __restrict__ xn, double center, + const TwoSidedEstimate& sigma, int k = 9, bool reducedLength = false ) noexcept +{ + double kd0 = k * sigma.low; + double kd1 = k * sigma.high; + if ( kd0 < 0 || 1 + kd0 == 1 || kd1 < 0 || 1 + kd1 == 1 ) + return 0; + + double num0 = 0, den0 = 0, num1 = 0, den1 = 0; + size_type n0 = 0, n1 = 0, nr0 = 0, nr1 = 0; + for ( ; x < xn; ++x ) + { + double xc = double( *x ) - center; + bool low = xc <= 0; + if ( low ) + ++n0; + else + ++n1; + + double y = xc/(low ? kd0 : kd1); + if ( pcl::Abs( y ) < 1 ) + { + double y2 = y*y; + double y21 = 1 - y2; + double num = xc*xc * y21*y21*y21*y21; + double den = y21 * (1 - 5*y2); + if ( low ) + { + num0 += num; + den0 += den; + ++nr0; + } + else + { + num1 += num; + den1 += den; + ++nr1; + } + } + } + + den0 *= den0; + den1 *= den1; + return { (n0 >= 2 && 1 + den0 != 1) ? (reducedLength ? nr0 : n0)*num0/den0 : 0.0, + (n1 >= 2 && 1 + den1 != 1) ? (reducedLength ? nr1 : n1)*num1/den1 : 0.0 }; +} + +/*! + * Returns a percentage bend midvariance (PBMV) for the elements in a sequence + * [x,xn). + * + * \param x, xn Define a sequence of sample data points for which the PBWV + * estimator will be calculated. + * + * \param center Reference center value. Normally, the median of the sample + * should be used. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the breakdown + * point of the estimator) at the expense of a lower efficiency. + * The default value is beta=0.2. + * + * The square root of the percentage bend midvariance is a robust estimator of + * scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * For sequences of less than two elements, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2012), Introduction to Robust Estimation and Hypothesis + * Testing, 3rd Edition, Elsevier Inc., Section 3.12.3. + * + * \ingroup statistical_functions + */ +template +double BendMidvariance( const T* __restrict__ x, const T* __restrict__ xn, double center, double beta = 0.2 ) +{ + distance_type n = xn - x; + if ( n < 2 ) + return 0; + + beta = Range( beta, 0.0, 0.5 ); + distance_type m = Floor( (1 - beta)*n + 0.5 ); + + double* w = new double[ n ]; + for ( distance_type i = 0; i < n; ++i ) + w[i] = Abs( double( x[i] ) - center ); + double wb = *pcl::Select( w, w+n, m ); + delete [] w; + if ( 1 + wb == 1 ) + return 0; + + double num = 0; + distance_type den = 0; + for ( ; x < xn; ++x ) + { + double y = (double( *x ) - center)/wb; + double f = Max( -1.0, Min( 1.0, y ) ); + num += f*f; + if ( Abs( y ) < 1 ) + ++den; + } + + den *= den; + return (1 + den != 1) ? n*wb*wb*num/den : 0.0; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup special_functions Special Functions + */ + +/*! + * Evaluation of the regularized incomplete beta function I_x( a, b ). + * + * \param a,b The a and b parameters of the beta function being evaluated. + * + * \param x Function evaluation point. Must be in the range [0,1]. + * + * \param eps Relative accuracy of the returned function evaluation. The + * default value is 1.0e-8. + * + * This implementation is adapted from original code by Lewis Van Winkle, + * released under zlib license: + * + *
+ * https://codeplea.com/incomplete-beta-function-c
+ * https://github.com/codeplea/incbeta
+ * 
+ * + * Copyright (c) 2016, 2017 Lewis Van Winkle + * + * \ingroup special_functions + */ +inline double IncompleteBeta( double a, double b, double x, double eps = 1.0e-8 ) noexcept +{ + if ( x < 0 || x > 1 ) + return std::numeric_limits::infinity(); + + /* + * The continued fraction converges nicely for x < (a+1)/(a+b+2) + */ + if ( x > (a + 1)/(a + b + 2) ) + return 1 - IncompleteBeta( b, a, 1 - x ); // Use the fact that beta is symmetric + + /* + * Find the first part before the continued fraction. + */ + double lbeta_ab = lgamma( a ) + lgamma( b ) - lgamma( a + b ); + double front = Exp( Ln( x )*a + Ln( 1 - x )*b - lbeta_ab )/a; + + /* + * Use Lentz's algorithm to evaluate the continued fraction. + */ + const double tiny = 1.0e-30; + double f = 1, c = 1, d = 0; + for ( int i = 0; i <= 200; ++i ) + { + int m = i >> 1; + double numerator; + if ( i & 1 ) + numerator = -((a + m)*(a + b + m)*x)/((a + 2*m)*(a + 2*m + 1)); // Odd term + else if ( i > 0 ) + numerator = (m*(b - m)*x)/((a + 2*m - 1)*(a + 2*m)); // Even term + else + numerator = 1; // First numerator is 1.0 + + /* + * Do an iteration of Lentz's algorithm. + */ + d = 1 + numerator*d; + if ( Abs( d ) < tiny ) + d = tiny; + d = 1/d; + c = 1 + numerator/c; + if ( Abs( c ) < tiny ) + c = tiny; + double cd = c*d; + f *= cd; + if ( Abs( 1 - cd ) < eps ) + return front*(f - 1); + } + + // Needed more loops, did not converge. + return std::numeric_limits::infinity(); +} + +// ---------------------------------------------------------------------------- + +/*! + * The error function: erf( \a x ). + * \ingroup mathematical_functions + */ +template inline constexpr T Erf( T x ) noexcept +{ + return std::erf( x ); +} + +/*! + * The inverse error function: erf^-1( \a x ). + * + * Code adapted from erfinv implementation by Lakshay Garg: + * + * https://github.com/lakshayg/erfinv + * + * Copyright (c) 2017-2019 Lakshay Garg + * Licensed under MIT license. + * + * \ingroup mathematical_functions + */ +template inline constexpr T ErfInv( T x ) noexcept +{ + if ( x < -1 || x > 1 ) + return std::numeric_limits::quiet_NaN(); + if ( x == 1 ) + return std::numeric_limits::infinity(); + if ( x == -1 ) + return -std::numeric_limits::infinity(); + + const long double A0 = 1.1975323115670912564578e0L; + const long double A1 = 4.7072688112383978012285e1L; + const long double A2 = 6.9706266534389598238465e2L; + const long double A3 = 4.8548868893843886794648e3L; + const long double A4 = 1.6235862515167575384252e4L; + const long double A5 = 2.3782041382114385731252e4L; + const long double A6 = 1.1819493347062294404278e4L; + const long double A7 = 8.8709406962545514830200e2L; + + const long double B0 = 1.0000000000000000000e0L; + const long double B1 = 4.2313330701600911252e1L; + const long double B2 = 6.8718700749205790830e2L; + const long double B3 = 5.3941960214247511077e3L; + const long double B4 = 2.1213794301586595867e4L; + const long double B5 = 3.9307895800092710610e4L; + const long double B6 = 2.8729085735721942674e4L; + const long double B7 = 5.2264952788528545610e3L; + + const long double C0 = 1.42343711074968357734e0L; + const long double C1 = 4.63033784615654529590e0L; + const long double C2 = 5.76949722146069140550e0L; + const long double C3 = 3.64784832476320460504e0L; + const long double C4 = 1.27045825245236838258e0L; + const long double C5 = 2.41780725177450611770e-1L; + const long double C6 = 2.27238449892691845833e-2L; + const long double C7 = 7.74545014278341407640e-4L; + + const long double D0 = 1.4142135623730950488016887e0L; + const long double D1 = 2.9036514445419946173133295e0L; + const long double D2 = 2.3707661626024532365971225e0L; + const long double D3 = 9.7547832001787427186894837e-1L; + const long double D4 = 2.0945065210512749128288442e-1L; + const long double D5 = 2.1494160384252876777097297e-2L; + const long double D6 = 7.7441459065157709165577218e-4L; + const long double D7 = 1.4859850019840355905497876e-9L; + + const long double E0 = 6.65790464350110377720e0L; + const long double E1 = 5.46378491116411436990e0L; + const long double E2 = 1.78482653991729133580e0L; + const long double E3 = 2.96560571828504891230e-1L; + const long double E4 = 2.65321895265761230930e-2L; + const long double E5 = 1.24266094738807843860e-3L; + const long double E6 = 2.71155556874348757815e-5L; + const long double E7 = 2.01033439929228813265e-7L; + + const long double F0 = 1.414213562373095048801689e0L; + const long double F1 = 8.482908416595164588112026e-1L; + const long double F2 = 1.936480946950659106176712e-1L; + const long double F3 = 2.103693768272068968719679e-2L; + const long double F4 = 1.112800997078859844711555e-3L; + const long double F5 = 2.611088405080593625138020e-5L; + const long double F6 = 2.010321207683943062279931e-7L; + const long double F7 = 2.891024605872965461538222e-15L; + + long double abs_x = Abs( x ); + + if ( abs_x <= 0.85L ) + { + long double r = 0.180625L - 0.25L * x*x; + long double num = (((((((A7*r + A6)*r + A5)*r + A4)*r + A3)*r + A2)*r + A1)*r + A0); + long double den = (((((((B7*r + B6)*r + B5)*r + B4)*r + B3)*r + B2)*r + B1)*r + B0); + return T( x * num/den ); + } + + long double r = Sqrt( Ln2() - Ln( 1 - abs_x ) ); + long double num = 0, den = 0; + if ( r <= 5 ) + { + r = r - 1.6L; + num = (((((((C7*r + C6)*r + C5)*r + C4)*r + C3)*r + C2)*r + C1)*r + C0); + den = (((((((D7*r + D6)*r + D5)*r + D4)*r + D3)*r + D2)*r + D1)*r + D0); + } + else + { + r = r - 5.0L; + num = (((((((E7*r + E6)*r + E5)*r + E4)*r + E3)*r + E2)*r + E1)*r + E0); + den = (((((((F7*r + F6)*r + F5)*r + F4)*r + F3)*r + F2)*r + F1)*r + F0); + } + + return T( std::copysign( num/den, x ) ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup hash_functions Non-Cryptographic Hash Functions + */ + +/*! + * Computes a 64-bit non-cryptographic hash function. + * + * \param data Address of the first byte of the input data block. + * + * \param size Length in bytes of the input data block. + * + * \param seed Optional seed value for initialization of the hash function. + * If \a seed is zero or is not specified, the seed will be set + * equal to the length of the data block. + * + * Returns a 64-bit hash value computed from the input data block. + * + *
+ * Test vector: "The quick brown fox jumps over the lazy dog"
+ * Hash64 checksum = 9a11f5e9468d7425
+ *
+ * Test vector: "" (empty string)\n
+ * Hash64 checksum = ef46db3751d8e999
+ * 
+ * + * This function implements the xxHash algorithm by Yann Collet. Our code is an + * adaptation of the original code by the author: + * + *
+ * https://github.com/Cyan4973/xxHash
+ * 
+ * + * Copyright (C) 2012-2014, Yann Collet. \n + * The original code has been released under the BSD 2-Clause License: + * + *
+ * http://www.opensource.org/licenses/bsd-license.php
+ * 
+ * + * \ingroup hash_functions + */ +inline uint64 Hash64( const void* data, size_type size, uint64 seed = 0 ) noexcept +{ +#define PRIME64_1 11400714785074694791ULL +#define PRIME64_2 14029467366897019727ULL +#define PRIME64_3 1609587929392839161ULL +#define PRIME64_4 9650029242287828579ULL +#define PRIME64_5 2870177450012600261ULL + + const uint8* p = (const uint8*)data; + const uint8* end = p + size; + uint64 h64; + + if ( seed == 0 ) + seed = size; + + if ( size >= 32 ) + { + const uint8* limit = end - 32; + uint64 v1 = seed + PRIME64_1 + PRIME64_2; + uint64 v2 = seed + PRIME64_2; + uint64 v3 = seed + 0; + uint64 v4 = seed - PRIME64_1; + + do + { + v1 += *(uint64*)p * PRIME64_2; + p += 8; + v1 = RotL( v1, 31 ); + v1 *= PRIME64_1; + v2 += *(uint64*)p * PRIME64_2; + p += 8; + v2 = RotL( v2, 31 ); + v2 *= PRIME64_1; + v3 += *(uint64*)p * PRIME64_2; + p += 8; + v3 = RotL( v3, 31 ); + v3 *= PRIME64_1; + v4 += *(uint64*)p * PRIME64_2; + p += 8; + v4 = RotL( v4, 31 ); + v4 *= PRIME64_1; + } + while ( p <= limit ); + + h64 = RotL( v1, 1 ) + RotL( v2, 7 ) + RotL( v3, 12 ) + RotL( v4, 18 ); + + v1 *= PRIME64_2; + v1 = RotL( v1, 31 ); + v1 *= PRIME64_1; + h64 ^= v1; + h64 = h64 * PRIME64_1 + PRIME64_4; + + v2 *= PRIME64_2; + v2 = RotL( v2, 31 ); + v2 *= PRIME64_1; + h64 ^= v2; + h64 = h64 * PRIME64_1 + PRIME64_4; + + v3 *= PRIME64_2; + v3 = RotL( v3, 31 ); + v3 *= PRIME64_1; + h64 ^= v3; + h64 = h64 * PRIME64_1 + PRIME64_4; + + v4 *= PRIME64_2; + v4 = RotL( v4, 31 ); + v4 *= PRIME64_1; + h64 ^= v4; + h64 = h64 * PRIME64_1 + PRIME64_4; + } + else + { + h64 = seed + PRIME64_5; + } + + h64 += size; + + while ( p+8 <= end ) + { + uint64 k1 = *(uint64*)p; + k1 *= PRIME64_2; + k1 = RotL( k1, 31 ); + k1 *= PRIME64_1; + h64 ^= k1; + h64 = RotL( h64, 27 ) * PRIME64_1 + PRIME64_4; + p += 8; + } + + if ( p+4 <= end ) + { + h64 ^= (uint64)(*(uint32*)p) * PRIME64_1; + h64 = RotL( h64, 23 ) * PRIME64_2 + PRIME64_3; + p += 4; + } + + while ( p < end ) + { + h64 ^= *p * PRIME64_5; + h64 = RotL( h64, 11 ) * PRIME64_1; + ++p; + } + + h64 ^= h64 >> 33; + h64 *= PRIME64_2; + h64 ^= h64 >> 29; + h64 *= PRIME64_3; + h64 ^= h64 >> 32; + + return h64; + +#undef PRIME64_1 +#undef PRIME64_2 +#undef PRIME64_3 +#undef PRIME64_4 +#undef PRIME64_5 +} + +/*! + * Computes a 32-bit non-cryptographic hash function. + * + * \param data Address of the first byte of the input data block. + * + * \param size Length in bytes of the input data block. + * + * \param seed Optional seed value for initialization of the hash function. + * If \a seed is zero or is not specified, the seed will be set + * equal to the length of the data block. + * + * Returns a 32-bit hash value computed from the input data block. + * + *
+ * Test vector: "The quick brown fox jumps over the lazy dog"\n
+ * Hash32 checksum = 752cd1b8
+ *
+ * Test vector: "" (empty string)\n
+ * Hash32 checksum = 2cc5d05
+ * 
+ * + * This function implements the xxHash algorithm by Yann Collet. Our code is an + * adaptation of the original code by the author: + * + *
+ * https://github.com/Cyan4973/xxHash
+ * 
+ * + * Copyright (C) 2012-2014, Yann Collet. \n + * The original code has been released under the BSD 2-Clause License: + * + *
+ * http://www.opensource.org/licenses/bsd-license.php
+ * 
+ * + * \ingroup hash_functions + */ +inline uint32 Hash32( const void* data, size_type size, uint32 seed = 0 ) noexcept +{ +#define PRIME32_1 2654435761U +#define PRIME32_2 2246822519U +#define PRIME32_3 3266489917U +#define PRIME32_4 668265263U +#define PRIME32_5 374761393U + + const uint8* p = (const uint8*)data; + const uint8* end = p + size; + uint32 h32; + + if ( seed == 0 ) + seed = uint32( size ); + + if ( size >= 16 ) + { + const uint8* limit = end - 16; + uint32 v1 = seed + PRIME32_1 + PRIME32_2; + uint32 v2 = seed + PRIME32_2; + uint32 v3 = seed + 0; + uint32 v4 = seed - PRIME32_1; + + do + { + v1 += *(uint32*)p * PRIME32_2; + v1 = RotL( v1, 13 ); + v1 *= PRIME32_1; + p += 4; + v2 += *(uint32*)p * PRIME32_2; + v2 = RotL( v2, 13 ); + v2 *= PRIME32_1; + p += 4; + v3 += *(uint32*)p * PRIME32_2; + v3 = RotL( v3, 13 ); + v3 *= PRIME32_1; + p += 4; + v4 += *(uint32*)p * PRIME32_2; + v4 = RotL( v4, 13 ); + v4 *= PRIME32_1; + p += 4; + } + while ( p <= limit ); + + h32 = RotL( v1, 1 ) + RotL( v2, 7 ) + RotL( v3, 12 ) + RotL( v4, 18 ); + } + else + { + h32 = seed + PRIME32_5; + } + + h32 += (uint32)size; + + while ( p+4 <= end ) + { + h32 += *(uint32*)p * PRIME32_3; + h32 = RotL( h32, 17 ) * PRIME32_4 ; + p+=4; + } + + while ( p < end ) + { + h32 += *p * PRIME32_5; + h32 = RotL( h32, 11 ) * PRIME32_1 ; + ++p; + } + + h32 ^= h32 >> 15; + h32 *= PRIME32_2; + h32 ^= h32 >> 13; + h32 *= PRIME32_3; + h32 ^= h32 >> 16; + + return h32; + +#undef PRIME32_1 +#undef PRIME32_2 +#undef PRIME32_3 +#undef PRIME32_4 +#undef PRIME32_5 +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Math_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Math.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Matrix.h b/3rdparty/include/pcl/Matrix.h new file mode 100644 index 0000000..087bca9 --- /dev/null +++ b/3rdparty/include/pcl/Matrix.h @@ -0,0 +1,3749 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Matrix.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Matrix_h +#define __PCL_Matrix_h + +/// \file pcl/Matrix.h + +#include +#include + +#include +#include +#include +#include +#include +#include // pcl::Reverse() +#include +#include + +#ifndef __PCL_NO_MATRIX_STATISTICS +# include +# include +#endif + +#if !defined( __PCL_NO_MATRIX_IMAGE_RENDERING ) && !defined( __PCL_NO_MATRIX_IMAGE_CONVERSION ) +# include +# include +#endif + +#if !defined( __PCL_NO_MATRIX_PHASE_MATRICES ) && !defined( __PCL_NO_VECTOR_INSTANTIATE ) +# include +#endif + +/* + * Valid filter kernel sizes are odd integers >= 3. This macro is used for the + * KernelFilter and SeparableFilter classes to ensure validity of filter + * matrices and vectors. + */ +#define PCL_VALID_KERNEL_SIZE( n ) (n ? Max( 3, n|1 ) : 0) + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericMatrix + * \brief Generic dynamic matrix of arbitrary dimensions. + * + * %GenericMatrix is a lightweight template class implementing a matrix of + * arbitrary size. This class provides the following main features: + * + * \li Implicit data sharing with reference counting and copy-on-write + * functionality. %GenericMatrix instances can safely be passed as function + * return values and by-value function arguments. + * + * \li Thread-safe. %GenericMatrix instances can safely be accessed from + * multiple threads. The reference counter implements atomic reference and + * dereference operations. + * + * \li Efficient matrix storage and access to matrix elements. %Matrix + * elements are dynamically allocated as a single, contiguous memory block. + * + * \li Support for a comprehensive set of matrix operations, including matrix + * inversion and transposition, scalar-to-matrix and matrix-to-matrix + * arithmetic operations, and image to/from matrix conversions. + * + * \li Calculation of a variety of descriptive statistics for matrix elements. + * + * \sa GenericVector, \ref matrix_operators, \ref matrix_types + */ +template +class PCL_CLASS GenericMatrix : public DirectContainer +{ +public: + + /*! + * Represents a matrix element. + */ + typedef T element; + + /*! + * Represents a vector of matrix elements. + */ + typedef GenericVector vector; + + /*! + * Represents a mutable matrix block iterator. In a matrix of n rows and m + * columns, a block iterator allows iteration on the entire set of matrix + * elements from {0,0} to {n-1,m-1} in row-column order. + */ + typedef element* block_iterator; + + /*! + * Represents an immutable matrix block iterator. In a matrix of n rows and + * m columns, a block iterator allows iteration on the entire set of matrix + * elements from {0,0} to {n-1,m-1} in row-column order. + */ + typedef const element* const_block_iterator; + + /*! + * Constructs an empty matrix. + * An empty matrix has no elements and zero dimensions. + */ + GenericMatrix() + { + m_data = new Data; + } + + /*! + * Constructs an uninitialized matrix. + * + * \param rows Number of matrix rows (≥ 0). + * \param cols Number of matrix columns (≥ 0). + * + * Matrix elements are not initialized by this constructor; the newly + * created matrix will contain unpredictable values. + */ + GenericMatrix( int rows, int cols ) + { + PCL_PRECONDITION( rows >= 0 && cols >= 0 ) + m_data = new Data( rows, cols ); + } + + /*! + * Constructs a matrix and fills it with a constant value. + * + * \param x Initial value for all matrix elements. + * \param rows Number of matrix rows (≥ 0). + * \param cols Number of matrix columns (≥ 0). + */ + GenericMatrix( const element& x, int rows, int cols ) + { + PCL_PRECONDITION( rows >= 0 && cols >= 0 ) + m_data = new Data( rows, cols ); + pcl::Fill( m_data->Begin(), m_data->End(), x ); + } + + /*! + * Constructs a matrix and initializes it with values from a static buffer. + * + * \param a Address of the first item of a static array for + * initialization of matrix elements. The array must provide + * at least \a rows x \a cols consecutive elements stored in + * row order (all elements of the first matrix row followed + * by all elements of the second row, and so on). + * + * \param rows Number of matrix rows (≥ 0). + * + * \param cols Number of matrix columns (≥ 0). + */ + template + GenericMatrix( const T1* a, int rows, int cols ) + { + PCL_PRECONDITION( rows >= 0 && cols >= 0 ) + m_data = new Data( rows, cols ); + if ( a != nullptr ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + const T1* __restrict__ k = a; + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = element( *k ); + } + } + + /*! + * Constructs a 3x3 matrix initialized with the specified element values. + * + * The resulting square matrix will be initialized as follows: + * + *
+    * a00, a01, a02
+    * a10, a11, a12
+    * a20, a21, a22
+    * 
+ */ + template + GenericMatrix( const T1& a00, const T1& a01, const T1& a02, + const T1& a10, const T1& a11, const T1& a12, + const T1& a20, const T1& a21, const T1& a22 ) + { + m_data = new Data( 3, 3 ); + block_iterator __restrict__ v = m_data->Begin(); + v[0] = element( a00 ); v[1] = element( a01 ); v[2] = element( a02 ); + v[3] = element( a10 ); v[4] = element( a11 ); v[5] = element( a12 ); + v[6] = element( a20 ); v[7] = element( a21 ); v[8] = element( a22 ); + } + + /*! + * Copy constructor. This object will reference the same data that is being + * referenced by the specified matrix \a x. + */ + GenericMatrix( const GenericMatrix& x ) + : m_data( x.m_data ) + { + m_data->Attach(); + } + + /*! + * Move constructor. + */ + GenericMatrix( GenericMatrix&& x ) + : m_data( x.m_data ) + { + x.m_data = nullptr; + } + + /*! + * Constructs a matrix as a copy of a rectangular subset of another matrix. + * + * \param x Source matrix from which this object will acquire element + * values. + * + * \param i0 Starting row in \a x. Corresponds to the first (top) row + * of this matrix. + * + * \param j0 Starting column in \a x. Corresponds to the first + * (leftmost) column of this matrix. + * + * \param rows Number of matrix rows. + * + * \param cols Number of matrix columns. + * + * If the specified submatrix is invalid, i.e. if the specified row or + * column don't exist, or if the specified number of rows and columns exceed + * the dimensions of the source matrix \a x, this constructor constrains the + * submatrix coordinates and dimensions to the nearest valid values, + * possibly constructing an empty matrix. + */ + GenericMatrix( const GenericMatrix& x, int i0, int j0, int rows, int cols ) + { + i0 = Range( i0, 0, Max( 0, x.Rows()-1 ) ); + j0 = Range( j0, 0, Max( 0, x.Cols()-1 ) ); + rows = Range( rows, 0, Max( 0, x.Rows()-i0 ) ); + cols = Range( cols, 0, Max( 0, x.Cols()-j0 ) ); + m_data = new Data( rows, cols ); + for ( int i = 0; i < m_data->Rows(); ++i, ++i0 ) + for ( int j = 0; j < m_data->Cols(); ++j, ++j0 ) + m_data->v[i][j] = x.m_data->v[i0][j0]; + } + +#ifndef __PCL_NO_MATRIX_IMAGE_CONVERSION + + /*! + * Constructs a matrix from image pixel samples. + * + * This constructor converts pixel sample values to matrix elements for a + * rectangular region of a channel of the specified \a image. + * + * \param image %Image from which matrix elements will be generated. + * + * \param rect A rectangular region in image pixel coordinates, from + * which this matrix will be generated. If this parameter is + * not specified, or if an empty rectangle is specified, this + * function will perform the matrix conversion for the + * current rectangular selection in the image, that is, for + * image.SelectedRectangle(). + * + * \param channel Channel index. Must be the zero-based index of an existing + * channel in the image, or an integer < 0. If this parameter + * is not specified, or if a negative integer is specified, + * this function will perform the matrix conversion for the + * currently selected channel in the image, that is, for + * image.SelectedChannel(). + * + * The newly created matrix is a representation of the intersection of the + * specified (or implicitly selected) rectangular region with the image for + * the scalar data type T of this matrix instantiation. All predefined pixel + * sample types are supported, including integer, real and complex pixels. + * + * If there is no intersection between the rectangular region and the image, + * this constructor yields an empty matrix. + * + * Note that if the source image is of a floating point type (either real or + * complex) and the scalar type T of this matrix instantiation is of an + * integer type, out-of-range matrix elements will be truncated to either + * zero or to the maximum integer value, if the corresponding source pixel + * sample is outside the normalized [0,1] range. + */ + template + GenericMatrix( const GenericImage

& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + { + GenericMatrix M = FromImage( image, rect, channel ); + pcl::Swap( m_data, M.m_data ); + } + + /*! + * Constructs a matrix from image pixel samples. + * + * This constructor converts pixel sample values to matrix elements for a + * rectangular region of a channel of the image transported by the specified + * %ImageVariant. + * + * If the specified %ImageVariant object does not transport an image, this + * constructor yields an empty matrix. + * + * Refer to the documentation for + * GenericMatrix::GenericMatrix( const GenericImage&, const Rect&, int ) for + * more information about the conversion performed by this constructor. + */ + GenericMatrix( const ImageVariant& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + { + GenericMatrix M = FromImage( image, rect, channel ); + pcl::Swap( m_data, M.m_data ); + } + +#endif // !__PCL_NO_MATRIX_IMAGE_CONVERSION + + /*! + * Destroys a %GenericMatrix object. This destructor dereferences the matrix + * data. If the matrix data becomes unreferenced, it is destroyed and + * deallocated immediately. + */ + virtual ~GenericMatrix() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Deallocates matrix data, yielding an empty matrix. + */ + void Clear() + { + if ( !IsEmpty() ) + if ( m_data->IsUnique() ) + m_data->Deallocate(); + else + { + Data* newData = new Data( 0, 0 ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * If this instance and the specified source instance \a x reference + * different matrix data, the data previously referenced by this object is + * dereferenced. If the previous data becomes unreferenced, it is destroyed + * and deallocated. Then the data being referenced by \a x is also + * referenced by this object. + * + * If this instance and the specified source instance \a x already reference + * the same matrix data, then this function does nothing. + */ + GenericMatrix& operator =( const GenericMatrix& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns a matrix \a x to this object. + * + * If this instance and the specified source instance \a x reference + * different matrix data, the data previously referenced by this object is + * dereferenced. If the previous data becomes unreferenced, it is destroyed + * and deallocated. Then the data being referenced by \a x is also + * referenced by this object. + * + * If this instance and the specified source instance \a x already reference + * the same matrix data, then this function does nothing. + */ + void Assign( const GenericMatrix& x ) + { + x.m_data->Attach(); + DetachFromData(); + m_data = x.m_data; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GenericMatrix& operator =( GenericMatrix&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another matrix \a x to this object. + * + * Decrements the reference counter of the current matrix data. If the data + * becomes unreferenced, it is destroyed and deallocated. The matrix data + * referenced by the source object \a x is then transferred to this object, + * and the source object \a x is left empty. + * + * \warning The source matrix \a x will be an invalid object after calling + * this function, and hence should be destroyed immediately. Any attempt to + * access an invalid object will most likely lead to a crash. + */ + void Transfer( GenericMatrix& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Transfers data from another matrix \a x to this object. + * + * Decrements the reference counter of the current matrix data. If the data + * becomes unreferenced, it is destroyed and deallocated. The matrix data + * referenced by the source object \a x is then transferred to this object, + * and the source object \a x is left empty. + * + * \warning The source matrix \a x will be an invalid object after calling + * this function, and hence should be destroyed immediately. Any attempt to + * access an invalid object will most likely lead to a crash. + */ + void Transfer( GenericMatrix&& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Exchanges two matrices \a x1 and \a x2. + * + * This function is efficient because it simply swaps the internal matrix + * data pointers owned by the objects. + */ + friend void Swap( GenericMatrix& x1, GenericMatrix& x2 ) noexcept + { + pcl::Swap( x1.m_data, x2.m_data ); + } + + /*! + * Assigns a constant scalar \a x to all elements of this matrix. Returns a + * reference to this object. + * + * Before assigning a constant value to all matrix elements, this function + * ensures that this instance uniquely references its matrix data, + * generating a new matrix data block if necessary. + */ + GenericMatrix& operator =( const element& x ) + { + if ( !IsUnique() ) + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + DetachFromData(); + m_data = newData; + } + pcl::Fill( m_data->Begin(), m_data->End(), x ); + return *this; + } + +#define IMPLEMENT_SCALAR_ASSIGN_OP( op ) \ + if ( IsUnique() ) \ + { \ + block_iterator __restrict__ i = m_data->Begin(); \ + const_block_iterator __restrict__ j = m_data->End(); \ + PCL_IVDEP \ + for ( ; i < j; ++i ) \ + *i op##= x; \ + } \ + else \ + { \ + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); \ + block_iterator __restrict__ i = newData->Begin(); \ + const_block_iterator __restrict__ j = newData->End(); \ + const_block_iterator __restrict__ k = m_data->Begin(); \ + PCL_IVDEP \ + for ( ; i < j; ++i, ++k ) \ + *i = *k op x; \ + DetachFromData(); \ + m_data = newData; \ + } \ + return *this; + + /*! + * Adds a constant scalar \a x to all elements of this matrix. Returns a + * reference to this object. + * + * Before adding a constant value to all matrix elements, this function + * ensures that this instance uniquely references its matrix data, + * generating a duplicate if necessary. + */ + GenericMatrix& operator +=( const element& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( + ) + } + + /*! + * Subtracts a constant scalar \a x from all elements of this matrix. + * Returns a reference to this object. + * + * Before subtracting a constant value from all matrix elements, this + * function ensures that this instance uniquely references its matrix data, + * generating a duplicate if necessary. + */ + GenericMatrix& operator -=( const element& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( - ) + } + + /*! + * Multiplies all elements of this matrix by a constant scalar \a x. Returns + * a reference to this object. + * + * Before multiplying all matrix elements by a constant value, this function + * ensures that this instance uniquely references its matrix data, + * generating a duplicate if necessary. + */ + GenericMatrix& operator *=( const element& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( * ) + } + + /*! + * Divides all elements of this matrix by a constant scalar \a x. Returns a + * reference to this object. + * + * Before dividing all matrix elements by a constant value, this function + * ensures that this instance uniquely references its matrix data, + * generating a duplicate if necessary. + */ + GenericMatrix& operator /=( const element& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( / ) + } + + /*! + * Raises all elements of this matrix to a constant scalar \a x. Returns a + * reference to this object. + * + * Before raising all matrix elements to a constant value, this function + * ensures that this instance uniquely references its matrix data, + * generating a duplicate if necessary. + */ + GenericMatrix& operator ^=( const element& x ) + { + if ( IsUnique() ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = pcl::Pow( *i, x ); + } + else + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = newData->Begin(); + const_block_iterator __restrict__ j = newData->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Pow( *k, x ); + DetachFromData(); + m_data = newData; + } + return *this; + } + +#undef IMPLEMENT_SCALAR_ASSIGN_OP + +#ifndef __PCL_NO_MATRIX_ELEMENT_WISE_ARITHMETIC_OPERATIONS + +#define IMPLEMENT_ELEMENT_WISE_ASSIGN_OP( op ) \ + if ( IsUnique() ) \ + { \ + block_iterator __restrict__ i = m_data->Begin(); \ + const_block_iterator __restrict__ j = pcl::Min( m_data->End(), \ + m_data->Begin() + x.NumberOfElements() ); \ + const_block_iterator __restrict__ k = x.m_data->Begin(); \ + PCL_IVDEP \ + for ( ; i < j; ++i, ++k ) \ + *i op##= *k; \ + } \ + else \ + { \ + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); \ + block_iterator __restrict__ i = newData->Begin(); \ + const_block_iterator __restrict__ j = pcl::Min( newData->End(), \ + newData->Begin() + x.NumberOfElements() ); \ + const_block_iterator __restrict__ k = x.m_data->Begin(); \ + const_block_iterator __restrict__ t = m_data->Begin(); \ + PCL_IVDEP \ + for ( ; i < j; ++i, ++k, ++t ) \ + *i = *t op *k; \ + DetachFromData(); \ + m_data = newData; \ + } \ + return *this; + + /*! + * Performs the element-wise addition of a matrix \a x to this matrix. + * Returns a reference to this object. + * + * The specified operand matrix \a x should have at least the same number of + * elements as this matrix. Otherwise the operation will be aborted upon + * reaching the end of the operand matrix, but no exception will be thrown. + * + * This function ensures that this instance uniquely references its matrix + * data before the element-wise addition operation, generating a duplicate + * if necessary. + */ + GenericMatrix& operator +=( const GenericMatrix& x ) + { + IMPLEMENT_ELEMENT_WISE_ASSIGN_OP( + ) + } + + /*! + * Performs the element-wise subtraction of a matrix \a x to this matrix. + * Returns a reference to this object. + * + * The specified operand matrix \a x should have at least the same number of + * elements as this matrix. Otherwise the operation will be aborted upon + * reaching the end of the operand matrix, but no exception will be thrown. + * + * This function ensures that this instance uniquely references its matrix + * data before the element-wise subtraction operation, generating a + * duplicate if necessary. + */ + GenericMatrix& operator -=( const GenericMatrix& x ) + { + IMPLEMENT_ELEMENT_WISE_ASSIGN_OP( - ) + } + + /*! + * Performs the element-wise multiplication of a matrix \a x with this + * matrix. Returns a reference to this object. + * + * The specified operand matrix \a x should have at least the same number of + * elements as this matrix. Otherwise the operation will be aborted upon + * reaching the end of the operand matrix, but no exception will be thrown. + * + * This function ensures that this instance uniquely references its matrix + * data before the element-wise multiplication operation, generating a + * duplicate if necessary. + */ + GenericMatrix& operator *=( const GenericMatrix& x ) + { + IMPLEMENT_ELEMENT_WISE_ASSIGN_OP( * ) + } + + /*! + * Performs the element-wise division of this matrix by a matrix \a x. + * Returns a reference to this object. + * + * The specified operand matrix \a x should have at least the same number of + * elements as this matrix. Otherwise the operation will be aborted upon + * reaching the end of the operand matrix, but no exception will be thrown. + * + * This function ensures that this instance uniquely references its matrix + * data before the element-wise division operation, generating a duplicate + * if necessary. + */ + GenericMatrix& operator /=( const GenericMatrix& x ) + { + IMPLEMENT_ELEMENT_WISE_ASSIGN_OP( / ) + } + + /*! + * Performs the element-wise exponentiation of this matrix by a matrix \a x. + * Returns a reference to this object. + * + * The specified matrix \a x must have at least the same number of elements + * as this matrix. Otherwise an Error exception will be thrown. + * + * This function ensures that this instance uniquely references its matrix + * data before the element-wise raise operation, generating a duplicate if + * necessary. + */ + GenericMatrix& operator ^=( const GenericMatrix& x ) + { + if ( IsUnique() ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = pcl::Min( m_data->End(), + m_data->Begin() + x.NumberOfElements() ); + const_block_iterator __restrict__ k = x.m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Pow( *i, *k ); + } + else + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = newData->Begin(); + const_block_iterator __restrict__ j = pcl::Min( newData->End(), + newData->Begin() + x.NumberOfElements() ); + const_block_iterator __restrict__ k = x.m_data->Begin(); + const_block_iterator __restrict__ t = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k, ++t ) + *i = pcl::Pow( *t, *k ); + DetachFromData(); + m_data = newData; + } + return *this; + } + +#undef IMPLEMENT_ELEMENT_WISE_ASSIGN_OP + +#endif // __PCL_NO_MATRIX_ELEMENT_WISE_ARITHMETIC_OPERATIONS + + /*! + * Returns the square of this matrix. The result is a new matrix of the same + * dimensions where each element is the square of its counterpart in this + * matrix. + */ + GenericMatrix Sqr() const + { + GenericMatrix R( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = R.m_data->Begin(); + const_block_iterator __restrict__ j = R.m_data->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k * *k; + return R; + } + + /*! + * Replaces all elements of this matrix with their squares. + * + * Before performing its task, this function ensures that this instance + * uniquely references its matrix data, generating a duplicate if necessary. + */ + void SetSqr() + { + if ( IsUnique() ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i *= *i; + } + else + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = newData->Begin(); + const_block_iterator __restrict__ j = newData->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k * *k; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the square root of this matrix. The result is a new matrix of the + * same dimensions where each element is the square root of its counterpart + * in this matrix. + */ + GenericMatrix Sqrt() const + { + GenericMatrix R( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = R.m_data->Begin(); + const_block_iterator __restrict__ j = R.m_data->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Sqrt( *k ); + return R; + } + + /*! + * Replaces all elements of this matrix with their square roots. + * + * Before performing its task, this function ensures that this instance + * uniquely references its matrix data, generating a duplicate if necessary. + */ + void SetSqrt() + { + if ( IsUnique() ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = pcl::Sqrt( *i ); + } + else + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = newData->Begin(); + const_block_iterator __restrict__ j = newData->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Sqrt( *k ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the absolute value of this matrix. The result is a new matrix of + * the same dimensions where each element is the absolute value of its + * counterpart in this matrix. + */ + GenericMatrix Abs() const + { + GenericMatrix R( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = R.m_data->Begin(); + const_block_iterator __restrict__ j = R.m_data->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Abs( *k ); + return R; + } + + /*! + * Replaces all elements of this matrix with their absolute values. + * + * Before performing its task, this function ensures that this instance + * uniquely references its matrix data, generating a duplicate if necessary. + */ + void SetAbs() + { + if ( IsUnique() ) + { + block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = pcl::Abs( *i ); + } + else + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + block_iterator __restrict__ i = newData->Begin(); + const_block_iterator __restrict__ j = newData->End(); + const_block_iterator __restrict__ k = m_data->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Abs( *k ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns true iff this instance uniquely references its matrix data. + */ + bool IsUnique() const noexcept + { + return m_data->IsUnique(); + } + + /*! + * Returns true iff this instance references (shares) the same matrix data as + * another instance \a x. + */ + bool IsAliasOf( const GenericMatrix& x ) const noexcept + { + return m_data == x.m_data; + } + + /*! + * Ensures that this instance uniquely references its matrix data. + * + * If necessary, this member function generates a duplicate of the matrix + * data, references it, and then decrements the reference counter of the + * original matrix data. + */ + void EnsureUnique() + { + if ( !IsUnique() ) + { + Data* newData = new Data( m_data->Rows(), m_data->Cols() ); + const_block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + block_iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = *i; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the number of rows in this matrix. If this object is an empty + * matrix, this member function returns zero. + */ + int Rows() const noexcept + { + return m_data->Rows(); + } + + /*! + * Returns the number of columns in this matrix. If this object is an empty + * matrix, this member function returns zero. + */ + int Cols() const noexcept + { + return m_data->Cols(); + } + + /*! + * Returns the number of columns in this matrix. If this object is an empty + * matrix, this member function returns zero. + * + * This function is a synonym for Cols(). + */ + int Columns() const noexcept + { + return Cols(); + } + + /*! + * Returns true only if this matrix is valid. A matrix is valid if it + * references an internal matrix structure, even if it is an empty matrix. + * + * In general, all %GenericMatrix objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other + * matrices. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid matrix object cannot be used and should be destroyed + * immediately. Invalid matrices are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const noexcept + { + return m_data != nullptr; + } + + /*! + * Returns true iff this is an empty matrix. An empty matrix has no elements, + * and hence its dimensions are zero. + */ + bool IsEmpty() const noexcept + { + return Rows() == 0 || Cols() == 0; + } + + /*! + * Returns true iff this matrix is not empty. This operator is equivalent to: + * + * \code !IsEmpty(); \endcode + */ + operator bool() const noexcept + { + return !IsEmpty(); + } + + /*! + * Returns the total number of matrix elements in this object, or + * Rows()*Cols(). + */ + size_type NumberOfElements() const noexcept + { + return m_data->NumberOfElements(); + } + + /*! + * Returns the total number of bytes required to store the data contained in + * this matrix. + */ + size_type Size() const noexcept + { + return m_data->Size(); + } + + /*! + * Equality operator. Returns true if this matrix is equal to another matrix + * \a x. + * + * %Matrix comparisons are performed element-wise. Two matrices are equal if + * both have the same dimensions and identical element values. + */ + bool operator ==( const GenericMatrix& x ) const noexcept + { + return IsAliasOf( x ) || SameDimensions( x ) && pcl::Equal( Begin(), x.Begin(), x.End() ); + } + + /*! + * Less than relational operator. Returns true if this matrix is less than + * another matrix \a x. + * + * In this operator, matrix comparisons are performed element-wise, + * irrespective of matrix dimensions, until either two matrix elements + * differ, or until the end of one of the matrices is reached. In the latter + * case the shortest matrix is the lesser one. + */ + bool operator <( const GenericMatrix& x ) const noexcept + { + return !IsAliasOf( x ) && pcl::Compare( Begin(), End(), x.Begin(), x.End() ) < 0; + } + + /*! + * Returns true iff this matrix has the same dimensions, i.e. the same number + * of rows and columns, as another matrix \a x. + */ + bool SameDimensions( const GenericMatrix& x ) const noexcept + { + return Rows() == x.Rows() && Cols() == x.Cols(); + } + + /*! + * Returns true iff this matrix has the same elements as another matrix \a x. + * + * In this member function, matrix comparisons are performed element-wise, + * irrespective of matrix dimensions. Note that two matrices can have + * exactly the same elements even if their dimensions, i.e. their number of + * rows and columns, are different. Only the number and order of elements + * are relevant for this comparison. + */ + bool SameElements( const GenericMatrix& x ) const noexcept + { + if ( unlikely( IsAliasOf( x ) ) ) + return true; + if ( unlikely( NumberOfElements() != x.NumberOfElements() ) ) + return false; + const_block_iterator __restrict__ i = Begin(); + const_block_iterator __restrict__ j = End(); + const_block_iterator __restrict__ k = x.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + if ( *i != *k ) + return false; + return true; + } + + /*! + * Returns a reference to the matrix element at row \a i and column \a j. + * + * Before returning, this function ensures that this instance uniquely + * references its matrix data. + */ + element& Element( int i, int j ) + { + EnsureUnique(); + return m_data->Element( i, j ); + } + + /*! + * Returns a reference to the immutable matrix element at row \a i and + * column \a j. + */ + const element& Element( int i, int j ) const noexcept + { + return m_data->Element( i, j ); + } + + /*! + * Returns a pointer to the first matrix element of row \a i. + * + * All elements in row \a i are guaranteed to be stored at consecutive + * locations addressable from the pointer returned by this function. + * + * Before returning, this function ensures that this instance uniquely + * references its matrix data. + */ + block_iterator operator []( int i ) + { + EnsureUnique(); + return m_data->v[i]; + } + + /*! + * Returns a pointer to the immutable first matrix element of row \a i. + * + * All elements in row \a i are guaranteed to be stored at consecutive + * locations addressable from the pointer returned by this function. + */ + const_block_iterator operator []( int i ) const noexcept + { + return m_data->v[i]; + } + + /*! + * Returns a pointer to the first matrix element, that is to the element at + * row 0 and column 0 of this matrix. + * + * All matrix elements are guaranteed to be stored at consecutive locations + * addressable from the pointer returned by this function. Matrix elements + * are stored in row order: all elements of row 0 followed by all elements + * of row 1, and so on. + * + * Before returning, this function ensures that this instance uniquely + * references its matrix data. + */ + block_iterator Begin() + { + EnsureUnique(); + return m_data->Begin(); + } + + /*! + * Returns a pointer to the immutable first matrix element, that is to the + * element at row 0 and column 0 of this matrix. + * + * All matrix elements are guaranteed to be stored at consecutive locations + * addressable from the pointer returned by this function. Matrix elements + * are stored in row order: all elements of row 0 followed by all elements + * of row 1, and so on. + */ + const_block_iterator Begin() const noexcept + { + return m_data->Begin(); + } + + /*! + * A synonym for Begin() const. + */ + const_block_iterator ConstBegin() const noexcept + { + return Begin(); + } + + /*! + * Returns a pointer to the first matrix element, that is to the element at + * row 0 and column 0 of this matrix. + * + * This member function is a convenience alias to Begin(). + */ + block_iterator operator *() + { + return Begin(); + } + + /*! + * Returns a pointer to the immutable first matrix element, that is to the + * element at row 0 and column 0 of this matrix. + * + * This member function is a convenience alias to Begin() const. + */ + const_block_iterator operator *() const noexcept + { + return Begin(); + } + + /*! + * Returns a pointer past the last matrix element, that is a pointer to an + * (nonexistent) element located at row=Rows()-1 and column=Cols(). + * + * All matrix elements are guaranteed to be stored in reverse order at + * consecutive locations addressable from the pointer returned by this + * function. Matrix elements are stored in row order (all elements of row n + * followed by all elements of row n-1, and so on). + * + * Before returning, this function ensures that this instance uniquely + * references its matrix data. + */ + block_iterator End() + { + EnsureUnique(); + return m_data->End(); + } + + /*! + * Returns a pointer past the last immutable matrix element, that is a + * pointer to an immutable (and nonexistent) element located at row=Rows()-1 + * and column=Cols(). + * + * All matrix elements are guaranteed to be stored in reverse order at + * consecutive locations addressable from the pointer returned by this + * function. Matrix elements are stored in row order (all elements of row n + * followed by all elements of row n-1, and so on). + */ + const_block_iterator End() const noexcept + { + return m_data->End(); + } + + /*! + * A synonym for End() const. + */ + const_block_iterator ConstEnd() const noexcept + { + return End(); + } + + /*! + * Returns a pointer to a pointer to the first element in this matrix. + * + * The returned pointer can be used as a common C array, where all matrix + * rows are guaranteed to be addressable through consecutive pointers + * starting from the pointer returned by this function. + * + * This member function does nothing to ensure that this instance uniquely + * references its matrix data. Consequently, the caller must take into + * account that all modifications made to matrix elements accessed through + * the value returned by this function will apply to all instances sharing + * the same matrix data. + * + * This function can be used to perform fast operations on matrix elements, + * avoiding the overhead caused by deep copies of matrix data, when such + * copies are not necessary. Typically this happens when two or more threads + * work simultaneously on non-overlapping regions of the same matrix. + */ + block_iterator* DataPtr() noexcept + { + return m_data->v; + } + + /*! + * Returns a pointer to the first matrix element of row \a i. + * + * All elements in row \a i are guaranteed to be stored at consecutive + * locations addressable from the pointer returned by this function. + * + * This member function does not ensure that the data referenced by this + * matrix is unique. See DataPtr() for more information on how to use this + * member function. + */ + block_iterator RowPtr( int i ) noexcept + { + return m_data->v[i]; + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + block_iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_block_iterator begin() const noexcept + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + block_iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_block_iterator end() const noexcept + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Returns a vector with the matrix elements at the specified row \a i. + */ + vector RowVector( int i ) const + { + vector r( m_data->Cols() ); + for ( int j = 0; j < m_data->Cols(); ++j ) + r[j] = m_data->v[i][j]; + return r; + } + + /*! + * Returns a vector with the matrix elements at the specified column \a j. + */ + vector ColumnVector( int j ) const + { + vector c( m_data->Rows() ); + for ( int i = 0; i < m_data->Rows(); ++i ) + c[i] = m_data->v[i][j]; + return c; + } + + /*! + * Returns a vector with the matrix elements at the specified column \a j. + * + * This member function is an alias for ColumnVector(). + */ + vector ColVector( int j ) const + { + return ColumnVector( j ); + } + + /*! + * Assigns the components of a vector \a r to the corresponding elements of + * a matrix row \a i. + */ + template + void SetRow( int i, const V& r ) + { + EnsureUnique(); + for ( int j = 0; j < m_data->Cols() && j < r.Length(); ++j ) + m_data->v[i][j] = element( r[j] ); + } + + /*! + * Assigns the components of a vector \a c to the corresponding elements of + * a matrix column \a i. + */ + template + void SetColumn( int j, const V& c ) + { + EnsureUnique(); + for ( int i = 0; i < m_data->Rows() && i < c.Length(); ++i ) + m_data->v[i][j] = element( c[i] ); + } + + /*! + * Assigns the components of a vector \a c to the corresponding elements of + * a matrix column \a i. + * + * This member function is an alias for SetColumn(). + */ + template + void SetCol( int j, const V& c ) + { + SetColumn( j, c ); + } + + /*! + * Returns a matrix whose first row is a copy of the specified vector \a r. + * The rest of matrix elements are set to zero. The returned object is a + * square matrix whose dimensions are equal to the length of \a r. + */ + static GenericMatrix FromRowVector( const vector& r ) + { + GenericMatrix R( element( 0 ), r.Length(), r.Length() ); + for ( int j = 0; j < r.Length(); ++j ) + R.m_data->v[0][j] = r[j]; + return R; + } + + /*! + * Returns a matrix whose first column is a copy of the specified vector + * \a c. The rest of matrix elements are set to zero. The returned object is + * a square matrix whose dimensions are equal to the length of \a c. + */ + static GenericMatrix FromColumnVector( const vector& c ) + { + GenericMatrix C( element( 0 ), c.Length(), c.Length() ); + for ( int i = 0; i < c.Length(); ++i ) + C.m_data->v[i][0] = c[i]; + return C; + } + + /*! + * This member function is an alias for FromColumnVector(). + */ + static GenericMatrix FromColVector( const vector& c ) + { + return FromColumnVector( c ); + } + + /*! + * Returns a unit matrix of size \a n. + * + * A unit matrix is an n x n square matrix whose elements + * are ones on its main diagonal and zeros elsewhere. + */ + static GenericMatrix UnitMatrix( int n ) + { + GenericMatrix One( element( 0 ), n, n ); + for ( int i = 0; i < n; ++i ) + One[i][i] = element( 1 ); + return One; + } + + /*! + * Returns the transpose of this matrix. + * + * The transpose of a matrix A is another matrix AT whose rows + * are the columns of A (or, equivalently, whose columns are the rows of A). + */ + GenericMatrix Transpose() const + { + GenericMatrix Tr( m_data->Cols(), m_data->Rows() ); + for ( int i = 0; i < m_data->Rows(); ++i ) + for ( int j = 0; j < m_data->Cols(); ++j ) + Tr.m_data->v[j][i] = m_data->v[i][j]; + return Tr; + } + + /*! + * Returns the inverse of this matrix. + * + * When a square matrix is multiplied by its inverse, the result is the + * identity matrix. Non-square matrices do not have inverses. + * + * If this is an empty or non-square matrix, or if it is singular (i.e. if + * its determinant is zero or insignificant), then this function throws the + * appropriate Error exception. + */ + GenericMatrix Inverse() const; + + /*! + * Inverts this matrix. + * + * When a square matrix is multiplied by its inverse, the result is the + * identity matrix. Non-square matrices do not have inverses. + * + * If this is an empty or non-square matrix, or if it is singular (i.e. if + * its determinant is zero or insignificant), then this function throws the + * appropriate Error exception. + */ + void Invert(); + + /*! + * Flips this matrix. Flipping a matrix consists of rotating its elements by + * 180 degrees. + * + * This function ensures that this instance uniquely references its matrix + * data before performing matrix rotation. + */ + void Flip() + { + EnsureUnique(); + pcl::Reverse( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns a flipped copy of this matrix. Flipping a matrix consists of + * rotating its elements by 180 degrees. + */ + GenericMatrix Flipped() const + { + GenericMatrix Tf( m_data->Cols(), m_data->Rows() ); + pcl::CopyReversed( Tf.m_data->End(), m_data->Begin(), m_data->End() ); + return Tf; + } + + /*! + * Returns a 3x3 rotation matrix about the X axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the X axis, + * as seen looking towards the origin from positive x. + * + * The returned matrix is: + * + *

+    * 1     0       0
+    * 0   +cphi   +sphi
+    * 0   -sphi   +cphi
+    * 
+ * + * \sa RotationX( double ) + */ + static GenericMatrix RotationX( double sphi, double cphi ) + { + return GenericMatrix( element( 1 ), element( 0 ), element( 0 ), + element( 0 ), element( +cphi ), element( +sphi ), + element( 0 ), element( -sphi ), element( +cphi ) ); + } + + /*! + * Returns a 3x3 rotation matrix about the X axis by the specified angle + * \a phi in radians. + * + * Calling this function is equivalent to: + * + * \code RotationX( Sin( phi ), Cos( phi ) ) \endcode + */ + static GenericMatrix RotationX( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + return RotationX( sphi, cphi ); + } + + /*! + * Returns a 3x3 rotation matrix about the Y axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the Y axis, + * as seen looking towards the origin from positive y. + * + * The returned matrix is: + * + *
+    * +cphi  0  -sphi
+    *   0    1    0
+    * +sphi  0  +cphi
+    * 
+ * + * \sa RotationY( double ) + */ + static GenericMatrix RotationY( double sphi, double cphi ) + { + return GenericMatrix( element( +cphi ), element( 0 ), element( -sphi ), + element( 0 ), element( 1 ), element( 0 ), + element( +sphi ), element( 0 ), element( +cphi ) ); + } + + /*! + * Returns a 3x3 rotation matrix about the Y axis by the specified angle + * \a phi in radians. + * + * Calling this function is equivalent to: + * + * \code RotationY( Sin( phi ), Cos( phi ) ) \endcode + */ + static GenericMatrix RotationY( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + return RotationY( sphi, cphi ); + } + + /*! + * Returns a 3x3 rotation matrix about the Z axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the Z axis, + * as seen looking towards the origin from positive z. + * + * The returned matrix is: + * + *
+    * +cphi  +sphi  0
+    * -sphi  +cphi  0
+    *   0      0    1
+    * 
+ * + * \sa RotationZ( double ) + */ + static GenericMatrix RotationZ( double sphi, double cphi ) + { + return GenericMatrix( element( +cphi ), element( +sphi ), element( 0 ), + element( -sphi ), element( +cphi ), element( 0 ), + element( 0 ), element( 0 ), element( 1 ) ); + } + + /*! + * Returns a 3x3 rotation matrix about the Z axis by the specified angle + * \a phi in radians. + * + * Calling this function is equivalent to: + * + * \code RotationZ( Sin( phi ), Cos( phi ) ) \endcode + */ + static GenericMatrix RotationZ( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + return RotationZ( sphi, cphi ); + } + + /*! + * Rotates this 3x3 matrix about the X axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the X axis, + * as seen looking towards the origin from positive x. The applied + * transformation can be represented by the matrix: + * + *
+    * 1     0        0
+    * 0   +cphi   +sphi
+    * 0   -sphi   +cphi
+    * 
+ * + * If this matrix has dimensions different from 3 rows and 3 columns, this + * function invokes undefined behavior. For the sake of performance, this + * condition is not explicitly verified. + * + * \sa RotateX( double ), RotatedX() + */ + void RotateX( double sphi, double cphi ) + { + PCL_PRECONDITION( Rows() == 3 && Cols() == 3 ) + EnsureUnique(); + block_iterator __restrict__ A1 = m_data->v[1]; + block_iterator __restrict__ A2 = m_data->v[2]; + double a10 = cphi*A1[0] + sphi*A2[0]; + double a11 = cphi*A1[1] + sphi*A2[1]; + double a12 = cphi*A1[2] + sphi*A2[2]; + double a20 = -sphi*A1[0] + cphi*A2[0]; + double a21 = -sphi*A1[1] + cphi*A2[1]; + double a22 = -sphi*A1[2] + cphi*A2[2]; + A1[0] = element( a10 ); + A1[1] = element( a11 ); + A1[2] = element( a12 ); + A2[0] = element( a20 ); + A2[1] = element( a21 ); + A2[2] = element( a22 ); + } + + /*! + * Rotates this 3x3 matrix about the X axis by the specified angle \a phi in + * radians. + * + * Calling this function is equivalent to: + * + * \code RotateX( Sin( phi ), Cos( phi ) ) \endcode + */ + void RotateX( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + RotateX( sphi, cphi ); + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the X axis by a rotation + * angle given by its sine \a sphi and cosine \a cphi. + * See RotateX( double, double ). + */ + GenericMatrix RotatedX( double sphi, double cphi ) const + { + GenericMatrix R( *this ); + R.RotateX( sphi, cphi ); + return R; + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the X axis by the + * specified rotation angle \a phi in radians. See RotateX( double ). + */ + GenericMatrix RotatedX( double phi ) const + { + GenericMatrix R( *this ); + R.RotateX( phi ); + return R; + } + + /*! + * Rotates this 3x3 matrix about the Y axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the Y axis, + * as seen looking towards the origin from positive y. The applied + * transformation can be represented by the matrix: + * + *
+    * +cphi  0  -sphi
+    *   0    1    0
+    * +sphi  0  +cphi
+    * 
+ * + * If this matrix has dimensions different from 3 rows and 3 columns, this + * function invokes undefined behavior. For the sake of performance, this + * condition is not explicitly verified. + * + * \sa RotateY( double ), RotatedY() + */ + void RotateY( double sphi, double cphi ) + { + PCL_PRECONDITION( Rows() == 3 && Cols() == 3 ) + EnsureUnique(); + block_iterator __restrict__ A0 = m_data->v[0]; + block_iterator __restrict__ A2 = m_data->v[2]; + double a00 = cphi*A0[0] - sphi*A2[0]; + double a01 = cphi*A0[1] - sphi*A2[1]; + double a02 = cphi*A0[2] - sphi*A2[2]; + double a20 = sphi*A0[0] + cphi*A2[0]; + double a21 = sphi*A0[1] + cphi*A2[1]; + double a22 = sphi*A0[2] + cphi*A2[2]; + A0[0] = a00; + A0[1] = a01; + A0[2] = a02; + A2[0] = a20; + A2[1] = a21; + A2[2] = a22; + } + + /*! + * Rotates this 3x3 matrix about the Y axis by the specified angle \a phi in + * radians. + * + * Calling this function is equivalent to: + * + * \code RotateY( Sin( phi ), Cos( phi ) ) \endcode + */ + void RotateY( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + RotateY( sphi, cphi ); + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the Y axis by a rotation + * angle given by its sine \a sphi and cosine \a cphi. + * See RotateY( double, double ). + */ + GenericMatrix RotatedY( double sphi, double cphi ) const + { + GenericMatrix R( *this ); + R.RotateY( sphi, cphi ); + return R; + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the Y axis by the + * specified rotation angle \a phi in radians. See RotateY( double ). + */ + GenericMatrix RotatedY( double phi ) const + { + GenericMatrix R( *this ); + R.RotateY( phi ); + return R; + } + + /*! + * Rotates this 3x3 matrix about the Z axis. + * + * \param sphi Sine of the rotation angle. + * + * \param cphi Cosine of the rotation angle. + * + * Positive rotation angles apply anticlockwise rotations about the Z axis, + * as seen looking towards the origin from positive z. The applied + * transformation can be represented by the matrix: + * + *
+    * +cphi  +sphi  0
+    * -sphi  +cphi  0
+    *   0      0    1
+    * 
+ * + * If this matrix has dimensions different from 3 rows and 3 columns, this + * function invokes undefined behavior. For the sake of performance, this + * condition is not explicitly verified. + * + * \sa RotateZ( double ), RotatedZ() + */ + void RotateZ( double sphi, double cphi ) + { + PCL_PRECONDITION( Rows() == 3 && Cols() == 3 ) + EnsureUnique(); + block_iterator __restrict__ A0 = m_data->v[0]; + block_iterator __restrict__ A1 = m_data->v[1]; + double a00 = cphi*A0[0] + sphi*A1[0]; + double a01 = cphi*A0[1] + sphi*A1[1]; + double a02 = cphi*A0[2] + sphi*A1[2]; + double a10 = -sphi*A0[0] + cphi*A1[0]; + double a11 = -sphi*A0[1] + cphi*A1[1]; + double a12 = -sphi*A0[2] + cphi*A1[2]; + A0[0] = a00; + A0[1] = a01; + A0[2] = a02; + A1[0] = a10; + A1[1] = a11; + A1[2] = a12; + } + + /*! + * Rotates this 3x3 matrix about the Z axis by the specified angle \a phi in + * radians. + * + * Calling this function is equivalent to: + * + * \code RotateZ( Sin( phi ), Cos( phi ) ) \endcode + */ + void RotateZ( double phi ) + { + double sphi, cphi; + SinCos( phi, sphi, cphi ); + RotateZ( sphi, cphi ); + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the Z axis by a rotation + * angle given by its sine \a sphi and cosine \a cphi. + * See RotateZ( double, double ). + */ + GenericMatrix RotatedZ( double sphi, double cphi ) const + { + GenericMatrix R( *this ); + R.RotateZ( sphi, cphi ); + return R; + } + + /*! + * Returns a rotated copy of this 3x3 matrix about the Z axis by the + * specified rotation angle \a phi in radians. See RotateZ( double ). + */ + GenericMatrix RotatedZ( double phi ) const + { + GenericMatrix R( *this ); + R.RotateZ( phi ); + return R; + } + + /*! + * Truncates all matrix elements to the specified range. + * + * \param f0 Lower bound of the truncation range. If not specified, the + * default value is zero. + * + * \param f1 Upper bound of the truncation range. If not specified, the + * default value is one. + * + * After calling this member function, all matrix elements will be within + * the [\a f0,\a f1] range. + */ + void Truncate( const element& f0 = element( 0 ), const element& f1 = element( 1 ) ) + { + EnsureUnique(); + block_iterator __restrict__ i = m_data->Begin(); + block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + if ( *i < f0 ) + *i = f0; + else if ( *i > f1 ) + *i = f1; + } + + /*! + * Returns a truncated copy of this matrix. See Truncate(). + */ + GenericMatrix Truncated( const element& f0 = element( 0 ), const element& f1 = element( 1 ) ) const + { + GenericMatrix R( *this ); + R.Truncate( f0, f1 ); + return R; + } + + /*! + * Rescales all matrix elements to the specified range. + * + * \param f0 Lower bound of the rescaling range. If not specified, the + * default value is zero. + * + * \param f1 Upper bound of the rescaling range. If not specified, the + * default value is one. + * + * The rescaling operation is as follows. if \a m and \a M are the minimum + * and maximum element values in this matrix, respectively, then for each + * matrix element s, its rescaled value r is given by: + * + * \a r = \a f0 + (\a s - \a m)*(\a f1 - \a f0)/(\a M - \a m) + */ + void Rescale( const element& f0 = element( 0 ), const element& f1 = element( 1 ) ) + { + element v0 = MinElement(); + element v1 = MaxElement(); + if ( v0 != f0 || v1 != f1 ) + { + EnsureUnique(); + if ( v0 != v1 ) + { + if ( f0 != f1 ) + { + block_iterator __restrict__ i = m_data->Begin(); + block_iterator __restrict__ j = m_data->End(); + double d = (double( f1 ) - double( f0 ))/(double( v1 ) - double( v0 )); + if ( f0 == element( 0 ) ) + { + PCL_IVDEP + for ( ; i < j; ++i ) + *i = element( d*(*i - v0) ); + } + else + { + PCL_IVDEP + for ( ; i < j; ++i ) + *i = element( d*(*i - v0) + f0 ); + } + } + else + pcl::Fill( m_data->Begin(), m_data->End(), f0 ); + } + else + pcl::Fill( m_data->Begin(), m_data->End(), pcl::Range( v0, f0, f1 ) ); + } + } + + /*! + * Returns a rescaled copy of this matrix. See Rescale(). + */ + GenericMatrix Rescaled( const element& f0 = element( 0 ), const element& f1 = element( 1 ) ) const + { + GenericMatrix R( *this ); + R.Rescale( f0, f1 ); + return R; + } + + /*! + * Sorts the elements of this matrix in ascending order. + */ + void Sort() + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns a sorted copy of this matrix. + */ + GenericMatrix Sorted() const + { + GenericMatrix R( *this ); + R.Sort(); + return R; + } + + /*! + * Sorts the elements of this matrix in reverse (descending) order. + */ + void ReverseSort() + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End(), + []( const element& a, const element& b ){ return b < a; } ); + } + + /*! + * Returns a reverse sorted copy of this matrix. + */ + GenericMatrix ReverseSorted() const + { + GenericMatrix R( *this ); + R.ReverseSort(); + return R; + } + + /*! + * Sorts the elements of this matrix in ascending order. Ordering of matrix + * elements is defined such that for any pair a, b of matrix elements, the + * specified binary predicate p( a, b ) is true if a precedes b. + */ + template + void Sort( BP p ) + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End(), p ); + } + + /*! + * Returns a sorted copy of this matrix, where ordering of matrix elements + * is defined by the specified binary predicate \a p. See Sort( BP p ). + */ + template + GenericMatrix Sorted( BP p ) const + { + GenericMatrix R( *this ); + R.Sort( p ); + return R; + } + + /*! + * Returns a pointer to the first immutable matrix element with the + * specified value \a x, or nullptr if this matrix does not contain such + * value. + */ + const_block_iterator Find( const element& x ) const noexcept + { + const_block_iterator p = pcl::LinearSearch( m_data->Begin(), m_data->End(), x ); + return (p != m_data->End()) ? p : nullptr; + } + + /*! + * Returns a pointer to the first immutable matrix element with the + * specified value \a x, or nullptr if this matrix does not contain such + * value. This function is an alias to Find(). + */ + const_block_iterator FindFirst( const element& x ) const noexcept + { + return Find( x ); + } + + /*! + * Returns a pointer to the last immutable matrix element with the specified + * value \a x, or nullptr if this matrix does not contain such value. + */ + const_block_iterator FindLast( const element& x ) const noexcept + { + const_block_iterator p = pcl::LinearSearchLast( m_data->Begin(), m_data->End(), x ); + return (p != m_data->End()) ? p : nullptr; + } + + /*! + * Returns true iff this matrix contains the specified value \a x. + */ + bool Contains( const element& x ) const noexcept + { + return pcl::LinearSearch( m_data->Begin(), m_data->End(), x ) != m_data->End(); + } + +#ifndef __PCL_NO_MATRIX_STATISTICS + + /*! + * Returns the value of the minimum element in this matrix. + * For empty matrices, this function returns zero. + */ + element MinElement() const noexcept + { + if ( !IsEmpty() ) + return *MinItem( m_data->Begin(), m_data->End() ); + return element( 0 ); + } + + /*! + * Returns the value of the minimum element in this matrix and its + * coordinates in the specified point \a p. + * For empty matrices, this function returns zero and assigns zero to the + * point coordinates. + */ + element MinElement( Point& p ) const noexcept + { + if ( !IsEmpty() ) + { + const_block_iterator m = MinItem( m_data->Begin(), m_data->End() ); + distance_type d = m - m_data->Begin(); + p.y = int( d/m_data->Cols() ); + p.x = int( d%m_data->Cols() ); + return *m; + } + p = 0; + return element( 0 ); + } + + /*! + * Returns the value of the maximum element in this matrix. + * For empty matrices, this function returns zero. + */ + element MaxElement() const noexcept + { + if ( !IsEmpty() ) + return *MaxItem( m_data->Begin(), m_data->End() ); + return element( 0 ); + } + + /*! + * Returns the value of the maximum element in this matrix and its + * coordinates in the specified point \a p. + * For empty matrices, this function returns zero and assigns zero to the + * point coordinates. + */ + element MaxElement( Point& p ) const noexcept + { + if ( !IsEmpty() ) + { + const_block_iterator m = MaxItem( m_data->Begin(), m_data->End() ); + int d = m - m_data->Begin(); + p.y = d/m_data->Cols(); + p.x = d%m_data->Cols(); + return *m; + } + p = 0; + return element( 0 ); + } + + /*! + * Returns the sum of all matrix elements. + * + * For empty matrices, this function returns zero. + */ + double Sum() const noexcept + { + return pcl::Sum( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of all matrix elements using a numerically stable + * summation algorithm to minimize roundoff error. + * + * For empty matrices, this function returns zero. + */ + double StableSum() const noexcept + { + return pcl::StableSum( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the sum of the absolute values of all matrix elements. + * + * For empty matrices, this function returns zero. + */ + double Modulus() const noexcept + { + return pcl::Modulus( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of the absolute values of all matrix elements using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty matrices, this function returns zero. + */ + double StableModulus() const noexcept + { + return pcl::StableModulus( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the sum of the squares of all matrix elements. + * + * For empty matrices, this function returns zero. + */ + double SumOfSquares() const noexcept + { + return pcl::SumOfSquares( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of the squares of all matrix elements using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty matrices, this function returns zero. + */ + double StableSumOfSquares() const noexcept + { + return pcl::StableSumOfSquares( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the mean of the element values in this matrix. + * + * For empty matrices, this function returns zero. + */ + double Mean() const noexcept + { + return pcl::Mean( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the mean of the element values in this matrix using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty matrices, this function returns zero. + */ + double StableMean() const noexcept + { + return pcl::StableMean( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the two-sided, asymmetric trimmed mean of the values in this + * matrix. See pcl::TrimmedMean() for a complete description of the + * implemented algorithm with information on function parameters. + * + * For empty matrices, this function returns zero. + */ + double TrimmedMean( distance_type l = 1, distance_type h = 1 ) const noexcept + { + return pcl::TrimmedMean( m_data->Begin(), m_data->End(), l, h ); + } + + /*! + * Computes the two-sided, asymmetric trimmed mean of the squared values in + * this matrix. See pcl::TrimmedMeanOfSquares() for a complete description + * of the implemented algorithm with information on function parameters. + * + * For empty matrices, this function returns zero. + */ + double TrimmedMeanOfSquares( distance_type l = 1, distance_type h = 1 ) const noexcept + { + return pcl::TrimmedMeanOfSquares( m_data->Begin(), m_data->End(), l, h ); + } + + /*! + * Returns the variance from the mean for the values in this matrix. + * + * For matrices with less than two elements, this function returns zero. + */ + double Variance() const noexcept + { + return pcl::Variance( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the standard deviation from the mean for the values in this + * matrix. + * + * For matrices with less than two elements, this function returns zero. + */ + double StdDev() const noexcept + { + return pcl::StdDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the median of element values in this matrix. + * + * For matrices with less than two elements, this function returns zero. + */ + double Median() const + { + return pcl::Median( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the average absolute deviation with respect to the specified + * \a center value. + * + * When the median of the matrix elements is used as the center value, this + * function returns the average absolute deviation from the median, which is + * a well-known estimator of dispersion. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double AvgDev( double center ) const noexcept + { + return pcl::AvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Computes the average absolute deviation with respect to the specified + * \a center value, using a numerically stable summation algorithm to + * minimize roundoff error. + * + * When the median of the matrix elements is used as the center value, this + * function returns the average absolute deviation from the median, which is + * a well-known estimator of dispersion. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double StableAvgDev( double center ) const noexcept + { + return pcl::StableAvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the average absolute deviation from the median. + * + * The mean absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double AvgDev() const + { + return pcl::AvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the average absolute deviation from the median using a + * numerically stable summation algorithm to minimize roundoff error. + * + * The mean absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double StableAvgDev() const + { + return pcl::StableAvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the two-sided average absolute deviation with respect to the + * specified \a center value. + * + * See AvgDev( double ) for more information. + */ + TwoSidedEstimate TwoSidedAvgDev( double center ) const noexcept + { + return pcl::TwoSidedAvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the two-sided average absolute deviation from the median. + * + * See AvgDev() for more information. + */ + TwoSidedEstimate TwoSidedAvgDev() const + { + return pcl::TwoSidedAvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the median absolute deviation (MAD) with respect to the specified + * \a center value. + * + * The MAD is a well-known robust estimator of scale. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, it must be multiplied by the constant 1.4826. + */ + double MAD( double center ) const + { + return pcl::MAD( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the median absolute deviation from the median (MAD). + * + * The MAD is a well-known robust estimator of scale. + * + * For matrices with less than two elements, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, it must be multiplied by the constant 1.4826. + */ + double MAD() const + { + return pcl::MAD( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the two-sided median absolute deviation (MAD) with respect to the + * specified \a center value. + * + * See MAD( double ) for more information. + */ + TwoSidedEstimate TwoSidedMAD( double center ) const + { + return pcl::TwoSidedMAD( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the two-sided median absolute deviation from the median (MAD). + * + * See MAD() for more information. + */ + TwoSidedEstimate TwoSidedMAD() const + { + return pcl::TwoSidedMAD( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the biweight midvariance (BWMV). + * + * \param center Reference center value. Normally, the median of the matrix + * elements should be used. + * + * \param sigma A reference estimate of dispersion. Normally, the median + * absolute deviation from the median (MAD) of the matrix + * elements should be used. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude + * rejected matrix elements. This tends to approximate the + * true dispersion of the data more accurately for relatively + * small samples, or samples with large amounts of outliers. + * Note that this departs from the standard definition of + * biweight midvariance, where the total number of data items + * is used to scale the variance estimate. If false, use the + * full number of matrix elements, including rejected + * elements, which gives a standard biweight midvariance + * estimate. + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the same as MAD). + * + * For matrices with less than two elements, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.1. + */ + double BiweightMidvariance( double center, double sigma, int k = 9, bool reducedLength = false ) const noexcept + { + return pcl::BiweightMidvariance( m_data->Begin(), m_data->End(), center, sigma, k, reducedLength ); + } + + /*! + * Returns the biweight midvariance (BWMV) with respect to the median and + * the median absolute deviation from the median (MAD). + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude + * rejected matrix elements. This tends to approximate the + * true dispersion of the data more accurately for relatively + * small samples, or samples with large amounts of outliers. + * Note that this departs from the standard definition of + * biweight midvariance, where the total number of data items + * is used to scale the variance estimate. If false, use the + * full number of matrix elements, including rejected + * elements, which gives a standard biweight midvariance + * estimate. + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the same as MAD). + * + * For matrices with less than two elements, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.1. + */ + double BiweightMidvariance( int k = 9, bool reducedLength = false ) const + { + double center = Median(); + return BiweightMidvariance( center, MAD( center ), k, reducedLength ); + } + + /*! + * Returns the two-sided biweight midvariance (BWMV). + * + * \param center Reference center value. Normally, the median of the vector + * components should be used. + * + * \param sigma A two-sided reference estimate of dispersion. Normally, + * the two-sided median absolute deviation from the median + * (MAD) of the vector components should be used. See the + * TwoSidedMAD() member function. + * + * See BiweightMidvariance( double, double, int, bool ) for more information + * on the rest of parameters and references. + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( double center, const TwoSidedEstimate& sigma, + int k = 9, bool reducedLength = false ) const noexcept + { + return pcl::TwoSidedBiweightMidvariance( m_data->Begin(), m_data->End(), center, sigma, k, reducedLength ); + } + + /*! + * Returns the two-sided biweight midvariance (BWMV) with respect to the + * median and the two-sided median absolute deviation from the median (MAD). + * + * See BiweightMidvariance( int, bool ) for more information and references. + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( int k = 9, bool reducedLength = false ) const + { + double center = Median(); + return TwoSidedBiweightMidvariance( center, TwoSidedMAD( center ), k, reducedLength ); + } + + /*! + * Returns a percentage bend midvariance (PBMV). + * + * \param center Reference center value. Normally, the median of the matrix + * elements should be used. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the + * breakdown point of the estimator) at the expense of lower + * efficiency. The default value is beta=0.2. + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * For matrices with less than two elements, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.3. + */ + double BendMidvariance( double center, double beta = 0.2 ) const + { + return pcl::BendMidvariance( m_data->Begin(), m_data->End(), center, beta ); + } + + /*! + * Returns a percentage bend midvariance (PBMV) with respect to the median. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the + * breakdown point of the estimator) at the expense of lower + * efficiency. The default value is beta=0.2. + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * For matrices with less than two elements, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2012), Introduction to Robust Estimation and + * Hypothesis Testing, 3rd Edition, Elsevier Inc., Section 3.12.3. + */ + double BendMidvariance( double beta = 0.2 ) const + { + return pcl::BendMidvariance( m_data->Begin(), m_data->End(), Median(), beta ); + } + + /*! + * Returns the Sn scale estimator of Rousseeuw and Croux: + * + *
+    * Sn = c * low_median( high_median( |x_i - x_j| ) )
+    * 
+ * + * where low_median() is the order statistic of rank (n + 1)/2, and + * high_median() is the order statistic of rank n/2 + 1. + * + * For matrices with less than two elements, this function returns zero. + * + * The constant c = 1.1926 must be used to make the Sn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median + * Absolute Deviation, Journal of the American Statistical Association, + * Vol. 88, pp. 1273-1283. + */ + double Sn() const + { + GenericMatrix A( *this ); + return pcl::Sn( A.Begin(), A.End() ); + } + + /*! + * Returns the Qn scale estimator of Rousseeuw and Croux: + * + *
+    * Qn = c * first_quartile( |x_i - x_j| : i < j )
+    * 
+ * + * where first_quartile() is the order statistic of rank (n + 1)/4. + * + * For matrices with less than two elements, this function returns zero. + * + * The constant c = 2.2219 must be used to make the Qn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median Absolute + * Deviation, Journal of the American Statistical Association, Vol. 88, + * pp. 1273-1283. + */ + double Qn() const + { + GenericMatrix A( *this ); + return pcl::Qn( A.Begin(), A.End() ); + } + +#endif // !__PCL_NO_MATRIX_STATISTICS + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this matrix. + * + * This function calls pcl::Hash64() for the internal matrix data. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const noexcept + { + return pcl::Hash64( m_data->Begin(), m_data->Size(), seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this matrix. + * + * This function calls pcl::Hash32() for the internal matrix data. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const noexcept + { + return pcl::Hash32( m_data->Begin(), m_data->Size(), seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this matrix. This + * function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const noexcept + { + return Hash64( seed ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each matrix element, this function appends a string representation + * (known as a \e token) to the target string \a s. If the matrix contains + * more than one element, successive tokens are separated with the specified + * \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform a matrix element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + const_block_iterator i = m_data->Begin(), j = m_data->End(); + if ( i < j ) + { + s.Append( S( *i ) ); + if ( ++i < j ) + do + { + s.Append( separator ); + s.Append( S( *i ) ); + } + while ( ++i < j ); + } + return s; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each matrix element x, this function appends a string representation + * (known as a \e token) to the target string \a s by calling the \a append + * function: + * + *\code append( s, S( x ) ); \endcode + * + * If the matrix has more than one element, successive tokens are separated + * by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform a + * matrix element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably better to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + const_block_iterator i = m_data->Begin(), j = m_data->End(); + if ( i < j ) + { + append( s, S( *i ) ); + if ( ++i < j ) + { + S p( separator ); + do + { + append( s, p ); + append( s, S( *i ) ); + } + while ( ++i < j ); + } + } + return s; + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return ToSeparated( s, ',' ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return ToSeparated( s, ' ' ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return ToSeparated( s, '\t' ); + } + +#ifndef __PCL_NO_MATRIX_PHASE_MATRICES + + /*! + * Returns the phase correlation matrix for two matrices \a A and \a B. + * \ingroup phase_matrices + */ + static GenericMatrix PhaseCorrelationMatrix( const GenericMatrix& A, const GenericMatrix& B ) + { + if ( B.Rows() != A.Rows() || B.Cols() != A.Cols() ) + throw Error( "Invalid matrix dimensions in PhaseCorrelationMatrix()" ); + GenericMatrix R( A.Rows(), A.Cols() ); + PhaseCorrelationMatrix( R.Begin(), R.End(), A.Begin(), B.Begin() ); + return R; + } + + /*! + * Returns the cross power spectrum matrix for two matrices \a A and \a B. + * \ingroup phase_matrices + */ + static GenericMatrix CrossPowerSpectrumMatrix( const GenericMatrix& A, const GenericMatrix& B ) + { + if ( B.Rows() != A.Rows() || B.Cols() != A.Cols() ) + throw Error( "Invalid matrix dimensions in CrossPowerSpectrumMatrix()" ); + GenericMatrix R( A.Rows(), A.Cols() ); + CrossPowerSpectrumMatrix( R.Begin(), R.End(), A.Begin(), B.Begin() ); + return R; + } + +#endif // !__PCL_NO_MATRIX_PHASE_MATRICES + +#ifndef __PCL_NO_MATRIX_IMAGE_RENDERING + + /*! + * Renders this matrix as an image. + * + * The contents of the specified \a image will be replaced with a grayscale + * rendition of this matrix, where the value of each pixel sample will be + * proportional to its corresponding matrix component counterpart. + * + * Note that if this matrix has out-of-range values for the pixel sample + * type of the target image, pixel saturation will occur at either the white + * or black points, or both. This only happens when the target image is of + * an integer type and this matrix contains floating point values outside + * the normalized [0,1] range. + * + * If the target image is of a floating-point type (either real or complex) + * and this matrix also stores floating point values, the output image may + * require a rescaling or normalization operation to constrain all pixel + * values to the normalized [0,1] range after calling this member function. + */ + template + void ToImage( GenericImage

& image ) const + { + image.AllocateData( Cols(), Rows() ); + typename P::sample* __restrict__ v = *image; + const_block_iterator __restrict__ i = m_data->Begin(); + const_block_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i, ++v ) + *v = P::ToSample( *i ); + } + + /*! + * Renders this matrix as an image. + * + * The contents of the image transported by the specified %ImageVariant + * object will be replaced with a grayscale rendition of this matrix, where + * the value of each pixel sample will be proportional to its corresponding + * matrix component counterpart. + * + * If the specified %ImageVariant does not transport an image, a new one + * will be created in 32-bit floating point format. + * + * Also take into account the information given for + * ToImage( GenericImage& ), relative to out-of-range values, which is + * entirely applicable to this member function. + */ + void ToImage( ImageVariant& image ) const + { + if ( !image ) + image.CreateFloatImage(); + + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: ToImage( static_cast( *image ) ); break; + case 64: ToImage( static_cast( *image ) ); break; + } + else if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: ToImage( static_cast( *image ) ); break; + case 64: ToImage( static_cast( *image ) ); break; + } + else + switch ( image.BitsPerSample() ) + { + case 8: ToImage( static_cast( *image ) ); break; + case 16: ToImage( static_cast( *image ) ); break; + case 32: ToImage( static_cast( *image ) ); break; + } + } + +#endif // !__PCL_NO_MATRIX_IMAGE_RENDERING + +#ifndef __PCL_NO_MATRIX_IMAGE_CONVERSION + + /*! + * Creates a matrix from image pixel samples. + * + * This static member function converts pixel sample values to matrix + * elements for a rectangular region of a channel of the specified \a image. + * + * \param image Image from which matrix elements will be generated. + * + * \param rect A rectangular region in image pixel coordinates, from + * which the returned matrix will be generated. If this + * parameter is not specified, or if an empty rectangle is + * specified, this function will perform the matrix + * conversion for the current rectangular selection in the + * image, that is, for image.SelectedRectangle(). + * + * \param channel Channel index. Must be the zero-based index of an existing + * channel in the image, or an integer < 0. If this parameter + * is not specified, or if a negative integer is specified, + * this function will perform the matrix conversion for the + * currently selected channel in the image, that is, for + * image.SelectedChannel(). + * + * The returned matrix is a representation of the intersection of the + * specified (or implicitly selected) rectangular region with the image for + * the scalar data type T of this matrix instantiation. All predefined pixel + * sample types are supported, including integer, real and complex pixels. + * + * If there is no intersection between the rectangular region and the image, + * or if an invalid channel index is specified, this function returns an + * empty matrix. + * + * Note that if the source image is of a floating point type (either real or + * complex) and the scalar type T of this matrix instantiation is of an + * integer type, out-of-range matrix elements will be truncated to either + * zero or to the maximum integer value, if the corresponding source pixel + * sample is outside the normalized [0,1] range. + */ + template + static GenericMatrix FromImage( const GenericImage

& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + { + Rect r = rect; + if ( !image.ParseSelection( r, channel ) ) + return GenericMatrix(); + + if ( r == image.Bounds() ) + { + GenericMatrix M( image.Height(), image.Width() ); + const typename P::sample* __restrict__ v = image[channel]; + block_iterator __restrict__ i = M.m_data->Begin(); + const_block_iterator __restrict__ j = M.m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i, ++v ) + P::FromSample( *i, *v ); + return M; + } + else + { + int w = r.Width(); + int h = r.Height(); + GenericMatrix M( h, w ); + block_iterator __restrict__ m = M.m_data->Begin(); + PCL_IVDEP + for ( int i = r.y0; i < r.y1; ++i ) + { + const typename P::sample* __restrict__ v = image.PixelAddress( r.x0, i, channel ); + PCL_IVDEP + for ( int j = 0; j < w; ++j ) + P::FromSample( *m++, *v++ ); + } + return M; + } + } + + /*! + * Creates a matrix from image pixel samples. + * + * This static member function converts pixel sample values to matrix + * elements for a rectangular region of a channel of the image transported + * by the specified %ImageVariant. + * + * If the specified %ImageVariant object does not transport an image, this + * member function returns an empty matrix. + * + * Refer to the documentation for + * FromImage( const GenericImage&, const Rect&, int ) for more information + * about the conversion performed by this member function. + */ + static GenericMatrix FromImage( const ImageVariant& image, const Rect& rect = Rect( 0 ), int channel = -1 ) + { + if ( image ) + if ( image.IsFloatSample() ) + switch ( image.BitsPerSample() ) + { + case 32: return FromImage( static_cast( *image ), rect, channel ); + case 64: return FromImage( static_cast( *image ), rect, channel ); + } + else if ( image.IsComplexSample() ) + switch ( image.BitsPerSample() ) + { + case 32: return FromImage( static_cast( *image ), rect, channel ); + case 64: return FromImage( static_cast( *image ), rect, channel ); + } + else + switch ( image.BitsPerSample() ) + { + case 8: return FromImage( static_cast( *image ), rect, channel ); + case 16: return FromImage( static_cast( *image ), rect, channel ); + case 32: return FromImage( static_cast( *image ), rect, channel ); + } + + return GenericMatrix(); + } + +#endif // !__PCL_NO_MATRIX_IMAGE_CONVERSION + +private: + + /*! + * \struct Data + * \internal + * Reference-counted matrix data structure. + */ + struct Data : public ReferenceCounter + { + int n = 0; //!< Number of matrix rows + int m = 0; //!< Number of matrix columns + block_iterator* v = nullptr; //!< Pointer to a pointer to a contiguous block of matrix elements + + Data() = default; + + Data( int rows, int cols ) + { + if ( rows > 0 && cols > 0 ) + Allocate( rows, cols ); + } + + ~Data() + { + Deallocate(); + } + + int Rows() const noexcept + { + return n; + } + + int Cols() const noexcept + { + return m; + } + + size_type NumberOfElements() const noexcept + { + return size_type( n )*size_type( m ); + } + + size_type Size() const noexcept + { + return NumberOfElements()*sizeof( element ); + } + + block_iterator Begin() const + { + block_iterator p = (v != nullptr) ? *v : nullptr; + if ( likely( std::is_scalar::value ) ) + return reinterpret_cast( PCL_ASSUME_ALIGNED_32( p ) ); + return p; + } + + block_iterator End() const noexcept + { + return (v != nullptr) ? *v + NumberOfElements() : nullptr; + } + + element& Element( int i, int j ) const noexcept + { + return v[i][j]; + } + + void Allocate( int rows, int cols ) + { + n = rows; + m = cols; + v = new block_iterator[ n ]; + if ( likely( std::is_scalar::value ) ) + { + *v = reinterpret_cast( PCL_ALIGNED_MALLOC( Size(), 32 ) ); + if ( unlikely( *v == nullptr ) ) + { + delete [] v; + v = nullptr; + n = m = 0; + throw std::bad_alloc(); + } + } + else + *v = new element[ NumberOfElements() ]; + for ( int i = 1; i < n; ++i ) + v[i] = v[i-1] + m; + } + + void Deallocate() + { + PCL_PRECONDITION( refCount == 0 ) + if ( v != nullptr ) + { + if ( likely( std::is_scalar::value ) ) + PCL_ALIGNED_FREE( *v ); + else + delete [] *v; + delete [] v; + v = nullptr; + n = m = 0; + } + } + }; + + /*! + * \internal + * The reference-counted matrix data. + */ + Data* m_data = nullptr; + + /*! + * \internal + * Dereferences matrix data and disposes it if it becomes garbage. + */ + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } + + /*! + * \internal + * Inverts a small matrix of dimension <= 3. + */ + static bool Invert( block_iterator* Ai, const_block_iterator const* A, int n ) noexcept + { + switch ( n ) + { + case 1: + if ( 1 + **A == 1 ) + return false; + **Ai = 1/(**A); + break; + case 2: + { + const_block_iterator __restrict__ A0 = A[0]; + const_block_iterator __restrict__ A1 = A[1]; + element d = A0[0]*A1[1] - A0[1]*A1[0]; + if ( 1 + d == 1 ) + return false; + Ai[0][0] = A1[1]/d; + Ai[0][1] = -A0[1]/d; + Ai[1][0] = -A1[0]/d; + Ai[1][1] = A0[0]/d; + } + break; + case 3: + { + const_block_iterator __restrict__ A0 = A[0]; + const_block_iterator __restrict__ A1 = A[1]; + const_block_iterator __restrict__ A2 = A[2]; + element d1 = A1[1]*A2[2] - A1[2]*A2[1]; + element d2 = A1[2]*A2[0] - A1[0]*A2[2]; + element d3 = A1[0]*A2[1] - A1[1]*A2[0]; + element d = A0[0]*d1 + A0[1]*d2 + A0[2]*d3; + if ( 1 + d == 1 ) + return false; + Ai[0][0] = d1/d; + Ai[0][1] = (A2[1]*A0[2] - A2[2]*A0[1])/d; + Ai[0][2] = (A0[1]*A1[2] - A0[2]*A1[1])/d; + Ai[1][0] = d2/d; + Ai[1][1] = (A2[2]*A0[0] - A2[0]*A0[2])/d; + Ai[1][2] = (A0[2]*A1[0] - A0[0]*A1[2])/d; + Ai[2][0] = d3/d; + Ai[2][1] = (A2[0]*A0[1] - A2[1]*A0[0])/d; + Ai[2][2] = (A0[0]*A1[1] - A0[1]*A1[0])/d; + } + break; + default: // ?! + return false; + } + return true; + } +}; + +// ### N.B.: Visual C++ is unable to compile the next two member functions if +// the following external function declarations are placed within the +// member function bodies. This forces us to implement them after the +// GenericMatrix<> class declaration. + +void PCL_FUNC InPlaceGaussJordan( GenericMatrix&, GenericMatrix& ); +void PCL_FUNC InPlaceGaussJordan( GenericMatrix&, GenericMatrix& ); + +template inline +GenericMatrix GenericMatrix::Inverse() const +{ + if ( Rows() != Cols() || Rows() == 0 ) + throw Error( "Invalid matrix inversion: Non-square or empty matrix." ); + + /* + * - Use direct formulae to invert 1x1, 2x2 and 3x3 matrices. + * - Use Gauss-Jordan elimination to invert 4x4 and larger matrices. + */ + if ( Rows() < 4 ) + { + GenericMatrix Ai( Rows(), Rows() ); + if ( !Invert( Ai.m_data->v, m_data->v, Rows() ) ) + throw Error( "Invalid matrix inversion: Singular matrix." ); + return Ai; + } + else + { + GenericMatrix Ai( *this ); + GenericMatrix B = UnitMatrix( Rows() ); + InPlaceGaussJordan( Ai, B ); + return Ai; + } +} + +template inline +void GenericMatrix::Invert() +{ + if ( Rows() <= 3 ) + Transfer( Inverse() ); + else + { + if ( Rows() != Cols() || Rows() == 0 ) + throw Error( "Invalid matrix inversion: Non-square or empty matrix." ); + EnsureUnique(); + GenericMatrix B = UnitMatrix( Rows() ); + InPlaceGaussJordan( *this, B ); + } +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup matrix_operators Matrix Operators + * + * This section includes scalar-to-matrix and matrix-to-matrix arithmetic + * operator functions that are not members of the GenericMatrix template class. + */ + +/*! + * Returns the sum of two matrices \a A and \a B. + * + * If the specified matrices are incompatible for matrix addition (because + * their dimensions are different), this function throws an Error exception. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator +( const GenericMatrix& A, const GenericMatrix& B ) +{ + if ( B.Rows() != A.Rows() || B.Cols() != A.Cols() ) + throw Error( "Invalid matrix addition." ); + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ t = B.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k, ++t ) + *i = *k + *t; + return R; +} + +/*! + * Returns the sum of a matrix \a A and a scalar \a x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator +( const GenericMatrix& A, const T& x ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k + x; + return R; +} + +/*! + * Returns the sum of a scalar \a x and a matrix \a A. + * + * This function exists to implement the commutative property of + * scalar-to-matrix addition. It is equivalent to A + x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator +( const T& x, const GenericMatrix& A ) +{ + return A + x; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of subtracting a matrix \a B from another matrix \a A. + * + * If the specified matrices are incompatible for matrix subtraction (because + * their dimensions are different), this function throws an Error exception. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator -( const GenericMatrix& A, const GenericMatrix& B ) +{ + if ( B.Rows() != A.Rows() || B.Cols() != A.Cols() ) + throw Error( "Invalid matrix subtraction." ); + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ t = B.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k, ++t ) + *i = *k - *t; + return R; +} + +/*! + * Returns the subtraction of a scalar \a x from a matrix \a A. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator -( const GenericMatrix& A, const T& x ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k - x; + return R; +} + +/*! + * Returns the subtraction of a matrix \a A from a scalar \a x. + * + * This function exists because scalar-to-matrix subtraction is not a + * commutative operation. A - x is not equal to x - A (the resulting matrix + * elements have the same magnitudes but opposite signs). + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator -( const T& x, const GenericMatrix& A ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = x - *k; + return R; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the product of two matrices \a A and \a B. + * + * If the specified matrices are incompatible for matrix multiplication + * (because the number of rows in \a B is not equal to the number of columns in + * \a A), this function throws an appropriate Error exception. + * + * Bear in mind that matrix multiplication has O(N^3) complexity. This is + * relevant to multiply large matrices. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator *( const GenericMatrix& A, const GenericMatrix& B ) +{ + int n = A.Rows(); + int m = B.Cols(); + int p = A.Cols(); + if ( B.Rows() != p ) + throw Error( "Invalid matrix multiplication." ); + GenericMatrix R( n, m ); + for ( int i = 0; i < n; ++i ) + for ( int j = 0; j < m; ++j ) + { + T rij = 0; + for ( int k = 0; k < p; ++k ) + rij += A[i][k] * B[k][j]; + R[i][j] = rij; + } + return R; +} + +/*! + * Returns the product of a matrix \a A by a vector \a x. + * + * If the specified objects are incompatible for multiplication (because the + * number of components in \a x is not equal to the number of columns in \a A), + * this function throws the appropriate Error exception. + * + * The result of the product of a matrix with \e m rows and \e n columns by a + * vector of \e n components is a vector of \e m components. + * + * \ingroup matrix_operators + */ +template inline +GenericVector operator *( const GenericMatrix& A, const GenericVector& x ) +{ + int n = A.Cols(); + int m = A.Rows(); + if ( x.Length() != n ) + throw Error( "Invalid matrix-vector multiplication." ); + GenericVector r( m ); + for ( int i = 0; i < m; ++i ) + { + T ri = 0; + for ( int j = 0; j < n; ++j ) + ri += A[i][j] * x[j]; + r[i] = ri; + } + return r; +} + +/*! + * Returns the product of a matrix \a A and a scalar \a x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator *( const GenericMatrix& A, const T& x ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k * x; + return R; +} + +/*! + * Returns the product of a scalar \a x and a matrix \a A. + * + * This function exists to implement the commutative property of + * scalar-to-matrix multiplication. It is equivalent to A * x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator *( const T& x, const GenericMatrix& A ) +{ + return A * x; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of dividing a matrix \a A by a scalar \a x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator /( const GenericMatrix& A, const T& x ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = *k / x; + return R; +} + +/*! + * Returns the result of dividing a scalar \a x by a matrix \a A. + * + * This function exists because scalar-to-matrix division is not a + * commutative operation. A/x is not equal to x/A. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator /( const T& x, const GenericMatrix& A ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = x / *k; + return R; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of raising a matrix \a A to a scalar \a x. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator ^( const GenericMatrix& A, const T& x ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Pow( *k, x ); + return R; +} + +/*! + * Returns the result of raising a scalar \a x to a matrix \a A. + * + * This function exists because scalar-to-matrix exponentiation is not a + * commutative operation. A^x is not equal to x^A. + * + * \ingroup matrix_operators + */ +template inline +GenericMatrix operator ^( const T& x, const GenericMatrix& A ) +{ + GenericMatrix R( A.Rows(), A.Cols() ); + typename GenericMatrix::block_iterator __restrict__ i = R.Begin(); + typename GenericMatrix::const_block_iterator __restrict__ j = R.End(); + typename GenericMatrix::const_block_iterator __restrict__ k = A.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = pcl::Pow( x, *k ); + return R; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_MATRIX_INSTANTIATE + +/*! + * \defgroup matrix_types Matrix Types + */ + +/*! + * \class pcl::I8Matrix + * \ingroup matrix_types + * \brief 8-bit signed integer matrix. + * + * %I8Matrix is a template instantiation of GenericMatrix for \c int8. + */ +typedef GenericMatrix I8Matrix; + +/*! + * \class pcl::CharMatrix + * \ingroup matrix_types + * \brief 8-bit signed integer matrix. + * + * %CharMatrix is an alias for I8Matrix. It is a template instantiation of + * GenericMatrix for \c int8. + */ +typedef I8Matrix CharMatrix; + +/*! + * \class pcl::UI8Matrix + * \ingroup matrix_types + * \brief 8-bit unsigned integer matrix. + * + * %UI8Matrix is a template instantiation of GenericMatrix for \c uint8. + */ +typedef GenericMatrix UI8Matrix; + +/*! + * \class pcl::ByteMatrix + * \ingroup matrix_types + * \brief 8-bit unsigned integer matrix. + * + * %ByteMatrix is an alias for UI8Matrix. It is a template instantiation of + * GenericMatrix for \c uint8. + */ +typedef UI8Matrix ByteMatrix; + +/*! + * \class pcl::I16Matrix + * \ingroup matrix_types + * \brief 16-bit signed integer matrix. + * + * %I16Matrix is a template instantiation of GenericMatrix for \c int16. + */ +typedef GenericMatrix I16Matrix; + +/*! + * \class pcl::UI16Matrix + * \ingroup matrix_types + * \brief 16-bit unsigned integer matrix. + * + * %UI16Matrix is a template instantiation of GenericMatrix for \c uint16. + */ +typedef GenericMatrix UI16Matrix; + +/*! + * \class pcl::I32Matrix + * \ingroup matrix_types + * \brief 32-bit signed integer matrix. + * + * %I32Matrix is a template instantiation of GenericMatrix for \c int32. + */ +typedef GenericMatrix I32Matrix; + +/*! + * \class pcl::IMatrix + * \ingroup matrix_types + * \brief 32-bit signed integer matrix. + * + * %IMatrix is an alias for I32Matrix. It is a template instantiation of + * GenericMatrix for \c int32. + */ +typedef I32Matrix IMatrix; + +/*! + * \class pcl::UI32Matrix + * \ingroup matrix_types + * \brief 32-bit unsigned integer matrix. + * + * %UI32Matrix is a template instantiation of GenericMatrix for \c uint32. + */ +typedef GenericMatrix UI32Matrix; + +/*! + * \class pcl::UIMatrix + * \ingroup matrix_types + * \brief Unsigned integer matrix. + * + * %UIMatrix is an alias for UI32Matrix. It is a template instantiation of + * GenericMatrix for \c uint32. + */ +typedef UI32Matrix UIMatrix; + +/*! + * \class pcl::I64Matrix + * \ingroup matrix_types + * \brief 64-bit integer matrix. + * + * %I64Matrix is a template instantiation of GenericMatrix for \c int64. + */ +typedef GenericMatrix I64Matrix; + +/*! + * \class pcl::UI64Matrix + * \ingroup matrix_types + * \brief 64-bit unsigned integer matrix. + * + * %UI64Matrix is a template instantiation of GenericMatrix for \c uint64. + */ +typedef GenericMatrix UI64Matrix; + +/*! + * \class pcl::F32Matrix + * \ingroup matrix_types + * \brief 32-bit floating point real matrix. + * + * %F32Matrix is a template instantiation of GenericMatrix for \c float. + */ +typedef GenericMatrix F32Matrix; + +/*! + * \class pcl::FMatrix + * \ingroup matrix_types + * \brief 32-bit floating point real matrix. + * + * %FMatrix is an alias for F32Matrix. It is a template instantiation of + * GenericMatrix for \c float. + */ +typedef F32Matrix FMatrix; + +/*! + * \class pcl::F64Matrix + * \ingroup matrix_types + * \brief 64-bit floating point real matrix. + * + * %F64Matrix is a template instantiation of GenericMatrix for \c double. + */ +typedef GenericMatrix F64Matrix; + +/*! + * \class pcl::DMatrix + * \ingroup matrix_types + * \brief 64-bit floating point real matrix. + * + * %DMatrix is an alias for F64Matrix. It is a template instantiation of + * GenericMatrix for \c double. + */ +typedef F64Matrix DMatrix; + +/*! + * \class pcl::Matrix + * \ingroup matrix_types + * \brief 64-bit floating point real matrix. + * + * %Matrix is an alias for DMatrix. It is a template instantiation of + * GenericMatrix for the \c double type. + */ +typedef DMatrix Matrix; + +/*! + * \class pcl::C32Matrix + * \ingroup matrix_types + * \brief 32-bit floating point complex matrix. + * + * %C32Matrix is a template instantiation of GenericMatrix for \c Complex32. + */ +typedef GenericMatrix C32Matrix; + +/*! + * \class pcl::C64Matrix + * \ingroup matrix_types + * \brief 64-bit floating point complex matrix. + * + * %C64Matrix is a template instantiation of GenericMatrix for \c Complex64. + */ +typedef GenericMatrix C64Matrix; + +#ifndef _MSC_VER + +/*! + * \class pcl::F80Matrix + * \ingroup matrix_types + * \brief 80-bit extended precision floating point real matrix. + * + * %F80Matrix is a template instantiation of GenericMatrix for \c long + * \c double. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef GenericMatrix F80Matrix; + +/*! + * \class pcl::LDMatrix + * \ingroup matrix_types + * \brief 80-bit extended precision floating point real matrix. + * + * %LDMatrix is an alias for F80Matrix. It is a template instantiation of + * GenericMatrix for \c long \c double. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef F80Matrix LDMatrix; + +#endif // !_MSC_VER + +#endif // !__PCL_NO_MATRIX_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Matrix_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Matrix.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MeanFilter.h b/3rdparty/include/pcl/MeanFilter.h new file mode 100644 index 0000000..f7c87df --- /dev/null +++ b/3rdparty/include/pcl/MeanFilter.h @@ -0,0 +1,182 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MeanFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MeanFilter_h +#define __PCL_MeanFilter_h + +/// \file pcl/MeanFilter.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MeanFilter + * \brief Square block average kernel filter + * + * A %MeanFilter object is a specialized KernelFilter whose elements are + * identical and form a square symmetrically distributed around the origin: + * + * M(x,y) = 1/(s^2) + * + * where s is the filter size, which is the same on the horizontal and vertical + * axes. This filter is separable. + * + * %MeanFilter is a building block of some important algorithms on the + * PixInsight/PCL platform, such as the Multiscale Local Normalization, + * algorithm, which uses these kernels to compute local variances. + * + * \sa KernelFilter, VariableShapeFilter, MoffatFilter, LinearFilter, + * GaussianFilter + */ +class PCL_CLASS MeanFilter : public KernelFilter +{ +public: + + /*! + * Constructs an empty %MeanFilter object. + */ + MeanFilter() = default; + + /*! + * Constructs a %MeanFilter object given the odd kernel size \a n >= 3, or + * an empty kernel filter if \a n = 0. Assigns an optional \a name to the + * new filter object. + */ + MeanFilter( int n, const String& name = String() ) + { + Initialize( n ); + Rename( name ); + } + + /*! + * Copy constructor. + */ + MeanFilter( const MeanFilter& ) = default; + + /*! + * Move constructor. + */ + MeanFilter( MeanFilter&& ) = default; + + /*! + */ + KernelFilter* Clone() const override + { + return new MeanFilter( *this ); + } + + /*! + * Returns a separable filter equivalent to this Gaussian kernel filter. + * + * A block average filter is always separable, so this member function + * should always return a valid SeparableFilter object. + */ + SeparableFilter AsSeparableFilter( float tolerance = __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE ) const override + { + FVector v = coefficients.RowVector( Size()>>1 ); + return SeparableFilter( v, v ); + } + + /*! + * Returns true iff this filter is separable. + * + * A block average filter is separable. As reimplemented in %MeanFilter, + * this member function returns true. + */ + bool IsSeparable() const override + { + return true; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MeanFilter& operator =( const MeanFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MeanFilter& operator =( MeanFilter&& ) = default; + + /*! + * Recalculates filter coefficients for the given odd kernel size \a n >= 3. + */ + void Resize( int n ) override + { + Initialize( n ); + } + +private: + + void Initialize( int n ) + { + PCL_PRECONDITION( n == 0 || n >= 3 && (n & 1) != 0 ) + KernelFilter::Resize( n ); + if ( !IsEmpty() ) + coefficients = 1.0/NumberOfCoefficients(); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MeanFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MeanFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Memory.h b/3rdparty/include/pcl/Memory.h new file mode 100644 index 0000000..35fc63e --- /dev/null +++ b/3rdparty/include/pcl/Memory.h @@ -0,0 +1,241 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Memory.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Memory_h +#define __PCL_Memory_h + +#include + +// Template formal parameters: +// +// FI Forward iterator +// BI Bidirectional iterator +// RI Random access iterator +// UP Unary predicate +// BP Binary predicate +// T Item type +// F Function + +// ### TODO: Document this file + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +template inline +void Fill( FI i, FI j, const T& v ) +{ + for ( ; i != j; ++i ) + *i = v; +} + +// ---------------------------------------------------------------------------- + +template inline +void Fill( FI i, FI j, const T& v, F f ) +{ + for ( ; i != j; ++i ) + f( *i, v ); +} + +// ---------------------------------------------------------------------------- + +template inline +FI1 Copy( FI1 i1, FI2 i2, FI2 j2 ) +{ + for ( ; i2 != j2; ++i1, ++i2 ) + *i1 = *i2; + return i1; +} + +// ---------------------------------------------------------------------------- + +template inline +FI1 Copy( FI1 i1, FI2 i2, FI2 j2, F f ) +{ + for ( ; i2 != j2; ++i1, ++i2 ) + f( *i1, *i2 ); + return i1; +} + +// ---------------------------------------------------------------------------- + +template inline +BI1 CopyBackward( BI1 j1, BI2 i2, BI2 j2 ) +{ + while ( i2 != j2 ) + *--j1 = *--j2; + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +BI1 CopyBackward( BI1 j1, BI2 i2, BI2 j2, F f ) +{ + while ( i2 != j2 ) + f( *--j1, *--j2 ); + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +BI1 CopyReversed( BI1 j1, FI2 i2, FI2 j2 ) +{ + for ( ; i2 != j2; ++i2 ) + *--j1 = *i2; + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +BI1 CopyReversed( BI1 j1, FI2 i2, FI2 j2, F f ) +{ + for ( ; i2 != j2; ++i2 ) + f( *--j1, *i2 ); + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +RI1 Move( RI1 i1, RI2 i2, RI2 j2 ) +{ + RI1 j1; + if ( i1 < i2 ) + j1 = Copy( i1, i2, j2 ); + else + { + j1 = i1 + (j2-i2); + CopyBackward( j1, i2, j2 ); + } + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +RI1 Move( RI1 i1, RI2 i2, RI2 j2, F f ) +{ + RI1 j1; + if ( i1 < i2 ) + j1 = Copy( i1, i2, j2, f ); + else + { + j1 = i1 + (j2-i2); + CopyBackward( j1, i2, j2, f ); + } + return j1; +} + +// ---------------------------------------------------------------------------- + +template inline +RI1 MoveBackward( RI1 j1, RI2 i2, RI2 j2 ) +{ + RI1 i1; + if ( j2 < j1 ) + i1 = CopyBackward( j1, i2, j2 ); + else + { + i1 = j1 - (j2-i2); + Copy( i1, i2, j2 ); + } + return i1; +} + +// ---------------------------------------------------------------------------- + +template inline +RI1 MoveBackward( RI1 j1, RI2 i2, RI2 j2, F f ) +{ + RI1 i1; + if ( j2 < j1 ) + i1 = CopyBackward( j1, i2, j2, f ); + else + { + i1 = j1 - (j2-i2); + Copy( i1, i2, j2, f ); + } + return i1; +} + +// ---------------------------------------------------------------------------- + +template inline +void Replace( FI i, FI j, const T1& v1, const T2& v2 ) +{ + for ( ; i != j; ++i ) + if ( *i == v1 ) + *i = v2; +} + +// ---------------------------------------------------------------------------- + +template inline +void Replace( FI i, FI j, const T1& v1, const T2& v2, BP p ) +{ + for ( ; i != j; ++i ) + if ( p( *i, v1 ) ) + *i = v2; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Memory_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Memory.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MercatorProjection.h b/3rdparty/include/pcl/MercatorProjection.h new file mode 100644 index 0000000..fb14b02 --- /dev/null +++ b/3rdparty/include/pcl/MercatorProjection.h @@ -0,0 +1,134 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MercatorProjection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MercatorProjection_h +#define __PCL_MercatorProjection_h + +/// \file pcl/MercatorProjection.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MercatorProjection + * \brief Mercator projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS MercatorProjection : public ProjectionBase +{ +public: + + /*! + * Default constructor. + */ + MercatorProjection() = default; + + /*! + * Copy constructor. + */ + MercatorProjection( const MercatorProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new MercatorProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "MER"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Mercator"; + } + +protected: + + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override; + + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override; + +private: + + double m_r0 = Const::deg(); + double m_x0 = 0; + double m_y0 = 0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MercatorProjection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MercatorProjection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MessageBox.h b/3rdparty/include/pcl/MessageBox.h new file mode 100644 index 0000000..adb793e --- /dev/null +++ b/3rdparty/include/pcl/MessageBox.h @@ -0,0 +1,337 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MessageBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MessageBox_h +#define __PCL_MessageBox_h + +/// \file pcl/MessageBox.h + +#include + +#include +#include + +#ifndef __PCL_MSGBOX_DONT_REMOVE_PREVIOUS_DECLARATION +/* + * Remove conflicting identifiers from Win32 SDK headers. + * + * Unfortunately, MessageBox is #defined as a macro in winuser.h, and this may + * cause problems with our code on Windows platforms. + * + * If for some eccentric reason you really want to use the Win32 API MessageBox + * function (why should you?), then call either MessageBoxA() or MessageBoxW(). + */ +# ifdef MessageBox +# undef MessageBox +# endif +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::StdIcon + * \brief Standard MessageBox icons. + * + * + * + * + * + * + * + *
StdIcon::NoIcon No icon will be shown on the %MessageBox
StdIcon::Question Standard question mark icon
StdIcon::Information Standard information icon
StdIcon::Warning Standard warning icon
StdIcon::Error Standard error icon
+ */ +namespace StdIcon +{ + enum value_type + { + NoIcon, + Question, + Information, + Warning, + Error, + + NumberOfStandardIcons + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::StdButton + * \brief Standard MessageBox buttons. + * + * + * + * + * + * + * + * + * + * + * + * + *
StdButton::NoButton No button
StdButton::Ok Ok button
StdButton::Cancel Cancel button
StdButton::Yes Yes button
StdButton::No No button
StdButton::Abort Abort button
StdButton::Retry Retry button
StdButton::Ignore Ignore button
StdButton::YesToAll Yes to All button
StdButton::NoToAll No to All button
+ */ +namespace StdButton +{ + enum value_type + { + NoButton, + Ok, + Cancel, + Yes, + No, + Abort, + Retry, + Ignore, + YesToAll, + NoToAll, + + NumberOfStandardButtons + }; +} + +// ---------------------------------------------------------------------------- + +class MessageBoxPrivate; + +/*! + * \class MessageBox + * \brief High-level interface to a PixInsight %MessageBox object. + * + * A %MessageBox object executes as a modal window relative to PixInsight's + * main window. Message boxes are useful to show brief messages, to notify + * errors, warnings and other special conditions, and to obtain simple answers + * (yes/no, ok/cancel, and so on) from the user. + * + * \sa Dialog + */ +class PCL_CLASS MessageBox +{ +public: + + /*! + * Represents a standard message box icon. + */ + typedef StdIcon::value_type std_icon; + + /*! + * Represents a standard message box button. + */ + typedef StdButton::value_type std_button; + + /*! + * Constructs a %MessageBox object. + * + * \param text The text that will be shown on the message box's client + * area. Can be either plain text or include basic html tags + * like \, \\, \\, \\, + * \\, etc. + * + * \param caption The caption of the message box window. If an empty string + * is specified, the platform will assign a default caption. + * + * \param icon The message box icon. By default, no icon appears on a + * message box. + * + * \param button0,button1,button2 Specify up to three buttons that will be + * included on the bottom row of this message box. By default a + * message box includes just an Ok standard button. + * + * \param defaultButtonIdx The button index (from 0 to 2) of the + * default button on this dialog box. The default + * button will be activated when the user presses the Return or + * Enter keys. + * + * \param escapeButtonIdx The button index (from 0 to 2) of the button + * that will be activated when the user presses the Escape key, + * or when (s)he closes the message box window explicitly. If a + * value < 0 is specified (the default value), pressing the Esc + * key simply cancels the dialog and forces a return value of + * StdButton::Cancel. + */ + MessageBox( const String& text = String(), + const String& caption = String(), // default caption + std_icon icon = StdIcon::NoIcon, + std_button button0 = StdButton::Ok, + std_button button1 = StdButton::NoButton, + std_button button2 = StdButton::NoButton, + int defaultButtonIdx = 0, + int escapeButtonIdx = -1 ); // escape cancels dialog + + /*! + * Destroys a %MessageBox object. + */ + virtual ~MessageBox(); + + /*! + * Executes this message box modally. Returns a StdButton identifier + * corresponding to the button that the user activated to close the message + * box. + * + * For example, when the user clicks on the Ok button (if that button has + * been included in this message box), this function returns StdButton::Ok. + */ + std_button Execute(); + + /*! + * Returns the last modal result, or StdButton::NoButton if this box has not + * been executed previously. + */ + std_button Result() const; + + /*! + * Returns the text that this message box shows on its client area. + */ + String Text() const; + + /*! + * Sets the \a text to be shown on the client area of this message box. + */ + void SetText( const String& text ); + + /*! + * Returns the caption text of this message box. + */ + String Caption() const; + + /*! + * Sets the caption \a text of this message box. + */ + void SetCaption( const String& text ); + + /*! + * Returns the icon that will be shown on this message box. + */ + std_icon Icon() const; + + /*! + * Sets the \a icon that will be shown on this message box. + */ + void SetIcon( std_icon icon ); + + /*! + * Returns the identifier of the first button on this message box. + */ + std_button FirstButton() const; + + /*! + * Sets the first button on this message box. + */ + void SetFirstButton( std_button button ); + + /*! + * Returns the identifier of the second button on this message box. + */ + std_button SecondButton() const; + + /*! + * Sets the second button on this message box. + */ + void SetSecondButton( std_button button ); + + /*! + * Returns the identifier of the third button on this message box. + */ + std_button ThirdButton() const; + + /*! + * Sets the third button on this message box. + */ + void SetThirdButton( std_button button ); + + /*! + * Returns the index, from 0 to 2, of the default button on this + * message box. + * + * The default button will be activated if the user presses the Return or + * Enter keys. + */ + int DefaultButtonIndex() const; + + /*! + * Sets the index, from 0 to 2, of the default button on this + * message box. + */ + void SetDefaultButtonIndex( int index ); + + /*! + * Returns the index, from 0 to 2, of the escape button on this + * message box. + * + * The escape button will be activated if the user presses the Escape key, + * or if (s)he closes the message box's window explicitly. + */ + int EscapeButtonIndex() const; + + /*! + * Sets the index, from 0 to 2, of the escape button on this + * message box. + */ + void SetEscapeButtonIndex( int index ); + +private: + + AutoPointer p; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MessageBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MessageBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MetaFileFormat.h b/3rdparty/include/pcl/MetaFileFormat.h new file mode 100644 index 0000000..427b0df --- /dev/null +++ b/3rdparty/include/pcl/MetaFileFormat.h @@ -0,0 +1,895 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MetaFileFormat.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MetaFileFormat_h +#define __PCL_MetaFileFormat_h + +/// \file pcl/MetaFileFormat.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS FileFormatImplementation; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaFileFormat + * \brief A formal description of an image file format in PixInsight. + * + * %MetaFileFormat provides a formal description of the basic functionality and + * properties of an image file format in a PixInsight module. + * + * A module implements an \e installable file format as a derived class of + * %MetaFileFormat. Such subclass describes general properties of the file + * format, and also provides the basic mechanisms to instantiate a format and + * to generate duplicates of existing format instances. + * + * %MetaFileFormat and its subclasses don't implement any file handling + * capabilities. Actual file access work must be implemented through a + * format instance implementation class, which is always a subclass of + * the FileFormatImplementation class in the PixInsight/PCL framework. + * + * In PixInsight's terminology, a format instance can be thought of as + * an image stored as a disk file of the format in question, although the + * concept of format instances allows for more flexible, generalized + * interpretations. + * + * Note that the %MetaFileFormat and FileFormatImplementation classes are + * conceptually parallel to MetaProcess and ProcessImplementation, + * respectively. In the same way, a process is to a format like a process + * instance is to a format instance in PixInsight. This is just a reflection of + * the strong object orientation that characterizes the PixInsight platform. + * + * Each file format must have a unique name, or \e identifier. Identifiers are + * crucial for many key features of the PixInsight environment, as scripts, the + * command-line interface, image icons and image containers, etc. + * + * \sa MetaObject, FileFormatBase, FileFormat, FileFormatImplementation, + * FileFormatInstance + */ +class PCL_CLASS MetaFileFormat : public MetaObject, public FileFormatBase +{ +public: + + /*! + * Constructs a %MetaFileFormat object. + */ + MetaFileFormat(); + + /*! + * Destroys this %MetaFileFormat object. + */ + virtual ~MetaFileFormat() noexcept( false ) + { + } + + /*! + * Copy constructor. This constructor is disabled because %MetaFileFormat + * represents unique server-side objects. + */ + MetaFileFormat( const MetaFileFormat& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %MetaFileFormat + * represents unique server-side objects. + */ + MetaFileFormat& operator =( const MetaFileFormat& ) = delete; + + /*! + */ + virtual IsoString Name() const override = 0; + + /*! + */ + virtual StringList FileExtensions() const override = 0; + + /*! + * Returns a list of MIME types corresponding to the data supported by + * this file format. + * + * The returned list must be a sequence of "media_type/content_type" items + * approved by IANA (see http://www.iana.org/assignments/media-types/), for + * example: "image/fits", "application/fits". + * + * Providing a list of MIME types is not mandatory, but highly recommended + * for all format support modules implementing standard (i.e., recognized by + * IANA) image formats. + * + * \note The default implementation of this function returns an empty + * string list, so by default a format does not provide a set of supported + * MIME types. This is legal, but considered bad practice when the format + * implements a standard image format recognized by IANA. + */ + IsoStringList MimeTypes() const override + { + return IsoStringList(); + } + + /*! + */ + uint32 Version() const override; + + /*! + * Returns a brief description text for this file format. + * + * This function must provide a simple, typically single-line, description + * of this image file format for quick reference. Example: "Flexible Image + * Transport System". The Implementation() member function has been designed + * to provide a more complete description of a format's functionality and + * capabilities. + * + * \note The default implementation of this function returns an empty + * string, so by default a format does not provide a description. This is + * legal, but it is considered bad practice, so this function \e should be + * reimplemented. + */ + String Description() const override + { + return String(); + } + + /*! + * Returns a descriptive text about this implementation of a particular + * image file format. + * + * This function must provide a brief but sufficiently informative + * description of this file format implementation. The returned description + * will appear on the Format Explorer window, and should provide information + * about how this format has been implemented in a module. Avoid too + * exhaustive descriptions that are better reserved for a technical manual. + * Avoid also describing a file format itself; the information given should + * not intend to replace an official/formal definition of an image format. + * + * Descriptions of file format implementations are always written on + * PixInsight consoles. This means that the text output functionality of the + * Console class can be used to format the string returned by this function. + * Refer to that class and its documentation for further information. + * + * \note The default implementation of this function returns an empty + * string, so by default a format does not provide an implementation + * description. This is legal, but it is considered bad practice, so this + * function \e should be reimplemented. + */ + String Implementation() const override + { + return String(); + } + + /*! + * Returns a description of the current status of this file format + * implementation. + * + * This function should return an empty string for normal file format + * implementations. Exceptions to this rule are obsolete or deprecated file + * formats (see the IsDeprecated() member function), deficient + * implementations, or other special cases where the user should be aware of + * important potential problems or limitations. + * + * The output of this function should be essentially plain text with basic + * HTML tags. No console tags should be used. + * + * \note The default implementation of this function returns an empty + * string, so by default a format does not provide any status information. + */ + String Status() const override + { + return String(); + } + + /*! + * Returns the icon image of this file format as a document in SVG format. + * + * The specified image will be used to identify all instances of this file + * format in the core application's GUI. It will be used on the %Format + * Explorer window, on image icons of this format, and in general for every + * graphical item related to this format or to an instance of this format. + * + * The returned string must be the source code of a valid SVG document + * representing the icon image, encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVGFile() return an empty string, or + * if the specified SVG document does not exist or is not valid, a default + * icon will be assigned to this format automatically by the PixInsight core + * application. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVGFile() + */ + virtual IsoString IconImageSVG() const + { + return IsoString(); + } + + /*! + * Returns the icon image of this file format as a document in SVG format, + * stored as an external file. + * + * The specified image will be used to identify all instances of this file + * format in the core application's GUI. It will be used on the %Format + * Explorer window, on image icons of this format, and in general for every + * graphical item related to this format or to an instance of this format. + * + * The returned string must be a path to an existing file in the local + * file system (remote resources are not supported in current PCL versions), + * which must store a valid SVG document representing the icon image. The + * SVG source code must be encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVG() return an empty string, or if + * the specified SVG document does not exist or is not valid, a default icon + * will be assigned to this format automatically by the PixInsight core + * application. + * + * Automatic Resource Location + * + * Format icon image files can be loaded from arbitrary locations on the + * local file system. However, modules typically install their file format + * icons on the /rsc/icons/module directory under the local PixInsight + * installation. A module can specify the "@module_icons_dir/" prefix in + * icon file paths to let the PixInsight core application load the + * corresponding SVG documents from the appropriate standard distribution + * directory automatically. For example, suppose that a "Bar" file format, + * pertaining to a "Foo" module, reimplements this member function in its + * %MetaFileFormat derived class as follows: + * + * \code + * class Bar : public MetaFileFormat + * { + * public: + * ... + * + * String IconImageSVGFile() const override + * { + * return "@module_icons_dir/Bar.svg"; + * } + * + * ... + * }; + * \endcode + * + * Then the core application will attempt to load the following SVG file: + * + * <install-dir>/rsc/icons/module/Foo/Bar.svg + * + * where <install-dir> is the local directory where the running + * PixInsight core application is installed. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVG() + */ + virtual String IconImageSVGFile() const + { + return String(); + } + + /*! + * Returns a large icon for this format as an image in the + * standard XPM format. + * + * The specified image will be used to identify all instances of this file + * format in the core application's GUI. It will be used on the %Format + * Explorer window, on image icons of this format, and in general for every + * graphical item related to this format or to an instance of this format. + * + * 32-bit RGBA color images (including an alpha channel) are fully + * supported. + * + * If this function returns nullptr, a default icon will be assigned to this + * file format automatically. + * + * \note The default implementation of this function returns nullptr. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define file format icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa IconImageFile() + */ + virtual const char** IconImageXPM() const + { + return nullptr; + } + + /*! + * Returns a large icon for this format as a path specification to + * an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on format icon images, see the documentation for + * IconImageXPM(). + * + * \note The default implementation of this function returns an empty + * string. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define file format icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa IconImageXPM() + */ + virtual String IconImageFile() const + { + return String(); + } + + /*! + * Returns a small icon for this format as an image in the + * standard XPM format. + * + * For details on format icon images, see the documentation for + * IconImageXPM(). + * + * Small icons are used on interface elements where screen space must be + * preserved. Two good examples are the Format Explorer window and the + * ImageContainer interface. + * + * When this function is not reimplemented in a derived class, the core + * PixInsight application automatically generates a small icon by resampling + * down the large icon provided by IconImageXPM(). + * + * You normally should not need to reimplement this function; the core + * application does a fine work resampling large icons to obtain reduced + * versions. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define file format icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa SmallIconImageFile() + */ + virtual const char** SmallIconImageXPM() const + { + return 0; + } + + /*! + * Returns a small icon for this format as a path specification to + * an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on small format icon images, see the documentation for + * SmallIconImageXPM(). + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define file format icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa SmallIconImageXPM() + */ + virtual String SmallIconImageFile() const + { + return String(); + } + + /*! + */ + Bitmap Icon() const override; + + /*! + */ + Bitmap SmallIcon() const override; + + /*! + * Returns true only if this file format implementation can read an entire + * image in a single operation. + * + * The default implementation returns true. + */ + bool CanRead() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation can write an entire + * image in a single operation. + * + * The default implementation returns true. + */ + bool CanWrite() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation supports + * incremental read operations on image files. + * + * Incremental read operations allow the PixInsight core application and + * other modules to load images by successive row strips. + * + * The default implementation returns false. + */ + bool CanReadIncrementally() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation supports + * incremental write operations on image files. + * + * Incremental write operations allow the PixInsight core application and + * other modules to write images by successive row strips. + * + * The default implementation returns false. + */ + bool CanWriteIncrementally() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write 8-bit + * unsigned integer images + * + * The default implementation returns true. + */ + bool CanStore8Bit() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation can read/write + * 16-bit unsigned integer images + * + * The default implementation returns true. + */ + bool CanStore16Bit() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit unsigned integer images + * + * The default implementation returns false. + */ + bool CanStore32Bit() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit unsigned integer images + * + * The default implementation returns false. + */ + bool CanStore64Bit() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit floating point real images (IEEE 754 32-bit single + * precision format for pixel sample values). + * + * The default implementation returns false. + */ + bool CanStoreFloat() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit floating point real images (IEEE 754 64-bit double + * precision format for pixel sample values). + * + * The default implementation returns false. + */ + bool CanStoreDouble() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * 32-bit floating point complex images (IEEE 754 32-bit single + * precision format for components of complex pixel sample values). + * + * The default implementation returns false. + */ + bool CanStoreComplex() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * 64-bit floating point complex images (IEEE 754 64-bit double + * precision format for components of complex pixel sample values). + * + * The default implementation returns false. + */ + bool CanStoreDComplex() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can read/write + * grayscale pixel data. + * + * The default implementation returns true. + */ + bool CanStoreGrayscale() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation can read/write RGB + * color pixel data. + * + * The default implementation returns true. + */ + bool CanStoreRGBColor() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation supports alpha + * image channels. + * + * The default implementation returns true. + */ + bool CanStoreAlphaChannels() const override + { + return true; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * image resolution data. + * + * The default implementation returns false. + */ + bool CanStoreResolution() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can embed/extract + * FITS header keyword collections. + * + * The default implementation returns false. + */ + bool CanStoreKeywords() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can embed/extract + * ICC color profiles. + * + * The default implementation returns false. + */ + bool CanStoreICCProfiles() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can embed/extract + * thumbnail images. + * + * The default implementation returns false. + */ + bool CanStoreThumbnails() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * data properties associated with format instances or image files. + * + * \note Don't confuse this member function with CanStoreImageProperties(). + * This function returns true if the implementation can store properties + * associated with an entire file or format instance, while + * CanStoreImageProperties() returns true if the implementation can store + * properties associated with individual images. + * + * The default implementation returns false. + * + * \sa CanStoreImageProperties(), SupportsViewProperties() + */ + bool CanStoreProperties() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * properties associated with individual images. + * + * The default implementation returns false. + * + * \sa CanStoreProperties(), SupportsViewProperties() + */ + bool CanStoreImageProperties() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * RGB working space data. + * + * The default implementation returns false. + */ + bool CanStoreRGBWS() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * DisplayFunction objects. + * + * The default implementation returns false. + */ + bool CanStoreDisplayFunctions() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation can store/retrieve + * color filter array (CFA) descriptions. + * + * The default implementation returns false. + */ + bool CanStoreColorFilterArrays() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation supports compression + * of pixel data. + * + * This refers to compression of \e source pixels, not to native compression + * schemes used by some file formats. + * + * For examle, the compression schemes employed in the JPEG and JPEG2000 + * formats must \e not cause this member function to return true. The + * optional ZIP and LZW compressions used in TIFF are the exact kind of + * compressions that must cause this member function to return true. + * + * The default implementation returns false. + */ + bool SupportsCompression() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation supports multiple + * images stored in a single file. + * + * For example, multiple images (e.g., taken with different filters) can be + * stored in FITS files by means of FITS image extensions, forming a + * data cube of several images with the same dimensions, or even a + * collection of independent images. + * + * The default implementation returns false. + */ + bool SupportsMultipleImages() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation supports data + * properties of different data types such as Float64, UI32Vector, String, + * Complex32, etc. + * + * If this member function returns true, a reimplementation of + * CanStoreProperties() and/or CanStoreImageProperties() (depending on + * format capabilities) must also return true, and the format must implement + * all property data types supported by View objects. For information on + * supported view property types, see the VTYPE_XXX predefined constants in + * PCL API headers. + * + * This function should return false if this format only supports storage of + * BLOB properties, represented as ByteArray objects, or a limited subset of + * view property types. + * + * The default implementation returns false. + * + * \sa CanStoreProperties(), CanStoreImageProperties(), + * View::PropertyValue(), View::SetPropertyValue() + */ + bool SupportsViewProperties() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation allows the user to + * edit specific format preferences. + * + * If this function returns true, then the EditPreferences() procedure must + * be reimplemented in a derived class. + * + * The default implementation returns false. + */ + bool CanEditPreferences() const override + { + return false; + } + + /*! + * Returns true only if this file format implementation uses + * format-specific data. + * + * Format-specific data are preserved on a per-instance (say per-file) basis + * by the PixInsight application, who actually knows nothing about them. + * + * The default implementation returns false. + * + * \sa ValidateFormatSpecificData(), DisposeFormatSpecificData() + */ + bool UsesFormatSpecificData() const override + { + return false; + } + + /*! + * Returns true only if this file format has been deprecated or declared + * obsolete on the PixInsight platform. + * + * When this function returns true, the Status() member function should also + * return information about the current status of this file format, + * including an explanation of the reasons for deprecation. + * + * The default implementation returns false. + */ + bool IsDeprecated() const override + { + return false; + } + + /*! + */ + bool ValidateFormatSpecificData( const void* data ) const override; + + /*! + */ + void DisposeFormatSpecificData( void* data ) const override; + + /*! + * Handles a request to edit format preferences. Returns true iff the + * preferences were successfully edited. + * + * When implemented, this procedure should open a dialog box to let the + * user edit format-specific preferences and operating options. This + * function should only return true if the user accepts the new settings + * (e.g. by clicking the dialog's OK button). + * + * \note This member function will never be called if the + * CanEditPreferences() member function is not reimplemented to return true. + */ + bool EditPreferences() const override; + + /*! + * Creates a new instance of this file format. + * + * Typically, we have a %MetaFileFormat descendant class describing an image + * file format in generic terms, and a FileFormatImplementation descendant + * class implementing format instantiation (i.e. doing actual file reading, + * writing, embedding, etc.). + * + * \note This is a pure virtual function that must be reimplemented in all + * derived classes. + */ + virtual FileFormatImplementation* Create() const = 0; + +private: + + void PerformAPIDefinitions() const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_MetaFileFormat_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MetaFileFormat.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MetaModule.h b/3rdparty/include/pcl/MetaModule.h new file mode 100644 index 0000000..244a4c3 --- /dev/null +++ b/3rdparty/include/pcl/MetaModule.h @@ -0,0 +1,1037 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MetaModule.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MetaModule_h +#define __PCL_MetaModule_h + +/// \file pcl/MetaModule.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaModule + * \brief A formal description of a PixInsight module. + * + * %MetaModule is the root element in the hierarchical structure of components + * that constitute every PixInsight module. This class provides a formal + * description of the basic functionality and properties of a module. + * + * Every PixInsight module must define a \e unique subclass of %MetaModule. + * That subclass, besides describing the module, will be the primary interface + * between all module components (processes, file formats and interfaces) and + * the PixInsight core application. + * + * In any PixInsight module, there exists a \e unique instance of a derived + * class of %MetaModule, accessible as a global pointer variable declared in + * the pcl namespace, namely: + * + * \code + * namespace pcl + * { + * extern MetaModule* Module; + * } // pcl + * \endcode + * + * The entire tree of existing module components can always be accessed by + * using the MetaObject::operator[]( size_type ) operator function recursively, + * starting from the \c Module global variable. + * + * \sa MetaObject, MetaProcess, MetaParameter, MetaFileFormat + */ +class MetaModule : public MetaObject +{ +public: + + /*! + * Constructs a %MetaModule object. + */ + MetaModule(); + + /*! + * Destroys a %MetaModule object and all of its child module components. + * + * This function effectively destroys \e all existing module components by + * indirect recursion of MetaObject::~MetaObject(). + */ + virtual ~MetaModule(); + + /*! + * Copy constructor. This constructor is disabled because %MetaModule + * represents unique server-side objects. + */ + MetaModule( const MetaModule& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %MetaModule represents + * unique server-side objects. + */ + MetaModule& operator =( const MetaModule& ) = delete; + + /*! + * \deprecated This member function has been deprecated. It is maintained for + * compatibility with existing code - do not use it in newly produced code. + */ + virtual const char* UniqueId() const; + + /*! + * Returns a version information string for this PixInsight module. + * + * This member function must be reimplemented to return the + * starting address of an invariant sequence of 8-bit characters. The + * returned character string shall have the following format: + * + * PIXINSIGHT_MODULE_VERSION_\\ + * + * where: + * + * * PIXINSIGHT_MODULE_VERSION_ is a mandatory prefix. It must be included + * literally at the beginning of the returned string. + * + * * \ is a mandatory version string composed by + * at least 17 characters. It must have the following format: + * + * MM.mm.rr.bbbb.LLL[.\] + * + * where MM is the major version number, mm is the minor + * version number, rr is the release version number, and bbbb + * is a build number. The three version numbers must be in the + * range from zero to 99. The build number must be in the range from 1 to + * 9999. The four numbers must be left padded with zeros in the returned + * string, if necessary, and their values are supposed to increase with each + * successive version of the module. + * + * LLL is a three-letter ISO 639.2 language code, which must correspond to + * the primary language of the module (generally, the language used to write + * visible messages and information of the user interface). + * + * \ is an optional version status word. If included, it can be one + * of the following: + * + * alpha Indicates an alpha version of the module (a version at the early + * development stages, where the final features and functionality + * of the module still have not been defined). + * + * beta Indicates a beta version of the module (a development version + * that still is not suitable for production release). + * + * rc\ A release candidate version (an almost finished version, still + * under development but very close to a final release). \ is + * an arbitrary release candidate number. + * + * release Indicates a release (final, production) version. + * + * exp An experimental version (a special development version, not + * intended for public release; usually a confidential version + * distributed among the members of a development team) + * + * If no status is specified in the version information string, a release + * version will be assumed. + * + * \note This is a pure virtual function that must be reimplemented by all + * derived classes. + * + * \sa GetVersion() + */ + virtual const char* Version() const = 0; + + /*! + * Provides the version numbers, language code and development status of + * this module. + * + * \param[out] major Main (major) version number. + * + * \param[out] minor Secondary (minor) version number. + * + * \param[out] release Release number. + * + * \param[out] build Build number. + * + * \param[out] language An ISO 639.2 language code (3-letter code) that + * identifies the primary language of this module. + * + * \param[out] status A string indicating the development status of + * this module (alpha, beta, release, etc.), or an empty string + * if no specific status has been specified. For possible + * values and their meanings, see the documentation for the + * Version() member function. + * + * This is a utility function, provided for convenience. It parses the + * version information string returned by the Version() member + * function, and stores the extracted values in the specified argument + * variables. + * + * \sa Version() + */ + void GetVersion( int& major, int& minor, int& release, int& build, + IsoString& language, IsoString& status ) const; + + /*! + * Returns a readable version string for this module of the form: + * + * <module-name> version M.m.r.b + * + * where <module-name> is the string returned by the (reimplemented) + * Name() virtual member function, and M.m.r.b are the major, minor, release + * and build numbers, as provided by GetVersion(). + * + * The string returned by this member function is suitable to be used for + * module identification purposes, including metadata such as FITS keywords. + */ + IsoString ReadableVersion() const; + + /*! + * Returns an identifier for this module. + * + * The returned string must be a valid C identifier. The identifier must be + * unique among the identifiers of all installed modules in the calling + * instance of the PixInsight core application. + * + * This function is not intended to provide a descriptive name, but just a + * reference identifier for this module. For example, some identifiers of + * standard PixInsight modules are: Geometry, Image, FITS. + * + * \note This is a pure virtual function that must be reimplemented by all + * derived classes. + */ + virtual IsoString Name() const = 0; + + /*! + * Provides a \e brief description of this module. + * + * This function is not intended to give a thorough description, but just a + * succint sentence to quickly identify this module and its contents. + * + * Example of good module description: + * "MyFancyCrop Process Module". + * + * Example of \e bad module description: + * "This module implements MyFancyCrop: A high-performance process to + * crop and rotate images arbitrarily.". + * + * \note Reimplementing this function in a derived class is optional. + * However, this function \e should be reimplemented by all modules, to + * provide meaningful information to the users during module installation + * procedures. + */ + virtual String Description() const + { + return String(); + } + + /*! + * Returns the name of the software company responsible for the development + * of this module. + * + * Please don't advertise your company here. A module returning something + * like "MySoftwareCompany - Advanced Imaging Solutions for the Serious + * Imager" wouldn't be certified. + * + * \note Reimplementing this function is optional, but advisable. + */ + virtual String Company() const + { + return String(); + } + + /*! + * Returns the name of the author or authors of this module. + * + * To specify multiple author names, separate them with commas. + * + * \note Reimplementing this function is optional, but advisable. + */ + virtual String Author() const + { + return String(); + } + + /*! + * Provides copyright information for this module. + * + * Example: "Copyright (c) 2007, MySoftwareCompany. All Rights + * Reserved". + * + * \note Reimplementing this function is optional, but advisable. + */ + virtual String Copyright() const + { + return String(); + } + + /*! + * Returns a string with a trade mark or a list of trade marks. + * + * To specify multiple trade marks, separate them with commas. + * + * \note Reimplementing this function is optional. + */ + virtual String TradeMarks() const + { + return String(); + } + + /*! + * Returns the original file name of this module. + * + * \note Reimplementing this function is optional. + */ + virtual String OriginalFileName() const + { + return String(); + } + + /*! + * Provides release date information for this module. + * + * \param[out] year The (full) year this module has been released. + * + * \param[out] month The month this module has been released, + * 1 <= month <= 12, 1=January. + * + * \param[out] day The day this module has been released, + * 1 <= day <= 31. + * + * The specified date must be correct; for example, something like + * 2007/02/30 will not be accepted (the module won't install). + * + * \note Reimplementing this function is optional. If it is not + * reimplemented by a derived class to return a valid date, the module will + * provide no specific release date. + */ + virtual void GetReleaseDate( int& year, int& month, int& day ) const + { + year = month = day = 0; // unspecified + } + + /*! + * Acquires current physical memory statistics. + * + * \param[out] totalBytes On output, an estimate of the total amount of + * existing physical memory in bytes. + * + * \param[out] availableBytes On output, an estimate of the amount of + * memory in bytes that can be allocated by the + * caller without pushing the system into swap, + * taking into account memory being used for file + * caches that can be reclaimed. + * + * The current platform-dependent implementation provides accurate values on + * supported versions of FreeBSD, Linux, macOS, and Windows. + * + * Returns true if the required system calls and external processes were + * executed correctly and provided valid values. Returns false in the event + * of error, in which case the passed variables could be modified, possibly + * with meaningless values. + * + * \sa AvailablePhysicalMemory(), PhysicalMemoryLoad() + */ + bool GetPhysicalMemoryStatus( size_type& totalBytes, size_type& availableBytes ) const; + + /*! + * Returns an estimate of how much free memory is currently available. + * + * This function returns the amount of memory in bytes that can be allocated + * by the caller without pushing the system into swap, taking into account + * memory being used for file caches that can be reclaimed. The current + * platform-dependent implementation returns accurate values on supported + * versions of FreeBSD, Linux, macOS, and Windows. + * + * The returned value is zero in the event of error. In theory this can only + * happen on Linux if /proc/meminfo cannot be accessed, which should never + * happen on a healthy system under normal working conditions. + */ + size_type AvailablePhysicalMemory() const + { + size_type dum, availableBytes; + if ( GetPhysicalMemoryStatus( dum, availableBytes ) ) + return availableBytes; + return 0; + } + + /*! + * Returns an estimate of the fraction of physical memory currently in use. + * + * This function acquires estimates of the total amount of existing physical + * memory and the amount of memory that can be currently allocated by the + * caller without causing the system to swap. See AvailablePhysicalMemory() + * for more information. + * + * The returned value is zero in the event of error, or in the range (0,1) + * if valid, representing the fraction of physical memory that is currently + * allocated, excluding memory used for reclaimable file caches. + */ + float PhysicalMemoryLoad() const + { + size_type totalBytes, availableBytes; + if ( GetPhysicalMemoryStatus( totalBytes, availableBytes ) ) + return float( 1 - double( availableBytes )/totalBytes ); + return 0; + } + + /*! + * Module allocation routine. Allocates a contiguous block of \a sz bytes, + * and returns its starting address. + * + * This routine is called by PCL internal code, and indirectly by the + * PixInsight core application. + * + * The default implementation simply calls ::operator new( sz ) to allocate + * a block of the specified size. + * + * You usually should not need to reimplement this function, unless you want + * to implement a special memory management strategy for your module. + * + * \sa Deallocate() + */ + virtual void* Allocate( size_type sz ) + { + PCL_PRECONDITION( sz != 0 ) + return reinterpret_cast( ::operator new( sz ) ); + } + + /*! + * Module deallocation routine. Deallocates a previously allocated + * contiguous block of memory starting at address \a p. + * + * This routine is called by PCL internal code, and indirectly by the + * PixInsight core application. + * + * The default implementation simply calls ::operator delete( p ) to free + * the specified block. + * + * You usually should not need to reimplement this function, unless you want + * to implement a special memory management strategy for your module. + * + * \sa Allocate() + */ + virtual void Deallocate( void* p ) + { + PCL_PRECONDITION( p != nullptr ) + ::operator delete( p ); + } + + /*! + * Routine invoked just after this module has been installed. + * + * This function can be reimplemented to perform module-specific + * initialization procedures. + * + * \sa OnUnload() + */ + virtual void OnLoad() + { + } + + /*! + * Routine invoked just before this module is unloaded in response to an + * uninstall request, or just before the PixInsight core application is + * about to terminate execution. + * + * This function can be reimplemented to perform module-specific + * finalization procedures. + * + * \sa OnLoad() + */ + virtual void OnUnload() + { + } + + /*! + * Returns true iff this module has been successfully installed. Only when + * the module has been installed, communication with the PixInsight core + * application is fully operative. + */ + bool IsInstalled() const; + + /*! + * Processes pending user interface and thread events. + * + * Call this function from the root thread (aka GUI thread) to let + * the PixInsight core application process pending interface events, which + * may accumulate while your code is running. + * + * Modules typically call this function during real-time preview generation + * procedures. Calling this function from the root thread ensures that the + * GUI remains responsive during long, calculation-intensive operations. + * + * If the \a excludeUserInputEvents parameter is set to true, no user input + * events will be processed by calling this function. This includes mainly + * mouse and keyboard events. Unprocessed input events will remain pending + * and will be processed as appropriate when execution returns to + * PixInsight's main event handling loop, or when this function is called + * with \a excludeUserInputEvents set to false. + * + * When this function is invoked from a running thread, a ProcessAborted + * exception will be thrown automatically if the Thread::Abort() member + * function has been previously called for the running thread. This allows + * stopping running processes in a thread-safe and controlled way. For more + * information, read the documentation for the Thread class. + * + * \note Do not call this function too frequently from the root thread, as + * doing so may degrade the performance of the whole PixInsight graphical + * interface. For example, calling this function at 250 ms intervals is + * reasonable and more than sufficient in most cases. Normally, you should + * only need to call this function during real-time image and graphics + * generation procedures, or from time-consuming processes, especially from + * multithreaded code. + * + * \sa Thread, Thread::Abort() + */ + void ProcessEvents( bool excludeUserInputEvents = false ); + + /*! + * Loads a bitmap resource file. + * + * \param filePath Path to a resource file in Qt's binary resource format + * (RCC format). This path must point to a location on the + * local file system (remote resources are not allowed in + * current PCL versions). + * + * \param rootPath Root path for all the loaded bitmap resources. This + * parameter is an empty string by default. + * + * If the specified resource file does not exist or is invalid, this + * function will throw an Error exception. + * + * Automatic Resource Location + * + * Resource files can be loaded from arbitrary locations. However, modules + * typically install their resources on the /rsc/rcc/module directory under + * the local PixInsight installation. A module can specify the + * "@module_rcc_dir/" prefix in resource file paths to let the + * PixInsight core application load the resources from the appropriate + * standard distribution directory automatically. For example, if a module + * whose name is "Foo" makes the following call: + * + * \code LoadResource( "@module_rcc_dir/MyResources.rcc" ); \endcode + * + * the core application will attempt to load the following resource file: + * + * <install-dir>/rsc/rcc/module/Foo/MyResources.rcc + * + * where <install-dir> is the local directory where the running + * PixInsight core application is installed. + * + * Resource Root Paths + * + * All the resources loaded by a call to this function will be rooted at the + * specified \a rootPath under a standard ":/module/<module-name>/" + * root path prefix set by the PixInsight core application automatically. + * For example, if the Foo module calls this function as follows: + * + * \code LoadResource( "@module_rcc_dir/MyResources.rcc" ); \endcode + * + * and the MyResources.rcc file contains a resource named "foo-icon.png", it + * will be available at the following resource path: + * + * :/module/Foo/foo-icon.png + * + * This system guarantees that a module will never invalidate or replace + * existing resources loaded by the core application or other modules. Note + * that a module still can cause problems by loading resources incorrectly, + * but these problems cannot propagate outside the failing module. + * + * To ease working with module-defined resources, the standard + * ":/@module_root/" prefix can be specified in resource file paths: + * + * \code Bitmap bmp( ":/@module_root/foo-icon.png" ); \endcode + * + * Continuing with the Foo module example, this call would load the bitmap + * at ":/module/Foo/foo-icon.png". + * + * \b References + * + * \li The Qt Resource System: http://doc.qt.io/qt-5/resources.html + * + * \sa UnloadResource() + */ + void LoadResource( const String& filePath, const String& rootPath = String() ); + + /*! + * Unloads a bitmap resource file. + * + * After calling this function, all the resources available from the + * specified resource file will be unavailable. The \a filePath and + * \a rootPath arguments must be identical to the ones used when the + * resource was loaded by a call to LoadResource(). + * + * If the specified resource has not been loaded, or if there are active + * references to the resource (for example, because one or more existing + * Bitmap objects depend on data stored in the resource), this function + * will throw an Error exception. + * + * \sa LoadResource() + */ + void UnloadResource( const String& filePath, const String& rootPath = String() ); + + /*! + * Executes a script in the platform's core scripting engine. + * + * \param sourceCode A string containing valid source code in the + * specified \a language. + * + * \param language The name of a supported scripting language. + * Currently only the JavaScript language is supported + * by this function. JavaScript is assumed if this + * string is either empty or equal to "JavaScript". + * + * Returns the result value of the executed script. The result value is the + * value of the last executed expression statement in the script that is not + * in a function definition. + * + * The script will be executed in the core JavaScript Runtime (PJSR). All + * PJSR resources are available. + * + * If the script cannot be evaluated, for example because it has syntax + * errors, or attempts to execute invalid code, or throws an exception, this + * member function throws an Error exception. + * + * \note This function can only be called from the root thread, since the + * core JavaScript engine in not reentrant in current versions of + * PixInsight. Calling this function from a running thread will throw an + * Error exception. + * + * \warning You should make sure that your code has been well tested before + * calling this function. PixInsight pursues efficiency and script execution + * is no exception. Nothing will protect or watch your code, or help you + * stop it at any point. If your code enters an infinite loop, it will crash + * the whole PixInsight platform without remedy. Also bear in mind that + * scripts are extremely powerful and potentially dangerous if you don't + * know well what you are doing. What happens during execution of your + * scripts is your entire responsibility. + */ + Variant EvaluateScript( const String& sourceCode, const IsoString& language = IsoString() ); + + /*! + * Returns true iff the module has the specified security \a entitlement. + * + * Entitlements are special permissions granted to installed modules by the + * PixInsight core application, as part of the implemented code security + * infrastructure. + * + * An entitlement may be necessary to perform certain operations considered + * potentially dangerous, either for the user or for the PixInsight + * platform. Entitlements can also be required by running process and format + * instances to perform specific actions. + * + * String representations of entitlements normally follow the inverse URL + * format. For example: "com.pixinsight.security.pcl.experimental-features". + */ + bool HasEntitlement( const IsoString& entitlement ); + +private: + + void PerformAPIDefinitions() const override; + + friend class APIInitializer; +}; + +// ---------------------------------------------------------------------------- + +extern MetaModule* Module; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::InstallMode + * \brief Module installation modes. + * + * This namespace enumerates module installation modes that the PixInsight core + * application passes to the module installation entry point (PMINS). See the + * \ref module_entry_points "Module Entry Points" section for detailed + * information. + * + * The current installation modes are:\n + * + * + * + * + * + *
InstallMode::FullInstall Normal, full installation
InstallMode::QueryModuleInfo Temporary load to gather module properties
InstallMode::VerifyModule Temporary load to verify module integrity
+ */ +namespace InstallMode +{ + enum value_type + { + FullInstall, // Normal, full installation + QueryModuleInfo, // Temporary load to gather module properties + VerifyModule // Temporary load to verify module integrity + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup metamodule_utility_macros MetaModule Utility Macros + */ + +/*! + * \def PCL_MODULE_UNIQUE_ID + * \deprecated This macro has been deprecated. It is kept as part of PCL for + * compatibility with existing modules. Do not use it in newly + * produced code. + * \ingroup metamodule_utility_macros + */ +#define PCL_MODULE_UNIQUE_ID( uid ) \ + ("PIXINSIGHT_MODULE_UNIQUE_ID_" PCL_STRINGIFY( uid )) + +/*! + * \def PCL_MODULE_VERSION + * \brief A utility macro to build a module version string. + * \ingroup metamodule_utility_macros + * + * \param MM The main (major) version number of the module. Must be an + * integer in the range from 0 to 99, and must be left-padded with + * a zero, when necessary. + * + * \param mm The second (minor) version number of the module. Must be an + * integer in the range from 0 to 99, and must be left-padded with + * a zero, when necessary. + * + * \param rr The revision version number of the module. Must be an integer in + * the range from 0 to 99, and must be left-padded with a zero, + * when necessary. + * + * \param bbbb The build version number of the module. Must be an integer in + * the range from 1 to 9999, and must be left-padded with a maximum + * of three zeros, as necessary. + * + * \param lan The primary language of the module. Must be a valid ISO 639.2 + * language code (a 3-letter code identifying a language). + * + * This macro generates a string literal with the mandatory + * "PIXINSIGHT_MODULE_VERSION_" prefix prepended to the actual module version + * string, which is composed by concatenation of the specified macro arguments. + * + * Example: + * + * \code + * #define MODULE_VERSION_MAJOR 01 + * #define MODULE_VERSION_MINOR 00 + * #define MODULE_VERSION_REVISION 02 + * #define MODULE_VERSION_BUILD 0045 + * #define MODULE_VERSION_LANGUAGE eng + * ... + * #include + * ... + * class MyModule : public pcl::MetaModule + * { + * // Define your module class here + * }; + * ... + * const char* MyModule::Version() const + * { + * return PCL_MODULE_VERSION( MODULE_VERSION_MAJOR, + * MODULE_VERSION_MINOR, + * MODULE_VERSION_REVISION, + * MODULE_VERSION_BUILD, + * MODULE_VERSION_LANGUAGE ); + * } + * \endcode + * + * In the example above, the Version() member of MyModule would return the + * following version string: + * + * "PIXINSIGHT_MODULE_VERSION_01.00.02.0045.eng" + * + * \sa PCL_MODULE_VERSION_S, PCL_MODULE_UNIQUE_ID + */ +#define PCL_MODULE_VERSION( MM, mm, rr, bbbb, lan ) \ + ("PIXINSIGHT_MODULE_VERSION_" \ + PCL_STRINGIFY( MM ) "." \ + PCL_STRINGIFY( mm ) "." \ + PCL_STRINGIFY( rr ) "." \ + PCL_STRINGIFY( bbbb ) "." \ + PCL_STRINGIFY( lan )) + +/*! + * \def PCL_MODULE_VERSION_S + * \brief A utility macro to build a module version string, including a + * development status specification. + * \ingroup metamodule_utility_macros + * + * This macro is an extension of the PCL_MODULE_VERSION macro. It generates a + * version string that also includes a development status, specified + * as the \a status macro argument. + * + * The \a status argument can have the following values: + * + * alpha For an alpha development status + * + * beta For a beta development status + * + * release For a release (final) version + * + * rc\ For a release candidate version, where \ is the release + * candidate number. + * + * exp For an experimental version (usually a development version not + * intended for public release). + * + * Other values are not recognized by the platform and cause rejection of a + * module for installation. + * + * This macro generates a string that is suitable to be returned by a + * reimplementation of MetaModule::Version(). An example follows: + * + * Example: + * + * \code + * #define MODULE_VERSION_MAJOR 01 + * #define MODULE_VERSION_MINOR 00 + * #define MODULE_VERSION_REVISION 02 + * #define MODULE_VERSION_BUILD 0045 + * #define MODULE_VERSION_LANGUAGE eng + * #define MODULE_VERSION_STATUS rc3 + * ... + * #include + * ... + * class MyModule : public pcl::MetaModule + * { + * // Define your module class here + * }; + * ... + * const char* MyModule::Version() const + * { + * return PCL_MODULE_VERSION_S( MODULE_VERSION_MAJOR, + * MODULE_VERSION_MINOR, + * MODULE_VERSION_REVISION, + * MODULE_VERSION_BUILD, + * MODULE_VERSION_LANGUAGE, + * MODULE_VERSION_STATUS ); + * } + * \endcode + * + * In the example above, the Version() member of MyModule would return the + * following version string: + * + * "PIXINSIGHT_MODULE_VERSION_01.00.02.0045.eng.rc3" + * + * \sa PCL_MODULE_VERSION, PCL_MODULE_UNIQUE_ID + */ +#define PCL_MODULE_VERSION_S( MM, mm, rr, bbbb, lan, status ) \ + ("PIXINSIGHT_MODULE_VERSION_" \ + PCL_STRINGIFY( MM ) "." \ + PCL_STRINGIFY( mm ) "." \ + PCL_STRINGIFY( rr ) "." \ + PCL_STRINGIFY( bbbb ) "." \ + PCL_STRINGIFY( lan ) "." \ + PCL_STRINGIFY( status )) + +// ---------------------------------------------------------------------------- + +} // pcl + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup module_entry_points Module Entry Point Functions + * + * Module entry points are special functions required for module installation + * and initialization. Entry points are called directly by the PixInsight core + * application and must be implemented following the standard 'C' naming and + * calling conventions as nonstatic, publicly visible global symbols. + * + * In current versions of the PixInsight platform, there are two mandatory + * module entry points, namely the identification and initialization entry + * points (known as PMIDN and PMINI, respectively), and an optional (although + * usually necessary) installation entry point (PMINS). We describe these + * special functions in detail in this section. + * + * \n + *

PixInsight Module Identification (PMIDN) entry point

+ * + * This function will be called by the PixInsight core application when it + * needs to retrieve identification and descriptive data from a module. This + * happens when a module is about to be installed, but also when a module is + * being inspected, either for security reasons or after a direct user request. + * + * A PMIDN must have the following declaration: + * + * \code + * PCL_MODULE_EXPORT uint32 IdentifyPixInsightModule( api_module_description** description, int32 phase ); + * \endcode + * + * \param description Pointer to a pointer to an API module description + * structure. See the declaration of api_module_description in + * API/APIDefs.h for details. This structure must be provided by the + * called module as POD, and its starting address must be written to + * the pointer pointed to by this argument in a call to this function + * with \a phase = 1 (see below). + * + * \param phase Module identification request:\n + * \li \a phase = 0x00 - Prepare for module identification.\n + * \li \a phase = 0x01 - Report module descriptive data in a structure + * of type 'api_module_description', whose address must be stored in + * the pointer pointed to by the \a description argument.\n + * \li \a phase = 0xff - Module identification process completed. The + * module description structure provided when \a phase = 1 can be + * deallocated and disposed as necessary. + * + * Other values of \a phase may be passed in additional calls to a PMIDN. Those + * values and calls are reserved for special modules pertaining to the core of + * the PixInsight platform, and hence not in the user land. In current versions + * of PixInsight, such special calls must be ignored by the invoked module. + * + * A PMIDN must return zero upon success. Any other return value will be + * interpreted as a module-specific error code. + * + * Module developers using the standard PixInsight Class Library (PCL) + * distribution don't have to care about PMIDN, since it is already implemented + * internally by PCL. + * + * \note A PMIDN is mandatory for all PixInsight modules, and must be + * implemented as a nonstatic, publicly visible global symbol following the + * standard 'C' naming and calling conventions. The PCL_MODULE_EXPORT macro + * guarantees these conditions on all supported C++ compilers. + * + * \n + *

PixInsight Module Initialization (PMINI) entry point

+ * + * This function will be called by the PixInsight core application when a + * module is being installed. It provides a module with the necessary elements + * to perform a bidirectional communication with the core application via the + * standard PCL API callback system. + * + * A PMINI must have the following declaration: + * + * \code + * PCL_MODULE_EXPORT uint32 InitializePixInsightModule( api_handle hModule, function_resolver R, uint32 apiVersion, void* reserved ); + * \endcode + * + * \param hModule Handle to the module being installed. This handle + * uniquely identifies the module, and must be used in all + * subsequent API calls requiring a module handle. + * + * \param R Pointer to an API function resolver callback. See the + * declaration of function_resolver in API/APIDefs.h and + * the automatically generated file pcl/APIInterface.cpp + * for details. + * + * \param apiVersion API version number. + * + * \param reserved Reserved for special invocations to core platform + * modules. Must not be used or altered in any way. + * + * A PMINI must return zero upon success. Any other return value will be + * interpreted as a module-specific error code. + * + * Module developers using the standard PixInsight Class Library (PCL) + * distribution don't have to care about PMINI, since it is already implemented + * internally by PCL. + * + * \note A PMINI is mandatory for all PixInsight modules, and must be + * implemented as a nonstatic, publicly visible global symbol following the + * standard 'C' naming and calling conventions. The PCL_MODULE_EXPORT macro + * guarantees these conditions on all supported C++ compilers. + * + * \n + *

PixInsight Module Installation (PMINS) entry point

+ * + * If this function is defined as a public symbol in a module, the PixInsight + * core application will call it just after loading and initializing the module + * shared object or dynamic-link library. This happens after calling the + * mandatory module entry points PMIDN and PMINI. + * + * A PMINS must have the following declaration: + * + * \code + * PCL_MODULE_EXPORT int32 InstallPixInsightModule( int32 mode ); + * \endcode + * + * \param mode Specifies the kind of installation being performed by + * the PixInsight core application. See the + * pcl::InstallMode namespace for more information. + * + * A PMINS must return zero upon successful installation. Any other return + * value will be interpreted as a module-specific error code. + * + * Although a PMINS is optional, it normally has to be defined by non-trivial + * modules in order to create and initialize the different objects and + * meta-objects required to implement their functionality, since most of these + * objects are dynamic in PCL. See the source code of the open-source standard + * modules for examples. Look for <module_name>Module.cpp files. + * + * \note If available, a PMINS must be implemented as a nonstatic, publicly + * visible global symbol following the standard 'C' naming and calling + * conventions. The PCL_MODULE_EXPORT macro guarantees these conditions on all + * supported C++ compilers. + */ + +// ---------------------------------------------------------------------------- + +// end global namespace + +#endif // __PCL_MetaModule_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MetaModule.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MetaObject.h b/3rdparty/include/pcl/MetaObject.h new file mode 100644 index 0000000..a0a9dcb --- /dev/null +++ b/3rdparty/include/pcl/MetaObject.h @@ -0,0 +1,192 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MetaObject.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MetaObject_h +#define __PCL_MetaObject_h + +/// \file pcl/MetaObject.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaObject + * \brief Root base class for all PixInsight module components. + * + * In PCL, a \e metaobject is a special class describing in formal terms the + * functionality and properties of a \e component in a PixInsight module. + * + * The %MetaObject class provides basic functionality to implement the existing + * hierarchical relationships between a module and all of its components. A + * %MetaObject contains a list of %MetaObject instances, which generates a tree + * structure based on parent-children container relations. This structural + * layout has been used in PCL to automatize communication between the core + * PixInsight application, modules, and all module components. + * + * \sa MetaModule, MetaProcess, MetaParameter, MetaFileFormat + */ +class PCL_CLASS MetaObject +{ +public: + + /*! + * A container used to implement the list of children module components in + * %MetaObject. + */ + typedef IndirectArray children_list; + + /*! + * Constructs a %MetaObject as a child of the specified \a parent object. + */ + MetaObject( MetaObject* parent ) + : m_parent( parent ) + { + if ( m_parent != nullptr ) + m_parent->m_children.Add( this ); + } + + /*! + * Destroys this %MetaObject and all of its children module components. + */ + virtual ~MetaObject() noexcept( false ) + { + m_children.Destroy(); + } + + /*! + * Copy constructor. Copy semantics are disabled for %MetaObject because + * this class represents unique server-side objects. + */ + MetaObject( const MetaObject& ) = delete; + + /*! + * Copy assignment. Copy semantics are disabled for %MetaObject because + * this class represents unique server-side objects. + */ + MetaObject& operator =( const MetaObject& ) = delete; + + /*! + * Move constructor. Move semantics are disabled for %MetaObject because + * because of parent-child server-side object relations. + */ + MetaObject( MetaObject&& x ) = delete; + + /*! + * Move assignment. Move semantics are disabled for %MetaObject because + * because of parent-child server-side object relations. + */ + MetaObject& operator =( MetaObject&& x ) = delete; + + /*! + * Returns the number of module components that depend on this %MetaObject. + */ + size_type Length() const + { + return m_children.Length(); + } + + /*! + * Returns a pointer to the unmodifiable parent %MetaObject. + */ + const MetaObject* Parent() const + { + return m_parent; + } + + /*! + * Returns a pointer to the parent %MetaObject. + */ + MetaObject* Parent() + { + return m_parent; + } + + /*! + * Returns a pointer to a %MetaObject children module component, selected by + * its array index \a i. + */ + const MetaObject* operator[]( size_type i ) const + { + return m_children[i]; + } + +protected: + + MetaObject* m_parent = nullptr; + children_list m_children; + + /*! + * \internal + */ + virtual void PerformAPIDefinitions() const = 0; + + friend class MetaModule; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_MetaObject_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MetaObject.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MetaParameter.h b/3rdparty/include/pcl/MetaParameter.h new file mode 100644 index 0000000..624c62a --- /dev/null +++ b/3rdparty/include/pcl/MetaParameter.h @@ -0,0 +1,1999 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MetaParameter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MetaParameter_h +#define __PCL_MetaParameter_h + +/// \file pcl/MetaParameter.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +#include // DBL_MAX + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS MetaProcess; +class PCL_CLASS MetaTable; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaParameter + * \brief Root base class for PCL classes providing formal descriptions of + * process parameters. + * + * %MetaParameter represents a process parameter. This is an abstract + * base class providing fundamental functionality common to all process + * parameters available in PCL. Derived classes implement and extended that + * functionality to represent a wide variety of process parameter types. + * + * %Process parameters can be numerical values (MetaInteger and MetaReal, and + * their derived classes with different ranges), Boolean values (MetaBoolean), + * enumerated types (MetaEnumeration), and dynamic strings (MetaString). + * + * In addition, a set of arbitrary process parameters can be organized to + * define the columns of a table parameter (MetaTable). A table + * parameter can have an unlimited, variable number of rows. + * + * Finally, block parameters (MetaBlock) can also be defined to store + * arbitrary data as memory blocks of variable size. + * + * \sa MetaProcess, ProcessImplementation + */ +class PCL_CLASS MetaParameter : public MetaObject +{ +public: + + /*! + * Constructs a metaparameter representing a parameter of the specified + * process class \a *P. + */ + MetaParameter( MetaProcess* P ); + + /*! + * Constructs a metaparameter representing a column of a table process + * parameter represented by the metatable \a *T. The new metaparameter is + * appended to the list of existing columns in the metatable \a *T. + */ + MetaParameter( MetaTable* T ); + + /*! + * Destroys a %MetaParameter object. + */ + virtual ~MetaParameter() noexcept( false ) + { + } + + /*! + * Returns the identifier of the process parameter that this metaparameter + * represents. + * + * Each process parameter must have a valid, unique (within its parent + * process) C identifier. + * + * \sa Aliases() + */ + virtual IsoString Id() const = 0; + + /*! + * Returns a list of alias identifiers for this process parameter. + * + * A process parameter can have one or more alias identifiers. + * Aliased parameters are useful to maintain compatibility with previous + * versions of a process. + * + * When the PixInsight core application imports a process instance (e.g. + * from a process icon) it automatically replaces alias parameter + * identifiers with actual (current) identifiers. This allows a developer to + * change the identifiers of some process parameters without breaking + * compatibility with process instances in existing icon collections or + * projects. + * + * The returned string is a comma-separated list of identifiers that will be + * treated as synonyms to the actual identifier of this parameter, which is + * returned by the Id() member function. Two parameters of a process can't + * have the same alias, so each identifier included in the list must be + * unique within its parent process. + * + * \note The default implementation of this member function returns an empty + * string (no aliases). + * + * \sa Id() + */ + virtual IsoString Aliases() const + { + return IsoString(); + } + + /*! + * Returns true iff actual process parameters represented by this + * metaparameter require explicit unlock calls. + * + * An explicit unlock is a call to ProcessImplementation::UnlockParameter(), + * which always happens after an initial call to + * ProcessImplementation::LockParameter(). + * + * \note The default implementation of this function returns false, so a + * process parameter is not explicitly unlocked by default. + */ + virtual bool NeedsUnlocking() const + { + return false; + } + + /*! + * Returns true iff actual process parameters represented by this + * metaparameter require explicit validation. + * + * An explicit validation occurs when the PixInsight core application + * performs a call to ProcessImplementation::ValidateParameter(), either as + * part of a process instance execution, or indirectly because a module has + * requested it by calling ProcessInstance::Validate(). + * + * For example, suppose that you define an integer parameter for a process. + * The MetaInteger class is a descendant of MetaNumeric, which allows you to + * define a valid range of values. This is sufficient to automatically + * reject any actual parameter value outside the declared range. But suppose + * that only \e odd integer values (1, 3, 5, 7 ...) are valid values for the + * parameter in question. The only way to impose such restriction is + * reimplementing this function to return true, and the corresponding + * ProcessImplementation::ValidateParameter() function to reject any even + * integer value. + * + * \note The default implementation of this function returns false, so a + * process parameter is never validated by default, unless a module + * explicitly requests validation of a process instance. + */ + virtual bool NeedsValidation() const + { + return false; + } + + // ### Undocumented + virtual uint32 FirstProcessVersion() const + { + return 0; + } + + // ### Undocumented + virtual uint32 LastProcessVersion() const + { + return 0; + } + + /*! + * Returns true iff the process parameter represented by this metaparameter + * is required to build new process instances. Returns false if a default + * value can be valid for the process parameter when an actual value is not + * available. + * + * When a new instance is being constructed and the represented process + * parameter is not present, this function is called to decide whether a + * default, automatically generated value may be acceptable, or if the + * explicit presence of an actual value for the represented parameter is + * imprescindible. + * + * For example, if you implement a new version of an existing process, + * perhaps you will define new parameters as well. The new parameters will + * not be available in existing stored instances (e.g., in PSM files, or + * scripts) of previous versions. In this case, if you can provide plausible + * default values for the new parameters, and you don't reimplement this + * function for them, then the old process instances will still be reusable. + * + * \note The default implementation of this function returns false, so + * actual parameter values are not strictly required by default. + */ + virtual bool IsRequired() const + { + return false; + } + + /*! + * Returns true if this metaparameter represents a read-only process + * parameter. Otherwise full read/write access to this parameter is granted + * for external processes. + * + * Read-only parameters or \e properties cannot be changed by external + * processes. For example, a script running on the core application can + * retrieve a read-only property from a process instance, but it cannot + * change its value. + * + * Read-only properties are often used to provide resulting values or + * process status information after instance execution. For example, the + * standard ImageIntegration process includes several read-only properties + * that can be accessed from a script to know the identifiers of the views + * generated to store the integrated image and the rejection map images. + * This improves versatility and usability of processes from scripts, and + * provides more accurate and extensive information to the users. + * + * \note The default implementation of this function returns false, so + * process parameters allow normal read/write access by default. + */ + virtual bool IsReadOnly() const + { + return false; + } + + /*! + * Returns a brief description of the process parameter represented by this + * metaparameter. + * + * The returned string will be used on the %Process Explorer window, which + * gives a summary of the parameters of each installed process. The + * information will be written to a console, so you can use the whole + * functionality of Console to format the text given here. + * + * Try to write succint but meaningful parameter descriptions. + */ + virtual String Description() const + { + return String(); + } + + /*! + * Returns a script comment for the process parameter represented by this + * metaparameter. + * + * For the sake of compatibility, the returned string should contain only + * valid ISO-8859-1 characters (represented as UTF-16 since the return value + * is a String object). No special characters, control tags or character + * entities are supported. This string will be used as a source code comment + * to document process parameters in automatically generated scripts. + * + * If this member function is not reimplemented for a table parameter (see + * MetaTable), PCL automatically generates a script comment including the + * identifiers of all table column parameters. + */ + virtual String Comment() const + { + return String(); + } + + /*! + * Returns true iff this metaparameter represents a numeric process + * parameter. Numeric process parameters are represented as subclasses of + * MetaNumeric. + */ + virtual bool IsNumeric() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents a Boolean process + * parameter. Boolean process parameters are represented as subclasses of + * MetaBoolean. + */ + virtual bool IsBoolean() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents an enumerated process + * parameter. Enumerated process parameters are represented as subclasses of + * MetaEnumeration. + */ + virtual bool IsEnumeration() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents a variable-length process + * parameter. Variable-length process parameters are represented as + * subclasses of MetaVariableLengthParameter. + */ + virtual bool IsVariableLength() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents a string process parameter. + * %String process parameters are represented as subclasses of MetaString. + */ + virtual bool IsString() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents a table process parameter. + * Table process parameters are represented as subclasses of MetaTable. + */ + virtual bool IsTable() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents a block process parameter. + * Block process parameters are represented as subclasses of MetaBlock. + */ + virtual bool IsBlock() const + { + return false; + } + +protected: + + void PerformAPIDefinitions() const override; + + virtual void PerformTypeAPIDefinitions() const + { + } + + virtual uint32 APIParType() const = 0; + + static bool inTableDefinition; + + friend class MetaTable; + friend class MetaProcess; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaNumeric + * \brief A formal description of a numeric process parameter. + * + * Numeric process parameters can be integers (MetaInteger) and floating-point + * reals (MetaReal). + * + * Integer process parameters can be signed (MetaSignedInteger) and unsigned + * (MetaUnsignedInteger) 8, 16, 32 and 64-bit integers. Real process parameters + * can be 32 and 64-bit IEEE 754 floating point values. This leads to the + * following numeric metaparameter classes: + * + * \li Unsigned integer process parameters: MetaUInt8, MetaUInt16, MetaUInt32, + * and MetaUInt64. + * + * \li Signed integer process parameters: MetaInt8, MetaInt16, MetaInt32, and + * MetaInt64. + * + * \li Real process parameters: MetaFloat and MetaDouble. + */ +class PCL_CLASS MetaNumeric : public MetaParameter +{ +public: + + /*! + * Constructs a metaparameter representing a numeric parameter of the + * specified process class \a *P. + */ + MetaNumeric( MetaProcess* P ) + : MetaParameter( P ) + { + } + + /*! + * Constructs a metaparameter representing a numeric value in a column of a + * table process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaNumeric( MetaTable* T ) + : MetaParameter( T ) + { + } + + /*! + * Destroys a %MetaNumeric object. + */ + virtual ~MetaNumeric() noexcept( false ) + { + } + + /*! + */ + bool IsNumeric() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns true iff this metaparameter represents a real (floating-point) + * process parameter. Real process parameters are represented as subclasses + * of MetaReal. + */ + virtual bool IsReal() const + { + return false; + } + + /*! + * Returns true iff this metaparameter represents an integer process + * parameter. Integer process parameters are represented as subclasses of + * MetaReal. + */ + virtual bool IsInteger() const + { + return false; + } + + /*! + * Returns the default value of the numeric process parameter represented by + * this metaparameter. + * + * \note The default implementation of this function returns zero. + */ + virtual double DefaultValue() const + { + return 0; + } + + /*! + * Returns the minimum valid value for the numeric process parameter + * represented by this metaparameter. + * + * \note The default implementation of this function returns -DBL_MAX, + * which is the minimum possible value of a \c double number. + */ + virtual double MinimumValue() const + { + return -DBL_MAX; + } + + /*! + * Returns the maximum valid value for the numeric process parameter + * represented by this metaparameter. + * + * \note The default implementation of this function returns DBL_MAX, + * which is the maximum possible value of a \c double number. + */ + virtual double MaximumValue() const + { + return +DBL_MAX; + } + +protected: + + void PerformTypeAPIDefinitions() const override; + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaInteger + * \brief A formal description of an integer process parameter. + * + * Integer process parameters can be signed (MetaSignedInteger) and unsigned + * (MetaUnsignedInteger) 8, 16, 32 and 64-bit integers. This leads to the + * following integer process parameter classes: + * + * \li Unsigned integer process parameters: MetaUInt8, MetaUInt16, MetaUInt32, + * and MetaUInt64. + * + * \li Signed integer process parameters: MetaInt8, MetaInt16, MetaInt32, and + * MetaInt64. + */ +class PCL_CLASS MetaInteger : public MetaNumeric +{ +public: + + /*! + * Constructs a metaparameter representing an integer parameter of the + * specified process class \a *P. + */ + MetaInteger( MetaProcess* P ) + : MetaNumeric( P ) + { + } + + /*! + * Constructs a metaparameter representing an integer value in a column of a + * table process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaInteger( MetaTable* T ) + : MetaNumeric( T ) + { + } + + /*! + * Destroys a %MetaInteger object. + */ + virtual ~MetaInteger() noexcept( false ) + { + } + + /*! + */ + bool IsInteger() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns true if this metaparameter represents a signed integer process + * parameter; false if it represents an unsigned integer process parameter. + */ + virtual bool IsSigned() const = 0; + +private: + + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaUnsignedInteger + * \brief A formal description of an unsigned integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit unsigned integer process parameters. This + * leads to the following unsigned process parameter classes: MetaUInt8, + * MetaUInt16, MetaUInt32, and MetaUInt64. + */ +class PCL_CLASS MetaUnsignedInteger : public MetaInteger +{ +public: + + /*! + * Constructs a metaparameter representing an unsigned integer parameter of + * the specified process class \a *P. + */ + MetaUnsignedInteger( MetaProcess* P ) + : MetaInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing an unsigned integer value in a + * column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaUnsignedInteger( MetaTable* T ) + : MetaInteger( T ) + { + } + + /*! + * Destroys a %MetaUnsignedInteger object. + */ + virtual ~MetaUnsignedInteger() noexcept( false ) + { + } + + /*! + */ + bool IsSigned() const override + { + return false; + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaSignedInteger + * \brief A formal description of a signed integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit signed integer process parameters. This + * leads to the following signed process parameter classes: MetaInt8, + * MetaInt16, MetaInt32, and MetaInt64. + */ +class PCL_CLASS MetaSignedInteger : public MetaInteger +{ +public: + + /*! + * Constructs a metaparameter representing a signed integer parameter of + * the specified process class \a *P. + */ + MetaSignedInteger( MetaProcess* P ) + : MetaInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a signed integer value in a + * column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaSignedInteger( MetaTable* T ) + : MetaInteger( T ) + { + } + + /*! + * Destroys a %MetaSignedInteger object. + */ + virtual ~MetaSignedInteger() noexcept( false ) + { + } + + /*! + */ + bool IsSigned() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaUInt8 + * \brief A formal description of an 8-bit unsigned integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit unsigned integer process parameters. This + * leads to the following unsigned process parameter classes: MetaUInt8, + * MetaUInt16, MetaUInt32, and MetaUInt64. + */ +class PCL_CLASS MetaUInt8 : public MetaUnsignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing an 8-bit unsigned integer + * parameter of the specified process class \a *P. + */ + MetaUInt8( MetaProcess* P ) + : MetaUnsignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing an 8-bit unsigned integer value + * in a column of a table process parameter represented by the metatable + * \a *T. The new metaparameter is appended to the list of existing columns + * in the metatable \a *T. + */ + MetaUInt8( MetaTable* T ) + : MetaUnsignedInteger( T ) + { + } + + /*! + * Destroys a %MetaUInt8 object. + */ + virtual ~MetaUInt8() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaUInt16 + * \brief A formal description of a 16-bit unsigned integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit unsigned integer process parameters. This + * leads to the following unsigned process parameter classes: MetaUInt8, + * MetaUInt16, MetaUInt32, and MetaUInt64. + */ +class PCL_CLASS MetaUInt16 : public MetaUnsignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 16-bit unsigned integer + * parameter of the specified process class \a *P. + */ + MetaUInt16( MetaProcess* P ) + : MetaUnsignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a 16-bit unsigned integer value + * in a column of a table process parameter represented by the metatable + * \a *T. The new metaparameter is appended to the list of existing columns + * in the metatable \a *T. + */ + MetaUInt16( MetaTable* T ) + : MetaUnsignedInteger( T ) + { + } + + /*! + * Destroys a %MetaUInt16 object. + */ + virtual ~MetaUInt16() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaUInt32 + * \brief A formal description of a 32-bit unsigned integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit unsigned integer process parameters. This + * leads to the following unsigned process parameter classes: MetaUInt8, + * MetaUInt16, MetaUInt32, and MetaUInt64. + */ +class PCL_CLASS MetaUInt32 : public MetaUnsignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 32-bit unsigned integer + * parameter of the specified process class \a *P. + */ + MetaUInt32( MetaProcess* P ) + : MetaUnsignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a 32-bit unsigned integer value + * in a column of a table process parameter represented by the metatable + * \a *T. The new metaparameter is appended to the list of existing columns + * in the metatable \a *T. + */ + MetaUInt32( MetaTable* T ) + : MetaUnsignedInteger( T ) + { + } + + /*! + * Destroys a %MetaUInt32 object. + */ + virtual ~MetaUInt32() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaUInt64 + * \brief A formal description of a 64-bit unsigned integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit unsigned integer process parameters. This + * leads to the following unsigned process parameter classes: MetaUInt8, + * MetaUInt16, MetaUInt32, and MetaUInt64. + */ +class PCL_CLASS MetaUInt64 : public MetaUnsignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 64-bit unsigned integer + * parameter of the specified process class \a *P. + */ + MetaUInt64( MetaProcess* P ) + : MetaUnsignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a 64-bit unsigned integer value + * in a column of a table process parameter represented by the metatable + * \a *T. The new metaparameter is appended to the list of existing columns + * in the metatable \a *T. + */ + MetaUInt64( MetaTable* T ) + : MetaUnsignedInteger( T ) + { + } + + /*! + * Destroys a %MetaUInt64 object. + */ + virtual ~MetaUInt64() noexcept( false ) + { + } + + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaInt8 + * \brief A formal description of an 8-bit signed integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit signed integer process parameters. This + * leads to the following signed process parameter classes: MetaInt8, + * MetaInt16, MetaInt32, and MetaInt64. + */ +class PCL_CLASS MetaInt8 : public MetaSignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing an 8-bit signed integer parameter + * of the specified process class \a *P. + */ + MetaInt8( MetaProcess* P ) + : MetaSignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing an 8-bit signed integer value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaInt8( MetaTable* T ) + : MetaSignedInteger( T ) + { + } + + /*! + * Destroys a %MetaInt8 object. + */ + virtual ~MetaInt8() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaInt16 + * \brief A formal description of a 16-bit signed integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit signed integer process parameters. This + * leads to the following signed process parameter classes: MetaInt8, + * MetaInt16, MetaInt32, and MetaInt64. + */ +class MetaInt16 : public MetaSignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 16-bit signed integer parameter + * of the specified process class \a *P. + */ + MetaInt16( MetaProcess* P ) + : MetaSignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a 16-bit signed integer value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaInt16( MetaTable* T ) + : MetaSignedInteger( T ) + { + } + + /*! + * Destroys a %MetaInt16 object. + */ + virtual ~MetaInt16() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaInt32 + * \brief A formal description of a 32-bit signed integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit signed integer process parameters. This + * leads to the following signed process parameter classes: MetaInt8, + * MetaInt16, MetaInt32, and MetaInt64. + */ +class PCL_CLASS MetaInt32 : public MetaSignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 32-bit signed integer parameter + * of the specified process class \a *P. + */ + MetaInt32( MetaProcess* P ) + : MetaSignedInteger( P ) + { + } + + /*! + * Constructs a metaparameter representing a 32-bit signed integer value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaInt32( MetaTable* T ) + : MetaSignedInteger( T ) + { + } + + /*! + * Destroys a %MetaInt32 object. + */ + virtual ~MetaInt32() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaInt64 + * \brief A formal description of a 64-bit signed integer process parameter. + * + * PCL supports 8, 16, 32 and 64-bit signed integer process parameters. This + * leads to the following signed process parameter classes: MetaInt8, + * MetaInt16, MetaInt32, and MetaInt64. + */ +class PCL_CLASS MetaInt64 : public MetaSignedInteger +{ +public: + + /*! + * Constructs a metaparameter representing a 64-bit signed integer parameter + * of the specified process class \a *P. + */ + MetaInt64( MetaProcess* p ) + : MetaSignedInteger( p ) + { + } + + /*! + * Constructs a metaparameter representing a 64-bit signed integer value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaInt64( MetaTable* t ) + : MetaSignedInteger( t ) + { + } + + /*! + * Destroys a %MetaInt64 object. + */ + virtual ~MetaInt64() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaReal + * \brief A formal description of a real process parameter. + * + * Real process parameters can be 32 and 64-bit IEEE 754 floating point + * values. This leads to the MetaFloat and MetaDouble real process parameter + * classes, respectively. + */ +class PCL_CLASS MetaReal : public MetaNumeric +{ +public: + + /*! + * Constructs a metaparameter representing a real parameter of the + * specified process class \a *P. + */ + MetaReal( MetaProcess* P ) + : MetaNumeric( P ) + { + } + + /*! + * Constructs a metaparameter representing a real value in a column of a + * table process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaReal( MetaTable* T ) + : MetaNumeric( T ) + { + } + + /*! + * Destroys a %MetaReal object. + */ + virtual ~MetaReal() noexcept( false ) + { + } + + /*! + */ + bool IsReal() const override + { + return true; + } + + /*! + * Returns the number of decimal digits that should be used to represent + * actual values of the real process parameter represented by this + * metaparameter. + * + * The returned number of decimal digits will be used for literal + * representations of the represented parameter, especially in generated + * scripts. Good examples are automatically generated scripts on the + * Processing History and ProcessContainer windows in the PixInsight core + * application. + * + * The returned value should be in the range from -1 to 16. A maximum of 7 + * decimal digits will be used for 32-bit real process parameters, and a + * maximum of 16 decimal digits for 64-bit real process parameters, even + * if this function returns a larger value. + * + * If a value ≥ 0 is returned, real literal representations are always + * rounded to the nearest value with the specified amount of decimal digits. + * If this function returns zero, output values corresponding to this + * parameter will always be rounded to the nearest integer. + * + * If this function returns a negative integer, literal representations will + * use the standard printf's \e g-format. In this format, numerical values + * are represented in a compact fashion, with automatic selection of + * exponential or fixed representations, depending on the value's magnitude + * and fractional accuracy. + * + * \note The default implementation of this function returns -1. This + * means that printf's \e g-format is used by default. + */ + virtual int Precision() const + { + return -1; // printf's g format + } + + /*! + * Returns true iff actual values of this real process parameter must be + * represented using scientific notation (printf's \e e-format). + * + * If this function returns false, actual parameter values of this parameter + * will be represented using ordinary decimal notation (printf's + * \e f-format), unless the Precision() member function returns -1, in which + * case the automatic \e g-format will always be used. + * + * \note The default implementation of this function returns false. This + * means that the ordinary decimal notation (printf's \e f-format) is used + * to represent real parameters by default. + */ + virtual bool ScientificNotation() const + { + return false; + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + void PerformTypeAPIDefinitions() const override; + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaFloat + * \brief A formal description of a 32-bit IEEE 754 floating point process + * parameter. + * + * Real process parameters can be 32 and 64-bit IEEE 754 floating point values. + * This leads to the %MetaFloat and MetaDouble real process parameter classes, + * respectively. + */ +class PCL_CLASS MetaFloat : public MetaReal +{ +public: + + /*! + * Constructs a metaparameter representing a 32-bit floating point parameter + * of the specified process class \a *P. + */ + MetaFloat( MetaProcess* P ) + : MetaReal( P ) + { + } + + /*! + * Constructs a metaparameter representing a 32-bit floating point value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaFloat( MetaTable* T ) + : MetaReal( T ) + { + } + + /*! + * Destroys a %MetaFloat object. + */ + virtual ~MetaFloat() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaDouble + * \brief A formal description of a 64-bit IEEE 754 floating point process + * parameter. + * + * Real process parameters can be 32 and 64-bit IEEE 754 floating point values. + * This leads to the MetaFloat and %MetaDouble real process parameter classes, + * respectively. + */ +class PCL_CLASS MetaDouble : public MetaReal +{ +public: + + /*! + * Constructs a metaparameter representing a 64-bit floating point parameter + * of the specified process class \a *P. + */ + MetaDouble( MetaProcess* P ) + : MetaReal( P ) + { + } + + /*! + * Constructs a metaparameter representing a 64-bit floating point value in + * a column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaDouble( MetaTable* T ) + : MetaReal( T ) + { + } + + /*! + * Destroys a %MetaDouble object. + */ + virtual ~MetaDouble() noexcept( false ) + { + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaBoolean + * \brief A formal description of a Boolean process parameter. + * + * %MetaBoolean represents a Boolean process parameter. A Boolean process + * parameter can only have one of the two logical values \c true and \c false. + * + * \note \b Important - Boolean process parameters must be implemented as + * 32-bit signed integers (int32). When the PixInsight core application reads + * or writes a Boolean process parameter, what it reads or writes is actually a + * 32-bit integer that will represent the Boolean \c true value as a nonzero + * integer value, and \c false as a zero integer value. The best way to + * implement Boolean process parameters is by using the pcl_bool class. + * + * \sa pcl_bool + */ +class PCL_CLASS MetaBoolean : public MetaParameter +{ +public: + + /*! + * Constructs a metaparameter representing a Boolean parameter of the + * specified process class \a *P. + */ + MetaBoolean( MetaProcess* P ) + : MetaParameter( P ) + { + } + + /*! + * Constructs a metaparameter representing a Boolean value in a column of a + * table process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaBoolean( MetaTable* T ) + : MetaParameter( T ) + { + } + + /*! + * Destroys a %MetaBoolean object. + */ + virtual ~MetaBoolean() noexcept( false ) + { + } + + /*! + */ + bool IsBoolean() const override + { + return true; + } + + /*! + * Returns the default value for actual Boolean parameters represented by + * this metaparameter. + * + * \note The default implementation of this function returns \c false. + */ + virtual bool DefaultValue() const + { + return false; + } + + /*! + */ + virtual IsoString Id() const override = 0; + +private: + + void PerformTypeAPIDefinitions() const override; + uint32 APIParType() const override; +}; + +/*! + * \defgroup safe_parameter_types Safe Process Parameter Types + */ + +/*! + * \class pcl_bool + * \brief A first-class data type that can be safely used to implement Boolean + * process parameters on all supported platforms. + * + * %pcl_bool is the \e only recommended way to implement process parameters + * that are formally described by the MetaBoolean class. %Process parameters + * declared as %pcl_bool instances will have the correct size and numerical + * type to be accessed and interpreted as valid Boolean parameters by the + * PixInsight core application on all supported platforms and C++ compilers. + * + * \ingroup safe_parameter_types + * \sa MetaBoolean + */ +class PCL_CLASS pcl_bool +{ +public: + + /*! + * Default constructor. Constructs a %pcl_bool instance with the logical + * false value. + */ + pcl_bool() = default; + + /*! + * Copy constructor. Constructs a %pcl_bool instance whose logical state is + * true if and only if the specified \a value is nonzero. + * The T template argument type must have integer equality comparison + * semantics. + */ + template pcl_bool( const T& value ) + : m_value( value ? 1 : 0 ) + { + } + + /*! + * Assignment operator. Sets the logical state of this %pcl_bool instance to + * true if and only if the specified \a value is nonzero. + * The T template argument type must have integer equality comparison + * semantics. + */ + template pcl_bool& operator =( const T& value ) + { + m_value = value ? 1 : 0; + return *this; + } + + /*! + * bool type conversion operator. Returns the current logical state of this + * %pcl_bool instance as a bool object. + */ + constexpr operator bool() const + { + return m_value != 0; + } + +#ifndef _MSC_VER + + /*! + * int type conversion operator. Returns zero if the current logical state + * of this %pcl_bool object is false; one if it is true. + */ + constexpr operator int() const + { + return int( m_value ); + } + +#endif // !_MSC_VER + + constexpr bool operator ==( const pcl_bool& b ) const + { + return m_value == b.m_value; + } + + constexpr bool operator <( const pcl_bool& b ) const + { + return m_value < b.m_value; + } + +private: + + int32 m_value = 0; // MetaBoolean equivalent type +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaEnumeration + * \brief A formal description of an enumerated process parameter. + * + * %MetaEnumeration represents an enumerated process parameter. An enumerated + * process parameter defines a finite set of unique-identifier/value + * associations. + * + * \note \b Important - Enumerated parameters must be implemented as 32-bit + * signed integers (int32). When the PixInsight core application reads or + * writes an enumerated parameter value, what it actually reads or writes is an + * enumeration \e value as a 32-bit signed integer, \e not the index of an + * enumeration element (which should be an unsigned integer). The best way to + * implement enumerated process parameters is by using the pcl_enum type. + * + * \sa pcl_enum + */ +class PCL_CLASS MetaEnumeration : public MetaParameter +{ +public: + + /*! + * Constructs a metaparameter representing an enumerated parameter of the + * specified process class \a *P. + */ + MetaEnumeration( MetaProcess* P ) + : MetaParameter( P ) + { + } + + /*! + * Constructs a metaparameter representing an enumerated value in a column + * of a table process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaEnumeration( MetaTable* T ) + : MetaParameter( T ) + { + } + + /*! + * Destroys a %MetaEnumeration object. + */ + virtual ~MetaEnumeration() noexcept( false ) + { + } + + /*! + */ + bool IsEnumeration() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns the number of enumeration elements defined in the enumerated + * process parameter represented by this metaparameter. + * + * Each enumeration element is a unique-identifier/value association. + * + * The returned value must be > 0. + */ + virtual size_type NumberOfElements() const = 0; + + /*! + * Returns the unique enumeration identifier corresponding to the specified + * enumeration index \a idx, in the enumerated process parameter represented + * by this metaparameter. + * + * Enumeration identifiers must be valid C identifiers, unique within the + * set of enumeration elements defined in the enumerated process parameter. + * + * \note \b Important - An enumeration index should not be confused with an + * enumeration \e value. Enumeration indices range from 0 to \a n-1, where + * \a n is the number of enumeration elements defined in the enumerated + * process parameter. + */ + virtual IsoString ElementId( size_type idx ) const = 0; + + /*! + * Returns the enumeration value corresponding to the specified enumeration + * index \a idx, in the enumerated process parameter represented by this + * metaparameter. + * + * \note \b Important - An enumeration index should not be confused with an + * enumeration \e value. Enumeration indices range from 0 to \a n-1, where + * \a n is the number of enumeration elements defined in the enumerated + * process parameter. + */ + virtual int ElementValue( size_type idx ) const = 0; + + /*! + * Returns the enumeration index corresponding to the default value for the + * enumerated process parameter that this metaparameter represents. + * + * The returned value must be in the range 0 to \a n-1, where \a n is the + * number of enumeration elements defined in the enumerated process + * parameter. + * + * \note The default implementation of this function returns zero. + */ + virtual size_type DefaultValueIndex() const + { + return 0; + } + + /*! + * Returns a list of alias identifiers for this enumerated parameter. + * + * An enumerated process parameter can define one or more aliased + * elements. Aliased enumeration elements are useful to maintain + * compatibility with previous versions of a process. + * + * The returned string is a comma-separated list of "alias_id=element_id" + * items. Formally: + * + *
+    * aliased-elements-list:
+    *    alias-specification[, aliased-elements-list]
+    * alias-specification:
+    *    alias-element-id = element-id
+    * 
+ * + * When the PixInsight core application imports a process instance (e.g., + * from a process icon) it automatically replaces alias enumeration + * identifiers with actual (current) identifiers. This allows a developer to + * change the enumeration identifiers of a process parameters without + * breaking compatibility with existing process instances. + * + * \note The default implementation of this member function returns an empty + * string (no aliases). + */ + virtual IsoString ElementAliases() const + { + return IsoString(); + } + +private: + + void PerformTypeAPIDefinitions() const override; + uint32 APIParType() const override; +}; + +/*! + * \brief An integer type that can be safely used to implement enumerated + * process parameters on all supported platforms. + * + * %pcl_enum is the \e only recommended way to implement process parameters + * that are formally described by the MetaEnumeration class. %Process + * parameters declared as %pcl_enum instances will have the correct size and + * numerical type to be accessed and interpreted as valid enumeration values by + * the PixInsight core application on all supported platforms. + * + * \ingroup safe_parameter_types + * \sa MetaEnumeration + */ +typedef int32 pcl_enum; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaVariableLengthParameter + * \brief A formal description of a variable length process parameter. + * + * Variable length process parameters can be strings (MetaString), tables + * (MetaTable) or blocks (MetaBlock). + */ +class PCL_CLASS MetaVariableLengthParameter : public MetaParameter +{ +public: + + /*! + * Constructs a metaparameter representing a variable length parameter of + * the specified process class \a *P. + */ + MetaVariableLengthParameter( MetaProcess* P ) + : MetaParameter( P ) + { + } + + /*! + * Constructs a metaparameter representing a variable-length data item in a + * column of a table process parameter represented by the metatable \a *T. + * The new metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaVariableLengthParameter( MetaTable* T ) + : MetaParameter( T ) + { + } + + /*! + * Destroys a %MetaVariableLengthParameter object. + */ + virtual ~MetaVariableLengthParameter() noexcept( false ) + { + } + + /*! + */ + bool IsVariableLength() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns the minimum valid length for the variable length process + * parameter represented by this metaparameter. + * + * \note The default implementation of this function returns zero, so + * variable length process parameters can be empty by default. + */ + virtual size_type MinLength() const + { + return 0; // can be empty + } + + /*! + * Returns the maximum valid length for the variable length process + * parameter represented by this metaparameter. + * + * If the returned value is zero, then the represented variable length + * process parameter can have unlimited length. + * + * \note The default implementation of this function returns zero, so + * variable length process parameters have unlimited length by default. + */ + virtual size_type MaxLength() const + { + return 0; // unlimited length + } + +private: + + virtual void PerformTypeAPIDefinitions() const override = 0; + virtual uint32 APIParType() const override = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaString + * \brief A formal description of a string process parameter. + * + * %String process parameters are sequences of zero-terminated 16-bit Unicode + * characters (UTF-16). + */ +class PCL_CLASS MetaString : public MetaVariableLengthParameter +{ +public: + + /*! + * Constructs a metaparameter representing a string parameter of the + * specified process class \a *P. + */ + MetaString( MetaProcess* P ) + : MetaVariableLengthParameter( P ) + { + } + + /*! + * Constructs a metaparameter representing a string in a column of a table + * process parameter represented by the metatable \a *T. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *T. + */ + MetaString( MetaTable* T ) + : MetaVariableLengthParameter( T ) + { + } + + /*! + * Destroys a %MetaString object. + */ + virtual ~MetaString() noexcept( false ) + { + } + + /*! + */ + bool IsString() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns the default value of the string process parameter represented by + * this metaparameter. + * + * If this function returns zero, the default value for the string process + * parameter will be an empty string. + * + * \note The default implementation of this function returns zero, so + * string process parameters have empty string default values. + */ + virtual String DefaultValue() const + { + return String(); + } + + /*! + * Returns a string with the set of valid characters for the string process + * parameter represented by this metaparameter. + * + * If this function returns zero, any character is valid for the represented + * string process parameter. + * + * \note The default implementation of this function returns zero, so + * string process parameters can contain any character by default. + */ + virtual String AllowedCharacters() const + { + return String(); // any character is valid + } + +private: + + void PerformTypeAPIDefinitions() const override; + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaTable + * \brief A formal description of a table process parameter. + * + * A table process parameter is a container that groups a set of process + * parameters defining the columns of a two-dimensional matrix of parameter + * values. + * + * \note Important: Table process parameters cannot be nested, that is, a table + * process parameter cannot be specified as a column of an existing table + * process parameter. + */ +class PCL_CLASS MetaTable : public MetaVariableLengthParameter +{ +public: + + /*! + * Constructs a metaparameter representing a table parameter of the + * specified process class \a *P. + */ + MetaTable( MetaProcess* P ) + : MetaVariableLengthParameter( P ) + { + } + + /*! + * Destroys a %MetaTable object. + */ + virtual ~MetaTable() noexcept( false ) + { + } + + /*! + */ + bool IsTable() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns the address of a metaparameter representing the process + * parameter at column index \a i. + * + * You should not need to call this function directly under normal + * conditions. + */ + const MetaParameter* operator[]( size_type i ) const; + +private: + + // Nested tables are not allowed. + MetaTable( MetaTable* ); + + void PerformTypeAPIDefinitions() const override; + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MetaBlock + * \brief A formal description of a block process parameter. + * + * A block process parameter is a container that stores arbitrary data as a + * sequence of bytes. + * + * Block parameters should only be used for parameters that definitely cannot + * be represented as any of the supported numerical, Boolean, enumerated, + * or string parameter types. This is because block parameters lead to + * poorly readable transcriptions in scripts and other visual representations. + */ +class PCL_CLASS MetaBlock : public MetaVariableLengthParameter +{ +public: + + /*! + * Constructs a metaparameter representing a block parameter of the + * specified process class \a *p. + */ + MetaBlock( MetaProcess* p ) + : MetaVariableLengthParameter( p ) + { + } + + /*! + * Constructs a metaparameter representing a data block in a column of a + * table process parameter represented by the metatable \a *t. The new + * metaparameter is appended to the list of existing columns in the + * metatable \a *t. + */ + MetaBlock( MetaTable* t ) + : MetaVariableLengthParameter( t ) + { + } + + /*! + * Destroys a %MetaBlock object. + */ + virtual ~MetaBlock() noexcept( false ) + { + } + + /*! + */ + bool IsBlock() const override + { + return true; + } + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * %MetaBlock data interpretation modes used for automatic script + * generation. + * + * Supported data interpretation modes: + * + * + * + * + * + * + * + * + * + * + * + * + *
MetaBlock::DataAsUInt8 Block data are interpreted as a sequence of 8-bit unsigned integers
MetaBlock::DataAsInt8 Block data are interpreted as a sequence of 8-bit signed integers
MetaBlock::DataAsUInt16 Block data are interpreted as a sequence of 16-bit unsigned integers
MetaBlock::DataAsInt16 Block data are interpreted as a sequence of 16-bit signed integers
MetaBlock::DataAsUInt32 Block data are interpreted as a sequence of 32-bit unsigned integers
MetaBlock::DataAsInt32 Block data are interpreted as a sequence of 32-bit signed integers
MetaBlock::DataAsUInt64 Block data are interpreted as a sequence of 64-bit unsigned integers
MetaBlock::DataAsInt64 Block data are interpreted as a sequence of 64-bit signed integers
MetaBlock::DataAsFloat Block data are interpreted as a sequence of float (32-bit IEEE 754 floating point)
MetaBlock::DataAsDouble Block data are interpreted as a sequence of double (64-bit IEEE 754 floating point)
+ * + * The PixInsight core application takes into account these modes to + * generate readable and meaningful scripts for %MetaBlock parameters. + */ + enum data_interpretation + { + DataAsUInt8, // 8-bit unsigned integers + DataAsInt8, // 8-bit signed integers + DataAsUInt16, // 16-bit unsigned integers + DataAsInt16, // 16-bit signed integers + DataAsUInt32, // 32-bit unsigned integers + DataAsInt32, // 32-bit signed integers + DataAsUInt64, // 64-bit unsigned integers + DataAsInt64, // 64-bit signed integers + DataAsFloat, // float (32-bit IEEE 754 floating point) + DataAsDouble // double (64-bit IEEE 754 floating point) + }; + + /*! + * Defines how the data provided by this block parameter will be interpreted + * by the core application for automatic script generation. + * + * The default mode is MetaBlock::DataAsUInt8, which means that the data are + * interpreted as a sequence of plain bytes by default. + * + * This function must be reimplemented to indicate the correct data type for + * each particular MetaBlock parameter. This is essential to ensure + * generation of meaningful and readable scripts. + * + * \sa MetaBlock::data_interpretation + */ + virtual data_interpretation DataInterpretation() const + { + return DataAsUInt8; + } + +private: + + void PerformTypeAPIDefinitions() const override; + uint32 APIParType() const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_MetaParameter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MetaParameter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MetaProcess.h b/3rdparty/include/pcl/MetaProcess.h new file mode 100644 index 0000000..1a42f80 --- /dev/null +++ b/3rdparty/include/pcl/MetaProcess.h @@ -0,0 +1,1030 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MetaProcess.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MetaProcess_h +#define __PCL_MetaProcess_h + +/// \file pcl/MetaProcess.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class View; +class ImageWindow; +class ProcessImplementation; +class ProcessInterface; +class MetaParameter; + +/*! + * \class MetaProcess + * \brief A formal description of a PixInsight process. + * + * %MetaProcess provides a formal description of the basic functionality and + * properties of a process in a PixInsight module. + * + * In a PixInsight module, every process must be implemented as a derived class + * of %MetaProcess. Such subclass will describe general properties of the + * process, and will provide the basic mechanisms to instantiate a process and + * generate duplicates of existing process instances. + * + * %MetaProcess and its subclasses don't implement any processing capabilities. + * The actual processing work must be implemented through a process + * instance implementation class, which is always a descendant of the + * ProcessImplementation class in the PixInsight/PCL framework. + * + * Each process must have a unique identifier. %Process identifiers are crucial + * for many key features of the PixInsight environment, like process + * scripting, command-line interfaces, process icons and containers, etc. + * + * Processes are organized by process categories in PixInsight. A + * process category groups similar or related processes together. The whole set + * of process categories forms a categorized tree of processes that + * can be accessed, for example, from the %Process Explorer window in the core + * PixInsight GUI. + * + * \sa MetaModule, MetaParameter, ProcessImplementation + */ +class PCL_CLASS MetaProcess : public MetaObject, public ProcessBase +{ +public: + + /*! + * Constructs a %MetaProcess object. + */ + MetaProcess(); + + /*! + * Destroys this %MetaProcess object. Also destroys all MetaParameter + * children of this %MetaProcess. + */ + virtual ~MetaProcess() noexcept( false ) + { + } + + /*! + * Copy constructor. Copy semantics are disabled for %MetaProcess because + * this class represents unique server-side objects. + */ + MetaProcess( const MetaProcess& ) = delete; + + /*! + * Copy assignment. Copy semantics are disabled for %MetaProcess because + * this class represents unique server-side objects. + */ + MetaProcess& operator =( const MetaProcess& ) = delete; + + /*! + * Move constructor. Move semantics are disabled for %MetaProcess because + * because of parent-child server-side object relations. + */ + MetaProcess( MetaProcess&& x ) = delete; + + /*! + * Move assignment. Move semantics are disabled for %MetaProcess because + * because of parent-child server-side object relations. + */ + MetaProcess& operator =( MetaProcess&& x ) = delete; + + /*! + */ + virtual IsoString Id() const override = 0; + + /*! + * Returns a list of alias identifiers for this process. + * + * A process can have one or more alias identifiers. Aliases are + * useful to maintain compatibility with previous versions of a process. + * + * When the PixInsight core application imports a process instance (e.g., + * from a process icon) it automatically replaces alias process identifiers + * with actual (current) identifiers. This allows a developer to change the + * identifier of a process without breaking compatibility with process + * instances in existing icon collections or projects. + * + * The returned string is a comma-separated list of distinct identifiers + * that will be treated as synonyms to the actual identifier of this + * process, which is returned by the Id() member function. Two installed + * processes can't have the same alias, so each identifier included in the + * returned list must be unique among all installed processes on the entire + * PixInsight platform. + * + * \note The default implementation of this member function returns an empty + * string (no aliases). + * + * \sa Id() + */ + virtual IsoString Aliases() const + { + return IsoString(); + } + + /*! + * Returns the identifiers of one or more categories to which this process + * belongs. + * + * Processes are organized hierarchically by categories in PixInsight. All + * installed processes appear classified by their categories on the %Process + * Explorer window, and also under the %Process main menu item. + * + * This member function can return a comma-separated list of category + * names, or a single category name. Each category name must be a valid C + * identifier. If one or more of the specified names are nonempty strings + * that don't correspond to already existing process categories, new + * categories will be created and this process will be added to them. If a + * category already exists with the specified identifier, then this process + * will be added to the existing category. + * + * If this function returns an empty string, then this process will not be + * associated to any particular category. It will then appear under a + * special, fallback pseudo-category identified as <Etc> on both the + * %Process Explorer window and the %Process main menu item. + * + * \note The default implementation of this function returns an empty + * string, so a process is not associated to any specific category unless a + * derived class reimplements this function. + */ + virtual IsoString Categories() const + { + return IsoString(); // General category + } + + /*! + * A synonym for Categories(), provided for compatibility with previous PCL + * versions. + * + * \deprecated This member function has been deprecated. Use Categories() in newly + * produced code. + */ + virtual IsoString Category() const // ### PCL 2.x: Remove + { + return Categories(); + } + + /*! + * Returns a version number for this process, encoded as a hexadecimal + * number. + * + * For example, version 1.0.5 should be returned as 0x105, and version + * 3.11.5 as 0x3B5. The default return value is 0x100, corresponding to + * version 1.0.0. + */ + uint32 Version() const override + { + return 0x100; + } + + /*! + * Returns a descriptive text for this process. + * + * This function must provide a brief but sufficiently informative + * description of this process. The returned description will appear on the + * %Process Explorer window, and should provide information about what this + * process does and how it can be used, avoiding too exhaustive descriptions + * that are better reserved for a technical manual. + * + * %Process descriptions are always printed on PixInsight consoles. This + * means that the text output functionality of the Console class can be used + * to format the string returned by this function. Refer to that class and + * its documentation for further information. + * + * \note The default implementation of this function returns an empty + * string, so by default a process does not provide a description. This is + * legal, but it is considered bad practice, so this function \e should be + * reimplemented. + */ + String Description() const override + { + return String(); + } + + /*! + * Returns a brief description for generated scripts. + * + * The returned text is intended to provide a brief comment to describe this + * process and its parameters, for quick reference on generated scripts. + * When writing these comments, think as you do when you're commenting your + * own source code. + * + * \note The default implementation of this function returns an empty + * string, so by default processes provide no script comments. + */ + String ScriptComment() const override + { + return String(); + } + + /*! + * Returns the icon image of this process as a document in SVG format. + * + * The specified image will be used to identify all instances of this + * process in the core application's GUI. It will be used on the %Process + * Explorer window, on process icons of this class, and in general for every + * graphical item related to this process or to an instance of this process. + * + * The returned string must be the source code of a valid SVG document + * representing the icon image, encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVGFile() return an empty string, or + * if the specified SVG document does not exist or is not valid, a default + * icon will be assigned to this process automatically by the PixInsight + * core application. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVGFile() + */ + virtual IsoString IconImageSVG() const + { + return IsoString(); + } + + /*! + * Returns the icon image of this process as a document in SVG format, + * stored as an external file. + * + * The specified image will be used to identify all instances of this + * process in the core application's GUI. It will be used on the %Process + * Explorer window, on process icons of this class, and in general for every + * graphical item related to this process or to an instance of this process. + * + * The returned string must be a path to an existing file in the local + * file system (remote resources are not supported in current PCL versions), + * which must store a valid SVG document representing the icon image. The + * SVG source code must be encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVG() return an empty string, or if + * the specified SVG document does not exist or is not valid, a default icon + * will be assigned to this process automatically by the PixInsight core + * application. + * + * Automatic Resource Location + * + * Process icon image files can be loaded from arbitrary locations on the + * local file system. However, modules typically install their process and + * interface icons on the /rsc/icons/module directory under the local + * PixInsight installation. A module can specify the "@module_icons_dir/" + * prefix in icon file paths to let the PixInsight core application load the + * corresponding SVG documents from the appropriate standard distribution + * directory automatically. For example, suppose that a "Bar" process, + * pertaining to a "Foo" module, reimplements this member function in its + * %MetaProcess derived class as follows: + * + * \code + * class Bar : public MetaProcess + * { + * public: + * ... + * + * String IconImageSVGFile() const override + * { + * return "@module_icons_dir/Bar.svg"; + * } + * + * ... + * }; + * \endcode + * + * Then the core application will attempt to load the following SVG file: + * + * <install-dir>/rsc/icons/module/Foo/Bar.svg + * + * where <install-dir> is the local directory where the running + * PixInsight core application is installed. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVG() + */ + virtual String IconImageSVGFile() const + { + return String(); + } + + /*! + * Returns a large icon for this process as an image in the + * standard XPM format. + * + * The specified image will be used to identify all instances of this + * process in the core application's GUI. It will be used on the %Process + * Explorer window, on process icons of this class, and in general for every + * graphical item related to this process or to an instance of this process. + * + * 32-bit RGBA color images (including an alpha channel) are fully + * supported. + * + * If this function returns nullptr, a default icon will be assigned to this + * process automatically. + * + * \note The default implementation of this function returns nullptr. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa IconImageFile() + */ + virtual const char** IconImageXPM() const + { + return nullptr; + } + + /*! + * Returns a large icon for this process as a path specification to + * an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on process icon images, see the documentation for + * IconImageXPM(). + * + * \note The default implementation of this function returns an empty + * string. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa IconImageXPM() + */ + virtual String IconImageFile() const + { + return String(); + } + + /*! + * Returns a small icon for this process as an image in the + * standard XPM format. + * + * For details on process icon images, see the documentation for + * IconImageXPM(). + * + * Small icons are used on interface elements where screen space must be + * preserved. Two good examples are the History Explorer window and the + * ProcessContainer interface. + * + * When this function is not reimplemented in a derived class, the core + * PixInsight application automatically generates a small icon by resampling + * down the large icon provided by IconImageXPM(). + * + * You normally should not need to reimplement this function; the core + * application usually does a fine work resampling large icons to obtain + * reduced versions. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa SmallIconImageFile() + */ + virtual const char** SmallIconImageXPM() const + { + return nullptr; + } + + /*! + * Returns a small icon for this process as a path specification to + * an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on small process icon images, see the documentation for + * SmallIconImageXPM(). + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process icons in SVG format. Existing modules should also be + * refactored in the same way to support scalable icons. + * + * \sa SmallIconImageXPM() + */ + virtual String SmallIconImageFile() const + { + return String(); + } + + /*! + */ + Bitmap Icon() const override; + + /*! + */ + Bitmap SmallIcon() const override; + + /*! + * %Process class initialization routine. + * + * This member function is called just after the module where this process + * lives has been completely installed. When this function is called, + * communication with the PixInsight core application is fully operative. + * + * This function is seldom reimplemented by derived classes. Reimplement + * it if your process requires some initialization that cannot be + * accomplished in the class constructor. This includes calling PCL + * functions that require active communication with the PixInsight core + * application, as retrieving global settings for example (see the + * pcl/GlobalSettings.h header). + * + * \note The default implementation of this function does nothing. + * + * \sa MetaProcess() + */ + virtual void InitializeClass() + { + } + + /*! + * Provides a default interface for this process. + * + * The interface addressed by this function will be activated in situations + * where this process is activated without a specific \e instance. In + * such situations, the core application will try to find a suitable + * default interface by calling this function, and if the address + * of a valid object is returned, the indicated interface will be launched. + * + * An example of process activation without an instance is when the user + * double-clicks an item on the %Process Explorer window. + * + * When an instance is available, the core application invokes + * ProcessImplementation::SelectInterface() instead of this member function. + * An example of process activation with an instance is when the user + * double-clicks a process icon on the core application's workspace. + * + * If this function returns nullptr, no interface will be launched when this + * process is activated without an instance. + * + * \note The default implementation of this function returns nullptr, so a + * process has no associated interface by default. + * + * \sa ProcessImplementation::SelectInterface() + */ + virtual ProcessInterface* DefaultInterface() const + { + return nullptr; // by default, processes have no associated interfaces. + } + + /*! + * Returns true iff this process class is able to process views. + * + * View execution of a process, also known as view context, is + * mainly implemented by the following member functions: + * + * bool ProcessImplementation::CanExecuteOn( const View&, String& ) + * bool ProcessImplementation::ExecuteOn( View& ) + * + * which must be reimplemented by any instance class corresponding to a + * process with view execution capabilities. + * + * \note The default implementation of this function returns true, so by + * default a process is supposed to be executable on views. This is indeed + * the case for the vast majority of processes. + */ + bool CanProcessViews() const override + { + return true; + } + + /*! + * Returns true iff this process class can be executed globally. + * + * Global execution of a process, also known as global context, is + * mainly implemented by the following member functions: + * + * bool ProcessImplementation::CanExecuteGlobal( String& ) + * bool ProcessImplementation::ExecuteGlobal() + * + * which must be reimplemented by any instance class corresponding to a + * process with global execution capabilities. + * + * \note For compatibility with previous PCL versions, the default + * implementation of this function returns true, so by default a process is + * supposed to be executable globally. There are not many global processes, + * and only a few processes can be executed in both the global and view + * contexts, so this default behavior is clearly suboptimal. However, as + * noted above it is necessary to maintain compatibility with 1.x PCL + * versions. This may change in a future version 2.x of PCL. + */ + bool CanProcessGlobal() const override + { + return true; + } + + /*! + * Returns true iff this process class is able to process standalone images. + * + * This refers to the ability of process instances to be executed on images + * passed to a reimplementation of the following member function: + * + * bool ProcessImplementation::ExecuteOn( ImageVariant&, const IsoString& ) + * + * Note that this is completely different from processing views with a + * reimplementation of: + * + * bool ProcessImplementation::ExecuteOn( View& ) + * + * Although both functions usually share the majority of their working code + * for most processes, they are unrelated from the point of view of the + * PixInsight core application, and they also play very different roles for + * the integration of a process with the platform. + * + * If a derived class reimplements this function to return true, the + * corresponding process instance implementation class should also + * reimplement the following ones: + * + * bool ProcessImplementation::CanExecuteOn( const ImageVariant&, String& ) const + * bool ProcessImplementation::ExecuteOn( ImageVariant& ) + * + * \note The default implementation of this function returns false, so by + * default a process has no standalone image processing capabilities. + */ + bool CanProcessImages() const override + { + return false; + } + + /*! + * Returns true iff this process class is able to process specific + * command-line invocations. + * + * If a derived class reimplements this function to return true, it should + * also reimplement the ProcessCommandLine() member function to perform + * actual command line processing, or a runtime exception will be thrown. + * + * \note The default implementation of this function returns false, so by + * default processes can't process command-line arguments. + * + * \sa ProcessCommandLine() + */ + bool CanProcessCommandLines() const override + { + return false; + } + + /*! + * Returns true iff this process is able to edit specific preferences. + * + * If a derived class reimplements this function to return true, it should + * also reimplement the EditPreferences() member function to perform the + * actual preferences edit work, or a runtime exception will be thrown. + * + * \note The default implementation of this function returns false, so by + * default processes can't edit specific preferences. + * + * \sa EditPreferences() + */ + bool CanEditPreferences() const override + { + return false; + } + + /*! + * Returns true iff this process is able to open a documentation browser with + * specific documentation contents. + * + * Starting from version 1.7, the PixInsight core application implements an + * integrated documentation system. The core application provides automatic + * documentation browsing and searching functionality. For this reason, the + * default implementation of this member function returns true. + * + * Unless a process has specific documentation requirements beyond the + * integrated documentation system --which is strongly discouraged--, the + * BrowseDocumentation() member function of %MetaProcess should not be + * reimplemented in derived classes. The default implementation drives the + * integrated documentation system automatically in a standardized way. + * + * \note The default implementation of this function returns true, for the + * same reasons explained above. + * + * \sa BrowseDocumentation() + */ + bool CanBrowseDocumentation() const override + { + return true; + } + + /*! + * Creates a new instance of this process. Returns a pointer to the newly + * created process instance. + * + * A process instance is implemented as an instance of a subclass of the + * ProcessImplementation class. + * + * \note This is a pure virtual member function that has to be implemented + * in a derived class. Every process in PixInsight must be able to generate + * new process instances. + * + * \sa Clone() + */ + virtual ProcessImplementation* Create() const = 0; + + /*! + * Creates a new instance of this process as a duplicate of an existing + * process instance. Returns a pointer to the newly created process + * instance. + * + * \note This is a pure virtual member function that has to be implemented + * in a derived class. Every process in PixInsight must be able to generate + * clones of existing process instances. + * + * \sa Create(), TestClone() + */ + virtual ProcessImplementation* Clone( const ProcessImplementation& ) const = 0; + + /*! + * Creates a new instance of this process as a duplicate of an existing + * process instance, for strict testing purposes. Returns a pointer to the + * newly created process instance. + * + * In certain situations, the core application needs a temporary process + * instance exclusively for testing purposes. This happens, for example, to + * verify if a given instance can be executed on a given view, or in the + * global context, during complex GUI operations. The core application tries + * to optimize GUI performance by calling this function when possible. + * + * If your process can provide a substantially simplified version of an + * existing instance, and such a simplified version still is able to know if + * it can be executed globally or on a given view, then reimplement this + * function. + * + * For example, if your process requires (or may require) some megabytes of + * data to work, but these data are not needed for testing purposes, then it + * is a pretty good candidate to reimplement this function. In practice, + * however, requiring a reimplementation of this function is infrequent. + * + * \note The default implementation of this function returns Clone( p ). + * + * \sa Clone() + */ + virtual ProcessImplementation* TestClone( const ProcessImplementation& p ) const + { + return Clone( p ); + } + + /*! + * Returns true iff the instances of this process are \e assignable. + * + * Assignable processes allow copying one instance to another. + * + * If you have a good reason to avoid instance assignment for your process, + * then reimplement this function to return false. A good reason could be + * that your process has no parameters, hence no data could be assigned. + * + * \note The default implementation of this function returns true, so + * processes are assignable by default. + */ + bool IsAssignable() const override + { + return true; // by default, processes are considered assignable. + } + + /*! + * Returns true iff the instances of this process require special + * initialization. + * + * Special initialization takes place just after instance creation. + * Sometimes, there are actions that cannot be implemented in the + * constructor of a process instance class. For example, this often happens + * when an instance must be initialized by calling reimplemented virtual + * functions from a base class constructor. Reimplemented virtual functions + * cannot be resolved from a base class constructor in C++. + * + * If your process instance class requires some initialization that cannot + * be implemented in a regular constructor function, then reimplement this + * function to return true. In this case, you must also reimplement + * ProcessImplementation::Initialize() for your instance implementation + * class to implement the special initialization work, or a runtime + * exception will be thrown. + * + * \note The default implementation of this function returns false, so by + * default processes don't require special instance initialization. + * + * \note Don't confuse the instance initialization that this function refers + * to with the InitializeClass() member function of %MetaProcess. + * + * \sa ProcessImplementation::Initialize() + */ + bool NeedsInitialization() const override + { + return false; // by default, process instances are not initialized. + } + + /*! + * Returns true iff the instances of this process require special + * validation. + * + * Some processes may require validation of their instances just before they + * are executed. This is known as special validation. The core + * application will never execute an instance of a process if its validation + * function fails. To implement your special validation, reimplement this + * function to return true, as well as ProcessImplementation::Validate() for + * your instance implementation subclass, or a runtime exception will be + * thrown. + * + * \note The default implementation of this function returns false, so by + * default processes don't require special instance validation. + * + * \sa ProcessImplementation::Validate() + */ + bool NeedsValidation() const override + { + return false; // by default, process instances are not validated. + } + + /*! + * Returns true iff the instances of this process prefer execution in the + * global context, instead of being executed on views. + * + * Note that the option indicated by this function is just a \e hint to the + * PixInsight core application, not necessarily observed, depending on the + * context. + * + * To prevent (or select) execution on a particular context, your process + * instance class must reimplement ProcessImplementation::CanExecuteOn() + * and/or ProcessImplementation::CanExecuteGlobal(), as appropriate. + * + * \note The default implementation of this function returns false, so by + * default processes prefer execution on views, instead of execution in the + * global context. + */ + bool PrefersGlobalExecution() const override + { + return false; // by default, processes prefer execution on views. + } + + /*! + * Handles a command line invocation. Returns a conventional exit code + * (customarily, zero signals a "normal" or successful execution). + * + * \param argv The list of command-line arguments. + * + * \note This function will never be called unless the + * CanProcessCommandLines() member function is reimplemented to return true. + * + * \sa CanProcessCommandLines() + */ + virtual int ProcessCommandLine( const StringList& argv ) const; + + /*! + * Handles a request to edit process preferences. Returns true if the + * preferences were successfully edited. + * + * Reimplement this function to allow the user to edit a set of preferences + * specific to this process. This task is usually implemented on a modal + * dialog box. In such case, if the user closes the dialog box without + * accepting the new preferences settings (e.g. by clicking the dialog's + * Cancel button) this member function should return false. This function + * should only return true if the user has edited and accepted a new set of + * preferences for this process. + * + * \note This function will never be called unless the CanEditPreferences() + * member function is reimplemented to return true. + * + * \sa CanEditPreferences(), ProcessInterface::EditPreferences() + */ + bool EditPreferences() const override; + + /*! + * Handles a request to browse documentation specific for this process. + * Returns true iff the documentation was loaded successfully. + * + * Reimplementing this function is strongly discouraged, unless some + * nonstandard behavior is absolutely necessary for a particular process. + * Since version 1.7 of the PixInsight core application, the integrated + * documentation system works in a completely automatic and standardized way + * to provide documentation browsing and searching functionality. + * + * The default implementation of this member function automatically launches + * and loads the integrated documentation browser with the documentation for + * this process, if it exists and has been installed. For more information, + * please read the documentation for the CanBrowseDocumentation() function. + * + * \note This function will never be called unless the + * CanBrowseDocumentation() member function is reimplemented to return true. + * + * \sa CanBrowseDocumentation() + */ + bool BrowseDocumentation() const override; + + /*! + * Provides access to the list of parameters defined for this process. + * + * This member is intended for internal use of API module initialization + * routines. You should not need to call this function directly under + * normal conditions. + */ + const MetaParameter* operator[]( size_type i ) const; + + /*! + * Returns true iff this process can handle inter-process communication + * (IPC) messages send among running instances of the PixInsight core + * application. + * + * The following IPC process messages are implemented in current versions of + * the PixInsight platform: + * + * \li Start Process. Handled by a reimplementation of the + * IPCStart() member function in a derived class. + * + * \li Stop Process. Handled by a reimplementation of the + * IPCStop() member function in a derived class. + * + * \li Set Process Parameters. Handled by a reimplementation of the + * IPCSetParameters() member function in a derived class. + * + * \li Get Process Status. Handled by a reimplementation of the + * IPCStatus() member function in a derived class. + * + * Process execution controlled by IPC messages is primarily intended for + * automation of non-interactive or unattended tasks. A good example is the + * NetworkService process, which can be controlled with IPC messages to + * implement generic, asynchronous online services without user interaction. + * + * The default implementation of this member function returns false. This + * means that IPC messages are not supported by default. To support them, + * this member function must be reimplemented in a derived class to return + * true, along with IPCStart(), IPCStop(), IPCSetParameters() and + * IPCStatus(). + */ + virtual bool CanProcessIPCMessages() const + { + return false; + } + + /*! + * Handles a start process IPC message. + * + * \param instance The instance number of the running PixInsight core + * application. This is an integer > 0, which can be used + * for task logging purposes. + * + * \param messageUID Unique identifier of the IPC message that originated + * this call. This parameter can be used for task logging + * purposes. + * + * \param parameters A string in UTF-16 format with process-specific + * parameters. Can be an empty string if no parameters + * were specified by the IPC message that originated this + * function call. + * + * \note This function will never be called unless the + * CanProcessIPCMessages() member function is reimplemented to return true. + */ + virtual void IPCStart( int instance, const IsoString& messageUID, const String& parameters ) const; + + /*! + * Handles a stop process IPC message. + * + * \param instance The instance number of the running PixInsight core + * application. This is an integer > 0, which can be used + * for task logging purposes. + * + * \param messageUID Unique identifier of the IPC message that originated + * this call. This parameter can be used for task logging + * purposes. + * + * \note This function will never be called unless the + * CanProcessIPCMessages() member function is reimplemented to return true. + */ + virtual void IPCStop( int instance, const IsoString& messageUID ) const; + + /*! + * Handles a set process parameters IPC message. + * + * \param instance The instance number of the running PixInsight core + * application. This is an integer > 0, which can be used + * for task logging purposes. + * + * \param messageUID Unique identifier of the IPC message that originated + * this call. This parameter can be used for task logging + * purposes. + * + * \param parameters A string in UTF-16 format with process-specific + * parameters. Can be an empty string if no parameters + * were specified by the IPC message that originated this + * function call. + * + * \note This function will never be called unless the + * CanProcessIPCMessages() member function is reimplemented to return true. + */ + virtual void IPCSetParameters( int instance, const IsoString& messageUID, const String& parameters ) const; + + /*! + * Handles a get process status IPC message. + * + * \param instance The instance number of the running PixInsight core + * application. This is an integer > 0, which can be used + * for task logging purposes. + * + * \param messageUID Unique identifier of the IPC message that originated + * this call. This parameter can be used for task logging + * purposes. + * + * The returned value is expected to be: + * + * = 0 If the process is not currently in execution. + * + * > 0 (process-specific positive nonzero integer codes) If the process is + * now running. + * + * < 0 (process-specific negative integer codes) If the process is not + * running because of an error condition. + * + * \note This function will never be called unless the + * CanProcessIPCMessages() member function is reimplemented to return true. + */ + virtual int IPCStatus( int instance, const IsoString& messageUID ) const; + +private: + + void PerformAPIDefinitions() const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_MetaProcess_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MetaProcess.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MoffatFilter.h b/3rdparty/include/pcl/MoffatFilter.h new file mode 100644 index 0000000..3c4c4d8 --- /dev/null +++ b/3rdparty/include/pcl/MoffatFilter.h @@ -0,0 +1,504 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MoffatFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MoffatFilter_h +#define __PCL_MoffatFilter_h + +/// \file pcl/MoffatFilter.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MoffatFilter + * \brief A kernel filter implementing a discrete Moffat distribution in two dimensions. + * + * A %MoffatFilter object is a specialized KernelFilter whose elements are + * calculated as a discrete representation of an elliptical Moffat[1] function + * centered at the origin: + * + * M(x,y) = 1/(1 + x^2/sx^2 + y^2/sy^2)^beta + * + * where sx and sy are the standard deviations of the distribution on the + * horizontal and vertical axes, respectively, and the beta exponent controls + * the shape of the function's profile. The lower the beta, the more peaked the + * overall shape of the function. For beta=1, the equation above corresponds to + * a Lorentzian function. + * + * %MoffatFilter also supports arbitrary rotation around the origin. When the + * filter is rotated, the coordinates x, y in the equation above are replaced + * by their rotated counterparts. + * + * A %MoffatFilter instance is formally defined by the following parameters: + * + * + * + * + * + * + * + *
\e sigma Standard deviation of the filter distribution on the X axis (sigma > 0).
\e rho The ratio sy/sx (see equation above) of the generated filter distribution (0 <= rho <= 1).
\e theta Rotation angle of the horizontal axis in radians (0 <= theta < PI). This parameter only makes sense when rho < 1.
\e beta Exponent controlling the overall shape of the function (beta > 0).
\e epsilon Maximum truncation error of the computed filter coefficients (eps > 0).
+ * + * References + * + * \li [1] Moffat, A. F. J., A Theoretical Investigation of Focal Stellar + * Images in the Photographic Emulsion and Application to Photographic + * Photometry, Astronomy and Astrophysics, Vol. 3, p. 455 (1969) + * + * \sa KernelFilter, GaussianFilter, VariableShapeFilter, LinearFilter + */ +class PCL_CLASS MoffatFilter : public KernelFilter +{ +public: + + /*! + * Constructs an empty %MoffatFilter object with default functional + * parameters: sigma=2, beta=4, epsilon=0.01, rho=1, theta=0. + */ + MoffatFilter() = default; + + /*! + * Constructs a %MoffatFilter object given the standard deviation + * \a sigma > 0, \a beta exponent > 0 and truncation error \a epsilon > 0. + * Assigns an optional \a name to the new filter object. + */ + MoffatFilter( float sigma, float beta = 4, float epsilon = 0.01, const String& name = String() ) + { + Initialize( sigma, beta, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %MoffatFilter object given the standard deviation + * \a sigma > 0, \a beta exponent > 0, truncation error \a epsilon > 0, + * aspect ratio 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in + * radians. Assigns an optional \a name to the new filter object. + */ + MoffatFilter( float sigma, float beta, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( sigma, beta, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Constructs a %MoffatFilter object given the odd kernel size \a n >= 3, + * \a beta exponent > 0 and truncation error \a epsilon > 0. Assigns an + * optional \a name to the new filter object. + */ + MoffatFilter( int n, float beta = 4, float epsilon = 0.01, const String& name = String() ) + { + Initialize( n, beta, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %MoffatFilter object given the odd kernel size \a n >= 3, + * \a beta exponent > 0, truncation error \a epsilon > 0, aspect ratio + * 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in radians. + * Assigns an optional \a name to the new filter object. + */ + MoffatFilter( int n, float beta, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( n, beta, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Copy constructor. + */ + MoffatFilter( const MoffatFilter& ) = default; + + /*! + * Move constructor. + */ + MoffatFilter( MoffatFilter&& ) = default; + + /*! + */ + KernelFilter* Clone() const override + { + return new MoffatFilter( *this ); + } + + /*! + * Returns a separable filter equivalent to this kernel filter. + * + * %MoffatFilter's reimplementation of this virtual member function returns + * an empty SeparableFilter object, as a Moffat filter is not separable. + */ + SeparableFilter AsSeparableFilter( float tolerance = __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE ) const override + { + return SeparableFilter(); + } + + /*! + * Returns true iff this filter is separable. + * + * %MoffatFilter's reimplementation of this virtual member function returns + * false, as a Moffat filter is not separable. + */ + bool IsSeparable() const override + { + return false; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MoffatFilter& operator =( const MoffatFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MoffatFilter& operator =( MoffatFilter&& ) = default; + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + */ + float SigmaX() const + { + return m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the Y + * (vertical) axis. + */ + float SigmaY() const + { + return m_rho*m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + * + * This function is an alias to SigmaX(). + */ + float Sigma() const + { + return SigmaX(); + } + + /*! + * Returns the beta exponent of the Moffat filter function. The beta + * exponent controls the overall shape of the filter profile. + */ + float Beta() const + { + return m_beta; + } + + /*! + * Returns the maximum truncation error of the filter coefficients. + */ + float Truncation() const + { + return m_epsilon; + } + + /*! + * Returns the aspect ratio of the filter distribution. This is the ratio + * vertical:horizontal between filter axes in the range [0,1]. + */ + float AspectRatio() const + { + return m_rho; + } + + /*! + * Returns the rotation angle of the filter distribution. This is the + * rotation angle in radians with respect to the central pixel, in the + * range [0,+PI]. + */ + float RotationAngle() const + { + return m_theta; + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * horizontal axis of the elliptical Moffat filter distribution. + */ + double FWHMx() const + { + return 2 * Sqrt( Pow2( 1/m_beta ) - 1 ) * m_sigma; + + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * vertical axis of the elliptical Moffat filter distribution. + */ + double FWHMy() const + { + return m_rho * FWHMx(); + + } + + /*! + * Returns the full width at half maximum, in sigma units, for the + * horizontal axis of the elliptical Moffat filter distribution. + * + * This function is an alias to FWHMx(). + */ + double FWHM() const + { + return FWHMx(); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0, + * \a beta exponent, truncation error \a epsilon > 0, aspect ratio + * 0 <= \a rho <= 1 and rotation angle 0 <= \a theta <= PI in radians. + */ + void Set( float sigma, float beta, float epsilon, float rho, float theta ) + { + Initialize( sigma, beta, epsilon, rho, theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0, + * \a beta exponent, truncation error \a epsilon > 0 and aspect ratio + * 0 <= \a rho <= 1. Does not change the current rotation angle. + */ + void Set( float sigma, float beta, float epsilon, float rho ) + { + Initialize( sigma, beta, epsilon, rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0, + * \a beta exponent and truncation error \a epsilon > 0. Does not change the + * current aspect ratio and rotation angle. + */ + void Set( float sigma, float beta, float epsilon ) + { + Initialize( sigma, beta, epsilon, m_rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0 and + * \a beta exponent. The current coefficient truncation error, aspect ratio + * and rotation angle are not changed. + */ + void Set( float sigma, float beta ) + { + Initialize( sigma, beta, m_epsilon, m_rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified sigma \a sigma > 0. + * The current beta exponent, coefficient truncation error, aspect ratio and + * rotation angle are not changed. + */ + void Set( float sigma ) + { + Initialize( sigma, m_beta, m_epsilon, m_rho, m_theta ); + } + + /*! + * This is a convenience member function, equivalent to Set( sigma ). + */ + void SetSigma( float sigma ) + { + Set( sigma ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), beta ). + */ + void SetBeta( float beta ) + { + Set( m_sigma, beta ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Beta(), epsilon ). + */ + void SetTruncation( float epsilon ) + { + Set( m_sigma, m_beta, epsilon ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Beta(), Truncation(), rho ). + */ + void SetAspectRatio( float rho ) + { + Set( m_sigma, m_beta, m_epsilon, rho ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Beta(), Truncation(), AspectRatio(), a ). + */ + void SetRotationAngle( float theta ) + { + Set( m_sigma, m_beta, m_epsilon, m_rho, theta ); + } + + /*! + * Recalculates filter coefficients for the given odd kernel size \a n >= 3. + * This routine computes the required standard deviation to sample the + * Moffat function on a matrix of the specified size, preserving the + * current beta exponent, coefficient truncation error, aspect ratio and + * rotation angle. + */ + void Resize( int n ) override + { + Initialize( n, m_beta, m_epsilon, m_rho, m_theta ); + } + +private: + + float m_sigma = 2.0F; // standard deviation, horizontal axis + float m_beta = 4.0F; // beta exponent + float m_rho = 1.0F; // vertical:horizontal axis ratio + float m_theta = 0.0F; // rotation angle in radians, [0,+pi] + float m_epsilon = 0.01F; // maximum truncation error in sigma units + + void Initialize( float s, float b, float e, float r, float a ) + { + PCL_PRECONDITION( s > 0 ) + PCL_PRECONDITION( b > 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + m_sigma = Abs( s ); + m_beta = Abs( b ); + m_epsilon = Abs( e ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + KernelFilter::Resize( 1 + (Max( 1, RoundInt( m_sigma*Sqrt( Pow( m_epsilon, -1/m_beta ) - 1 ) ) ) << 1) ); + Rebuild(); + } + + void Initialize( int n, float b, float e, float r, float a ) + { + PCL_PRECONDITION( n == 0 || n >= 3 && (n & 1) != 0 ) + PCL_PRECONDITION( b > 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + KernelFilter::Resize( n ); + m_beta = Abs( b ); + m_epsilon = Abs( e ); + m_sigma = (Size() >> 1)/Sqrt( Pow( m_epsilon, -1/m_beta ) - 1 ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + Rebuild(); + } + + void Rebuild() + { + int size = Size(); + if ( size == 0 ) + return; + + float* h = *coefficients; + double sx = m_sigma; + double sy = m_rho * sx; + double mb = -m_beta; + + if ( m_theta == 0 || m_rho == 1 ) + { + double sx2 = sx*sx; + double sy2 = sy*sy; + for ( int n2 = size >> 1, dy = -n2; dy <= n2; ++dy ) + if ( dy > 0 ) + for ( int dx = 0; dx < size; ++dx, ++h ) + *h = *(h - ((dy+dy)*size)); + else + for ( int dx = -n2; dx <= n2; ++dx, ++h ) + *h = (dx > 0) ? *(h - (dx+dx)) : float( Pow( 1 + dx*dx/sx2 + dy*dy/sy2, mb ) ); + } + else + { + double st, ct; SinCos( double( m_theta ), st, ct ); + double sct = st*ct; + double st2 = st*st; + double ct2 = ct*ct; + double sx2 = sx*sx; + double sy2 = sy*sy; + double p1 = ct2/sx2 + st2/sy2; + double p2 = sct/sy2 - sct/sx2; + double p3 = st2/sx2 + ct2/sy2; + for ( int n2 = size >> 1, dy = -n2; dy <= n2; ++dy ) + { + double twop2dy = 2*p2*dy; + double p3dy2 = p3*dy*dy; + for ( int dx = -n2; dx <= n2; ++dx, ++h ) + *h = float( Pow( 1 + p1*dx*dx + twop2dy*dx + p3dy2, mb ) ); + } + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MoffatFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MoffatFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MorphologicalOperator.h b/3rdparty/include/pcl/MorphologicalOperator.h new file mode 100644 index 0000000..76c8c14 --- /dev/null +++ b/3rdparty/include/pcl/MorphologicalOperator.h @@ -0,0 +1,1237 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MorphologicalOperator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MorphologicalOperator_h +#define __PCL_MorphologicalOperator_h + +/// \file pcl/MorphologicalOperator.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MorphologicalOperator + * \brief Abstract base class of all PCL morphological operators. + * + * \sa ErosionFilter, DilationFilter, MedianFilter, SelectionFilter, + * MidpointFilter, AlphaTrimmedMeanFilter + */ +class PCL_CLASS MorphologicalOperator +{ +public: + + /*! + * Constructs a %MorphologicalOperator object. + */ + MorphologicalOperator() = default; + + /*! + * Copy constructor. + */ + MorphologicalOperator( const MorphologicalOperator& ) = default; + + /*! + * Destroys a %MorphologicalOperator object. + */ + virtual ~MorphologicalOperator() + { + } + + /*! + * Returns a pointer to a dynamically allocated duplicate of this + * morphological operator. + */ + virtual MorphologicalOperator* Clone() const = 0; + + /*! + * Returns a human-readable description of this morphological operator. + */ + virtual String Description() const + { + return String(); + } + + /*! + * \internal + * Returns true iff this object performs a dilation morphological operation. + * This member function is used internally to decide whether to reflect the + * structuring element during morphological transformations. + */ + virtual bool IsDilation() const + { + return false; + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + virtual FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 32-bit floating-point images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + virtual DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 64-bit floating-point images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point complex pixel samples. + */ + virtual ComplexPixelTraits::sample operator ()( ComplexPixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 32-bit complex images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point complex pixel samples. + */ + virtual DComplexPixelTraits::sample operator ()( DComplexPixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 64-bit complex images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + virtual UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 8-bit integer images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + virtual UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 16-bit integer images" ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + virtual UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const + { + throw NotImplemented( *this, "Apply to 32-bit integer images" ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ErosionFilter + * \brief Erosion morphological operator. + * + * The \e erosion morphological operator computes the minimum value in a pixel + * neighborhood. + */ +class PCL_CLASS ErosionFilter : public MorphologicalOperator +{ +public: + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new ErosionFilter( *this ); + } + + /*! + */ + String Description() const override + { + return "Erosion"; + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + +private: + + template + static T Operate( T* __restrict__ f, size_type n ) + { + T x = *f++; + for ( ; --n > 0; ++f ) + if ( *f < x ) + x = *f; + return x; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class DilationFilter + * \brief Dilation morphological operator. + * + * The \e dilation morphological operator computes the maximum value in a pixel + * neighborhood. + */ +class PCL_CLASS DilationFilter : public MorphologicalOperator +{ +public: + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new DilationFilter( *this ); + } + + /*! + */ + String Description() const override + { + return "Dilation"; + } + + /*! + */ + bool IsDilation() const override + { + return true; + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + +private: + + template + static T Operate( T* __restrict__ f, size_type n ) + { + T x = *f++; + for ( ; --n > 0; ++f ) + if ( x < *f ) + x = *f; + return x; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MedianFilter + * \brief Morphological median operator. + * + * The \e median morphological operator (or median order-statistic filter) + * computes the median of the values in a pixel neighborhood. + */ +class PCL_CLASS MedianFilter : public MorphologicalOperator +{ +public: + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new MedianFilter( *this ); + } + + /*! + */ + String Description() const override + { + return "Median"; + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (FloatPixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (DoublePixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt8PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt16PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt32PixelTraits*)0 ); + } + +private: + +#define CMPXCHG( a, b ) \ + if ( f[b] < f[a] ) pcl::Swap( f[a], f[b] ) + +#define MEAN( a, b ) \ + P::FloatToSample( (double( a ) + double( b ))/2 ) + + template + static T Operate( T* __restrict__ f, size_type n, P* ) + { + /* + * Use fast, hard-coded selection networks for n <= 24: + * + * Knuth, D. E., The Art of Computer Programming, volume 3: Sorting and + * Searching, Addison Wesley, 1973. + * + * Hillis, W. D., Co-evolving parasites improve simulated evolution as an + * optimization procedure. Langton, C. et al. (Eds.), Artificial + * Life II. Addison Wesley, 1992. + * + * Hugues Juille, Evolution of Non-Deterministic Incremental Algorithms + * as a New Approach for Search in State Spaces, 1995. + * + * Use a quick selection algorithm for n > 24: + * + * William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, Addison-Wesley + * Professional, 2011, pp 345-347. + */ + switch ( n ) + { + case 0: // ?! + return 0; + case 1: // !? + return f[0]; + case 2: + return MEAN( f[0], f[1] ); + case 3: + CMPXCHG( 0, 1 ); CMPXCHG( 1, 2 ); + return pcl::Max( f[0], f[1] ); + case 4: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); + return MEAN( f[1], f[2] ); + case 5: + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 0, 3 ); + CMPXCHG( 1, 4 ); CMPXCHG( 1, 2 ); CMPXCHG( 2, 3 ); + return pcl::Max( f[1], f[2] ); + case 6: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 1, 4 ); + CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); CMPXCHG( 3, 4 ); + return MEAN( f[2], f[3] ); + case 7: + CMPXCHG( 0, 5 ); CMPXCHG( 0, 3 ); CMPXCHG( 1, 6 ); + CMPXCHG( 2, 4 ); CMPXCHG( 0, 1 ); CMPXCHG( 3, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 2, 3 ); CMPXCHG( 3, 6 ); + CMPXCHG( 4, 5 ); CMPXCHG( 1, 4 ); CMPXCHG( 1, 3 ); + return pcl::Min( f[3], f[4] ); + case 8: + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); + CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 1, 4 ); + CMPXCHG( 3, 6 ); + return MEAN( f[3], f[4] ); + case 9: + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 1 ); CMPXCHG( 3, 4 ); CMPXCHG( 6, 7 ); + CMPXCHG( 1, 2 ); CMPXCHG( 4, 5 ); CMPXCHG( 7, 8 ); + CMPXCHG( 0, 3 ); CMPXCHG( 5, 8 ); CMPXCHG( 4, 7 ); + CMPXCHG( 3, 6 ); CMPXCHG( 1, 4 ); CMPXCHG( 2, 5 ); + CMPXCHG( 4, 7 ); CMPXCHG( 4, 2 ); CMPXCHG( 6, 4 ); + return pcl::Min( f[2], f[4] ); + case 10: + CMPXCHG( 4, 9 ); CMPXCHG( 3, 8 ); CMPXCHG( 2, 7 ); + CMPXCHG( 1, 6 ); CMPXCHG( 0, 5 ); CMPXCHG( 1, 4 ); + CMPXCHG( 6, 9 ); CMPXCHG( 0, 3 ); CMPXCHG( 5, 8 ); + CMPXCHG( 0, 2 ); CMPXCHG( 3, 6 ); CMPXCHG( 7, 9 ); + CMPXCHG( 0, 1 ); CMPXCHG( 2, 4 ); CMPXCHG( 5, 7 ); + CMPXCHG( 8, 9 ); CMPXCHG( 1, 2 ); CMPXCHG( 4, 6 ); + CMPXCHG( 7, 8 ); CMPXCHG( 3, 5 ); CMPXCHG( 2, 5 ); + CMPXCHG( 6, 8 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 7 ); + CMPXCHG( 2, 3 ); CMPXCHG( 6, 7 ); CMPXCHG( 3, 4 ); + CMPXCHG( 5, 6 ); + return MEAN( f[4], f[5] ); + case 11: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 1, 3 ); + CMPXCHG( 5, 7 ); CMPXCHG( 0, 2 ); CMPXCHG( 4, 6 ); + CMPXCHG( 8, 10 ); CMPXCHG( 1, 2 ); CMPXCHG( 5, 6 ); + CMPXCHG( 9, 10 ); CMPXCHG( 1, 5 ); CMPXCHG( 6, 10 ); + CMPXCHG( 5, 9 ); CMPXCHG( 2, 6 ); CMPXCHG( 1, 5 ); + CMPXCHG( 6, 10 ); CMPXCHG( 0, 4 ); CMPXCHG( 3, 7 ); + CMPXCHG( 4, 8 ); CMPXCHG( 0, 4 ); CMPXCHG( 1, 4 ); + CMPXCHG( 7, 10 ); CMPXCHG( 3, 8 ); CMPXCHG( 2, 3 ); + CMPXCHG( 8, 9 ); CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); + return pcl::Min( f[5], f[6] ); + case 12: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 1, 3 ); CMPXCHG( 5, 7 ); CMPXCHG( 9, 11 ); + CMPXCHG( 0, 2 ); CMPXCHG( 4, 6 ); CMPXCHG( 8, 10 ); + CMPXCHG( 1, 2 ); CMPXCHG( 5, 6 ); CMPXCHG( 9, 10 ); + CMPXCHG( 1, 5 ); CMPXCHG( 6, 10 ); CMPXCHG( 5, 9 ); + CMPXCHG( 2, 6 ); CMPXCHG( 1, 5 ); CMPXCHG( 6, 10 ); + CMPXCHG( 0, 4 ); CMPXCHG( 7, 11 ); CMPXCHG( 3, 7 ); + CMPXCHG( 4, 8 ); CMPXCHG( 0, 4 ); CMPXCHG( 7, 11 ); + CMPXCHG( 1, 4 ); CMPXCHG( 7, 10 ); CMPXCHG( 3, 8 ); + CMPXCHG( 2, 3 ); CMPXCHG( 8, 9 ); CMPXCHG( 3, 5 ); + CMPXCHG( 6, 8 ); + return MEAN( f[5], f[6] ); + case 13: + CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); + CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); CMPXCHG( 0, 4 ); + CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); + CMPXCHG( 8, 12 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); + CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); CMPXCHG( 2, 8 ); + CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); + CMPXCHG( 10, 12 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); + CMPXCHG( 10, 11 ); CMPXCHG( 1, 8 ); CMPXCHG( 3, 10 ); + CMPXCHG( 5, 12 ); CMPXCHG( 3, 6 ); CMPXCHG( 5, 8 ); + return pcl::Max( f[5], f[6] ); + case 14: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 0, 2 ); CMPXCHG( 4, 6 ); + CMPXCHG( 8, 10 ); CMPXCHG( 1, 3 ); CMPXCHG( 5, 7 ); + CMPXCHG( 9, 11 ); CMPXCHG( 0, 4 ); CMPXCHG( 8, 12 ); + CMPXCHG( 1, 5 ); CMPXCHG( 9, 13 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); + CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); + CMPXCHG( 5, 13 ); CMPXCHG( 5, 10 ); CMPXCHG( 6, 9 ); + CMPXCHG( 3, 12 ); CMPXCHG( 7, 11 ); CMPXCHG( 1, 2 ); + CMPXCHG( 4, 8 ); CMPXCHG( 7, 13 ); CMPXCHG( 2, 8 ); + CMPXCHG( 5, 6 ); CMPXCHG( 9, 10 ); CMPXCHG( 3, 8 ); + CMPXCHG( 7, 12 ); CMPXCHG( 6, 8 ); CMPXCHG( 3, 5 ); + CMPXCHG( 7, 9 ); CMPXCHG( 5, 6 ); CMPXCHG( 7, 8 ); + return MEAN( f[6], f[7] ); + case 15: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 0, 2 ); CMPXCHG( 4, 6 ); + CMPXCHG( 8, 10 ); CMPXCHG( 12, 14 ); CMPXCHG( 1, 3 ); + CMPXCHG( 5, 7 ); CMPXCHG( 9, 11 ); CMPXCHG( 0, 4 ); + CMPXCHG( 8, 12 ); CMPXCHG( 1, 5 ); CMPXCHG( 9, 13 ); + CMPXCHG( 2, 6 ); CMPXCHG( 10, 14 ); CMPXCHG( 3, 7 ); + CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); + CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); + CMPXCHG( 6, 14 ); CMPXCHG( 5, 10 ); CMPXCHG( 6, 9 ); + CMPXCHG( 3, 12 ); CMPXCHG( 13, 14 ); CMPXCHG( 7, 11 ); + CMPXCHG( 1, 2 ); CMPXCHG( 4, 8 ); CMPXCHG( 7, 13 ); + CMPXCHG( 2, 8 ); CMPXCHG( 5, 6 ); CMPXCHG( 9, 10 ); + CMPXCHG( 3, 8 ); CMPXCHG( 7, 12 ); CMPXCHG( 6, 8 ); + CMPXCHG( 3, 5 ); CMPXCHG( 7, 9 ); CMPXCHG( 5, 6 ); + CMPXCHG( 7, 8 ); + return pcl::Max( f[6], f[7] ); + case 16: + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); CMPXCHG( 0, 2 ); + CMPXCHG( 4, 6 ); CMPXCHG( 8, 10 ); CMPXCHG( 12, 14 ); + CMPXCHG( 1, 3 ); CMPXCHG( 5, 7 ); CMPXCHG( 9, 11 ); + CMPXCHG( 13, 15 ); CMPXCHG( 0, 4 ); CMPXCHG( 8, 12 ); + CMPXCHG( 1, 5 ); CMPXCHG( 9, 13 ); CMPXCHG( 2, 6 ); + CMPXCHG( 10, 14 ); CMPXCHG( 3, 7 ); CMPXCHG( 11, 15 ); + CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); + CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); + CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); CMPXCHG( 5, 10 ); + CMPXCHG( 6, 9 ); CMPXCHG( 3, 12 ); CMPXCHG( 13, 14 ); + CMPXCHG( 7, 11 ); CMPXCHG( 1, 2 ); CMPXCHG( 4, 8 ); + CMPXCHG( 7, 13 ); CMPXCHG( 2, 8 ); CMPXCHG( 5, 6 ); + CMPXCHG( 9, 10 ); CMPXCHG( 3, 8 ); CMPXCHG( 7, 12 ); + CMPXCHG( 6, 8 ); CMPXCHG( 10, 12 ); CMPXCHG( 3, 5 ); + CMPXCHG( 7, 9 ); CMPXCHG( 5, 6 ); CMPXCHG( 7, 8 ); + CMPXCHG( 9, 10 ); CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); + return MEAN( f[7], f[8] ); + case 17: + CMPXCHG( 0, 16 ); CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); + CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); + CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); + CMPXCHG( 8, 16 ); CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); + CMPXCHG( 9, 13 ); CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); + CMPXCHG( 4, 16 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 2, 16 ); + CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); + CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); + CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); CMPXCHG( 1, 16 ); + CMPXCHG( 1, 8 ); CMPXCHG( 3, 10 ); CMPXCHG( 5, 12 ); + CMPXCHG( 7, 14 ); CMPXCHG( 5, 8 ); CMPXCHG( 7, 10 ); + return pcl::Max( f[7], f[8] ); + case 18: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 0, 8 ); + CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); + CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); + CMPXCHG( 7, 15 ); CMPXCHG( 8, 16 ); CMPXCHG( 9, 17 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); CMPXCHG( 9, 13 ); + CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); CMPXCHG( 4, 16 ); + CMPXCHG( 5, 17 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); + CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); + CMPXCHG( 9, 11 ); CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); + CMPXCHG( 2, 16 ); CMPXCHG( 3, 17 ); CMPXCHG( 2, 8 ); + CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); CMPXCHG( 7, 13 ); + CMPXCHG( 10, 16 ); CMPXCHG( 11, 17 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); + CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); + CMPXCHG( 15, 17 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); + CMPXCHG( 10, 11 ); CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); + CMPXCHG( 16, 17 ); CMPXCHG( 1, 16 ); CMPXCHG( 1, 8 ); + CMPXCHG( 3, 10 ); CMPXCHG( 5, 12 ); CMPXCHG( 7, 14 ); + CMPXCHG( 9, 16 ); CMPXCHG( 5, 8 ); CMPXCHG( 7, 10 ); + CMPXCHG( 9, 12 ); CMPXCHG( 7, 8 ); CMPXCHG( 9, 10 ); + return MEAN( f[8], f[9] ); + case 19: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); + CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); + CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); CMPXCHG( 8, 16 ); + CMPXCHG( 9, 17 ); CMPXCHG( 10, 18 ); CMPXCHG( 0, 4 ); + CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); + CMPXCHG( 8, 12 ); CMPXCHG( 9, 13 ); CMPXCHG( 10, 14 ); + CMPXCHG( 11, 15 ); CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); + CMPXCHG( 6, 18 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 0, 2 ); + CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); CMPXCHG( 5, 7 ); + CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); CMPXCHG( 12, 14 ); + CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); CMPXCHG( 2, 16 ); + CMPXCHG( 3, 17 ); CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); + CMPXCHG( 6, 12 ); CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); + CMPXCHG( 11, 17 ); CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); + CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); CMPXCHG( 10, 12 ); + CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); CMPXCHG( 15, 17 ); + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); CMPXCHG( 16, 17 ); + CMPXCHG( 1, 16 ); CMPXCHG( 3, 18 ); CMPXCHG( 3, 10 ); + CMPXCHG( 5, 12 ); CMPXCHG( 7, 14 ); CMPXCHG( 9, 16 ); + CMPXCHG( 7, 10 ); CMPXCHG( 9, 12 ); + return pcl::Min( f[9], f[10] ); + case 20: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 3, 19 ); CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); + CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); + CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); + CMPXCHG( 8, 16 ); CMPXCHG( 9, 17 ); CMPXCHG( 10, 18 ); + CMPXCHG( 11, 19 ); CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); + CMPXCHG( 9, 13 ); CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); + CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); CMPXCHG( 6, 18 ); + CMPXCHG( 7, 19 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 15, 19 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); + CMPXCHG( 17, 19 ); CMPXCHG( 2, 16 ); CMPXCHG( 3, 17 ); + CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); + CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); CMPXCHG( 11, 17 ); + CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); + CMPXCHG( 7, 9 ); CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); + CMPXCHG( 14, 16 ); CMPXCHG( 15, 17 ); CMPXCHG( 0, 1 ); + CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); + CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); CMPXCHG( 12, 13 ); + CMPXCHG( 14, 15 ); CMPXCHG( 16, 17 ); CMPXCHG( 18, 19 ); + CMPXCHG( 1, 16 ); CMPXCHG( 3, 18 ); CMPXCHG( 3, 10 ); + CMPXCHG( 5, 12 ); CMPXCHG( 7, 14 ); CMPXCHG( 9, 16 ); + CMPXCHG( 7, 10 ); CMPXCHG( 9, 12 ); + return MEAN( f[9], f[10] ); + case 21: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 3, 19 ); CMPXCHG( 4, 20 ); CMPXCHG( 0, 8 ); + CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); + CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); + CMPXCHG( 7, 15 ); CMPXCHG( 8, 16 ); CMPXCHG( 9, 17 ); + CMPXCHG( 10, 18 ); CMPXCHG( 11, 19 ); CMPXCHG( 12, 20 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); CMPXCHG( 9, 13 ); + CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); CMPXCHG( 16, 20 ); + CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); CMPXCHG( 6, 18 ); + CMPXCHG( 7, 19 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 15, 19 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); + CMPXCHG( 17, 19 ); CMPXCHG( 2, 16 ); CMPXCHG( 3, 17 ); + CMPXCHG( 6, 20 ); CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); + CMPXCHG( 6, 12 ); CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); + CMPXCHG( 11, 17 ); CMPXCHG( 14, 20 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); + CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); + CMPXCHG( 15, 17 ); CMPXCHG( 18, 20 ); CMPXCHG( 0, 1 ); + CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); + CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); CMPXCHG( 12, 13 ); + CMPXCHG( 14, 15 ); CMPXCHG( 16, 17 ); CMPXCHG( 18, 19 ); + CMPXCHG( 1, 16 ); CMPXCHG( 3, 18 ); CMPXCHG( 5, 20 ); + CMPXCHG( 3, 10 ); CMPXCHG( 5, 12 ); CMPXCHG( 7, 14 ); + CMPXCHG( 9, 16 ); CMPXCHG( 7, 10 ); CMPXCHG( 9, 12 ); + return pcl::Max( f[9], f[10] ); + case 22: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 3, 19 ); CMPXCHG( 4, 20 ); CMPXCHG( 5, 21 ); + CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); + CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); + CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); CMPXCHG( 8, 16 ); + CMPXCHG( 9, 17 ); CMPXCHG( 10, 18 ); CMPXCHG( 11, 19 ); + CMPXCHG( 12, 20 ); CMPXCHG( 13, 21 ); CMPXCHG( 0, 4 ); + CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); + CMPXCHG( 8, 12 ); CMPXCHG( 9, 13 ); CMPXCHG( 10, 14 ); + CMPXCHG( 11, 15 ); CMPXCHG( 16, 20 ); CMPXCHG( 17, 21 ); + CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); CMPXCHG( 6, 18 ); + CMPXCHG( 7, 19 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 15, 19 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); + CMPXCHG( 17, 19 ); CMPXCHG( 2, 16 ); CMPXCHG( 3, 17 ); + CMPXCHG( 6, 20 ); CMPXCHG( 7, 21 ); CMPXCHG( 2, 8 ); + CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); CMPXCHG( 7, 13 ); + CMPXCHG( 10, 16 ); CMPXCHG( 11, 17 ); CMPXCHG( 14, 20 ); + CMPXCHG( 15, 21 ); CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); + CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); CMPXCHG( 10, 12 ); + CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); CMPXCHG( 15, 17 ); + CMPXCHG( 18, 20 ); CMPXCHG( 19, 21 ); CMPXCHG( 0, 1 ); + CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); + CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); CMPXCHG( 12, 13 ); + CMPXCHG( 14, 15 ); CMPXCHG( 16, 17 ); CMPXCHG( 18, 19 ); + CMPXCHG( 20, 21 ); CMPXCHG( 1, 16 ); CMPXCHG( 3, 18 ); + CMPXCHG( 5, 20 ); CMPXCHG( 3, 10 ); CMPXCHG( 5, 12 ); + CMPXCHG( 7, 14 ); CMPXCHG( 9, 16 ); CMPXCHG( 11, 18 ); + CMPXCHG( 7, 10 ); CMPXCHG( 9, 12 ); CMPXCHG( 11, 14 ); + CMPXCHG( 9, 10 ); CMPXCHG( 11, 12 ); + return MEAN( f[10], f[11] ); + case 23: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 3, 19 ); CMPXCHG( 4, 20 ); CMPXCHG( 5, 21 ); + CMPXCHG( 6, 22 ); CMPXCHG( 0, 8 ); CMPXCHG( 1, 9 ); + CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); CMPXCHG( 4, 12 ); + CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); CMPXCHG( 7, 15 ); + CMPXCHG( 8, 16 ); CMPXCHG( 9, 17 ); CMPXCHG( 10, 18 ); + CMPXCHG( 11, 19 ); CMPXCHG( 12, 20 ); CMPXCHG( 13, 21 ); + CMPXCHG( 14, 22 ); CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); + CMPXCHG( 2, 6 ); CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); + CMPXCHG( 9, 13 ); CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); + CMPXCHG( 16, 20 ); CMPXCHG( 17, 21 ); CMPXCHG( 18, 22 ); + CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); CMPXCHG( 6, 18 ); + CMPXCHG( 7, 19 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 15, 19 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); + CMPXCHG( 17, 19 ); CMPXCHG( 20, 22 ); CMPXCHG( 2, 16 ); + CMPXCHG( 3, 17 ); CMPXCHG( 6, 20 ); CMPXCHG( 7, 21 ); + CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); CMPXCHG( 6, 12 ); + CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); CMPXCHG( 11, 17 ); + CMPXCHG( 14, 20 ); CMPXCHG( 15, 21 ); CMPXCHG( 2, 4 ); + CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); CMPXCHG( 7, 9 ); + CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); CMPXCHG( 14, 16 ); + CMPXCHG( 15, 17 ); CMPXCHG( 18, 20 ); CMPXCHG( 19, 21 ); + CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); CMPXCHG( 4, 5 ); + CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); CMPXCHG( 10, 11 ); + CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); CMPXCHG( 16, 17 ); + CMPXCHG( 18, 19 ); CMPXCHG( 20, 21 ); CMPXCHG( 1, 16 ); + CMPXCHG( 3, 18 ); CMPXCHG( 5, 20 ); CMPXCHG( 7, 22 ); + CMPXCHG( 5, 12 ); CMPXCHG( 7, 14 ); CMPXCHG( 9, 16 ); + CMPXCHG( 11, 18 ); CMPXCHG( 9, 12 ); CMPXCHG( 11, 14 ); + return pcl::Min( f[11], f[12] ); + case 24: + CMPXCHG( 0, 16 ); CMPXCHG( 1, 17 ); CMPXCHG( 2, 18 ); + CMPXCHG( 3, 19 ); CMPXCHG( 4, 20 ); CMPXCHG( 5, 21 ); + CMPXCHG( 6, 22 ); CMPXCHG( 7, 23 ); CMPXCHG( 0, 8 ); + CMPXCHG( 1, 9 ); CMPXCHG( 2, 10 ); CMPXCHG( 3, 11 ); + CMPXCHG( 4, 12 ); CMPXCHG( 5, 13 ); CMPXCHG( 6, 14 ); + CMPXCHG( 7, 15 ); CMPXCHG( 8, 16 ); CMPXCHG( 9, 17 ); + CMPXCHG( 10, 18 ); CMPXCHG( 11, 19 ); CMPXCHG( 12, 20 ); + CMPXCHG( 13, 21 ); CMPXCHG( 14, 22 ); CMPXCHG( 15, 23 ); + CMPXCHG( 0, 4 ); CMPXCHG( 1, 5 ); CMPXCHG( 2, 6 ); + CMPXCHG( 3, 7 ); CMPXCHG( 8, 12 ); CMPXCHG( 9, 13 ); + CMPXCHG( 10, 14 ); CMPXCHG( 11, 15 ); CMPXCHG( 16, 20 ); + CMPXCHG( 17, 21 ); CMPXCHG( 18, 22 ); CMPXCHG( 19, 23 ); + CMPXCHG( 4, 16 ); CMPXCHG( 5, 17 ); CMPXCHG( 6, 18 ); + CMPXCHG( 7, 19 ); CMPXCHG( 4, 8 ); CMPXCHG( 5, 9 ); + CMPXCHG( 6, 10 ); CMPXCHG( 7, 11 ); CMPXCHG( 12, 16 ); + CMPXCHG( 13, 17 ); CMPXCHG( 14, 18 ); CMPXCHG( 15, 19 ); + CMPXCHG( 0, 2 ); CMPXCHG( 1, 3 ); CMPXCHG( 4, 6 ); + CMPXCHG( 5, 7 ); CMPXCHG( 8, 10 ); CMPXCHG( 9, 11 ); + CMPXCHG( 12, 14 ); CMPXCHG( 13, 15 ); CMPXCHG( 16, 18 ); + CMPXCHG( 17, 19 ); CMPXCHG( 20, 22 ); CMPXCHG( 21, 23 ); + CMPXCHG( 2, 16 ); CMPXCHG( 3, 17 ); CMPXCHG( 6, 20 ); + CMPXCHG( 7, 21 ); CMPXCHG( 2, 8 ); CMPXCHG( 3, 9 ); + CMPXCHG( 6, 12 ); CMPXCHG( 7, 13 ); CMPXCHG( 10, 16 ); + CMPXCHG( 11, 17 ); CMPXCHG( 14, 20 ); CMPXCHG( 15, 21 ); + CMPXCHG( 2, 4 ); CMPXCHG( 3, 5 ); CMPXCHG( 6, 8 ); + CMPXCHG( 7, 9 ); CMPXCHG( 10, 12 ); CMPXCHG( 11, 13 ); + CMPXCHG( 14, 16 ); CMPXCHG( 15, 17 ); CMPXCHG( 18, 20 ); + CMPXCHG( 19, 21 ); CMPXCHG( 0, 1 ); CMPXCHG( 2, 3 ); + CMPXCHG( 4, 5 ); CMPXCHG( 6, 7 ); CMPXCHG( 8, 9 ); + CMPXCHG( 10, 11 ); CMPXCHG( 12, 13 ); CMPXCHG( 14, 15 ); + CMPXCHG( 16, 17 ); CMPXCHG( 18, 19 ); CMPXCHG( 20, 21 ); + CMPXCHG( 22, 23 ); CMPXCHG( 1, 16 ); CMPXCHG( 3, 18 ); + CMPXCHG( 5, 20 ); CMPXCHG( 7, 22 ); CMPXCHG( 5, 12 ); + CMPXCHG( 7, 14 ); CMPXCHG( 9, 16 ); CMPXCHG( 11, 18 ); + CMPXCHG( 9, 12 ); CMPXCHG( 11, 14 ); + return MEAN( f[11], f[12] ); + default: + { + distance_type n2 = distance_type( n >> 1 ); + if ( n & 1 ) + return *pcl::Select( f, f+n, n2 ); + return P::FloatToSample( (double( *pcl::Select( f, f+n, n2 ) ) + + double( *pcl::Select( f, f+n, n2-1 ) ))/2 ); + } + } + } + +#undef CMPXCHG +#undef MEAN +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SelectionFilter + * \brief Morphological selection operator. + * + * The \e selection morphological operator (or selection order-statistic + * filter) computes the value corresponding to a prescribed percentile in the + * ranked set of values from a pixel neighborhood. + * + * The selection point \a k of the selection operator defines the + * working percentile: for k=0, we have an erosion (or minimum) operator; for + * k=1 we have a dilation (or maximum) operator; k=0.5 defines the median + * operator. Other values work as a balance between erosion and dilation. + */ +class PCL_CLASS SelectionFilter : public MorphologicalOperator +{ +public: + + /*! + * Default constructor. The default selection point is 0.5, equivalent to a + * median operator. + */ + SelectionFilter() = default; + + /*! + * Constructs a %SelectionFilter with selection point \a p. + */ + SelectionFilter( float p ) + : k( pcl::Range( p, float( 0 ), float( 1 ) ) ) + { + PCL_PRECONDITION( 0 <= p && p <= 1 ) + PCL_CHECK( 0 <= k && k <= 1 ) + } + + /*! + * Copy constructor. + */ + SelectionFilter( const SelectionFilter& ) = default; + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new SelectionFilter( *this ); + } + + /*! + * Returns the selection point of this morphological selection operator. + */ + float SelectionPoint() const + { + return k; + } + + /*! + * Sets the selection point of this morphological selection operator. + */ + void SetSelectionPoint( float _k ) + { + PCL_PRECONDITION( 0 <= _k && _k <= 1 ) + k = pcl::Range( _k, float( 0 ), float( 1 ) ); + } + + /*! + */ + String Description() const override + { + return String().Format( "Selection, k=%.5f", k ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n ); + } + +private: + + float k = 0.5F; + + template + T Operate( T* f, size_type n ) const + { + return *pcl::Select( f, f+n, distance_type( pcl::RoundInt( k*(n-1) ) ) ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class MidpointFilter + * \brief Midpoint operator. + * + * The \e midpoint operator computes the midpoint value in a pixel + * neighborhood, namely: (minimum + maximum)/2. + */ +class PCL_CLASS MidpointFilter : public MorphologicalOperator +{ +public: + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new MidpointFilter( *this ); + } + + /*! + */ + String Description() const override + { + return "Midpoint"; + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (FloatPixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (DoublePixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt8PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt16PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt32PixelTraits*)0 ); + } + +private: + + template + static T Operate( T* f, size_type n, P* ) + { + T* min, * max; + pcl::FindExtremeItems( min, max, f, f+n ); + return P::FloatToSample( (double( *min ) + double( *max ))/2 ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class AlphaTrimmedMeanFilter + * \brief Alpha-trimmed mean operator + * + * The alpha-trimmed mean operator computes the mean of the remaining + * values in a pixel neighborhood, after suppressing the d/2 lowest and the d/2 + * highest values. The point \a d defines the trimming factor of the + * operator. When d=0, we have an arithmetic mean filter. If d=1, the filter is + * the median operator. + * + * The alpha-trimmed operator is not a morphological operator in the strict + * sense, although it allows for the implementation of robust filters that + * share some important properties with morphological filters in practical + * applications. + */ +class PCL_CLASS AlphaTrimmedMeanFilter : public MorphologicalOperator +{ +public: + + /*! + * Default constructor. The default trimming factor is 0.2, which leads to + * the suppression of a 10% of the lowest and highest neighbor pixels. The + * resulting object is a robust mean filter resilient to outliers in most + * practical cases. + */ + AlphaTrimmedMeanFilter() = default; + + /*! + * Constructs a %AlphaTrimmedMeanFilter object with the specified trimming + * factor \a t in the [0,1] range. + */ + AlphaTrimmedMeanFilter( float t ) + : d( pcl::Range( t, float( 0 ), float( 1 ) ) ) + { + PCL_PRECONDITION( 0 <= t && t <= 1 ) + PCL_CHECK( 0 <= d && d <= 1 ) + } + + /*! + * Copy constructor. + */ + AlphaTrimmedMeanFilter( const AlphaTrimmedMeanFilter& ) = default; + + /*! + */ + MorphologicalOperator* Clone() const override + { + return new AlphaTrimmedMeanFilter( *this ); + } + + /*! + * Returns the trimming factor of this alpha-trimmed mean operator. + */ + float TrimmingFactor() const + { + return d; + } + + /*! + * Sets the trimming factor \a t of this alpha-trimmed mean operator. + */ + void SetTrimmingFactor( float t ) + { + PCL_PRECONDITION( 0 <= t && t <= 1 ) + d = pcl::Range( t, float( 0 ), float( 1 ) ); + } + + /*! + */ + String Description() const override + { + return String().Format( "Alpha-trimmed mean, d=%.5f", d ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * floating point pixel samples. + */ + FloatPixelTraits::sample operator ()( FloatPixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (FloatPixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 64-bit + * floating point pixel samples. + */ + DoublePixelTraits::sample operator ()( DoublePixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (DoublePixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 8-bit + * unsigned integer pixel samples. + */ + UInt8PixelTraits::sample operator ()( UInt8PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt8PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 16-bit + * unsigned integer pixel samples. + */ + UInt16PixelTraits::sample operator ()( UInt16PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt16PixelTraits*)0 ); + } + + /*! + * Applies this morphological operator to a vector \a f of \a n 32-bit + * unsigned integer pixel samples. + */ + UInt32PixelTraits::sample operator ()( UInt32PixelTraits::sample* f, size_type n ) const override + { + return Operate( f, n, (UInt32PixelTraits*)0 ); + } + +private: + + float d = 0.2F; + + template + T Operate( T* f, size_type n, P* ) const + { + pcl::Sort( f, f+n ); + double s = 0; + size_type i1 = RoundInt( d*((n - 1) >> 1) ); + size_type i2 = n-i1; + for ( size_type i = i1; i < i2; ++i ) + s += f[i]; + return P::FloatToSample( s/(i2 - i1) ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MorphologicalOperator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MorphologicalOperator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MorphologicalTransformation.h b/3rdparty/include/pcl/MorphologicalTransformation.h new file mode 100644 index 0000000..9770222 --- /dev/null +++ b/3rdparty/include/pcl/MorphologicalTransformation.h @@ -0,0 +1,246 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MorphologicalTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MorphologicalTransformation_h +#define __PCL_MorphologicalTransformation_h + +/// \file pcl/MorphologicalTransformation.h + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MorphologicalTransformation + * \brief Generic n-way morphological transformation. + * + * ### TODO: Write a detailed description for %MorphologicalTransformation. + * + * \sa MorphologicalOperator, StructuringElement + */ +class PCL_CLASS MorphologicalTransformation : public InterlacedTransformation, + public ThresholdedTransformation, + public ParallelProcess +{ // N.B. ImageTransformation is a virtual base class +public: + + /*! + * Constructs a default %MorphologicalTransformation object. + * + * \note This constructor creates an uninitialized instance. In order to use + * this object, it must be associated with a particular operator and + * structuring element by calling the SetOperator() and SetStructure() + * member functions, respectively, with the appropriate instances of + * MorphologicalOperator and StructuringElement. + */ + MorphologicalTransformation() = default; + + /*! + * Constructs a %MorphologicalTransformation object with the specified + * operator and structuring element. + * + * The specified objects don't have to remain valid while this + * %MorphologicalTransformation instance is actively used, since it will + * own private copies of the specified filter operator and structure. + */ + MorphologicalTransformation( const MorphologicalOperator& op, const StructuringElement& structure ) + { + m_operator = op.Clone(); + m_structure = structure.Clone(); + m_structure->Initialize(); + } + + /*! + * Copy constructor. + */ + MorphologicalTransformation( const MorphologicalTransformation& x ) + : InterlacedTransformation( x ) + , ThresholdedTransformation( x ) + , ParallelProcess( x ) + { + if ( !x.m_operator.IsNull() ) + if ( !x.m_structure.IsNull() ) + { + m_operator = x.m_operator->Clone(); + m_structure = x.m_structure->Clone(); + } + } + + /*! + * Move constructor. + */ + MorphologicalTransformation( MorphologicalTransformation&& x ) = default; + + /*! + * Destroys a %MorphologicalTransformation object. + */ + virtual ~MorphologicalTransformation() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MorphologicalTransformation& operator =( const MorphologicalTransformation& x ) + { + if ( &x != this ) + { + (void)InterlacedTransformation::operator =( x ); + (void)ThresholdedTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + if ( !x.m_operator.IsNull() && !x.m_structure.IsNull() ) + { + m_operator = x.m_operator->Clone(); + m_structure = x.m_structure->Clone(); + } + else + { + m_operator.Destroy(); + m_structure.Destroy(); + } + } + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MorphologicalTransformation& operator =( MorphologicalTransformation&& ) = default; + + /*! + * Returns a reference to the morphological operator associated with this + * transformation. + */ + const MorphologicalOperator& Operator() const + { + PCL_PRECONDITION( !m_operator.IsNull() ) + return *m_operator; + } + + /*! + * Causes this transformation to use a duplicate of the specified + * morphological operator. + */ + void SetOperator( const MorphologicalOperator& op ) + { + m_operator = op.Clone(); + } + + /*! + * Returns a reference to the structuring element associated with this + * transformation. + */ + const StructuringElement& Structure() const + { + PCL_PRECONDITION( !m_structure.IsNull() ) + return *m_structure; + } + + /*! + * Causes this transformation to use a duplicate of the specified + * structuring element. + */ + void SetStructure( const StructuringElement& structure ) + { + m_structure = structure.Clone(); + m_structure->Initialize(); + } + + /*! + * Returns the size in pixels of the overlapping regions between adjacent + * areas processed by parallel execution threads. The overlapping distance + * is a function of the size of the associated structuring element and the + * current interlacing distance. + */ + int OverlappingDistance() const + { + PCL_PRECONDITION( !m_structure.IsNull() ) + return m_structure->Size() + (m_structure->Size() - 1)*(InterlacingDistance() - 1); + } + +protected: + + AutoPointer m_operator; // morphological operator + AutoPointer m_structure; // n-way structuring element + + /* + * In-Place 2-D Morphological Transformation Algorithm. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + +private: + + void Validate() const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MorphologicalTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MorphologicalTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MultiVector.h b/3rdparty/include/pcl/MultiVector.h new file mode 100644 index 0000000..6ad8247 --- /dev/null +++ b/3rdparty/include/pcl/MultiVector.h @@ -0,0 +1,432 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MultiVector.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MultiVector_h +#define __PCL_MultiVector_h + +/// \file pcl/MultiVector.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericMultiVector + * \brief Generic array of vectors. + * + * A multivector is a dynamic array of vectors. It can also be seen as a vector + * of vectors, or a vector whose components are also vectors. + * %GenericMultiVector implements a homogeneous multivector based on the Array + * and GenericVector template classes. Besides all the member functions + * inherited from its base class, it also provides some useful constructors and + * assignment operators, including arithmetic scalar-to-vector operators that + * work on all the contained vectors as a whole. + * + * Some typical applications of multivectors include: + * + * \li Implementation of more sophisticated mathematical objects and + * structures, such as tensors. + * + * \li Matrices where rows (or equivalently, columns) have to be manipulated + * as independent structures. For example, to swap two rows of a GenericMatrix + * you have to swap each pair of row elements successively, which is an O(N) + * operation. Swapping two component vectors of a multivector is an O(1) + * operation thanks to the implicit data sharing feature of %GenericVector, and + * hence does not require copying or duplicating data. + * + * \li Arrays and matrices where each component is a vector of variable length. + * + * As most PCL containers, %GenericMultiVector is a reference-counted class + * with implicit data sharing (or \e copy-on-write) functionality. + * + * \sa Array, GenericVector, GenericMatrix + */ +template +class PCL_CLASS GenericMultiVector : public Array > +{ +public: + + /*! + * The structure implementing this multivector class. + */ + typedef Array > multivector_implementation; + + /*! + * Represents a vector. + */ + typedef GenericVector vector; + + /*! + * Represents a scalar. + */ + typedef typename vector::scalar scalar; + + /*! + * Represents a vector component. + */ + typedef typename vector::component component; + + /*! + * Represents a mutable multivector iterator. + */ + typedef typename multivector_implementation::iterator + iterator; + + /*! + * Represents an immutable multivector iterator. + */ + typedef typename multivector_implementation::const_iterator + const_iterator; + + /*! + * Represents a mutable vector iterator. + */ + typedef typename vector::iterator vector_iterator; + + /*! + * Represents an immutable vector iterator. + */ + typedef typename vector::const_iterator const_vector_iterator; + + /*! + * Constructs an empty multivector. An empty multivector has no component + * vectors and zero length. + */ + GenericMultiVector() = default; + + /*! + * Constructs an uninitialized multivector of the specified \a length. + * + * This constructor does not initialize component vectors. The newly created + * multivector will contain \a length empty vectors. + */ + GenericMultiVector( size_type length ) + : multivector_implementation( length ) + { + } + + /*! + * Constructs a multivector with uninitialized component vectors. + * + * \param length Number of multivector components. + * + * \param vectorLength Number of vector components (>= 0). + * + * This constructor does not initialize vector components. The newly created + * vectors will contain unpredictable values. + */ + GenericMultiVector( size_type length, int vectorLength ) + : multivector_implementation( length ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i = vector( vectorLength ); + } + + /*! + * Constructs a multivector and fills it with a constant scalar. + * + * \param value Initial value for all vector components. + * + * \param length Number of multivector components. + * + * \param vectorLength Number of vector components (>= 0). + */ + GenericMultiVector( const scalar& value, size_type length, int vectorLength ) + : multivector_implementation( length ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i = vector( value, vectorLength ); + } + + /*! + * Constructs a multivector of two components initialized with copies of the + * specified vectors \a v0 and \a v1, respectively for the first and second + * component vectors. + */ + GenericMultiVector( const vector& v0, const vector& v1 ) + : GenericMultiVector( size_type( 2 ) ) + { + iterator i = this->Begin(); + *i = v0; *++i = v1; + } + + /*! + * Constructs a multivector of three components initialized with copies of + * the specified vectors \a v0, \a v1 and \a v2, respectively for the first, + * second and third component vectors. + */ + GenericMultiVector( const vector& v0, const vector& v1, const vector& v2 ) + : GenericMultiVector( size_type( 3 ) ) + { + iterator i = this->Begin(); + *i = v0; *++i = v1; *++i = v2; + } + + /*! + * Constructs a multivector of four components initialized with copies of + * the specified vectors \a v0, \a v1, \a v2 and \a v3, respectively for the + * first, second, third and fourth component vectors. + */ + GenericMultiVector( const vector& v0, const vector& v1, const vector& v2, const vector& v3 ) + : GenericMultiVector( size_type( 4 ) ) + { + iterator i = this->Begin(); + *i = v0; *++i = v1; *++i = v2; *++i = v3; + } + + /*! + * Copy constructor. + */ + GenericMultiVector( const GenericMultiVector& ) = default; + + /*! + * Move constructor. + */ + GenericMultiVector( GenericMultiVector&& ) = default; + + /*! + * Destroys a %GenericMultiVector object. + */ + ~GenericMultiVector() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + GenericMultiVector& operator =( const GenericMultiVector& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + GenericMultiVector& operator =( GenericMultiVector&& ) = default; + + /*! + * Assigns a constant scalar \a x to all vector components in this + * multivector. Returns a reference to this object. + */ + GenericMultiVector& operator =( const scalar& x ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i = x; + return *this; + } + + /*! + * Adds a constant scalar \a x to all vector components in this multivector. + * Returns a reference to this object. + */ + GenericMultiVector& operator +=( const scalar& x ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i += x; + return *this; + } + + /*! + * Subtracts a constant scalar \a x from all vector components of this + * multivector. Returns a reference to this object. + */ + GenericMultiVector& operator -=( const scalar& x ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i -= x; + return *this; + } + + /*! + * Multiplies all vector components in this multivector by a constant scalar + * \a x. Returns a reference to this object. + */ + GenericMultiVector& operator *=( const scalar& x ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i *= x; + return *this; + } + + /*! + * Divides all vector components in this multivector by a constant scalar + * \a x. Returns a reference to this object. + */ + GenericMultiVector& operator /=( const scalar& x ) + { + for ( iterator i = this->Begin(), j = this->End(); i < j; ++i ) + *i /= x; + return *this; + } + + /*! + * Returns the sum of all vector components. + */ + double Sum() const + { + double s = 0; + for ( const_iterator i = this->Begin(), j = this->End(); i < j; ++i ) + s += i->Sum(); + return s; + } + + /*! + * Computes the sum of vector components using a numerically stable + * summation algorithm to minimize roundoff error. + */ + double StableSum() const + { + DVector s( this->Length() ); + size_type n = 0; + for ( const_iterator i = this->Begin(), j = this->End(); i < j; ++i ) + s[n++] = i->StableSum(); + return s.StableSum(); + } + +#ifndef __PCL_NO_VECTOR_STATISTICS + + /*! + * Returns the value of the smallest vector component. For empty + * multivectors, this function returns zero. + */ + component MinComponent() const + { + if ( !this->IsEmpty() ) + { + component min = this->Begin()->MinComponent(); + for ( const_iterator i = this->Begin(), j = this->End(); ++i < j; ) + min = pcl::Min( min, i->MinComponent() ); + return min; + } + return component( 0 ); + } + + /*! + * Returns the value of the largest vector component. For empty + * multivectors, this function returns zero. + */ + component MaxComponent() const + { + if ( !this->IsEmpty() ) + { + component max = this->Begin()->MaxComponent(); + for ( const_iterator i = this->Begin(), j = this->End(); ++i < j; ) + max = pcl::Max( max, i->MaxComponent() ); + return max; + } + return component( 0 ); + } + +#endif // !__PCL_NO_VECTOR_STATISTICS +}; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_MULTIVECTOR_INSTANTIATE + +/*! + * \defgroup multivector_types Multivector Types + */ + +/*! + * \class pcl::DMultiVector + * \ingroup multivector_types + * \brief 64-bit floating point real multivector. + * + * %DMultiVector is a template instantiation of GenericMultiVector for the + * \c double data type. + */ +typedef GenericMultiVector DMultiVector; + +/*! + * \class pcl::FMultiVector + * \ingroup multivector_types + * \brief 32-bit floating point real multivector. + * + * %FMultiVector is a template instantiation of GenericMultiVector for the + * \c float data type. + */ +typedef GenericMultiVector FMultiVector; + +/*! + * \class pcl::IMultiVector + * \ingroup multivector_types + * \brief Integer multivector. + * + * %IMultiVector is a template instantiation of GenericMultiVector for the + * \c int data type. + */ +typedef GenericMultiVector IMultiVector; + +/*! + * \class pcl::MultiVector + * \ingroup multivector_types + * \brief 64-bit floating point real multivector. + * + * %MultiVector is an alias for DMultiVector. It is a template instantiation of + * GenericMultiVector for the \c double data type. + */ +typedef DMultiVector MultiVector; + +#endif // !__PCL_NO_MULTIVECTOR_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MultiVector_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MultiVector.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MultiViewSelectionDialog.h b/3rdparty/include/pcl/MultiViewSelectionDialog.h new file mode 100644 index 0000000..2642a3c --- /dev/null +++ b/3rdparty/include/pcl/MultiViewSelectionDialog.h @@ -0,0 +1,146 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MultiViewSelectionDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MultiViewSelectionDialog_h +#define __PCL_MultiViewSelectionDialog_h + +/// \file pcl/MultiViewSelectionDialog.h + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MultiViewSelectionDialog + * \brief A simple dialog box to select a set of existing views. + * + * %MultiViewSelectionDialog consists of a TreeBox control, populated with all + * existing views, plus standard OK and Cancel push buttons. This class is a + * useful helper whenever a process needs access to several user-selected views + * in a single operation. + * + * \sa ViewSelectionDialog, PreviewSelectionDialog, Dialog + */ +class MultiViewSelectionDialog : public Dialog +{ +public: + + /*! + * Constructs a %MultiViewSelectionDialog object. + * + * \param allowPreviews Whether to allow selection of previews, along + * with main views. The default value is true. + */ + MultiViewSelectionDialog( bool allowPreviews = true ); + + /*! + * Destroys a %MultiViewSelectionDialog object. + */ + virtual ~MultiViewSelectionDialog() + { + } + + /*! + * Returns the set of selected views. + */ + const Array& Views() const + { + return m_selectedViews; + } + + /*! + * Returns true if this dialog allows selection of previews along with main + * views; false if it can only select main views. This option can be + * controlled with a constructor parameter. + */ + bool PreviewsAllowed() const + { + return m_allowPreviews; + } + +private: + + Array m_selectedViews; + bool m_allowPreviews = true; + + void Regenerate(); + + VerticalSizer Global_Sizer; + TreeBox Views_TreeBox; + HorizontalSizer Row2_Sizer; + PushButton SelectAll_PushButton; + PushButton UnselectAll_PushButton; + CheckBox IncludeMainViews_CheckBox; + CheckBox IncludePreviews_CheckBox; + HorizontalSizer Buttons_Sizer; + PushButton OK_PushButton; + PushButton Cancel_PushButton; + + void OptionClick( Button& sender, bool checked ); + void ButtonClick( Button& sender, bool checked ); + void ControlShow( Control& sender ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MultiViewSelectionDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MultiViewSelectionDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MultiscaleLinearTransform.h b/3rdparty/include/pcl/MultiscaleLinearTransform.h new file mode 100644 index 0000000..b888233 --- /dev/null +++ b/3rdparty/include/pcl/MultiscaleLinearTransform.h @@ -0,0 +1,228 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MultiscaleLinearTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MultiscaleLinearTransform_h +#define __PCL_MultiscaleLinearTransform_h + +/// \file pcl/MultiscaleLinearTransform.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MultiscaleLinearTransform + * \brief A redundant multiscale transform using separable convolutions. + * + * The multiscale linear transform algorithm produces a set {w1,w2,...,wN,cN}, + * where each wj is a set of coefficients at scale j, which we call detail + * layer, and cN is a large-scale smoothed residual, which we call + * residual layer. Each layer has the same dimensions as the input + * image, hence the generated multiscale transform is redundant. + * + * The algorithm applies successive convolutions with separable filter kernels + * of increasing size 2*s + 1, where s grows following a monotonically + * increasing sequence (the dyadic sequence 1, 2, 4, ... is used by default). + * Multiscale coefficients are the differences between each pair of successive + * convolved images. By default Gaussian filters are used, but block average + * filters can also be used (see the class constructor) for special + * applications. + * + * The reconstruction algorithm consists of the sum of all wj multiscale layers + * for 1 <= j <= N, plus the residual layer cN. + * + * In our implementation, each layer in a multiscale linear transform is a + * floating-point image with the same dimensions as the transformed image. + * Layers are indexed from 0 to N. Layers at indexes from 0 to N-1 are detail + * layers, whose elements are actually convolved difference coefficients. + * Pixels in a detail layer can be negative, zero or positive real values. + * + * The last layer, at index N, is the large-scale residual layer. + * Pixels in the residual layer image can only be positive or zero real values. + * + * \ingroup multiscale_transforms + */ +class PCL_CLASS MultiscaleLinearTransform : public RedundantMultiscaleTransform +{ +public: + + /*! + * Represents a multiscale transform layer. + */ + typedef RedundantMultiscaleTransform::layer layer; + + /*! + * Represents a set of multiscale transform layers, or multiscale transform. + */ + typedef RedundantMultiscaleTransform::transform transform; + + /*! + * Represents a set of layer enabled/disabled states. + */ + typedef RedundantMultiscaleTransform::layer_state_set layer_state_set; + + /*! + * Constructs a %MultiscaleLinearTransform instance. + * + * \param n Number of detail layers. The transform will consist of \a n + * detail layers plus a residual layer, that is n+1 total + * layers. The default value is 4. + * + * \param d Scaling sequence. If \a d <= 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * \param useMeanFilters If true, the transformation will use block + * average filters (mean) instead of Gaussian filters. Mean + * filters have important special applications, such as + * computation of multiscale local variances. Gaussian filters + * are always used by default. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * layers and the dyadic scaling sequence). + * + * Successive layers are computed by applying separable convolutions with + * kernel filters of size 2*s + 1. The scaling sequence parameter \a d + * is interpreted as follows: + * + * - If the specified sequence parameter \a d is zero 0, then the transform + * uses the dyadic sequence: s = 1, 2, 4, ..., 2^j for 0 <= j < n. + * + * - If \a d > 0, then \a d is the constant increment in pixels between two + * successive scales (linear scaling sequence): s = d*j for 1 <= j < n. + */ + MultiscaleLinearTransform( int n = 4, int d = 0, bool useMeanFilters = false ) + : RedundantMultiscaleTransform( n, d ) + , m_useMeanFilters( useMeanFilters ) + { + } + + /*! + * Copy constructor. + */ + MultiscaleLinearTransform( const MultiscaleLinearTransform& ) = default; + + /*! + * Move constructor. + */ + MultiscaleLinearTransform( MultiscaleLinearTransform&& ) = default; + + /*! + * Destroys this %MultiscaleLinearTransform object. All existing transform + * layers are destroyed and deallocated. + */ + virtual ~MultiscaleLinearTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MultiscaleLinearTransform& operator =( const MultiscaleLinearTransform& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MultiscaleLinearTransform& operator =( MultiscaleLinearTransform&& ) = default; + + /*! + * Returns true iff this transform applies block average filters instead of + * Gaussian filters. See the class constructor for more information. + */ + bool UsesMeanFilters() const + { + return m_useMeanFilters; + } + + /*! + * Returns true iff this transform applies Gaussian filters instead of block + * average filters. See the class constructor for more information. + */ + bool UsesGaussianFilters() const + { + return !m_useMeanFilters; + } + +protected: + + /* + * Whether we should use mean (block average) or Gaussian separable filters. + */ + bool m_useMeanFilters = false; + + /* + * Transform (decomposition) + */ + void Transform( const pcl::Image& ) override; + void Transform( const pcl::DImage& ) override; + void Transform( const pcl::ComplexImage& ) override; + void Transform( const pcl::DComplexImage& ) override; + void Transform( const pcl::UInt8Image& ) override; + void Transform( const pcl::UInt16Image& ) override; + void Transform( const pcl::UInt32Image& ) override; + + friend class MLTDecomposition; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MultiscaleLinearTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MultiscaleLinearTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MultiscaleMedianTransform.h b/3rdparty/include/pcl/MultiscaleMedianTransform.h new file mode 100644 index 0000000..ac938ea --- /dev/null +++ b/3rdparty/include/pcl/MultiscaleMedianTransform.h @@ -0,0 +1,344 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MultiscaleMedianTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MultiscaleMedianTransform_h +#define __PCL_MultiscaleMedianTransform_h + +/// \file pcl/MultiscaleMedianTransform.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MultiscaleMedianTransform + * \brief Multiscale median transform / hybrid median-wavelet transform. + * + * The multiscale median transform algorithm produces a set {w1,w2,...,wN,cN}, + * where each wj is a set of coefficients at scale j, which we call detail + * layer, and cN is a large-scale smoothed residual, which we call + * residual layer. Each layer has the same dimensions as the input + * image, hence the generated multiscale transform is redundant. + * + * The algorithm applies successive median filters with a structuring element + * of increasing size 2*s + 1, where s grows following a monotonically + * increasing sequence (the dyadic sequence 1, 2, 4, ... is used by default). + * Multiscale coefficients are the differences between each pair of successive + * median filtered images. + * + * The hybrid median-wavelet transform merges the multiscale median and wavelet + * transforms in a single high-level operation. Wavelets are used to represent + * nonsignificant structures, such as noise and smooth regions, while median + * filtering is used to represent strong significant structures. This hybrid + * transform provides an optimal representation of the image by combining the + * strongest points of both techniques: wavelets are good to support smooth + * structures with weak variations, while the median transform is better at + * isolating significant, high-contrast structures. + * + * The reconstruction algorithm consists of the sum of all wj multiscale layers + * for 1 <= j <= N, plus the residual layer cN. + * + * References + * + * \li Starck, J.-L., Murtagh, F. and J. Fadili, A. (2010), Sparse %Image + * and Signal Processing: Wavelets, Curvelets, Morphological Diversity, + * Cambridge University Press. + * + * \li Barth, Timothy J., Chan, Tony, Haimes, Robert (Eds.) (2002), + * Multiscale and Multiresolution Methods: Theory and Applications, + * Springer. invited paper: Jean-Luc Starck, Nonlinear Multiscale + * Transforms, pp. 239-279. + * + * In our implementation, each layer in a multiscale median transform is a + * floating-point image with the same dimensions as the transformed image. + * Layers are indexed from 0 to N. Layers at indexes from 0 to N-1 are detail + * layers, whose elements are actually median difference coefficients. Pixels + * in a multiscale layer can be negative, zero or positive real values. + * + * The last layer, at index N, is the large-scale residual layer. Pixels in the + * residual layer image can only be positive or zero real values. + * + * The original algorithm uses square structuring elements. Square structures + * lead to relatively simple and efficient implementations, but unfortunately + * they tend to generate objectionable artifacts around round shapes. In our + * implementation we use special multiway structures to minimize these + * artifacts and to improve the behavior of the algorithm to isolate isotropic + * image structures. + * + * \ingroup multiscale_transforms + */ +class PCL_CLASS MultiscaleMedianTransform : public RedundantMultiscaleTransform +{ +public: + + /*! + * Represents a multiscale transform layer. + */ + typedef RedundantMultiscaleTransform::layer layer; + + /*! + * Represents a set of multiscale transform layers, or multiscale transform. + */ + typedef RedundantMultiscaleTransform::transform transform; + + /*! + * Represents a set of layer enabled/disabled states. + */ + typedef RedundantMultiscaleTransform::layer_state_set layer_state_set; + + /*! + * Constructs a %MultiscaleMedianTransform instance. + * + * \param n Number of detail layers. The transform will consist of \a n + * detail layers plus a residual layer, that is n+1 total + * layers. The default value is 4. + * + * \param d Scaling sequence. If \a d <= 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * layers and the dyadic scaling sequence). + * + * Successive layers are computed by applying median filters with + * structuring elements of size 2*s + 1. The scaling sequence parameter \a d + * is interpreted as follows: + * + * - If the specified sequence parameter \a d is zero 0, then the transform + * uses the dyadic sequence: s = 1, 2, 4, ..., 2^j for 0 <= j < n. + * + * - If \a d > 0, then \a d is the constant increment in pixels between two + * successive scales (linear scaling sequence): s = d*j for 1 <= j < n. + */ + MultiscaleMedianTransform( int n = 4, int d = 0 ) + : RedundantMultiscaleTransform( n, d ) + { + } + + /*! + * Copy constructor. + */ + MultiscaleMedianTransform( const MultiscaleMedianTransform& ) = default; + + /*! + * Move constructor. + */ + MultiscaleMedianTransform( MultiscaleMedianTransform&& ) = default; + + /*! + * Destroys this %MultiscaleMedianTransform object. All existing transform + * layers are destroyed and deallocated. + */ + virtual ~MultiscaleMedianTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MultiscaleMedianTransform& operator =( const MultiscaleMedianTransform& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MultiscaleMedianTransform& operator =( MultiscaleMedianTransform&& ) = default; + + /*! + * Returns true if this transform applies special multiway structuring + * elements for improved isotropic behavior. Returns false if simple + * structures are used instead for improved execution speed, at the cost of + * some performance degradation in the isotropic behavior of the transform. + */ + bool UsingMultiwayStructures() const + { + return m_multiwayStructures; + } + + /*! + * Enables the use of multiway structuring elements. See + * UsingMultiwayStructures() for more information. + * + * \note Calling this member function implicitly deletes all existing + * transform layers. + */ + void EnableMultiwayStructures( bool enable = true ) + { + DestroyLayers(); + m_multiwayStructures = enable; + } + + /*! + * Disables the use of multiway structuring elements. See + * UsingMultiwayStructures() for more information. + * + * \note Calling this member function implicitly deletes all existing + * transform layers. + */ + void DisableMultiwayStructures( bool disable = true ) + { + EnableMultiwayStructures( !disable ); + } + + /*! + * Returns true iff this object performs a hybrid median-wavelet transform. + * Returns false if this is a pure multiscale median transform. + */ + bool IsMedianWaveletTransform() const + { + return m_medianWaveletTransform; + } + + /*! + * Causes this object to perform a hybrid wavelet-median transform. + * + * \param threshold Threshold in sigma units for per-layer suppression of + * significant median transform coefficients. Image + * structures represented by median coefficients with + * absolute values smaller than this threshold will be + * supported by wavelet transform coefficients. The + * default value is 5 sigma. + * + * \note Calling this member function implicitly deletes all existing + * transform layers. + */ + void SetMedianWaveletTransform( float threshold = 5 ) + { + DestroyLayers(); + m_medianWaveletTransform = true; + m_medianWaveletThreshold = Max( 0.F, threshold ); + } + + /*! + * Sets a threshold in sigma units for per-layer suppression of significant + * median transform coefficients. Image structures represented by median + * coefficients with absolute values smaller than this threshold will be + * supported by wavelet transform coefficients. The larger this value, the + * more image structures will be supported by wavelet coefficients. + * + * By default the median-wavelet threshold is 5 sigma. This is normally + * large enough to prevent inclusion of the noise in median transform + * coefficients. + * + * \note Calling this member function implicitly deletes all existing + * transform layers. + */ + void SetMedianWaveletThreshold( float threshold ) + { + DestroyLayers(); + m_medianWaveletThreshold = Max( 0.F, threshold ); + } + + /*! + * Returns the current median-wavelet threshold in sigma units. See the + * documentation for SetMedianWaveletThreshold() for more information. + */ + float MedianWaveletThreshold() const + { + return m_medianWaveletThreshold; + } + + /*! + * Causes this object to perform a pure multiscale median transform. + * + * \note Calling this member function implicitly deletes all existing + * transform layers. + */ + void SetMultiscaleMedianTransform() + { + DestroyLayers(); + m_medianWaveletTransform = false; + } + +private: + + /* + * Use multiway structural elements for improved isotropy. + */ + bool m_multiwayStructures = true; + + /* + * Compute a wavelet-median transform. + */ + bool m_medianWaveletTransform = false; + + /* + * Median-wavelet threshold in sigma units. + */ + float m_medianWaveletThreshold = 5.0F; + + /* + * Transform (decomposition) + */ + void Transform( const pcl::Image& ) override; + void Transform( const pcl::DImage& ) override; + void Transform( const pcl::ComplexImage& ) override; + void Transform( const pcl::DComplexImage& ) override; + void Transform( const pcl::UInt8Image& ) override; + void Transform( const pcl::UInt16Image& ) override; + void Transform( const pcl::UInt32Image& ) override; + + friend class MMTDecomposition; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_MultiscaleMedianTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MultiscaleMedianTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/MuteStatus.h b/3rdparty/include/pcl/MuteStatus.h new file mode 100644 index 0000000..d264f09 --- /dev/null +++ b/3rdparty/include/pcl/MuteStatus.h @@ -0,0 +1,189 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/MuteStatus.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_MuteStatus_h +#define __PCL_MuteStatus_h + +/// \file pcl/MuteStatus.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class MuteStatus + * \brief A status monitoring callback that does not provide any progress + * information. + * + * %MuteStatus does not provide any information on the ongoing monitored + * process. However, it does check if either the current thread has been + * aborted (when the status monitoring process has been initiated from a + * running Thread object), or if the user has requested to cancel the current + * process (when the process has been initiated from the main thread). In both + * cases %MuteStatus attempts to terminate the process being monitored. + * + * %MuteStatus is useful as a specialized monitoring callback for processes + * running in threads, or for fast processes that don't require providing + * detailed progress information to the user. Compared to other callback + * objects such as StandardStatus and SpinStatus, %MuteStatus saves the tasks + * of generating textual information and writing it to GUI controls. These + * auxiliary tasks can be expensive for fast processes, and in some cases they + * may require even more computing time than the processes themselves. + * + * \sa StatusCallback, StatusMonitor, StandardStatus, SpinStatus, + * ProgressBarStatus, RealTimeProgressStatus, Console + */ +class PCL_CLASS MuteStatus : public StatusCallback +{ +public: + + /*! + * Constructs a default %MuteStatus object. + */ + MuteStatus() = default; + + /*! + * Copy constructor. + */ + MuteStatus( const MuteStatus& x ) + : StatusCallback( x ) + { + } + + /*! + * Move constructor. + */ + MuteStatus( MuteStatus&& x ) + : StatusCallback( std::move( x ) ) + , m_console( std::move( x.m_console ) ) + , m_thread( x.m_thread ) + { + x.m_thread = nullptr; + } + + /*! + * Destroys a %MuteStatus instance. + */ + virtual ~MuteStatus() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + MuteStatus& operator =( const MuteStatus& x ) + { + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + MuteStatus& operator =( MuteStatus&& x ) + { + if ( this != &x ) + { + (void)StatusCallback::operator =( std::move( x ) ); + m_console = std::move( x.m_console ); + m_thread = x.m_thread; + x.m_thread = nullptr; + } + return *this; + } + + /*! + * This function is called by a status \a monitor object when a new + * monitored process is about to start. + */ + int Initialized( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal an update of the + * progress count for the current process. + */ + int Updated( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal that the current + * process has finished. + */ + int Completed( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object when the progress + * information for the current process has been changed. + */ + void InfoUpdated( const StatusMonitor& monitor ) const override; + +private: + + mutable pcl::Console m_console; + mutable void* m_thread = nullptr; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_MuteStatus_h + +// ---------------------------------------------------------------------------- +// EOF pcl/MuteStatus.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Mutex.h b/3rdparty/include/pcl/Mutex.h new file mode 100644 index 0000000..c70fe00 --- /dev/null +++ b/3rdparty/include/pcl/Mutex.h @@ -0,0 +1,436 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Mutex.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Mutex_h +#define __PCL_Mutex_h + +/// \file pcl/Mutex.h + +#include +#include + +#include + +#ifdef __PCL_UNIX +# include +# include +# include +#endif + +#ifdef __PCL_WINDOWS +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Mutex + * \brief Adaptive mutual exclusion lock variable + * + * The word \e mutex is an abbreviation for mutual exclusion. A mutex + * object provides access synchronization for threads. A mutex protects one or + * more objects or a code section, so that only one thread can access them at a + * given time. + * + * To understand how mutual thread exclusion works and why is it needed, + * consider the following example code: + * + * \code + * int data; + * + * void functionOne() + * { + * data += 2; + * data *= 2; + * } + * + * void functionTwo() + * { + * data -= 3; + * data *= 3; + * } + * \endcode + * + * If functionOne() and functionTwo() are called in sequence, this happens: + * + * \code + * data = 3; + * functionOne(); // data is now = 10 + * functionTwo(); // data is now = 21 + * \endcode + * + * Now suppose that we define two threads that call the above functions: + * + * \code + * class ThreadOne : public Thread + * { + * //... + * void Run() override + * { + * functionOne(); + * } + * }; + * + * class ThreadTwo : public Thread + * { + * //... + * void Run() override + * { + * functionTwo(); + * } + * }; + * \endcode + * + * If we start both threads in sequence: + * + * \code + * data = 3; + * ThreadOne one; + * ThreadTwo two; + * one.Start(); + * two.Start(); + * \endcode + * + * then the following might happen: + * + * \code + * // ThreadOne calls functionOne: + * data += 2; // data is now = 5 + * + * // ThreadTwo calls functionTwo. This causes ThreadOne to enter a wait state + * // until ThreadTwo terminates: + * data -= 3; // data is now = 2 + * data *= 3; // data is now = 6 + * + * // ThreadOne resumes execution: + * data *= 2; // data is now = 12 + * \endcode + * + * Because both threads can access data in any order, and there is no + * guarantee as to when a given thread starts execution, the result may not be + * what we expect (we get 12 instead of 21). Adding synchronization with a + * %Mutex object in functionOne() and functionTwo() solves the problem: + * + * \code + * int data; + * Mutex mutex; + * + * void functionOne() + * { + * mutex.Lock(); + * data += 2; + * data *= 2; + * mutex.Unlock(); + * } + * + * void functionTwo() + * { + * mutex.Lock(); + * data -= 3; + * data *= 3; + * mutex.Unlock(); + * } + * \endcode + * + * A mutex can only be locked by a single thread at a time. After Lock() has + * been called from a thread T, other threads that call Lock() on the same + * mutex object block their execution until the thread T calls Unlock(). + * + * To attempt locking a mutex without blocking execution, the Mutex::TryLock() + * member function can be used. This can provide much higher performance than + * Mutex::Lock() when the calling threads don't depend on gaining exclusive + * access to the shared data being protected by the mutex object. + * + * %Mutex implements spinning locking, a technique that can also + * improve performance by avoiding expensive semaphore wait operations under + * high levels of contention. See the documentation for Mutex::Mutex( int ) and + * Mutex::Lock() for more information. + * + * %Mutex has been implemented as a low-level PCL class that does not depend on + * the PixInsight core application. On Windows platforms, %Mutex has been + * implemented as a wrapper to a critical section. On UNIX/Linux + * platforms, %Mutex uses atomic integer operations implemented as inline + * assembly code and direct calls to the pthreads library. + * + * \sa AutoLock, ReadWriteMutex + */ +class PCL_CLASS Mutex +{ +public: + + /*! + * Constructs a %Mutex object. + * + * \param spin Maximum number of spinning loops to do before + * performing a semaphore wait operation when a thread attempts + * to lock this mutex and it has already been locked by another + * thread. If this mutex becomes unlocked during the spinning + * loops, the expensive wait operation can be avoided. The spin + * count must be >= 0. The default value is 512. + */ + Mutex( int spin = 512 ) + : m_spinCount( Max( 0, spin ) ) + { +#ifdef __PCL_WINDOWS + (void)InitializeCriticalSectionAndSpinCount( &criticalSection, DWORD( m_spinCount ) ); +#else + (void)PThreadInitMutex(); +#endif + } + + /*! + * Destroys a %Mutex object. + * + * \warning Destroying a locked %Mutex object may result in undefined + * (mostly catastrophic) behavior. Always make sure that a mutex has been + * unlocked before destroying it. + */ + virtual ~Mutex() + { +#ifdef __PCL_WINDOWS + DeleteCriticalSection( &criticalSection ); +#else + (void)PThreadDestroyMutex(); +#endif + } + + /*! + * Copy constructor. This constructor is disabled because mutexes are unique + * objects. + */ + Mutex( const Mutex& ) = delete; + + /*! + * Copy assignment. This operator is disabled because mutexes are unique + * objects. + */ + Mutex& operator =( const Mutex& ) = delete; + + /*! + * Locks this %Mutex object. + * + * When a mutex has been locked in a thread T, other threads cannot lock it + * until the thread T unlocks it. When a thread attempts to lock a %Mutex + * object that has been previously locked, it blocks its execution until the + * %Mutex object is unlocked. + * + * If the mutex has already been locked by another thread, this routine + * performs a number of spin loops before doing an (expensive) wait + * operation on a semaphore associated with this mutex object. If this + * mutex becomes unlocked during the spinning loops, the wait operation can + * be avoided to lock the mutex in the calling thread. This can greatly + * improve efficiency of multithreaded code under high levels of contention + * (e.g. several running threads that depend on frequent concurrent accesses + * to shared data). For fine control and performance tuning, the maximum + * number of spinning loops performed can be specified as a parameter to the + * Mutex::Mutex( int ) constructor. + */ + void Lock() + { +#ifdef __PCL_WINDOWS + EnterCriticalSection( &criticalSection ); +#else + for ( int spin = m_spinCount; ; ) + { + // Is the mutex free? If so, get it now and don't look back! + if ( m_lockState.TestAndSet( 0, 1 ) ) + { + (void)PThreadLockMutex(); + break; + } + + if ( --spin < 0 ) + { + // Either no spinning, or spinned to no avail... + // Block thread until we can get this mutex. This is expensive. + (void)PThreadLockMutex(); + m_lockState.Store( 1 ); + break; + } + } +#endif + } + + /*! + * Unlocks this %Mutex object. + * + * See the Lock() documentation for more information. + */ + void Unlock() + { +#ifdef __PCL_WINDOWS + LeaveCriticalSection( &criticalSection ); +#else + m_lockState.Store( 0 ); + (void)PThreadUnlockMutex(); +#endif + } + + /*! + * Function call operator. This is a convenience operator that performs the + * lock and unlock operations in an alternative, perhaps more elegant way. + * + * \param lock Whether the mutex should be locked (when true) or unlocked + * (when \a lock is false). + * + * For example, the following code snippet: + * + * \code + * Mutex mutex; + * //... + * mutex( true ); + * // some code to be protected + * mutex( false ); + * \endcode + * + * is equivalent to: + * + * \code + * Mutex mutex; + * //... + * mutex.Lock(); + * // some code to be protected + * mutex.Unlock(); + * \endcode + */ + void operator ()( bool lock = true ) + { + if ( lock ) + Lock(); + else + Unlock(); + } + + /*! + * Attempts locking this %Mutex object. Returns true iff this mutex has been + * successfully locked. + * + * Unlike Lock(), this function does not block execution of the calling + * thread if this mutex cannot be locked. + */ + bool TryLock() + { +#ifdef __PCL_WINDOWS + return TryEnterCriticalSection( &criticalSection ) != FALSE; +#else + // ### N.B.: This code is performance and stability critical. DO NOT + // modify it unless you are absolutely sure of what you are doing. + return m_lockState == 0 && m_lockState.TestAndSet( 0, 1 ) && PThreadLockMutex(); +#endif + } + + /*! + * Returns the spin count of this %Mutex object. + * + * The spin count is a read-only property that can only be set upon object + * construction. For information on mutex spin counts, refer to %Mutex's + * constructor: Mutex::Mutex( int ). + */ + int SpinCount() const + { + return m_spinCount; + } + +private: + +#ifdef __PCL_WINDOWS + + CRITICAL_SECTION criticalSection; + +#else // Linux/UNIX + + AtomicInt m_lockState; // 0=unlocked, 1=acquired + pthread_mutex_t m_mutex; + + bool PThreadInitMutex() + { + return PThreadCheckError( pthread_mutex_init( &m_mutex, 0 ), "pthread_mutex_init" ); + } + + bool PThreadDestroyMutex() + { + return PThreadCheckError( pthread_mutex_destroy( &m_mutex ), "pthread_mutex_destroy" ); + } + + bool PThreadLockMutex() + { + return PThreadCheckError( pthread_mutex_lock( &m_mutex ), "pthread_mutex_lock" ); + } + + bool PThreadUnlockMutex() + { + return PThreadCheckError( pthread_mutex_unlock( &m_mutex ), "pthread_mutex_unlock" ); + } + + static bool PThreadCheckError( int errorCode, const char* funcName ) + { + if ( errorCode == 0 ) + return true; + fprintf( stderr, "%s() failed. Error code: %d\n", funcName, errorCode ); + return false; + } + +#endif // __PCL_WINDOWS + + int m_spinCount = 512; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Mutex_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Mutex.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/NearestNeighborInterpolation.h b/3rdparty/include/pcl/NearestNeighborInterpolation.h new file mode 100644 index 0000000..48cad0d --- /dev/null +++ b/3rdparty/include/pcl/NearestNeighborInterpolation.h @@ -0,0 +1,129 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/NearestNeighborInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NearestNeighborInterpolation_h +#define __PCL_NearestNeighborInterpolation_h + +/// \file pcl/NearestNeighborInterpolation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define m_width this->m_width +#define m_height this->m_height +#define m_data this->m_data + +// ---------------------------------------------------------------------------- + +/*! + * \class NearestNeighborInterpolation + * \brief Two-dimensional nearest neighbor interpolation algorithm + * + * Nearest neighbor interpolation selects the value of the nearest data point + * from the source 2-D matrix. This interpolation always returns existing data + * values in the source matrix, since it doesn't consider the values of other + * neighboring points. + * + * \sa BidimensionalInterpolation, BilinearInterpolation, + * BicubicSplineInterpolation, BicubicBSplineInterpolation, + * BicubicFilterInterpolation, + */ +template +class PCL_CLASS NearestNeighborInterpolation : public BidimensionalInterpolation +{ +public: + + /*! + * Constructs a %NearestNeighborInterpolation instance. + */ + NearestNeighborInterpolation() = default; + + /*! + * Copy constructor. + */ + NearestNeighborInterpolation( const NearestNeighborInterpolation& ) = default; + + /*! + * Returns an interpolated value at {\a x,\a y} location. + * + * \param x,y Coordinates of the interpolation point (horizontal,vertical). + */ + double operator()( double x, double y ) const override + { + PCL_PRECONDITION( m_data != nullptr ) + PCL_PRECONDITION( m_width > 0 && m_height > 0 ) + return double( *(m_data + (Range( RoundIntArithmetic( y ), 0, m_height-1 )*int64( m_width ) + + Range( RoundIntArithmetic( x ), 0, m_width-1 ))) ); + } +}; + +// ---------------------------------------------------------------------------- + +#undef m_width +#undef m_height +#undef m_data + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_NearestNeighborInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/NearestNeighborInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/NetworkTransfer.h b/3rdparty/include/pcl/NetworkTransfer.h new file mode 100644 index 0000000..506b171 --- /dev/null +++ b/3rdparty/include/pcl/NetworkTransfer.h @@ -0,0 +1,621 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/NetworkTransfer.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NetworkTransfer_h +#define __PCL_NetworkTransfer_h + +/// \file pcl/NetworkTransfer.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class NetworkTransfer + * \brief Synchronous network transfers. + * + * %NetworkTransfer is a simple network utility class with the following + * capabilities: + * + * \li Synchronous download and upload network data transfers. + * + * \li HTTP, FTP, SMTP, HTTPS, FTPS and SMTPS protocols supported. + * + * \li Supports user authentication. + * + * \li Event-driven operation with separate download, upload and progress event + * handlers. + * + * \li Transparent reusable connections for maximum performance. + * + * \li Thread-safe class. + */ +class PCL_CLASS NetworkTransfer : public UIObject +{ +public: + + /*! + * Constructs a default %NetworkTransfer object. + */ + NetworkTransfer(); + + /*! + * Destroys this client-side instance and dereferences the server-side + * object. If the server-side object becomes unreferenced, it will be + * garbage-collected and eventually destroyed by the core application. + * + * When the server-side object is destroyed, all active network connections + * are also closed automatically. See the CloseConnection() member function + * form more information. + */ + virtual ~NetworkTransfer() + { + } + + /*! + * Copy constructor. This constructor is disabled because %NetworkTransfer + * represents unique server-side objects. + */ + NetworkTransfer( const NetworkTransfer& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %NetworkTransfer + * represents unique server-side objects. + */ + NetworkTransfer& operator =( const NetworkTransfer& ) = delete; + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since network transfers are unique objects by definition, calling this + * member function has no effect. + */ + void EnsureUnique() override + { + // Unique by definition + } + + /*! + * Returns a reference to a null %NetworkTransfer instance. A null + * %NetworkTransfer does not correspond to an existing network transfer in + * the PixInsight core application. + */ + static NetworkTransfer& Null(); + + /*! + * Sets the URL of this %NetworkTransfer object. + * + * \param url A valid URL identifying the network resource of this + * network transfer operation. + * + * \param userName The user name for authentication. The default value + * is an empty string. + * + * \param userPassword The user password for authentication. The default + * value is an empty string. + * + * URLs must be valid and conform to the URI specification from RFC 3986 + * (Uniform Resource Identifier: Generic Syntax). The HTTP, FTP, HTTPS, + * FTPS, SSH and SMTP protocols are supported. + * + * The \a url may include user authentication data in the 'user:password@' + * format. It may also include a port specification. For example: + * + * ftp://somebody:secretpwd@ftp.somewhere.com/mydir/myfile.txt:21 + * + * However, if explicit user name and password are specified, they will + * override any user authentication data included in the URL. In all cases, + * user authentication data will never be shown on the console. + * + * If the specified URL is not syntactically valid, this function throws an + * Error exception. Existence or responsiveness of the server are not + * verified. + */ + void SetURL( const String& url, const String& userName = String(), const String& userPassword = String() ); + + /*! + * Sets the proxy URL of this %NetworkTransfer object. + * + * \param url A valid URL identifying the proxy server used by + * this network transfer operation. + * + * \param userName The user name for proxy authentication. The default + * value is an empty string. + * + * \param userPassword The user password for proxy authentication. The + * default value is an empty string. + * + * The parameters used by this member function are identical to those of the + * SetURL() function. + * + * If the specified URL is not syntactically valid, this function throws an + * Error exception. Existence or responsiveness of the proxy server are not + * verified. + */ + void SetProxyURL( const String& url, const String& userName = String(), const String& userPassword = String() ); + + /*! + * Set SSL/TLS options. + * + * \param useSSL Enable SSL/TLS for the FTP, SMTP, POP3 and IMAP + * protocols. These are protocols that start plain text by + * default but can be restarted automatically using secure + * connections. The default value is true. + * + * \param forceSSL If true, SSL will be required for communication during + * the whole transfer operation; in this case, if SSL is + * not available the connection will fail. If this + * parameter is false, SSL/TLS will be used if available, + * but the operation will continue (insecurely) otherwise. + * The default value is false. + * + * \param verifyPeer Verify the authenticity of the peer's certificate, and + * fail if it is not authentic. The peer's certificate is + * checked through a chain of certification authority (CA) + * cerfificates supplied by the calling machine. If this + * parameter is false, the connection won't fail if the + * authenticity of the server's certificate cannot be + * verified. This parameter works for all TLS based + * protocols: HTTPS, FTPS, SMTPS, etc. The default value + * is true. + * + * \param verifyHost Verify the identity of the host. The connection will + * fail if the Common Name or Subject Alternate Name + * fields of the server's certificate don't match the host + * name in the URL set via the SetURL() member function. + * If this parameter is false, the connection won't fail + * if the identity of the server cannot be verified. This + * parameter works for all TLS based protocols: HTTPS, + * FTPS, SMTPS, etc. If the \a verifyPeer parameter is + * false, this parameter is ignored. The default value is + * true. + * + * By default, all %NetworkTransfer objects are initialized to use SSL/TLS + * if possible for plain text protocols. Authenticity of peer and host + * certificates are always verified by default. In other words, the default + * parameter values of this member function reflect the default state of the + * object upon construction. + * + * If the specified SSL settings are not valid for some reason, or if an + * internal error occurs, this function throws an Error exception. + */ + void SetSSL( bool useSSL = true, bool forceSSL = false, bool verifyPeer = true, bool verifyHost = true ); + + /*! + * Define a set of custom HTTP headers. + * + * \param nlsHeaders A newline-separated list of custom HTTP headers. To + * remove all custom headers and return to the default set + * of HTTP headers, specify an empty string. + * + * The specified list of custom headers will replace any previously defined + * list, if one was set by calling this function. + * + * To disable an HTTP header, specify an empty header value (no characters + * after the ':'). For example: + * + * "User-Agent:" + * + * To define a custom header without a value, include no ':' separator and + * end the header with a semicolon: + * + * "CustomHeader;" + * + * Example: + * + * \code + * NetworkTransfer N; + * N.SetURL( "http://foo-bar.com/" ); + * N.SetCustomHTTPHeaders( "Content-Type: text/plain\nMyCustomHeader: 1" ); + * N.OnUploadDataRequested( MyUploadDataFunc, receiver ); + * N.Upload(); + * \endcode + */ + void SetCustomHTTPHeaders( const String& nlsHeaders ); + + /*! + * Sets the connection timeout for this %NetworkTransfer object. + * + * \param seconds Connection timeout in seconds. Can legally be zero to + * reset the connection timeout to its default value of 30 + * seconds. + * + * If the specified timeout is not valid for some reason, or if an internal + * error occurs, this function throws an Error exception. + */ + void SetConnectionTimeout( int seconds ); + + /*! + * Performs a data download operation. + * + * Returns true upon successful completion of the download operation. + * Returns false in the event of error, or if the operation was aborted. + * + * \note Before invoking this function, a download event handler must be set + * by calling OnDownloadDataAvailable(). + */ + bool Download(); + + /*! + * Performs a data upload operation. + * + * \param uploadSize The total size in bytes of the data that will be + * transferred. For example, if you are going to upload a + * disk file, you should specify the file size here. If + * the size cannot be known in advance, this argument can + * legally be zero. However, specifying the total upload + * size can improve uploading performance significantly. + * The default value is zero. + * + * Returns true upon successful completion of the upload operation. Returns + * false in the event of error, or if the operation was aborted. + * + * \note Before invoking this function, an upload event handler must be set + * by calling OnUploadDataRequested(). + */ + bool Upload( fsize_type uploadSize = 0 ); + + /*! + * Performs an HTTP POST operation. + * + * Example: + * + * \code + * NetworkTransfer transfer; + * transfer.SetURL( "http://example-cars-info-site.com/" ); + * transfer.OnDownloadDataAvailable( GetCarInfo, receiver ); + * if ( !transfer.POST( "brand=Toyota&model=RAV4" ) ) + * throw Error( "POST operation failed: " + transfer.ErrorInformation() ); + * \endcode + * + * Returns true upon successful completion of the POST operation. Returns + * false in the event of error, or if the operation has been aborted. + * + * This member function performs a download operation. The downloaded data + * will be the server response to the POSTed \a fields. + * + * \note Before invoking this function, a download event handler must be set + * by calling OnDownloadDataAvailable(). + */ + bool POST( const String& fields ); + + /*! + * Performs an SMTP operation. + * + * \param mailFrom The 'return-to' email address. + * + * \param mailRecipients The list of recipients for this SMTP operation, + * usually a list of email addresses that will receive the + * transferred data as an email message. + * + * Returns true upon successful completion of the SMTP operation. Returns + * false in the event of error, or if the operation has been aborted. + * + * This member function performs an upload operation. The uploaded data will + * be the header and body of an email message. See RFC 5322 for detailed + * information on the data format applicable. + * + * \note Before invoking this function, an upload event handler must be set + * by calling OnUploadDataRequested(). + */ + bool SMTP( const String& mailFrom, const StringList& mailRecipients ); + + /*! + * Closes the internal network connection associated with this object. + * + * Normally, when you call one of the Download(), Upload(), POST() or SMTP() + * member functions for the first time with a %NetworkTransfer object, the + * PixInsight core application does not close the network connection + * automatically after completing the operation. The connection remains + * active for some time, ready to be reused if the same %NetworkTransfer + * object is used again to perform additional (and compatible) data + * transfers. This greatly improves performance of network transactions. + * + * By calling this function you can force immediate close of the active + * connection. If there is no active connection associated with this object, + * this function is simply ignored. Note that the destructor of + * %NetworkTransfer also closes any active connection automatically. + */ + void CloseConnection(); + + /*! + * Returns the URL of the last network transfer operation performed with + * this object, or an empty string if no transfer operation has been done. + * + * \note User authentication data (user name and password) will never be + * included in the URL returned by this function. + */ + String URL() const; + + /*! + * Returns the newline-separated list of custom HTTP headers defined for + * this object, or an empty string if no custom headers have been defined. + * Custom HTTP headers are defined by calling SetCustomHTTPHeaders(). + */ + String CustomHTTPHeaders() const; + + /*! + * Returns the URL of the proxy server used in the last network transfer + * operation performed with this object, or an empty string if no proxy + * server has been specified. + * + * \note Proxy user authentication data (user name and password) will never + * be included in the URL returned by this function. + */ + String ProxyURL() const; + + /*! + * Returns true if the last network transfer operation was successful; false + * in the event of error, if no transfer operation has been performed with + * this object, or if the last operation was aborted. + */ + bool PerformedOK() const; + + /*! + * A synonym for PerformedOK() + */ + operator bool() const + { + return PerformedOK(); + } + + /*! + * Returns true iff the last network transfer operation was aborted by an + * event handler. Returns false if the operation was not aborted (whether + * successful or not), or if no transfer operation has been performed with + * this object. + */ + bool WasAborted() const; + + /*! + * Returns the server response code after the last call to Perform(). + * Returns zero if the response code could not be retrieved, or if no + * transfer operation has been done. + */ + int ResponseCode() const; + + /*! + * The content type (or MIME type) reported by the remote server after a + * successful download operation, or an empty string if no valid content + * type could be retrieved, if the last operation was an upload, or if no + * transfer operation has been performed with this object. + */ + String ContentType() const; + + /*! + * Returns the total number of bytes transferred in the last network + * operation performed with this object (whether successful or not). + */ + fsize_type BytesTransferred() const; + + /*! + * Returns the transfer speed in KiB per second, measured for the last + * network transfer operation performed with this object. + */ + double TotalSpeed() const; + + /*! + * Returns the total elapsed time in seconds, measured for the last + * network transfer operation performed with this object. + */ + double TotalTime() const; + + /*! + * Returns the error information generated in the last network transfer + * operation. Returns an empty string if no error occurred, or if no + * transfer operation has been performed with this object. + * + * Note that this function may return some useful diagnostics information, + * even if the last operation was successful. + */ + String ErrorInformation() const; + + /*! + * \defgroup network_transfer_event_handlers NetworkTransfer Event Handlers + */ + + /*! + * Defines the prototype of a download event handler. + * + * A download event is generated when a %NetworkTransfer instance receives + * data from a remote location, which is ready to be processed by the + * calling process. + * + * \param sender The object that sends a download event. + * + * \param buffer The starting address of a contiguous block of data that + * has been downloaded. The handler function must not modify + * these data in any way. + * + * \param size The length in bytes of the \a buffer data block. + * + * The handler returns true to continue the download operation. If it + * returns false, the operation will be aborted. + * + * \ingroup network_transfer_event_handlers + */ + typedef bool (Control::*download_event_handler)( NetworkTransfer& sender, const void* buffer, fsize_type size ); + + /*! + * Defines the prototype of an upload event handler. + * + * An upload event is generated when a %NetworkTransfer instance is ready to + * send new data to a remote location, which must be provided by the calling + * process. + * + * \param sender The object that sends an upload event. + * + * \param buffer The starting address of a contiguous memory block where + * the data to be uploaded must be copied by the handler + * function. + * + * \param maxSize The maximum length in bytes of the \a buffer data block. + * The handler function must \e not store more bytes than the + * value passed in this argument. + * + * The handler returns an integer value, which will be interpreted as + * follows: + * + * \li An integer greater than zero is the actual size in bytes of the + * contiguous block that has been copied back to the passed \a buffer. In + * this case the returned value must be less than or equal to \a maxSize. + * + * \li Zero to finalize the upload operation. + * + * \li A negative integer to abort the upload operation. + * + * \ingroup network_transfer_event_handlers + */ + typedef fsize_type (Control::*upload_event_handler)( NetworkTransfer& sender, void* buffer, fsize_type maxSize ); + + /*! + * Defines the prototype of a progress event handler. + * + * A %NetworkTransfer instance generates progress events at regular + * intervals during an active data transfer operation. Handling these events + * can be useful to provide feedback to the user during long download or + * upload procedures. + * + * \param sender The object that sends a progress event. + * + * \param downloadTotal Total download size in bytes. + * + * \param downloadCurrent Size of currently downloaded data in bytes. + * + * \param uploadTotal Total upload size in bytes. + * + * \param uploadCurrent Size of currently uploaded data in bytes. + * + * The handler returns true to continue the ongoing operation. If it returns + * false, the operation will be aborted. + * + * \ingroup network_transfer_event_handlers + */ + typedef bool (Control::*progress_event_handler)( NetworkTransfer& sender, + fsize_type downloadTotal, fsize_type downloadCurrent, + fsize_type uploadTotal, fsize_type uploadCurrent ); + + /*! + * Sets the handler for download data available events generated by + * this %NetworkTransfer object. These events are generated when the object + * receives data from a remote location, which is ready to be processed. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive events from this object. + * + * \ingroup network_transfer_event_handlers + */ + void OnDownloadDataAvailable( download_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for upload data requested events generated by + * this %NetworkTransfer object. These events are generated when the object + * is ready to send new data to a remote location. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive events from this object. + * + * \ingroup network_transfer_event_handlers + */ + void OnUploadDataRequested( upload_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for transfer progress events generated by this + * %NetworkTransfer object. These events are generated at regular intervals + * during an active data transfer operation. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive events from this object. + * + * \ingroup network_transfer_event_handlers + */ + void OnTransferProgress( progress_event_handler handler, Control& receiver ); + +private: + + download_event_handler onDownloadDataAvailable = nullptr; + upload_event_handler onUploadDataRequested = nullptr; + progress_event_handler onTransferProgress = nullptr; + + NetworkTransfer( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class NetworkTransferEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_NetworkTransfer_h + +// ---------------------------------------------------------------------------- +// EOF pcl/NetworkTransfer.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/NumericControl.h b/3rdparty/include/pcl/NumericControl.h new file mode 100644 index 0000000..b6e2116 --- /dev/null +++ b/3rdparty/include/pcl/NumericControl.h @@ -0,0 +1,468 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/NumericControl.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NumericControl_h +#define __PCL_NumericControl_h + +/// \file pcl/NumericControl.h + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class NumericEdit + * \brief A label/edit compound control to edit numeric parameters. + * + * ### TODO: Write a detailed description for %NumericEdit. + */ +class PCL_CLASS NumericEdit : public Control +{ +public: + + HorizontalSizer sizer; //!< The Sizer object of this %NumericEdit control + Label label; //!< The Label part of this %NumericEdit control + Edit edit; //!< The Edit part of this %NumericEdit control + + /*! + * Constructs a %NumericEdit object as a child control of \a parent. + */ + NumericEdit( Control& parent = Null() ); + + /*! + * Destroys a %NumericEdit object. + */ + virtual ~NumericEdit() + { + } + + /*! + * Returns the current value of this %NumericEdit object. + */ + double Value() const + { + return m_value; + } + + /*! + * Sets the current value of this %NumericEdit object. + */ + void SetValue( double ); + + /*! # + */ + String ValueAsString( double ) const; + + /*! # + */ + String ValueAsString() const + { + return ValueAsString( m_value ); + } + + /*! # + */ + int MinEditWidth() const; + + /*! # + */ + void AdjustEditWidth(); + + /*! # + */ + bool IsReal() const + { + return m_real; + } + + /*! # + */ + void SetReal( bool real = true ); + + /*! # + */ + void SetInteger( bool integer = true ) + { + SetReal( !integer ); + } + + /*! # + */ + double LowerBound() const + { + return m_lowerBound; + } + + /*! # + */ + double UpperBound() const + { + return m_upperBound; + } + + /*! + * Sets the range of allowed control values. + * + * \param lower Minimum allowed control value, or lower bound. + * + * \param upper Maximum allowed control value, or upper bound. + * + * If the specified lower and upper bounds are not sorted in ascending + * order, this member function will swap them automatically. + */ + virtual void SetRange( double lower, double upper ); + + /*! # + */ + int Precision() const + { + return m_precision; + } + + /*! # + */ + void SetPrecision( int n ); + + /*! + * Returns true if the precision property is being applied literally as a + * fixed number of digits after the decimal separator. Returns false if + * precision refers to the number of represented significant digits. + * + * For example, if the current value is 123.45678 and precision is 4, the + * represented value would be: + * + * With fixed precision enabled: 123.4568 \n + * With fixed precision disabled: 123.5 + * + * By default, the precision property of a %NumericEdit control refers to + * the number of represented significant digits, so fixed precision is + * disabled by default. + * + * \sa EnableFixedPrecision(), Precision() + */ + bool IsFixedPrecision() const + { + return m_fixed; + } + + /*! + * Enables the fixed precision property of this %NumericEdit object. See + * IsFixedPrecision() for detailed information. + */ + void EnableFixedPrecision( bool enable = true ); + + /*! + * Disables the fixed precision property of this %NumericEdit object. See + * IsFixedPrecision() for detailed information. + */ + void DisableFixedPrecision( bool disable = true ) + { + EnableFixedPrecision( !disable ); + } + + /*! # + */ + bool IsScientificNotation() const + { + return m_scientific; + } + + /*! # + */ + void EnableScientificNotation( bool enable = true ); + + /*! # + */ + void DisableScientificNotation( bool disable = true ) + { + EnableScientificNotation( !disable ); + } + + /*! # + */ + int ScientificNotationTriggerExponent() const + { + return m_sciTriggerExp; + } + + /*! # + */ + void SetScientificNotationTriggerExponent( int exp10 ); + + /*! # + */ + bool IsFixedSign() const + { + return m_sign; + } + + /*! # + */ + void EnableFixedSign( bool enable = true ); + + /*! # + */ + void DisableFixedSign( bool disable = true ) + { + EnableFixedSign( !disable ); + } + + /*! # + */ + bool IsAutoAdjustEditWidth() const + { + return m_autoEditWidth; + } + + /*! # + */ + void EnableAutoAdjustEditWidth( bool enable = true ) + { + if ( (m_autoEditWidth = enable) != false ) + AdjustEditWidth(); + } + + /*! # + */ + void DisableAutoAdjustEditWidth( bool disable = true ) + { + EnableAutoAdjustEditWidth( !disable ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnValueUpdated( NumericControl& sender, double value ); + + /*! # + */ + typedef void (Control::*value_event_handler)( NumericEdit& sender, double value ); + + /*! # + */ + void OnValueUpdated( value_event_handler, Control& ); + +protected: + + struct EventHandlers + { + value_event_handler onValueUpdated = nullptr; + Control* onValueUpdatedReceiver = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + double m_value = 0; // current value + double m_lowerBound = 0; // acceptable range, lower bound + double m_upperBound = 1; // acceptable range, upper bound + int m_precision = 6; // number of decimal digits in non-sci mode, [0,16] + bool m_real = true; // whether this is a real or integer parameter + bool m_fixed = false; // precision is literal instead of significant digits? + bool m_scientific = false; // scientific notation enabled? + bool m_sign = false; // always show a sign character + bool m_autoEditWidth = true; // set width of edit control automatically + int m_sciTriggerExp = -1; // exponent (of ten) to trigger sci notation + + PCL_MEMBER_REENTRANCY_GUARD( EditCompleted ) + + virtual void UpdateControls(); + + virtual void EditCompleted( Edit& ); + virtual void KeyPressed( Control&, int, unsigned, bool& ); + virtual void ReturnPressed( Edit& ); + virtual void GetFocus( Control& ); + virtual void LoseFocus( Control& ); + virtual void MousePress( Control&, const pcl::Point&, int, unsigned, unsigned ); + + int PrecisionForValue( double ) const; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class NumericControl + * \brief A label/edit/slider compound control to edit numeric parameters + * + * ### TODO: Write a detailed description for %NumericControl. + */ +class PCL_CLASS NumericControl : public NumericEdit +{ +public: + + HorizontalSlider slider; //!< The Slider part of this %NumericEdit control + + /*! + * Constructs a %NumericControl object as a child control of \a parent. + */ + NumericControl( Control& parent = Null() ); + + /*! + * Destroys a %NumericControl object. + */ + virtual ~NumericControl() + { + } + + /*! + * Sets the range of allowed control values. + * + * \param lower Minimum allowed control value, or lower bound. + * + * \param upper Maximum allowed control value, or upper bound. + * + * If the specified lower and upper bounds are not sorted in ascending + * order, this member function will swap them automatically. + * + * If the resulting lower bound is negative, the exponential slider response + * feature will be implicitly disabled. + */ + void SetRange( double lower, double upper ) override; + + /*! + * Returns true if the slider component of this %NumericControl has + * exponential response. Returns false if the slider has the default linear + * response. + * + * When exponential response is enabled, the slider defines control values + * following an exponential growth function of the form: + * + * y = (1 + y0)*Exp( k*x ) - 1 + * + * where y is the current control value, y0 is the minimum allowed control + * value (as returned by LowerBound()), x is the current slider position + * normalized to the [0,1] range, and k is an automatically calculated + * exponential growth factor given by: + * + * k = Ln( (1 + y1)/(1 + y0) ) + * + * where y1 is the maximum allowed control value, as returned by + * UpperBound(). + * + * Exponential slider response is useful for %NumericControl objects used to + * define parameters with very large numeric ranges, such as [0,500] or + * [0,1000] for example. For such large ranges, one normally wants to + * provide finer control for low parameter values, which is impossible with + * a linear slider response. The exponential slider response feature is + * disabled by default, that is, sliders have linear response by default. + * + * The exponential slider response feature is only available for controls + * where the minimum allowed value (given by LowerBound()) is greater than + * or equal to zero. + * + * \sa EnableExponentialResponse(), DisableExponentialResponse() + */ + bool IsExponentialResponse() const + { + return m_exponential; + } + + /*! + * Enables the exponential slider response feature. See + * IsExponentialResponse() for detailed information. + * + * If the minimum allowed control value is negative, this member function + * throws an Error exception: The exponential slider response feature can + * only be enabled when LowerBound() ≥ 0. + * + * \sa IsExponentialResponse(), DisableExponentialResponse() + */ + void EnableExponentialResponse( bool enable = true ); + + /*! + * Disables the exponential slider response feature. See + * IsExponentialResponse() for detailed information. + * + * \sa IsExponentialResponse(), EnableExponentialResponse() + */ + void DisableExponentialResponse( bool disable = true ) + { + EnableExponentialResponse( !disable ); + } + +protected: + + void UpdateControls() override; + + virtual void ValueUpdated( Slider&, int ); + void KeyPressed( Control&, int, unsigned, bool& ) override; + void GetFocus( Control& ) override; + +private: + + bool m_exponential = false; + + double SliderValueToControl( int ) const; + int ControlValueToSlider( double ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_NumericControl_h + +// ---------------------------------------------------------------------------- +// EOF pcl/NumericControl.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/OnlineObjectSearchDialog.h b/3rdparty/include/pcl/OnlineObjectSearchDialog.h new file mode 100644 index 0000000..0ada84a --- /dev/null +++ b/3rdparty/include/pcl/OnlineObjectSearchDialog.h @@ -0,0 +1,300 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/OnlineObjectSearchDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_OnlineObjectSearchDialog_h +#define __PCL_OnlineObjectSearchDialog_h + +/// \file pcl/OnlineObjectSearchDialog.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS NetworkTransfer; + +// ---------------------------------------------------------------------------- + +/*! + * \class OnlineObjectSearchDialog + * \brief A dialog box to search for object data on online astronomical + * database services. + * + * %OnlineObjectSearchDialog allows the user to enter the name or identifier of + * an object to search for, such as 'M31', 'Pleiades', 'NGC 253', + * 'Orion Nebula', 'Antares', or 'alpha Lyr'. The dialog sends an ADQL query to + * a public SIMBAD database service to retrieve several object properties, + * including ICRS equatorial coordinates, proper motions and visual magnitude, + * among others. + * + * This class is a useful component for processes requiring a flexible and fast + * way to retrieve data for user-selected objects. Currently two public SIMBAD + * database services can be used: the master SIMBAD service in France (Centre + * de Données Astronomiques de Strasbourg) and its mirror site in the + * USA (Harvard-Smithsonian Center for Astrophysics). + * + * \b References + * + * SIMBAD Astronomical Database - CDS Strasbourg:\n + * http://simbad.u-strasbg.fr/simbad/ + * + * SIMBAD mirror site in the USA - CFA Harvard:\n + * http://simbad.cfa.harvard.edu/ + * + * SIMBAD TAP Service:\n + * http://simbad.u-strasbg.fr/simbad/sim-tap + * + * ADQL Cheat sheet:\n + * http://simbad.u-strasbg.fr/simbad/tap/help/adqlHelp.html + */ +class PCL_CLASS OnlineObjectSearchDialog : public Dialog +{ +public: + + /*! + * Default constructor. + */ + OnlineObjectSearchDialog(); + + /*! + * Returns the name of the object that has been found, or an empty string if + * no object has been found or searched for. + */ + const String& ObjectName() const + { + return m_objectName; + } + + /*! + * Returns a code representing the type of the object, or an empty string if + * no object has been found or searched for. + * + * Object type codes are abbreviations standardized on the SIMBAD database, + * such as 'GlC' (globular cluster), 'G' (galaxy), or '*' (star). + */ + const String& ObjectType() const + { + return m_objectType; + } + + /*! + * Returns a string representing the spectral type, or an empty string if no + * object has been found or searched for, or if the spectral type is not + * available for the specified object. + */ + const String& SpectralType() const + { + return m_spectralType; + } + + /*! + * Returns the V (visual) magnitude of the object, or zero if no object has + * been found or searched for, or if the V magnitude is not available for + * the specified object. + */ + double VMagnitude() const + { + return m_vmag; + } + + /*! + * Returns the ICRS right ascension coordinate in degrees, or zero if no + * object has been found or searched for. + */ + double RA() const + { + return m_RA; + } + + /*! + * Returns the ICRS declination coordinate in degrees, or zero if no object + * has been found or searched for. + */ + double Dec() const + { + return m_Dec; + } + + /*! + * Returns the proper motion in right ascension in mas/year, or zero if no + * object has been found or searched for, or if proper motions are not + * available for the specified object. + */ + double MuRA() const + { + return m_muRA; + } + + /*! + * Returns the proper motion in declination in mas/year, or zero if no + * object has been found or searched for, or if proper motions are not + * available for the specified object. + */ + double MuDec() const + { + return m_muDec; + } + + /*! + * Returns the parallax in mas, or zero if no object has been found or + * searched for, or if the parallax is not available for the specified + * object. + */ + double Parallax() const + { + return m_parallax; + } + + /*! + * Returns the radial velocity in km/s, or zero if no object has been found + * or searched for, or if the radial velocity is not available for the + * specified object. + */ + double RadialVelocity() const + { + return m_radVel; + } + + /*! + * Returns true iff an object has been specified and valid data have been + * found. In such case valid right ascension and declination coordinates are + * always available. Other data items (proper motions, etc) are optional, + * depending on the type of the object that has been searched for. + */ + bool IsValid() const + { + return m_valid; + } + + /*! + * Returns the user-defined text that has been searched for during the + * latest dialog execution. Typically this is either an empty string or the + * name or identifier of an astronomical object, such as 'M31', 'Pleiades', + * 'NGC 253', 'Orion Nebula', 'Antares', or 'alpha Lyr'. + */ + String SearchText() const + { + return ObjectName_Edit.Text(); + } + + /*! + * Returns the URL of the online database service provider that is currently + * selected on this dialog. + * + * The database server URL selected by the user on these dialogs is a global + * item stored in core application settings. It is restored by each instance + * of this class upon creation. + */ + String ServerURL() const; + +protected: + + VerticalSizer Global_Sizer; + HorizontalSizer Search_Sizer; + Label ObjectName_Label; + Edit ObjectName_Edit; + PushButton Search_Button; + HorizontalSizer Server_Sizer; + Label Server_Label; + ComboBox Server_ComboBox; + TextBox SearchInfo_TextBox; + HorizontalSizer Buttons_Sizer; + PushButton Get_Button; + PushButton Cancel_Button; + + String m_objectName; + String m_objectType; + String m_spectralType; + double m_vmag = 0; // V magnitude + double m_RA = 0; // degrees + double m_Dec = 0; // degrees + double m_muRA = 0; // mas/year + double m_muDec = 0; // mas/year + double m_parallax = 0; // mas + double m_radVel = 0; // km/s + bool m_valid = false; + bool m_downloading = false; + bool m_abort = false; + IsoString m_downloadData; + + void e_Show( Control& sender ); + void e_GetFocus( Control& sender ); + void e_LoseFocus( Control& sender ); + bool e_Download( NetworkTransfer& sender, const void* buffer, fsize_type size ); + bool e_Progress( NetworkTransfer& sender, + fsize_type downloadTotal, fsize_type downloadCurrent, + fsize_type uploadTotal, fsize_type uploadCurrent ); + void e_Click( Button& sender, bool checked ); + void e_ItemSelected( ComboBox& sender, int itemIndex ); + + void LoadSettings(); + void SaveSettings() const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_OnlineObjectSearchDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/OnlineObjectSearchDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Optional.h b/3rdparty/include/pcl/Optional.h new file mode 100644 index 0000000..0877267 --- /dev/null +++ b/3rdparty/include/pcl/Optional.h @@ -0,0 +1,283 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Optional.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Optional_h +#define __PCL_Optional_h + +/// \file pcl/Optional.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Optional + * \brief An object that can be in a defined or undefined state + * + * %Optional stores an instance of the template argument T along with a + * defined state Boolean flag. %Optional objects update their defined + * state automatically as they are created, copied and assigned. + * + * This class is useful to deal with objects that can be defined optionally, + * when it is inconvenient to manage the object's value and its defined state + * as two separate items. %Optional offers the power of encapsulation in + * object-oriented languages to solve these problems efficiently. + */ +template +class PCL_CLASS Optional +{ +public: + + /*! + * Constructs an undefined %Optional object. + * + * The value instance will be default-constructed implicitly, which means + * that the type T must provide valid default construction semantics. + */ + Optional() + : m_value() // N.B: this initialization prevents warnings such as + { // 'Optional<>::m_value may be used uninitialized...' + } + + /*! + * Copy constructor. + * + * The value instance will be copy-constructed implicitly, which means that + * the type T must provide valid copy construction semantics if this + * constructor is invoked. + */ + Optional( const Optional& ) = default; + + /* + * Move constructor. + */ + Optional( Optional&& ) = default; + + /*! + * Constructs a defined %Optional object with the specified \a value. + */ + Optional( const T& value ) + : m_value( value ) + , m_defined( true ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Optional& operator =( const Optional& x ) + { + if ( bool( m_defined = x.m_defined ) ) + m_value = x.m_value; + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Optional& operator =( Optional&& x ) + { + if ( bool( m_defined = x.m_defined ) ) + m_value = std::move( x.m_value ); + return *this; + } + + /*! + * Assigns the specified \a value to this object. Returns a reference to + * this object. After assigning a value, an %Optional object will be in + * defined state. + */ + Optional& operator =( const T& value ) + { + m_value = value; + m_defined = true; + return *this; + } + + /*! + * Type conversion operator. Returns a reference to the value stored in this + * %Optional object. + * + * If this object is undefined, the returned value may be unpredictable, + * depending on construction semantics for the type T. + */ + operator const T&() const + { + return m_value; + } + + /*! + * Returns a reference to the value stored in this %Optional object. + * + * If this object is undefined, the returned value may be unpredictable, + * depending on construction semantics for the type T. + * + * This function performs the same role as operator const T&(). It is + * required for cases where an automatic type conversion is not applicable. + */ + const T& operator ()() const + { + return m_value; + } + + /*! + * Returns true if this %Optional object has been defined. + */ + bool IsDefined() const + { + return m_defined; + } + + /*! + * Undefines this %Optional object. Assigns a default-constructed object of + * type T to the value of this object, and sets the internal defined flag to + * false. + */ + void Undefine() + { + m_value = T(); + m_defined = false; + } + + /*! + * Returns the value stored in this object if it has been defined. Otherwise + * returns the specified \a value. + */ + const T& OrElse( const T& value ) const + { + return m_defined ? m_value : value; + } + + /*! + * Returns the value stored in this object if it has been defined. Otherwise + * throws the specified \a exception. + */ + template + const T& OrElseThrow( const Exception& exception ) const + { + if ( m_defined ) + return m_value; + throw exception; + } + + /*! + * Returns the value stored in this object if it has been defined. Otherwise + * throws an Error exception with the specified \a message. + */ + const T& OrElseThrow( const String& message ) const + { + if ( m_defined ) + return m_value; + throw Error( message ); + } + + /*! + * Equality operator. Returns true iff one of the following condition holds: + * + * \li This object has been defined, \a x has been defined, and the value in + * this object equals the value in \a x. + * + * \li Neither this object nor \a x have been defined. + */ + bool operator ==( const Optional& x ) const + { + return m_defined ? (x.m_defined ? m_value == x.m_value : false) : !x.m_defined; + } + + /*! + * Value equality operator. Returns true iff this object has been defined + * and its value equals the specified \a value. + */ + bool operator ==( const T& value ) const + { + return m_defined && m_value == value; + } + + /*! + * Less than relational operator. Returns true iff this object has been + * defined and either \a x has not been defined (defined objects always + * precede undefined ones), or the value in this object precedes the value + * in \a x. + */ + bool operator <( const Optional& x ) const + { + return m_defined && (!x.m_defined || m_value < x.m_value); + } + + /*! + * Less-than-value relational operator. Returns true iff this object has + * been defined and its value precedes the specified \a value. + */ + bool operator <( const T& value ) const + { + return m_defined && m_value < value; + } + +private: + + T m_value; + bool m_defined = false; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Optional_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Optional.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/OrthographicProjection.h b/3rdparty/include/pcl/OrthographicProjection.h new file mode 100644 index 0000000..6623f0f --- /dev/null +++ b/3rdparty/include/pcl/OrthographicProjection.h @@ -0,0 +1,144 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/OrthographicProjection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_OrthographicProjection_h +#define __PCL_OrthographicProjection_h + +/// \file pcl/OrthographicProjection.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class OrthographicProjection + * \brief Orthographic projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS OrthographicProjection : public ProjectionBase +{ +public: + + /*! + * Default constructor. + */ + OrthographicProjection() + { + m_theta0 = 90; + } + + /*! + * Copy constructor. + */ + OrthographicProjection( const OrthographicProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new OrthographicProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "SIN"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Orthographic"; + } + + /*! + * + */ + bool CheckBrokenLine( const DPoint& cp1, const DPoint& cp2 ) const noexcept override + { + return DistanceFast( m_sph.CelestialToNative( cp1 ), m_sph.CelestialToNative( cp2 ) ) < 150; + } + +protected: + + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override; + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override; + +private: + + double m_r0 = Const::deg(); + double m_x0 = 0; + double m_y0 = 0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_OrthographicProjection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/OrthographicProjection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PSFEstimator.h b/3rdparty/include/pcl/PSFEstimator.h new file mode 100644 index 0000000..a97865d --- /dev/null +++ b/3rdparty/include/pcl/PSFEstimator.h @@ -0,0 +1,392 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PSFEstimator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PSFEstimator_h +#define __PCL_PSFEstimator_h + +/// \file pcl/PSFEstimator.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PSFEstimator + * \brief Base class of estimators based on PSF photometry + * \sa PSFSignalEstimator, PSFScaleEstimator, StarDetector, PSFFit + */ +class PCL_CLASS PSFEstimator : public ParallelProcess +{ +public: + + /*! + * Represents a point spread function type. + */ + typedef StarDetector::psf_function psf_function; + + /*! + * Default constructor. + */ + PSFEstimator() = default; + + /*! + * Copy constructor. + */ + PSFEstimator( const PSFEstimator& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~PSFEstimator() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PSFEstimator& operator =( const PSFEstimator& ) = default; + + /*! + * Returns a reference to the (immutable) internal star detector used by + * this PSF estimator. + * + * PSF fitting will always be performed as a separate step after star + * detection, so the PSF fitting parameters of the returned object are + * meaningless for the estimation tasks implemented by derived classes. + */ + const StarDetector& Detector() const + { + return const_cast( m_starDetector ); + } + + /*! + * Returns a reference to the (mutable) internal star detector used by this + * PSF estimator. + * + * PSF fitting will always be performed as a separate step after star + * detection, so changing the PSF fitting parameters of the returned object + * will have no effect on the estimation tasks implemented by derived + * classes. + */ + StarDetector& Detector() + { + return m_starDetector; + } + + /*! + * Returns the type of point spread function (PSF) used by this estimator. + * Elliptical PSFs are always used for PSF-based evaluation. + * + * This implementation supports the special PSFunction::Auto PSF type. When + * this type is selected, a series of different PSFs will be fitted for each + * source, and the fit that leads to the least absolute difference among + * function values and sampled pixel values will be used for estimation. + * Currently the following functions are tested in this special mode: + * Gaussian, Lorentzian, and Moffat functions with beta shape parameters of + * 1.5, 4 and 10. + * + * The default PSF type is PSFunction::Moffat4. + */ + psf_function PSFType() const + { + return m_psfType; + } + + /*! + * Sets the type of point spread function used by this estimator. See + * PSFType() for more information. + */ + void SetPSFType( psf_function type ) + { + m_psfType = type; + } + + /*! + * Returns the centroid tolerance in pixels. + * + * The centroid tolerance is the maximum allowed distance in pixels between + * a detected star position (or \e barycenter) and the centroid position of + * the corresponding fitted PSF. Stars where that distance is greater than + * the value returned by this function will be rejected and excluded for + * estimation. This allows preventing PSF fits departing too much from + * detected star coordinates, which enforces robustness and stability of the + * PSF fitting process. + * + * The default centroid tolerance is 1.5 pixels. + */ + float PSFCentroidTolerance() const + { + return m_psfCentroidTolerance; + } + + /*! + * Sets the centroid tolerance in pixels. See PSFCentroidTolerance() for a + * description of this parameter. + */ + void SetPSFCentroidTolerance( float t ) + { + PCL_PRECONDITION( t >= 0 ) + m_psfCentroidTolerance = Max( 0.0F, t ); + } + + /*! + * Returns the saturation threshold for PSF flux measurements. + * + * Detected stars with one or more pixels with values above this threshold + * will be excluded to perform the PSF estimation task. + * + * The returned value is expressed in the [0,1] range. It can applied either + * as an absolute pixel sample value in the normalized [0,1] range, or as a + * value relative to the maximum pixel sample value of the measured image. + * See IsRelativeSaturationEnabled() for more information. + * + * The default saturation threshold is 0.75. + */ + float SaturationThreshold() const + { + return m_saturationThreshold; + } + + /*! + * Sets the saturation threshold in the [0,1] range. The minimum acceptable + * value \a t is 0.1. See SaturationThreshold() for a description of this + * parameter. + */ + void SetSaturationThreshold( float t ) + { + PCL_PRECONDITION( t >= 0.1 && t <= 1.0 ) + m_saturationThreshold = Range( t, 0.1F, 1.0F ); + } + + /*! + * The saturation threshold parameter can be applied either as an absolute + * pixel sample value in the normalized [0,1] range, or as a value relative + * to the maximum pixel sample value of the measured image. + * + * The relative saturation threshold option is enabled by default. + */ + bool IsRelativeSaturationEnabled() const + { + return m_saturationRelative; + } + + /*! + * Enables the relative saturation threshold option. See + * SaturationThreshold() and IsRelativeSaturationEnabled() for complete + * information on these parameters. + */ + void EnableRelativeSaturation( bool enable = true ) + { + m_saturationRelative = enable; + } + + /*! + * Disables the relative saturation threshold option. See + * SaturationThreshold() and IsRelativeSaturationEnabled() for complete + * information on these parameters. + */ + void DisableRelativeSaturation( bool disable = true ) + { + EnableRelativeSaturation( !disable ); + } + + /*! + * Returns the rejection limit parameter of this estimator. + * + * The rejection limit parameter defines an order statistic, in the [0.5,1] + * range, used to exclude a fraction of the brightest PSF signal samples + * during the estimation process. + * + * The brightest signal samples usually tend to be unreliable because of + * relative saturation and nonlinearity. However, reliability of PSF flux + * measurements is normally ensured by robust star detection, where the + * source detection algorithm excludes too dim stars, and the saturation + * threshold parameter should impose a reliable upper limit in most + * practical cases. So this parameter should not be necessary under normal + * working conditions. + * + * The default value of this parameter is 1.0, meaning that the sample of + * PSF flux measurements is not clipped by default. + */ + float RejectionLimit() const + { + return m_rejectionLimit; + } + + /*! + * Sets a new value of the rejection limit parameter in the [0.5,1] range. + * See RejectionLimit() for a complete description of this parameter. + */ + void SetRejectionLimit( float r ) + { + PCL_PRECONDITION( r >= 0.5 && r <= 1 ) + m_rejectionLimit = Range( r, 0.5F, 1.0F ); + } + + /*! + * Returns the growing factor for expansion/contraction of the PSF flux + * measurement region, in units of the Full Width at Tenth Maximum (FWTM), + * assuming a normalized PSF of unit height. + * + * The default value of this parameter is 1.0, meaning that flux is measured + * exclusively for pixels within the elliptical region defined at one tenth + * of the fitted PSF maximum. + */ + float GrowthFactorForFluxMeasurement() const + { + return m_growthForFlux; + } + + /*! + * Sets a new value of the growing factor for the PSF flux measurement + * region. See GrowthFactorForFluxMeasurement() for a description of this + * parameter. The valid range for the specified factor \a k is [0.5,2.0]. + */ + void SetGrowthFactorForFluxMeasurement( float k ) + { + PCL_PRECONDITION( k >= 0.5 && k <= 2.0 ) + m_growthForFlux = Range( k, 0.5F, 2.0F ); + } + + /*! + * Returns the maximum number of stars that will be measured. Returns zero + * if no limit has been set on the maximum number of PSF measurements. + * + * When a limit \a n greater than zero is specified, PSF-based estimation + * will be performed for no more than the \a n brightest stars detected in + * the target image. + * + * The default value is zero, meaning that no specific limit is set. + */ + int MaxStars() const + { + return m_maxStars; + } + + /*! + * Sets the maximum number of stars that will be measured. See MaxStars() + * for more information on this parameter. + * + * When a limit \a n greater than zero is specified, PSF-based estimation + * will be performed for no more than the \a n brightest stars detected in + * the target image. When a value ≤ 0 is specified, no specific limit + * will be set on the number of measured stars. + */ + void SetMaxStars( int n ) + { + PCL_PRECONDITION( n >= 0 ) + m_maxStars = Max( 0, n ); + } + + /*! + * Returns true iff PSF weighting is enabled. When PSF weighting is enabled, + * each photometric PSF sample is multiplied by the inverse of the mean + * absolute deviation of the fitted PSF measured with respect to sampled + * image data. + * + * PSF weighting is disabled by default. + */ + bool IsPSFWeightingEnabled() const + { + return m_weighted; + } + + /*! + * Enables PSF weighting for this signal estimator. See + * IsPSFWeightingEnabled() for more information. + */ + void EnablePSFWeighting( bool enable = true ) + { + m_weighted = enable; + } + + /*! + * Disables PSF weighting for this signal estimator. See + * IsPSFWeightingEnabled() for more information. + */ + void DisablePSFWeighting( bool disable = true ) + { + EnablePSFWeighting( !disable ); + } + +protected: + + mutable pcl::StarDetector m_starDetector; + psf_function m_psfType = PSFunction::Moffat4; + float m_psfCentroidTolerance = 1.5F; + float m_saturationThreshold = 0.75F; + bool m_saturationRelative = true; + float m_rejectionLimit = 1.0F; + float m_growthForFlux = 1.0F; + int m_maxStars = 0; + bool m_weighted = false; + + /*! + * \internal + * Thread-safe PSF fitting routine. + */ + Array FitStars( const ImageVariant& ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PSFEstimator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PSFEstimator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PSFFit.h b/3rdparty/include/pcl/PSFFit.h new file mode 100644 index 0000000..08daca2 --- /dev/null +++ b/3rdparty/include/pcl/PSFFit.h @@ -0,0 +1,611 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PSFFit.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PSFFit_h +#define __PCL_PSFFit_h + +/// \file pcl/PSFFit.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::PSFunction + * \brief Point spread function types. + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PSFunction::Invalid Represents an invalid or unsupported PSF type.
PSFunction::Gaussian Gaussian PSF.
PSFunction::Moffat Moffat PSF with a fitted beta parameter.
PSFunction::MoffatA Moffat PSF with fixed beta=10 parameter.
PSFunction::Moffat8 Moffat PSF with fixed beta=8 parameter.
PSFunction::Moffat6 Moffat PSF with fixed beta=6 parameter.
PSFunction::Moffat4 Moffat PSF with fixed beta=4 parameter.
PSFunction::Moffat25 Moffat PSF with fixed beta=2.5 parameter.
PSFunction::Moffat15 Moffat PSF with fixed beta=1.5 parameter.
PSFunction::Lorentzian Lorentzian PSF, equivalent to a Moffat PSF with fixed beta=1 parameter.
PSFunction::VariableShape Variable shape PSF
+ */ +namespace PSFunction +{ + enum value_type + { + Invalid = -1, // Represents an invalid or unsupported PSF type + Gaussian = 0, // Gaussian PSF + Moffat, // Moffat PSF with a fitted beta parameter + MoffatA, // Moffat PSF with fixed beta=10 + Moffat8, // Moffat PSF with fixed beta=8 + Moffat6, // Moffat PSF with fixed beta=6 + Moffat4, // Moffat PSF with fixed beta=4 + Moffat25, // Moffat PSF with fixed beta=2.5 + Moffat15, // Moffat PSF with fixed beta=1.5 + Lorentzian, // Lorentzian PSF, equivalent to a Moffat PSF with fixed beta=1 + VariableShape, // Variable shape PSF + NumberOfFunctions, + Auto = 999, // Automatic selection for optimization, process-dependent. + Default = Gaussian + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::PSFFitStatus + * \brief PSF fit process results. + * + * + * + * + * + * + * + * + * + * + *
PSFFitStatus::Invalid Represents an invalid or unsupported PSF fit status
PSFFitStatus::NotFitted The PSF has not been fitted because the process has not been executed.
PSFFitStatus::FittedOk PSF fitted correctly. The relative error of the solution is at most equal to the specified tolerance.
PSFFitStatus::BadParameters The PSF fitting process failed because of improper input parameters.
PSFFitStatus::NoSolution There is no solution with the specified parameters and source data.
PSFFitStatus::NoConvergence The Levenberg-Marquardt algorithm did not find a valid solution after a prescribed maximum number of iterations.
PSFFitStatus::InaccurateSolution A PSF has been fitted, but the Levenberg-Marquardt algorithm couldn't find a valid solution to the specified tolerance.
PSFFitStatus::UnknownError The PSF fitting process failed for an unspecified reason.
+ */ +namespace PSFFitStatus +{ + enum value_type + { + Invalid = -1, + NotFitted = 0, + FittedOk, + BadParameters, + NoSolution, + NoConvergence, + InaccurateSolution, + UnknownError + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class PSFData + * \brief PSF fit parameters. + */ +struct PSFData +{ + /*! + * Represents a point spread function type. + */ + typedef PSFunction::value_type psf_function; + + /*! + * Represents a PSF fitting process status. + */ + typedef PSFFitStatus::value_type psf_fit_status; + + /*! + * Represents a component of a centroid position vector (required for + * QuadTree compatibility). + */ + typedef DPoint::component component; + + psf_function function = PSFunction::Invalid; //!< Point spread function type (PSFunction namespace). + bool circular = false; //!< Circular or elliptical PSF. + psf_fit_status status = PSFFitStatus::NotFitted; //!< Status code (PSFFitStatus namespace). + bool celestial = false; //!< True iff equatorial coordinates are available. + double B = 0; //!< Local background estimate in pixel value units. + double A = 0; //!< Function amplitude (or estimated maximum) in pixel value units. + DPoint b0 = 0.0; //!< Barycenter position (initial star detection position) in image coordinates. + DPoint c0 = 0.0; //!< Fitted centroid position in image coordinates. + DPoint q0 = 0.0; //!< Centroid equatorial coordinates, when celestial=true. + double sx = 0; //!< Function width in pixels on the X axis, sx >= sy. + double sy = 0; //!< Function width in pixels on the Y axis, sx >= sy. + double theta = 0; //!< Rotation angle of the sx axis in degrees, in the [0,180) range. + double beta = 0; //!< Moffat beta or shape parameter (dimensionless). + double flux = 0; //!< Total flux above the local background, measured over the rectangular fitting region. + double signal = 0; //!< Total flux above the local background, measured over the elliptical PSF region. + unsigned signalCount = 0; //!< Number of pixels used for signal evaluation. + double mad = 0; /*!< Goodness of fit estimate. A robust, mean absolute difference between the + fitted PSF and the sample of source image pixels over the fitting region, scaled + by the total signal estimate. */ + /*! + * Default constructor. + */ + PSFData() = default; + + /*! + * Copy constructor. + */ + PSFData( const PSFData& ) = default; + + /*! + * Move constructor. + */ + PSFData( PSFData&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PSFData& operator =( const PSFData& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PSFData& operator =( PSFData&& ) = default; + + /*! + * Returns true iff this object contained valid PSF fitting parameters. This + * happens (or \e should happen, under normal conditions) when the status + * data member is equal to PSFFitStatus::FittedOk. + */ + operator bool() const + { + return status == PSFFitStatus::FittedOk; + } + + /*! + * Conversion to double operator. Returns the PSF signal estimate if + * nonzero, or the total flux otherwise. Useful for sorting and statistics + * calculations. + */ + operator double() const + { + return (signal != 0) ? signal : flux; + } + + /*! + * Returns a centroid coordinate. Returns the X centroid coordinate if the + * specified index \a i is zero, or the Y coordinate otherwise. + * + * \note This operator provides compatibility with the QuadTree class. + */ + double operator []( int i ) const noexcept + { + return (i == 0) ? c0.x : c0.y; + } + + /*! + * Returns the name of the fitted PSF function. See the PSFunction namespace + * for supported functions. + */ + String FunctionName() const; + + /*! + * Returns a string with a brief description of the current fitting status. + */ + String StatusText() const; + + /*! + * Returns the full width at half maximum (FWHM) on the X axis in pixels. + * + * For an elliptic PSF, the X axis corresponds to the orientation of the + * major function axis as projected on the image. + * + * For a circular PSF, FWHMx() and FWHMy() are equivalent. + */ + double FWHMx() const + { + return FWHM( function, sx, beta ); + } + + /*! + * Returns the full width at half maximum (FWHM) on the Y axis in pixels. + * + * For an elliptic PSF, the Y axis corresponds to the orientation of the + * minor function axis as projected on the image. + * + * For a circular PSF, FWHMx() and FWHMy() are equivalent. + */ + double FWHMy() const + { + return FWHM( function, sy, beta ); + } + + /*! + * Returns the full width at tenth maximum (FWTM) on the X axis in pixels. + * + * For an elliptic PSF, the X axis corresponds to the orientation of the + * major function axis as projected on the image. + * + * For a circular PSF, FWTMx() and FWTMy() are equivalent. + */ + double FWTMx() const + { + return FWTM( function, sx, beta ); + } + + /*! + * Returns the full width at tenth maximum (FWTM) on the Y axis in pixels. + * + * For an elliptic PSF, the Y axis corresponds to the orientation of the + * minor function axis as projected on the image. + * + * For a circular PSF, FWTMx() and FWTMy() are equivalent. + */ + double FWTMy() const + { + return FWTM( function, sy, beta ); + } + + /*! + * Returns the double integral of the PSF, or the estimated volume over the + * XY plane for z > B. + */ + double Volume() const + { + return A*Volume( function, sx, sy, beta ); + } + + /*! + * Returns the PSF bounding rectangle. The coordinates of the bounding + * rectangle \a r are calculated as follows: + * + * r.x0 = c0.x - d \n + * r.y0 = c0.y - d \n + * r.x1 = c0.x + d \n + * r.y1 = c0.y + d \n + * + * where d is equal to: + * + * FWHMx()/2 for a circular PSF, \n + * Max( FWHMx(), FWHMy() )/2 for an elliptic PSF. + */ + DRect Bounds() const + { + double d = (circular ? FWHMx() : Max( FWHMx(), FWHMy() ))/2; + return DRect( c0.x-d, c0.y-d, c0.x+d, c0.y+d ); + } + + /*! + * Returns true iff this object contains valid equatorial coordinates + * computed by an astrometric solution of the image for the centroid + * coordinates. + */ + bool HasCelestialCoordinates() const + { + return celestial; + } + + /*! + * Returns an image representation (in 32-bit floating point format) of the + * fitted point spread function. + */ + void ToImage( Image& ) const; + + /*! + * Returns the full width at half maximum (FWHM) corresponding to a + * supported function with the specified parameters. + * + * \param function The type of point spread function. See the PSFunction + * namespace for supported functions. + * + * \param sigma Estimated function width. + * + * \param beta Moffat beta or VariableShape shape parameter. + * Must be > 0. + * + * The returned value is the FWHM in sigma units, or zero if an invalid or + * unsupported function type has been specified. + */ + static double FWHM( psf_function function, double sigma, double beta = 2 ) + { + PCL_PRECONDITION( beta > 0 ) + switch ( function ) + { + case PSFunction::Gaussian: return 2.3548200450309493 * sigma; + case PSFunction::Moffat: return 2 * sigma * Sqrt( Pow2( 1/beta ) - 1 ); + case PSFunction::MoffatA: return 0.5358113941912513 * sigma; + case PSFunction::Moffat8: return 0.6016900619596693 * sigma; + case PSFunction::Moffat6: return 0.6998915581984769 * sigma; + case PSFunction::Moffat4: return 0.8699588840921645 * sigma; + case PSFunction::Moffat25: return 1.1305006161394060 * sigma; + case PSFunction::Moffat15: return 1.5328418730817597 * sigma; + case PSFunction::Lorentzian: return 2 * sigma; + case PSFunction::VariableShape: return 2 * sigma * Pow( beta*0.6931471805599453, 1/beta ); + default: return 0; // ?! + } + } + + /*! + * Returns the full width at tenth maximum (FWTM) corresponding to a + * supported function with the specified parameters. + * + * \param function The type of point spread function. See the PSFunction + * namespace for supported functions. + * + * \param sigma Estimated function width. + * + * \param beta Moffat beta or VariableShape shape parameter. + * Must be > 0. + * + * The returned value is the FWTM in sigma units, or zero if an invalid or + * unsupported function type has been specified. + */ + static double FWTM( psf_function function, double sigma, double beta = 2 ) + { + PCL_PRECONDITION( beta > 0 ) + switch ( function ) + { + case PSFunction::Gaussian: return 4.291932052578694 * sigma; + case PSFunction::Moffat: return 2 * sigma * Sqrt( Pow( 10.0, 1/beta ) - 1 ); + case PSFunction::MoffatA: return 1.017694279819175 * sigma; + case PSFunction::Moffat8: return 1.155026289161115 * sigma; + case PSFunction::Moffat6: return 1.367917055412454 * sigma; + case PSFunction::Moffat4: return 1.764402913213331 * sigma; + case PSFunction::Moffat25: return 2.459175822514185 * sigma; + case PSFunction::Moffat15: return 3.816589489904712 * sigma; + case PSFunction::Lorentzian: return 6 * sigma; + case PSFunction::VariableShape: return 2 * sigma * Pow( beta*2.302585092994045, 1/beta ); + default: return 0; // ?! + } + } + + /*! + * Returns the double integral of a supported elliptical function with the + * specified parameters. + * + * \param function The type of point spread function. See the PSFunction + * namespace for supported functions. + * + * \param sigma_x Estimated function width on the X axis. + * + * \param sigma_y Estimated function width on the Y axis. + * + * \param beta Moffat beta or VariableShape shape parameter. + * Must be > 0. Must be > 1 for Moffat and Lorentzian + * functions. + * + * The returned value is the volume of the PSF over the XY plane, or zero if + * an invalid or unsupported function type has been specified, or if the + * \a beta parameter is invalid for the type of PSF specified. + */ + static double Volume( psf_function function, double sigma_x, double sigma_y, double beta = 2 ) + { + PCL_PRECONDITION( beta > 0 ) + PCL_PRECONDITION( function != PSFunction::Lorentzian && (function != PSFunction::Moffat || beta > 1) ) + switch ( function ) + { + case PSFunction::Gaussian: return 6.2831853071795862 * sigma_x*sigma_y; + case PSFunction::Moffat: return 3.1415926535897931 * sigma_x*sigma_y/(beta - 1); + case PSFunction::MoffatA: return 0.3490658503988659 * sigma_x*sigma_y; + case PSFunction::Moffat8: return 0.4487989505128276 * sigma_x*sigma_y; + case PSFunction::Moffat6: return 0.6283185307179586 * sigma_x*sigma_y; + case PSFunction::Moffat4: return 1.0471975511965976 * sigma_x*sigma_y; + case PSFunction::Moffat25: return 2.0943951023931953 * sigma_x*sigma_y; + case PSFunction::Moffat15: return 6.2831853071795862 * sigma_x*sigma_y; + default: return 0; // ?! + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PSFFit + * \brief Numerical Point Spread Function (PSF) fit to a source in an image. + * \sa StarDetector, PSFSignalEstimator, PSFScaleEstimator + */ +class PSFFit +{ +public: + + /*! + * Represents a point spread function type. + */ + typedef PSFData::psf_function psf_function; + + /*! + * Represents a PSF fitting process status. + */ + typedef PSFData::psf_fit_status psf_fit_status; + + /*! + * Fitted PSF parameters. + */ + PSFData psf; + + /*! + * Fits a point spread function to a source in the specified \a image. + * + * \param image The source image. + * + * \param center The intial search point in image coordinates. For + * consistent results, these coordinates must be the + * result of a robust object detection process. + * + * \param rect The PSF sampling region in image coordinates. + * This is the rectangular region of the image where + * the function fitting process will take place. PSF + * parameters will be evaluated from source pixel + * values acquired exclusively from this region. + * + * \param function The point spread function type to be fitted. A + * Gaussian PSF is fitted by default. + * + * \param circular Whether to fit a circular or an elliptical PSF. + * Elliptical functions are fitted by default. + * + * \param betaMin,betaMax The range of shape parameter values when + * \a function is PSFunction::VariableShape; ignored + * for other point spread functions. When the values of these + * parameters are such that \a betaMin < \a betaMax, an optimal + * value of the beta (shape) PSF parameter will be searched for + * iteratively within the specified range. The shape parameter will be + * optimized for minimization of the absolute difference between the + * estimated PSF and the sample of source image pixels. When + * \a betaMin ≥ \a betaMax, the shape parameter will stay constant + * and equal to the specified \a betaMin value during the entire PSF + * fitting process, and the rest of PSF parameters will be estimated + * accordingly. The valid range of beta parameter values is [1.0,6.0]. + * Values outside this range may lead to numerically unstable PSF + * fitting processes. + * + * \param tolerance Tolerance of the Levenberg-Marquardt algorithm. + * The default value is 1.0e-08. The valid range is + * from 1.0e-12 to 0.001. + * + * \param bkgMaxVar Maximum relative difference allowed between the + * fitted local background (\e B PSF parameter) and + * the initial local background estimated as the median pixel sample + * value of the sampling region. The default value is 0.1, meaning + * that a maximum relative difference of a 10% will be allowed. This + * parameter is useful to enforce stability of the PSF fitting + * process: assuming that the median pixel sample value is a robust + * estimate of the local background, by constraining the range of + * variation of the \e B parameter the PSF fitting process can be more + * accurate and robust. + * + * \param growthForFlux Growing factor in units of the Full Width at + * Tenth Maximum (FWTM) for extension/contraction of + * the PSF flux measurement region. The default + * value is 1.0. + * + * The implementation of the Levenberg-Marquardt algorithm used internally + * by this function is extremely sensitive to the specified \a center and + * \a rect parameters. These starting parameters should always be + * calculated using robust procedures to achieve consistent results. + * + * In the most frequent use case, where a star detection procedure is + * typically used to obtain these starting parameters, robustness to poorly + * sampled data and resilience to outlier pixels and noise are particularly + * important to this task. + */ + PSFFit( const ImageVariant& image, + const DPoint& center, const DRect& rect, + psf_function function = PSFunction::Gaussian, bool circular = false, + float betaMin = 1.0F, float betaMax = 4.0F, + double tolerance = 1.0e-08, float bkgMaxVar = 0.1F, float growthForFlux = 1.0F ); + + /*! + * Copy constructor. + */ + PSFFit( const PSFFit& ) = default; + + /*! + * Move constructor. + */ + PSFFit( PSFFit&& ) = default; + + /*! + * Copy assignment opèrator. Returns a reference to this object. + */ + PSFFit& operator =( const PSFFit& x ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PSFFit& operator =( PSFFit&& x ) = default; + + /*! + * Returns true iff this object contains a valid PSF fit, i.e. valid PSF + * fitted parameters. + */ + operator bool() const + { + return psf; + } + +private: + + Matrix S; // matrix of sampled pixel data + Vector P; // vector of function parameters + + // The initial local background measured on the sampling region and the + // maximum allowed relative difference, for stabilization of local + // background PSF parameters. + double m_bkg; + float m_bkgMaxVar; + + // Growing factor in units of the Full Width at Tenth Maximum (FWTM) for + // extension/contraction of the PSF flux measurement region. + float m_growthForFlux = 1.0F; + + // Keep track of successive beta values in L-M iterations for stabilization + // of shape parameters. This guarantees convergence for Moffat functions. + mutable float m_beta; + + Vector GoodnessOfFit( psf_function, bool circular, bool test = false ) const; + + friend class PSFFitEngine; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PSFFit_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PSFFit.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PSFScaleEstimator.h b/3rdparty/include/pcl/PSFScaleEstimator.h new file mode 100644 index 0000000..f1edcc7 --- /dev/null +++ b/3rdparty/include/pcl/PSFScaleEstimator.h @@ -0,0 +1,276 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PSFScaleEstimator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PSFScaleEstimator_h +#define __PCL_PSFScaleEstimator_h + +/// \file pcl/PSFScaleEstimator.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PSFScaleEstimator + * \brief Estimation of relative image scale based on PSF photometry + * \sa PSFEstimator, PSFSignalEstimator, StarDetector, PSFFit + */ +class PCL_CLASS PSFScaleEstimator : public PSFEstimator +{ +public: + + /*! + * Represents a point spread function type. + */ + typedef PSFEstimator::psf_function psf_function; + + typedef SurfaceSpline local_model; + + /*! + * \struct pcl::PSFScaleEstimator::Estimates + * \brief Structure to hold a PSF relative scale estimate. + */ + struct Estimates + { + double scale = 1; //!< Estimate of the mean relative scale with respect to the reference image. + double sigma = 0; //!< Standard deviation of the sample of scale measurements used for evaluation. + int total = 0; //!< Number of valid PSF fits. + int count = 0; //!< Number of valid PSF flux measurements used for scale evaluation. + local_model local; //!< 2-D model of local scale variations. + + /*! + * Conversion to double operator. + */ + operator double() const + { + return scale; + } + + /*! + * Returns true iff this is a valid scale estimate. + */ + bool IsValid() const + { + return count > 0 && 1 + scale != 1; + } + }; + + /*! + * Default constructor. + */ + PSFScaleEstimator() = default; + + /*! + * Copy constructor. + */ + PSFScaleEstimator( const PSFScaleEstimator& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~PSFScaleEstimator() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PSFScaleEstimator& operator =( const PSFScaleEstimator& ) = default; + + /*! + * Returns the search tolerance in pixels. + * + * For evaluation of relative scale finding a set of matched pairs of PSF + * measurements, i.e. matched stars, is necessary to ensure robustness of + * the computed scale estimate. The search tolerance is the half side in + * pixels of a square region around each fitted PSF used to find matched + * pairs of stars by proximity search. + * + * In theory a very small search tolerance (about 0.01 - 0.05 pixels, + * depending on the scale of the image) should be applicable, since the + * reference and target images are assumed to be registered and our standard + * image registration processes, such as StarAlignment for example, sport + * centipixel accuracy. However, in practice we may have to deal with larger + * registration errors, especially for wide field images if the user has not + * defined the necessary parameters to apply distortion corrections. + * + * The default search tolerance is 4 pixels. + */ + float PSFSearchTolerance() const + { + return m_psfSearchTolerance; + } + + /*! + * Sets the search tolerance in pixels. See PSFSearchTolerance() for a + * description of this parameter. + */ + void SetPSFSearchTolerance( float t ) + { + PCL_PRECONDITION( t >= 0 ) + m_psfSearchTolerance = Max( 0.0F, t ); + } + + /*! + * Sets a new reference image for relative scale estimation. + * + * This function performs the star detection and PSF fitting tasks for the + * specified image. The resulting set of PSF signal measurements will be + * stored in this object for relative scale evaluation by subsequent calls + * to EstimateScale(). + * + * Returns the number of valid PSF signal measurements gathered for the + * specified reference \a image. + */ + int SetReference( const ImageVariant& image ); + + /*! + * Returns true iff generation of models of local relative scale variations + * is enabled for this object. + * + * When this option is enabled, local scale variations are modeled with an + * approximating thin plate spline during relative scale estimation. This + * feature is disabled by default. + */ + bool IsLocalModelEnabled() const + { + return m_enableLocalModel; + } + + /*! + * Enables generation of local scale variation models. + */ + void EnableLocalModel( bool enable = true ) + { + m_enableLocalModel = enable; + } + + /*! + * Disables generation of local scale variation models. + */ + void DisableLocalModel( bool disable = true ) + { + EnableLocalModel( !disable ); + } + + /*! + * Evaluates the mean relative scaling factor of the currently selected + * reference image with respect to the specified target \a image. + * + * A successful call to SetReference() is required to select a reference + * image \e before calling this function; otherwise an Error exception will + * be thrown. The specified target \a image must be accurately registered + * with respect to the reference image. + * + * The returned object contains the estimated mean ratio of the reference + * signal to the target signal, as well as the number of PSF measurements + * used for scale evaluation. All PSF signal measurements exclude local + * background estimates. + * + * \note This function is thread-safe. + */ + Estimates EstimateScale( const ImageVariant& image ) const; + + /*! + * Evaluates the mean relative scaling factor of the currently selected + * reference image with respect to the specified target \a image. + * + * This operator is equivalent to the + * EstimateScale( const ImageVariant& ) const member function. + * + * \note This function is thread-safe. + */ + Estimates operator()( const ImageVariant& image ) const + { + return EstimateScale( image ); + } + +private: + + Array m_psfReference; + float m_psfSearchTolerance = 4.0F; // px + bool m_enableLocalModel = false; + + /* + * Auxiliary structure for generation of first-order local scale models. + */ + struct Sample + { + double x, y, z; + + operator double() const + { + return z; + } + + bool operator <( const Sample& s ) const + { + return z < s.z; + } + }; + + typedef GenericVector sample_vector; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PSFScaleEstimator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PSFScaleEstimator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PSFSignalEstimator.h b/3rdparty/include/pcl/PSFSignalEstimator.h new file mode 100644 index 0000000..8662772 --- /dev/null +++ b/3rdparty/include/pcl/PSFSignalEstimator.h @@ -0,0 +1,280 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PSFSignalEstimator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PSFSignalEstimator_h +#define __PCL_PSFSignalEstimator_h + +/// \file pcl/PSFSignalEstimator.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PSFSignalEstimator + * \brief Signal estimation based on PSF photometry + * \sa PSFEstimator, PSFScaleEstimator, StarDetector, PSFFit + */ +class PCL_CLASS PSFSignalEstimator : public PSFEstimator +{ +public: + + /*! + * Represents a point spread function type. + */ + typedef PSFEstimator::psf_function psf_function; + + /*! + * \struct pcl::PSFSignalEstimator::Estimates + * \brief Structure to hold PSF flux and robust mean background estimates. + */ + struct Estimates + { + double totalFlux = 0; //!< The sum of PSF flux estimates. + double totalPowerFlux = 0; //!< The sum of squared PSF flux estimates. + double totalMeanFlux = 0; //!< The sum of mean PSF flux estimates. + double totalMeanPowerFlux = 0; //!< The sum of mean squared PSF flux estimates. + double MStar = 0; //!< The M* robust mean background estimate. + double NStar = 0; /*!< The N* robust estimate of the standard deviation of the noise. + As generated by the EstimateSignal() member function, this + estimate is already multiplied by the normalization constant + 2.05435, which makes it consistent with the standard deviation + of a normal distribution. */ + int count = 0; //!< Number of valid PSF flux estimates. + + /*! + * Conversion to double operator. + */ + operator double() const + { + return totalFlux; + } + + /*! + * Returns true iff this object contains valid PSF flux estimates. + */ + bool IsValid() const + { + return count > 0 && 1 + totalFlux != 1 && 1 + MStar != 1; + } + }; + + /*! + * Default constructor. + */ + PSFSignalEstimator() + { + // Override default PSF estimator parameters with appropriate values for + // signal evaluation. + m_saturationThreshold = 1.0F; + m_saturationRelative = false; + } + + /*! + * Copy constructor. + */ + PSFSignalEstimator( const PSFSignalEstimator& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~PSFSignalEstimator() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PSFSignalEstimator& operator =( const PSFSignalEstimator& ) = default; + + /*! + * Returns the scale for local background model generation in pixels. + * + * The implemented algorithm uses nonlinear multiscale transforms to + * generate a model of the large-scale background component of the image. + * This is necessary to calculate robust estimates of the mean background + * level and the standard deviation of the noise, M* and N* respectively. + * + * This parameter defines the dimensional scale in pixels for isolation of + * large-scale image structures. The current implementation supports the + * following scale parameter values in pixels: 1024, 768, 512, 384, 256, + * 192, 128, 64 and 32. The default scale is 256 pixels. + */ + int BackgroundModelScale() const + { + return m_scale; + } + + /*! + * Sets the scale for local background model generation in pixels. + * + * See the BackgroundModelScale() member function for a description of this + * parameter. + */ + void SetBackgroundModelScale( int scale ) + { + PCL_PRECONDITION( scale >= 32 && scale <= 1024 ) + m_scale = Range( scale, 32, 1024 ); + } + + /*! + * Evaluates the total and mean PSF flux and square flux, along with the M* + * and N* estimates of mean background level and noise standard deviation, + * for the selected channel of the specified \a image. Returns the estimates + * as a new PSFSignalEstimator::Estimates object. + * + * \note This function is thread-safe. + */ + Estimates EstimateSignal( const ImageVariant& image ) const; + + /*! + * Evaluates the total and mean PSF flux and square flux, along with the M* + * and N* estimates of mean background level and noise standard deviation, + * for the selected channel of the specified \a image. Returns the estimates + * as a new PSFSignalEstimator::Estimates object. + * + * This operator is equivalent to the EstimateSignal( const ImageVariant& ) + * member function. + * + * \note This function is thread-safe. + */ + Estimates operator()( const ImageVariant& image ) const + { + return EstimateSignal( image ); + } + + /*! + * Extracts the set of residual pixels from a large-scale local background + * model. + * + * \param image The target image, from which the set of residual pixels + * will be evaluated and extracted. The task will work + * exclusively on the selected channel of the image, ignoring + * region selections. + * + * \param scale The dimensional \a scale in pixels. This is the scale of + * the generated local background model used for detection of + * non-significant and residual pixels. The current + * implementation supports the following scales for + * large-scale local background modeling: 512, 384, 256, 192, + * 128, 64 and 32 pixels. The default scale is 256 pixels. + * + * \param maxThreads If specified, the task will use at most this number + * of parallel execution threads. Otherwise, or if a value + * ≤ 0 is specified, the number of threads will be set + * according to current platform settings. + * + * The mean (or median) and standard deviation of the returned residual are + * the M* and N* robust estimators, respectively. M* estimates the mean + * background level, and N* the standard deviation of the noise. + */ + static Array LocalBackgroundResidual( const ImageVariant& image, int scale = 256, int maxThreads = 0 ); + + /*! + * The PSF Signal Weight (PSFSW) image quality estimator. + * + * \param E PSF flux and robust mean background and noise estimates. + * The estimates held by this object should be the result of + * a previous call to the EstimateSignal() member function, + * or be assigned with values retrieved from the appropriate + * image metadata items. + * + * \param sigmaN Estimate of the standard deviation of the noise. If no + * value is specified for this parameter, or if a value + * ≤ 0 is specified, the N* robust noise estimate held by + * the specified \a E structure will be used. + */ + static double PSFSignalWeight( const Estimates& E, double sigmaN = 0 ) + { + if ( sigmaN <= 0 ) + sigmaN = E.NStar; + return (3.18e-6 * E.totalFlux * E.totalMeanFlux) / (9.00e+6 * sigmaN * E.MStar); + } + + /*! + * The PSF Signal to Noise Ratio (PSFSNR) estimator. + * + * \param E PSF flux and robust mean background and noise estimates. + * The estimates held by this object should be the result of + * a previous call to the EstimateSignal() member function, + * or be assigned with values retrieved from the appropriate + * image metadata items. + * + * \param sigmaN Estimate of the standard deviation of the noise. If no + * value is specified for this parameter, or if a value + * ≤ 0 is specified, the N* robust noise estimate held by + * the specified \a E structure will be used. + */ + static double PSFSNR( const Estimates& E, double sigmaN = 0 ) + { + if ( sigmaN <= 0 ) + sigmaN = E.NStar; + return (1.350e-7 * E.totalFlux * E.totalFlux) / (4.987e+6 * sigmaN * sigmaN); + } + +private: + + int m_scale = 256; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PSFSignalEstimator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PSFSignalEstimator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ParallelProcess.h b/3rdparty/include/pcl/ParallelProcess.h new file mode 100644 index 0000000..ea39d86 --- /dev/null +++ b/3rdparty/include/pcl/ParallelProcess.h @@ -0,0 +1,187 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ParallelProcess.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ParallelProcess_h +#define __PCL_ParallelProcess_h + +/// \file pcl/ParallelProcess.h + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ParallelProcess + * \brief A process using multiple concurrent execution threads. + * + * %ParallelProcess is a base class for classes implementing multithreaded + * processes in PCL. + */ +class PCL_CLASS ParallelProcess +{ +public: + + /*! + * Default constructor. + * + * By default, parallel processing is always enabled, and any process can + * use the maximum possible number of parallel execution threads. + */ + ParallelProcess() = default; + + /*! + * Copy constructor. + */ + ParallelProcess( const ParallelProcess& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ParallelProcess& operator =( const ParallelProcess& ) = default; + + /*! + * Returns true iff this process is allowed to use multiple parallel + * execution threads, when multiple threads are permitted and available. + */ + bool IsParallelProcessingEnabled() const noexcept + { + return m_parallel; + } + + /*! + * Enables parallel processing for this process. + * + * \param enable Whether to enable or disable parallel processing. True by + * default. + * + * \param maxProcessors The maximum number of processors allowed for this + * instance. If \a enable is false this parameter is ignored. + * A value ≤ 0 is ignored. The default value is zero. + */ + void EnableParallelProcessing( bool enable = true, int maxProcessors = 0 ) noexcept + { + m_parallel = enable; + if ( m_parallel ) + if ( maxProcessors > 0 ) + SetMaxProcessors( maxProcessors ); + } + + /*! + * Disables parallel processing for this process. + * + * This is a convenience function, equivalent to: + * + * \code EnableParallelProcessing( !disable ) \endcode + */ + void DisableParallelProcessing( bool disable = true ) noexcept + { + EnableParallelProcessing( !disable ); + } + + /*! + * Returns the maximum number of processors allowed for this process. + * + * Irrespective of the value returned by this function, a module should not + * use more processors than the maximum number of parallel threads allowed + * for external modules on the PixInsight platform. This number is given by + * the "Process/MaxProcessors" global variable. Refer to the GlobalSettings + * class for information on global variables. + */ + int MaxProcessors() const noexcept + { + return m_maxProcessors; + } + + /*! + * Sets the maximum number of processors allowed for this process. + * + * In the current version of PCL, a module can use a maximum of 1023 + * processors. The term \e processor actually refers to the number of + * threads a module can execute concurrently. + * + * Irrespective of the value specified by this function, a module should not + * use more processors than the maximum number of parallel threads allowed + * for external modules on the PixInsight platform. This number is given by + * the "Process/MaxProcessors" global variable. Refer to the GlobalSettings + * class for information on global variables. + */ + void SetMaxProcessors( int maxProcessors ) noexcept + { + m_maxProcessors = Range( maxProcessors, 1, PCL_MAX_PROCESSORS ); + } + + /*! + * Exchanges two %ParallelProcess instances. + */ + void Swap( ParallelProcess& process ) noexcept + { + pcl::Swap( m_maxProcessors, process.m_maxProcessors ); + pcl::Swap( m_parallel, process.m_parallel ); + } + +protected: + + int m_maxProcessors = PCL_MAX_PROCESSORS; // maximum number of processors allowed + bool m_parallel = true; // use multiple threads? +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ParallelProcess_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ParallelProcess.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Pen.h b/3rdparty/include/pcl/Pen.h new file mode 100644 index 0000000..177cb89 --- /dev/null +++ b/3rdparty/include/pcl/Pen.h @@ -0,0 +1,371 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Pen.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Pen_h +#define __PCL_Pen_h + +/// \file pcl/Pen.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::PenStyle + * \brief Pen drawing styles + * + * + * + * + * + * + * + * + *
PenStyle::Empty Nothing is drawn
PenStyle::Solid _____________
PenStyle::Dash _ _ _ _ _ _ _
PenStyle::Dot .............
PenStyle::DashDot _._._._._._._
PenStyle::DashDotDot _.._.._.._.._
+ */ +namespace PenStyle +{ + enum value_type + { + Empty, // Nothing drawn + Solid, // _____________ + Dash, // _ _ _ _ _ _ _ + Dot, // ............. + DashDot, // _._._._._._._ + DashDotDot, // _.._.._.._.._ + + NumberOfPenStyles + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::PenCap + * \brief Pen cap styles + * + * + * + * + * + *
PenCap::Flat Square caps not reaching the end points of lines
PenCap::Square Square caps extending beyond end points by half the line width
PenCap::Round Round caps centered at the line end points
+ */ +namespace PenCap +{ + enum value_type + { + Flat, // Square caps not reaching the end points of lines + Square, // Square caps extending beyond end points by half the line width + Round, // Round caps centered at the line end points + + NumberOfPenCaps + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::PenJoin + * \brief Pen join styles + * + * + * + * + * + *
PenJoin::Miter Lines are joined by sharp corners
PenJoin::Bevel Lines are joined by flat corners
PenJoin::Round Circular arcs are drawn between lines
+ */ +namespace PenJoin +{ + enum value_type + { + Miter, // Lines are joined by sharp corners + Bevel, // Lines are joined by flat corners + Round, // Circular arcs are drawn between lines + + NumberOfPenJoins + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class PCL_CLASS Brush; + +// ---------------------------------------------------------------------------- + +/*! + * \class Pen + * \brief Client-side interface to a PixInsight %Pen object + * + * ### TODO: Write a detailed description for %Pen. + */ +class PCL_CLASS Pen : public UIObject +{ +public: + + /*! + * Represents a pen drawing style. + */ + typedef PenStyle::value_type style; + + /*! + * Represents a pen cap style. + */ + typedef PenCap::value_type cap; + + /*! + * Represents a pen join style. + */ + typedef PenJoin::value_type join; + + /*! + * Constructs a %Pen object with the specified \a color, \a width in pixels, + * and drawing, cap and join styles. + */ + Pen( RGBA color = 0xff000000, float width = 0, style s = PenStyle::Solid, + cap c = PenCap::Square, join j = PenJoin::Miter ); + + /*! + * Copy constructor. This object will reference the same server-side pen + * as the specified instance \a p. + */ + Pen( const Pen& p ) : UIObject( p ) + { + } + + /*! + * Destroys a %Pen object. If this object references an existing pen in the + * PixInsight core application, its reference count is decremented. If it + * becomes unreferenced, it will be garbage-collected. + */ + virtual ~Pen() + { + } + + /*! + * Assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side pen as the specified + * instance \a p. If the previous pen becomes unreferenced, it will be + * garbage-collected by the PixInsight core application. + */ + Pen& operator =( const Pen& p ) + { + SetHandle( p.handle ); + return *this; + } + + /*! + * Returns a reference to a null pen. A null %Pen object does not + * correspond to an existing pen object in the PixInsight core application. + */ + static Pen& Null(); + + /*! + * Returns the pen width in pixels. + * + * A zero width means that this is a cosmetic pen. Cosmetic pens + * always draw one-pixel strokes, regardless of the transformation applied + * to the graphics context where they are applied. + * + * \sa SetWidth() + */ + float Width() const; + + /*! + * Sets the pen width in pixels. + * + * A zero width means that this is a cosmetic pen. Cosmetic pens + * always draw one-pixel strokes, regardless of the transformation applied + * to the graphics context where they are applied. + * + * \sa Width() + */ + void SetWidth( float w ); + + /*! + * Returns the pen color as a 32-bit AARRGGBB pixel color value. + * + * \sa SetColor() + */ + RGBA Color() const; + + /*! + * Sets the pen \a color as a 32-bit AARRGGBB pixel color value. + * + * \sa Color() + */ + void SetColor( RGBA color ); + + /*! + * Returns the current pen drawing style. + * + * \sa SetStyle(), IsSolid(), IsEmpty() + */ + style Style() const; + + /*! + * Returns true iff this pen draws solid strokes, i.e. if the current pen + * drawing style is PenStyle::Solid. + * + * \sa IsEmpty(), Style() + */ + bool IsSolid() const + { + return Style() == PenStyle::Solid; + } + + /*! + * Returns true iff this pen draws no strokes, i.e. if the current pen + * drawing style is PenStyle::Empty. + * + * \sa IsSolid(), Style() + */ + bool IsEmpty() const + { + return Style() == PenStyle::Empty; + } + + /*! + * Sets the pen drawing style. + * + * \sa Style(), IsSolid(), IsEmpty() + */ + void SetStyle( style ); + + /*! + * Returns the current pen cap style. + * + * \sa SetCap() + */ + cap Cap() const; + + /*! + * Sets the current pen cap style. + * + * \sa Cap() + */ + void SetCap( cap c ); + + /*! + * Returns the current pen join style. + * + * \sa SetJoin() + */ + join Join() const; + + /*! + * Sets the current pen join style. + * + * \sa Join() + */ + void SetJoin( join j ); + + /*! + * Returns the current pen brush. + * + * \sa SetBrush() + */ + pcl::Brush Brush() const; + + /*! + * Returns the current pen brush. + * + * \deprecated Use Pen::Brush() in newly produced code. + * \sa SetBrush() + */ + pcl::Brush GetBrush() const + { + return this->Brush(); + } + + /*! + * Sets the current pen brush + * + * \sa Brush() + */ + void SetBrush( const pcl::Brush& brush ); + +private: + + Pen( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class GraphicsContextBase; + friend class Graphics; + friend class VectorGraphics; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Pen_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Pen.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PhaseMatrices.h b/3rdparty/include/pcl/PhaseMatrices.h new file mode 100644 index 0000000..e7f4e89 --- /dev/null +++ b/3rdparty/include/pcl/PhaseMatrices.h @@ -0,0 +1,168 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PhaseMatrices.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PhaseMatrices_h +#define __PCL_PhaseMatrices_h + +/// \file pcl/PhaseMatrices.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * Calculation of the phase correlation matrix (PCM). + * + * \param[out] R The resulting PCM as a single-channel complex image with the + * same dimensions of the source images \a A and \a B. + * + * \param A A single-channel complex image with the discrete Fourier + * transform of the reference image. + * + * \param B A single-channel complex image with the discrete Fourier + * transform of the working image. + * + * Both source images \a A and \a B must be nonempty and have the same + * dimensions. If the result image \a R does not have the same geometry as the + * source images, it is reallocated as necessary. + * + * \note Increments the status monitoring object of the result image \a R by + * its area in square pixels. + * + * \ingroup phase_matrices + */ +template inline +void PCL_FUNC PhaseCorrelationMatrix( GenericImage& R, const GenericImage& A, const GenericImage& B ) +{ + const typename GenericImage::sample::component tiny( 1.0e-20 ); + + size_type N = A.NumberOfPixels(); + + if ( A.IsEmpty() || B.NumberOfPixels() != N ) + throw Error( "Invalid image geometry in PhaseCorrelationMatrix()" ); + + if ( R.NumberOfPixels() != N ) + R.AllocateData( A.Width(), B.Width() ); + + if ( R.Status().IsInitializationEnabled() ) + R.Status().Initialize( "Phase correlation matrix", N ); + + const typename GenericImage::sample* a = *A; + const typename GenericImage::sample* b = *B; + typename GenericImage::sample* r = *R; + typename GenericImage::sample* rN = r + N; + + for ( ; r < rN; ++r, ++a, ++b, ++R.Status() ) + { + typename GenericImage::sample num = *a * ~*b; + *r = P1::ToSample( num/Max( tiny, Abs( num ) ) ); + } +} + +/*! + * Calculation of the cross power spectrum matrix (CPSM). + * + * \param[out] R The resulting CPSM as a single-channel complex image with the + * same dimensions of the source images \a A and \a B. + * + * \param A A single-channel complex image with the discrete Fourier + * transform of the reference image. + * + * \param B A single-channel complex image with the discrete Fourier + * transform of the working image. + * + * Both source images \a A and \a B must be nonempty and have the same + * dimensions. If the result image \a R does not have the same geometry as the + * source images, it is reallocated as necessary. + * + * \note Increments the status monitoring object of the result image \a R by + * its area in square pixels. + * + * \ingroup phase_matrices + */ +template inline +void PCL_FUNC CrossPowerSpectrumMatrix( GenericImage& R, const GenericImage& A, const GenericImage& B ) +{ + const typename GenericImage::sample::component tiny( 1.0e-20 ); + + size_type N = A.NumberOfPixels(); + + if ( A.IsEmpty() || B.NumberOfPixels() != N ) + throw Error( "Invalid image geometry in CrossPowerSpectrumMatrix()" ); + + if ( R.NumberOfPixels() != N ) + R.AllocateData( A.Width(), B.Width() ); + + if ( R.Status().IsInitializationEnabled() ) + R.Status().Initialize( "Cross power spectrum matrix", N ); + + const typename GenericImage::sample* a = *A; + const typename GenericImage::sample* b = *B; + typename GenericImage::sample* r = *R; + typename GenericImage::sample* rN = r + N; + + for ( ; r < rN; ++r, ++a, ++b, ++R.Status() ) + *r = P1::ToSample( (*b * ~*a)/Max( tiny, Abs( *a ) * Abs( *b ) ) ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PhaseMatrices_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PhaseMatrices.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PixelAllocator.h b/3rdparty/include/pcl/PixelAllocator.h new file mode 100644 index 0000000..0d2f1ea --- /dev/null +++ b/3rdparty/include/pcl/PixelAllocator.h @@ -0,0 +1,251 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PixelAllocator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PixelAllocator_h +#define __PCL_PixelAllocator_h + +/// \file pcl/PixelAllocator.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +template class PCL_CLASS GenericImage; + +// ---------------------------------------------------------------------------- + +/*! + * \class PixelAllocator + * \brief Manages transparent allocation and deallocation of shared and local + * pixel data. + * + * %PixelAllocator is responsible for allocation and deallocation of pixel data + * blocks in PCL. The template argument P corresponds to an instantiation of + * GenericPixelTraits for a specific pixel sample type. + * + * Unless you are implementing geometrical transformations, or processes that + * perform direct substitutions of pixel data blocks in images, such as a whole + * channel, you usually should not have to use the %PixelAllocator template + * class directly in your code. The SharedPixelData and GenericImage classes + * can perform all the necessary allocations transparently. + * + * When you have to allocate or deallocate pixel data blocks, however, you + * should \e never use the \c new and \c delete operators, or the \c malloc, + * \c calloc and \c free standard C functions. You must use %PixelAllocator for + * all allocations and deallocations of pixel data \e exclusively. Among other + * good reasons for this, pixel data blocks cannot be allocated in your + * module's local heap if they are being used with shared images, i.e. images + * living in the PixInsight core application. + * + * The \e only safe way to allocate and deallocate pixel data in PCL is by + * using %PixelAllocator's member functions. Note that you cannot allocate + * %PixelAllocator directly. For an existing image, you get a reference to a + * %PixelAllocator instance by calling the Allocator() member function of + * %GenericImage. This member function returns a reference to the image's + * internal allocator, which will perform all pixel allocation tasks that you + * may need transparently, irrespective of whether the object represents a + * local or shared image. + * + * \sa GenericPixelTraits, GenericImage, SharedPixelData + */ +template +class PCL_CLASS PixelAllocator : public SharedPixelData +{ +public: + + /*! + * Represents the pixel traits class used by this instantiation of + * %PixelAllocator. + * + * The \c pixel_traits type should be an instantiation of + * GenericPixelTraits. It identifies a class implementing basic storage and + * functional primitives optimized for a particular pixel sample type. + */ + typedef P pixel_traits; + + /*! + * Represents the data type used to store pixel sample values in this + * template instantiation of %PixelAllocator. + */ + typedef typename pixel_traits::sample sample; + + /*! + * Returns true iff this allocator and another instance are working for the + * same shared image, or if both of them are working for local images. + * + * All local images share a unique internal allocator, but each shared image + * has its own, independent allocator object. This responds to the + * multithreaded nature of the PixInsight core application. + */ + bool operator ==( const PixelAllocator

& x ) const noexcept + { + return SharedPixelData::operator ==( x ); + } + + /*! + * Allocates a contiguous block of memory where at least \a n > 0 pixel + * samples can be optimally stored. + * + * Returns the starting address of the allocated block. + * + * This member function throws a \c std::bad_alloc exception if there is not + * enough memory available to allocate the required contiguous block. + */ + sample* AllocatePixels( size_type n ) const + { + PCL_PRECONDITION( n != 0 ) + return reinterpret_cast( SharedPixelData::Allocate( n*sizeof( sample ) ) ); + } + + /*! + * Allocates a contiguous block of memory where at least \a width * + * \a height pixel samples can be optimally stored. + * + * Returns the starting address of the allocated block. This is a + * convenience alias for: + * + * \code + * AllocatePixels( size_type( width )*size_type( height ) ); + * \endcode + */ + sample* AllocatePixels( int width, int height ) const + { + return AllocatePixels( size_type( width )*size_type( height ) ); + } + + /*! + * Allocates an array where at least \a n > 0 channel slots can be + * optimally stored. A channel slot is a pointer to a contiguous block of + * pixel samples, where an image can store a single channel. + * + * The allocated array is initialized to zero. Returns the starting address + * of the allocated array. + * + * This member function throws a \c std::bad_alloc exception if there is not + * enough memory available to allocate the required contiguous block. + */ + sample** AllocateChannelSlots( size_type n ) const + { + PCL_PRECONDITION( n != 0 ) + sample** cslots = reinterpret_cast( SharedPixelData::Allocate( n*sizeof( sample* ) ) ); + ::memset( cslots, 0, n*sizeof( sample* ) ); + return cslots; + } + + /*! + * Deallocates a previously allocated memory block. The deallocated block + * becomes available for subsequent allocations. + * + * \warning Do not use this function to deallocate memory that has + * not been allocated by \e this %PixelAllocator object. This includes + * memory blocks allocated by the global \c new operator, or by other + * %PixelAllocator objects. Failure to follow this rule will lead to severe + * heap corruption for the calling module. + */ + template + void Deallocate( T* p ) const + { + PCL_PRECONDITION( p != nullptr ) + SharedPixelData::Deallocate( reinterpret_cast( p ) ); + } + +private: + + PixelAllocator() = default; + + PixelAllocator( void* handle ) + : SharedPixelData( handle, P::BitsPerSample(), P::IsFloatSample(), P::IsComplexSample() ) + { + } + + PixelAllocator( const PixelAllocator

& x ) + : SharedPixelData( x ) + { + } + + PixelAllocator( int width, int height, int numberOfChannels, int colorSpace ) + : SharedPixelData( width, height, numberOfChannels, P::BitsPerSample(), P::IsFloatSample(), colorSpace ) + { + } + + PixelAllocator& operator =( const PixelAllocator

& x ) + { + (void)SharedPixelData::operator =( x ); + return *this; + } + + sample** GetSharedData() const + { + return reinterpret_cast( SharedPixelData::GetSharedData() ); + } + + void SetSharedData( sample** ptrToShared ) + { + SharedPixelData::SetSharedData( reinterpret_cast( ptrToShared ) ); + } + + friend class pcl::GenericImage

; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PixelAllocator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PixelAllocator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PixelInterpolation.h b/3rdparty/include/pcl/PixelInterpolation.h new file mode 100644 index 0000000..3175ffa --- /dev/null +++ b/3rdparty/include/pcl/PixelInterpolation.h @@ -0,0 +1,1132 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PixelInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PixelInterpolation_h +#define __PCL_PixelInterpolation_h + +/// \file pcl/PixelInterpolation.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +# pragma warning( push ) +# pragma warning( disable : 4267 ) // conversion from 'size_t' to ... +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PixelInterpolation + * \brief Abstract root base class for all pixel interpolation algorithms. + * + * %PixelInterpolation is the abstract base class of all pixel interpolation + * PCL classes. A pixel interpolation class is able to generate pixel + * interpolators (instances of PixelInterpolation::Interpolator), which + * are generic objects providing a common pixel interpolation interface that is + * independent on a particular interpolation algorithm. + * + * \sa NearestNeighborPixelInterpolation, BilinearPixelInterpolation, + * BicubicSplinePixelInterpolation, BicubicBSplinePixelInterpolation, + * BicubicFilterPixelInterpolation, LanczosPixelInterpolation, + * Lanczos3LUTPixelInterpolation, Lanczos4LUTPixelInterpolation, + * Lanczos5LUTPixelInterpolation + */ +class PCL_CLASS PixelInterpolation +{ +public: + + /*! + * \class pcl::PixelInterpolation::Interpolator + * \brief Generic two-dimensional pixel interpolator + * + * %Interpolator provides a common pixel interpolation interface that is + * independent on a particular interpolation algorithm. + */ + template + class PCL_CLASS Interpolator + { + public: + + /*! + * Represents a pixel sample value. + */ + typedef typename P::sample sample; + + /*! + * Constructs and initializes a new %Interpolator object. + * + * \param interpolation Pointer to a dynamically allocated instance of + * the two-dimensional interpolation algorithm. + * The instance will be owned by this object, + * which will destroy and deallocate it upon + * destruction. + * + * \param data Source matrix of pixel sample values that will + * be interpolated. + * + * \param width Horizontal dimension (most rapidly varying + * matrix subscript) of the source data matrix. + * Must be greater than zero. + * + * \param height Vertical dimension (most slowly varying matrix + * subscript) of the source data matrix. Must be + * greater than zero. + * + * \param unclipped If false (default value), the interpolation + * will constrain interpolated values to the + * native range of the pixel sample type + * represented by the template argument P. If + * true, interpolated pixel values will be + * returned unmodified. Note that this only makes + * sense for floating point pixel sample types. + */ + Interpolator( BidimensionalInterpolation* interpolation, + const sample* data, int width, int height, bool unclipped = false ) + : m_interpolation( interpolation ) + , m_unclipped( unclipped ) + { + if ( !m_interpolation.IsNull() ) + m_interpolation->Initialize( data, width, height ); + } + + /*! + * Disabled copy constructor. + */ + Interpolator( const Interpolator& ) = delete; + + /*! + * Move constructor. + */ + Interpolator( Interpolator&& ) = default; + + /*! + * Destroys an %Interpolator object and all internal working structures. + */ + virtual ~Interpolator() + { + } + + /*! + * Returns a reference to the immutable two-dimensional interpolation + * being used by this %Interpolator object. + */ + const BidimensionalInterpolation& Interpolation() const + { + PCL_PRECONDITION( !m_interpolation.IsNull() ) + return *m_interpolation; + } + + /*! + * Returns a reference to the mutable two-dimensional interpolation being + * used by this %Interpolator object. + */ + BidimensionalInterpolation& Interpolation() + { + PCL_PRECONDITION( !m_interpolation.IsNull() ) + return *m_interpolation; + } + + /*! + * Interpolates a pixel sample value at the specified \a x and \a y image + * coordinates. + * + * If this is an unclipped interpolator (see the class constructor), the + * interpolated value will be returned unmodified. If this is a clipped + * interpolator (default state), the returned value will be constrained + * to stay within the native range of the pixel sample type represented + * by the template argument P. Note that unclipped interpolation only + * makes sense for floating point pixel sample types. + */ + sample operator()( double x, double y ) const + { + PCL_PRECONDITION( !m_interpolation.IsNull() ) + double r = (*m_interpolation)( x, y ); + if ( !m_unclipped ) + { + if ( r > P::MaxSampleValue() ) + return P::MaxSampleValue(); + if ( r < P::MinSampleValue() ) + return P::MinSampleValue(); + } + return P::FloatToSample( r ); + } + + /*! + * Interpolates a pixel sample value at the specified \a p point. + * + * This is an overloaded member function, provided for convenience. It is + * equivalent to operator()( p.x, p.y ). + */ + template + sample operator()( const GenericPoint& p ) const + { + return operator()( p.x, p.y ); + } + + private: + + AutoPointer> m_interpolation; + bool m_unclipped; + }; + + // ------------------------------------------------------------------------- + + /*! + * Constructs a %PixelInterpolation object. + */ + PixelInterpolation() = default; + + /*! + * Copy constructor. + */ + PixelInterpolation( const PixelInterpolation& ) = default; + + /*! + * Destroys a %PixelInterpolation object. + */ + virtual ~PixelInterpolation() + { + } + + /*! + * Returns a descriptive text string for this pixel interpolation. + */ + virtual String Description() const = 0; + + /*! + * Returns true iff this interpolation can be safely used in multithreaded + * contexts. + * + * A thread-safe interpolator can be used concurrently by multiple threads + * without needing to lock access to the interpolated data. + * + * \note The default implementation returns true, so pixel interpolations + * are considered thread-safe by default. + */ + virtual bool IsThreadSafe() const + { + return true; + } + + /*! + * Creates a new Interpolator object specialized for a pixel sample type P. + * + * \param data Two-dimensional matrix of pixel sample values that will be + * interpolated. + * + * \param width Horizontal dimension (most rapidly varying matrix + * subscript) of the source data matrix. + * + * \param height Vertical dimension (most slowly varying matrix subscript) + * of the source data matrix. + */ + template + Interpolator

* NewInterpolator( const T* data, int width, int height, bool unclipped = false ) const + { + return new Interpolator

( NewInterpolation( data ), data, width, height, unclipped ); + } + +protected: + + virtual BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 32-bit floating point images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 64-bit floating point images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const ComplexPixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 32-bit complex images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const DComplexPixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 64-bit complex images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 8-bit integer images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 16-bit integer images" ); + } + + virtual BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const + { + throw NotImplemented( *this, "Interpolate 32-bit integer images" ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class NearestNeighborPixelInterpolation + * \brief NearestNeighbor pixel interpolation. + * + * %NearestNeighborPixelInterpolation uses the nearest neighbor interpolation + * algorithm (NearestNeighborInterpolation) to interpolate pixel values as the + * nearest neighbor source pixels. + * + * \sa PixelInterpolation, NearestNeighborInterpolation, + * BilinearPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicBSplinePixelInterpolation, BicubicFilterPixelInterpolation + */ +class PCL_CLASS NearestNeighborPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %NearestNeighborPixelInterpolation object. + */ + NearestNeighborPixelInterpolation() = default; + + /*! + * Copy constructor. + */ + NearestNeighborPixelInterpolation( const NearestNeighborPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + return "Nearest neighbor interpolation"; + } + +private: + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new NearestNeighborInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new NearestNeighborInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new NearestNeighborInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new NearestNeighborInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new NearestNeighborInterpolation; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BilinearPixelInterpolation + * \brief Bilinear pixel interpolation. + * + * %BilinearPixelInterpolation uses the bilinear interpolation algorithm + * (BilinearInterpolation) to interpolate pixel values from the nearest + * four neighbor pixels. + * + * \sa PixelInterpolation, BilinearInterpolation, + * NearestNeighborPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicBSplinePixelInterpolation, BicubicFilterPixelInterpolation + */ +class PCL_CLASS BilinearPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %BilinearPixelInterpolation object. + */ + BilinearPixelInterpolation() = default; + + /*! + * Copy constructor. + */ + BilinearPixelInterpolation( const BilinearPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + return "Bilinear interpolation"; + } + +private: + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new BilinearInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new BilinearInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new BilinearInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new BilinearInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new BilinearInterpolation; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicSplinePixelInterpolation + * \brief Bicubic spline pixel interpolation. + * + * %BicubicSplinePixelInterpolation uses the bicubic spline interpolation + * algorithm (BicubicSplineInterpolation) to interpolate pixel values from the + * nearest sixteen neighbor pixels. + * + * \sa PixelInterpolation, BicubicSplineInterpolation, + * NearestNeighborPixelInterpolation, BicubicPixelInterpolation, + * BicubicBSplinePixelInterpolation, BicubicFilterPixelInterpolation + */ +class PCL_CLASS BicubicSplinePixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %BicubicPixelInterpolation object. + * + * The optional \e clamp parameter is a linear clamping threshold + * for the bicubic spline interpolation algorithm. See the documentation for + * BicubicSplineInterpolation for a detailed description of the automatic + * linear clamping feature. + */ + BicubicSplinePixelInterpolation( double clamp = __PCL_BICUBIC_SPLINE_CLAMPING_THRESHOLD ) + : m_clamp( clamp ) + { + } + + /*! + * Copy constructor. + */ + BicubicSplinePixelInterpolation( const BicubicSplinePixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + return String().Format( "Bicubic spline interpolation, c=%.2f", m_clamp ); + } + +private: + + float m_clamp; + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new BicubicSplineInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new BicubicSplineInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new BicubicSplineInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new BicubicSplineInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new BicubicSplineInterpolation( m_clamp ); + } +}; + +/*! + * \class BicubicPixelInterpolation + * \brief Bicubic pixel interpolation - an alias for BicubicSplinePixelInterpolation. + * + * BicubicPixelInterpolation is a synonym for the + * BicubicSplinePixelInterpolation class. + * + * \sa BicubicSplinePixelInterpolation + */ +class PCL_CLASS BicubicPixelInterpolation : public BicubicSplinePixelInterpolation +{ +public: + + /*! + * Constructs a %BicubicPixelInterpolation object. + * + * The optional \e c parameter is a linear clamping threshold for + * the bicubic spline interpolation algorithm. See the documentation for + * BicubicSplineInterpolation for a detailed description of the automatic + * linear clamping feature. + */ + BicubicPixelInterpolation( double c = __PCL_BICUBIC_SPLINE_CLAMPING_THRESHOLD ) + : BicubicSplinePixelInterpolation( c ) + { + } + + /*! + * Copy constructor. + */ + BicubicPixelInterpolation( const BicubicPixelInterpolation& ) = default; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicBSplinePixelInterpolation + * \brief Bicubic B-spline pixel interpolation. + * + * %BicubicBSplinePixelInterpolation uses the bicubic B-spline interpolation + * algorithm (BicubicBSplineInterpolation) to interpolate pixel values from the + * nearest sixteen neighbor pixels. + * + * \sa PixelInterpolation, BicubicBSplineInterpolation, + * NearestNeighborPixelInterpolation, BilinearPixelInterpolation, + * BicubicSplinePixelInterpolation, BicubicFilterPixelInterpolation + */ +class PCL_CLASS BicubicBSplinePixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %BicubicBSplinePixelInterpolation object. + */ + BicubicBSplinePixelInterpolation() = default; + + /*! + * Copy constructor. + */ + BicubicBSplinePixelInterpolation( const BicubicBSplinePixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + return "Bicubic B-spline interpolation"; + } + +private: + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new BicubicBSplineInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new BicubicBSplineInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new BicubicBSplineInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new BicubicBSplineInterpolation; + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new BicubicBSplineInterpolation; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BicubicFilterPixelInterpolation + * \brief Pixel interpolation based on Mitchell-Netravali parameterized bicubic + * filters. + * + * %BicubicFilterPixelInterpolation uses a \e cubic \e filter (an instance of + * CubicFilter or a derived class) to interpolate pixel values in a square + * pixel matrix of the specified \e radius. + * + * \sa PixelInterpolation, CubicFilter, BicubicFilterInterpolation, + * NearestNeighborPixelInterpolation, BilinearPixelInterpolation, + * BicubicSplinePixelInterpolation, BicubicBSplinePixelInterpolation + */ +class PCL_CLASS BicubicFilterPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %BicubicFilterPixelInterpolation object. + * + * \param rh,rv Horizontal and vertical interpolation radii, respectively, + * in pixels. Both radii must be >= 1. Interpolation will + * take place in a rectangular pixel matrix whose dimensions + * will be width = 2*rh + 1 and height = 2*rv + 1. + * + * \param filter Reference to a CubicFilter instance that will be used as + * the interpolation filter. + * + */ + BicubicFilterPixelInterpolation( int rh, int rv, const CubicFilter& filter ) + : m_rh( Max( 1, rh ) ) + , m_rv( Max( 1, rv ) ) + { + PCL_PRECONDITION( rh >= 1 ) + PCL_PRECONDITION( rv >= 1 ) + m_filter = filter.Clone(); + } + + /*! + * Copy constructor. + */ + BicubicFilterPixelInterpolation( const BicubicFilterPixelInterpolation& x ) + : m_rh( x.m_rh ) + , m_rv( x.m_rv ) + { + m_filter = x.m_filter->Clone(); + } + + /*! + * Move constructor. + */ + BicubicFilterPixelInterpolation( BicubicFilterPixelInterpolation&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~BicubicFilterPixelInterpolation() + { + } + + /*! + */ + String Description() const override + { + return "Bicubic interpolation, " + m_filter->Description().AppendFormat( " (%dx%d)", 2*m_rh + 1, 2*m_rv + 1 ); + } + + /*! + * Returns a reference to the immutable cubic filter being used by this + * interpolation. + */ + const CubicFilter& Filter() const + { + return *m_filter; + } + +private: + + int m_rh, m_rv; + AutoPointer m_filter; + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new BicubicFilterInterpolation( m_rh, m_rv, *m_filter ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new BicubicFilterInterpolation( m_rh, m_rv, *m_filter ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new BicubicFilterInterpolation( m_rh, m_rv, *m_filter ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new BicubicFilterInterpolation( m_rh, m_rv, *m_filter ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new BicubicFilterInterpolation( m_rh, m_rv, *m_filter ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class LanczosPixelInterpolation + * \brief Lanczos pixel interpolation. + * + * %LanczosPixelInterpolation uses the Lanczos interpolation algorithm + * (LanczosInterpolation) to interpolate pixel values from the + * nearest 2*n^2 neighbor pixels, where n is the filter order. + * + * \sa PixelInterpolation, LanczosInterpolation, + * BicubicBSplinePixelInterpolation, NearestNeighborPixelInterpolation, + * BilinearPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicFilterPixelInterpolation, Lanczos3LUTPixelInterpolation, + * Lanczos4LUTPixelInterpolation, Lanczos5LUTPixelInterpolation + */ +class PCL_CLASS LanczosPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %LanczosPixelInterpolation object. + * + * \param n Filter order (n >= 1). The Lanczos filter interpolates + * from the nearest (2*n)^2 mapped source pixels for each + * interpolation point. The default filter order is 3, which + * means that the interpolation uses a neighborhood of 36 + * source pixels. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggresive deringing effect is + * achieved. A negative threshold value disables the + * interpolation clamping feature. The default value is 0.3. + */ + LanczosPixelInterpolation( int n = 3, float clamp = 0.3 ) + : m_n( Max( 1, n ) ) + , m_clamp( clamp ) + { + PCL_PRECONDITION( n >= 1 ) + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + LanczosPixelInterpolation( const LanczosPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + String desc = String().Format( "Lanczos-%d interpolation", m_n ); + if ( m_clamp >= 0 ) + desc.AppendFormat( ", c=%.2f", m_clamp ); + return desc; + } + +private: + + int m_n; // filter order + float m_clamp; // clamping threshold (enabled if >= 0) + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new LanczosInterpolation( m_n, m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new LanczosInterpolation( m_n, m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new LanczosInterpolation( m_n, m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new LanczosInterpolation( m_n, m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new LanczosInterpolation( m_n, m_clamp ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos3LUTPixelInterpolation + * \brief Lanczos 3rd-order LUT-based pixel interpolation. + * + * %Lanczos3LUTPixelInterpolation uses a Lanczos 3rd-order LUT-based interpolation + * algorithm (Lanczos3LUTInterpolation) to interpolate pixel values from the + * nearest 36 neighbor pixels. LUT-based interpolations are about three times + * faster than interpolations using function evaluations. + * + * \sa PixelInterpolation, Lanczos3LUTInterpolation, LanczosInterpolation, + * BicubicBSplinePixelInterpolation, NearestNeighborPixelInterpolation, + * BilinearPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicFilterPixelInterpolation, LanczosPixelInterpolation, + * Lanczos4LUTPixelInterpolation, Lanczos5LUTPixelInterpolation + */ +class PCL_CLASS Lanczos3LUTPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %Lanczos3LUTPixelInterpolation object. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggresive deringing effect is + * achieved. A negative threshold value disables the + * interpolation clamping feature. The default value is 0.3. + */ + Lanczos3LUTPixelInterpolation( float clamp = 0.3F ) + : m_clamp( clamp ) + { + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos3LUTPixelInterpolation( const Lanczos3LUTPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + String desc( "Lanczos-3 LUT interpolation" ); + if ( m_clamp >= 0 ) + desc.AppendFormat( ", c=%.2f", m_clamp ); + return desc; + } + +private: + + float m_clamp; // clamping threshold (enabled if >= 0) + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new Lanczos3LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new Lanczos3LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new Lanczos3LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new Lanczos3LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new Lanczos3LUTInterpolation( m_clamp ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos4LUTPixelInterpolation + * \brief Lanczos 3rd-order LUT-based pixel interpolation. + * + * %Lanczos4LUTPixelInterpolation uses a Lanczos 4th-order LUT-based + * interpolation algorithm (Lanczos4LUTInterpolation) to interpolate pixel + * values from the nearest 64 neighbor pixels. LUT-based interpolations are + * about three times faster than interpolations using function evaluations. + * + * \sa PixelInterpolation, Lanczos4LUTInterpolation, LanczosInterpolation, + * BicubicBSplinePixelInterpolation, NearestNeighborPixelInterpolation, + * BilinearPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicFilterPixelInterpolation, LanczosPixelInterpolation, + * Lanczos3LUTPixelInterpolation, Lanczos5LUTPixelInterpolation + */ +class PCL_CLASS Lanczos4LUTPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %Lanczos4LUTPixelInterpolation object. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggresive deringing effect is + * achieved. A negative threshold value disables the + * interpolation clamping feature. The default value is 0.3. + */ + Lanczos4LUTPixelInterpolation( float clamp = 0.3F ) + : m_clamp( Range( clamp, 0.0F, 1.0F ) ) + { + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos4LUTPixelInterpolation( const Lanczos4LUTPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + String desc( "Lanczos-4 LUT interpolation" ); + if ( m_clamp >= 0 ) + desc.AppendFormat( ", c=%.2f", m_clamp ); + return desc; + } + +private: + + float m_clamp; // clamping threshold (enabled if >= 0) + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new Lanczos4LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new Lanczos4LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new Lanczos4LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new Lanczos4LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new Lanczos4LUTInterpolation( m_clamp ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Lanczos5LUTPixelInterpolation + * \brief Lanczos 5th-order LUT-based pixel interpolation. + * + * %Lanczos5LUTPixelInterpolation uses a Lanczos 5th-order LUT-based + * interpolation algorithm (Lanczos5LUTInterpolation) to interpolate pixel + * values from the nearest 100 neighbor pixels. LUT-based interpolations are + * about three times faster than interpolations using function evaluations. + * + * \sa PixelInterpolation, Lanczos5LUTInterpolation, LanczosInterpolation, + * BicubicBSplinePixelInterpolation, NearestNeighborPixelInterpolation, + * BilinearPixelInterpolation, BicubicSplinePixelInterpolation, + * BicubicFilterPixelInterpolation, LanczosPixelInterpolation, + * Lanczos3LUTPixelInterpolation, Lanczos4LUTPixelInterpolation + */ +class PCL_CLASS Lanczos5LUTPixelInterpolation : public PixelInterpolation +{ +public: + + /*! + * Constructs a %Lanczos5LUTPixelInterpolation object. + * + * \param clamp Clamping threshold. Clamping is applied to fix undershoot + * (aka ringing) artifacts. A value of this parameter within + * the [0,1] range enables clamping: The lower the clamping + * threshold, the more aggresive deringing effect is + * achieved. A negative threshold value disables the + * interpolation clamping feature. The default value is 0.3. + */ + Lanczos5LUTPixelInterpolation( float clamp = 0.3F ) + : m_clamp( Range( clamp, 0.0F, 1.0F ) ) + { + PCL_PRECONDITION( clamp < 0 || 0 <= clamp && clamp <= 1 ) + } + + /*! + * Copy constructor. + */ + Lanczos5LUTPixelInterpolation( const Lanczos5LUTPixelInterpolation& ) = default; + + /*! + */ + String Description() const override + { + String desc( "Lanczos-5 LUT interpolation" ); + if ( m_clamp >= 0 ) + desc.AppendFormat( ", c=%.2f", m_clamp ); + return desc; + } + +private: + + float m_clamp; // clamping threshold (enabled if >= 0) + + BidimensionalInterpolation* + NewInterpolation( const FloatPixelTraits::sample* ) const override + { + return new Lanczos5LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const DoublePixelTraits::sample* ) const override + { + return new Lanczos5LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt8PixelTraits::sample* ) const override + { + return new Lanczos5LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt16PixelTraits::sample* ) const override + { + return new Lanczos5LUTInterpolation( m_clamp ); + } + + BidimensionalInterpolation* + NewInterpolation( const UInt32PixelTraits::sample* ) const override + { + return new Lanczos5LUTInterpolation( m_clamp ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#ifdef _MSC_VER +# pragma warning( pop ) +#endif + +#endif // __PCL_PixelInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PixelInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PixelTraits.h b/3rdparty/include/pcl/PixelTraits.h new file mode 100644 index 0000000..6e0b652 --- /dev/null +++ b/3rdparty/include/pcl/PixelTraits.h @@ -0,0 +1,6294 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PixelTraits.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PixelTraits_h +#define __PCL_PixelTraits_h + +/// \file pcl/PixelTraits.h + +#include +#include + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +struct PixelTraitsLUT +{ + const float* pFLUT8; // uint8 -> float + const float* pFLUTA; // i/255^2 (direct 8-bit normalization) + const float* p1FLUT8; // 1 - pFLUT8 + const float* pFLUT16; // uint16 -> float + const float* pFLUT20; // uint20 -> float + const double* pDLUT8; // uint8 -> double + const double* pDLUTA; // i/255^2 (direct 8-bit normalization) + const double* p1DLUT8; // 1- pDLUT8 + const double* pDLUT16; // uint16 -> double + const double* pDLUT20; // uint20 -> double + const uint8* p8LUT16; // uint16 -> uint8 + const uint8* p8LUT20; // uint20 -> uint8 + const uint16* p16LUT8; // uint8 -> uint16 + const uint16* p16LUT20; // uint20 -> uint16 + const uint32* p20LUT8; // uint8 -> uint20 + const uint32* p20LUT16; // uint16 -> uint20 + const uint32* p24LUT8; // uint8 -> uint24 + const uint32* p24LUT16; // uint16 -> uint24 + const uint32* p32LUT8; // uint8 -> uint32 + const uint32* p32LUT16; // uint16 -> uint32 + const uint32* p32LUT20; // uint20 -> uint32 +}; + +extern PCL_DATA const PixelTraitsLUT* PTLUT; + +#ifndef __PCL_DONT_USE_PIXTRAITS_LUT +# define pFLUT8 PTLUT->pFLUT8 +# define pFLUTA PTLUT->pFLUTA +# define p1FLUT8 PTLUT->p1FLUT8 +# define pFLUT16 PTLUT->pFLUT16 +# define pFLUT20 PTLUT->pFLUT20 +# define pDLUT8 PTLUT->pDLUT8 +# define pDLUTA PTLUT->pDLUTA +# define p1DLUT8 PTLUT->p1DLUT8 +# define pDLUT16 PTLUT->pDLUT16 +# define pDLUT20 PTLUT->pDLUT20 +# define p8LUT16 PTLUT->p8LUT16 +# define p8LUT20 PTLUT->p8LUT20 +# define p16LUT8 PTLUT->p16LUT8 +# define p16LUT20 PTLUT->p16LUT20 +# define p20LUT8 PTLUT->p20LUT8 +# define p20LUT16 PTLUT->p20LUT16 +# define p24LUT8 PTLUT->p24LUT8 +# define p24LUT16 PTLUT->p24LUT16 +# define p32LUT8 PTLUT->p32LUT8 +# define p32LUT16 PTLUT->p32LUT16 +# define p32LUT20 PTLUT->p32LUT20 +#endif + +#define EPSILON_D 1.0e-16 +#define EPSILON_F 1.0e-8F + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericPixelTraits + * \brief Base class of all pixel traits classes. + * + * %GenericPixelTraits defines fundamental properties and functionality common + * to pixel sample types. + * + * The purpose of a pixel traits class is to characterize a data type + * to represent a single component of a pixel, or pixel sample. For + * example, a pixel traits class must provide primitive routines to copy + * samples between pixels and images, and to transform sample values between + * different numeric data types, among many other critical, low-level tasks. + * + * %GenericPixelTraits is in the core of PixInsight's scalable design: + * by isolating low-level pixel sample manipulations from medium-level pixel + * management and high-level image transformations, the whole platform achieves + * optimum efficiency and versatility for multiple pixel data types. + * + * %GenericPixelTraits is a template class that must be instantiated for + * suitable data types. Seven instantiations of %GenericPixelTraits have + * already been predefined in PCL, namely: + * + * + * + * + * + * + * + * + * + *
FloatPixelTraits 32-bit IEEE 754 floating point real pixel samples
DoublePixelTraits 64-bit IEEE 754 floating point real pixel samples
ComplexPixelTraits 32-bit IEEE 754 floating point complex pixel samples
DComplexPixelTraits 64-bit IEEE 754 floating point complex pixel samples
UInt8PixelTraits 8-bit unsigned integer pixel samples
UInt16PixelTraits 16-bit unsigned integer pixel samples
UInt32PixelTraits 32-bit unsigned integer pixel samples
+ * + * In coordination with the GenericImage

class, these template + * instantiations originate the corresponding seven fundamental two-dimensional + * image classes that have been predefined in PCL: + * + * + * + * + * + * + * + * + * + *
Image 32-bit IEEE 754 floating point real image
DImage 64-bit IEEE 754 floating point real image
ComplexImage 32-bit IEEE 754 floating point complex image
DComplexImage 64-bit IEEE 754 floating point complex image
UInt8Image 8-bit unsigned integer image
UInt16Image 16-bit unsigned integer image
UInt32Image 32-bit unsigned integer image
+ * + * \sa FloatPixelTraits, DoublePixelTraits, ComplexPixelTraits, DComplexPixelTraits, + * UInt8PixelTraits, UInt16PixelTraits, UInt32PixelTraits, GenericImage, SharedPixelData + */ +template +class PCL_CLASS GenericPixelTraits +{ +public: + + /*! + * Represents a pixel sample value. + */ + typedef S sample; + + enum { bytesPerSample = sizeof( sample ) }; + enum { bitsPerSample = bytesPerSample << 3 }; + + /*! + * Returns the number of bytes necessary to store a pixel sample. + */ + static constexpr int BytesPerSample() noexcept + { + return bytesPerSample; + } + + /*! + * Returns the number of bits in a pixel sample. + */ + static constexpr int BitsPerSample() noexcept + { + return bitsPerSample; + } + + /*! + * Returns the minimum valid sample value. This is usually a value of zero + * in the numeric data type represented by \c sample. + */ + static constexpr sample MinSampleValue() noexcept + { + return sample( 0 ); + } +}; + +#define IMPLEMENT_TRANSFER_OPERATIONS \ + \ + template \ + static void Fill( sample* __restrict__ f, T x, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr ) \ + sample v = ToSample( x ); \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f ) \ + *f = v; \ + } \ + \ + static void Fill( sample* __restrict__ f, sample x, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f ) \ + *f = x; \ + } \ + \ + template \ + static void Get( T* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + FromSample( *f, *g ); \ + } \ + \ + static void Get( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + *f = *g; \ + } \ + \ + template \ + static void Copy( sample* __restrict__ f, const T* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + *f = ToSample( *g ); \ + } \ + \ + static void Copy( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + *f = *g; \ + } \ + \ + template \ + static void GetMin( T* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + { \ + T h; FromSample( h, *g ); \ + if ( h < *f ) \ + *f = h; \ + } \ + } \ + \ + static void GetMin( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + if ( *g < *f ) \ + *f = *g; \ + } \ + \ + template \ + static void CopyMin( sample* __restrict__ f, const T* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + { \ + sample h = ToSample( *g ); \ + if ( h < *f ) \ + *f = h; \ + } \ + } \ + \ + static void CopyMin( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + if ( *g < *f ) \ + *f = *g; \ + } \ + \ + template \ + static void GetMax( T* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + { \ + T h; FromSample( h, *g ); \ + if ( *f < h ) \ + *f = h; \ + } \ + } \ + \ + static void GetMax( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + if ( *f < *g ) \ + *f = *g; \ + } \ + \ + template \ + static void CopyMax( sample* __restrict__ f, const T* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + { \ + sample h = ToSample( *g ); \ + if ( *f < h ) \ + *f = h; \ + } \ + } \ + \ + static void CopyMax( sample* __restrict__ f, const sample* __restrict__ g, size_type n ) noexcept \ + { \ + PCL_PRECONDITION( f != nullptr && g != nullptr ) \ + PCL_IVDEP \ + for ( ; n > 0; --n, ++f, ++g ) \ + if ( *f < *g ) \ + *f = *g; \ + } + +// ---------------------------------------------------------------------------- + +/*! + * \class FloatPixelTraits + * \brief 32-bit IEEE 754 normalized floating point real pixel traits. + * + * %FloatPixelTraits is a template instantiation of GenericPixelTraits for the + * \c float type. It defines the characteristic properties and functionality of + * 32-bit IEEE 754 floating point real pixel samples. + * + * \sa GenericPixelTraits, GenericImage, Image + */ +class PCL_CLASS FloatPixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %FloatPixelTraits, this is equivalent to + * \c float. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return true; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %FloatPixelTraits, this member function returns "Float32". + */ + static constexpr const char* SampleFormat() noexcept + { + return "Float32"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %FloatPixelTraits, this member function returns 1.0F. + */ + static constexpr sample MaxSampleValue() noexcept + { + return 1.0F; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %FloatPixelTraits, this member function returns + * std::numeric_limits::lowest(). + */ + static constexpr sample LowestSampleValue() noexcept + { + return std::numeric_limits::lowest(); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %FloatPixelTraits, this member function returns + * std::numeric_limits::max(). + */ + static constexpr sample HighestSampleValue() noexcept + { + return std::numeric_limits::max(); + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static constexpr sample FloatToSample( T x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )/uint8_max; +#else + return pFLUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return (sample( x ) - int8_min)/uint8_max; +#else + return pFLUT8[int( x ) - int8_min]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )/uint16_max; +#else + return pFLUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return (sample( x ) - int16_min)/uint16_max; +#else + return pFLUT16[int( x ) - int16_min]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static constexpr sample ToSample( uint32 x ) noexcept + { + return sample( double( x )/uint32_max ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static constexpr sample ToSample( int32 x ) noexcept + { + return sample( (double( x ) - int32_min)/uint32_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static constexpr sample ToSample( float x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static constexpr sample ToSample( double x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static constexpr sample ToSample( const Complex& x ) noexcept + { + return sample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( b*uint8_max ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( RoundInt( b*uint8_max ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( b*uint16_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( b*uint16_max ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( Round( double( b )*uint32_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = int32( Round( double( b )*uint32_max ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( b ); + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( b ); + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + a = typename Complex::component( b ); + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a += ToSample( b ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a -= ToSample( b ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + a *= ToSample( b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a /= ToSample( b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + a = pcl::Pow( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = pcl::Abs( a - ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Or( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia | ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Nor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia | ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void And( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia & ib ) ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. Negation is + * performed after converting the operand to an 8-bit unsigned integer, + * then the result is converted to the pixel sample type before assignment. + */ + static void Not( sample& a ) noexcept + { + uint8 ia; FromSample( ia, a ); + a = ToSample( uint8( ~ia ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting both operands to 8-bit unsigned integers, then the result is + * converted to the pixel sample type and assigned to \a a. + */ + template + static void Not( sample& a, T b ) noexcept + { + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void Nand( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia & ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia ^ ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia ^ ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + a = 1 - pcl::Min( (1 - a)/pcl::Max( EPSILON_F, ToSample( b ) ), 1.0F ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + a = a + ToSample( b ) - 1; + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + a = 1 - (1 - a)*(1 - ToSample( b )); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + a = pcl::Min( a/pcl::Max( EPSILON_F, (1 - ToSample( b )) ), 1.0F ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + a = (a > 0.5F) ? 1 - ((1 - 2*(a - 0.5F)) * (1 - ToSample( b ))) : 2*a*ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5F) ? 1 - (1 - a)*(1 - fb - 0.5F) : a*(fb + 0.5F); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5F) ? 1 - (1 - a)*(1 - 2*(fb - 0.5F)) : 2*a*fb; + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5F) ? 1 - pcl::Max( (1 - a)/(fb - 0.5F)/2, 1.0F ) : pcl::Min( a/pcl::Max( EPSILON_F, 1 - 2*fb ), 1.0F ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5F) ? pcl::Max( a + 2*(fb - 0.5F), 1.0F ) : pcl::Max( a + 2*fb - 1, 1.0F ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5F) ? pcl::Max( a, 2*(fb - 0.5F) ) : pcl::Min( a, 2*fb ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + a = pcl::Range( 0.5F - 2*(a - 0.5F)*(ToSample( b ) - 0.5F), 0.0F, 1.0F ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class DoublePixelTraits + * \brief 64-bit IEEE 754 normalized floating point real pixel traits. + * + * %DoublePixelTraits is a template instantiation of GenericPixelTraits for the + * \c double type. It defines the characteristic properties and functionality + * of 64-bit IEEE 754 floating point real pixel samples. + * + * \sa GenericPixelTraits, GenericImage, DImage + */ +class PCL_CLASS DoublePixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %DoublePixelTraits, this is equivalent + * to \c double. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return true; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %DoublePixelTraits, this member function returns "Float64". + */ + static constexpr const char* SampleFormat() noexcept + { + return "Float64"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %DoublePixelTraits, this member function returns 1.0. + */ + static constexpr sample MaxSampleValue() noexcept + { + return 1.0; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %DoublePixelTraits, this member function returns + * std::numeric_limits::lowest(). + */ + static constexpr sample LowestSampleValue() noexcept + { + return std::numeric_limits::lowest(); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %DoublePixelTraits, this member function returns + * std::numeric_limits::max(). + */ + static constexpr sample HighestSampleValue() noexcept + { + return std::numeric_limits::max(); + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static constexpr sample FloatToSample( T x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )/uint8_max; +#else + return pDLUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return (sample( x ) - int8_min)/uint8_max; +#else + return pDLUT8[int( x ) - int8_min]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )/uint16_max; +#else + return pDLUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return (sample( x ) - int16_min)/uint16_max; +#else + return pDLUT16[int( x ) - int16_min]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static constexpr sample ToSample( uint32 x ) noexcept + { + return sample( x )/uint32_max; + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static constexpr sample ToSample( int32 x ) noexcept + { + return (sample( x ) - int32_min)/uint32_max; + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static constexpr sample ToSample( float x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static constexpr sample ToSample( double x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static constexpr sample ToSample( const Complex& x ) noexcept + { + return sample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( b*uint8_max ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( RoundInt( b*uint8_max ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( b*uint16_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( b*uint16_max ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( Round( sample( b )*uint32_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = int32( Round( sample( b )*uint32_max ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( b ); + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( b ); + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + a = typename Complex::component( b ); + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a += ToSample( b ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a -= ToSample( b ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + a *= ToSample( b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a /= ToSample( b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + a = pcl::Pow( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = pcl::Abs( a - ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Or( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia | ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Nor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia | ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void And( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia & ib ) ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. Negation is + * performed after converting the operand to an 8-bit unsigned integer, + * then the result is converted to the pixel sample type before assignment. + */ + static void Not( sample& a ) noexcept + { + uint8 ia; FromSample( ia, a ); + a = ToSample( uint8( ~ia ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting both operands to 8-bit unsigned integers, then the result is + * converted to the pixel sample type and assigned to \a a. + */ + template + static void Not( sample& a, T b ) noexcept + { + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void Nand( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia & ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia ^ ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia ^ ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + a = 1 - pcl::Min( (1 - a)/pcl::Max( EPSILON_D, ToSample( b ) ), 1.0 ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + a = a + ToSample( b ) - 1; + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + a = 1 - (1 - a)*(1 - ToSample( b )); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + a = pcl::Min( a/pcl::Max( EPSILON_D, (1 - ToSample( b )) ), 1.0 ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + a = (a > 0.5) ? 1 - ((1 - 2*(a - 0.5)) * (1 - ToSample( b ))) : 2*a*ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5) ? 1 - (1 - a)*(1 - fb - 0.5) : a*(fb + 0.5); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5) ? 1 - (1 - a)*(1 - 2*(fb - 0.5)) : 2*a*fb; + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5) ? 1 - pcl::Max( (1 - a)/(fb - 0.5)/2, 1.0 ) : pcl::Min( a/pcl::Max( EPSILON_D, 1 - 2*fb ), 1.0 ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5) ? pcl::Max( a + 2*(fb - 0.5), 1.0 ) : pcl::Max( a + 2*fb - 1, 1.0 ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + sample fb = ToSample( b ); + a = (fb > 0.5) ? pcl::Max( a, 2*(fb - 0.5) ) : pcl::Min( a, 2*fb ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + a = pcl::Range( 0.5 - 2*(a - 0.5)*(ToSample( b ) - 0.5), 0.0, 1.0 ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ComplexPixelTraits + * \brief 32-bit IEEE 754 normalized floating point complex pixel traits. + * + * %ComplexPixelTraits is a template instantiation of GenericPixelTraits for + * the \c Complex type. It defines the characteristic properties and + * functionality of 32-bit IEEE 754 floating point complex pixel samples. + * + * \sa GenericPixelTraits, GenericImage, ComplexImage + */ +class PCL_CLASS ComplexPixelTraits : public GenericPixelTraits > +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits > traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample. For + * %ComplexPixelTraits, this is equivalent to \c float. + */ + typedef sample::component component; + + static constexpr int BitsPerSample() noexcept + { + return sizeof( component ) << 3; + } + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return true; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %ComplexPixelTraits, this member function returns "Complex32". + */ + static constexpr const char* SampleFormat() noexcept + { + return "Complex32"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %ComplexPixelTraits, this member function returns {1.0F, 0.0F}. + */ + static sample MaxSampleValue() noexcept + { + return sample( component( 1 ) ); + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %ComplexPixelTraits, this member function returns + * {std::numeric_limits::lowest(), 0.0F}. + */ + static sample LowestSampleValue() noexcept + { + return sample( component( std::numeric_limits::lowest() ) ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %ComplexPixelTraits, this member function returns + * {std::numeric_limits::max(), 0.0F}. + */ + static sample HighestSampleValue() noexcept + { + return sample( component( std::numeric_limits::max() ) ); + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { + return sample( component( x ) ); + } + + template + static sample FloatToSample( sample x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( component( x )/uint8_max ); +#else + return sample( component( pFLUT8[x] ) ); +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( (component( x ) - int8_min)/uint8_max ); +#else + return sample( component( pFLUT8[int( x ) - int8_min] ) ); +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( component( x )/uint16_max ); +#else + return sample( component( pFLUT16[x] ) ); +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( (component( x ) - int16_min)/uint16_max ); +#else + return sample( component( pFLUT16[int( x ) - int16_min] ) ); +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( component( double( x )/uint32_max ) ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( component( (double( x ) - int32_min)/uint32_max ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return sample( component( x ) ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return sample( component( x ) ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static sample ToSample( const Complex& x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( pcl::Abs( b )*uint8_max ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSampl( int8& a, sample b ) noexcept + { + a = int8( RoundInt( pcl::Abs( b )*uint8_max ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( pcl::Abs( b )*uint16_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( pcl::Abs( b )*uint16_max ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( Round( double( pcl::Abs( b ) )*uint32_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = int32( Round( double( pcl::Abs( b ) )*uint32_max ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( pcl::Abs( b ) ); + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( pcl::Abs( b ) ); + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + a = Complex( b ); + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a += ToSample( b ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a -= ToSample( b ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + a *= ToSample( b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a /= ToSample( b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + a = pcl::Pow( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = pcl::Abs( a - ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Or( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia | ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Nor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia | ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void And( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia & ib ) ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. Negation is + * performed after converting the operand to an 8-bit unsigned integer, + * then the result is converted to the pixel sample type before assignment. + */ + static void Not( sample& a ) noexcept + { + uint8 ia; FromSample( ia, a ); + a = ToSample( uint8( ~ia ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting both operands to 8-bit unsigned integers, then the result is + * converted to the pixel sample type and assigned to \a a. + */ + template + static void Not( sample& a, T b ) noexcept + { + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void Nand( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia & ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia ^ ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia ^ ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, fb ), 1.0F ) ); + } + + static void ColorBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, b ), 1.0F ) ); + } + + static void ColorBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa + fb - 1 ); + } + + static void LinearBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + static void LinearBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - (1 - fa)*(1 - fb) ); + } + + static void Screen( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + static void Screen( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - fb ), 1.0F ) ); + } + + static void ColorDodge( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - b ), 1.0F ) ); + } + + static void ColorDodge( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - fb)) : 2*a*fb ); + } + + static void Overlay( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - b)) : 2*a*b ); + } + + static void Overlay( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - b)) : 2*a*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - fb - 0.5F) : a*(fb + 0.5F) ); + } + + static void SoftLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - b - 0.5F) : a*(b + 0.5F) ); + } + + static void SoftLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - b - 0.5) : a*(b + 0.5) ); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5F)) : 2*fa*fb ); + } + + static void HardLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - 2*(b - 0.5F)) : 2*fa*b ); + } + + static void HardLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - 2*(b - 0.5)) : 2*fa*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*fb ), 1.0F ) ); + } + + static void VividLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - pcl::Max( (1 - fa)/(b - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*b ), 1.0F ) ); + } + + static void VividLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - pcl::Max( (1 - fa)/(b - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa + 2*(fb - 0.5F), 1.0F ) : pcl::Max( fa + 2*fb - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa + 2*(b - 0.5F), 1.0F ) : pcl::Max( fa + 2*b - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa + 2*(b - 0.5), 1.0 ) : pcl::Max( fa + 2*b - 1, 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa, 2*(fb - 0.5F) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa, 2*(b - 0.5F) ) : pcl::Min( fa, 2*b ) ); + } + + static void PinLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa, 2*(b - 0.5) ) : pcl::Min( fa, 2*b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(fb - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(b - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(b - 0.5), 0.0, 1.0 ) ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class DComplexPixelTraits + * \brief 64-bit IEEE 754 normalized floating point complex pixel traits. + * + * %DComplexPixelTraits is a template instantiation of GenericPixelTraits for + * the \c Complex type. It defines the characteristic properties and + * functionality of 64-bit IEEE 754 floating point complex pixel samples. + * + * \sa GenericPixelTraits, GenericImage, DComplexImage + */ +class PCL_CLASS DComplexPixelTraits : public GenericPixelTraits > +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits > traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample. For + * %DComplexPixelTraits, this is equivalent to \c double. + */ + typedef sample::component component; + + /*! + */ + static constexpr int BitsPerSample() noexcept + { + return sizeof( component ) << 3; + } + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return true; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %DComplexPixelTraits, this member function returns "Complex64". + */ + static constexpr const char* SampleFormat() noexcept + { + return "Complex64"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %DComplexPixelTraits, this member function returns {1.0, 0.0}. + */ + static sample MaxSampleValue() noexcept + { + return sample( component( 1 ) ); + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %DComplexPixelTraits, this member function returns + * {std::numeric_limits::lowest(), 0.0F}. + */ + static sample LowestSampleValue() noexcept + { + return sample( component( std::numeric_limits::lowest() ) ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %DComplexPixelTraits, this member function returns + * {std::numeric_limits::max(), 0.0F}. + */ + static sample HighestSampleValue() noexcept + { + return sample( component( std::numeric_limits::max() ) ); + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { + return sample( component( x ) ); + } + + template + static sample FloatToSample( sample x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( component( x )/uint8_max ); +#else + return sample( component( pDLUT8[x] ) ); +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( (component( x ) - int8_min)/uint8_max ); +#else + return sample( component( pDLUT8[int( x ) - int8_min] ) ); +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( component( x )/uint16_max ); +#else + return sample( component( pDLUT16[x] ) ); +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( (component( x ) - int16_min)/uint16_max ); +#else + return sample( component( pDLUT16[int( x ) - int16_min] ) ); +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( component( x )/uint32_max ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( (component( x ) - int32_min)/uint32_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return sample( component( x ) ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return sample( component( x ) ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static sample ToSample( const Complex& x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( pcl::Abs( b )*uint8_max ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( RoundInt( pcl::Abs( b )*uint8_max ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( pcl::Abs( b )*uint16_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( pcl::Abs( b )*uint16_max ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( Round( component( pcl::Abs( b ) )*uint32_max ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = int32( Round( component( pcl::Abs( b ) )*uint32_max ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( pcl::Abs( b ) ); + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( pcl::Abs( b ) ); + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + a = Complex( b ); + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a += ToSample( b ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a -= ToSample( b ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + a *= ToSample( b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a /= ToSample( b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + a = pcl::Pow( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = pcl::Abs( a - ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Or( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia | ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Nor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia | ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void And( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia & ib ) ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. Negation is + * performed after converting the operand to an 8-bit unsigned integer, + * then the result is converted to the pixel sample type before assignment. + */ + static void Not( sample& a ) noexcept + { + uint8 ia; FromSample( ia, a ); + a = ToSample( uint8( ~ia ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting both operands to 8-bit unsigned integers, then the result is + * converted to the pixel sample type and assigned to \a a. + */ + template + static void Not( sample& a, T b ) noexcept + { + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * both operands to 8-bit unsigned integers, then the result is converted to + * the pixel sample type and assigned to \a a. + */ + template + static void Nand( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia & ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ia ^ ib ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting both operands to 8-bit unsigned integers, then the + * result is converted to the pixel sample type and assigned to \a a. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + uint8 ia; FromSample( ia, a ); + uint8 ib; FromSample( ib, ToSample( b ) ); + a = ToSample( uint8( ~(ia ^ ib) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, fb ), 1.0 ) ); + } + + static void ColorBurn( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, double( b ) ), 1.0 ) ); + } + + static void ColorBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa + fb - 1 ); + } + + static void LinearBurn( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + double( b ) - 1 ); + } + + static void LinearBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - (1 - fa)*(1 - fb) ); + } + + static void Screen( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - double( b )) ); + } + + static void Screen( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - fb ), 1.0 ) ); + } + + static void ColorDodge( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - double( b ) ), 1.0 ) ); + } + + static void ColorDodge( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - fb)) : 2*a*fb ); + } + + static void Overlay( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - double( b ))) : 2*a*double( b ) ); + } + + static void Overlay( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - b)) : 2*a*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - fb - 0.5) : a*(fb + 0.5) ); + } + + static void SoftLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - fb - 0.5) : a*(fb + 0.5) ); + } + + static void SoftLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - b - 0.5) : a*(b + 0.5) ); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5)) : 2*fa*fb ); + } + + static void HardLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5)) : 2*fa*fb ); + } + + static void HardLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - 2*(b - 0.5)) : 2*fa*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*fb ), 1.0 ) ); + } + + static void VividLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*fb ), 1.0 ) ); + } + + static void VividLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - pcl::Max( (1 - fa)/(b - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa + 2*(fb - 0.5), 1.0 ) : pcl::Max( fa + 2*fb - 1, 1.0 ) ); + } + + static void LinearLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa + 2*(fb - 0.5), 1.0 ) : pcl::Max( fa + 2*fb - 1, 1.0 ) ); + } + + static void LinearLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa + 2*(b - 0.5), 1.0 ) : pcl::Max( fa + 2*b - 1, 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa, 2*(fb - 0.5) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa, 2*(fb - 0.5) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa, 2*(b - 0.5) ) : pcl::Min( fa, 2*b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(fb - 0.5), 0.0, 1.0 ) ); + } + + static void Exclusion( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(double( b ) - 0.5), 0.0, 1.0 ) ); + } + + static void Exclusion( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(b - 0.5), 0.0, 1.0 ) ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class UInt8PixelTraits + * \brief 8-bit unsigned integer pixel traits. + * + * %UInt8PixelTraits is a template instantiation of GenericPixelTraits for the + * \c uint8 type. It defines the characteristic properties and functionality of + * 8-bit unsigned integer pixel samples. + * + * \sa GenericPixelTraits, GenericImage, UInt8Image + */ +class PCL_CLASS UInt8PixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %UInt8PixelTraits, this is equivalent to + * \c uint8. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %UInt8PixelTraits, this member function returns "UInt8". + */ + static constexpr const char* SampleFormat() noexcept + { + return "UInt8"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %UInt8PixelTraits, this member function returns 255. + */ + static constexpr sample MaxSampleValue() noexcept + { + return uint8_max; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %UInt8PixelTraits, this member function returns 0. + */ + static constexpr sample LowestSampleValue() noexcept + { + return sample( 0 ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %UInt8PixelTraits, this member function returns 255. + */ + static constexpr sample HighestSampleValue() noexcept + { + return uint8_max; + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { +#ifdef __PCL_ENFORCE_PIXTRAITS_FLOAT_RANGE + return sample( pcl::Range( Round( x ), T( 0 ), T( uint8_max ) ) ); +#else + // ### N.B.: x must be in the range [0,uint8_max]. + return sample( RoundInt( x ) ); +#endif + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static constexpr sample ToSample( uint8 x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static constexpr sample ToSample( int8 x ) noexcept + { + return sample( int32( x ) - int32( int8_min ) ); + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( Round( double( x )*uint16_to_uint8 ) ); +#else + return p8LUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( Round( (double( x ) - int16_min)*uint16_to_uint8 ) ); +#else + return p8LUT16[int( x ) - int16_min]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( Round( double( x )*uint32_to_uint8 ) ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( Round( (double( x ) - int32_min)*uint32_to_uint8 ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return FloatToSample( x*uint8_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( float x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0F, 1.0F )*uint8_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return FloatToSample( x*uint8_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( double x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0, 1.0 )*uint8_max ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static sample ToSample( const Complex& x ) noexcept + { + return ToSample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( b ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( int32( b ) + int32( int8_min ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint16( b )*uint8_to_uint16; +#else + a = p16LUT8[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int16( int32( uint16( b )*uint8_to_uint16 ) + int32( int16_min ) ); +#else + a = int16( int32( p16LUT8[b] ) + int32( int16_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint32( b )*uint8_to_uint32; +#else + a = p32LUT8[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int32( double( uint32( b )*uint8_to_uint32 ) + int32_min ); +#else + a = int32( int64( p32LUT8[b] ) + int64( int32_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = float( b )/uint8_max; +#else + a = pFLUT8[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = double( b )/uint8_max; +#else + a = pDLUT8[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + typename Complex::component c; + FromSample( c, b ); + a = c; + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a = sample( pcl::Range( uint32( a ) + uint32( ToSample( b ) ), + uint32( 0 ), uint32( uint8_max ) ) ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a = sample( pcl::Range( int32( a ) - int32( ToSample( b ) ), + int32( 0 ), int32( uint8_max ) ) ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa * fb ); + } + + /*! # + */ + static void Mul( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a = FloatToSample( float( a )/float( ToSample( b ) ) ); + } + + /*! # + */ + static void Div( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Pow( fa, fb ) ); + } + + /*! # + */ + static void Pow( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! # + */ + static void Pow( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = sample( pcl::Range( pcl::Abs( int32( a ) - int32( ToSample( b ) ) ), + int32( 0 ), int32( uint8_max ) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Or( sample& a, T b ) noexcept + { + a |= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nor( sample& a, T b ) noexcept + { + a = ~(a | ToSample( b )); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void And( sample& a, T b ) noexcept + { + a &= ToSample( b ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. + */ + static void Not( sample& a ) noexcept + { + a = sample( ~a ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Not( sample& a, T b ) noexcept + { + a = sample( ~ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nand( sample& a, T b ) noexcept + { + a = sample( ~(a & ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xor( sample& a, T b ) noexcept + { + a ^= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + a = sample( ~(a ^ ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, fb ), 1.0F ) ); + } + + static void ColorBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, b ), 1.0F ) ); + } + + static void ColorBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa + fb - 1 ); + } + + static void LinearBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + static void LinearBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - (1 - fa)*(1 - fb) ); + } + + static void Screen( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + static void Screen( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - fb ), 1.0F ) ); + } + + static void ColorDodge( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - b ), 1.0F ) ); + } + + static void ColorDodge( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - fb)) : 2*a*fb ); + } + + static void Overlay( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - b)) : 2*a*b ); + } + + static void Overlay( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - b)) : 2*a*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - fb - 0.5F) : a*(fb + 0.5F) ); + } + + static void SoftLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - b - 0.5F) : a*(b + 0.5F) ); + } + + static void SoftLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - b - 0.5) : a*(b + 0.5) ); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5F)) : 2*fa*fb ); + } + + static void HardLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - 2*(b - 0.5F)) : 2*fa*b ); + } + + static void HardLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - 2*(b - 0.5)) : 2*fa*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*fb ), 1.0F ) ); + } + + static void VividLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - pcl::Max( (1 - fa)/(b - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*b ), 1.0F ) ); + } + + static void VividLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - pcl::Max( (1 - fa)/(b - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa + 2*(fb - 0.5F), 1.0F ) : pcl::Max( fa + 2*fb - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa + 2*(b - 0.5F), 1.0F ) : pcl::Max( fa + 2*b - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa + 2*(b - 0.5), 1.0 ) : pcl::Max( fa + 2*b - 1, 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa, 2*(fb - 0.5F) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa, 2*(b - 0.5F) ) : pcl::Min( fa, 2*b ) ); + } + + static void PinLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa, 2*(b - 0.5) ) : pcl::Min( fa, 2*b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(fb - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(b - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(b - 0.5), 0.0, 1.0 ) ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class UInt16PixelTraits + * \brief 16-bit unsigned integer pixel traits. + * + * %UInt16PixelTraits is a template instantiation of GenericPixelTraits for the + * \c uint16 type. It defines the characteristic properties and functionality + * of 16-bit unsigned integer pixel samples. + * + * \sa GenericPixelTraits, GenericImage, UInt16Image + */ +class PCL_CLASS UInt16PixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %UInt16PixelTraits, this is equivalent + * to \c uint16. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %UInt16PixelTraits, this member function returns "UInt16". + */ + static constexpr const char* SampleFormat() noexcept + { + return "UInt16"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %UInt16PixelTraits, this member function returns 65535. + */ + static constexpr sample MaxSampleValue() noexcept + { + return uint16_max; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %UInt16PixelTraits, this member function returns 0. + */ + static constexpr sample LowestSampleValue() noexcept + { + return sample( 0 ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %UInt16PixelTraits, this member function returns 255. + */ + static constexpr sample HighestSampleValue() noexcept + { + return uint16_max; + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { +#ifdef __PCL_ENFORCE_PIXTRAITS_FLOAT_RANGE + return sample( pcl::Range( Round( x ), T( 0 ), T( uint16_max ) ) ); +#else + // ### N.B.: x must be in the range [0,uint16_max]. + return sample( RoundInt( x ) ); +#endif + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )*sample( uint8_to_uint16 ); +#else + return p16LUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( (int32( x ) - int32( int8_min ))*int32( uint8_to_uint16 ) ); +#else + return p16LUT8[int( x ) - int( int8_min )]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static constexpr sample ToSample( uint16 x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static constexpr sample ToSample( int16 x ) noexcept + { + return sample( int32( x ) - int32( int16_min ) ); + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( Round( double( x )*uint32_to_uint16 ) ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( Round( (double( x ) - int32_min)*uint32_to_uint16 ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return FloatToSample( x*uint16_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( float x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0F, 1.0F )*uint16_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return FloatToSample( x*uint16_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( double x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0, 1.0 )*uint16_max ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static constexpr sample ToSample( const Complex& x ) noexcept + { + return ToSample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint8( Round( double( b )*uint16_to_uint8 ) ); +#else + a = p8LUT16[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int8( Round( double( b )*uint16_to_uint8 ) + int8_min ); +#else + a = int8( int( p8LUT16[b] ) + int( int8_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( b ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( int32( b ) + int32( int16_min ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint32( b )*uint16_to_uint32; +#else + a = p32LUT16[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int32( double( uint32( b )*uint16_to_uint32 ) + int32_min ); +#else + a = int32( int64( p32LUT16[b] ) + int64( int32_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = float( b )/uint16_max; +#else + a = pFLUT16[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = double( b )/uint16_max; +#else + a = pDLUT16[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + typename Complex::component c; + FromSample( c, b ); + a = c; + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a = sample( pcl::Range( uint32( a ) + uint32( ToSample( b ) ), + uint32( 0 ), uint32( uint16_max ) ) ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a = sample( pcl::Range( int32( a ) - int32( ToSample( b ) ), + int32( 0 ), int32( uint16_max ) ) ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa * fb ); + } + + /*! # + */ + static void Mul( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a = FloatToSample( double( a )/double( ToSample( b ) ) ); + } + + /*! # + */ + static void Div( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Pow( fa, fb ) ); + } + + /*! # + */ + static void Pow( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, double( b ) ) ); + } + + /*! # + */ + static void Pow( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, pcl::Complex( b ) ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = sample( pcl::Range( pcl::Abs( int32( a ) - int32( ToSample( b ) ) ), + int32( 0 ), int32( uint16_max ) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = pcl::Min( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = pcl::Max( a, ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Or( sample& a, T b ) noexcept + { + a |= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nor( sample& a, T b ) noexcept + { + a = ~(a | ToSample( b )); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void And( sample& a, T b ) noexcept + { + a &= ToSample( b ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. + */ + static void Not( sample& a ) noexcept + { + a = sample( ~a ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Not( sample& a, T b ) noexcept + { + a = sample( ~ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nand( sample& a, T b ) noexcept + { + a = sample( ~(a & ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xor( sample& a, T b ) noexcept + { + a ^= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + a = sample( ~(a ^ ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, fb ), 1.0F ) ); + } + + static void ColorBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_F, b ), 1.0F ) ); + } + + static void ColorBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa + fb - 1 ); + } + + static void LinearBurn( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + static void LinearBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - (1 - fa)*(1 - fb) ); + } + + static void Screen( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + static void Screen( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - fb ), 1.0F ) ); + } + + static void ColorDodge( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_F, 1 - b ), 1.0F ) ); + } + + static void ColorDodge( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - fb)) : 2*a*fb ); + } + + static void Overlay( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5F) ? 1 - ((1 - 2*(fa - 0.5F)) * (1 - b)) : 2*a*b ); + } + + static void Overlay( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - b)) : 2*a*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - fb - 0.5F) : a*(fb + 0.5F) ); + } + + static void SoftLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - b - 0.5F) : a*(b + 0.5F) ); + } + + static void SoftLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - b - 0.5) : a*(b + 0.5) ); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5F)) : 2*fa*fb ); + } + + static void HardLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - (1 - fa)*(1 - 2*(b - 0.5F)) : 2*fa*b ); + } + + static void HardLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - 2*(b - 0.5)) : 2*fa*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*fb ), 1.0F ) ); + } + + static void VividLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? 1 - pcl::Max( (1 - fa)/(b - 0.5F)/2, 1.0F ) : pcl::Min( fa/pcl::Max( EPSILON_F, 1 - 2*b ), 1.0F ) ); + } + + static void VividLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - pcl::Max( (1 - fa)/(b - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa + 2*(fb - 0.5F), 1.0F ) : pcl::Max( fa + 2*fb - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa + 2*(b - 0.5F), 1.0F ) : pcl::Max( fa + 2*b - 1, 1.0F ) ); + } + + static void LinearLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa + 2*(b - 0.5), 1.0 ) : pcl::Max( fa + 2*b - 1, 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5F) ? pcl::Max( fa, 2*(fb - 0.5F) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( (b > 0.5F) ? pcl::Max( fa, 2*(b - 0.5F) ) : pcl::Min( fa, 2*b ) ); + } + + static void PinLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa, 2*(b - 0.5) ) : pcl::Min( fa, 2*b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + float fa; FromSample( fa, a ); + float fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(fb - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, float b ) noexcept + { + float fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5F - 2*(fa - 0.5F)*(b - 0.5F), 0.0F, 1.0F ) ); + } + + static void Exclusion( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(b - 0.5), 0.0, 1.0 ) ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class UInt32PixelTraits + * \brief 32-bit unsigned integer pixel traits. + * + * %UInt32PixelTraits is a template instantiation of GenericPixelTraits for the + * \c uint32 type. It defines the characteristic properties and functionality + * of 32-bit unsigned integer pixel samples. + * + * \sa GenericPixelTraits, GenericImage, UInt32Image + */ +class PCL_CLASS UInt32PixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %UInt32PixelTraits, this is equivalent + * to \c uint32. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %UInt32PixelTraits, this member function returns "UInt32". + */ + static constexpr const char* SampleFormat() noexcept + { + return "UInt32"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %UInt32PixelTraits, this member function returns 4294967295. + */ + static constexpr sample MaxSampleValue() noexcept + { + return uint32_max; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %UInt32PixelTraits, this member function returns 0. + */ + static constexpr sample LowestSampleValue() noexcept + { + return sample( 0 ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %UInt32PixelTraits, this member function returns 4294967295. + */ + static constexpr sample HighestSampleValue() noexcept + { + return uint32_max; + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { +#ifdef __PCL_ENFORCE_PIXTRAITS_FLOAT_RANGE + return sample( pcl::Range( Round( x ), T( 0 ), T( uint32_max ) ) ); +#else + // ### N.B.: x must be in the range [0,uint32_max]. + return sample( RoundI64( x ) ); +#endif + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )*sample( uint8_to_uint32 ); +#else + return p32LUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( uint32( int32( x ) - int32( int8_min ) )*uint8_to_uint32 ); +#else + return p32LUT8[int( x ) - int( int8_min )]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x )*sample( uint16_to_uint32 ); +#else + return p32LUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( uint32( int32( x ) - int32( int16_min ) )*uint16_to_uint32 ); +#else + return p32LUT16[int( x ) - int( int16_min )]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static constexpr sample ToSample( uint32 x ) noexcept + { + return sample( x ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static constexpr sample ToSample( int32 x ) noexcept + { + return sample( double( x ) - double( int32_min ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return FloatToSample( double( x )*uint32_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( float x ) noexcept + { + return FloatToSample( pcl::Range( double( x ), 0.0, 1.0 )*uint32_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return FloatToSample( x*uint32_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( double x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0, 1.0 )*uint32_max ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static sample ToSample( const Complex& x ) noexcept + { + return ToSample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( double( b )*uint32_to_uint8 ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( RoundInt( double( b )*uint32_to_uint8 ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( double( b )*uint32_to_uint16 ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( double( b )*uint32_to_uint16 ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( b ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = TruncInt( double( b ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( double( b )/uint32_max ); + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( b )/uint32_max; + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + typename Complex::component c; + FromSample( c, b ); + a = c; + } + + /*! + * Copies a T value \a b to a pixel sample variable \a a, with implicit + * conversion from the source data type T to the pixel sample type. + */ + template + static void Mov( sample& a, T b ) noexcept + { + a = ToSample( b ); + } + + /*! + * Adds a T value \a b to a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Add( sample& a, T b ) noexcept + { + a = sample( pcl::Range( double( a ) + double( ToSample( b ) ), + 0.0, double( uint32_max ) ) ); + } + + /*! + * Subtracts a T value \a b from a pixel sample variable \a a, with implicit + * data type conversion. + */ + template + static void Sub( sample& a, T b ) noexcept + { + a = sample( pcl::Range( double( a ) - double( ToSample( b ) ), + 0.0, double( uint32_max ) ) ); + } + + /*! + * Multiplies a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Mul( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa * fb ); + } + + /*! # + */ + static void Mul( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! # + */ + static void Mul( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa * b ); + } + + /*! + * Divides a pixel sample variable \a a by a T value \a b, with implicit + * data type conversion. + */ + template + static void Div( sample& a, T b ) noexcept + { + a = FloatToSample( double( a )/double( ToSample( b ) ) ); + } + + /*! # + */ + static void Div( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! # + */ + static void Div( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa / b ); + } + + /*! + * Raises a pixel sample variable \a a to a T exponent value \a b, with + * implicit data type conversion. + */ + template + static void Pow( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Pow( fa, fb ) ); + } + + /*! # + */ + static void Pow( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, double( b ) ) ); + } + + /*! # + */ + static void Pow( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, pcl::Complex( b ) ) ); + } + + /*! # + */ + static void Pow( sample& a, pcl::Complex b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Pow( fa, b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a its absolute difference with a T + * value \a b, with implicit data type conversion. + */ + template + static void Dif( sample& a, T b ) noexcept + { + a = sample( pcl::Range( pcl::Abs( double( a ) - double( ToSample( b ) ) ), + 0.0, double( uint32_max ) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the minimum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Min( sample& a, T b ) noexcept + { + a = sample( pcl::Min( a, ToSample( b ) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the maximum of its current value + * and a T value \a b, with implicit data type conversion. + */ + template + static void Max( sample& a, T b ) noexcept + { + a = sample( pcl::Max( a, ToSample( b ) ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive OR + * operation with a T value \a b. The bitwise OR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Or( sample& a, T b ) noexcept + { + a |= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise inclusive NOR + * operation with a T value \a b. The bitwise NOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nor( sample& a, T b ) noexcept + { + a = ~(a | ToSample( b )); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise AND operation with a + * T value \a b. The bitwise AND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void And( sample& a, T b ) noexcept + { + a &= ToSample( b ); + } + + /*! + * Negates (bitwise NOT operation) a pixel sample variable \a a. + */ + static void Not( sample& a ) noexcept + { + a = sample( ~a ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise negation (NOT + * operation) of a T value \a b. Bitwise negation is performed after + * converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Not( sample& a, T b ) noexcept + { + a = sample( ~ToSample( b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise NAND operation with a + * T value \a b. The bitwise NAND operation is performed after converting + * the right-hand side operand \a b to the pixel sample type. + */ + template + static void Nand( sample& a, T b ) noexcept + { + a = sample( ~(a & ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive OR (XOR) + * operation with a T value \a b. The bitwise XOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xor( sample& a, T b ) noexcept + { + a ^= ToSample( b ); + } + + /*! + * Assigns to a pixel sample variable \a a the bitwise exclusive NOR (XNOR) + * operation with a T value \a b. The bitwise XNOR operation is performed + * after converting the right-hand side operand \a b to the pixel sample type. + */ + template + static void Xnor( sample& a, T b ) noexcept + { + a = sample( ~(a ^ ToSample( b )) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorBurn( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, fb ), 1.0 ) ); + } + + static void ColorBurn( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, double( b ) ), 1.0 ) ); + } + + static void ColorBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - pcl::Min( (1 - fa)/pcl::Max( EPSILON_D, b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear burn standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void LinearBurn( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( fa + fb - 1 ); + } + + static void LinearBurn( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + double( b ) - 1 ); + } + + static void LinearBurn( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( fa + b - 1 ); + } + + /*! + * Assigns to a pixel sample variable \a a the screen standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Screen( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( 1 - (1 - fa)*(1 - fb) ); + } + + static void Screen( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - double( b )) ); + } + + static void Screen( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( 1 - (1 - fa)*(1 - b) ); + } + + /*! + * Assigns to a pixel sample variable \a a the color dodge standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void ColorDodge( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - fb ), 1.0 ) ); + } + + static void ColorDodge( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - double( b ) ), 1.0 ) ); + } + + static void ColorDodge( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Min( fa/pcl::Max( EPSILON_D, 1 - b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the overlay standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Overlay( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - fb)) : 2*a*fb ); + } + + static void Overlay( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - double( b ))) : 2*a*double( b ) ); + } + + static void Overlay( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (fa > 0.5) ? 1 - ((1 - 2*(fa - 0.5)) * (1 - b)) : 2*a*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the soft light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void SoftLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - fb - 0.5) : a*(fb + 0.5) ); + } + + static void SoftLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - fb - 0.5) : a*(fb + 0.5) ); + } + + static void SoftLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - b - 0.5) : a*(b + 0.5) ); + } + + /*! + * Assigns to a pixel sample variable \a a the hard light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void HardLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5)) : 2*fa*fb ); + } + + static void HardLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - (1 - fa)*(1 - 2*(fb - 0.5)) : 2*fa*fb ); + } + + static void HardLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - (1 - fa)*(1 - 2*(b - 0.5)) : 2*fa*b ); + } + + /*! + * Assigns to a pixel sample variable \a a the vivid light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void VividLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*fb ), 1.0 ) ); + } + + static void VividLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? 1 - pcl::Max( (1 - fa)/(fb - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*fb ), 1.0 ) ); + } + + static void VividLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? 1 - pcl::Max( (1 - fa)/(b - 0.5)/2, 1.0 ) : pcl::Min( fa/pcl::Max( EPSILON_D, 1 - 2*b ), 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the linear light + * standard composition operation of its current value and a T value \a b, + * with implicit data type conversion. + */ + template + static void LinearLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa + 2*(fb - 0.5), 1.0 ) : pcl::Max( fa + 2*fb - 1, 1.0 ) ); + } + + static void LinearLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa + 2*(fb - 0.5), 1.0 ) : pcl::Max( fa + 2*fb - 1, 1.0 ) ); + } + + static void LinearLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa + 2*(b - 0.5), 1.0 ) : pcl::Max( fa + 2*b - 1, 1.0 ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the pin light standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void PinLight( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa, 2*(fb - 0.5) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + double fb = double( b ); + a = ToSample( (fb > 0.5) ? pcl::Max( fa, 2*(fb - 0.5) ) : pcl::Min( fa, 2*fb ) ); + } + + static void PinLight( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( (b > 0.5) ? pcl::Max( fa, 2*(b - 0.5) ) : pcl::Min( fa, 2*b ) ); + } + + /*! + * Assigns to a pixel sample variable \a a the exclusion standard + * composition operation of its current value and a T value \a b, with + * implicit data type conversion. + */ + template + static void Exclusion( sample& a, T b ) noexcept + { + double fa; FromSample( fa, a ); + double fb; FromSample( fb, ToSample( b ) ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(fb - 0.5), 0.0, 1.0 ) ); + } + + static void Exclusion( sample& a, float b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(double( b ) - 0.5), 0.0, 1.0 ) ); + } + + static void Exclusion( sample& a, double b ) noexcept + { + double fa; FromSample( fa, a ); + a = ToSample( pcl::Range( 0.5 - 2*(fa - 0.5)*(b - 0.5), 0.0, 1.0 ) ); + } + + // ------------------------------------------------------------------------- + + IMPLEMENT_TRANSFER_OPERATIONS +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class UInt20PixelTraits + * \brief 20-bit unsigned integer pixel traits. + * + * %UInt20PixelTraits is a template instantiation of GenericPixelTraits for + * unsigned 20-bit integers (stored as \c uint32 values). + * + * This class does not represent an instantiable pixel sample type. It is used + * mainly for generation and management of 20-bit lookup tables (LUTs). + * + * \sa GenericPixelTraits + */ +class PCL_CLASS UInt20PixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %UInt20PixelTraits, this is equivalent + * to \c uint32. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %UInt20PixelTraits, this member function returns "UInt20". + */ + static constexpr const char* SampleFormat() noexcept + { + return "UInt20"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %UInt20PixelTraits, this member function returns 1048576. + */ + static constexpr sample MaxSampleValue() noexcept + { + return uint20_max; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %UInt20PixelTraits, this member function returns 0. + */ + static constexpr sample LowestSampleValue() noexcept + { + return sample( 0 ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %UInt20PixelTraits, this member function returns 1048576. + */ + static constexpr sample HighestSampleValue() noexcept + { + return uint20_max; + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { +#ifdef __PCL_ENFORCE_PIXTRAITS_FLOAT_RANGE + return sample( pcl::Range( Round( x ), T( 0 ), T( uint20_max ) ) ); +#else + // ### N.B.: x must be in the range [0,uint20_max]. + return sample( RoundInt( x ) ); +#endif + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( x * uint8_to_uint20 ) ); +#else + return p20LUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( (int32( x ) - int32( int8_min ))*uint8_to_uint20 ) ); +#else + return p20LUT8[int( x ) - int( int8_min )]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( x * uint16_to_uint20 ) ); +#else + return p20LUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( (int32( x ) - int32( int16_min ))*uint16_to_uint20 ) ); +#else + return p20LUT16[int( x ) - int( int16_min )]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( RoundInt( x * uint32_to_uint20 ) ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( RoundInt( (double( x ) - int32_min)*uint32_to_uint20 ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return FloatToSample( x*uint20_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( float x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0F, 1.0F )*uint20_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return FloatToSample( x*uint20_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( double x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0, 1.0 )*uint20_max ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static constexpr sample ToSample( const Complex& x ) noexcept + { + return ToSample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint8( RoundInt( b * uint20_to_uint8 ) ); +#else + a = p8LUT20[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int8( RoundInt( b * uint20_to_uint8 ) + int8_min ); +#else + a = int8( int( p8LUT20[b] ) + int( int8_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint16( RoundInt( b * uint20_to_uint16 ) ); +#else + a = p16LUT20[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int16( RoundInt( b * uint20_to_uint16 ) + int16_min ); +#else + a = int16( int( p16LUT20[b] ) + int( int16_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = uint32( RoundInt( b * uint20_to_uint32 ) ); +#else + a = p32LUT20[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = int32( RoundInt( b * uint20_to_uint32 ) + int32_min ); +#else + a = int32( int64( p32LUT20[b] ) + int64( int32_min ) ); +#endif + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = float( b )/uint20_max; +#else + a = pFLUT20[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + a = double( b )/uint20_max; +#else + a = pDLUT20[b]; +#endif + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + typename Complex::component c; + FromSample( c, b ); + a = c; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class UInt24PixelTraits + * \brief 24-bit unsigned integer pixel traits. + * + * %UInt24PixelTraits is a template instantiation of GenericPixelTraits for + * unsigned 24-bit integers (stored as \c uint32 values). + * + * This class does not represent an instantiable pixel sample type. It is used + * mainly for generation and management of 24-bit lookup tables (LUTs). + * + * \sa GenericPixelTraits + */ +class PCL_CLASS UInt24PixelTraits : public GenericPixelTraits +{ +public: + + /*! + * Represents this template instantiation. + */ + typedef GenericPixelTraits traits_type; + + /*! + * Represents a pixel sample value. + */ + typedef traits_type::sample sample; + + /*! + * Represents a component of a complex pixel sample, or a pixel sample value + * for real pixel sample types. For %UInt24PixelTraits, this is equivalent + * to \c uint32. + */ + typedef sample component; + + /*! + * Returns true iff this pixel traits class corresponds to a floating point + * real pixel sample type. + */ + static constexpr bool IsFloatSample() noexcept + { + return false; + } + + /*! + * Returns true if this pixel traits class corresponds to a complex pixel + * sample type; false if it represents a real pixel sample type. + */ + static constexpr bool IsComplexSample() noexcept + { + return false; + } + + /*! + * Returns the address of a static null-terminated string identifying the + * sample data type represented by this pixel traits class. + * + * For %UInt24PixelTraits, this member function returns "UInt24". + */ + static constexpr const char* SampleFormat() noexcept + { + return "UInt24"; + } + + /*! + * Returns the maximum valid pixel sample value. + * + * For %UInt24PixelTraits, this member function returns 16777216. + */ + static constexpr sample MaxSampleValue() noexcept + { + return uint24_max; + } + + /*! + * Returns the lowest finite value representable by this pixel sample type. + * + * For %UInt24PixelTraits, this member function returns 0. + */ + static constexpr sample LowestSampleValue() noexcept + { + return sample( 0 ); + } + + /*! + * Returns the highest finite value representable by this pixel sample type. + * + * For %UInt24PixelTraits, this member function returns 16777216. + */ + static constexpr sample HighestSampleValue() noexcept + { + return uint24_max; + } + + /*! + * Conversion of any floating point value to a pixel sample value. + */ + template + static sample FloatToSample( T x ) noexcept + { +#ifdef __PCL_ENFORCE_PIXTRAITS_FLOAT_RANGE + return sample( pcl::Range( Round( x ), T( 0 ), T( uint24_max ) ) ); +#else + // ### N.B.: x must be in the range [0,uint24_max]. + return sample( RoundInt( x ) ); +#endif + } + + /*! + * Conversion of an 8-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( x * uint8_to_uint24 ); +#else + return p24LUT8[x]; +#endif + } + + /*! + * Conversion of an 8-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int8 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( (int32( x ) - int32( int8_min ))*uint8_to_uint24 ) ); +#else + return p24LUT8[int( x ) - int( int8_min )]; +#endif + } + + /*! + * Conversion of a 16-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( x * uint16_to_uint24 ) ); +#else + return p24LUT16[x]; +#endif + } + + /*! + * Conversion of a 16-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int16 x ) noexcept + { +#ifdef __PCL_DONT_USE_PIXTRAITS_LUT + return sample( RoundInt( (int32( x ) - int32( int16_min ))*uint16_to_uint24 ) ); +#else + return p24LUT16[int( x ) - int( int16_min )]; +#endif + } + + /*! + * Conversion of a 32-bit unsigned integer value to a pixel sample value. + */ + static sample ToSample( uint32 x ) noexcept + { + return sample( RoundInt( x * uint32_to_uint24 ) ); + } + + /*! + * Conversion of a 32-bit signed integer value to a pixel sample value. + */ + static sample ToSample( int32 x ) noexcept + { + return sample( RoundInt( (double( x ) - int32_min)*uint32_to_uint24 ) ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. + */ + static sample ToSample( float x ) noexcept + { + return FloatToSample( double( x )*uint24_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( float x ) noexcept + { + return FloatToSample( pcl::Range( double( x ), 0.0, 1.0 )*uint24_max ); + } + + /*! + * Conversion of a 64-bit floating point value to a pixel sample value. + */ + static sample ToSample( double x ) noexcept + { + return FloatToSample( x*uint24_max ); + } + + /*! + * Conversion of a 32-bit floating point value to a pixel sample value. This + * function guarantees that the result will never overflow as a result of an + * out-of-range argument value. + */ + static sample ToSampleConstrained( double x ) noexcept + { + return FloatToSample( pcl::Range( x, 0.0, 1.0 )*uint24_max ); + } + + /*! + * Conversion of any complex value to a pixel sample value. + */ + template + static sample ToSample( const Complex& x ) noexcept + { + return ToSample( pcl::Abs( x ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit unsigned integer. + */ + static void FromSample( uint8& a, sample b ) noexcept + { + a = uint8( RoundInt( b * uint24_to_uint8 ) ); + } + + /*! + * Conversion of a pixel sample value to an 8-bit signed integer. + */ + static void FromSample( int8& a, sample b ) noexcept + { + a = int8( RoundInt( b * uint24_to_uint8 ) + int8_min ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit unsigned integer. + */ + static void FromSample( uint16& a, sample b ) noexcept + { + a = uint16( RoundInt( b * uint24_to_uint16 ) ); + } + + /*! + * Conversion of a pixel sample value to a 16-bit signed integer. + */ + static void FromSample( int16& a, sample b ) noexcept + { + a = int16( RoundInt( b * uint24_to_uint16 ) + int16_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit unsigned integer. + */ + static void FromSample( uint32& a, sample b ) noexcept + { + a = uint32( RoundInt( b * uint24_to_uint32 ) ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit signed integer. + */ + static void FromSample( int32& a, sample b ) noexcept + { + a = int32( RoundInt( b * uint24_to_uint32 ) + int32_min ); + } + + /*! + * Conversion of a pixel sample value to a 32-bit floating point real. + */ + static void FromSample( float& a, sample b ) noexcept + { + a = float( b )/uint24_max; + } + + /*! + * Conversion of a pixel sample value to a 64-bit floating point real. + */ + static void FromSample( double& a, sample b ) noexcept + { + a = double( b )/uint24_max; + } + + /*! + * Conversion of a pixel sample value to any complex type. + */ + template + static void FromSample( Complex& a, sample b ) noexcept + { + typename Complex::component c; + FromSample( c, b ); + a = c; + } +}; + +// ---------------------------------------------------------------------------- + +#undef IMPLEMENT_TRANSFER_OPERATIONS + +#undef EPSILON_D +#undef EPSILON_F + +#ifndef __PCL_DONT_USE_PIXTRAITS_LUT +#undef pFLUT8 +#undef pFLUTA +#undef p1FLUT8 +#undef pFLUT16 +#undef pFLUT20 +#undef pDLUT8 +#undef pDLUTA +#undef p1DLUT8 +#undef pDLUT16 +#undef pDLUT20 +#undef p8LUT16 +#undef p8LUT20 +#undef p16LUT8 +#undef p16LUT20 +#undef p20LUT8 +#undef p20LUT16 +#undef p24LUT8 +#undef p24LUT16 +#undef p32LUT8 +#undef p32LUT16 +#undef p32LUT20 +#endif + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PixelTraits_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PixelTraits.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PlateCarreeProjection.h b/3rdparty/include/pcl/PlateCarreeProjection.h new file mode 100644 index 0000000..23a7dbb --- /dev/null +++ b/3rdparty/include/pcl/PlateCarreeProjection.h @@ -0,0 +1,136 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PlateCarreeProjection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PlateCarreeProjection_h +#define __PCL_PlateCarreeProjection_h + +/// \file pcl/PlateCarreeProjection.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PlateCarreeProjection + * \brief Plate-Carree projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS PlateCarreeProjection: public ProjectionBase +{ +public: + + /*! + * Default constructor. + */ + PlateCarreeProjection() = default; + + /*! + * Copy constructor. + */ + PlateCarreeProjection( const PlateCarreeProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new PlateCarreeProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "CAR"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Plate-Carree"; + } + +protected: + + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override + { + pW = pN; + return true; + } + + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override + { + pN = pW; + return true; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PlateCarreeProjection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PlateCarreeProjection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Point.h b/3rdparty/include/pcl/Point.h new file mode 100644 index 0000000..6d3de24 --- /dev/null +++ b/3rdparty/include/pcl/Point.h @@ -0,0 +1,1484 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Point.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Point_h +#define __PCL_Point_h + +/// \file pcl/Point.h + +#include + +#include +#include + +#ifdef __PCL_QT_INTERFACE +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * ### NB: Template class GenericPoint cannot have virtual member functions. + * This is because internal PCL and core routines rely on + * GenericPoint, GenericPoint and GenericPoint to + * be directly castable to int*, float* and double*, respectively. See + * also the PCL_ASSERT_POINT_SIZE() macro. + */ + +#define PCL_ASSERT_POINT_SIZE() \ + static_assert( sizeof( *this ) == 2*sizeof( T ), "Invalid sizeof( GenericPoint<> )" ) + +/*! + * \class GenericPoint + * \brief A generic point in the two-dimensional space. + * + * %GenericPoint implements a point in the plane, specified by its \a x and + * \a y coordinates. The type T represents scalar point coordinates and can be + * any real or integer numerical type. + * + * The coordinates of %GenericPoint are accessed directly by its x and y data + * members. Given a %GenericPoint instance \a p, you can use \a p.x and \a p.y + * directly to get or set coordinate values. + * + * \sa \ref point_types_2d "2-D Point Types", + * \ref point_functions_2d "2-D Point Operators and Functions", + * GenericRectangle + */ +template +class PCL_CLASS GenericPoint +{ +public: + + /*! + * Represents the type of a point component. + */ + typedef T component; + + /* + * Point coordinates + */ + component x; //!< Abscissa (horizontal, or X-axis coordinate). + component y; //!< Ordinate (vertical, or Y-axis coordinate). + + /*! + * Constructs a default %GenericPoint instance. Point coordinates are not + * initialized, so they'll have unpredictable garbage values. + */ + constexpr GenericPoint() + { + PCL_ASSERT_POINT_SIZE(); + } + + /*! + * Constructs a %GenericPoint instance given its coordinates \a xPos and + * \a yPos in the plane. + * + * The type T1 can be any suitable real or integer numerical type, or a type + * with numeric conversion semantics. + */ + template + constexpr GenericPoint( T1 xPos, T1 yPos ) + : x( component( xPos ) ) + , y( component( yPos ) ) + { + PCL_ASSERT_POINT_SIZE(); + } + + /*! + * Constructs a %GenericPoint instance with both point coordinates equal to + * the specified scalar \a d. + */ + constexpr GenericPoint( component d ) + : GenericPoint( d, d ) + { + PCL_ASSERT_POINT_SIZE(); + } + + /*! + * Constructs a %GenericPoint instance from coordinates taken from the + * specified initializer list \a l. + * + * This constructor will copy 2, 1 or zero point coordinates, depending on + * the number of values in the initializer list. Coordinates that cannot be + * initialized from list values will be set to zero. For example, the + * following code: + * + * \code + * Point p1 = {}; + * Point p2 = { 1 }; + * Point p3 = { 1, 2 }; + * \endcode + * + * is functionally equivalent to: + * + * \code + * Point p1( 0, 0 ); + * Point p2( 1, 0 ); + * Point p3( 1, 2 ); + * \endcode + */ + template + GenericPoint( std::initializer_list l ) + { + PCL_ASSERT_POINT_SIZE(); + switch ( l.size() ) + { + default: + case 2: y = component( l.begin()[1] ); + case 1: x = component( l.begin()[0] ); + case 0: break; + } + switch ( l.size() ) + { + case 0: x = component( 0 ); + case 1: y = component( 0 ); + default: + case 2: break; + } + } + + /*! + * Nontrivial copy constructor. Constructs a %GenericPoint instance as a + * copy (possibly involving a conversion between different numerical types) + * of another point \a p with different template argument. + */ + template + GenericPoint( const GenericPoint& p ) + : GenericPoint( component( p.x ), component( p.y ) ) + { + PCL_ASSERT_POINT_SIZE(); + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint( const QPoint& p ) + : GenericPoint( component( p.x() ), component( p.y() ) ) + { + PCL_ASSERT_POINT_SIZE(); + } +#endif + + /*! + * Returns the square of the Euclidian distance between this point and + * another point \a p in the plane. + * + * The Euclidian distance between two points p and q is the length of the + * straight line between both points: Sqrt( (p.x - q.x)^2 + (p.y - q.y)^2 ). + * + * This function returns just the radicand (p.x - q.x)^2 + (p.y - q.y)^2. + * This is useful because saves calculation of a square root, which is + * unnecessary in some practical cases. One of them is ordering of + * distances: Sqrt(A) < Sqrt(B) implies A < B. + * + * \sa DistanceTo(), ManhattanDistanceTo() + */ + template + double SquaredDistanceTo( const GenericPoint& p ) const noexcept + { + double dx = double( p.x ) - double( x ); + double dy = double( p.y ) - double( y ); + return dx*dx + dy*dy; + } + + /*! + * Returns the Euclidian distance between this point and another point \a p + * in the plane. + * + * The Euclidian distance between two points p and q is the length of the + * straight line between both points: Sqrt( (p.x - q.x)^2 + (p.y - q.y)^2 ). + * + * \sa SquaredDistanceTo(), ManhattanDistanceTo() + */ + template + double DistanceTo( const GenericPoint& p ) const noexcept + { + return pcl::Sqrt( SquaredDistanceTo( p ) ); + } + + /*! + * Returns the square of the Euclidian distance between this point and the + * origin of coordinates in the plane. In other words, this function returns + * the squared length of the two-dimensional vector represented by this + * point object. + * + * This function is equivalent to: + * + * \code SquaredDistanceTo( GenericPoint( 0 ) ) \endcode + * + * but potentially faster, depending mainly on compiler optimizations. + * + * \sa DistanceToOrigin() + */ + double SquaredDistanceToOrigin() const noexcept + { + return double( x )*double( x ) + double( y )*double( y ); + } + + /*! + * Returns the Euclidian distance between this point and the origin of + * coordinates in the plane. In other words, this function returns the + * length of the two-dimensional vector represented by this point object. + * + * This function is equivalent to: + * + * \code DistanceTo( GenericPoint( 0 ) ) \endcode + * + * but potentially faster, depending mainly on compiler optimizations. + * + * \sa SquaredDistanceToOrigin(), ManhattanDistanceToOrigin() + */ + double DistanceToOrigin() const noexcept + { + return pcl::Sqrt( SquaredDistanceToOrigin() ); + } + + /*! + * Returns the Manhattan distance between this point and another point \a p + * in the plane. + * + * The Manhattan distance between two points p and q is the sum of distances + * measured along axes at right angles: |p.x - q.x| + |p.y - q.y|. + * + * \sa DistanceTo(), ManhattanDistanceToOrigin() + */ + template + double ManhattanDistanceTo( const GenericPoint& p ) const noexcept + { + return Abs( double( p.x ) - double( x ) ) + Abs( double( p.y ) - double( y ) ); + } + + /*! + * Returns the Manhattan distance between this point and the origin of + * coordinates in the plane. In other words, this function returns the sum + * of the absolute values of this point's x and y coordinates. + * + * This function is equivalent to: + * + * \code ManhattanDistanceTo( GenericPoint( 0 ) ) \endcode + * + * but potentially faster, depending mainly on compiler optimizations. + * + * \sa ManhattanDistanceTo(), DistanceToOrigin() + */ + double ManhattanDistanceToOrigin() const noexcept + { + return Abs( double( x ) ) + Abs( double( y ) ); + } + + /*! + * Moves this point to the location of another point \a p. + * + * \sa MoveBy() + */ + template + void MoveTo( const GenericPoint& p ) noexcept + { + MoveTo( p.x, p.y ); + } + + /*! + * Moves this point to the specified absolute coordinates \a xPos and + * \a yPos in the plane. + * + * \sa MoveBy() + */ + template + void MoveTo( T1 xPos, T1 yPos ) noexcept + { + x = component( xPos ); y = component( yPos ); + } + +#ifdef __PCL_QT_INTERFACE + void MoveTo( const QPoint& p ) noexcept + { + MoveTo( p.x(), p.y() ); + } +#endif + + /*! + * Returns a point whose coordinates are equal to the coordinates of the + * specified point \a d. + */ + template + GenericPoint MovedTo( const GenericPoint& p ) const noexcept + { + return GenericPoint( component( p.x ), component( p.y ) ); + } + + /*! + * Returns a point at the specified \a xPos and \a yPos coordinates. + */ + template + GenericPoint MovedTo( T1 xPos, T1 yPos ) const noexcept + { + return GenericPoint( component( xPos ), component( yPos ) ); + } + + /*! + * Moves this point by equal increments in the X and Y directions, relative + * to its current position. + * + * \param d Increments in the X and Y directions, given by \a d.x and + * \a d.y, respectively. + * + * \sa MoveTo() + */ + template + void MoveBy( const GenericPoint& d ) noexcept + { + MoveBy( d.x, d.y ); + } + + /*! + * Moves this point by increments \a dx and \a dy in the X and Y directions, + * respectively, relative to its current position. + * + * For example, given the declaration: + * + * \code GenericPoint p; \endcode + * + * These two expressions are equivalent: + * + * \code + * p.MoveBy( -3, 7 ); + * p.MoveTo( p.x-3, p.y+7 ); + * \endcode + * + * \sa MoveTo() + */ + template + void MoveBy( T1 dx, T1 dy ) noexcept + { + x += component( dx ); y += component( dy ); + } + + /*! + * Moves this point by the same increment \a dxy in the X and Y directions, + * relative to its current position. + * + * This function is functionally equivalent to: + * + * \code MoveBy( dxy, dxy ); \endcode + * + * \sa MoveTo() + */ + template + void MoveBy( T1 dxy ) noexcept + { + x += component( dxy ); y += component( dxy ); + } + +#ifdef __PCL_QT_INTERFACE + void MoveBy( const QPoint& p ) + { + MoveBy( p.x(), p.y() ); + } +#endif + + /*! + * Returns a point whose coordinates are the coordinates of this point + * displaced by the increments specified as the point \a d. + */ + template + GenericPoint MovedBy( const GenericPoint& d ) const noexcept + { + return GenericPoint( x + component( d.x ), y + component( d.y ) ); + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * displaced by the specified increments \a dx and \a dy. + */ + template + GenericPoint MovedBy( T1 dx, T1 dy ) const noexcept + { + return GenericPoint( x + component( dx ), y + component( dy ) ); + } + + /*! + * Rotates this point in the plane by the specified \a angle in radians, + * with respect to a center of rotation given by its coordinates \a xc and + * \a yc. + */ + template + void Rotate( T1 angle, T2 xc, T2 yc ) noexcept + { + pcl::Rotate( x, y, angle, xc, yc ); + } + + /*! + * Rotates this point in the plane by the specified \a angle in radians, + * with respect to the specified \a center of rotation. + */ + template + void Rotate( T1 angle, const GenericPoint& center ) noexcept + { + Rotate( angle, center.x, center.y ); + } + + /*! + * Rotates this point in the plane by the specified angle, given by its sine + * and cosine, \a sa and \a ca respectively, with respect to a center of + * rotation given by its coordinates \a xc and \a yc. + */ + template + void Rotate( T1 sa, T1 ca, T2 xc, T2 yc ) noexcept + { + pcl::Rotate( x, y, sa, ca, xc, yc ); + } + + /*! + * Rotates this point in the plane by the specified angle, given by its sine + * and cosine, \a sa and \a ca respectively, with respect to the specified + * \a center of rotation. + */ + template + void Rotate( T1 sa, T1 ca, const GenericPoint& center ) noexcept + { + Rotate( sa, ca, center.x, center.y ); + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rotated in the plane by the specified \a angle in radians, with respect + * to a center of rotation given by its coordinates \a xc and \a yc. + */ + template + GenericPoint Rotated( T1 angle, T2 xc, T2 yc ) const noexcept + { + GenericPoint p( *this ); + p.Rotate( angle, xc, yc ); + return p; + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rotated in the plane by the specified \a angle in radians, with respect + * to the specified \a center of rotation. + */ + template + GenericPoint Rotated( T1 angle, const GenericPoint& center ) const noexcept + { + GenericPoint p( *this ); + p.Rotate( angle, center ); + return p; + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rotated in the plane by the specified angle given by its sine and cosine, + * \a sa and \a ca respectively, with respect to a center of rotation given + * by its coordinates \a xc and \a yc. + */ + template + GenericPoint Rotated( T1 sa, T1 ca, T2 xc, T2 yc ) const noexcept + { + GenericPoint p( *this ); + p.Rotate( sa, ca, xc, yc ); + return p; + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rotated in the plane by the specified angle given by its sine and cosine, + * \a sa and \a ca respectively, with respect to the specified \a center of + * rotation. + */ + template + GenericPoint Rotated( T1 sa, T1 ca, const GenericPoint& center ) const noexcept + { + GenericPoint p( *this ); + p.Rotate( sa, ca, center ); + return p; + } + + /*! + * Rounds the coordinates of this point to their corresponding nearest + * integer coordinates. + * + * \sa Round( int ), Rounded(), Truncate(), RoundedToInt(), TruncatedToInt() + */ + void Round() noexcept + { + x = component( pcl::Round( double( x ) ) ); + y = component( pcl::Round( double( y ) ) ); + } + + /*! + * Rounds the coordinates of this point to \a n fractional digits (\a n >= 0). + * + * \sa Round(), Rounded( int ), Truncate(), RoundedToInt(), TruncatedToInt() + */ + void Round( int n ) noexcept + { + PCL_PRECONDITION( n >= 0 ) + x = component( pcl::Round( double( x ), n ) ); + y = component( pcl::Round( double( y ), n ) ); + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rounded to their nearest integers. + * + * \sa Round(), Rounded( int ), Truncated(), RoundedToInt(), TruncatedToInt() + */ + GenericPoint Rounded() const noexcept + { + return GenericPoint( component( pcl::Round( double( x ) ) ), component( pcl::Round( double( y ) ) ) ); + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * rounded to \a n fractional digits (\a n >= 0). + * + * \sa Round( int ), Rounded(), Truncated(), RoundedToInt(), TruncatedToInt() + */ + GenericPoint Rounded( int n ) const noexcept + { + PCL_PRECONDITION( n >= 0 ) + return GenericPoint( component( pcl::Round( double( x ), n ) ), component( pcl::Round( double( y ), n ) ) ); + } + + /*! + * Returns a point of integer template type whose coordinates are the + * coordinates of this point rounded to their nearest integers. + * + * \sa Round(), Rounded(), Truncated(), TruncatedToInt() + */ + GenericPoint RoundedToInt() const noexcept + { + return GenericPoint( pcl::RoundInt( double( x ) ), pcl::RoundInt( double( y ) ) ); + } + + /*! + * Integer truncation of coordinates. Sets the coordinates x, y of this + * point to the corresponding nearest integer coordinates i, j, such that + * i <= x and j <= y. + * + * \sa Truncated(), Round(), RoundedToInt(), TruncatedToInt() + */ + void Truncate() noexcept + { + x = component( pcl::Trunc( double( x ) ) ); + y = component( pcl::Trunc( double( y ) ) ); + } + + /*! + * Integer truncation of coordinates. Returns a point whose coordinates are + * the coordinates x, y of this point truncated to their corresponding + * nearest integer coordinates i, j, such that i <= x and j <= y. + * + * \sa Truncate(), Rounded(), RoundedToInt(), TruncatedToInt() + */ + GenericPoint Truncated() const noexcept + { + return GenericPoint( component( pcl::Trunc( double( x ) ) ), component( pcl::Trunc( double( y ) ) ) ); + } + + /*! + * Integer truncation of coordinates. Returns a point of integer template + * type whose coordinates are the coordinates x, y of this point truncated + * to the nearest integer coordinates i, j, such that i <= x and j <= y. + * + * \sa Truncate(), Truncated(), Rounded(), RoundedToInt() + */ + GenericPoint TruncatedToInt() const noexcept + { + return GenericPoint( pcl::TruncInt( double( x ) ), pcl::TruncInt( double( y ) ) ); + } + + /*! + * Assignment operator. Moves this point to the location specified as a + * point \a p. Returns a reference to this point. + * + * \sa MoveTo() + */ + template + GenericPoint& operator =( const GenericPoint& p ) noexcept + { + x = component( p.x ); + y = component( p.y ); + return *this; + } + + /*! + * Assignment operator. Given a coordinate \a v, moves this point to a + * location x = y = \a v. Returns a reference to this point. + * + * \sa MoveTo() + */ + GenericPoint& operator =( component v ) noexcept + { + x = y = v; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint& operator =( const QPoint& p ) noexcept + { + x = component( p.x() ); + y = component( p.y() ); + return *this; + } +#endif + + /*! + * Adds each coordinate of a given point \a p to its homonym coordinate in + * this point. Returns a reference to this point. + * + * \sa MoveBy(), operator -=() + */ + template + GenericPoint& operator +=( const GenericPoint& p ) noexcept + { + x += component( p.x ); + y += component( p.y ); + return *this; + } + + /*! + * Adds a scalar \a d to both coordinates of this point. Returns a reference + * to this point. + * + * \sa MoveBy(), operator -=() + */ + GenericPoint& operator +=( component d ) noexcept + { + x += d; + y += d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint& operator +=( const QPoint& p ) noexcept + { + x += component( p.x() ); + y += component( p.y() ); + return *this; + } +#endif + + /*! + * Subtracts each coordinate of a given point \a p from its homonym + * coordinate in this point. Returns a reference to this point. + * + * \sa MoveBy(), operator +=() + */ + template + GenericPoint& operator -=( const GenericPoint& p ) noexcept + { + x -= component( p.x ); + y -= component( p.y ); + return *this; + } + + /*! + * Subtracts a scalar \a d from both coordinates of this point. Returns a + * reference to this point. + * + * \sa MoveBy(), operator +=() + */ + GenericPoint& operator -=( component d ) noexcept + { + x -= d; + y -= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint& operator -=( const QPoint& p ) noexcept + { + x -= component( p.x() ); + y -= component( p.y() ); + return *this; + } +#endif + + /*! + * Multiplies each coordinate of this point by its homonym coordinate of a + * given point \a p. Returns a reference to this point. + * + * \sa operator /=(), operator +=() + */ + template + GenericPoint& operator *=( const GenericPoint& p ) noexcept + { + x *= component( p.x ); + y *= component( p.y ); + return *this; + } + + /*! + * Multiplies both coordinates of this point by a scalar \a d. Returns a + * reference to this point. + * + * \sa operator /=(), operator +=() + */ + GenericPoint& operator *=( component d ) noexcept + { + x *= d; + y *= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint& operator *=( const QPoint& p ) noexcept + { + x *= component( p.x() ); + y *= component( p.y() ); + return *this; + } +#endif + + /*! + * Divides each coordinate of this point by its homonym coordinate of a + * given point \a p. Returns a reference to this point. + * + * \sa operator *=(), operator -=() + */ + template + GenericPoint& operator /=( const GenericPoint& p ) noexcept + { + PCL_PRECONDITION( component( p.x ) != component( 0 ) && component( p.y ) != component( 0 ) ) + x /= component( p.x ); + y /= component( p.y ); + return *this; + } + + /*! + * Divides both coordinates of this point by a scalar \a d. Returns a + * reference to this point. + * + * \sa operator *=(), operator -=() + */ + GenericPoint& operator /=( component d ) noexcept + { + PCL_PRECONDITION( d != component( 0 ) ) + x /= d; + y /= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericPoint& operator /=( const QPoint& p ) noexcept + { + PCL_PRECONDITION( component( p.x() ) != component( 0 ) && component( p.y() ) != component( 0 ) ) + x /= component( p.x() ); + y /= component( p.y() ); + return *this; + } +#endif + + /*! + * Returns a copy of this point. + */ + GenericPoint operator +() const noexcept + { + return *this; + } + + /*! + * Returns a point whose coordinates have the same magnitudes as the + * coordinates of this point, but opposite signs. The returned point so + * defined represents a vector diametrically opposed to this one. + */ + GenericPoint operator -() const noexcept + { + return GenericPoint( -x, -y ); + } + + /*! + * Reflects this point in the origin. This transformation changes the signs + * of both point coordinates. + */ + void Reflect() noexcept + { + x = -x; + y = -y; + } + + /*! + * Reflects this point across the X axis. This transformation changes the + * sign of this point's y-coordinate. + */ + void ReflectX() noexcept + { + y = -y; + } + + /*! + * Reflects this point across the Y axis. This transformation changes the + * sign of this point's x-coordinate. + */ + void ReflectY() noexcept + { + x = -x; + } + + /*! + * Returns the reflexion of this point in the origin. The returned point has + * the coordinates of this point with inverse signs. + */ + GenericPoint Reflected() const noexcept + { + return GenericPoint( -x, -y ); + } + + /*! + * Returns the reflexion of this point across the X axis. The returned point + * has the same x-coordinate as this point and the y-coordinate of this + * point with inverse sign. + */ + GenericPoint ReflectedX() const noexcept + { + return GenericPoint( x, -y ); + } + + /*! + * Returns the reflexion of this point across the Y axis. The returned point + * has the x-coordinate of this point with inverse sign and the same + * y-coordinate as this point. + */ + GenericPoint ReflectedY() const noexcept + { + return GenericPoint( -x, y ); + } + + /* + * Returns a point whose coordinates are the coordinates of this point + * converted to radians, assuming that this point has coordinates expressed + * in degrees. + */ + GenericPoint Rad() const noexcept + { + return GenericPoint( pcl::Rad( x ), pcl::Rad( y ) ); + } + + /*! + * Returns a point whose coordinates are the coordinates of this point + * converted to degrees, assuming that this point has coordinates expressed + * in radians. + */ + GenericPoint Deg() const noexcept + { + return GenericPoint( pcl::Deg( x ), pcl::Deg( y ) ); + } + + /*! + * Converts the coordinates of this point to radians, assuming that they are + * expressed in degrees before calling this function. Returns a reference to + * this object. + */ + GenericPoint& ToRad() noexcept + { + x = pcl::Rad( x ); + y = pcl::Rad( y ); + return *this; + } + + /*! + * Converts the coordinates of this point to degrees, assuming that they are + * expressed in radians before calling this function. Returns a reference to + * this object. + */ + GenericPoint& ToDeg() noexcept + { + x = pcl::Deg( x ); + y = pcl::Deg( y ); + return *this; + } + + /*! + * Returns a reference to a point component. Returns a reference to the X + * point coordinate if the specified index \a i is zero, or a reference to + * the Y coordinate otherwise. + */ + component& operator []( int i ) noexcept + { + return (i == 0) ? x : y; + } + + /*! + * Returns a copy of a point component. Returns the X point coordinate if + * the specified index \a i is zero, or the Y coordinate otherwise. + */ + component operator []( int i ) const noexcept + { + return (i == 0) ? x : y; + } + + /*! + * Returns the dot product of this point and another point given by its + * coordinates \a px and \a py. + */ + template + double Dot( T1 px, T2 py ) const noexcept + { + return double( x )*double( px ) + double( y )*double( py ); + } + + /*! + * Returns the dot product of this point and another point \a p. + */ + template + double Dot( const GenericPoint& p ) const noexcept + { + return Dot( p.x, p.y ); + } + +#ifdef __PCL_QT_INTERFACE + operator QPoint() const noexcept + { + return QPoint( int( x ), int( y ) ); + } +#endif +}; + +#undef PCL_ASSERT_POINT_SIZE + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup point_functions_2d Point Operators and Functions + */ + +/*! + * Returns true iff two points \a p1 and \a p2 are equal. Two points are equal + * if their homonym coordinates are equal. + * \ingroup point_functions_2d + */ +template inline +bool operator ==( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return p1.x == p2.x && p1.y == p2.y; +} + +/*! + * Returns true iff a point \a p1 is equal to a scalar \a d2. A point \p is + * equal to a scalar \a d if both coordinates of \a p are equal to \a d. + * \ingroup point_functions_2d + */ +template inline +bool operator ==( const GenericPoint& p1, T d2 ) noexcept +{ + return p1.x == d2 && p1.y == d2; +} + +/*! + * Returns true iff a scalar \a d1 is equal to a point \a p2. A scalar \a d is + * equal to a point \a p if both coordinates of \a p are equal to \a d. + * \ingroup point_functions_2d + */ +template inline +bool operator ==( T d1, const GenericPoint& p2 ) noexcept +{ + return d1 == p2.x && d1 == p2.y; +} + +/*! + * Returns true iff a point \a p1 is less than another point \a p2. + * + * Points in the plane are sorted by ordinates in PCL. Given two points \a p + * and \a q in the plane, it holds that: + * + * \a p < \a q if \a p.y < \a q.y or \a p.y == \a q.y and \a p.x < \a q.x + * + * \ingroup point_functions_2d + */ +template inline +bool operator <( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return p1.y < p2.y || p1.y == p2.y && p1.x < p2.x; +} + +/*! + * Returns true iff a point \a p1 is less than a scalar \a d2. + * + * Given a point \a p in the plane and a scalar \a d, it holds that: + * + * \a p < \a d if \a p.y < \a d or \a p.y == \a d and \a p.x < \a d + * + * \ingroup point_functions_2d + */ +template inline +bool operator <( const GenericPoint& p1, T d2 ) noexcept +{ + return p1.y < d2 || p1.y == d2 && p1.x < d2; +} + +/*! + * Returns true iff a scalar \a d1 is less than a point \a p2. + * + * Given a point \a p in the plane and a scalar \a d, it holds that: + * + * \a d < \a p if \a d < \a p.y or \a d == \a p.y and \a d < \a p.x + * + * \ingroup point_functions_2d + */ +template inline +bool operator <( T d1, const GenericPoint& p2 ) noexcept +{ + return d1 < p2.y || d1 == p2.y && d1 < p2.x; +} + +/*! + * Adds two points \a p1 and \a p2, and returns the resulting sum point. + * + * Point addition consists in adding homonym coordinates. Given two points + * \a p and \a q in the plane, the sum point \a s = \a p + \a q is given by: + * + * \a s.x = \a p.x + \a q.x \n + * \a s.y = \a p.y + \a q.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator +( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( T1( p1.x + p2.x ), T1( p1.y + p2.y ) ); +} + +/*! + * Adds a point \a p1 and a scalar \a d2, and returns the resulting sum point. + * + * Given a point \a p in the plane and a scalar \a d, the sum point + * \a s = \a p + \a d is given by: + * + * \a s.x = \a p.x + \a d \n + * \a s.y = \a p.y + \a d + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator +( const GenericPoint& p1, T d2 ) noexcept +{ + return GenericPoint( p1.x+d2, p1.y+d2 ); +} + +/*! + * Adds a scalar \a d1 and a point \a p2, and returns the resulting sum point. + * + * Point addition is a commutative operation, thus see + * pcl::operator +( const GenericPoint&, T ). + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator +( T d1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( p2.x+d1, p2.y+d1 ); +} + +/*! + * Subtracts two points \a p1 and \a p2, and returns the resulting difference + * point. + * + * Point subtraction consists in subtracting homonym coordinates. Given two + * points \a p and \a q in the plane, the difference point \a r = \a p - \a q + * is given by: + * + * \a r.x = \a p.x - \a q.x \n + * \a r.y = \a p.y - \a q.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator -( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( T1( p1.x - p2.x ), T1( p1.y - p2.y ) ); +} + +/*! + * Subtracts a scalar \a d2 from a point \a p1, and returns the resulting + * difference point. + * + * Given a point \a p in the plane and a scalar \a d, the difference point + * \a r = \a p - \a d is given by: + * + * \a r.x = \a p.x - \a d \n + * \a r.y = \a p.y - \a d + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator -( const GenericPoint& p1, T d2 ) noexcept +{ + return GenericPoint( p1.x-d2, p1.y-d2 ); +} + +/*! + * Subtracts a point \a p2 from a scalar \a d1, and returns the resulting + * difference point. + * + * Given a point \a p in the plane and a scalar \a d, the difference point + * \a r = \a d - \a p is given by: + * + * \a r.x = \a d - \a p.x \n + * \a r.y = \a d - \a p.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator -( T d1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( d1-p2.x, d1-p2.y ); +} + +/*! + * Multiplies two points \a p1 and \a p2, and returns the resulting product + * point. + * + * Point multiplication consists in multiplying homonym coordinates. Given two + * points \a p and \a q in the plane, the product point \a P = \a p * \a q is + * given by: + * + * \a P.x = \a p.x * \a q.x \n + * \a P.y = \a p.y * \a q.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator *( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( T1( p1.x * p2.x ), T1( p1.y * p2.y ) ); +} + +/*! + * Multiplies a point \a p1 by a scalar \a d2, and returns the resulting + * product point. + * + * Given a point \a p in the plane and a scalar \a d, the product point + * \a P = \a p * \a d is given by: + * + * \a P.x = \a p.x * \a d \n + * \a P.y = \a p.y * \a d + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator *( const GenericPoint& p1, T d2 ) noexcept +{ + return GenericPoint( p1.x*d2, p1.y*d2 ); +} + +/*! + * Multiplies a scalar \a d1 by a point \a p2, and returns the resulting + * product point. + * + * Point multiplication is a commutative operation, thus see + * pcl::operator *( const GenericPoint&, T ). + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator *( T d1, const GenericPoint& p2 ) noexcept +{ + return GenericPoint( p2.x*d1, p2.y*d1 ); +} + +/*! + * Divides two points \a p1 and \a p2, and returns the resulting quotient point. + * + * Given two points \a p and \a q in the plane, the quotient point + * \a Q = \a p / \a q is given by: + * + * \a Q.x = \a p.x / \a q.x \n + * \a Q.y = \a p.y / \a q.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator /( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + PCL_PRECONDITION( p2.x != T2( 0 ) && p2.y != T2( 0 ) ) + return GenericPoint( T1( p1.x / p2.x ), T1( p1.y / p2.y ) ); +} + +/*! + * Divides a point \a p1 by a scalar \a d2, and returns the resulting + * quotient point. + * + * Given a point \a p in the plane and a scalar \a d, the quotient point + * \a Q = \a p / \a d is given by: + * + * \a Q.x = \a p.x / \a d \n + * \a Q.y = \a p.y / \a d + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator /( const GenericPoint& p1, T d2 ) noexcept +{ + PCL_PRECONDITION( d2 != T( 0 ) ) + return GenericPoint( p1.x/d2, p1.y/d2 ); +} + +/*! + * Divides a scalar \a d1 by a point \a p2, and returns the resulting + * quotient point. + * + * Given a point \a p in the plane and a scalar \a d, the quotient point + * \a Q = \a d / \a q is given by: + * + * \a Q.x = \a d / \a p.x \n + * \a Q.y = \a d / \a p.y + * + * \ingroup point_functions_2d + */ +template inline +GenericPoint operator /( T d1, const GenericPoint& p2 ) noexcept +{ + PCL_PRECONDITION( p2.x != T( 0 ) && p2.y != T( 0 ) ) + return GenericPoint( d1/p2.x, d1/p2.y ); +} + +/*! + * Returns the distance between two points \a p1 and \a p2 in the plane. + * \ingroup point_functions_2d + */ +// ### FIXME: We cannot use two template arguments here due to a conflict with +// Distance( FI, FI ) defined in Iterator.h +//template inline +template inline +double Distance( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + double dx = double( p2.x ) - double( p1.x ); + double dy = double( p2.y ) - double( p1.y ); + return pcl::Sqrt( dx*dx + dy*dy ); +} + +/*! + * Returns the Manhattan distance between two points \a p1 and \a p2 in the + * plane. + * \ingroup point_functions_2d + */ +template inline +double ManhattanDistance( const GenericPoint& p1, const GenericPoint& p2 ) noexcept +{ + return Abs( double( p2.x ) - double( p1.x ) ) + Abs( double( p2.y ) - double( p1.y ) ); +} + +/*! + * Rotates a point in the plane, given a rotation angle and the coordinates of + * a center of rotation. + * + * \param p Reference to a point that will be rotated. + * \param a Rotation angle in radians. Positive angles are measured + * counter-clockwise. + * \param xc Abscissa (x coordinate) of the center of rotation. + * \param yc Ordinate (y coordinate) of the center of rotation. + * + * The coordinates \a p.x and \a p.y are replaced by their corresponding + * rotated values. + * + * \ingroup point_functions_2d + */ +template inline +void Rotate( GenericPoint& p, T1 a, T2 xc, T2 yc ) noexcept +{ + pcl::Rotate( p.x, p.y, a, xc, yc ); +} + +/*! + * Rotates a point in the plane, given a rotation angle and a rotation center + * point. + * + * \param p Reference to a point that will be rotated. + * \param a Rotation angle in radians. Positive angles are measured + * counter-clockwise. + * \param c Reference to a point that will be taken as the center of + * rotation. + * + * The coordinates \a p.x and \a p.y are replaced by their corresponding + * rotated values. + * + * \ingroup point_functions_2d + */ +template inline +void Rotate( GenericPoint& p, T1 a, const GenericPoint& c ) noexcept +{ + pcl::Rotate( p, a, c.x, c.y ); +} + +/*! + * Rotates a point in the plane, given a rotation angle by its sine and + * cosine, and the coordinates of a center of rotation. + * + * \param p Reference to a point that will be rotated. + * \param sa Sine of the rotation angle. + * \param ca Cosine of the rotation angle. + * \param xc Abscissa (x coordinate) of the center of rotation. + * \param yc Ordinate (y coordinate) of the center of rotation. + * + * The coordinates \a p.x and \a p.y are replaced by their corresponding + * rotated values. + * + * \ingroup point_functions_2d + */ +template inline +void Rotate( GenericPoint& p, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + pcl::Rotate( p.x, p.y, sa, ca, xc, yc ); +} + +/*! + * Rotates a point in the plane, given a rotation angle by its sine and + * cosine, and a rotation center point. + * + * \param p Reference to a point that will be rotated. + * \param sa Sine of the rotation angle. + * \param ca Cosine of the rotation angle. + * \param c Reference to a point that will be taken as the center of + * rotation. + * + * The coordinates \a p.x and \a p.y are replaced by their corresponding + * rotated values. + * + * \ingroup point_functions_2d + */ +template inline +void Rotate( GenericPoint& p, T1 sa, T1 ca, const GenericPoint& c ) noexcept +{ + pcl::Rotate( p, sa, ca, c.x, c.y ); +} + +/*! + * Exchanges two points \a p1 and \a p2 in the plane. Calling this function is + * equivalent to: + * + * \code Swap( p1.x, p2.x ); Swap( p1.y, p2.y ); \endcode + * + * \ingroup point_functions_2d + */ +template inline +void Swap( GenericPoint& p1, GenericPoint& p2 ) noexcept +{ + pcl::Swap( p1.x, p2.x ); + pcl::Swap( p1.y, p2.y ); +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_POINT_INSTANTIATE + +/*! + * \defgroup point_types_2d Point Types + */ + +/*! + * \class pcl::I32Point + * \ingroup point_types_2d + * \brief 32-bit integer point on the plane. + * + * %I32Point is a template instantiation of GenericPoint for the \c int32 type. + */ +typedef GenericPoint I32Point; + +/*! + * \class pcl::Point + * \ingroup point_types_2d + * \brief 32-bit integer point on the plane. + * + * %Point is an alias for I32Point. It is a template instantiation of + * GenericPoint for \c int32. + */ +typedef I32Point Point; + +/*! + * \class pcl::F32Point + * \ingroup point_types_2d + * \brief 32-bit floating-point point in the R^2 space. + * + * %F32Point is a template instantiation of GenericPoint for the \c float type. + */ +typedef GenericPoint F32Point; + +/*! + * \class pcl::FPoint + * \ingroup point_types_2d + * \brief 32-bit floating-point point in the R^2 space. + * + * %FPoint is an alias for F32Point. It is a template instantiation of + * GenericPoint for \c float. + */ +typedef F32Point FPoint; + +/*! + * \class pcl::F64Point + * \ingroup point_types_2d + * \brief 64-bit floating-point point in the R^2 space. + * + * %F64Point is a template instantiation of GenericPoint for \c double. + */ +typedef GenericPoint F64Point; + +/*! + * \class pcl::DPoint + * \ingroup point_types_2d + * \brief 64-bit floating-point point in the R^2 space. + * + * %DPoint is an alias for F64Point. It is a template instantiation of + * GenericPoint for \c double. + */ +typedef F64Point DPoint; + +#endif // !__PCL_NO_POINT_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Point_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Point.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PolarTransform.h b/3rdparty/include/pcl/PolarTransform.h new file mode 100644 index 0000000..47e717c --- /dev/null +++ b/3rdparty/include/pcl/PolarTransform.h @@ -0,0 +1,299 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PolarTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PolarTransform_h +#define __PCL_PolarTransform_h + +/// \file pcl/PolarTransform.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PolarTransformBase + * \brief Base class of polar transforms. + * + * %PolarTransformBase implements properties and functionality common to polar + * transform classes in PCL. + * + * A polar transform remaps pixel values in a two-dimensional image to encode + * polar coordinates on both image axes. Polar angle measured counter-clockwise + * with respect to the geometric center of the image is encoded linearly on the + * vertical (Y) axis. Radial distance to the center is encoded (linearly or + * not, depending on each particular transform) on the horizontal (X) axis. + * + * Polar transforms have important applications in FFT-based image registration + * algorithms (e.g. as part of Fourier-Mellin transforms). + * + * \sa PolarTransform, LogPolarTransform, FFTRegistrationEngine + */ +class PCL_CLASS PolarTransformBase : public InterpolatingGeometricTransformation, + public ParallelProcess +{ +public: + + /*! + * Constructs a %PolarTransformBase object using the specified \a p pixel + * interpolation. The referenced interpolation object \a p must remain valid + * while this %PolarTransformBase object exists. + */ + PolarTransformBase( PixelInterpolation& p ) + : InterpolatingGeometricTransformation( p ) + { + } + + /*! + * Copy constructor. + */ + PolarTransformBase( const PolarTransformBase& ) = default; + + /*! + * Returns the initial rotation angle in radians. The default initial + * rotation angle is zero. + */ + float InitialRotation() const + { + return m_initialAngle; + } + + /*! + * Sets the initial rotation \a angle in radians. + */ + void SetInitialRotation( float angle ) + { + PCL_PRECONDITION( angle >= 0 && angle <= pcl::Const::_2pi() ) + if ( (m_initialAngle = angle) > m_finalAngle ) + pcl::Swap( m_initialAngle, m_finalAngle ); + } + + /*! + * Returns the final rotation angle in radians. The default final rotation + * angle is 2*pi (360 degrees). + */ + float FinalRotation() const + { + return m_finalAngle; + } + + /*! + * Sets the final rotation \a angle in radians. + */ + void SetFinalRotation( float angle ) + { + PCL_PRECONDITION( angle >= 0 && angle <= pcl::Const::_2pi() ) + if ( (m_finalAngle = angle) < m_initialAngle ) + pcl::Swap( m_initialAngle, m_finalAngle ); + } + + /*! + * Sets the initial and final rotation angles, \a initialAngle and + * \a finalAngle respectively, in radians. If the specified initial angle is + * greater than the final angle, both values are swapped. + */ + void SetRotationRange( float initialAngle, float finalAngle ) + { + PCL_PRECONDITION( initialAngle >= 0 && initialAngle <= pcl::Const::_2pi() ) + PCL_PRECONDITION( finalAngle >= 0 && finalAngle <= pcl::Const::_2pi() ) + m_initialAngle = initialAngle; + m_finalAngle = finalAngle; + if ( m_finalAngle < m_initialAngle ) + pcl::Swap( m_initialAngle, m_finalAngle ); + } + + /*! + */ + void GetNewSizes( int& w, int& h ) const override + { + // No change + } + + /*! + * \internal + */ + virtual bool IsLogPolar() const + { + return false; + } + +protected: + + float m_initialAngle = 0; // in radians + float m_finalAngle = pcl::Const::_2pi(); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PolarTransform + * \brief In-place transformation to polar coordinates. + * + * This class implements a Cartesian to polar coordinate transform with the + * following properties: + * + * \li The origin of polar coordinates is located at the geometric center of + * the image. + * + * \li Rotation angles are encoded linearly on the vertical axis, growing from + * bottom to top. + * + * \li Distance to the origin is encoded linearly on the horizontal axis, + * growing from left to right. + * + * \li Transform pixels mapped outside the source image (in Cartesian + * coordinates) are set to zero. + * + * \sa LogPolarTransform, PolarTransformBase, FFTRegistrationEngine + */ +class PCL_CLASS PolarTransform : public PolarTransformBase +{ +public: + + /*! + * Constructs a %PolarTransform object using the specified pixel + * interpolation \a p. The referenced interpolation object \a p must remain + * valid while this %PolarTransform object exists. + */ + PolarTransform( PixelInterpolation& p ) + : PolarTransformBase( p ) + { + } + + /*! + * Copy constructor. + */ + PolarTransform( const PolarTransform& ) = default; + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class LogPolarTransform + * \brief In-place transformation to log-polar coordinates. + * + * This class implements a Cartesian to log-polar coordinate transform with the + * following properties: + * + * \li The origin of polar coordinates is located at the geometric center of + * the image. + * + * \li Rotation angles are encoded linearly on the vertical axis, growing from + * bottom to top. + * + * \li Distance to the origin is encoded logarithmically on the horizontal + * axis, growing from left to right. Natural (base e) logarithms are used. + * + * \li Transform pixels mapped outside the source image (in Cartesian + * coordinates) are set to zero. + * + * \sa PolarTransform, PolarTransformBase, FFTRegistrationEngine + */ +class PCL_CLASS LogPolarTransform : public PolarTransformBase +{ +public: + + /*! + * Constructs a %LogPolarTransform object using the specified pixel + * interpolation \a p. The referenced interpolation object \a p must remain + * valid while this %LogPolarTransform object exists. + */ + LogPolarTransform( PixelInterpolation& p ) + : PolarTransformBase( p ) + { + } + + /*! + * Copy constructor. + */ + LogPolarTransform( const LogPolarTransform& ) = default; + + /*! + * \internal + */ + bool IsLogPolar() const override + { + return true; + } + +protected: + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PolarTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PolarTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Position.h b/3rdparty/include/pcl/Position.h new file mode 100644 index 0000000..d4c000b --- /dev/null +++ b/3rdparty/include/pcl/Position.h @@ -0,0 +1,1522 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Position.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Position_h +#define __PCL_Position_h + +/// \file pcl/Position.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \struct StarPosition + * \brief Positional data of a star. + * + * This structure provides the data necessary for reduction of star positions + * with the following member functions: + * + * Position::Geometric( const StarPosition& ) \n + * Position::Astrometric( const StarPosition& ) \n + * Position::Proper( const StarPosition& ) \n + * Position::Apparent( const StarPosition& ) \n + * Position::Intermediate( const StarPosition& ) + * + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS StarPosition +{ + double alpha = 0; //!< ICRS right ascension in degrees. + double delta = 0; //!< ICRS declination in degrees. + double muAlpha = 0; //!< Proper motion in right ascension, mas/year * cos( delta ). + double muDelta = 0; //!< Proper motion in declination, in mas/year. + double p = 0; //!< Parallax in arcseconds. + double v = 0; //!< Radial velocity in km/s, positive away from Earth. + TimePoint t0 = TimePoint::J2000(); //!< Epoch of coordinates. + + /*! + * Default constructor. See data members for default values. + */ + StarPosition() = default; + + /*! + * Copy constructor. + */ + StarPosition( const StarPosition& x ) + : alpha( x.alpha ) + , delta( x.delta ) + , muAlpha( x.muAlpha ) + , muDelta( x.muDelta ) + , p( x.p ) + , v( x.v ) + , t0( x.t0 ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + StarPosition& operator =( const StarPosition& x ) + { + alpha = x.alpha; + delta = x.delta; + muAlpha = x.muAlpha; + muDelta = x.muDelta; + p = x.p; + v = x.v; + t0 = x.t0; + return *this; + } + + /*! + * Memberwise constructor. + * + * \param ra Right ascension equatorial coordinate in degrees. + * Can be specified in the range [-180,+180] or + * [0,360) indistinctly. + * + * \param dec Declination equatorial coordinate in degrees. + * Should be in the [-90,+90] range. + * + * \param properMotionRA Proper motion in right ascension, in mas/year, + * measured on a great circle, that is, the + * specified value must be the proper motion in R.A. + * multiplied by the cosine of the declination. Zero + * by default. + * + * \param properMotionDec Proper motion in declination, in mas/year. Zero + * by default. + * + * \param parallax Parallax in arcseconds. Zero by default. + * + * \param radialVelocity Radial velocity in km/s, positive away from the + * Earth. Zero by default. + * + * \param epoch Epoch of catalog coordinates. J2000.0 by default. + * + * Positions and proper motions must be referred to ICRS/J2000.0. + * + * If out-of-range coordinates are specified, their values will be + * constrained to their proper ranges: right ascension to [0°,360°) + * and declination to [-90°,+90°]. + */ + StarPosition( double ra, double dec, + double properMotionRA = 0, double properMotionDec = 0, + double parallax = 0, + double radialVelocity = 0, + TimePoint epoch = TimePoint::J2000() ) + : alpha( ((ra = Mod( ra, 360.0 )) < 0) ? ra + 360 : ra ) + , delta( Range( dec, -90.0, +90.0 ) ) + , muAlpha( properMotionRA ) + , muDelta( properMotionDec ) + , p( parallax ) + , v( radialVelocity ) + , t0( epoch ) + { + } + +private: + + uint64 m_uniqueId = UniqueId(); + + static uint64 UniqueId(); + + friend class PCL_CLASS Position; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct ObserverPosition + * \brief Geodetic coordinates of a terrestrial observer. + * + * This structure provides the data necessary to calculate topocentric places + * of solar system bodies and stars. + * + * \ingroup solar_system_ephemerides + */ +struct PCL_CLASS ObserverPosition +{ + double lambda = 0; //!< Geodetic longitude in degrees. + double phi = 0; //!< Geodetic latitude in degrees. + double h = 0; //!< Geodetic height in meters. + double a = ea_eq_radius_IAU2009; //!< Equatorial radius of the reference spheroid in meters. + double f = ea_flattening_IERS2010; //!< Flattening of the reference spheroid. + Vector r0 = Vector( 0, 0, 0 ); //!< Geocentric rectangular coordinates of the center of the regional spheroid, in meters. + bool cioBased = false; //!< Whether to compute CIO-based or equinox-based topocentric coordinates. + + /*! + * Equatorial radius of Earth in meters, IAU 2009/2012. + */ + constexpr static double ea_eq_radius_IAU2009 = 6378136.6; + + /*! + * Flattening of Earth, IERS 2010. + */ + constexpr static double ea_flattening_IERS2010 = 1/298.25642; + + /*! + * Default constructor. + * + * Constructs an %ObserverPosition object for a fictitious observer at the + * geocenter. See data members for specific default values. + */ + ObserverPosition() = default; + + /*! + * Copy constructor. + */ + ObserverPosition( const ObserverPosition& ) = default; + + /*! + * Move constructor. + */ + ObserverPosition( ObserverPosition&& ) = default; + + /*! + * Copy assignment operator. + */ + ObserverPosition& operator =( const ObserverPosition& ) = default; + + /*! + * Move assignment operator. + */ + ObserverPosition& operator =( ObserverPosition&& ) = default; + + /*! + * Memberwise constructor. + * + * \param longitude Geodetic longitude in degrees. + * + * \param latitude Geodetic latitude in degrees. + * + * \param height Geodetic height in meters. Zero by default. + * + * \param equatorialRadius Equatorial radius of the reference spheroid in + * meters. The default value is the IAU 2009/2012 + * equatorial radius of Earth: 6,378,136.6 meters. + * + * \param flattening Flattening of the reference spheroid. The default + * value is the IERS 2010 flattening of Earth: + * 1/298.25642. + * + * \param regionalCenter Geocentric rectangular coordinates of the center + * of the regional spheroid, in meters. A zero 3-D + * vector (that is, the geocenter) by default. + * + * \param useCIO Whether to compute CIO-based or equinox-based + * topocentric coordinates. False (equinox-based) by + * default. + * + * Typically, the values used should be WGS84 coordinates (for example, as + * distributed by GPS) or ITRF coordinates (both systems close together at + * the level of a few centimeters). + * + * Geographic longitudes grow eastward, so longitudes are positive to the + * east and negative to the west of the central meridian. For ease of + * calculation, this constructor converts longitudes to the + * [0°,360°) range. + * + * If out-of-range coordinates are specified, their values will be + * constrained to their proper ranges: longitude to [0°,360°), and + * latitude to [-90°,+90°]. + */ + ObserverPosition( double longitude, double latitude, + double height = 0, + double equatorialRadius = ea_eq_radius_IAU2009, + double flattening = ea_flattening_IERS2010, + const Vector& regionalCenter = Vector( 0, 0, 0 ), + bool useCIO = false ) + : lambda( ((longitude = Mod( longitude, 360.0 )) < 0) ? longitude + 360 : longitude ) + , phi( Range( latitude, -90.0, +90.0 ) ) + , h( Max( 0.0, height ) ) + , a( Max( 0.0, equatorialRadius ) ) + , f( Max( 0.0, flattening ) ) + , r0( regionalCenter ) + , cioBased( useCIO ) + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Position + * \brief Reduction of planetary and stellar positions. + * + * This class implements algorithms for reduction of positions of solar system + * bodies and stars. It allows for calculation of geometric, astrometric, + * proper, apparent and intermediate places, including geocentric and + * topocentric coordinates. + * + * The implemented vector astrometry and ephemeris calculation algorithms are + * rigorous and compliant with current IAU and IERS resolutions. Both + * equinox-based and CIO-based paradigms have been implemented for calculation + * of positions that depend on Earth's rotation. The apparent and intermediate + * places include the following corrections: + * + * \li Light-travel time for solar system bodies. + * + * \li Space motion for stars, including parallax, radial velocity and proper + * motions, with corrections for the relativistic Doppler effect that takes + * into account the change in light-travel time for stars. + * + * \li Relativistic deflection of light due to solar gravitation. + * + * \li Aberration of light, relativistic model. + * + * \li %Frame bias, precession and nutation. (equinox-based and CIO-based). + * + * \li Accurate topocentric places with polar motion corrections. + * + * Vector components are expressed in astronomical units (au) for stars and all + * solar system bodies except the Moon, for which positions are given in + * kilometers. + * + * As of writing this documentation (October 2018), the IAU 2006/2000A + * precession-nutation theory is implemented (adjusted model with corrections + * to nutation angles, IAU 2006/2000AR). The standard fundamental + * ephemerides are JPL's DE438/LE438. + * + * Most of the reference publications and material used are cited in source + * code comments and the documentation. The main authoritative resource is: + * + * Urban, Sean E., Kenneth Seidelmann, P., ed. (2013), The Explanatory + * Supplement to the Astronomical Almanac 3rd Edition. + * + * \ingroup solar_system_ephemerides + */ +class PCL_CLASS Position +{ +public: + + /*! + * Constructs a %Position object initialized for the specified time of + * calculation \a t in the specified \a timescale. + * + * The supported time scales are: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
\b TT Terrestrial Time. This is the default + * timescale.
\b TDB Barycentric Dynamical Time.
\b Teph Ephemeris time, as defined by JPL DE/LE + * numerical integrations. For all purposes, this is + * equivalent to TDB.
\b UTC Coordinated Universal Time.
\b TAI Atomic International Time.
\b UT1 Universal Time.
\b UT Universal Time (same as UT1).
+ * + * \a timescale string values are considered case-sensitive. + * + * All necessary timescale conversions to compute ephemerides and reduction + * of positions are performed automatically. + */ + Position( TimePoint t, const IsoString& timescale = "TT" ); + + /*! + * Copy constructor. + */ + Position( const Position& ) = default; + + /*! + * Move constructor. + */ + Position( Position&& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Position& operator =( const Position& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Position& operator =( Position&& ) = default; + + /*! + * Computes the true position of a solar system body. + * + * The components of the returned vector are the geocentric or topocentric + * rectangular equatorial coordinates for the calculation instant defined by + * this object in the TT timescale, without accounting for light-travel + * time, for the body defined by the specified ephemeris handle \a H. + * + * This function calls Geometric( EphemerisFile::Handle& ) internally to + * compute, if necessary, the geometric position with correction for light + * time, that is, no separate calculation routine is implemented for true + * positions. The returned vector is only useful to compute the true + * geocentric or topocentric distance, and for verification purposes. + */ + Vector True( EphemerisFile::Handle& H ) + { + (void)Geometric( H ); + return m_U0; + } + + /*! + * Computes the geometric position of a star. + * + * This function has been implemented for completeness. It is a synonym for + * Geometric( const StarPosition& ). There are no known 'true' positions of + * stars, since their light-travel time is implicitly included in the space + * motion equations. + */ + Vector True( const StarPosition& S ) + { + (void)Geometric( S ); + return m_U0; + } + + /*! + * Computes the true distance of a solar system body. + * + * The true distance is the actual distance from the body to the observer, + * geocentric or topocentric, at the instant of calculation. This excludes + * the light-travel time correction. + */ + double TrueDistance( EphemerisFile::Handle& H ) + { + return True( H ).L2Norm(); + } + + /*! + * Computes the true distance of a star. + * + * The returned value is just the norm of the geometric position vector, + * that is: + * + * \code Geometric( S ).L2Norm() \endcode + * + * This should be an actual distance in au only for stars with known + * parallaxes. For stars where the parallax is unknown or undefined, this + * value is meaningless because in such cases position vectors are unit + * vectors, whose components are also known as direction cosines. + */ + double TrueDistance( const StarPosition& S ) + { + return True( S ).L2Norm(); + } + + /*! + * Computes the geometric position of a solar system body. + * + * The components of the returned vector are the geocentric or topocentric + * rectangular equatorial coordinates for the instant of calculation defined + * by this object in the TT timescale, accounting for light-travel time, for + * the body defined by the specified ephemeris handle \a H. + * + * The implemented reduction algorithm includes just the correction for + * light-travel time, but no corrections for light deflection, annual + * aberration, nutation, or precession. The position so calculated allows to + * plot the specified body directly on an existing sky chart referred to + * GCRS/J2000.0. Note however, that for generation of new graphical + * representations for a given date using star catalog data, astrometric or + * proper places should be used instead. + */ + Vector Geometric( EphemerisFile::Handle& H ); + + /*! + * Computes the geometric position of a star. + * + * The components of the returned vector are the geocentric or topocentric + * rectangular equatorial coordinates for the instant of calculation defined + * by this object in the TT timescale, for the positional star data defined + * by the specified object \a S. + * + * The implemented reduction algorithm includes just the corrections for + * space motion: parallax, radial velocity and proper motions, when the + * corresponding data items are nonzero in the specified object \a S. The + * space motion vector includes terms to account for the relativistic + * Doppler effect. + */ + Vector Geometric( const StarPosition& S ); + + /*! + * Computes the astrometric place of a solar system body. + * + * The returned vector is the astrometric place of the object defined by the + * specified ephemeris handle \a H in geocentric or topocentric rectangular + * equatorial coordinates, calculated for the instant defined by this object + * in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Light-travel time. + * + * \li Relativistic deflection of light due to solar gravitation (except + * for the Sun, the Moon, and any object closer from Earth than the Sun at + * the time of observation). + * + * An astrometric place does not include annual aberration, nutation and + * precession corrections. Hence it is referred to an 'hybrid' reference + * system, but similar to GCRS J2000.0. + */ + Vector Astrometric( EphemerisFile::Handle& H ); + + /*! + * Computes the astrometric place of a star. + * + * The returned vector is the astrometric place calculated for the + * positional star data defined by the specified object \a S. Its components + * are geocentric or topocentric rectangular equatorial coordinates, + * calculated for the instant defined by this object in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Space motion, including parallax, radial velocity and proper motions, + * with corrections for the relativistic Doppler effect. + * + * \li Relativistic deflection of light due to solar gravitation. + * + * An astrometric place does not include annual aberration, nutation and + * precession corrections. Hence it is referred to an 'hybrid' reference + * system, but similar to GCRS J2000.0. + */ + Vector Astrometric( const StarPosition& S ); + + /*! + * Computes the proper place of a solar system body. + * + * The returned vector is the proper place of the object defined by the + * specified ephemeris handle \a H in geocentric or topocentric rectangular + * equatorial coordinates, calculated for the instant defined by this object + * in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Light-travel time. + * + * \li Relativistic deflection of light due to solar gravitation (except + * for the Sun, the Moon, and any object closer from Earth than the Sun at + * the time of observation. + * + * \li Aberration of light, including relativistic terms. + * + * A proper place does not include nutation and precession corrections, + * hence it is referred to the reference coordinate system: GCRS J2000.0. + */ + Vector Proper( EphemerisFile::Handle& H ); + + /*! + * Computes the proper place of a star. + * + * The returned vector is the proper place calculated for the positional + * star data defined by the specified object \a S. Its components are + * geocentric or topocentric rectangular equatorial coordinates, calculated + * for the instant defined by this object in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Space motion, including parallax, radial velocity and proper motions, + * with corrections for the relativistic Doppler effect. + * + * \li Relativistic deflection of light due to solar gravitation. + * + * \li Aberration of light, including relativistic terms. + * + * A proper place does not include nutation and precession corrections, + * hence it is referred to the reference coordinate system: GCRS J2000.0. + */ + Vector Proper( const StarPosition& S ); + + /*! + * Computes the apparent place of a solar system body. + * + * The returned vector is the apparent place of the object defined by the + * specified ephemeris handle \a H in geocentric or topocentric rectangular + * equatorial coordinates, calculated for the instant defined by this object + * in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Light-travel time. + * + * \li Relativistic deflection of light due to solar gravitation (except + * for the Sun, the Moon, and any object closer from Earth than the Sun at + * the time of observation. + * + * \li Aberration of light, including relativistic terms. + * + * \li %Frame bias, precession and nutation. The origin of right ascension is + * the true equinox of date. + * + * \note The declination coordinate is identical in both equinox-based + * (apparent) and CIO-based (intermediate) positions. Only the origin of + * right ascensions differs between both systems. + * + * \warning If a valid observer location has been defined by calling the + * SetObserver() member function, and the specified ObserverPosition + * structure requires CIO-based transformations (see the + * ObserverPosition::cioBased member), this function will throw an Error + * exception. + */ + Vector Apparent( EphemerisFile::Handle& H ); + + /*! + * Computes the apparent place of a star. + * + * The returned vector is the apparent place calculated for the positional + * star data defined by the specified object \a S. Its components are + * geocentric or topocentric rectangular equatorial coordinates, calculated + * for the instant defined by this object in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Space motion, including parallax, radial velocity and proper motions, + * with corrections for the relativistic Doppler effect. + * + * \li Relativistic deflection of light due to solar gravitation. + * + * \li Aberration of light, including relativistic terms. + * + * \li %Frame bias, precession and nutation. The origin of right ascension is + * the true equinox of date. + * + * \note The declination coordinate is identical in both equinox-based + * (apparent) and CIO-based (intermediate) positions. Only the origin of + * right ascensions differs between both systems. + * + * \warning If a valid observer location has been defined by calling the + * SetObserver() member function, and the specified ObserverPosition + * structure requires CIO-based transformations (see the + * ObserverPosition::cioBased member), this function will throw an Error + * exception. + */ + Vector Apparent( const StarPosition& S ); + + /*! + * Computes the intermediate place of a solar system body. + * + * The returned vector is the intermediate place of the object defined by + * the specified ephemeris handle \a H in geocentric or topocentric + * rectangular equatorial coordinates, calculated for the instant defined by + * this object in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Light-travel time. + * + * \li Relativistic deflection of light due to solar gravitation (except + * for the Sun, the Moon, and any object closer from Earth than the Sun at + * the time of observation. + * + * \li Aberration of light, including relativistic terms. + * + * \li %Frame bias, precession and nutation. The origin of right ascension is + * the Celestial Intermediate Origin (CIO), following the IAU + * recommendations since January 2003. + * + * \note The declination coordinate is identical in both equinox-based + * (apparent) and CIO-based (intermediate) positions. Only the origin of + * right ascensions differs between both systems. + * + * \warning If a valid observer location has been defined by calling the + * SetObserver() member function, and the specified ObserverPosition + * structure requires equinox-based transformations (see the + * ObserverPosition::cioBased member), this function will throw an Error + * exception. + */ + Vector Intermediate( EphemerisFile::Handle& H ); + + /*! + * Computes the intermediate place of a star. + * + * The returned vector is the intermediate place calculated for the + * positional star data defined by the specified object \a S. Its components + * are geocentric or topocentric rectangular equatorial coordinates, + * calculated for the instant defined by this object in the TT timescale. + * + * The implemented reduction algorithm includes the following corrections: + * + * \li Space motion, including parallax, radial velocity and proper motions, + * with corrections for the relativistic Doppler effect. + * + * \li Relativistic deflection of light due to solar gravitation. + * + * \li Aberration of light, including relativistic terms. + * + * \li %Frame bias, precession and nutation. The origin of right ascension is + * the Celestial Intermediate Origin (CIO), following the IAU + * recommendations since January 2003. + * + * \note The declination coordinate is identical in both equinox-based + * (apparent) and CIO-based (intermediate) positions. Only the origin of + * right ascensions differs between both systems. + * + * \warning If a valid observer location has been defined by calling the + * SetObserver() member function, and the specified ObserverPosition + * structure requires equinox-based transformations (see the + * ObserverPosition::cioBased member), this function will throw an Error + * exception. + */ + Vector Intermediate( const StarPosition& S ); + + /*! + * Defines the geodetic positional and reference data necessary for + * calculation of topocentric positions of solar system objects and stars. + * + * By default, an instance of the %Position class calculates geocentric + * coordinates. After calling this member function, subsequently calculated + * geometric, proper, astrometric, apparent and intermediate places will be + * topocentric, that is, will be referred to the location of the observer + * with respect to the center of the Earth. + * + * By calling this member function, all previously computed positional data + * will be erased with the exception of fundamental ephemerides and existing + * bias-precession-nutation matrices, which can always be preserved. + * + * The ObserverPosition::cioBased data member of the specified \a observer + * structure selects the celestial system and paradigm to be used in the + * calculation of positions that depend on Earth's rotation. If the cioBased + * member is true, equinox-based places cannot be calculated, and any of the + * Apparent() member functions will throw an exception if called. + * Conversely, if cioBased is false, CIO-based places cannot be calculated + * and no call to an Intermediate() member function will be allowed. + * + * If polar motion corrections are enabled, the position of the CIP with + * respect to the ITRS is interpolated from the global CIP_ITRS database, if + * it provides data for the current time of calculation. In such case, polar + * motion is taken into account in the calculation of the observer's + * geocentric position and velocity. For the geocentric velocity a standard + * constant value for the rotation rate of the Earth is used; the velocity + * component due to precession and nutation is not taken into account since + * its effect is negligible. See the IsPolarMotionEnabled() and CIP_ITRS() + * member functions for more information and additional references. + */ + void SetObserver( const ObserverPosition& observer ); + + /*! + * Removes the current observer, if a valid one has been defined by a + * previous call to SetObserver(). In such case, all previously computed + * positional data will be invalidated, with the exception of fundamental + * ephemerides and existing bias-precession-nutation matrices. + * + * If no observer has been defined for this object, calling this member + * function has no effect. + * + * After calling this member function, all subsequently calculated + * geometric, proper, astrometric, apparent and intermediate places will be + * geocentric. + */ + void SetGeocentric(); + + /*! + * Returns the current observer. If no observer has been defined for this + * object, returns a default-constructed structure for a fictitious observer + * at the geocenter. + */ + ObserverPosition Observer() const + { + if ( m_observer ) + return *m_observer; + return ObserverPosition(); + } + + /*! + * Returns true iff a valid observer location has been defined for this + * object in a previous call to SetObserver(). + */ + bool IsTopocentric() const + { + return m_observer; + } + + /*! + * Returns true iff topocentric places take into account polar motion + * corrections to compute the geocentric position and velocity of the + * observer. This involves calculation of CIP coordinates with respect to + * the ITRS, as well as access to a database of CIP/ITRS positions. See the + * CIP_ITRS() member function for more details. + * + * Polar motion introduces changes at the mas level for calculation of + * topocentric coordinates of the Moon. For the rest of objects, the effect + * of polar motion corrections is completely negligible. For topocentric + * positions of the Moon, polar motion can be necessary to achieve the + * highest accuracy, but in such case one may also have to take into account + * a regional geoid referred to the Earth's reference ellipsoid. See the + * ObserverPosition structure. + */ + bool IsPolarMotionEnabled() const + { + return m_usePolarMotion; + } + + /*! + * Enables polar motion corrections for calculation of topocentric places. + * See the CIP_ITRS() and IsPolarMotionEnabled() functions for more details. + */ + void EnablePolarMotion( bool enable = true ) + { + m_usePolarMotion = enable; + } + + /*! + * Disables polar motion corrections for calculation of topocentric places. + * See the CIP_ITRS() and IsPolarMotionEnabled() functions for more details. + */ + void DisablePolarMotion( bool disable = true ) + { + EnablePolarMotion( !disable ); + } + + /*! + * Returns the time of calculation for this object in the Barycentric + * Dynamical Time (TDB) timescale. + * + * The times of calculation in different timescales are calculated by the + * class constructor. + */ + TimePoint TDB() const + { + return m_t; + } + + /*! + * Returns the time of calculation for this object in the ephemeris + * timescale defined by the JPL DE/LE numerical integration. For all + * purposes this is equivalent to TDB. + * + * The times of calculation in different timescales are calculated by the + * class constructor. + */ + TimePoint Teph() const + { + return m_t; + } + + /*! + * Returns the time of calculation for this object in the Terrestrial Time + * (TT) timescale. + * + * The times of calculation in different timescales are calculated by the + * class constructor. + */ + TimePoint TT() const + { + return m_tt; + } + + /*! + * Returns the time of calculation for this object in the Universal Time + * (UT1) timescale. + * + * The times of calculation in different timescales are calculated by the + * class constructor. + */ + TimePoint UT1() const + { + return m_ut1; + } + + /*! + * Returns the ICRS barycentric position of the Earth (barycentric + * rectangular equatorial coordinates), computed for the TDB time of + * calculation by the class constructor. The components of the + * returned vector are expressed in au. + */ + Vector BarycentricPositionOfEarth() const + { + return m_Eb; + } + + /*! + * Returns the ICRS barycentric velocity of the Earth (barycentric + * rectangular equatorial coordinates), computed for the TDB time of + * calculation by the class constructor. The components of the + * returned vector are expressed in au/day. + */ + Vector BarycentricVelocityOfEarth() const + { + return m_Edb; + } + + /*! + * Returns the ICRS barycentric position of the Sun (barycentric rectangular + * equatorial coordinates), computed for the TDB time of calculation by the + * class constructor. The components of the returned vector are in au. + */ + Vector BarycentricPositionOfSun() const + { + return m_Sb; + } + + /*! + * Returns the ICRS heliocentric position of the Earth (heliocentric + * rectangular equatorial coordinates), computed for the TDB time of + * calculation by the class constructor. The components of the + * returned vector are expressed in au. + */ + Vector HeliocentricPositionOfEarth() const + { + return m_Eh; + } + + /*! + * Calculates all parameters and data structures necessary for equinox-based + * reduction of positions. + * + * This member function calculates the following structures: + * + * \li Precession+bias angles, IAU 2006 precession model, Fukushima-Williams + * parameterization. See ESAsA sections 6.6.2.2 and 7.2.5.1. + * + * \li Mean obliquity of the ecliptic, IAU 2006 precession model. See ESAsA + * section 7.2.5.1. + * + * \li Nutation angles, IAU 2006/2000A_R nutation model. See ESAsA section + * 6.6.1. + * + * \li Combined bias-precession-nutation matrix, equinox-based. See ESAsA + * sections 6.7 and 7.2.5.1. + * + * \li Position of the Celestial Intermediate Pole (CIP). ESAsA section 6.7. + * + * \li Celestial Intermediate Origin (CIO) locator. ESAsA section 6.7. + * + * \li Equation of the origins (EO). See Wallace, P. & Capitaine, N., 2006, + * Astron.Astrophys. 459, 981, and ESAsA section 6.4. + * + * \li Earth rotation angle (ERA) for the UT1 time of calculation. See IERS + * Technical Note No. 32, 2003, Section 5.4.4. + * + * \li Greenwich Apparent Sidereal Time (GAST), IAU 2006. ESAsA 6.8.5. + * + * Since all of these items depend exclusively on time, they are computed + * only once in the first call to this function, and subsequent calls will + * have no effect. + * + * Normally, you don't have to call this function directly because it is + * invoked automatically when necessary by the different position reduction + * routines. + */ + void InitEquinoxBasedParameters(); + + /*! + * Calculates all parameters and data structures necessary for CIO-based + * reduction of positions. + * + * This member function starts by calling InitEquinoxBasedParameters(), so + * it implicitly calculates all equinox-based parameters. Then it calculates + * the CIO-based combined bias-precession-nutation matrix. See ESAsA + * sections 6.7 and 7.2.5.2. + * + * Since all of these items depend exclusively on time, they are computed + * only once in the first call to this function, and subsequent calls will + * have no effect. + * + * Normally, you don't have to call this function directly because it is + * invoked automatically when necessary by the different position reduction + * routines. + */ + void InitCIOBasedParameters(); + + /*! + * Returns the equinox-based combined bias-precession-nutation matrix. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + Matrix EquinoxBiasPrecessionNutationMatrix() + { + InitEquinoxBasedParameters(); + return m_M; + } + + /*! + * Returns the inverse of the equinox-based combined + * bias-precession-nutation matrix. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + Matrix EquinoxBiasPrecessionNutationInverseMatrix() + { + InitEquinoxBasedParameters(); + return m_Minv; + } + + /*! + * Returns the CIO-based combined bias-precession-nutation matrix. + * + * This member function calls InitCIOBasedParameters() to ensure that + * all data required for equinox-based and CIO-based reduction of positions + * is available. + */ + Matrix CIOBiasPrecessionNutationMatrix() + { + InitCIOBasedParameters(); + return m_C; + } + + /*! + * Returns the inverse of the CIO-based combined bias-precession-nutation + * matrix. + * + * This member function calls InitCIOBasedParameters() to ensure that + * all data required for equinox-based and CIO-based reduction of positions + * is available. + */ + Matrix CIOBiasPrecessionNutationInverseMatrix() + { + InitCIOBasedParameters(); + return m_Cinv; + } + + /*! + * Coordinates of the Celestial Intermediate Pole (CIP) in the GCRS, in + * radians. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + Vector CIP() + { + InitEquinoxBasedParameters(); + return Vector( m_X, m_Y ); + } + + /*! + * Coordinates of the Celestial Intermediate Pole (CIP) in the ITRS. + * + * If possible, this member function returns an interpolated value from the + * global CIP_ITRS database, which will be loaded and parsed upon the first + * call to this function as a thread-safe procedure. See + * EphemerisFile::CIP_ITRSDataFilePath() and + * EphemerisFile::OverrideCIP_ITRSDataFilePath() for more information. See + * also IsPolarMotionEnabled() for some practical considerations. + * + * Otherwise, if the time of calculation for this object falls outside the + * CIP_ITRS database time span, this function will return a two-dimensional + * vector with zero components. + * + * The components of the returned 2-D vector are the coordinates + * xp, yp of the CIP with respect to the ITRS, + * expressed in radians. + */ + Vector CIP_ITRS() const; + + /*! + * The Celestial Intermediate Origin (CIO) locator, in radians. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + double CIO() + { + InitEquinoxBasedParameters(); + return m_s; + } + + /*! + * Equation of the origins, expressed in radians. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + double EO() + { + InitEquinoxBasedParameters(); + return m_EO; + } + + /*! + * Earth rotation angle, expressed in radians. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + double ERA() + { + InitEquinoxBasedParameters(); + return m_ERA; + } + + /*! + * Greenwich apparent sidereal time, expressed in radians. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + double GAST() + { + InitEquinoxBasedParameters(); + return m_GAST; + } + + /*! + * Mean obliquity of the ecliptic, in radians. + */ + double EpsA() const + { + // Mean obliquity of the ecliptic, IAU 2006 precession model. + if ( m_M.IsEmpty() ) + return AsRad( Poly( m_TT, { 84381.406, -46.836769, -0.0001831, 0.00200340, -0.000000576, -0.0000000434 } ) ); + return m_epsa; + } + + /*! + * Returns the nutation angles in radians as a point p, where \e p.x is the + * nutation in longitude and \e p.y is the nutation in obliquity. + * + * This member function calls InitEquinoxBasedParameters() to ensure that + * all data required for equinox-based reduction of positions is available. + */ + DPoint NutationAngles() + { + InitEquinoxBasedParameters(); + return DPoint( m_dpsi, m_deps ); + } + + /*! + * Returns true iff the apparent visual magnitude of the object represented + * by the specified handle \a H can be calculated with the current + * implementation, at the calculation time defined by this instance. + * + * Currently apparent visual magnitudes can be calculated for the following + * solar system bodies: + * + * \li Objects providing valid H and G parameters (absolute magnitude and + * slope coefficient). This happens for most asteroids included in standard + * XEPH files. + * + * \li Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto. + * + * \li The four Galilean satellites of Jupiter: Io, Europa, Ganymede and + * Callisto. + * + * \sa ApparentVisualMagnitude() + */ + bool CanComputeApparentVisualMagnitude( const EphemerisFile::Handle& H ) const; + + /*! + * Returns the observed visual magnitude of a solar system body. + * + * For objects with known H and G values (absolute magnitude and slope + * parameters, respectively; see EphemerisFile::Handle::H() and + * EphemerisFile::Handle::G()), the apparent visual magnitude is calculated + * applying the algorithm for minor planets described in Bowell et al. + * (1989). See also The Explanatory Supplement, Section 10.4.3. + * + * For Mercury, Venus, Mars, Jupiter, Saturn and Neptune, we apply the + * equations described in the following paper: + * + * Anthony Mallama, James L. Hilton, Computing Apparent Planetary + * Magnitudes for The Astronomical Almanac, revised 2018 June 21. + * + * As of writing this documentation, the above paper is available online at: + * https://arxiv.org/pdf/1808.01973.pdf + * + * For Saturn, we compute the apparent visual magnitude taking into account + * the planet's rings. + * + * For Uranus, Pluto and the Galilean satellites of Jupiter, data from + * various sources are taken from Table 10.6 of the Explanatory Supplement. + * + * If the required data are not available, or if no algorithm is known for + * the calculation of the apparent visual magnitude of the specified object, + * this member function returns an undefined Optional object. + * + * An undefined object is also returned when the phase angle of the object + * at the time of calculation is beyond the limits of the set of + * observations used to generate the underlying models. For Mercury, + * apparent magnitudes are only calculated for phase angles + * 2° ≤ \e i ≤ 170°. For Venus, the magnitude is only + * calculated for 0° < \e i ≤ 163°.7. The valid range for Mars is + * \e i ≤ 50°. + * + * \sa CanComputeApparentVisualMagnitude() + */ + Optional ApparentVisualMagnitude( EphemerisFile::Handle& H ); + + /*! + * Conversion from rectangular equatorial to rectangular ecliptic + * coordinates. + * + * \param q Rectangular equatorial coordinates. + * + * \param se Sine of the obliquity of the ecliptic. + * + * \param ce Cosine of the obliquity of the ecliptic. + * + * Returns a vector whose components are the rectangular ecliptic + * coordinates corresponding to the specified equatorial position \a q at + * the epoch where the specified obliquity has been calculated. + */ + static Vector EquatorialToEcliptic( const Vector& q, double se, double ce ) + { + // Rx(eps)*q + return Vector( q[0], q[1]*ce + q[2]*se, q[2]*ce - q[1]*se ); + } + + /*! + * Conversion from rectangular equatorial to rectangular ecliptic + * coordinates. + * + * \param q Rectangular equatorial coordinates. + * + * \param eps Oliquity of the ecliptic in radians. + * + * Returns a vector whose components are the rectangular ecliptic + * coordinates corresponding to the specified equatorial position \a q at + * the epoch where the specified obliquity has been calculated. + */ + static Vector EquatorialToEcliptic( const Vector& q, double eps ) + { + double se, ce; SinCos( eps, se, ce ); + return EquatorialToEcliptic( q, se, ce ); + } + + /*! + * Conversion from spherical equatorial to spherical ecliptic coordinates. + * + * \param q Spherical equatorial coordinates in radians, where \a q.x is + * the right ascension and \a q.y is the declination. + * + * \param se Sine of the obliquity of the ecliptic. + * + * \param ce Cosine of the obliquity of the ecliptic. + * + * Returns the ecliptic coordinates in radians as a point \e p, where \e p.x + * is the longitude in the range [0,2pi) and \e p.y is the latitude in + * [-pi/2,+pi/2]. + */ + static DPoint EquatorialToEcliptic( const DPoint& q, double se, double ce ) + { + DPoint e; + EquatorialToEcliptic( Vector::FromSpherical( q.x, q.y ), se, ce ).ToSpherical2Pi( e.x, e.y ); + return e; + } + + /*! + * Conversion from spherical equatorial to spherical ecliptic coordinates. + * + * \param q Spherical equatorial coordinates in radians, where \a q.x is + * the right ascension and \a q.y is the declination. + * + * \param eps Oliquity of the ecliptic in radians. + * + * Returns the ecliptic coordinates in radians as a point \e p, where \e p.x + * is the longitude in the range [0,2pi) and \e p.y is the latitude in + * [-pi/2,+pi/2]. + */ + static DPoint EquatorialToEcliptic( const DPoint& q, double eps ) + { + double se, ce; SinCos( eps, se, ce ); + return EquatorialToEcliptic( q, se, ce ); + } + + /*! + * Conversion from rectangular ecliptic to rectangular equatorial + * coordinates. + * + * \param q Rectangular ecliptic coordinates. + * + * \param se Sine of the obliquity of the ecliptic. + * + * \param ce Cosine of the obliquity of the ecliptic. + * + * Returns a vector whose components are the rectangular equatorial + * coordinates corresponding to the specified ecliptic position \a q at + * the epoch where the specified obliquity has been calculated. + */ + static Vector EclipticToEquatorial( const Vector& q, double se, double ce ) + { + // Rx(eps)*q + return Vector( q[0], q[1]*ce - q[2]*se, q[2]*ce + q[1]*se ); + } + + /*! + * Conversion from rectangular ecliptic to rectangular equatorial + * coordinates. + * + * \param q Rectangular ecliptic coordinates. + * + * \param eps Oliquity of the ecliptic in radians. + * + * Returns a vector whose components are the rectangular equatorial + * coordinates corresponding to the specified ecliptic position \a q at + * the epoch where the specified obliquity has been calculated. + */ + static Vector EclipticToEquatorial( const Vector& q, double eps ) + { + double se, ce; SinCos( eps, se, ce ); + return EclipticToEquatorial( q, se, ce ); + } + + /*! + * Conversion from spherical ecliptic to spherical equatorial coordinates. + * + * \param q Spherical ecliptic coordinates in radians, where \a q.x is + * the longitude and \a q.y is the latitude. + * + * \param se Sine of the obliquity of the ecliptic. + * + * \param ce Cosine of the obliquity of the ecliptic. + * + * Returns the equatorial coordinates in radians as a point \e p, where \e p.x + * is the right ascension in the range [0,2pi) and \e p.y is the declination + * in [-pi/2,+pi/2]. + */ + static DPoint EclipticToEquatorial( const DPoint& q, double se, double ce ) + { + DPoint e; + EclipticToEquatorial( Vector::FromSpherical( q.x, q.y ), se, ce ).ToSpherical2Pi( e.x, e.y ); + return e; + } + + /*! + * Conversion from spherical ecliptic to spherical equatorial coordinates. + * + * \param q Spherical ecliptic coordinates in radians, where \a q.x is + * the longitude and \a q.y is the latitude. + * + * \param eps Oliquity of the ecliptic in radians. + * + * Returns the equatorial coordinates in radians as a point \e p, where \e p.x + * is the right ascension in the range [0,2pi) and \e p.y is the declination + * in [-pi/2,+pi/2]. + */ + static DPoint EclipticToEquatorial( const DPoint& q, double eps ) + { + double se, ce; SinCos( eps, se, ce ); + return EclipticToEquatorial( q, se, ce ); + } + + /*! + * Conversion from ICRS rectangular equatorial to rectangular galactic + * coordinates. + * + * \param q Rectangular equatorial coordinates in the ICRS. + * + * Returns a vector whose components are the calculated rectangular galactic + * coordinates. + * + * In this routine we adopt the proposed ICRS coordinates of the + * galactic pole in: + * + * Jia-Cheng Liu, Zi Zhu, and Hong Zhang, Reconsidering the galactic + * coordinate system, Astronomy & Astrophysics manuscript no. AA2010, + * October 26, 2018. + * + * The applied conventional definitions are as follows. The ICRS equatorial + * coordinates of the zero point of galactic coordinates are: + * + * α = 17h45m40s.0400 + * δ = –29°00'28".138 + * + * The equatorial coordinates of the galactic pole, coherent with the ICRS, + * are: + * + * αp = 12h51m36s.7151981 + * δp = +27°06'11".193172 + * + * Note that these definitions are not consistent with the conventional + * values currently accepted by the IAU. The current (as of October 2018) + * galactic coordinate system was defined by the IAU in 1959 in the FK4 + * B1950.0 reference system. + */ + static Vector ICRSEquatorialToGalactic( const Vector& q ) + { + return Matrix( +0.494055821648, -0.054657353964, -0.445679169947, + -0.872844082054, -0.484928636070, +0.746511167077, + -0.867710446378, -0.198779490637, +0.455593344276 )*q; + } + + /*! + * Conversion from ICRS spherical equatorial to spherical galactic + * coordinates. + * + * \param q Spherical ICRS equatorial coordinates in radians, where + * \a q.x is the right ascension and \a q.y is the declination. + * + * Returns the galactic coordinates in radians as a point \e p, where \e p.x + * is the longitude in the range [0,2pi) and \e p.y is the latitude in + * [-pi/2,+pi/2]. + * + * See the documentation for ICRSEquatorialToGalactic( const Vector& ) for + * critical information on the adopted galactic coordinate system. + */ + static DPoint ICRSEquatorialToGalactic( const DPoint& q ) + { + DPoint g; + ICRSEquatorialToGalactic( Vector::FromSpherical( q.x, q.y ) ).ToSpherical2Pi( g.x, g.y ); + return g; + } + +private: + + // TDB + TimePoint m_t; + // TT + TimePoint m_tt; + // UT1 + TimePoint m_ut1; + // TT in Julian centuries since J2000.0. + double m_TT; + // Barycentric ICRS position and velocity of the Earth. + Vector m_Eb, m_Edb; + // Geocentric ICRS position and velocity of the observer, in km and km/day. + Vector m_G, m_Gd; + // Barycentric ICRS position of the Sun. + Vector m_Sb; + // Heliocentric position of the Earth. + Vector m_Eh; + // Distance Earth-Sun. + double m_E; + // Heliocentric position of the observer (au). + Vector m_Oh; + // Distance observer-Sun (au). + double m_O; + // Bias+precession angles. + double m_gamb, m_phib, m_psib, m_epsa; + // Nutation angles. + double m_dpsi, m_deps; + // Position of the Celestial Intermediate Pole (CIP) in GCRS. + double m_X, m_Y; + // CIO locator. + double m_s; + // Combined bias-precession-nutation matrix (NPB). + Matrix m_M, m_Minv; + // Combined bias-precession-nutation matrix (NPB_CIO). + Matrix m_C, m_Cinv; + // Equation of the origins. + double m_EO; + // Earth rotation angle. + double m_ERA; + // Greenwich apparent sidereal time. + double m_GAST; + // Light-travel time in days. + double m_tau = 0; + // Barycentric position. + Vector m_ub; + // True geocentric position. + Vector m_U0; + // Geocentric position. + Vector m_U; + // Astrometric place. + Vector m_u1; + // Proper place. + Vector m_u2; + // Apparent place. + Vector m_u3e; + // Intermediate place. + Vector m_u3i; + + // Handles for calculation of fundamental ephemerides and nutation angles. + AutoPointerCloner m_TT_TDB, m_HE, m_HS, m_HN; + + // Current observer for calculation of topocentric coordinates. + AutoPointerCloner m_observer; + + // Special case flags. + bool m_isMoon = false, m_isSun = false, m_isStar = false; + + // Whether to account for polar motion (CIP->ITRS) in calculation of + // topocentric positions. + bool m_usePolarMotion = true; + + // Unique identifier of the object whose positions are being calculated. + uint64 m_uniqueObjectId = 0; + + template + bool Validate( const T& obj ) + { + if ( obj.m_uniqueId != m_uniqueObjectId ) + { + m_U0 = m_U = m_ub = m_u1 = m_u2 = m_u3e = m_u3i = Vector(); + m_tau = 0; + m_isMoon = m_isSun = m_isStar = false; + m_uniqueObjectId = obj.m_uniqueId; + return false; + } + return true; + } + + Vector Deflection(); + Vector Aberration(); + + static double CIOLocator( double T, double X, double Y ); + + /* + * Astronomical constants, IAU 2009/2012 and IERS 2003/2010. + */ + constexpr static double au_km = 149597870.7; // astronomical unit (km) + constexpr static double c_km_s = 299792.458; // speed of light (km/s) + constexpr static double c_km_day = c_km_s*86400; // speed of light (km/day) + constexpr static double c_au_day = (c_km_s/au_km)*86400; // speed of light (au/day) + constexpr static double earth_omega = 7.292115e-5; // angular velocity of Earth in radians/s +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Position_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Position.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PreviewSelectionDialog.h b/3rdparty/include/pcl/PreviewSelectionDialog.h new file mode 100644 index 0000000..4026836 --- /dev/null +++ b/3rdparty/include/pcl/PreviewSelectionDialog.h @@ -0,0 +1,130 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PreviewSelectionDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PreviewSelectionDialog_h +#define __PreviewSelectionDialog_h + +/// \file pcl/PreviewSelectionDialog.h + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PreviewSelectionDialog + * \brief A simple dialog box to select an existing preview. + * + * %PreviewSelectionDialog consists of a ViewList control populated with all + * existing previews, and standard OK and Cancel push buttons. This class is a + * useful helper whenever a process needs access to a user-selected preview. + * + * \sa ViewSelectionDialog, MultiViewSelectionDialog, Dialog + */ +class PreviewSelectionDialog : public Dialog +{ +public: + + /*! + * Constructs a %PreviewSelectionDialog object. If the optional \a id + * argument is specified and a preview exists with that identifier, the + * dialog will select the corresponding preview upon execution. + */ + PreviewSelectionDialog( const IsoString& id = IsoString() ); + + PreviewSelectionDialog( const IsoString::ustring_base& id ) + : PreviewSelectionDialog( IsoString( id ) ) + { + } + + /*! + * Destroys a %PreviewSelectionDialog object. + */ + virtual ~PreviewSelectionDialog() + { + } + + /*! + * Returns the identifier of the selected preview. + */ + IsoString Id() const + { + return m_id; + } + +private: + + IsoString m_id; + + VerticalSizer Global_Sizer; + ViewList Images_ViewList; + HorizontalSizer Buttons_Sizer; + PushButton OK_PushButton; + PushButton Cancel_PushButton; + + void ViewSelected( ViewList& sender, View& view ); + void ButtonClick( Button& sender, bool checked ); + void ControlShow( Control& sender ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PreviewSelectionDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PreviewSelectionDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Process.h b/3rdparty/include/pcl/Process.h new file mode 100644 index 0000000..66f5c15 --- /dev/null +++ b/3rdparty/include/pcl/Process.h @@ -0,0 +1,365 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Process.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Process_h +#define __PCL_Process_h + +/// \file pcl/Process.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class ProcessPrivate; + +/*! + * \class Process + * \brief High-level interface to an installed process. + * + * %Process instances are high-level, managed objects that represent + * installed processes in the PixInsight platform. A module creates an + * instance of %Process to gain access to an installed process through + * intermodule communication. + * + * %Process and %MetaProcess + * + * %Process provides a description of the functionality and properties of an + * already installed process. Contrarily, by subclassing the + * MetaProcess class a module can define and implement a new process that can + * be installed in the PixInsight platform. %MetaProcess is a formal + * description of a process, while %Process describes an existing (and + * installed) process. + * + * As a %MetaProcess subclass describes how a process can be instantiated, + * %Process allows a module to create new instances of a process that can be + * edited and executed. %Process does not provide any process execution + * functionality; executable processes are represented by the ProcessInstance + * class. + * + * \sa ProcessBase, MetaProcess, ProcessInstance + */ +class PCL_CLASS Process : public ProcessBase +{ +public: + + /*! + * A list of process parameters. + * + * This type is returned by the Parameters() member function to describe and + * identify the set of parameters of a process. + */ + typedef Array parameter_list; + + /*! + * Constructs a %Process object. + * + * \param classId Identifier of an installed process in the PixInsight + * core application. + * + * If successful, this constructor creates a managed alias to an installed + * process in the PixInsight core application. + * + * If there is no installed process with the specified identifier, if + * \a classId is not a valid identifier, or if the alias object cannot be + * generated for some reason, this constructor throws an Error exception + * with the corresponding error message. Your code should guarantee that + * these exceptions are always caught and handled appropriately. + */ + Process( const IsoString& classId ); + + Process( const IsoString::ustring_base& classId ) + : Process( IsoString( classId ) ) + { + } + + /*! + * Copy constructor. Constructs an \e alias %Process object that refers to + * the same process as the specified object \a proc. + */ + Process( const Process& proc ); + + /*! + * Destroys this %Process object. + * + * \note This destructor does not destroy or uninstall the actual process it + * refers to, which is part of the PixInsight core application. Only the + * managed alias object living in the caller module is destroyed. + */ + virtual ~Process(); + + /*! + */ + IsoString Id() const override; + + /*! + * Returns a list of alias identifiers for this process. + * + * A process can have one or more alias identifiers. Aliases are + * useful to maintain compatibility with previous versions of a process. + * + * When the PixInsight core application imports a process instance (e.g., + * from a process icon) it automatically replaces alias process identifiers + * with actual (current) identifiers. This allows a developer to change the + * identifier of a process without breaking compatibility with process + * instances in existing icon collections or projects. + * + * The returned object is a list of distinct identifiers that are treated as + * synonyms to the actual identifier of this process, which is returned by + * the Id() member function. Two installed processes can't have the same + * alias, so each identifier included in the returned list must be unique + * among all installed processes on the entire PixInsight platform. + */ + IsoStringList Aliases() const; + + /*! + * Returns the identifiers of one or more categories to which this process + * belongs. + * + * Processes are organized hierarchically by categories in PixInsight. All + * installed processes appear classified by their categories on the %Process + * Explorer window, and also under the %Process main menu item. + * + * This function returns a list of category names. Each category name must + * be a valid C identifier. If the returned list is empty, then this process + * is not associated with any particular category. In such case this process + * appears under a special, fallback pseudo-category identified as + * <Etc> on both the %Process Explorer window and the %Process main + * menu item. + */ + IsoStringList Categories() const; + + /*! + */ + uint32 Version() const override; + + /*! + */ + String Description() const override; + + /*! + */ + String ScriptComment() const override; + + /*! + */ + Bitmap Icon() const override; + + /*! + */ + Bitmap SmallIcon() const override; + + /*! + */ + bool CanProcessViews() const override; + + /*! + */ + bool CanProcessGlobal() const override; + + /*! + */ + bool CanProcessImages() const override; + + /*! + */ + bool CanProcessCommandLines() const override; + + /*! + */ + bool CanEditPreferences() const override; + + /*! + */ + bool CanBrowseDocumentation() const override; + + /*! + */ + bool IsAssignable() const override; + + /*! + */ + bool NeedsInitialization() const override; + + /*! + */ + bool NeedsValidation() const override; + + /*! + */ + bool PrefersGlobalExecution() const override; + + /*! + */ + bool EditPreferences() const override; + + /*! + */ + bool BrowseDocumentation() const override; + + /*! + * Invokes the command line execution routine for this process. + * + * \param arguments A string with the list of arguments that will be passed + * to the command line execution routine. Multiple + * arguments must be separated with white space characters. + * + * If this process supports command line execution, then the corresponding + * command line execution routine is invoked with the specified arguments. + * Otherwise, this member function calls Launch(), and the specified command + * line arguments are ignored. + * + * On the PixInsight platform, command line option arguments are customarily + * specified with leading dash characters, following the common UNIX style. + * Argument values are separated with equal signs. However, command line + * syntax and the meaning of each argument are specific to each process. + * + * This function returns the exit code of the command line execution routine + * of the process. By convention, exit code zero means successful execution, + * and nonzero exit codes are returned to signal errors. + */ + int RunCommandLine( const String& arguments ) const; + + /*! + * Launches this process. + * + * If this process has an associated default interface, then its top level + * window is shown and activated in its current state. + * + * If this process has no default interface, then the core application + * attempts to generate a default instance of the process and execute it. If + * the process prefers global execution (see the PrefersGlobalExecution() + * member function), then the default instance is executed in the global + * context; otherwise it is executed on the current view, if there is at + * least one image available. + * + * Returns true if the process was successfully launched; false in the event + * of error, or if the core application was unable to launch or execute it. + */ + bool Launch() const; + + /*! + * Returns the list of parameters of this process. The list can be empty for + * processes that don't have parameters. + */ + parameter_list Parameters() const; + + /*! + * Returns true iff this process has a parameter with the specified + * identifier \a paramId. + */ + bool HasParameter( const IsoString& paramId ) const; + + /*! + * Returns true iff this process has a table parameter \a tableId with the + * specified column parameter \a colId. + */ + bool HasTableColumn( const IsoString& tableId, const IsoString& colId ) const; + + /*! + * Returns a list of all the currently defined process categories in the + * PixInsight core application. + */ + static IsoStringList AllProcessCategories(); + + /*! + * Returns a list of all the currently installed processes on the PixInsight + * core application. + */ + static Array AllProcesses(); + + /*! + * Returns a list of all the currently installed processes pertaining to the + * specified \a category. Pass an empty string to obtain a list of all + * uncategorized processes (i.e. the \ fallback category). + * + * Returns an empty list if no currently installed process pertains to the + * specified category. + */ + static Array ProcessesByCategory( const IsoString& category ); + + static Array ProcessesByCategory( const IsoString::ustring_base& category ) + { + return ProcessesByCategory( IsoString( category ) ); + } + +private: + + AutoPointer m_data; + + Process( const void* ); + + const void* Handle() const; + + friend class ProcessInstance; + friend class ProcessParameter; + friend class ProcessParameterPrivate; + friend class InternalProcessEnumerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Process_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Process.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProcessBase.h b/3rdparty/include/pcl/ProcessBase.h new file mode 100644 index 0000000..5cd64ef --- /dev/null +++ b/3rdparty/include/pcl/ProcessBase.h @@ -0,0 +1,303 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProcessBase.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProcessBase_h +#define __PCL_ProcessBase_h + +/// \file pcl/ProcessBase.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ProcessBase + * \brief Abstract base class for process descriptions. + * + * %ProcessBase defines a number of descriptive properties of a process in the + * PixInsight platform. + * + * %ProcessBase is an abstract base class of the MetaProcess and Process + * instantiable classes. %MetaProcess describes an installable process, while + * the %Process class provides direct access to an installed process through + * intermodule communication. + * + * In more practical terms, modules defining new processes must implement + * derived classes of %MetaProcess, while %Process is used by modules requiring + * direct access to process instances through installed processes. + * + * Note that the %ProcessBase, %MetaProcess, %Process, ProcessImplementation + * and ProcessInstance classes are conceptually parallel to the FileFormatBase, + * MetaFileFormat, FileFormat, FileFormatImplementation and FileFormatInstance + * classes, respectively. This is just a reflection of the strong object + * orientation and modularity that characterize the PixInsight platform. + * + * \sa MetaProcess, Process, ProcessImplementation, ProcessInstance + */ +class PCL_CLASS ProcessBase +{ +public: + + /*! + * Constructs a %ProcessBase object. + */ + ProcessBase() + { + } + + /*! + * Destroys this %ProcessBase object. + */ + virtual ~ProcessBase() noexcept( false ) + { + } + + /*! + * Returns an identifier for this process. + * + * %Process identifiers are unique C identifiers. + */ + virtual IsoString Id() const = 0; + + /*! + * Returns a version number for this process, encoded as a hexadecimal + * number. + * + * For example, version 1.0.5 should be returned as 0x105, and version + * 3.11.5 as 0x3B5. + */ + virtual uint32 Version() const = 0; + + /*! + * Returns a descriptive text for this process. + * + * This function should provide a brief but sufficiently informative + * description of this process. The returned description appears on the + * %Process Explorer window, and should provide information about what this + * process does and how it can be used, avoiding too exhaustive descriptions + * that are better reserved for a technical manual. + * + * %Process descriptions are always printed on PixInsight consoles. This + * means that the text output functionality of the Console class can be used + * to format the string returned by this function. Refer to that class and + * its documentation for further information. + */ + virtual String Description() const = 0; + + /*! + * Returns a brief description for generated scripts. + * + * The returned text is intended to provide a brief comment to describe this + * process and its parameters, for quick reference on generated scripts. + * When writing these comments, think as you do when you're commenting your + * own source code. + */ + virtual String ScriptComment() const = 0; + + /*! + * Returns a large icon image that identifies this process. + * + * The returned image is used to identify all instances of this process in + * the core application's GUI. It is used on the Process Explorer window, on + * all icons transporting instances of this process, and in general for + * every graphical item related to this process or to an instance of this + * process. + */ + virtual Bitmap Icon() const = 0; + + /*! + * Returns a small icon image that identifies this process. + * + * For details on process icon images, see the documentation for Icon(). + * + * Small icons are used on interface elements where screen space must be + * preserved. Two good examples are the Process Explorer window and the + * ProcessContainer interface. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * Small icons are deprecated because all process and interface icons must + * now be specified in SVG format. SVG icons can be resized automatically to + * the required dimensions. + */ + virtual Bitmap SmallIcon() const = 0; + + /*! + * Returns true iff this process is able to process views. + */ + virtual bool CanProcessViews() const = 0; + + /*! + * Returns true iff this process can be executed globally. + */ + virtual bool CanProcessGlobal() const = 0; + + /*! + * Returns true iff this process is able to process standalone images. + */ + virtual bool CanProcessImages() const = 0; + + /*! + * Returns true iff this process is able to process specific command-line + * invocations. + */ + virtual bool CanProcessCommandLines() const = 0; + + /*! + * Returns true iff this process is able to edit specific preferences. + */ + virtual bool CanEditPreferences() const = 0; + + /*! + * Returns true iff this process is able to open a documentation browser with + * specific documentation contents. + * + * Starting from version 1.7, the PixInsight core application implements an + * integrated documentation system. The core application provides automatic + * documentation browsing and searching functionality, so normally this + * member function returns true for all processes. + */ + virtual bool CanBrowseDocumentation() const = 0; + + /*! + * Returns true iff the instances of this process are \e assignable. + * + * Assignable processes allow copying the parameters of one instance (and + * possibly more module-dependent data) to another. + */ + virtual bool IsAssignable() const = 0; + + /*! + * Returns true iff the instances of this process require special + * initialization. + * + * Special initialization takes place just after instance creation. + * Sometimes, there are actions that cannot be implemented in the + * constructor of a process instance class. For example, this often happens + * when an instance must be initialized by calling reimplemented virtual + * functions from a base class constructor. Reimplemented virtual functions + * cannot be resolved from a base class constructor in C++. + */ + virtual bool NeedsInitialization() const = 0; + + /*! + * Returns true iff the instances of this process require special + * validation. + * + * Some processes may require validation of their instances just before they + * are executed. This is known as special validation. The core + * application will never execute an instance of a process if its validation + * function fails. + */ + virtual bool NeedsValidation() const = 0; + + /*! + * Returns true iff the instances of this process prefer execution in the + * global context, instead of being executed on views. + * + * Note that the option indicated by this function is just a \e hint to the + * PixInsight core application, not necessarily observed. This means that + * the fact that this member function returns true for a process does not + * mean that the process cannot be executed on views. + */ + virtual bool PrefersGlobalExecution() const = 0; + + /*! + * Handles a request to edit process preferences. Returns true if the + * preferences were successfully edited. + * + * By calling this member function for a process able to edit preferences + * (that is, when CanEditPreferences() returns true), the user is allowed to + * define a set of preferences specific to this process. Usually this task + * is implemented on a modal dialog box. In such case, if the user closes + * the dialog box without accepting the new preferences settings (e.g. by + * clicking the dialog's Cancel button) this member function should return + * false. This member function should only return true if the user has + * edited and accepted a new set of preferences for this process. + */ + virtual bool EditPreferences() const = 0; + + /*! + * Handles a request to browse documentation specific for this process. + * Returns true iff the documentation was loaded successfully. + * + * Since version 1.7 of the PixInsight core application, the integrated + * documentation system works in a completely automatic and standardized way + * to provide documentation browsing and searching functionality. + * + * The default implementation of this member function automatically launches + * and loads the integrated documentation browser with the documentation for + * this process, if it exists and has been installed. For more information, + * please read the documentation for the CanBrowseDocumentation() function. + */ + virtual bool BrowseDocumentation() const = 0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ProcessBase_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProcessBase.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProcessImplementation.h b/3rdparty/include/pcl/ProcessImplementation.h new file mode 100644 index 0000000..90c1f9e --- /dev/null +++ b/3rdparty/include/pcl/ProcessImplementation.h @@ -0,0 +1,813 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProcessImplementation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProcessImplementation_h +#define __PCL_ProcessImplementation_h + +/// \file pcl/ProcessImplementation.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS MetaParameter; +class PCL_CLASS ProcessInterface; +class PCL_CLASS View; +class PCL_CLASS ImageWindow; + +// ---------------------------------------------------------------------------- + +/*! + * \class ProcessImplementation + * \brief Implementation of a PixInsight process instance. + * + * %Process instances are the main actors in the PixInsight environment, since + * they are responsible for all of the actual processing work. For example, + * process instances can be executed on views, on images and on the global + * context, edited through process interfaces, parsed by script interpreters, + * stored in processing histories and process containers, and managed as + * process icons and projects that can be transferred to and from special disk + * files (XPSM and XOSM formats). + * + * In the PixInsight/PCL framework, a process class is formally + * defined as a descendant of the MetaProcess class, along with several + * descendants of MetaParameter classes. %ProcessImplementation defines the + * behavior and functionality of an instance of a process class. + * + * \sa MetaProcess, MetaParameter + */ +class PCL_CLASS ProcessImplementation +{ +public: + + /*! + * Constructs a process instance. + * + * \param m Pointer to a metaprocess that identifies the process class + * that this process instance belongs to. + */ + ProcessImplementation( const MetaProcess* m ); + + /*! + * Copy constructor. Constructs a new process instance as a duplicate of an + * existing instance. + */ + ProcessImplementation( const ProcessImplementation& x ); + + /*! + * Destroys this process instance. + */ + virtual ~ProcessImplementation(); + + /*! + * Returns a pointer to the metaprocess of this process instance. + * + * The metaprocess defines the process class this instance belongs to. + */ + const MetaProcess* Meta() const + { + return meta; + } + + /*! + * Initializes this process instance after construction. This is knwon as + * special initialization of process instances. + * + * The PixInsight core application calls this function to initialize an + * instance just after it has been created by its class constructor. + * + * There are cases where the entire initialization work required for a + * process instance cannot be accomplished in the instance class constructor + * (e.g., because it requires calling reimplemented virtual functions from a + * base class). In such cases, this function can be reimplemented to perform + * the pending initialization tasks immediately after instance construction. + * + * This function is only called if the associated metaprocess class + * reimplements MetaProcess::NeedsInitialization() to return true. + */ + virtual void Initialize(); + + /*! + * Returns true iff this process instance is currently valid for execution. + * + * \param[out] info If this function returns false, it should return also a + * brief text (128 characters maximum) in this string, + * describing why this is an invalid instance. + * + * The PixInsight core application calls this function to validate an + * instance just before attempting to execute it, either on a view or in the + * global context. + * + * This function is only called if the associated metaprocess class + * reimplements MetaProcess::NeedsValidation() to return true. + * + * If this function returns false, giving a brief description of the reasons + * in the \a info string is not mandatory, but neglecting it is considered + * bad programming practice. + */ + virtual bool Validate( String& info ); + + /*! + * Assigns an existing instance \a i to this instance, if it belongs to an + * assignable process class. + * + * The PixInsight core application calls this function each time a process + * instance has to be replaced with a copy of another existing instance. + * This happens under a wide variety of situations. A good example is + * copying a process icon by dragging it to another icon. Another, less + * visible example is when a view's processing history is being copied as + * the initial processing of a duplicate view. + * + * Assignment only occurs for \e assignable processes. A process is + * assignable unless its defining MetaProcess descendant class reimplements + * the MetaProcess::IsAssignable() member function to return false. + * + * Assignable process instance implementation classes must reimplement this + * function, or a runtime exception will be thrown. This means that + * virtually \e all descendants classes of %ProcessImplementation must + * reimplement this function. A plausible reason to define a non-assignable + * process (perhaps the only one) is because its instances have no data at + * all that could be assigned - an example is the standard Invert process. + */ + virtual void Assign( const ProcessImplementation& i ); + + /*! + * Returns true iff this process instance could be successfully executed on a + * given \a view. + * + * \param view Reference to a view on which this process is being tested + * to validate execution. + * + * \param[out] whyNot If this function returns false, it should return + * also a brief text (128 characters maximum) in this string, + * explaining why this instance cannot be executed on the + * passed \a view. + * + * In general, among many other possible reasons, a process instance class + * should reimplement this function if: + * + * \li It is a process that cannot be executed on views. In this case, the + * reimplementation of this function should always return false. + * + * \li It cannot be executed on \e all views. For example, some processes + * can only be executed on main views, but not on previews. Or perhaps this + * process cannot be executed on color images, but only on grayscale images. + * + * \li Some instances, perhaps depending on specific parameter values or + * user-selectable options, may have limitations or cannot be executed on + * some types of views or images. + * + * If this function returns false, giving a brief description of the reasons + * in the \a whyNot string is not mandatory, but neglecting it is considered + * bad programming practice. + * + * \note The default implementation of this function returns true, so by + * default a process instance can be executed on any view. + */ + virtual bool CanExecuteOn( const View& view, String& whyNot ) const; + + /*! + * Returns true iff this process instance would require a history update for + * the specified \a view, if it was executed on it. + * + * A history update would be required if this instance was modifying the + * \a view or its image in \e any way. By any way we mean not only + * changing pixel values, but to alter whatever property of the view or its + * image. + * + * \note The default implementation of this function returns true, so by + * default a process instance is supposed to update all views. + */ + virtual bool IsHistoryUpdater( const View& view ) const + { + return true; // by default, all processes are supposed to update images. + } + + /*! + * Returns true iff this is a maskable process instance for the + * specified \a view. + * + * \param view Reference to a view on which this process is being tested to + * validate maskable execution. + * + * \param mask Reference to an image window whose image would act as a mask + * after execution of this process instance. + * + * A maskable instance is one whose resulting processed image can be masked. + * When a target image is masked after execution of a process instance, + * white mask pixels allow replacement of target pixels with fully processed + * values, and black mask pixels preserve original target pixel values. Gray + * mask pixel values yield proportional combinations of original and + * processed target pixels. + * + * If a process cannot be masked, or if some process instances can't be + * masked sometimes, then this function should be reimplemented to return + * false, or an appropriate value depending on the execution context. + * + * \note The default implementation of this function returns true, so by + * default a process instance is supposed to be maskable for all views. + */ + virtual bool IsMaskable( const View& view, const ImageWindow& mask ) const + { + return true; // by default, all processes are supposed to be maskable. + } + + /*! + * Returns a combination of flags indicating the required contents of a + * history update record for the specified \a view if this instance was + * executed on it. + * + * The returned value is an OR'ed combination of flags that must be + * specified with the symbolic constants defined in the UndoFlag namespace. + * + * When reimplementing this function, you should include flags for all data + * items that your process instances modify in target views. For example, if + * a process instance modifies the FITS header keywords of target images, + * the reimplementation of this function should include the + * UndoFlag::Keywords flag. + * + * \note The default implementation of this function returns + * UndoFlag::DefaultMode. This value selects a default set of items, + * including pixel data, that will be stored in a history record for the + * specified \a view before executing this process instance on it. You + * normally won't need to reimplement this function, since the default + * history data set is appropriate for most processes. + */ + virtual UndoFlags UndoMode( const View& view ) const + { + return UndoFlag::DefaultMode; + } + + /*! + * This function is called just before execution of this process instance on + * the specified \a view. Returns true if execution can continue. + * + * This function is the last chance for a process instance to prevent + * execution on a particular view. + * + * For example, a process that destroys the previews defined in the image + * window of a target view should always ask the user if it is OK to do so + * before execution. In this case, this function would be reimplemented to + * open a standard yes/no message box asking something like "About to + * destroy all previews in this image window. Are you sure?" to the + * user. False should be returned if the user answered "No". + * + * \note The default implementation of this function returns true, so by + * default execution on views is not stopped by this function. + */ + virtual bool BeforeExecution( View& view ) + { + return true; + } + + /*! + * View execution routine. Executes this process instance on the specified + * target \a view. Returns true if execution took place successfully; false + * in the event of error. + * + * This function must be reimplemented in process instance classes that can + * be executed on views. By default, all instances are supposed to be + * executable on views. To prevent view execution, an instance class should + * reimplement the CanExecuteOn() member function. + * + * Exceptions can be freely thrown from this function; they will be caught + * and handled automatically by core PCL routines. For this reason, + * reimplementations of this function rarely return false when an error + * occurs; they prefer throwing exceptions instead. + * + * \note The default implementation of this function throws a runtime + * exception. This has been done on purpose to recall you that this function + * must be reimplemented for processes with view execution capabilities. + */ + virtual bool ExecuteOn( View& view ); + + /*! + * This function is called just after execution of this process instance on + * the specified \a view. + * + * %ProcessImplementation instance classes rarely reimplement this function. + * It can be useful as a place to perform some cleanup work after execution. + * + * When this function is invoked, the specified \a view has been completely + * processed. This includes a full history update (if appropriate), all + * involved notifications sent, and its screen rendition fully regenerated. + */ + virtual void AfterExecution( View& view ) + { + } + + /*! + * Returns true iff this process instance could be successfully executed on + * the passed \a image. + * + * \param image Reference to an ImageVariant object on which this process + * is being tested to validate execution. + * + * \param[out] whyNot If this function returns false, it should return + * also a brief text (128 characters maximum) in this string, + * explaining why this instance be executed on the + * passed \a image. + * + * This function will only be called for processes able to be executed on + * standalone images, that is, for processes that reimplement the following + * member function: + * + * bool MetaProcess::CanProcessImages() const + * + * to return true. Note that the default implementation of the above + * function returns false, so a process cannot be executed on %ImageVariant + * instances by default. + * + * Don't confuse standalone \e image execution with \e view execution, which + * corresponds to the ExecuteOn( View& ) member function. + * + * \note The default implementation of this function returns true, so by + * default an instance of a process able to be executed on standalone images + * can be executed on any image. + */ + virtual bool CanExecuteOn( const ImageVariant& image, String& whyNot ) const; + + /*! + * Image execution routine. Executes this process instance on the specified + * target \a image. Returns true if execution was successful; false in the + * event of error. + * + * \param image Reference to an ImageVariant object that transports the + * image to be processed. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image is processed. A process can + * simply ignore all of these hints, or just look for one or more + * hints that it recognizes and supports, ignoring others. When two + * or more hints are specified, they must be separated by space + * characters (0x20). File formats also support hints in a similar + * way; see for example the FileFormatInstance::Open() member + * function for more information. + * + * This function must be reimplemented by processes that can be executed on + * standalone images. To enable this functionality, the following member + * function: + * + * bool MetaProcess::CanProcessImages() const + * + * must be reimplemented to return true, since it returns false by default. + * Otherwise this function will never be called. + * + * By default, an instance of a process able to be executed on standalone + * images is supposed to be executable on \e any image. To prevent image + * execution selectively, for example as a function of image properties, an + * instance class should reimplement: + * + * bool ProcessImplementation::CanExecuteOn( const ImageVariant&, String& ) const + * + * Exceptions can be freely thrown from this function; they will be caught + * and handled automatically by core PCL routines. For this reason, + * reimplementations of this function rarely return false when an error + * occurs; they prefer throwing exceptions instead. + * + * \note The default implementation of this function throws a runtime + * exception. This has been done on purpose to recall you that this function + * must be reimplemented for processes with image execution capabilities. + */ + virtual bool ExecuteOn( ImageVariant& image, const IsoString& hints ); + + /*! + * Returns true iff this process instance could be successfully executed in + * the global context. + * + * \param[out] whyNot If this function returns false, it should return + * also a brief text (128 characters maximum) in this string, + * explaining why this instance couldn't be executed in the + * global context. + * + * Execution in the global context occurs when a process instance is + * executed without any specific target view. In such cases we say that a + * global process is being executed. + * + * A good example of a \e pure global process is the GlobalPreferences + * process. This process allows the user modifying a number of global + * application options, but it does not apply to any image. + * + * Other processes can perform as global processes sometimes, depending on + * specific parameter values. An example is the RGBWorkingSpaceParameters + * process, which can be applied to change a view's RGB working space + * (RGBWS), or to set the parameters of the global RGBWS. + * + * Processes willing to perform global execution, either on a regular basis + * or under specific circumstances, must reimplement this function. + * + * \note The default implementation of this function returns false and + * assigns a standard message to the \a whyNot string (something like + * "The xxx process cannot be executed in the global context"). So + * by default a process instance cannot be executed in the global context. + */ + virtual bool CanExecuteGlobal( String& whyNot ) const; + + /*! + * This function is called just before execution of this process instance in + * the global context. Returns true if global execution can continue. + * + * This function is the last chance for a process instance to cancel + * execution in the global context. Reimplement it if you need to do + * something that the user should be aware of before global execution, + * giving her an opportunity to stop this process. + * + * \note The default implementation of this function returns true, so by + * default global execution is not stopped by this function. + */ + virtual bool BeforeGlobalExecution() + { + return true; + } + + /*! + * Global execution routine. Executes this process instance in the global + * context. Returns true if execution took place successfully; false in + * the event of error. + * + * This function must be reimplemented in process instance classes that can + * be executed globally. By default, instances cannot be executed globally. + * To allow global execution, an instance class should reimplement the + * CanExecuteGlobal() member function. + * + * Exceptions can be freely thrown from this function; they will be caught + * and handled automatically by core PCL routines. For this reason, + * reimplementations of this function rarely return false when an error + * occurs; they prefer throwing exceptions instead. + * + * \note The default implementation of this function throws a runtime + * exception. This has been done on purpose to recall you that this function + * must be reimplemented for processes with global execution capabilities. + */ + virtual bool ExecuteGlobal(); + + /*! + * This function is called just after execution of this process instance in + * the global context. + * + * %ProcessImplementation instance classes rarely reimplement this function. + * It can be useful as a place to perform some cleanup work after execution. + */ + virtual void AfterGlobalExecution() + { + } + + /*! + * Returns the address of an interface appropriate to edit this process + * instance. Returns zero if there is no available interface for this + * process instance. + * + * This function is called when an existing instance is activated in the + * core application's GUI (e.g., by double-clicking a process icon). When + * the process is selected in a generic way (e.g., from the %ProcessImplementation + * Explorer window), MetaProcess::DefaultInterface() is called instead. + * + * This function must be reimplemented if multiple interfaces are + * available for this process class that are selectable on a per-instance + * basis. + * + * \note Reimplementing this function is very infrequent. This is because + * the default implementation just returns MetaProcess::DefaultInterface(), + * which is adequate for processes associated to a single interface, as are + * the majority of them. + */ + virtual ProcessInterface* SelectInterface() const + { + return meta->DefaultInterface(); // by default, process instances use + // their default interfaces. + } + + /*! + * Returns true iff the specified interface is a valid interface for this + * process instance. + * + * This function is called when this instance is about to be imported by a + * process interface, to validate the import operation. + * + * \note This function is rarely reimplemented, for similar reasons to those + * exposed in the documentation for SelectInterface(). The default + * implementation of this function returns true if the specified interface + * is the same one that is returned by SelectInterface(). + */ + virtual bool IsValidInterface( const ProcessInterface* i ) const + { + return i == SelectInterface(); + } + + /*! + * This function is called just before reading this process instance from an + * input stream, as a disk file. Returns true if the reading procedure can + * continue. + * + * This function is not intended to allow or disallow instance reading + * operations based on source data contents. For that reason, this function + * doesn't receive a reference to the input stream from which this instance + * is about to be read. + * + * The purpose of this function is preparing process instances to receive + * new parameters. This allows for a high degree of optimization in the + * implementation of actual parameter data and their acquisition. + * + * \note The default implementation of this function returns true, so by + * default instance reading is not stopped by this function. + */ + virtual bool BeforeReading() + { + return true; + } + + /*! + * This function is called just after this process instance has been read + * from an input stream, as a disk file. + * + * You usually should need a reimplementation of this function if you also + * reimplemented BeforeReading(). Read the documentation for that member + * function for more information. + * + * \note The default implementation of this function does nothing. + */ + virtual void AfterReading() + { + } + + /*! + * This function is called just before writing this process instance to an + * output stream, as a disk file. Returns true if the writing procedure can + * continue. + * + * This function is not intended to allow or disallow instance writing + * operations based on target stream contents or properties. For that + * reason, this function doesn't receive a reference to the output stream + * to which this instance is about to be written. + * + * The purpose of this function is preparing process instances to export + * their parameters. This allows for a high degree of optimization in the + * implementation of actual parameter data and their availability. + * + * \note The default implementation of this function returns true, so by + * default instance writing is not stopped by this function. + */ + virtual bool BeforeWriting() const + { + return true; + } + + /*! + * This function is called just after this process instance has been written + * to an output stream, as a disk file. + * + * You usually should need a reimplementation of this function if you also + * reimplemented BeforeWriting(). Read the documentation for that member + * function for more information. + * + * \note The default implementation of this function does nothing. + */ + virtual void AfterWriting() const + { + } + + /*! + * Returns the fixed address of an actual parameter in this process + * instance, and locks it while the core application requires direct access + * to its data. + * + * \param p The address of a metaparameter that identifies the parameter + * being locked. + * + * \param tableRow The index of a table row where the requested parameter + * is defined. For parameters not belonging to tables, this + * parameter must be ignored. + * + * The PixInsight core application calls this function to get the actual + * address of a parameter in this process instance. The parameter should not + * be destroyed, changed or moved physically in memory until the + * UnlockParameter() member function is invoked for this instance with the + * same \a p and \a tableRow arguments. + * + * Once UnlockParameter() has been called for a specific parameter, it can + * be freely moved, allocated or deallocated by this process instance. + * + * \note Reimplementing this function is \e mandatory for processes defining + * parameters. + */ + virtual void* LockParameter( const MetaParameter* p, size_type tableRow ); + + /*! + * This function is called by the core application after LockParameter(), + * when direct access to an specified actual parameter is no longer needed. + * + * \param p The address of a metaparameter that identifies the parameter + * being unlocked. + * + * \param tableRow The index of a table row where the requested parameter + * is defined. For parameters not belonging to tables, this + * parameter must be ignored. + * + * When this function is invoked, the instance is free to move or change the + * parameter, until the next call to LockParameter() with the same \a p and + * \a tableRow arguments. + * + * \note This function is not called if the corresponding + * MetaParameter::NeedsUnlocking() member function has not been + * reimplemented to return true in the derived class that the specified + * parameter \a *p is an instance of. + */ + virtual void UnlockParameter( const MetaParameter* p, size_type tableRow ); + + /*! + * This function is called to validate a parameter value for an actual + * parameter in this process instance. Returns true if the specified value + * is a valid value for the specified parameter in this instance. + * + * \param value Pointer to the parameter value being tested. + * + * \param p The address of a metaparameter that identifies the + * parameter being validated. + * + * \param tableRow The index of a table row where the requested parameter + * is defined. For parameters not belonging to tables, this + * parameter must be ignored. + * + * \note This function is not called if the corresponding + * MetaParameter::NeedsValidation() member function has not been + * reimplemented to return true in the derived class that the specified + * parameter \a *p is an instance of. + */ + virtual bool ValidateParameter( void* value, const MetaParameter* p, size_type tableRow ) const; + + /*! + * Allocates the required space to store a variable-length parameter value + * of the specified length or size. Returns true if the necessary space was + * successfully allocated. + * + * \param sizeOrLength Requested size in bytes or length in elements of the + * parameter value being allocated. + * + * \param p The address of a metaparameter that identifies the + * variable-length parameter being allocated. + * + * \param tableRow The index of a table row where the requested parameter + * is defined. For parameters not belonging to tables, this + * parameter must be ignored. + * + * For table parameters, \a sizeOrLength is a row count. For a string + * parameter, \a sizeOrLength is a string length in characters. For a block + * parameter, \a sizeOrLength is a block size in bytes. + * + * \note Reimplementing this function is \e mandatory for processes defining + * variable-length parameters. + */ + virtual bool AllocateParameter( size_type sizeOrLength, const MetaParameter* p, size_type tableRow ); + + /*! + * Returns the length or size of an actual variable-length parameter in this + * process instance. + * + * \param p The address of a metaparameter that identifies the + * variable-length parameter. + * + * \param tableRow The index of a table row where the requested parameter + * is defined. For parameters not belonging to tables, this + * parameter must be ignored. + * + * For tables, you must reimplement this function to return the current + * number of rows. For strings, you must return the string length in + * characters (\e not bytes). For blocks, you must return the size in bytes. + * + * \note Reimplementing this function is \e mandatory for processes defining + * variable-length parameters. + */ + virtual size_type ParameterLength( const MetaParameter* p, size_type tableRow ) const; + + /*! + * Launches this process instance. + * + * This function will lead to one of the following actions, in decreasing + * order of priority: + * + * \li The SelectInterface() member function will be called for this + * instance. If the returned interface is valid, it will be activated and + * a copy of this instance will be imported. + * + * \li If the MetaProcess::PrefersGlobalExecution() member function of the + * metaprocess associated to this instance returns true, or if no current + * view is available, a new thread will be created to execute this instance + * in the global context. + * + * \li If the MetaProcess::PrefersGlobalExecution() member function of the + * metaprocess associated to this instance returns false, and there is a + * current view available, a new thread will be created to execute this + * instance on the current view. + * + * \li A run-time exception will be thrown indicating that this instance + * cannot be executed. + */ + void Launch() const; + + /*! + * Launches a process interface for this process instance. + * + * The SelectInterface() member function will be called for this instance. + * The returned interface will be activated, and a copy of this instance + * will be imported. + */ + void LaunchInterface() const; + + /*! + * Execute this instance in the global context. + */ + void LaunchGlobal() const; + + /*! + * Executes this instance on the current view. + */ + void LaunchOnCurrentView() const; + + /*! + * Executes this instance in the current window or, more precisely, on its + * main view. + */ + void LaunchOnCurrentWindow() const; + + /*! + * Executes this instance on the specified view. + */ + void LaunchOn( View& ) const; + + /*! + * Executes this instance on the main view of the specified image window. + */ + void LaunchOn( ImageWindow& ) const; + +protected: + + const MetaProcess* meta = nullptr; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ProcessImplementation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProcessImplementation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProcessInstance.h b/3rdparty/include/pcl/ProcessInstance.h new file mode 100644 index 0000000..6cc8e9f --- /dev/null +++ b/3rdparty/include/pcl/ProcessInstance.h @@ -0,0 +1,701 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProcessInstance.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProcessInstance_h +#define __PCL_ProcessInstance_h + +/// \file pcl/ProcessInstance.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS Process; +class PCL_CLASS ImageWindow; +class PCL_CLASS View; + +/*! + * \class ProcessInstance + * \brief High-level interface to a process instance. + * + * %ProcessInstance, along with %Process, provides access to any installed + * process through intermodule communication. + * + * %ProcessInstance represents a live instance of an installed process that can + * be edited (by setting parameter values) and executed. + * + * \sa Process + */ +class PCL_CLASS ProcessInstance : public UIObject +{ +public: + + /*! + * Constructs this object as a reference to a new instance of the specified + * \a process. The newly created instance has a set of default parameter + * values. + */ + ProcessInstance( const Process& process ); + + /*! + * Copy constructor. The newly constructed object references the same + * server-side process instance as the specified object \a p. + * + * \note Note that this constructor does not generate a new process + * instance. It just constructs a high-level reference to an existing + * process instance. + */ + ProcessInstance( const ProcessInstance& p ) : UIObject( p ) + { + } + + /*! + * Destroys a process instance. + * + * After destruction of this object, the server-side process instance is + * also destroyed (garbage-collected) if it is no longer referenced by other + * %ProcessInstance objects. + */ + virtual ~ProcessInstance() + { + } + + /*! + * Returns a reference to a null process instance. A null + * %ProcessInstance object does not correspond to an existing process + * instance in the PixInsight core application. + */ + static ProcessInstance& Null(); + + /*! + * Returns a Process object that represents the installed process that + * this instance belongs to. + */ + Process ParentProcess() const; + + /*! + * Assignment operator. Returns a reference to this object. + * + * Makes this object reference the same server-side process instance as the + * specified object \a p. If the previous instance becomes unreferenced, it + * will be garbage-collected by the PixInsight core application. + */ + ProcessInstance& operator =( const ProcessInstance& p ) + { + SetHandle( p.handle ); + return *this; + } + + /*! + * Generates a uniquely referenced, newly created process instance as a + * duplicate of the instance referenced by this object, and returns a + * high-level reference to it as a new %ProcessInstance object. + */ + ProcessInstance Clone() const; + + /*! + * Assigns the parameters of a process instance referenced by the specified + * object \a p to the instance referenced by this object. Returns true if + * the assignment operation was successful; false in the event of error. + * + * Note that this member function does \e not do the same as an assignment + * operator or a copy constructor, because the latter two operations simply + * cause this object to reference an existing server-side instance (and + * possibly leave a previous instance unreferenced). This member function + * does not generate a new process instance and does not change existing + * references to server-side objects; it just copies process parameters (and + * probably other module-dependent data) from one existing instance to + * another. + * + * \note For this member function to success, the parent Process has to be + * an assignable process. Assignable processes return true from + * reimplemented Process::IsAssignable() virtual functions. + */ + bool Assign( const ProcessInstance& p ); + + /*! + * Requests the parent process to validate this process instance. Returns + * true upon successful validation; false if the instance is not valid, or + * in the event of error. + * + * If this member function returns false, the process should return a + * description of the reasons to not validate the instance in the string + * \a whyNot. If the function returns true, the string \a whyNot will be + * cleared (so it will be empty and its previous contents will be lost). + */ + bool Validate( String& whyNot ); + + /*! + * Returns true iff this process instance will modify the process history of + * the specified \a view, in case it is executed on it. + * + * If this member function returns false, then this instance can be safely + * executed on the \a view as a read-only process; the view won't be + * modified in any way. + */ + bool IsHistoryUpdater( const View& view ) const; + + /*! + * Returns true iff this process instance can be masked with the specified + * image \a window when executed on the specified \a view. + * + * When a process is masked, its result is mixed with the image in the state + * it was before execution, according to the values of a mask image. This + * process is carried out automatically by the PixInsight core application. + */ + bool IsMaskable( const View& view, const ImageWindow& mask ) const; + + /*! + * Validates execution of this process instance on the specified \a view. + * Returns true iff this instance can be executed on the view. + * + * If this member function returns false, the process should return in the + * string \a whyNot a description of the reasons why this instance cannot be + * executed on the specified \a view. If the function returns true, the + * string \a whyNot will be cleared (so it will be empty and its previous + * contents will be lost). + */ + bool CanExecuteOn( const View& view, String& whyNot ) const; + + /*! + * Executes this process instance on the specified \a view. Returns true + * upon successful execution; false in the event of error. + * + * The optional \a swapFile argument allows the caller to control generation + * of swap data as part of the instance execution. If \a swapFile is true + * (the default value), the PixInsight core application will save the + * previous state of the target \a view before instance execution. In this + * case the executed instance will be appended to the view's process history + * in the usual way, and the process will be undoable. + * + * If \a swapFile is false, the previous state of the view is not saved, the + * instance is not added to the view's history, and the process cannot be + * undone after execution. In this case the caller module is responsible for + * leaving the image transported by \a view in a valid and predictable + * state. Keep in mind that if no swap data are generated before excution, + * the user has no way to restore the previous state of the image, and also + * has no way to control the sequence of processes that have given rise to + * the current state of the image. If these side effects are not correctly + * controlled and handled by the calling module, they will violate basic + * design principles of the PixInsight platform, and hence they can be a + * good reason for denying certification of a module. + * + * This member function is typically called with the \a swapFile argument + * set to false by processes that execute other processes to implement their + * own tasks. For example, the standard %ProcessContainer process (which is + * internal to the core application) does exactly this to execute a sequence + * of processes as a unique step in a view's process history. Another case + * where \a swapFile should be set to false is when a process generates a + * new image as a result of running a sequence of processes, but it wants to + * appear as the unique process in the initial state element of the + * view's process history. + */ + bool ExecuteOn( View& view, bool swapFile = true ); + + /*! + * Returns true iff this process instance can be executed in the global + * context. + * + * If this member function returns false, the process should return in the + * string \a whyNot a description of the reasons why this instance cannot be + * executed on the global context. If the function returns true, the string + * \a whyNot will be cleared (so it will be empty and its previous contents + * will be lost). + * + * A process is executed in the global context when it is not explicitly + * executed on a particular view. Two well-known examples of global + * processes are Preferences and ReadoutOptions. Note that a process can + * work both globally and on views. For example, the PixelMath process can + * work globally to generate new images, or locally when it is executed on a + * target view. + */ + bool CanExecuteGlobal( String& whyNot ) const; + + /*! + * Executes this process instance on the global context. Returns true upon + * successful execution; false in the event of error. + * + * See the documentation for CanExecuteGlobal() for additional comments on + * process execution contexts. + */ + bool ExecuteGlobal(); + + /*! + * Validates execution of this process instance on the specified \a image. + * Returns true iff this instance can be executed on the image. + * + * If this member function returns false, the process should return in the + * string \a whyNot a description of the reasons why this instance cannot be + * executed on the specified \a image. If the function returns true, the + * string \a whyNot will be cleared (so it will be empty and its previous + * contents will be lost). + */ + bool CanExecuteOn( const ImageVariant& image, String& whyNot ) const; + + /*! + * Executes this process instance on the specified \a image. Returns true + * upon successful execution; false in the event of error. + * + * \param image Reference to an ImageVariant object that transports the + * image to be processed. + * + * \param hints A string containing a (possibly empty) list of \e hints + * intended to modify the way an image is processed. A process can + * simply ignore all of these hints, or just look for one or more + * hints that it recognizes and supports, ignoring others. When two + * or more hints are specified, they must be separated by space + * characters (0x20). File formats also support hints in a similar + * way; see for example the FileFormatInstance::Open() member + * function for more information. The default value is an empty + * string. + */ + bool ExecuteOn( ImageVariant& image, const IsoString& hints = IsoString() ); + + bool ExecuteOn( ImageVariant& image, const IsoString::ustring_base& hints ) + { + return ExecuteOn( image, IsoString( hints ) ); + } + + /*! + * Launches this process instance. + * + * If this process has an associated default interface, then its top level + * window is shown and activated, and this instance is \e imported by the + * interface. After importing this instance, the interface will show its + * parameter values. + * + * If this process has no default interface, then the core application + * attempts to execute this instance. If the process prefers global + * execution (see the Process::PrefersGlobalExecution() member function), + * then this instance will be executed in the global context; otherwise it + * will be executed on the current view, if there is at least one image + * available. + * + * Returns true if this instance was successfully launched; false in the + * event of error, or if the core application was unable to launch or + * execute the instance. + */ + bool Launch(); + + /*! + * Returns true iff this process instance is able to open and activate a + * process interface. + * + * Normally, each process has an associated interface that can always be + * launched through any existing (and valid) instance of the appropriate + * process class. However, there are some processes for which an interface + * does not make sense. A well-known example is the Invert process. + */ + bool CanLaunchInterface() const; + + /*! + * Opens and activates the interface associated to this process, and causes + * it to import this instance. After importing this instance, the interface + * will show its parameter values. Returns true if the interface could be + * successfully launched; false in the event of error. + */ + bool LaunchInterface(); + + /*! + * Returns the descriptive text currently associated with this process + * instance, or an empty string if this instance has no description. + * + * In PixInsight, each process instance has an associated text that the user + * can edit to describe the purpose and conditions of the applied processes. + * This feature is an extremely useful and efficient way to document a + * processing procedure. + */ + String Description() const; + + /*! + * Sets the descriptive text for this process instance. + * + * Instance descriptions can make use of the whole formating capabilities of + * PixInsight consoles; see the Console class for more information. + */ + void SetDescription( const String& text ); + + /*! + * Gets the running times for the latest execution of this process instance. + * + * \param[out] startJD Starting execution time as a Julian day number. + * + * \param[out] elapsedSecs Total elapsed execution time in seconds. + * + * If this instance has never been executed, or if the execution times have + * not been recorded for some reason, both output values are set to zero. + */ + void GetExecutionTimes( double& startJD, double& elapsedSecs ) const; + + /*! + * Returns the time when this process instance was last executed as a Julian + * day number. If this instance has never been executed, or if the execution + * time has not been recorded for some reason, this function returns zero. + */ + double StartJD() const + { + double startJD, dum; + GetExecutionTimes( startJD, dum ); + return startJD; + } + + /*! + * Returns the total elapsed time in seconds for the latest execution of + * this process instance, or zero if either this instance has never been + * executed, or if the execution time has not been recorded for some reason. + */ + double ElapsedTime() const + { + double dum, elapsedSecs; + GetExecutionTimes( dum, elapsedSecs ); + return elapsedSecs; + } + + /*! + * Returns a source code representation of this process instance. + * + * \param language The language to use for the source code representation. + * Currently the only languages supported are "JavaScript" + * and "XPSM 1.0". The default language is JavaScript. + * + * \param varId The identifier of a variable that will be used to + * represent this instance. If an empty string is + * specified (which is the default value), the PixInsight + * core application wll assign a default identifier. This + * identifier only applies to JavaScript source code + * representations, not to XML representations. + * + * \param indent Indentation distance in characters. This is a constant + * number of white space characters (0x20) that will be + * prepended to each source code line. The default value + * is zero. + * + * The source code generated by this function can be used directly for + * serialization of process instances in the specified language. + */ + String ToSource( const IsoString& language = "JavaScript", + const IsoString& varId = IsoString(), int indent = 0 ) const; + + /*! + * Returns a process instance generated from the specified \a source code. + * + * \note This member function is still not implemented; it will be + * implemented in a future version of PCL. For now, this function always + * returns a null process instance. + */ + static ProcessInstance FromSource( const String& source, + const IsoString& language = "JavaScript" ); + + /*! + * Returns a process instance generated as a duplicate of the instance + * transported by a process icon with the specified identifier \a iconId. + * + * Returns a null instance if the specified icon does not exist, or if an + * icon exists with the specified identifier but it is not a process icon + * (e.g., an image icon). + */ + static ProcessInstance FromIcon( const IsoString& iconId ); + + static ProcessInstance FromIcon( const IsoString::ustring_base& iconId ) + { + return FromIcon( IsoString( iconId ) ); + } + + /*! + * Returns a string list with the identifiers of all existing process icons, + * or an empty list if there are no process icons. + */ + static IsoStringList Icons(); + + /*! + * Returns a string list with the identifiers of all existing process icons + * transporting instances of the specified process, or an empty list if no + * such icons exist. + */ + static IsoStringList IconsByProcessId( const IsoString& processId ); + + static IsoStringList IconsByProcessId( const IsoString::ustring_base& processId ) + { + return IconsByProcessId( IsoString( processId ) ); + } + + /*! + * Returns the value of a process parameter. + * + * \param parameter Reference to an existing parameter in the parent + * process of this instance (see Process::Parameters()). + * + * \param rowIndex Zero-based index of the table row, when the specified + * \a parameter is a table column parameter. Must be + * within the range of existing rows for the corresponding + * table parameter in this instance, that is, from zero to + * the number of table rows minus one. If \a parameter is + * not a table column parameter this argument is ignored. + * + * If the specified \a parameter is a table process parameter, this member + * function throws an Error exception. A table process parameter does not + * have a value, and its contents cannot be retrieved directly as a whole. + * + * Note that the default value of the \a rowIndex argument is an impossible + * row index number: ~size_type(0). This value has been selected on purpose + * in order to force the caller to specify a row index when \a parameter is + * a table column parameter. This is a simple but effective security + * mechanism to robustify parameter access code: if no row index is + * specified for a table column parameter, this member function will always + * return an invalid %Variant object (see below). + * + * This member function returns a Variant object with the current value of + * the specified parameter or table cell parameter in this instance. An + * invalid %Variant object is returned in the following cases: + * + * \li If the specified \a parameter is not a valid parameter of the parent + * process. + * + * \li If \a parameter is a table column parameter and the specified + * \a rowIndex is larger than or equal to the number of existing rows for + * the parent table parameter in this instance. + * + * The calling process should always check Variant::IsValid() for the + * objects returned by this function. + */ + Variant ParameterValue( const ProcessParameter& parameter, size_type rowIndex = ~size_type( 0 ) ) const; + + /*! + * Returns the value of a process parameter. + * + * This is an overloaded member function, provided for convenience. It + * allows retrieving parameter values using parameter identifiers instead of + * references to ProcessParameter objects. Otherwise this member function + * behaves exactly like + * ParameterValue( const ProcessParameter&, size_type ) const + */ + Variant ParameterValue( const IsoString& parameterId, size_type rowIndex = ~size_type( 0 ) ) const + { + return ParameterValue( ProcessParameter( ParentProcess(), parameterId ), rowIndex ); + } + + Variant ParameterValue( const IsoString::ustring_base& parameterId, size_type rowIndex = ~size_type( 0 ) ) const + { + return ParameterValue( IsoString( parameterId ), rowIndex ); + } + + /*! + * Sets the value of a process parameter. + * + * \param value New parameter value. The specified Variant object must + * transport an object of either the same type as the + * \a parameter whose value will be changed, or of a type + * that can legally be converted to the corresponding + * parameter type. The value must also observe the limits + * imposed by the parent process regarding acceptable + * values, numeric ranges, etc. + * + * \param parameter Reference to an existing parameter in the parent + * process of this instance (see Process::Parameters()). + * + * \param rowIndex Zero-based index of the table row, when the specified + * \a parameter is a table column parameter. Must be + * within the range of existing rows for the corresponding + * table parameter in this instance, that is, from zero to + * the number of table rows minus one. If \a parameter is + * not a table column parameter this argument is ignored. + * + * If the specified \a parameter is a table process parameter, this member + * function throws an Error exception. A table process parameter does not + * have a value, and its contents cannot be set directly as a whole. + * + * Note that the default value of the \a rowIndex argument is an impossible + * row index number: ~size_type(0). This value has been selected on purpose + * in order to force the caller to specify a row index when \a parameter is + * a table column parameter. This is a simple but effective security + * mechanism to robustify parameter access code: if no row index is + * specified for a table column parameter, this member function will always + * return false. + * + * The \a value must observe the limits imposed by the parent process + * regarding valid numeric ranges, length limits, acceptable characters, + * etc., depending on parameter types. This member function returns true iff + * the parameter value could be set correctly. If the type of \a value + * cannot be converted to the required parameter type, an Error exception is + * thrown with the appropriate error message. + * + * \note To set the values of table column parameters, the necessary table + * rows must be allocated \e before calling this member function. To + * allocate table rows, use the AllocateTableRows() member function. + */ + bool SetParameterValue( const Variant& value, + const ProcessParameter& parameter, size_type rowIndex = ~size_type( 0 ) ); + + /*! + * Sets the value of a process parameter. + * + * This is an overloaded member function, provided for convenience. It + * allows changing parameter values using parameter identifiers instead of + * references to ProcessParameter objects. Otherwise this member function + * behaves exactly like + * SetParameterValue( const Variant&, const ProcessParameter&, size_type ) + */ + bool SetParameterValue( const Variant& value, const IsoString& parameterId, size_type rowIndex = ~size_type( 0 ) ) + { + return SetParameterValue( value, ProcessParameter( ParentProcess(), parameterId ), rowIndex ); + } + + bool SetParameterValue( const Variant& value, const IsoString::ustring_base& parameterId, size_type rowIndex = ~size_type( 0 ) ) + { + return SetParameterValue( value, IsoString( parameterId ), rowIndex ); + } + + /*! + * Returns the number of existing rows in a table process parameter. + * + * \param table Reference to a table parameter in the parent process. + * + * If the specified parameter is not a table process parameter of the parent + * process, this member function returns zero. + */ + size_type TableRowCount( const ProcessParameter& table ) const; + + /*! + * Returns the number of existing rows in a table process parameter. + * + * This is an overloaded member function, provided for convenience. It + * returns the number of existing table rows using parameter identifiers + * instead of references to ProcessParameter objects. Otherwise this member + * function behaves exactly like + * TableRowCount( const ProcessParameter& ) const + */ + size_type TableRowCount( const IsoString& tableId ) const + { + return TableRowCount( ProcessParameter( ParentProcess(), tableId ) ); + } + + size_type TableRowCount( const IsoString::ustring_base& tableId ) const + { + return TableRowCount( IsoString( tableId ) ); + } + + /*! + * Allocates table rows for a table process parameter. + * + * \param table Reference to a table parameter in the parent process. + * + * \param rowCount Number of table rows to allocate. If the parameter has + * table row limitations, this value must be within the + * acceptable range. + * + * Calling this member function deallocates all previously existing table + * rows in this instance, if there were any. Table rows cannot be appended + * neither deleted selectively; the whole table parameter is reallocated as + * a whole each time this member function is called. Calling this function + * with \a rowCount set to zero (if zero rows are acceptable for the + * specified \a table parameter) effectively deallocates the whole table + * parameter in this instance. + * + * Returns true if the specified number of rows could be allocated + * successfully in this process instance; false in the event of error. + */ + bool AllocateTableRows( const ProcessParameter& table, size_type rowCount ); + + /*! + * Allocates table rows for a table process parameter. + * + * This is an overloaded member function, provided for convenience. It + * allows reallocating a table parameter rows using a parameter identifier + * instead of a reference to a ProcessParameter object. Otherwise this + * member function behaves exactly like + * AllocateTableRows( const ProcessParameter&, size_type ) + */ + bool AllocateTableRows( const IsoString& tableId, size_type rowCount ) + { + return AllocateTableRows( ProcessParameter( ParentProcess(), tableId ), rowCount ); + } + + bool AllocateTableRows( const IsoString::ustring_base& tableId, size_type rowCount ) + { + return AllocateTableRows( IsoString( tableId ), rowCount ); + } + +private: + + ProcessInstance( void* h ) : UIObject( h ) + { + } + + ProcessInstance( const void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class ProcessInstancePrivate; + friend class InterfaceDispatcher; + friend class InternalIconEnumerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ProcessInstance_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProcessInstance.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProcessInterface.h b/3rdparty/include/pcl/ProcessInterface.h new file mode 100644 index 0000000..ebd255b --- /dev/null +++ b/3rdparty/include/pcl/ProcessInterface.h @@ -0,0 +1,2618 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProcessInterface.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProcessInterface_h +#define __PCL_ProcessInterface_h + +/// \file pcl/ProcessInterface.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::InterfaceFeature + * \brief Provides symbolic constants defining feature flags to customize + * process interfaces. + * + * Besides defining their specific GUI components and behavior, process + * interfaces can be customized in a standardized way by means of a series of + * flags that control the contents and functionality of their interface + * control bars. Those flags are defined through symbolic constants in the + * InterfaceFeature namespace. + * + * An interface control bar is a managed control located at its parent + * interface window's bottom side. It is a relatively small panel where a + * number of standard tool buttons and a one-line text area can be customized. + * + * A standard process interface window has the following layout in PixInsight: + * + *

+ *    +---------------------------------+
+ *    |      Interface Title Bar        +
+ *    +---------------------------------+
+ *    |                                 |
+ *    |     Module-Defined              |
+ *    |     Interface Client Area       |
+ *    |                                 |
+ *    +---------------------------------+
+ *    | Info Area                       |
+ *    +---------------------------------+
+ *    | D A G T E X             B V P R |
+ *    +---------------------------------+
+ * 
+ * + * Where the two sections at the bottom form the interface's + * control bar: + * + * \li Info Area is a one-line text label that can be used to provide + * some feedback and information to the user. The contents of the info area can + * be modified programmatically, but cannot be changed by the user. + * + * \li D = %Process Drag %Object, used to create a new process instance + * by dragging it with the mouse. The new instance can be dragged for execution + * on selected views, to create process icons, to add instances to a process + * container, etc. + * + * \li A = Apply button, used for execution of a new process instance on + * the current view or window. + * + * \li G = Apply Global button, used for execution of a new process + * instance in the global context. + * + * \li T = Real-Time %Preview button, to attach this interface to the + * real-time previewing system. + * + * \li E = Execute button, used to commit execution of a dynamic + * interface. + * + * \li X = Cancel button, used to cancel execution of a dynamic + * interface. + * + * \li B = Browse Documentation button. When this button is activated, + * the default behavior is to open the Documentation Browser interface and load + * it with the documentation for the process for which this open the %Process + * Explorer window and show the . + * + * \li V = Track %View check box. When this check box is checked, the + * interface should modify its behavior in some way as a function of the + * current view. This check box generates calls to + * ProcessInterface::TrackViewUpdated(). Interfaces using this feature + * also need receiving ProcessInterface::ImageFocused() notifications. + * + * \li P = Preferences button, to open a modal dialog box where + * process and interface-specific preferences can be edited. + * + * \li R = Reset button, to reset the current instance to a default + * state. + * + * The following symbolic constants have been publicly defined for interface + * feature flags: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
InterfaceFeature::None This effectively suppresses a interface's control bar
InterfaceFeature::DragObject %Process drag object - To generate new process instances
InterfaceFeature::ApplyToViewButton Apply button - To execute a process on the active view
InterfaceFeature::ApplyGlobalButton Apply Global button - To execute a process in the global context
InterfaceFeature::RealTimeButton Real-Time Preview button - To activate the real-time preview interface
InterfaceFeature::ExecuteButton Execute button - To commit a dynamic interface
InterfaceFeature::CancelButton Cancel button - To cancel a dynamic interface
InterfaceFeature::BrowseDocumentationButton Browse documentation button - Browse process-specific documentation
InterfaceFeature::TrackViewButton Track View check box - To activate/deactivate tracking of the current view
InterfaceFeature::PreferencesButton Preferences button - To edit process and interface-specific preferences
InterfaceFeature::ResetButton Reset button - To reset process instance parameters
InterfaceFeature::InfoArea Info Area - To create a single-line text area
InterfaceFeature::Default A default set of flags for static interfaces
InterfaceFeature::DefaultGlobal A default set of flags for static interfaces that execute globally
InterfaceFeature::DefaultDynamic A default set of flags for dynamic interfaces
+ * + * More functionality can be added to interface control bars in future + * PixInsight and PCL releases. + */ +namespace InterfaceFeature +{ + enum mask_type + { + None = 0x00000000, // This effectively suppresses a interface's control bar + DragObject = 0x00000001, // Process drag object - To generate new process instances + ApplyToViewButton = 0x00000002, // Apply button - To execute a process on the active view + ApplyGlobalButton = 0x00000004, // Apply Global button - To execute a process in the global context + RealTimeButton = 0x00000008, // Real-Time Preview button - To activate the real-time preview interface + ExecuteButton = 0x00000010, // Execute button - To commit a dynamic interface + CancelButton = 0x00000020, // Cancel button - To cancel a dynamic interface + BrowseDocumentationButton = 0x00000080, // Browse Documentation button - To browse process-specific documentation + TrackViewButton = 0x00000100, // Track View check box - To activate/deactivate tracking of the current view + PreferencesButton = 0x00000400, // Preferences button - To edit process and interface-specific preferences + ResetButton = 0x00000800, // Reset button - To reset process instance parameters + InfoArea = 0x00010000, // Info Area - To create a single-line text area + Default = DragObject | ApplyToViewButton | BrowseDocumentationButton | ResetButton, // A default set of flags for static interfaces + DefaultGlobal = DragObject | ApplyGlobalButton | BrowseDocumentationButton | ResetButton, // A default set of flags for static interfaces that execute globally + DefaultDynamic = DragObject | ExecuteButton | CancelButton | BrowseDocumentationButton | ResetButton // A default set of flags for dynamic interfaces + }; +} + +/*! + * \class pcl::InterfaceFeatures + * \brief A collection of interface feature flags. + */ +typedef Flags InterfaceFeatures; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +class PCL_CLASS MetaProcess; +class PCL_CLASS ProcessImplementation; +class PCL_CLASS ProcessInstance; +class PCL_CLASS VectorGraphics; +class PCL_CLASS View; + +// ---------------------------------------------------------------------------- + +/*! + * \class ProcessInterface + * \brief Client-side interface to a PixInsight process interface window. + * + * ### TODO: PCL 2.1.x: Rename this class to %ProcessInterfaceImplementation + * ### TODO: PCL 2.2: New %ProcessInterface class for intermodule communication + * + * ### TODO: Write a detailed description for %ProcessInterface. + */ +class PCL_CLASS ProcessInterface : public Control, public MetaObject +{ +public: + + /*! + * Constructs a process interface window. + */ + ProcessInterface(); + + /*! + * Destroys a %ProcessInterface object. + */ + virtual ~ProcessInterface() noexcept( false ) + { + } + + /*! + * Returns a reference to a null %ProcessInterface instance. A null + * %ProcessInterface does not correspond to an existing interface window in + * the PixInsight core application. + */ + static ProcessInterface& Null(); + + /*! + * Returns an identifier for this interface. + * + * Interface identifiers must be unique (within the set of installed + * interfaces), valid C identifiers. + * + * \note Although an arbitrary identifier can be used for a process + * interface, it is customary (and also a good idea, for the sake of + * clarity) to assign the same identifier to both a process and its + * standard interface. For example, \c FastRotation is used as the + * identifier of the FastRotation process and its interface window. + */ + virtual IsoString Id() const = 0; + + /*! + * Returns a list of alias identifiers for this interface. + * + * An interface can have one or more alias identifiers. Aliases are + * useful to maintain compatibility with previous versions of an interface. + * + * When the PixInsight core application loads a project, it automatically + * replaces alias interface identifiers with actual (current) identifiers. + * This allows a developer to change the identifier of a process interface + * without breaking compatibility with existing projects. + * + * The returned string is a comma-separated list of distinct identifiers + * that will be treated as synonyms to the actual identifier of this + * interface, which is returned by the Id() member function. Two installed + * interfaces can't have the same alias, so each identifier included in the + * list must be unique across all process interfaces on the entire + * PixInsight platform. + * + * \note The default implementation of this member function returns an empty + * string (no aliases). + * + * \sa Id() + */ + virtual IsoString Aliases() const + { + return IsoString(); + } + + /*! + * Returns a pointer to the process associated with this interface. + * + * In general, each interface window works mainly for a particular process. + * This is what is known as the standard interface of a process in + * PixInsight. + */ + virtual MetaProcess* Process() const = 0; + + /*! + * Returns a version number for this interface, encoded as a hexadecimal + * number. + * + * For example, version 1.0.5 should be returned as 0x105, and version + * 3.11.5 as 0x3B5. The default return value is 0x100, corresponding to + * version 1.0.0. + * + * \deprecated This function has been deprecated and should not be used. + * Interfaces no longer need version numbers. The value returned by this + * member function is always ignored by the PixInsight core application. + */ + virtual uint32 Version() const + { + return 0x100; + } + + /*! + * Returns a description of this interface. + * + * This function must provide a brief description of the functionality and + * purpose of this process interface. This should include which + * process(es) can be interfaced, and how. + * + * \deprecated This function has been deprecated and should not be used. + * Interfaces must be described by the process(es) that use them. The value + * returned by this member function is always ignored by the PixInsight core + * application. + */ + virtual String Description() const + { + return String(); + } + + /*! + * Returns the icon image of this process interface as a document in SVG + * format. + * + * The specified image will be used as an icon appearing on the interface + * window's title bar. To facilitate the visual identification of processes + * and their interfaces, most reimplementations of this function should + * normally return the same SVG document returned by its interfaced process' + * reimplementation of MetaProcess::IconImageSVG(). + * + * The returned string must be the source code of a valid SVG document + * representing the icon image, encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVGFile() return an empty string, or + * if the specified SVG document does not exist or is not valid, a default + * icon will be assigned to this process interface automatically by the + * PixInsight core application. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVGFile() + */ + virtual IsoString IconImageSVG() const + { + return IsoString(); + } + + /*! + * Returns the icon image of this process interface as a document in SVG + * format, stored as an external file. + * + * The specified image will be used as an icon appearing on the interface + * window's title bar. To facilitate the visual identification of processes + * and their interfaces, most reimplementations of this function should + * normally return the same SVG document returned by its interfaced process' + * reimplementation of MetaProcess::IconImageSVGFile(). + * + * The returned string must be a path to an existing file in the local + * file system (remote resources are not supported in current PCL versions), + * which must store a valid SVG document representing the icon image. The + * SVG source code must be encoded in UTF-8. + * + * Since core version 1.8.8-6, all process, interface and file format icons + * should be specified in SVG format. Raster formats, such as XPM and PNG, + * have been deprecated for this purpose. + * + * If both this function and IconImageSVG() return an empty string, or if + * the specified SVG document does not exist or is not valid, a default icon + * will be assigned to this process interface automatically by the + * PixInsight core application. + * + * Automatic Resource Location + * + * See MetaProcess::IconImageSVGFile() for important information that is + * equally applicable to this member function. + * + * \note The default implementation of this function returns an empty + * string. + * + * \sa IconImageSVG() + */ + virtual String IconImageSVGFile() const + { + return String(); + } + + /*! + * Returns a large icon for this interface as an image in the + * standard XPM format. + * + * The specified image will be used as an icon appearing on the interface + * window's title bar. To facilitate the visual identification of processes + * and their interfaces, most reimplementations of this function should + * normally return the same SVG document returned by its interfaced process' + * reimplementation of MetaProcess::IconImageXPM(). + * + * 32-bit RGBA color images (including an alpha channel) are fully + * supported. + * + * If this function returns nullptr, a default icon will be assigned to this + * interface automatically. + * + * \note The default implementation of this function returns nullptr. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process interface icons in SVG format. Existing modules should + * also be refactored in the same way to support scalable icons. + * + * \sa IconImageFile() + */ + virtual const char** IconImageXPM() const + { + return nullptr; + } + + /*! + * Returns a large icon for this interface as a path specification + * to an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on interface icon images, see the documentation for + * IconImageXPM(). + * + * \note The default implementation of this function returns an empty + * string. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process interface icons in SVG format. Existing modules should + * also be refactored in the same way to support scalable icons. + * + * \sa IconImageXPM() + */ + virtual String IconImageFile() const + { + return String(); + } + + /*! + * Returns a small icon for this interface as an image in the + * standard XPM format. + * + * For details on interface icon images, see the documentation for + * IconImageXPM(). + * + * Small icons are used on interface elements where screen space must be + * preserved. This may include iconized interface windows. When this + * function is not reimplemented in a derived class, the PixInsight core + * application automatically generates a small icon by resampling down the + * large icon provided by IconImageXPM(). + * + * You normally should not need to reimplement this function; the core + * application usually does a fine work resampling large icons to generate + * reduced versions. + * + * \note The default implementation of this function returns nullptr. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process interface icons in SVG format. Existing modules should + * also be refactored in the same way to support scalable icons. + * + * \sa SmallIconImageFile() + */ + virtual const char** SmallIconImageXPM() const + { + return nullptr; + } + + /*! + * Returns a small icon for this interface as a path specification + * to an existing image file. + * + * Supported image file formats include PNG, XPM, JPG and BMP. + * + * For details on small interface icon images, see the documentation for + * SmallIconImageXPM(). + * + * \note The default implementation of this function returns an empty + * string. + * + * \deprecated This member function has been deprecated since core version + * 1.8.8-6. It is still available for compatibility with existing modules + * that depend on it, but it will be removed in a future version of PCL. + * All newly produced code must use IconImageSVG() or IconImageSVGFile() to + * define process interface icons in SVG format. Existing modules should + * also be refactored in the same way to support scalable icons. + * + * \sa SmallIconImageXPM() + */ + virtual String SmallIconImageFile() const + { + return String(); + } + + /*! + * Returns a combination of flags defining the contents and functionality of + * the interface control bar in this process interface. + * + * The returned value must be an OR'ed combination of flags defined by + * symbolic constants in the InterfaceFeature namespace. + * + * \note The default implementation of this function returns + * InterfaceFeature::Default, which is a default set of flags appropriate + * for most interfaces working for processes that execute on views. + * + * \sa InterfaceFeature + */ + virtual InterfaceFeatures Features() const + { + return InterfaceFeature::Default; + } + + /*! + * Function called when the user clicks the Apply button on the interface + * control bar. + * + * For this function to be invoked, the InterfaceFeature::ApplyToViewButton + * flag must be included in the set of feature flags returned by the + * Features() member function, or a reimplementation of it, as appropriate. + * + * \note The default implementation of this function obtains a new process + * instance by calling NewProcess() for this interface, then executes it on + * the active view, if there is one. + */ + virtual void ApplyInstance() const; + + /*! + * Function called when the user clicks the Apply Global button on the + * interface control bar. + * + * For this function to be invoked, the InterfaceFeature::ApplyGlobalButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * \note The default implementation of this function obtains a new process + * instance by calling NewProcess() for this interface, then executes it in + * the global context. + */ + virtual void ApplyInstanceGlobal() const; + + /*! + * Function called when the user clicks the Execute button on the interface + * control bar. + * + * For this function to be invoked, the InterfaceFeature::ExecuteButton flag + * must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * \note The default implementation of this function does nothing. It is + * reimplemented by derived classes implementing dynamic interfaces, to + * commit the active dynamic session. An example is the standard DynamicCrop + * interface. The reimplementation of this function in the DynamicCrop + * interface executes the defined crop/rotate/rescale operation on the + * interface's dynamic target image and terminates the dynamic session. + */ + virtual void Execute() + { + } + + /*! + * Function called when the user clicks the Cancel button on the + * interface control bar. + * + * For this function to be invoked, the InterfaceFeature::CancelButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * \note The default implementation of this function terminates the active + * dynamic session, if there is one. It is unlikely that this function needs + * a reimplementation in a derived class, unless a nonstandard interface + * behavior is desired. + */ + virtual void Cancel(); + + /*! + * Function called when the user toggles the pushed state of the Real Time + * Preview control bar button. + * + * \param active True if the Real Time Preview button is currently + * active (or pushed down); false if the button is + * unpushed. + * + * For this function to be invoked, the InterfaceFeature::RealTimeButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * Derived classes for interfaces that use the real time previewing system + * must reimplement this function to control ownership of the Real Time + * Preview window and provide real-time preview images, as necessary. + * + * \note The default implementation of this function does nothing. + */ + virtual void RealTimePreviewUpdated( bool active ) + { + } + + /*! + * Function called when the user clicks the Browse Documentation button on + * the interface control bar. Returns true if the documentation was loaded + * successfully. + * + * For this function to be invoked, the + * InterfaceFeature::BrowseDocumentationButton flag must be included in the + * set of feature flags returned by a reimplementation of the Features() + * member function in a derived class. + * + * The default implementation of this member function is a wrapper for the + * MetaProcess::BrowseDocumentation() virtual member function of the process + * class associated with this interface. In other words, it basically does + * the following: + * + * \code + * const MetaProcess* P = Process(); + * if ( P != nullptr ) + * if ( P->CanBrowseDocumentation() ) + * P->BrowseDocumentation(); + * \endcode + * + * In general, a derived class should not need to reimplement this member + * function, as the default behavior is appropriate in most cases. + */ + virtual bool BrowseDocumentation() const; + + /*! + * Function called when the user toggles the pushed state of the Track %View + * control bar button. + * + * \param active True if the Track %View button is currently active + * (pushed down); false if the button is unpushed. + * + * For this function to be invoked, the InterfaceFeature::TrackViewButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * %View tracking is used by interfaces that modify their behavior + * and/or information contents as a function of the current view in the + * PixInsight application's GUI. When a view is selected, the interface + * receives an ImageFocused() notification and, if view tracking is active, + * it takes the opportune actions. + * + * \note The default implementation of this function does nothing. + * + * \sa Control::IsTrackViewActive(), Control::SetTrackViewActive(), + * ImageFocused() + */ + virtual void TrackViewUpdated( bool active ) + { + } + + /*! + * Function called when the user clicks the Preferences control bar button. + * + * For this function to be invoked, the InterfaceFeature::PreferencesButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * If you reimplement this function, its standard behavior is launching a + * modal dialog to allow editing preferences and options pertaining to the + * process(es) associated to this interface. + * + * \note Note that along with this function, a process should reimplement + * the MetaProcess::EditPreferences() member in its MetaProcess subclass, + * and that both implementations should be coherent. The default + * implementation of this function does nothing. + * + * \sa MetaProcess::CanEditPreferences(), MetaProcess::EditPreferences() + */ + virtual void EditPreferences() + { + } + + /*! + * Function called when the user clicks the Reset control bar button. + * + * For this function to be invoked, the InterfaceFeature::ResetButton + * flag must be included in the set of feature flags returned by a + * reimplementation of the Features() member function in a derived class. + * + * If you reimplement this function, its standard behavior is performing a + * reset of the current process instance in this interface, loading its + * default parameter values, and updating interface elements in consequence. + * + * \note The default implementation of this function does nothing. + */ + virtual void ResetInstance() + { + } + + /*! + * Interface initialization routine. + * + * This member function is called when the control handle of this interface + * becomes valid, that is, just after the window holding this interface has + * been created. + * + * You can reimplement this function to create all child controls of this + * interface, as well as to set up a number of important control features, + * like a window title, colors, fonts, and so on. + * + * \deprecated This function has been deprecated and should not be used. + * Interface initialization should be carried out using the \e deferred + * \e initialization technique by reimplementing the Launch() virtual member + * function. See the documentation for these functions for more detailed + * information. + * + * \note The default implementation of this function does nothing. + * + * \sa Launch( const MetaProcess&, const ProcessImplementation*, bool&, unsigned& ), + * Launch( unsigned ) + */ + virtual void Initialize() + { + } + + /*! + * %Process interface launch routine. + * + * \param process Reference to the metaprocess describing the process + * class that is launching this interface, either directly + * as its default interface, or through an existing + * process instance. + * + * \param instance Address of a process instance that is trying to launch + * this interface, or zero if it is being launched + * directly as the default interface of the \a process. + * + * \param[out] dynamic True if this interface wants to be launched in + * dynamic mode; false if this interface will launch as a + * static interface. + * + * \param flags Reserved for future extensions - must not be modified. + * + * This function is called whenever an interface is about to be \e launched. + * An interface can be launched either directly as the default interface of + * a process class (e.g., from PixInsight's %Process Explorer window), or + * through an existing process instance (e.g., by double-clicking a process + * icon). The argument values identify the process class and, if nonzero, + * the process instance. + * + * This function must return true if it accepts to be launched under the + * conditions specified by the arguments. After successfully launching an + * interface from a process instance (i.e., if \a instance is nonzero), the + * ValidateProcess() member function is invoked with a reference to the + * instance. If the instance is validated, the ImportProcess() function is + * finally called. + * + * If this function returns true, the \a dynamic referenced argument + * variable must be set to \c true if this interface wants to start in + * dynamic mode. If an interface launches in dynamic mode, a final call to + * EnterDynamicMode() will occur before the interface window is shown and/or + * activated. Note that the actual dynamic session will not really + * start until a first view is selected by the user to serve as a + * dynamic target. + * + * Interface Initialization + * + * Initializing an interface means building its sub-controls and setting up + * a number of important control features, such as a window title, colors, + * fonts, adjusting sizes, and so on. This job can be done by reimplementing + * the Initialize() member function, which the PixInsight core application + * calls as soon as the control handle of this interface becomes valid, that + * is, just after the window holding this interface has been created. + * + * However, the Initialize() function is now deprecated and the standard way + * to initialize an interface is by reimplementing its %Launch() function to + * perform the initialization work the first time the interface is + * launched. This technique is known as deferred initialization + * of a process interface, and has the important advantage that it minimizes + * resources and memory usage because an interface is only initialized if it + * is ever used. Most interfaces are almost never launched by the user, + * except on special occasions, so investing resources for them continually + * is inefficient in general. All standard PixInsight interfaces use the + * deferred initialization technique for that reason. + * + * However, developers using the deferred initialization technique must be + * very careful to ensure that their interfaces will never try to access any + * child controls and other interface elements prior to initializing them. + * This is particularly important if an interface responds to platform + * notifications or events generated by other controls. + * + * \note The default implementation of this function sets \a dynamic = false + * and returns true, so all process interfaces are static by default. + * + * \sa Initialize(), LaunchCount(), Launch( unsigned ) + */ + virtual bool Launch( const MetaProcess& process, + const ProcessImplementation* instance, bool& dynamic, unsigned& flags ) + { + dynamic = false; // interfaces are static by default + return true; + } + + /*! + * Launches this interface with its default process. + * + * \param flags Reserved for future extensions - must be zero. + * + * Returns true if the interface could be launched successfully; false in + * the event of error. + * + * This is a convenience function to launch an interface without a process + * instance. It is functionally equivalent to the following code: + * + * \code + * bool Launch( ProcessInterface& iface, unsigned flags = 0 ) + * { + * const MetaProcess* process = iface.Process(); + * if ( process == nullptr ) + * return false; + * bool notUsed; + * return iface.Launch( *process, nullptr, notUsed, flags ); + * } + * \endcode + * + * \sa Launch( const MetaProcess&, const ProcessImplementation*, bool&, unsigned& ), + */ + bool Launch( unsigned flags = 0 ); + + /*! + * Returns the number of times this interface has been launched since the + * beginning of the current PixInsight session. + * + * \sa Launch() + */ + size_type LaunchCount() const + { + return m_launchCount; + } + + /*! + * %Process instantiation function. + * + * Interfaces capable of generating process instances must reimplement this + * function to create a new process instance, whose address is returned. + * + * The newly created instance should reflect the current state of this + * interface. Interfaces usually maintain a private process instance, whose + * parameters are modifiable through the interface's controls. Then a + * reimplementation of this function simply creates a duplicate of the + * private instance and returns its address. + * + * Returning \e arbitrary instances that have no logical connection with + * the \e visible state of this interface is considered bad practice, and is + * a main reason to deny certification of a PixInsight module. This is + * because the user has always the right to know exactly what she or he can + * expect to get, based on the information shown by an interface on its + * controls. + * + * \note If an interface does not reimplement this function, then it will be + * a plain tool with no processing capabilities. This is because the default + * implementation of this function returns nullptr, meaning that no process + * instance can be generated. In this case, it is \e mandatory that the + * interface reimplements the IsInstanceGenerator() member function to + * return false. + * + * \sa IsInstanceGenerator(), NewTestProcess(), MetaProcess::Clone() + */ + virtual ProcessImplementation* NewProcess() const + { + return nullptr; + } + + /*! + * Test instantiation function. + * + * This function is invoked when a new instance is necessary for strict + * testing purposes exclusively, not to perform actual processing. + * + * In certain situations, the core application needs a \e temporary process + * instance exclusively for testing purposes. This happens, for example, to + * verify if a given instance can be executed on a given view, or in the + * global context, during complex GUI operations. The core application tries + * to optimize GUI performance by calling this function when possible. + * + * For example, the PixInsight core application tries to create temporary + * test instances each time the user drags a process icon over an image, to + * learn if the instance that the icon encapsulates can be executed on the + * view that holds the image. If the user drops the icon, then a regular, + * non-test instance is generated by calling NewProcess(), then it is + * executed, if possible. If the checks carried out by the dragged test + * instances take significant time, PixInsight's user interface can suffer + * from a severe performace degradation. + * + * If your process can provide a substantially simplified version of an + * existing instance, and such a simplified version still is able to know if + * it can be executed globally or on a given view, then reimplement this + * function. + * + * If your process requires (or may require) some megabytes of data to work, + * but these data are not needed for testing purposes, then it is a pretty + * good candidate to reimplement this function. In practice, however, + * requiring a reimplementation of this function is quite infrequent. + * + * \note The default implementation of this function just returns + * NewProcess(). + * + * \sa DistinguishesTestInstances(), NewProcess(), MetaProcess::TestClone() + */ + virtual ProcessImplementation* NewTestProcess() const + { + return NewProcess(); + } + + /*! + * Returns true iff this interface can generate new process instances. + * + * If your interface has no actual processing capabilities, then reimplement + * this function to return false. This helps the PixInsight core application + * to save resources and improve GUI performance. + * + * An interface has no processing capabilities if its NewProcess() member + * function returns zero. This happens if NewProcess() is not reimplemented. + * Although quite infrequent, an interface can be an instance generator + * \e sometimes, as a function of process parameters or other circumstances. + * In this case both NewProcess() and IsInstanceGenerator() must be + * reimplemented to provide coherent values. + * + * \note The default implementation of this function returns true, so all + * interfaces are instance generators by default. + * + * \sa NewProcess() + */ + virtual bool IsInstanceGenerator() const + { + return true; + } + + /*! + * Returns true iff this interface can provide simplified versions of process + * instances for strict testing purposes. + * + * For example, the PixInsight core application tries to create \e temporary + * test instances each time the user drags a process icon over an image, to + * learn if the instance that the icon encapsulates can be executed on the + * view that holds the image. If the user drops the icon, then a regular, + * non-test instance is generated and executed, if possible. If the checks + * carried out by the dragged test instances take significant time, + * PixInsight's user interface can suffer from a performace degradation. + * + * If you can provide substantially simplified instances, but still able to + * know if they can be used in the context of a particular view, then + * reimplement this function to return true, and also NewTestProcess() to + * return simplified test instances. + * + * \note The default implementation of this function returns false, so + * interfaces don't distinguish between normal (executable) and test + * instances by default. + * + * \sa NewTestProcess() + */ + virtual bool DistinguishesTestInstances() const + { + return false; + } + + /*! + * Instance validation function. + * + * \param instance Reference to a process instance that is being validated + * before being imported by this interface. + * + * \param[out] whyNot If this function returns false, it should return also + * a brief text (256 characters maximum) in this string, + * explaining why the specified \a instance is not a valid + * instance to be imported by this interface. + * + * This function will not be called unless the RequiresInstanceValidation() + * member function is reimplemented to return true in a derived class. + * + * Instance validation takes place when an instance is about to be imported + * by this interface. Importing a process instance means that its parameters + * and data will be acquired by this interface, to edit them through the + * available controls and GUI resources. + * + * \note The default implementation of this function returns false. This is + * because it should be reimplemented if RequiresInstanceValidation() has + * already been reimplemented to return true. + * + * \sa RequiresInstanceValidation(), ImportProcess() + */ + virtual bool ValidateProcess( const ProcessImplementation& instance, String& whyNot ) const + { + whyNot.Clear(); + return false; // Force a reimplementation if RequiresInstanceValidation() = true + } + + /*! + * Returns true iff this interface requires validation of a process instance + * before acquisition via ImportProcess(). + * + * If you actually need this kind of validation, reimplement this function + * to return true, and also the ValidateProcess() function to perform the + * instance validation. + * + * \note The default implementation of this function returns false, so + * instances are not validated before acquiring them with ImportProcess(). + * + * \sa ValidateProcess(), ImportProcess() + */ + virtual bool RequiresInstanceValidation() const + { + return false; + } + + /*! + * Instance import function. + * + * This function is called when a process instance is being acquired by this + * interface. For example, this happens when the user drags a process icon + * to the control bar panel of this interface, or when an instance has been + * launched and it has selected this interface from a reimplementation of + * ProcessImplementation::SelectInterface(). + * + * When an instance is imported by an interface, instance parameters and + * data items are usually acquired by the interface to edit them through its + * available controls and GUI resources. + * + * This function returns true iff the specified instance is accepted and + * successfully imported. + * + * This function is never called if CanImportInstances() has been + * reimplemented to return false. + * + * Note that ValidateProcess() has been called just before this function, + * with a reference to the same instance, only if a reimplementation of + * RequiresInstanceValidation() returns true. In this case, this function is + * not called if ValidateProcess() does not return true. + * + * You must reimplement this function if your interface has processing + * capabilities. Only plain tools don't need to reimplement this function, + * since they know nothing about process instances. + * + * \note The default implementation of this function returns false, so by + * default an interface cannot import instances. + * + * \sa ValidateProcess(), CanImportInstances(), + * ProcessImplementation::SelectInterface() + */ + virtual bool ImportProcess( const ProcessImplementation& ) + { + return false; + } + + /*! + * Returns true iff this interface is able to import process instances. + * + * If your interface has no processing capabilities, you should + * reimplement this function to return false. + * + * \note The default implementation of this function returns true. + * + * \sa ImportProcess() + */ + virtual bool CanImportInstances() const + { + return true; + } + + /*! + * Function called when the real-time preview image needs an update, and + * this interface is the owner of the Real-Time Preview system. + * + * \param[in,out] image Reference to a shared image where the real-time + * rendition would be generated. This image contains pixel + * data of a view selected for real-time previewing. A + * subsequent call to GenerateRealTimePreview() would + * receive a reference to an image with the same pixel + * data, for effective real-time preview generation. + * + * \param view Reference to a view that is currently selected in the + * Real-Time Preview system of the core application. The + * passed \a image contains a representation of the image + * in this view. + * + * \param rect Current real-time region in \a view image coordinates. + * If a nonempty rectangle is received through this + * parameter, then the input \a image contains a + * representation of the corresponding rectangular region + * of the \a view's image. If this parameter is an empty + * rectangle, it must be ignored and \a image is a + * representation of the entire \a view's image. + * + * \param zoomLevel Indicates the integer zoom ratio that has been applied + * to the specified \a image, with respect to the original + * view's image. If this parameter is a negative number, + * it represents a reduction factor; for example, -2 + * corresponds to a 1:2 reduction ratio, meaning that each + * pixel of \a image corresponds to 4 source pixels in the + * view being previewed. If this parameter is a positive + * number, it can only be equal to 1, indicating that each + * pixel in \a image corresponds to one source pixel. In + * other words, real-time preview images can be scaled + * down, but are never magnified or scaled up. + * + * Returns true if the real-time preview requires an update for the + * specified image; false if no update is required. + * + * If this function returns true, a subsequent call to + * GenerateRealTimePreview() will occur when appropriate. + * + * The passed \a image, \a view and \a rect objects cannot be + * modified in any way by this function. + * + * \note The default implementation of this function returns false. + * + * \sa GenerateRealTimePreview(), CancelRealTimePreview(), RealTimePreview + */ + virtual bool RequiresRealTimePreviewUpdate( const UInt16Image& image, const View& view, + const Rect& rect, int zoomLevel ) const + { + return false; + } + + /*! + * Function called to generate a new real-time preview rendition. + * + * \param[in,out] image Reference to a shared image where the real-time + * rendition must be generated. On input, this image + * contains pixel data of a view selected for real-time + * previewing. On output, this image must be transformed + * to represent a preview of the current process instance + * being edited on this process interface. + * + * \param view Reference to a view that is currently selected in the + * Real-Time Preview system of the core application. The + * passed \a image contains a representation of the image + * in this view. + * + * \param rect Current real-time region in \a view image coordinates. + * If a nonempty rectangle is received through this + * parameter, then the input \a image contains a + * representation of the corresponding rectangular region + * of the \a view's image. If this parameter is an empty + * rectangle, it must be ignored and \a image is a + * representation of the entire \a view's image. + * + * \param zoomLevel Indicates the integer zoom ratio that has been applied + * to the specified \a image, with respect to the original + * view's image. If this parameter is a negative number, + * it represents a reduction factor; for example, -2 + * corresponds to a 1:2 reduction ratio, meaning that each + * pixel of \a image corresponds to 4 source pixels in the + * view being previewed. If this parameter is a positive + * number, it can only be equal to 1, indicating that each + * pixel in \a image corresponds to one source pixel. In + * other words, real-time preview images can be scaled + * down, but are never magnified or scaled up. + * + * \param[out] info Reference to a string where a brief informative text + * (256 characters maximum) can optionally be stored to + * describe some special circumstances about the generated + * rendition. Typically, this string can be used to inform + * about an inexact or partial rendition, for example + * because the applied reduction ratio (\a zoomLevel) + * does not allow a reasonably accurate representation of + * some process features. + * + * Returns true to signal that the passed \a image has been modified and can + * now be used to update the current real-time preview. Returns false to + * indicate that the \a image has not been altered by this function, and + * hence that the current real-time preview update should be aborted. + * + * The passed \a view and \a rect objects cannot be modified in any + * way by this function. A reimplementation of this function cannot be + * used to modify a view indirectly - we mean it! + * + * \note The default implementation of this function returns false without + * modifying the passed \a image. + * + * \sa RequiresRealTimePreviewUpdate(), CancelRealTimePreview(), + * RealTimePreview + */ + virtual bool GenerateRealTimePreview( UInt16Image& image, const View& view, + const Rect& rect, int zoomLevel, String& info ) const + { + return false; + } + + /*! + * Function called to request cancellation of the ongoing real-time preview + * generation process. + * + * The core application may call this member function when the current + * real-time generation process (which is being carried out by a + * reimplemented GenerateRealTimePreview() function) should be aborted + * immediately and unconditionally. + * + * The core application can make such a request at its own discretion---and + * your interface should be ready to honor it during a real-time generation + * task---, but currently (as of PixInsight core version 1.8.0) this only + * happens if the real-time progress dialog has been made visible and the + * user has closed it prematurely (e.g., by clicking its Cancel button). + * + * \note The default implementation of this function simulates a manual + * deactivation of the Real-Time Preview button of this interface by calling + * Control::DeactivateRealTimePreview(). If your real-time generation code + * is coherent with the current state of your interface, you normally should + * not need to reimplement this member function. + * + * \sa RequiresRealTimePreviewUpdate(), GenerateRealTimePreview(), + * RealTimePreview::ShowProgressDialog(), RealTimePreview + */ + virtual void CancelRealTimePreview() + { + DeactivateRealTimePreview(); + } + + /*! + * Returns true iff this interface can be a dynamic interface. + * + * A dynamic interface is a process interface working in dynamic + * mode. In dynamic mode, an interface provides a high degree of + * interaction with the user through a set of special functions that allow + * direct, real-time communication with the core application's GUI. This + * includes the possibility of generating arbitrary graphical contents on + * image views, and receiving pointing device (mouse, tablet) messages. + * + * Note that an interface can work in both static and dynamic modes (not + * simultaneously, of course), depending on the value returned by the + * Launch() function. However, dynamic interface semantics will not be + * available to an interface unless it reimplements this function to return + * true. This has been done in this way to help saving platform resources, + * which is a design principle of PCL. + * + * If this function returns false (as it does by default), dynamic process + * semantics will not be available for this interface. + * + * \note The default implementation of this function returns false, so + * dynamic interface semantics are disabled by default. + * + * \sa Launch() + */ + virtual bool IsDynamicInterface() const + { + return false; + } + + /*! + * Function called when a new dynamic mode session is about to + * start. Returns true if the new dynamic session can continue; false if it + * should be interrupted. + * + * \note The default implementation of this function returns true. + * + * \sa ExitDynamicMode() + */ + virtual bool EnterDynamicMode() + { + return true; + } + + /*! + * Function called just after a dynamic session has been terminated. + * + * \note The default implementation of this function does nothing. + * + * \sa EnterDynamicMode() + */ + virtual void ExitDynamicMode() + { + } + + /*! + * Function called when the mouse cursor enters the viewport of a \a view, + * during an active dynamic session. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseLeave(), DynamicMouseMove(), DynamicMousePress(), + * DynamicMouseRelease(), DynamicMouseDoubleClick(), DynamicMouseWheel() + */ + virtual void DynamicMouseEnter( View& view ) + { + } + + /*! + * Function called when the mouse cursor leaves the viewport of a \a view, + * during an active dynamic session. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseEnter(), DynamicMouseMove(), DynamicMousePress(), + * DynamicMouseRelease(), DynamicMouseDoubleClick(), DynamicMouseWheel() + */ + virtual void DynamicMouseLeave( View& view ) + { + } + + /*! + * Function called when the mouse cursor is displaced on a view, during an + * active dynamic session. + * + * \param view Reference to a view over which the mouse cursor has + * been displaced. + * + * \param cursorPos New mouse cursor position in image coordinates. + * + * \param buttons Indicates the current states of all mouse buttons. This + * value is an OR'ed combination of MouseButton flags. A + * flag set indicates a pressed mouse button. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseEnter(), DynamicMouseLeave(), DynamicMousePress(), + * DynamicMouseRelease(), DynamicMouseDoubleClick(), DynamicMouseWheel() + */ + virtual void DynamicMouseMove( View& view, const DPoint& cursorPos, + unsigned buttons, unsigned modifiers ) + { + } + + /*! + * Function called when a mouse button is pressed on a view, during an + * active dynamic session. + * + * \param view Reference to a view over which a mouse button has been + * pressed. + * + * \param cursorPos Current mouse cursor position in image coordinates. + * + * \param button Identifies the mouse button that has been pressed. This + * value is a unique MouseButton flag. + * + * \param buttons Indicates the current states of all mouse buttons. This + * value is an OR'ed combination of MouseButton flags. A + * flag set indicates a pressed mouse button. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseEnter(), DynamicMouseLeave(), DynamicMouseMove(), + * DynamicMouseRelease(), DynamicMouseDoubleClick(), DynamicMouseWheel() + */ + virtual void DynamicMousePress( View& view, const DPoint& cursorPos, + int button, unsigned buttons, unsigned modifiers ) + { + } + + /*! + * Function called when a mouse button is released on a view, during an + * active dynamic session. + * + * \param view Reference to a view over which a mouse button has been + * released. + * + * \param cursorPos Current mouse cursor position in image coordinates. + * + * \param button Identifies the mouse button that has been released. + * This value is a unique MouseButton flag. + * + * \param buttons Indicates the current states of all mouse buttons. This + * value is an OR'ed combination of MouseButton flags. A + * flag set indicates a pressed mouse button. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseEnter(), DynamicMouseLeave(), DynamicMouseMove(), + * DynamicMousePress(), DynamicMouseDoubleClick(), DynamicMouseWheel() + */ + virtual void DynamicMouseRelease( View& view, const DPoint& cursorPos, + int button, unsigned buttons, unsigned modifiers ) + { + } + + /*! + * Function called when the primary mouse button is double-clicked on a + * view, during an active dynamic session. + * + * \param view Reference to a view over which the primary mouse button + * has been double-clicked. + * + * \param cursorPos Current mouse cursor position in image coordinates. + * + * \param buttons Indicates the current states of all mouse buttons. This + * value is an OR'ed combination of MouseButton flags. A + * flag set indicates a pressed mouse button. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * \note The default implementation of this function does nothing. + * + * \sa DynamicMouseEnter(), DynamicMouseLeave(), DynamicMouseMove(), + * DynamicMousePress(), DynamicMouseRelease(), DynamicMouseWheel() + */ + virtual void DynamicMouseDoubleClick( View& view, const DPoint& cursorPos, + unsigned buttons, unsigned modifiers ) + { + } + + /*! + * Function called if a key is pressed when a view has the keyboard focus, + * during an active dynamic session. + * + * \param view Reference to the view that had the keyboard focus when + * a key was pressed. + * + * \param key A KeyCode code identifying the keyboard key that has + * been pressed. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * This function returns true if it processes the keyboard press event. If + * false is returned, then the keyboard event may propagate to other + * elements in the PixInsight core application GUI. + * + * \note The default implementation of this function returns false. + * + * \sa DynamicKeyRelease() + */ + virtual bool DynamicKeyPress( View& view, int key, unsigned modifiers ) + { + return false; + } + + /*! + * Function called if a key is released when a view has the keyboard focus, + * during an active dynamic session. + * + * \param view Reference to the view that had the keyboard focus when + * a key was released. + * + * \param key A KeyCode code identifying the keyboard key that has + * been released. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * This function returns true if it processes the keyboard release event. If + * false is returned, then the keyboard event may propagate to other + * elements in the PixInsight core application GUI. + * + * \note The default implementation of this function returns false. + * + * \sa DynamicKeyPress() + */ + virtual bool DynamicKeyRelease( View& view, int key, unsigned modifiers ) + { + return false; + } + + /*! + * Function called when the mouse wheel is rotated while the mouse cursor is + * over a view, during an active dynamic session. + * + * \param view Reference to a view over which the mouse cursor was + * located when the mouse wheel was rotated. + * + * \param cursorPos Current mouse cursor position in image coordinates. + * + * \param wheelDelta Wheel rotation increment. A positive increment + * indicates that the wheel has been rotated in the + * forward direction; negative increments correspond to + * backwards rotation. For example, negative increments + * should be used to scroll down a scrollable area, as a + * document browser. + * + * \param buttons Indicates the current states of all mouse buttons. This + * value is an OR'ed combination of MouseButton flags. A + * flag set indicates a pressed mouse button. + * + * \param modifiers Indicates the current states of all keyboard modifiers. + * This value is an OR'ed combination of KeyModifier + * flags. A flag set indicates a pressed modifier key. + * + * This function returns true if it processes the wheel rotation event. If + * false is returned, then the wheel event will propagate to other elements + * in the PixInsight core application GUI. + * + * \note The default implementation of this function returns false. + * + * \sa DynamicMouseEnter(), DynamicMouseLeave(), DynamicMouseMove(), + * DynamicMousePress(), DynamicMouseRelease(), DynamicMouseDoubleClick() + */ + virtual bool DynamicMouseWheel( View& view, const DPoint& cursorPos, + int wheelDelta, unsigned buttons, unsigned modifiers ) + { + return false; + } + + /*! + * Function called when a view's screen rendition needs to be updated, + * during an active dynamic session. + * + * \param view Reference to a view that requires a screen update. + * + * \param rect Update region in image coordinates. + * + * This function \e must be reimplemented by dynamic interfaces that + * maintain their own graphical content over image views. + * + * This function must return false if this interface requires no screen + * update for the specified update region. + * + * If this function returns true, then a subsequent call to DynamicPaint() + * will occur as soon as possible, including this update region, probably + * into a wider region, due to optimization of screen updates. + * + * \note The default implementation of this function returns false. + * + * \sa DynamicPaint() + */ + virtual bool RequiresDynamicUpdate( const View& view, const DRect& rect ) const + { + return false; + } + + /*! + * Function called when a view's screen rendition has been updated. + * + * \param view Reference to a view where the specified update region + * should be redrawn by this interface. + * + * \param graphics Reference to a vector graphics context, where all + * screen drawing work must be performed. + * + * \param rect Update region in image coordinates. + * + * This function \e must be reimplemented by dynamic interfaces that + * maintain their own graphical content over image views. + * + * When this function is invoked, the update region will contain just the + * screen rendition of the target \a view's image, with display functions + * and color management transformations applied as appropriate, but without + * any additional vectorial contents such as preview rectangles, selections, + * auxiliary geometric items, cursors, etc, which are always rendered + * \e after this function returns. + * + * When this function is called, the update region has already been set as + * the current clipping region of the \a graphics context in viewport + * coordinates. The module being invoked can only define a clipping region + * as an intersection with the update rectangle, but not outside it. In + * other words, this function can only paint \e inside the specified update + * rectangle. Any attempt to define a larger clipping region, for example by + * calling Graphics::SetClipRect(), is illegal and will be blocked by the + * PixInsight core application. + * + * \note The default implementation of this function does nothing. + * + * \sa RequiresDynamicUpdate(), VectorGraphics + */ + virtual void DynamicPaint( const View& view, VectorGraphics& graphics, const DRect& rect ) const + { + } + + /*! + * \defgroup image_notifications Image Notification Functions + * + * The PixInsight core application calls image notification functions to + * keep interfaces informed about changes and events involving views and + * their images. + * + * For a process interface to receive image notifications, the corresponding + * ProcessInterface subclass must reimplement + * ProcessInterface::WantsImageNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive image notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive image notifications by default. + * + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual bool WantsImageNotifications() const + { + return false; + } + + /*! + * Notification sent when a new view has been created. + * + * \param view Reference to the view that has been created. Can be + * either a main view or a preview. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageCreated( const View& view ) + { + } + + /*! + * Notification sent when the image in a view has been modified. + * + * \param view Reference to the view whose image has been modified. + * Can be either a main view or a preview. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageUpdated( const View& view ) + { + } + + /*! + * Notification sent when the identifier of a view has been changed. + * + * \param view Reference to the view whose identifier has been + * changed. Can be either a main view or a preview. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageRenamed( const View& view ) + { + } + + /*! + * Notification sent when an existing view is about to be destroyed. + * + * \param view Reference to the view that will be destroyed. Can be + * either a main view or a preview. + * + * When an image window is closed and it has one or more previews defined, + * an ImageDeleted() notification is sent for each of its previews, then a + * final notification is sent for its main view. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageDeleted( const View& view ) + { + } + + /*! + * Notification sent when a view has been activated and has received the + * input focus. + * + * \param view Reference to the view that has been activated and + * focused. This is from now on the current active + * view in the core application's GUI. \a view can be + * either a main view or a preview. + * + * If the \a view is a preview, this notification implicitly means that its + * parent image window has been activated and is now the topmost, active + * window in the current workspace. In this case, however, a notification + * for the window's main view is not sent; only the active view is notified. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageFocused( const View& view ) + { + } + + /*! + * Notification sent when a view has been locked for read and/or write + * operations. + * + * \param view Reference to the view that has been locked. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageLocked( const View& view ) + { + } + + /*! + * Notification sent when a view has been unlocked for read and/or write + * operations. + * + * \param view Reference to the view that has been unlocked. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageUnlocked( const View& view ) + { + } + + /*! + * Notification sent when the screen transfer functions (STF) have + * been enabled for a view. + * + * \param view Reference to a view whose STF have been enabled. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageSTFEnabled( const View& view ) + { + } + + /*! + * Notification sent when the screen transfer functions (STF) have + * been disabled for a view. + * + * \param view Reference to a view whose STF have been disabled. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageSTFDisabled( const View& view ) + { + } + + /*! + * Notification sent when the screen transfer functions (STF) of a + * view have been updated. + * + * \param view Reference to a view whose STF have been updated. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageSTFUpdated( const View& view ) + { + } + + /*! + * Notification sent when the parameters of the RGB working space + * (RGBWS) of a view have been updated. + * + * \param view Reference to a view whose RGBWS has been updated. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageRGBWSUpdated( const View& view ) + { + } + + /*! + * Notification sent when color management (CM) has been enabled + * for a view. + * + * \param view Reference to a view for which color management has been + * enabled. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageCMEnabled( const View& view ) + { + } + + /*! + * Notification sent when color management (CM) has been disabled + * for a view. + * + * \param view Reference to a view for which color management has been + * disabled. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageCMDisabled( const View& view ) + { + } + + /*! + * Notification sent when the color management (CM) parameters of a + * view have been updated. + * + * \param view Reference to a view whose color management data or + * working parameters have been modified. + * + * This notification is sent when a view's ICC profile is changed or + * deleted, and when some color management features are modified, as + * soft-proofing or gamut check, among others. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageCMUpdated( const View& view ) + { + } + + /*! + * Notification sent when an image has been saved to a disk file. + * + * \param view Reference to a view whose image has been successfully + * written to a file. + * + * \ingroup image_notifications + * \sa \ref image_notifications "Image Notification Functions" + */ + virtual void ImageSaved( const View& view ) + { + } + + /*! + * \defgroup mask_notifications Mask Notification Functions + * + * The PixInsight core application calls mask notification functions to + * keep interfaces informed about changes and events involving masks of + * image windows. + * + * For a process interface to receive mask notifications, the corresponding + * ProcessInterface subclass must reimplement + * ProcessInterface::WantsMaskNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive mask notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive mask notifications by default. + * + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual bool WantsMaskNotifications() const + { + return false; + } + + /*! + * Notification sent when a mask has been selected for (or removed from) an + * image window. + * + * \param view Reference to the main view of an image window for which + * either a new mask has been selected, or an existing + * mask has been removed. + * + * \ingroup mask_notifications + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual void MaskUpdated( const View& view ) + { + } + + /*! + * Notification sent when masking has been enabled for an image window. + * + * \param view Reference to the main view of an image window for which + * masking has been enabled. + * + * \ingroup mask_notifications + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual void MaskEnabled( const View& view ) + { + } + + /*! + * Notification sent when masking has been disabled for an image window. + * + * \param view Reference to the main view of an image window for which + * masking has been disabled. + * + * \ingroup mask_notifications + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual void MaskDisabled( const View& view ) + { + } + + /*! + * Notification sent when mask visibility has been enabled for an image + * window. + * + * \param view Reference to the main view of an image window whose + * mask is now visible. + * + * \ingroup mask_notifications + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual void MaskShown( const View& view ) + { + } + + /*! + * Notification sent when mask visibility has been disabled for an image + * window. + * + * \param view Reference to the main view of an image window whose + * mask is now hidden. + * + * \ingroup mask_notifications + * \sa \ref mask_notifications "Mask Notification Functions" + */ + virtual void MaskHidden( const View& view ) + { + } + + /*! + * \defgroup transparency_notifications Image Transparency \ + * Notification Functions + * + * The PixInsight core application calls transparency notification functions + * to keep interfaces informed about changes in transparency rendering modes + * of image windows. + * + * For a process interface to receive transparency notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsTransparencyNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive transparency notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive transparency notifications by default. + * + * \sa \ref transparency_notifications + * "Image Transparency Notification Functions" + */ + virtual bool WantsTransparencyNotifications() const + { + return false; + } + + /*! + * Notification sent when transparency rendering has been disabled for an + * image window. + * + * \param view Reference to the main view of an image window for which + * transparency rendering has been disabled. + * + * \ingroup transparency_notifications + * \sa \ref transparency_notifications + * "Image Transparency Notification Functions" + */ + virtual void TransparencyHidden( const View& view ) + { + } + + /*! + * Notification sent when the current transparency rendering mode has been + * updated for an image window. + * + * \param view Reference to the main view of an image window whose + * transparency rendering mode has been updated. + * + * \ingroup transparency_notifications + * \sa \ref transparency_notifications + * "Image Transparency Notification Functions" + */ + virtual void TransparencyModeUpdated( const View& view ) + { + } + + /*! + * \defgroup view_property_notifications View Property Notification \ + * Functions + * + * The PixInsight core application calls view property notification + * functions to keep interfaces informed about changes and events involving + * view properties. + * + * For a process interface to receive view property notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsViewPropertyNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive view property notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive view property notifications by default. + * + * \sa \ref view_property_notifications "View Property Notification Functions" + */ + virtual bool WantsViewPropertyNotifications() const + { + return false; + } + + /*! + * Notification sent when a view property has been created or modified. + * + * \param view Reference to a view where a new property has been + * created, or an existing property has been modified. + * + * \param property Identifier of the view property that has been created + * or modified. + * + * \ingroup view_property_notifications + * \sa \ref view_property_notifications "View Property Notification Functions" + */ + virtual void ViewPropertyUpdated( const View& view, const IsoString& property ) + { + } + + /*! + * Notification sent when a view property has been deleted. + * + * \param view Reference to a view where a property has been deleted. + * + * \param property Identifier of the view property that has been deleted. + * + * \ingroup view_property_notifications + * \sa \ref view_property_notifications "View Property Notification Functions" + */ + virtual void ViewPropertyDeleted( const View& view, const IsoString& property ) + { + } + + /*! + * \defgroup readout_notifications Readout Notification Functions + * + * The PixInsight core application calls readout notification functions to + * send real-time readout pixel values to interfaces. + * + * Readout operations take place when the user clicks and drags the mouse + * over a view in readout mode (ImageMode::Readout). During a + * readout procedure, RGBA values are read from a view's image (according to + * global readout options) and sent to interfaces via readout notifications. + * + * For example, an interface can receive readout notifications to let the + * user select a color by clicking directly over an image. The NewImage + * standard interface does exactly this to select an initial color for newly + * created images. + * + * For a process interface to receive readout notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsReadoutNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive readout notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive readout notifications by default. + * + * \sa \ref readout_notifications "Readout Notification Functions" + */ + virtual bool WantsReadoutNotifications() const + { + return false; + } + + /*! + * Notification sent to signal the beginning of a new readout procedure. + * + * \param view Reference to a view from which new readout data + * notifications will be sent from now on. + * + * \ingroup readout_notifications + * \sa \ref readout_notifications "Readout Notification Functions" + */ + virtual void BeginReadout( const View& view ) + { + } + + /*! + * Notification sent when new readout data are available. + * + * \param view Reference to a view from which new readout data is + * being sent. + * + * \param position Readout position in image coordinates. + * + * \param R,G,B,A New readout red, green, blue and alpha values, + * respectively, in the normalized real range [0,1]. + * + * \note Although images can have an unlimited number of alpha channels in + * PixInsight, only readout values from the first alpha channel (which + * defines transparency) are sent to interfaces. + * + * \ingroup readout_notifications + * \sa \ref readout_notifications "Readout Notification Functions" + */ + virtual void UpdateReadout( const View& view, const DPoint& position, double R, double G, double B, double A ) + { + } + + /*! + * Notification sent to signal the end of an active readout procedure. + * + * \param view Reference to the view from which new readout data + * notifications will no longer be sent. + * + * \ingroup readout_notifications + * \sa \ref readout_notifications "Readout Notification Functions" + */ + virtual void EndReadout( const View& view ) + { + } + + /*! + * \defgroup process_notifications Process Instance Notification Functions + * + * The PixInsight core application calls process instance notification + * functions to keep interfaces informed about changes and events involving + * process instances. + * + * For a process interface to receive process instance notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsProcessNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive process instance + * notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive instance notifications by default. + * + * \sa \ref process_notifications "Process Instance Notification Functions" + */ + virtual bool WantsProcessNotifications() const + { + return false; + } + + /*! + * Notification sent when a new process instance has been created. + * + * \param instance Reference to a process instance that has been newly + * created. + * + * \ingroup process_notifications + * \sa \ref process_notifications "Process Instance Notification Functions" + */ + virtual void ProcessCreated( const ProcessInstance& instance ) + { + } + + /*! + * Notification sent when an existing process instance has been updated. + * + * \param instance Reference to a process instance that has been modified. + * + * \ingroup process_notifications + * \sa \ref process_notifications "Process Instance Notification Functions" + */ + virtual void ProcessUpdated( const ProcessInstance& instance ) + { + } + + /*! + * Notification sent when a process instance is about to be destroyed. + * + * \param instance Reference to a process instance that will be destroyed. + * + * \ingroup process_notifications + * \sa \ref process_notifications "Process Instance Notification Functions" + */ + virtual void ProcessDeleted( const ProcessInstance& instance ) + { + } + + /*! + * Notification sent when a process instance has been saved to a disk file. + * + * \param instance Reference to a process instance that has been written + * successfully to a disk file (for example, as part of a + * .xpsm file). + * + * \ingroup process_notifications + * \sa \ref process_notifications "Process Instance Notification Functions" + */ + virtual void ProcessSaved( const ProcessInstance& instance ) + { + } + + /*! + * \defgroup rtpreview_notifications Real Time Preview Notification \ + * Functions + * + * The PixInsight core application calls real time preview notification + * functions to keep interfaces informed about changes and events involving + * the PixInsight real time previewing system. + * + * For a process interface to receive real time preview notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsRealTimePreviewNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive notifications from the + * real-time previewing system. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive real-time previewing notifications by default. + * + * \sa \ref rtpreview_notifications "Real Time Preview Notification Functions" + */ + virtual bool WantsRealTimePreviewNotifications() const + { + return false; + } + + /*! + * Notification sent when the owner of the real time previewing system has + * been changed. + * + * \param iface Reference to a process interface that is now the owner + * of the real-time previewing system. + * + * \ingroup rtpreview_notifications + * \sa \ref rtpreview_notifications "Real Time Preview Notification Functions" + */ + virtual void RealTimePreviewOwnerChanged( ProcessInterface& iface ) + { + } + + /*! + * Notification sent when a real time preview LUT structure has been + * generated. + * + * \param colorModel Identifies the LUT structure that has been recalculated + * and is now available. + * + * \ingroup rtpreview_notifications + * \sa \ref rtpreview_notifications "Real Time Preview Notification Functions" + * + * \deprecated This function has been deprecated and should not be used. The + * real-time previewing system no longer depends on look up table (LUT) + * structures. + */ + virtual void RealTimePreviewLUTUpdated( int colorModel ) + { + } + + /*! + * Notification sent when a new real-time rendition has started being + * generated. + * + * \ingroup rtpreview_notifications + * \sa \ref rtpreview_notifications "Real Time Preview Notification Functions" + */ + virtual void RealTimePreviewGenerationStarted() + { + } + + /*! + * Notification sent when a new real-time rendition has finished being + * generated. + * + * \ingroup rtpreview_notifications + * \sa \ref rtpreview_notifications "Real Time Preview Notification Functions" + */ + virtual void RealTimePreviewGenerationFinished() + { + } + + /*! + * \defgroup global_notifications Global Notification Functions + * + * The PixInsight core application calls global notification functions to + * keep interfaces informed about changes and events occurring in the global + * core application context. + * + * For a process interface to receive global notifications, the + * corresponding ProcessInterface subclass must reimplement + * ProcessInterface::WantsGlobalNotifications() to return true. + */ + + /*! + * Returns true iff this interface will receive global notifications. + * + * \note The default implementation of this function returns false, so + * interfaces don't receive global notifications by default. + * + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual bool WantsGlobalNotifications() const + { + return false; + } + + /*! + * Notification sent when the parameters of the global RGB working space + * (RGBWS) have been modified. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void GlobalRGBWSUpdated() + { + } + + /*! + * Notification sent when color management (CM) has been globally enabled. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void GlobalCMEnabled() + { + } + + /*! + * Notification sent when color management (CM) has been globally disabled. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void GlobalCMDisabled() + { + } + + /*! + * Notification sent when global color management (CM) data or working + * parameters have been modified. This includes selecting a new default ICC + * profile, or changing some global color management parameters, such as + * default profile mismatching policies or rendering intents. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void GlobalCMUpdated() + { + } + + /*! + * Notification sent when global readout options have been modified. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void ReadoutOptionsUpdated() + { + } + + /*! + * Notification sent when one or more global preferences settings have been + * modified. + * + * \ingroup global_notifications + * \sa \ref global_notifications "Global Notification Functions" + */ + virtual void GlobalPreferencesUpdated() + { + } + + /*! + * Returns a settings key that should be used for storage of all settings + * data associated to this interface. + * + * The returned settings key string will be equal to "Interfaces/<id>/", + * where <id> is the identifier of this interface, as returned by the + * Id() member function. + * + * \note Interfaces must only use the keys returned by this function for + * storage of all their settings data. Using different keys is allowed, but + * it is considered bad practice in most cases. + * + * \sa Settings, SaveSettings(), LoadSettings() + */ + IsoString SettingsKey() const + { + return IsoString( "Interfaces/" ) + Id() + '/'; + } + + /*! + * Saves settings data for this process interface. + * + * This function is called automatically for all process interfaces upon + * module unload. If your interface needs storing and retrieving + * configuration data to remember them across sessions, then you should + * reimplement this function. + * + * See the documentation for the LoadSettings() member function for detailed + * information about saving and loading settings data for process + * interfaces. + * + * \note This function is only invoked for interfaces that have been + * launched at least once. This is because if an interface has not been used + * during a session, there is no plausible reason to modify its associated + * configuration data. This policy has been adopted to maximize user control + * over interface preferences and configuration settings. + * + * \sa Settings, LoadSettings(), SettingsKey() + */ + virtual void SaveSettings() const + { + } + + /*! + * Retrieves stored settings data for this process interface. + * + * This function is called automatically for all process interfaces the + * first time they are launched. If your interface needs storing and + * retrieving configuration data to remember them across sessions, then you + * should reimplement this function. + * + * When saving and loading settings data, your code must use the key + * returned by SettingsKey() as a prefix for the subkeys corresponding to + * each settings data item. For example, the following code snippet: + * + * \code + * IsoString key = SettingsKey() + "Geometry/"; + * // ... + * Settings::Write( key + "Width", Width() ); + * \endcode + * + * would save the current width of this interface to the + * "Interfaces/<id>/Geometry/Width" subkey in the global settings + * space assigned to the current module. This is the recommended behavior. + * + * \sa Settings, SaveSettings(), SettingsKey() + */ + virtual void LoadSettings() + { + } + + /*! + * Saves the current position and dimensions of this interface in global + * settings variables. + * + * Call this function to save the geometry of an interface window across + * sessions. The RestoreGeometry() member function can be invoked to restore + * previously saved position and size data. + * + * Before calling this function, all interface child controls and interface + * elements should have been completely initialized. If this interface is + * not resizable (e.g. because the SetFixedSize() function has been called), + * size data are not stored. + * + * This function stores geometry data in the following settings keys: + * + * Interfaces/<id>/Geometry/Left \n + * Interfaces/<id>/Geometry/Top \n + * Interfaces/<id>/Geometry/Width \n + * Interfaces/<id>/Geometry/Height + * + * where <id> is the identifier of this interface, as returned by the + * Id() member function. + * + * \note Normally, you should not need to call this function, unless you + * have explicitly disabled the auto save geometry feature by + * calling the DisableAutoSaveGeometry() member function. + * + * \sa RestoreGeometry(), SetDefaultPosition(), IsAutoSaveGeometryEnabled() + */ + void SaveGeometry() const; + + /*! + * Restores previously saved position and dimensions of this interface from + * global settings variables. Returns true if stored geometry data could be + * successfully retrieved and established for this interface. + * + * Call this function to restore the geometry of an interface window as it + * was previously saved by SaveGeometry(). This allows an interface to + * \e remember its size and position on the core application's work space + * across sessions. + * + * \note Normally, you should not need to call this function, unless you + * have explicitly disabled the auto save geometry feature by + * calling the DisableAutoSaveGeometry() member function. + * + * \sa SaveGeometry() + */ + bool RestoreGeometry(); + + /*! + * Moves this interface window to a default position on the PixInsight core + * application's work space. + * + * The default position is calculated to place the interface window centered + * on the primary monitor. + * + * \sa SaveGeometry(), RestoreGeometry() + */ + void SetDefaultPosition(); + + /*! + * Returns true iff the auto save geometry feature is currently + * active for this interface. + * + * When auto save geometry is active, the interface \e remembers + * its size and position on the PixInsight core application's worspace + * across sessions. Geometry data are saved to and retrieved from global + * settings variables automatically. Geometry is only saved for interfaces + * that have been launched at least once. + * + * \note By default, the auto save geometry feature is active for + * every process interface. To avoid this automatic behavior, it must be + * explicitly disabled. + * + * \sa EnableAutoSaveGeometry(), DisableAutoSaveGeometry(), + * SaveGeometry(), RestoreGeometry(), SetDefaultPosition() + */ + bool IsAutoSaveGeometryEnabled() const + { + return m_autoSaveGeometry; + } + + /*! + * Enables (or disables) the auto save geometry feature. For more + * information on this feature, see the documentation for the + * IsAutoSaveGeometryEnabled() member function. + * + * \sa DisableAutoSaveGeometry(), IsAutoSaveGeometryEnabled() + */ + void EnableAutoSaveGeometry( bool enable = true ) + { + m_autoSaveGeometry = enable; + } + + /*! + * Disables (or enables) the auto save geometry feature. For more + * information on this feature, see the documentation for the + * IsAutoSaveGeometryEnabled() member function. + * + * \sa EnableAutoSaveGeometry(), IsAutoSaveGeometryEnabled() + */ + void DisableAutoSaveGeometry( bool disable = true ) + { + EnableAutoSaveGeometry( !disable ); + } + + /*! + * Issues an %ImageUpdated notification for a view. + * + * \param view Reference to the view for which an ImageUpdated + * notification will be sent. + * + * The PixInsight core application will send ImageUpdated() notifications to + * all objects that listen image notifications on the entire PixInsight + * platform. This includes not only other process interfaces (including the + * emitter), but also a large number of interface objects and processing + * resources whose states can be automatically updated in response to the + * notification received. + * + * Broadcasting is typically used by dynamic interfaces that modify images + * as a function of direct user interaction. A good example of this is the + * CloneStamp interface, which broadcasts ImageUpdated notifications to + * keep the whole platform consistent with image changes due to clone stamp + * actions performed by the user. + * + * \note This member function must \e not be used on a regular basis without + * having a \e really good reason to do so. An abusive use of this function, + * such as too frequent calls performed during intensive real-time + * operations, may degrade the performance of the whole platform due to + * excessive overhead. + */ + static void BroadcastImageUpdated( const View& view ); + + /*! + * Processes pending user interface events. + * + * Call this function to let the PixInsight core application process pending + * user interface events, which may accumulate while your code is running. + * + * Modules typically call this function during real-time preview generation + * procedures. Calling this function ensures that the GUI remains responsive + * during long, calculation-intensive operations. + * + * If the \a excludeUserInputEvents parameter is set to true, no user input + * events will be processed by calling this function. This includes mainly + * mouse and keyboard events. Unprocessed input events will remain pending + * and will be processed as appropriate when execution returns to + * PixInsight's main event handling loop, or when this function is called + * again with \a excludeUserInputEvents set to false. + * + * \note Do not call this function too frequently, as doing so may degrade + * the performance of the whole PixInsight graphical interface. For example, + * calling this function at 250 ms intervals is reasonable and more than + * sufficient in most cases. Normally, you should only need to call this + * function during real-time image and graphics generation procedures, or + * from time-consuming processes. + */ + static void ProcessEvents( bool excludeUserInputEvents = false ); + +protected: + + /*! + * \internal + */ + ProcessInterface( int ); + +private: + + size_type m_launchCount = 0; + bool m_autoSaveGeometry = true; + + void PerformAPIDefinitions() const override; + + friend class InterfaceDispatcher; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_ProcessInterface_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProcessInterface.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProcessParameter.h b/3rdparty/include/pcl/ProcessParameter.h new file mode 100644 index 0000000..92b3252 --- /dev/null +++ b/3rdparty/include/pcl/ProcessParameter.h @@ -0,0 +1,695 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProcessParameter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProcessParameter_h +#define __PCL_ProcessParameter_h + +/// \file pcl/ProcessParameter.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ProcessParameterType + * \brief %Process parameter data types. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ProcessParameterType::Invalid Represents an invalid process parameter type
ProcessParameterType::UInt8 Unsigned 8-bit integer (unsigned char)
ProcessParameterType::Int8 Signed 8-bit integer (char)
ProcessParameterType::UInt16 Unsigned 16-bit integer (unsigned short)
ProcessParameterType::Int16 Signed 16-bit integer (short)
ProcessParameterType::UInt32 Unsigned 32-bit integer (unsigned int)
ProcessParameterType::Int32 Signed 32-bit integer (int)
ProcessParameterType::UInt64 Unsigned 64-bit integer (unsigned long long)
ProcessParameterType::Int64 Signed 64-bit integer (long long)
ProcessParameterType::Float IEEE 754 single precision (float, 32-bit floating point)
ProcessParameterType::Double IEEE 754 double precision (double, 64-bit floating point)
ProcessParameterType::Boolean Boolean (implemented as uint32, where true=1 and false=0)
ProcessParameterType::Enumeration Enumerated (implemented as int32)
ProcessParameterType::String String (Unicode string encoded as UTF-16)
ProcessParameterType::Block Block (implemented as ByteArray)
ProcessParameterType::Table Table process parameter
+ */ +namespace ProcessParameterType +{ + enum value_type + { + Invalid = -1, + UInt8 = 0, + Int8, + UInt16, + Int16, + UInt32, + Int32, + UInt64, + Int64, + Float, + Double, + Boolean, + Enumeration, + String, + Block, + Table, + NumberOfTypes + }; + + /*! + * \defgroup process_parameter_classification Process Parameter \ + * Classification + */ + + /*! + * Returns true ifff the specified \a type corresponds to a numeric + * parameter data type. + * \ingroup process_parameter_classification + */ + inline bool IsNumeric( int type ) + { + return type >= UInt8 && type <= Double; + } + + /*! + * Returns true ifff the specified \a type corresponds to an integer + * parameter data type. + * \ingroup process_parameter_classification + */ + inline bool IsInteger( int type ) + { + return type >= UInt8 && type <= Int64; + } + + /*! + * Returns true ifff the specified \a type corresponds to a floating point + * real parameter data type. + * \ingroup process_parameter_classification + */ + inline bool IsReal( int type ) + { + return type == Float || type == Double; + } + + /*! + * Returns true ifff the specified \a type corresponds to a variable-length + * parameter data type. + * \ingroup process_parameter_classification + */ + inline bool IsVariableLength( int type ) + { + return type == String || type == Block || type == Table; + } +} + +// ---------------------------------------------------------------------------- + +class Process; +class ProcessParameterPrivate; + +/*! + * \class ProcessParameter + * \brief Identifies and describes a process parameter. + * + * The %ProcessParameter class describes and identifies process parameters + * through intermodule communication with the Process and ProcessInstance + * classes. + * + * As happens with the Process / MetaProcess and ProcessInstance / + * ProcessImplementation pairs, %ProcessParameter is the concrete counterpart + * to MetaParameter. %ProcessParameter represents a parameter of an already + * installed process, while %MetaParameter is a formal description of a + * parameter of a process implemented by subclassing %MetaProcess and + * %ProcessImplementation. + * + * Note that an instance of %ProcessParameter represents an existing parameter + * of an installed process, so you cannot create or define new parameters using + * this class. You can only use this class to get a complete description of a + * parameter, including its identifier, range of valid values, allowed lengths, + * default values, etc. You can also use %ProcessParameter to identify a + * parameter to get or set its current value in an existing process instance, + * which you can manipulate with the ProcessInstance class. + * + * \sa Process, ProcessInstance, MetaProcess, MetaParameter, ProcessImplementation + */ +class PCL_CLASS ProcessParameter +{ +public: + + /*! + * Represents a parameter data type. + */ + typedef ProcessParameterType::value_type data_type; + + /*! + * A list of process parameters. + * + * This type is returned by the TableColumns() member function to describe + * and identify the set of column parameters of a table process parameter. + */ + typedef Array parameter_list; + + /*! + * \struct EnumerationElement + * \brief Structure used to describe an enumeration element. + */ + struct EnumerationElement + { + IsoString id; //!< Element identifier + IsoStringList aliases; //!< Alias identifiers + int value; //!< Element value + }; + + /*! + * A list of enumeration elements. + * + * This type is returned by the EnumerationElements() member function to + * describe an enumeration process parameter. + */ + typedef Array enumeration_element_list; + + /*! + * Constructs a %ProcessParameter object. + * + * \param process Reference to a the process from which you want to gain + * access to one of its parameters. + * + * \param paramId Identifier of the process parameter. It can be the + * primary identifier of a parameter, or one of its alias + * identifiers. + * + * If successful, this constructor creates a managed alias to a process + * parameter of an installed process in the PixInsight core application. + * + * If there is no parameter of \a process with the specified identifier, if + * \a paramId is not a valid identifier, or if the alias object cannot be + * generated for some reason, this constructor throws an Error exception + * with the corresponding error message. Your code should guarantee that + * these exceptions are always caught and handled appropriately. + * + * \note Note that this constructor does not 'create' a new process + * parameter. It only gives access to a parameter of an existing process. + */ + ProcessParameter( const Process& process, const IsoString& paramId ); + + ProcessParameter( const Process& process, const IsoString::ustring_base& paramId ) + : ProcessParameter( process, IsoString( paramId ) ) + { + } + + /*! + * Constructs a %ProcessParameter object that identifies a table column + * parameter. + * + * \param table Reference to a valid table parameter. + * + * \param colId Identifier of the column parameter. It can be the + * primary identifier of a column parameter, or one of its + * alias identifiers. + * + * If successful, this constructor creates a managed alias to a table column + * parameter of an installed process in the PixInsight core application. + * + * If there is no column parameter of \a table with the specified + * identifier, if \a table is not a table parameter, if \a colId is not a + * valid identifier, or if the alias object cannot be generated for some + * reason, this constructor throws an Error exception with the corresponding + * error message. Your code should guarantee that these exceptions are + * always caught and handled appropriately. + * + * \note Note that this constructor does not 'create' a new process + * parameter. It only gives access to a parameter of an existing process. + */ + ProcessParameter( const ProcessParameter& table, const IsoString& colId ); + + ProcessParameter( const ProcessParameter& table, const IsoString::ustring_base& colId ) + : ProcessParameter( table, IsoString( colId ) ) + { + } + + /*! + * Copy constructor. The newly constructed object references the same + * server-side process parameter as the specified object \a p. + * + * \note Note that this constructor does not 'create' a new process + * parameter. It only gives access to a parameter of an existing process. + */ + ProcessParameter( const ProcessParameter& p ); + + /*! + * Destroys this %ProcessParameter object. + */ + virtual ~ProcessParameter(); + + /*! + * Returns true iff this is a \e null %ProcessParameter object. + * + * A null %ProcessParameter does not correspond to an existing parameter of + * an installed process in the PixInsight core application. + */ + bool IsNull() const; + + /*! + * Returns a reference to a null %ProcessParameter object. A null + * %ProcessParameter does not correspond to an existing parameter of an + * installed process in the PixInsight core application. + */ + static ProcessParameter& Null(); + + /*! + * Returns a reference to a Process object that represents the installed + * process this parameter belongs to. + */ + Process& ParentProcess() const; + + /*! + * If this parameter is a table column parameter, this function returns a + * %ProcessParameter object that represents the table process parameter this + * table column belongs to. + * + * If this parameter is not a table column parameter, this function returns + * a null %ProcessParameter object. + */ + ProcessParameter ParentTable() const; + + /*! + * Returns the identifier of this process parameter. + * + * Each process parameter has a valid and unique (within its parent process) + * identifier. All object identifiers follow the C syntax rules for variable + * identifiers in PixInsight. + * + * \sa Aliases() + */ + IsoString Id() const; + + /*! + * Returns a list of alias identifiers for this process parameter. + * + * A process parameter can have one or more alias identifiers. + * Aliased parameters are useful to maintain compatibility with previous + * versions of a process. + * + * When the PixInsight core application imports a process instance (e.g. + * from a process icon) it automatically replaces alias parameter + * identifiers with actual (current) identifiers. This allows a developer to + * change the identifiers of some process parameters without breaking + * compatibility with process instances in existing icon collections or + * projects. + * + * This function returns a list of identifiers that are treated as synonyms + * to the actual identifier of this parameter, which is returned by the Id() + * member function. If this parameter has no aliases, an empty list is + * returned. Two parameters of a process can't have the same alias, so each + * identifier in the list should be unique within its parent process. + * + * \sa Id() + */ + IsoStringList Aliases() const; + + /*! + * Returns true iff this process parameter is required to build new process + * instances. Returns false if a default value can be valid for this process + * parameter when an actual value is not available. + * + * When a new instance is being constructed and the process parameter that + * this object represents is not present (for example, because it is not + * defined in a serialized representation of the instance), the PixInsight + * core application has to decide whether a default, automatically generated + * value may be acceptable, or if the explicit presence of an actual value + * for this parameter is imprescindible. This member function allows a + * module to know this in advance. + */ + bool IsRequired() const; + + /*! + * Returns true if this object represents a read-only process parameter. + * Otherwise full read/write access is granted for this parameter. + * + * Read-only process parameters, also known as output properties, + * cannot be changed by external processes. For example, a script running on + * the core application can retrieve an output property from a process + * instance, but it cannot change its value. The same happens with PCL's + * implementation represented by the Process and ProcessInstance classes. + * + * Read-only parameters are often used to provide resulting values or + * process status information after instance execution. For example, the + * standard ImageIntegration process includes several read-only parameters + * that can be accessed from a script or module to know the identifiers of + * the views generated to store the integrated image and the rejection map + * images. This improves versatility and usability of processes, and + * provides more accurate and extensive information to developers. + */ + bool IsReadOnly() const; + + /*! + * Returns a brief (and hopefully useful) description of this process + * parameter. + */ + String Description() const; + + /*! + * Returns a script comment for this process parameter. + * + * The returned string is intended to be used as a source code comment to + * document process parameters in automatically generated scripts. + */ + String ScriptComment() const; + + /*! + * Returns the data type of this process parameter. For a list of valid + * parameter types, see the ProcessParameterType namespace. + * + * For a null %ProcessParameter object, this member function returns + * ProcessParameterType::Invalid. + */ + data_type Type() const; + + /*! + * Returns the appropriate data type to interpret this block process + * parameter. + * + * If this object does not represent a block parameter, or if this is a null + * object, this member function returns ProcessParameterType::Invalid. + */ + data_type DataInterpretation() const; + + /*! + * Returns true iff this object represents a Boolean process parameter. + */ + bool IsBoolean() const + { + return Type() == ProcessParameterType::Boolean; + } + + /*! + * Returns true iff this object represents a numeric process parameter. + */ + bool IsNumeric() const + { + return ProcessParameterType::IsNumeric( Type() ); + } + + /*! + * Returns true iff this object represents an integer process parameter. + */ + bool IsInteger() const + { + return ProcessParameterType::IsInteger( Type() ); + } + + /*! + * Returns true iff this object represents a floating point real process + * parameter. + */ + bool IsReal() const + { + return ProcessParameterType::IsReal( Type() ); + } + + /*! + * Returns true iff this object represents an enumerated process parameter. + */ + bool IsEnumeration() const + { + return Type() == ProcessParameterType::Enumeration; + } + + /*! + * Returns true iff this object represents a variable-length process + * parameter. + */ + bool IsVariableLength() const + { + return ProcessParameterType::IsVariableLength( Type() ); + } + + /*! + * Returns true iff this object represents a string process parameter. + */ + bool IsString() const + { + return Type() == ProcessParameterType::String; + } + + /*! + * Returns true iff this object represents a block process parameter. + */ + bool IsBlock() const + { + return Type() == ProcessParameterType::Block; + } + + /*! + * Returns true iff this object represents a table process parameter. + */ + bool IsTable() const + { + return Type() == ProcessParameterType::Table; + } + + /*! + * Returns the default value of this process parameter. + * + * This function returns a Variant object with the default parameter value. + * The type of the %Variant object depends on the type of this parameter. + * + * Default values are directly available for Boolean, numeric and string + * parameters. + * + * For enumerated parameters, this function returns the index of the default + * enumeration element. The returned integer can be used as an index on the + * list of elements returned by EnumerationElements(). + * + * For a block parameter an empty ByteArray is always returned, since block + * parameters don't have default values. + * + * For table parameters this function throws an Error exception. + * + * For a null %ProcessParameter object, this member function returns an + * invalid Variant object; see Variant::IsValid(). + */ + Variant DefaultValue() const; + + /*! + * Gets the valid range of values for a numeric process parameter. + * + * \param[out] minValue Minimum valid value of this numeric parameter. + * \param[out] maxValue Maximum valid value of this numeric parameter. + * + * If this parameter is not of a numeric type, or if this is a null object, + * this member function will set both output values to zero. + * + * If this numeric parameter does not impose a specific range of valid + * values, this member function will set the following output values: + * + * \a minValue = -DBL_MAX \n + * \a maxValue = +DBL_MAX. + * + * \sa MinimumValue(), MaximumValue() + */ + void GetNumericRange( double& minValue, double& maxValue ) const; + + /*! + * Returns the minimum valid value of a numeric process parameter. + * \sa GetNumericRange(), MaximumValue() + */ + double MinimumValue() const + { + double min, dum; + GetNumericRange( min, dum ); + return min; + } + + /*! + * Returns the maximum valid value of a numeric process parameter. + * \sa GetNumericRange(), MinimumValue() + */ + double MaximumValue() const + { + double dum, max; + GetNumericRange( dum, max ); + return max; + } + + /*! + * Returns the number of decimal digits used for literal representations of + * this floating point process parameter. + * + * If this parameter is not of a floating point numeric type, or if this is + * a null object, this function returns zero. Otherwise, this function + * returns a positive or negative integer value with the following meanings: + * + * If a value >= 0 is returned, literal representations are always rounded + * to the nearest value with the specified amount of decimal digits. If this + * function returns zero, output values corresponding to this parameter will + * always be rounded to the nearest integer. + * + * If this function returns a negative integer, literal representations will + * use the standard printf's \e g-format. In this format, numerical values + * are represented in a compact fashion, with automatic selection of + * exponential or fixed representations, depending on the value's magnitude + * and fractional accuracy. + * + * \sa ScientificNotation() + */ + int Precision() const; + + /*! + * Returns true iff this floating point process parameter requires scientific + * notation for literal representations. Returns false if this parameter + * requires fixed point notation, or if this is a null object. + * + * \sa Precision() + */ + bool ScientificNotation() const; + + /*! + * Gets the valid range of lengths for this variable length process + * parameter. + * + * \param[out] minLength Minimum valid length of this parameter. + * \param[out] maxLength Maximum valid length of this parameter. + * + * If this parameter is not of a variable length type, or if this is a null + * object, this member function will set both output values to zero. + * + * If this parameter does not impose a specific range of valid lengths, this + * member function will set the following output values: + * + * \a minValue = 0 \n + * \a maxValue = ~size_type( 0 ). + * + * \sa MinimumLength(), MaximumLength() + */ + void GetLengthLimits( size_type& minLength, size_type& maxLength ) const; + + /*! + * Returns the minimum valid length of a variable length process parameter. + * \sa GetLengthLimits(), MaximumLength() + */ + size_type MinimumLength() const + { + size_type min, dum; + GetLengthLimits( min, dum ); + return min; + } + + /*! + * Returns the maximum valid length of a variable length process parameter. + * \sa GetLengthLimits(), MinimumLength() + */ + size_type MaximumLength() const + { + size_type dum, max; + GetLengthLimits( dum, max ); + return max; + } + + /*! + * Returns a list of EnumerationElement structures describing all the + * elements of this enumeration process parameter. + * + * If this parameter is not of an enumerated type, or if this is a null + * object, this member function returns an empty list. + */ + enumeration_element_list EnumerationElements() const; + + /*! + * Returns a string with the valid characters of this string process + * parameter. + * + * If this parameter is not of a string type, if this string parameter does + * not impose a specific set of valid characters, or if this is a null + * object, this member function returns an empty string. + */ + String AllowedCharacters() const; + + /*! + * Returns the list of column parameters in this table process parameter. + * + * If this object does not represent a table parameter, or if this is a null + * object, this member function returns an empty list. + */ + parameter_list TableColumns() const; + + // ------------------------------------------------------------------------- + +private: + + AutoPointer m_data; + + ProcessParameter( const void* ); + + const void* Handle() const; + + friend class ProcessInstance; + friend class InternalParameterEnumerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ProcessParameter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProcessParameter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProgressBarStatus.h b/3rdparty/include/pcl/ProgressBarStatus.h new file mode 100644 index 0000000..1fba3a8 --- /dev/null +++ b/3rdparty/include/pcl/ProgressBarStatus.h @@ -0,0 +1,143 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProgressBarStatus.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProgressBarStatus_h +#define __PCL_ProgressBarStatus_h + +/// \file pcl/ProgressBarStatus.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS ProgressDialog; + +/*! + * \class ProgressBarStatus + * \brief A status monitoring callback that shows a modal progress dialog. + * + * %ProgressBarStatus is a StatusCallback derived class that opens a modal + * ProgressDialog to provide visual feedback about a running process, without + * freezing the graphical user interface dugin potentially long tasks. It + * allows the user to interrupt the process by activating a standard Cancel + * button on the progress dialog. This class supports both bounded and + * unbounded status monitors. + * + * \sa StatusCallback, StatusMonitor, StandardStatus, SpinStatus, MuteStatus + */ +class PCL_CLASS ProgressBarStatus : public StatusCallback +{ +public: + + /*! + * Constructs a %ProgressBarStatus object. + * + * \param title The window title for the modal progress bar dialog box. + * + * \param parent The parent control of the modal progress bar dialog box. + * The default value is Control::Null(), which creates a + * child top-level window of the current workspace. + */ + ProgressBarStatus( const String& title, Control& parent = Control::Null() ); + + /*! + * Virtual destructor. + */ + virtual ~ProgressBarStatus(); + + /*! + * This function is called by a status \a monitor object when a new + * monitored process is about to start. + */ + int Initialized( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal an update of the + * progress count for the current process. + */ + int Updated( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal that the current + * process has finished. + */ + int Completed( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object when the progress + * information for the current process has been changed. + */ + void InfoUpdated( const StatusMonitor& monitor ) const override; + +private: + + mutable AutoPointer m_progressDialog; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ProgressBarStatus_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProgressBarStatus.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProgressDialog.h b/3rdparty/include/pcl/ProgressDialog.h new file mode 100644 index 0000000..abfc87b --- /dev/null +++ b/3rdparty/include/pcl/ProgressDialog.h @@ -0,0 +1,275 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProgressDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProgressDialog_h +#define __PCL_ProgressDialog_h + +/// \file pcl/ProgressDialog.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ProgressDialog + * \brief A simple progress bar dialog box. + * + * %ProgressDialog is a specialized modal dialog box to provide visual feedback + * about an ongoing task during potentially long processes. It includes a + * progress bar indicator that can change its graphical appearance to show the + * percentage of the total work already done (\e bounded progress bar), or just + * to inform the user that the task is still being done (unbounded case). The + * dialog also provides a customizable text label and an optional Cancel button + * that the user can activate to interrupt the process. + * + * \sa ProgressBarStatus + */ +class PCL_CLASS ProgressDialog : public Dialog +{ +public: + + /*! + * Constructs a %ProgressDialog. + * + * \param text The text that will be shown on the informative label above + * the progress bar. The default text is an empty string, + * which hides the informative label. + * + * \param title The title of the dialog box window. The default value is + * an empty string, which causes the window to show a default + * title defined by the PixInsight core application. + * + * \param lowerBound The minimum value of the progress bar. The default + * value is zero. + * + * \param upperBound The maximum value of the progress bar. The default + * value is 100, which is appropriate to show progress values + * as a percentage of the total work. + * + * \param parent The parent control of this dialog. The default value + * is Control::Null(), which creates a child top-level window + * of the current workspace. + */ + ProgressDialog( const String& text = String(), + const String& title = String(), + size_type lowerBound = 0, size_type upperBound = 100, + Control& parent = Control::Null() ); + + /*! + * Sets the window title for this dialog box. + */ + void SetTitle( const String& title ); + + /*! + * Sets the range of values for the progress bar indicator. + * + * \param lowerBound The minimum value of the progress bar. + * + * \param upperBound The maximum value of the progress bar. + * + * If both bounds are set to the same value, e.g. \a lowerBound = + * \a upperBound = 0, the progress bar will be \e unbounded. Unbounded + * progress bars change their appearance in a special way to show that the + * running process is still working, but without any specific information + * about the amount of the total work already done. + */ + void SetRange( size_type lowerBound, size_type upperBound ); + + /*! + * Causes the progress bar to be \e unbounded. + * + * Bounded progress bars show information about the amount of the total work + * already done. Unbounded progress bars change their appearance to inform + * that the process is still running, but without any specific hint about + * the amount of pending work. Calling this function is equivalent to: + * + * \code SetRange( 0, 0 ); \endcode + */ + void SetUnbounded() + { + SetRange( 0, 0 ); + } + + /*! + * Returns the lower bound of the progress bar indicator, or zero if the + * progress bar is unbounded. + */ + size_type LowerBound() const + { + return m_lowerBound; + } + + /*! + * Returns the upper bound of the progress bar indicator, or zero if the + * progress bar is unbounded. + */ + size_type UpperBound() const + { + return m_upperBound; + } + + /*! + * Sets the informative text shown on a label above the progress bar. + */ + void SetText( const String& text ); + + /*! + * Sets the current value of the progress bar indicator. + * + * If the progress bar is bounded, the specified \a value will be + * constrained to the current limits, as reported by LowerBound() and + * UpperBound(). + * + * If the progress bar is unbounded, the \a value argument will be ignored + * and the progress bar indicator will change graphically to provide + * feedback about a running process, but without any specific information + * about the amount of work already done. + * + * In all cases the progress bar will be updated on the screen as soon as + * possible after returning from this function. + */ + void SetValue( size_type value ); + + /*! + * Increments the value of the progress bar indicator. + * + * Calling this function is equivalent to: + * + * \code SetValue( m_value + 1 ); \endcode + */ + void Increment() + { + SetValue( m_value + 1 ); + } + + /*! + * Returns true if the Cancel button has been activated by the user, if it + * is enabled. + */ + bool IsCanceled() const + { + return m_canceled; + } + + /*! + * Enables the Cancel button of this progress dialog. When the Cancel button + * is enabled, the user can activate it to interrupt the running process. + */ + void EnableCancelButton( bool enable = true ); + + /*! + * Disables the Cancel button of this progress dialog. When the Cancel + * button is disabled, the user has no way to interrupt the running process. + */ + void DisableCancelButton( bool disable = true ) + { + EnableCancelButton( !disable ); + } + + /*! + * Returns true if the Cancel button is currently enabled. + */ + bool IsCancelButtonEnabled() const + { + return m_cancelButton.IsVisible(); + } + +protected: + + /*! + * \class ProgressDialog::ProgressBar + * \internal + */ + class ProgressBar : public Control + { + public: + + ProgressBar(); + + private: + + double m_value = 0; // only if bounded, in [0,1] + size_type m_step = 0; // only if unbounded, in [0,Width()-1] + bool m_bounded = true; + + void e_Paint( Control&, const Rect& ); + + friend class ProgressDialog; + }; + + size_type m_lowerBound = 0; + size_type m_upperBound = 100; + size_type m_value = 0; + bool m_canceled = false; + Label m_infoLabel; + ProgressBar m_progressBar; + PushButton m_cancelButton; + + void e_Click( Button& sender, bool checked ); + void e_Close( Control& sender, bool& allowClose ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ProgressDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProgressDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProjectionBase.h b/3rdparty/include/pcl/ProjectionBase.h new file mode 100644 index 0000000..d116fb1 --- /dev/null +++ b/3rdparty/include/pcl/ProjectionBase.h @@ -0,0 +1,231 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProjectionBase.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProjectionBase_h +#define __PCL_ProjectionBase_h + +/// \file pcl/ProjectionBase.h + +#include + +#include +#include +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ProjectionBase + * \brief Base class of all projection systems + * + * \ingroup astrometry_support + */ +class PCL_CLASS ProjectionBase +{ +public: + + /*! + * Virtual destructor. + */ + virtual ~ProjectionBase() + { + } + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + virtual ProjectionBase* Clone() const = 0; + + /*! + * Returns the WCS projection identifier for this projection system. + */ + virtual IsoString ProjCode() const = 0; + + /*! + * Returns the readable name of this projection system. + */ + virtual IsoString Name() const = 0; + + /*! + * Updates the specified WCS metadata with field values corresponding to + * this projection. + */ + virtual void GetWCS( WCSKeywords& wcs ) const; + + /*! + * + */ + void InitFromRefPoint( double lng0, double lat0, const Optional& phip = Optional() ); + + /*! + * Transforms from celestial coordinates to world coordinates. + */ + virtual bool Direct( DPoint& pW, const DPoint& pRD ) const noexcept + { + DPoint pN = m_sph.CelestialToNative( pRD ); + return IsFinite( pN.x ) && IsFinite( pN.y ) && Project( pW, pN ); + } + + /*! + * Transforms from world coordinates to celestial coordinates. + */ + virtual bool Inverse( DPoint& pRD, const DPoint& pW ) const noexcept + { + DPoint pN; + if ( Unproject( pN, pW ) ) + if ( IsFinite( pN.x ) ) + if ( IsFinite( pN.y ) ) + { + pRD = m_sph.NativeToCelestial( pN ); + return true; + } + return false; + } + + /*! + * + */ + virtual bool CheckBrokenLine( const DPoint& cp1, const DPoint& cp2 ) const noexcept + { + return DistanceFast( m_sph.CelestialToNative( cp1 ), m_sph.CelestialToNative( cp2 ) ) < 150; + } + + /*! + * Returns the equatorial coordinates of the projection origin. + */ + virtual DPoint ProjectionOrigin() const + { + return DPoint( Deg( m_ra0 ), Deg( m_dec0 ) ); + } + + /*! + * Returns the distance in degrees between two locations in equatorial + * coordinates. + */ + static double Distance( const DPoint& p1, const DPoint& p2 ) + { + double sinX, cosX; + SinCos( Rad( Abs( p1.x - p2.x ) ), sinX, cosX ); + double sinY1, cosY1; + SinCos( Rad( p1.y ), sinY1, cosY1 ); + double sinY2, cosY2; + SinCos( Rad( p2.y ), sinY2, cosY2 ); + double K = cosY1*sinY2 - sinY1*cosY2*cosX; + return Deg( ArcTan( Sqrt( cosY2*sinX*cosY2*sinX + K*K ), sinY1*sinY2 + cosY1*cosY2*cosX ) ); + }; + + /*! + * Returns the distance in degrees between two locations in equatorial + * coordinates. Uses an approximate, faster algorithm. + */ + static double DistanceFast( const DPoint& p1, const DPoint& p2 ) + { + double sinY1, cosY1; + SinCos( Rad( p1.y ), sinY1, cosY1 ); + double sinY2, cosY2; + SinCos( Rad( p2.y ), sinY2, cosY2 ); + return Deg( ArcCos( sinY1*sinY2 + cosY1*cosY2*Cos( Rad( p1.x - p2.x ) ) ) ); + } + +protected: + + double m_ra0 = 0; // radians + double m_dec0 = 0; // radians + double m_theta0 = 0; // degrees + double m_phi0 = 0; // degrees + Optional m_lonpole; // degrees + Optional m_latpole; // degrees + SphericalRotation m_sph; + + /*! + * Default constructor. + */ + ProjectionBase() = default; + + /*! + * Copy constructor. + */ + ProjectionBase( const ProjectionBase& ) = default; + + /*! + * Initialization from WCS metadata. + */ + void InitFromWCS( const WCSKeywords& ); + + /*! + * Transforms from world coordinates to native spherical coordinates. + */ + virtual bool Project( DPoint& pW, const DPoint& pN ) const noexcept = 0; + + /*! + * Transforms from native spherical coordinates to world coordinates. + */ + virtual bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept = 0; + + friend class ProjectionFactory; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ProjectionBase_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProjectionBase.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ProjectionFactory.h b/3rdparty/include/pcl/ProjectionFactory.h new file mode 100644 index 0000000..c1fa815 --- /dev/null +++ b/3rdparty/include/pcl/ProjectionFactory.h @@ -0,0 +1,146 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ProjectionFactory.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ProjectionFactory_h +#define __PCL_ProjectionFactory_h + +/// \file pcl/ProjectionFactory.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ProjectionFactory + * \brief Selectable projection system + * + * %ProjectionFactory implements a projection system that can be selected upon + * construction among all of the projections implemented in the PixInsight/PCL + * platform. + * + * \ingroup astrometry_support + */ +class PCL_CLASS ProjectionFactory +{ +public: + + /*! + * Creates a new projection for the specified WCS projection \a code and + * origin equatorial coordinates \a ra and \a dec in degrees. + * + * The following WCS projection codes are supported in current PCL versions: + * + * TAN\n + * STG\n + * CAR\n + * MER\n + * AIT\n + * ZEA\n + * SIN + * + * The specified WCS projection \a code is case insensitive and can contain + * leading and trailing spaces. + */ + static ProjectionBase* CreateByWCSCode( const IsoString& code, double ra, double dec ); + + static ProjectionBase* CreateByWCSCode( const IsoString::ustring_base& code, double ra, double dec ) + { + return CreateByWCSCode( IsoString( code ), ra, dec ); + } + + /*! + * Creates a new projection for the specified projection \a name and origin + * equatorial coordinates \a ra and \a dec in degrees. + * + * The following projection names are supported in current PCL versions: + * + * Gnomonic\n + * Stereographic\n + * PlateCarree\n + * Mercator\n + * HammerAitoff\n + * ZenithalEqualArea\n + * Orthographic + * + * The specified projection \a name is case insensitive and can contain + * leading and trailing spaces. + */ + static ProjectionBase* CreateByName( const IsoString& name, double ra, double dec ); + + static ProjectionBase* CreateByName( const IsoString::ustring_base& name, double ra, double dec ) + { + return CreateByName( IsoString( name ), ra, dec ); + } + + /*! + * Creates a new projection with data acquired from the specified WCS + * keywords. + */ + static ProjectionBase* Create( const WCSKeywords& wcs ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ProjectionFactory_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ProjectionFactory.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Property.h b/3rdparty/include/pcl/Property.h new file mode 100644 index 0000000..c6a202b --- /dev/null +++ b/3rdparty/include/pcl/Property.h @@ -0,0 +1,278 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Property.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Property_h +#define __PCL_Property_h + +/// \file pcl/Property.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Property + * \brief An identifier-value association + * + * %Property is a simple identifier-value association, useful to transport + * properties associated with views and images on the PixInsight platform. + * + * The View and FileFormatInstance classes include member functions to generate + * PropertyArray containers, namely View::Properties(), + * FileFormatInstance::ReadProperties() and + * FileFormatInstance::ReadImageProperties(). + */ +class PCL_CLASS Property +{ +public: + + /*! + * Represents the string class used to transport property identifiers. + */ + typedef IsoString identifier_type; + + /*! + * Represents the class used to transport property values. + */ + typedef Variant value_type; + + /*! + * Represents the data type of a property value. + */ + typedef value_type::data_type data_type; + + /*! + * Default constructor. Constructs an invalid %Property object with an empty + * property identifier and an invalid property value. + */ + Property() = default; + + /*! + * Copy constructor. + */ + Property( const Property& ) = default; + + /*! + * Move constructor. + */ + Property( Property&& ) = default; + + /*! + * Constructs a %Property object with the specified property \a identifier + * and property \a value. + */ + Property( const identifier_type& identifier, const value_type& value ) + : m_id( identifier ) + , m_value( value ) + { + } + + /*! + * Constructs a %Property object with the specified property \a identifier + * and an undefined (invalid) property value. + */ + Property( const identifier_type& identifier ) + : m_id( identifier ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Property& operator =( const Property& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + Property& operator =( Property&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~Property() + { + } + + /*! + * Returns the property identifier. + */ + const identifier_type& Identifier() const + { + return m_id; + } + + /*! + * Returns the property identifier. This function is a convenience synonym + * for Identifier(). + */ + const identifier_type& Id() const + { + return Identifier(); + } + + /*! + * Returns the property value. + */ + const value_type& Value() const + { + return m_value; + } + + /*! + * Assigns the specified \a value to this property. The previous value will + * be replaced with the new one and hence will be lost. + */ + void SetValue( const value_type& value ) + { + m_value = value; + } + + /*! + * Returns the data type of this property, which is the data type of its + * value. + */ + data_type Type() const + { + return m_value.Type(); + } + + /*! + * Returns a description of this property, including its identifier and + * value data type. + */ + PropertyDescription Description() const + { + return PropertyDescription( m_id, m_value.Type() ); + } + + /*! + * Returns true iff the specified string \a id is a valid property + * identifier. Refer to XISF::IsValidPropertyId() for property identifier + * syntax rules. + */ + static bool IsValidIdentifier( const IsoString& id ) + { + if ( id.IsEmpty() ) + return false; + IsoStringList tokens; + id.Break( tokens, ':' ); + for ( const IsoString& token : tokens ) + if ( !token.IsValidIdentifier() ) + return false; + return true; + } + + static bool IsValidIdentifier( const IsoString::ustring_base& id ) + { + return IsValidIdentifier( IsoString( id ) ); + } + + /*! + * Returns true iff this property is valid. A valid property has a valid + * identifier and a valid value. + */ + bool IsValid() const + { + return IsValidIdentifier( m_id ) && m_value.IsValid(); + } + + /*! + * Equality operator. Returns true iff this property is equal to \a other + * property. + * + * Two %Property objects are equal if their identifiers are equal. Keep in + * mind that this operator compares properties, not their values. + */ + bool operator ==( const Property& other ) const + { + return m_id == other.m_id; + } + + /*! + * Less than operator. Returns true iff this property precedes \a other + * property. + * + * For comparisons of %Property objects, only their identifiers are taken + * into account. Keep in mind that this operator compares properties, not + * their values. + */ + bool operator <( const Property& other ) const + { + return m_id < other.m_id; + } + +protected: + + identifier_type m_id; + value_type m_value; +}; + +/*! + * \class pcl::PropertyArray + * \brief Dynamic array of Property objects + * + * %PropertyArray is a template instantiation of Array<> for Property. + */ +typedef Array PropertyArray; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Property_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Property.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PropertyDescription.h b/3rdparty/include/pcl/PropertyDescription.h new file mode 100644 index 0000000..62e8d73 --- /dev/null +++ b/3rdparty/include/pcl/PropertyDescription.h @@ -0,0 +1,164 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PropertyDescription.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PropertyDescription_h +#define __PCL_PropertyDescription_h + +/// \file pcl/PropertyDescription.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PropertyDescription + * \brief A structure to describe a data property + * + * This structure is used (instantiated in PropertyDescriptionArray + * containers) by the FileFormatImplementation and FileFormaInstance classes to + * describe data properties stored in image files, among other classes. + * + * \sa FileFormatImplementation, FileFormatInstance + */ +struct PCL_CLASS PropertyDescription +{ + /*! + * An enumeration of supported property data types. + */ + typedef VariantType::value_type data_type; + + IsoString id; //!< Identifier of this property. + data_type type = VariantType::Invalid; //!< Property data type. + + /*! + * Default constructor. Constructs an %PropertyDescription object with + * an empty property identifier and unspecified (invalid) data type. + */ + PropertyDescription() = default; + + /*! + * Constructs an %PropertyDescription object with the specified + * property identifier and data type. + */ + PropertyDescription( const IsoString& s, data_type t = VariantType::Invalid ) + : id( s ) + , type( t ) + { + } + + /*! + * Copy constructor. + */ + PropertyDescription( const PropertyDescription& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PropertyDescription& operator =( const PropertyDescription& ) = default; + + /*! + * Returns true iff this object represents a valid data property. + */ + bool IsValid() const + { + return type != VariantType::Invalid; + } + + /*! + * Less-than relational operator. Returns true if this object precedes the + * specified object \a x; otherwise returns false. + * + * Since property identifiers are unique within a property's scope (within + * an image file, for example), comparisons of %PropertyDescription + * structures only take into account the PropertyDescription::id member. + */ + bool operator <( const PropertyDescription& x ) const + { + return id < x.id; + } + + /*! + * Equality operator. Returns true if this object refers to the same + * property as the specified object \a x; otherwise returns false. + * + * Since property identifiers are unique within a property's scope (within + * an image file, for example), comparisons of %PropertyDescription + * structures only take into account the PropertyDescription::id member. + */ + bool operator ==( const PropertyDescription& x ) const + { + return id == x.id; + } +}; + +/*! + * \class pcl::PropertyDescriptionArray + * \brief Dynamic array of PropertyDescription structures + * + * %PropertyDescriptionArray is a template instantiation of Array for + * PropertyDescription. + */ +typedef Array PropertyDescriptionArray; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PropertyDescription_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PropertyDescription.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PushButton.h b/3rdparty/include/pcl/PushButton.h new file mode 100644 index 0000000..c8facd6 --- /dev/null +++ b/3rdparty/include/pcl/PushButton.h @@ -0,0 +1,136 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PushButton.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PushButton_h +#define __PCL_PushButton_h + +/// \file pcl/PushButton.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class PushButton + * \brief Client-side interface to a PixInsight %PushButton control. + * + * ### TODO: Write a detailed description for %PushButton + */ +class PCL_CLASS PushButton : public Button +{ +public: + + /*! + * Constructs a %PushButton with the specified \a text and \a icon, as a + * child control of \a parent. + */ + PushButton( const String& text = String(), + const pcl::Bitmap& icon = Bitmap::Null(), + Control& parent = Control::Null() ); + + /*! + * Destroys a %PushButton control. + */ + virtual ~PushButton() + { + } + + /*! + * Returns true, since push buttons are pushable buttons. + */ + bool IsPushable() const override + { + return true; + } + + /*! + * Returns false, since push buttons are not checkable buttons. + */ + bool IsCheckable() const override + { + return false; + } + + /*! + * Returns true iff this button has been selected as the default + * button of its parent dialog. + * + * The default button is activated when the user presses the Return or Enter + * keys while a modal dialog has the keyboard focus (and these keys are not + * captured by other sibling controls). + */ + bool IsDefault() const; + + /*! + * Selectes this button as the default button of its parent dialog. + * If this button is not a child control of a modal dialog, caling this + * member function has no effect. + */ + void SetDefault( bool = true ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_PushButton_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PushButton.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/PyramidalWaveletTransform.h b/3rdparty/include/pcl/PyramidalWaveletTransform.h new file mode 100644 index 0000000..bb88557 --- /dev/null +++ b/3rdparty/include/pcl/PyramidalWaveletTransform.h @@ -0,0 +1,517 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/PyramidalWaveletTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_PyramidalWaveletTransform_h +#define __PCL_PyramidalWaveletTransform_h + +/// \file pcl/PyramidalWaveletTransform.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class WaveletFilter + * \brief Abstract base class of all orthogonal wavelet filters. + * + * ### TODO: Write a detailed description for %WaveletFilter. + * + * \ingroup multiscale_transforms + */ +class PCL_CLASS WaveletFilter +{ +public: + + /*! + * Constructs a default %WaveletFilter object. + */ + WaveletFilter() = default; + + /*! + * Destroys a %WaveletFilter object. + */ + virtual ~WaveletFilter() + { + } + + /*! + * Returns an identifying name for this wavelet filter. + */ + virtual String Name() const = 0; + + /*! + * Performs an in-place one-dimensional wavelet transform. + * + * \param[in,out] f Starting address of the vector to be transformed. + * + * \param n Length of the input vector. + * + * \param inverse True to perform an inverse wavelet transform. False + * (the default value) to perform a direct wavelet + * transform. + */ + template + void operator ()( T* f, size_type n, bool inverse = false ) const + { + Apply( f, n, inverse ); + } + +protected: + + const double* Kc = nullptr; // wavelet filter coefficients + Vector Kr; // transpose of filter coefficients + int N = 0; // number of coefficients + int ioff = 0; + int joff = 0; + + void Initialize() + { + PCL_CHECK( Kc != nullptr && N > 0 ) + Kr = Vector( N ); + for ( int k = 0, sig = -1; k < N; ++k ) + { + Kr[N-1-k] = sig*Kc[k]; + sig = -sig; + } + // ioff = joff = -(N >> 1); + ioff = -2; + joff = -N + 2; + } + +private: + + void Apply( float*, size_type, bool ) const; + void Apply( double*, size_type, bool ) const; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies4Filter + * \brief Daubechies-4 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies4Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies4Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-4"; + } +}; + +extern PCL_DATA Daubechies4Filter Daubechies4; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies6Filter + * \brief Daubechies-6 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies6Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies6Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-6"; + } +}; + +extern PCL_DATA Daubechies6Filter Daubechies6; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies8Filter + * \brief Daubechies-8 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies8Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies8Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-8"; + } +}; + +extern PCL_DATA Daubechies8Filter Daubechies8; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies10Filter + * \brief Daubechies-10 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies10Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies10Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-10"; + } +}; + +extern PCL_DATA Daubechies10Filter Daubechies10; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies12Filter + * \brief Daubechies-12 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies12Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies12Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-12"; + } +}; + +extern PCL_DATA Daubechies12Filter Daubechies12; + +// ---------------------------------------------------------------------------- + +/*! + * \class Daubechies20Filter + * \brief Daubechies-20 wavelet filter. + * \ingroup multiscale_transforms + */ +class PCL_CLASS Daubechies20Filter : public WaveletFilter +{ +public: + + /*! + * Default constructor. + */ + Daubechies20Filter(); + + /*! + */ + String Name() const override + { + return "Daubechies-20"; + } +}; + +extern PCL_DATA Daubechies20Filter Daubechies20; + +// ---------------------------------------------------------------------------- + +/*! + * \class PyramidalWaveletTransform + * \brief Discrete two-dimensional wavelet transforms by the pyramidal + * algorithms. + * + * \note The dimensions of transformed images must be integer powers of two. + * + * References + * + * Partially based on Numerical Recipes in C, 2nd Ed., by W. H. Press + * et al. + * + * ### TODO: Write a detailed description for %PyramidalWaveletTransform. + * + * \ingroup multiscale_transforms + */ +class PCL_CLASS PyramidalWaveletTransform : public BidirectionalImageTransformation +{ +public: + + /*! + * Default constructor. + * + * \note This constructor yields an uninitialized instance that cannot be + * used prior to initializing it with a reference to a WaveletFilter, which + * will be used as the scaling function of the wavelet transform. + */ + PyramidalWaveletTransform() = default; + + /*! + * Constructs a %PyramidalWaveletTransform instance with the specified + * wavelet filter \a f. + */ + PyramidalWaveletTransform( const WaveletFilter& f ) + : m_scalingFunction( &f ) + { + PCL_CHECK( m_scalingFunction != nullptr ) + } + + /*! + * Copy constructor. + */ + PyramidalWaveletTransform( const PyramidalWaveletTransform& ) = default; + + /*! + * Move constructor. + */ + PyramidalWaveletTransform( PyramidalWaveletTransform&& ) = default; + + /*! + * Destroys this %PyramidalWaveletTransform object. The existing wavelet + * transform is destroyed and deallocated. + */ + virtual ~PyramidalWaveletTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PyramidalWaveletTransform& operator =( const PyramidalWaveletTransform& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PyramidalWaveletTransform& operator =( PyramidalWaveletTransform&& ) = default; + + /*! + * Returns a reference to the scaling function (or + * wavelet filter) used by this wavelet transform. + */ + const WaveletFilter& ScalingFunction() const + { + PCL_PRECONDITION( m_scalingFunction != nullptr ) + return *m_scalingFunction; + } + + /*! + * Sets the scaling function (or wavelet filter) used by + * this wavelet transform. + */ + void SetScalingFunction( const WaveletFilter& f ) + { + Clear(); + m_scalingFunction = &f; + PCL_CHECK( m_scalingFunction != nullptr ) + } + + /*! + * Returns true iff this object applies standard wavelet transforms; + * false if it applies nonstandard wavelet transforms. + */ + bool IsStandard() const + { + return !m_nonstandard; + } + + /*! + * Returns true if this object applies nonstandard wavelet + * transforms; false if it applies nstandard wavelet + * transforms. + * + * This is a convenience member function, equivalent to !IsStandard(). + */ + bool IsNonstandard() const + { + return m_nonstandard; + } + + /*! + * Enables or disables standard wavelet transforms for this + * %PyramidalWaveletTransform object. + * + * Calling this member function implicitly destroys the existing wavelet + * transform. + */ + void SetStandard( bool b = true ) + { + Clear(); + m_nonstandard = !b; + } + + /*! + * Enables or disables nonstandard wavelet transforms for this + * %PyramidalWaveletTransform object. + * + * Calling this member function implicitly destroys the existing wavelet + * transform. + * + * This is a convenience member function, equivalent to SetStandard( !b ). + */ + void SetNonstandard( bool b = true ) + { + Clear(); + m_nonstandard = b; + } + + /*! + * Returns a reference to the wavelet transform in this + * %PyramidalWaveletTransform object. + * + * The returned image is empty if no transform has been performed by this + * %PyramidalWaveletTransform object. + */ + const Image& Transform() const + { + return m_transform; + } + + /*! + * Returns a reference to the wavelet transform in this + * %PyramidalWaveletTransform object. + * + * The returned image is empty if no transform has been performed by this + * %PyramidalWaveletTransform object. + */ + Image& Transform() + { + return m_transform; + } + + /*! + * Destroys and deallocates the existing wavelet transform. + */ + void Clear() + { + m_transform.FreeData(); + } + +protected: + + /* + * Scaling function, or wavelet filter. + */ + const WaveletFilter* m_scalingFunction = nullptr; + + /* + * Flag true if nonstandard transforms are being used. + * Standard transforms are used otherwise (and by default). + */ + bool m_nonstandard = true; + + /* + * Wavelet transform + */ + pcl::Image m_transform; + + void Validate() const; + void DoTransform( StatusMonitor& ); + + // Transform (decomposition) + void Transform( const pcl::Image& ) override; + void Transform( const pcl::DImage& ) override; + void Transform( const pcl::ComplexImage& ) override; + void Transform( const pcl::DComplexImage& ) override; + void Transform( const pcl::UInt8Image& ) override; + void Transform( const pcl::UInt16Image& ) override; + void Transform( const pcl::UInt32Image& ) override; + + // Inverse transform (reconstruction) + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_PyramidalWaveletTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/PyramidalWaveletTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/QuadTree.h b/3rdparty/include/pcl/QuadTree.h new file mode 100644 index 0000000..cda5b4d --- /dev/null +++ b/3rdparty/include/pcl/QuadTree.h @@ -0,0 +1,1453 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/QuadTree.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_QuadTree_h +#define __PCL_QuadTree_h + +/// \file pcl/QuadTree.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * Default bucket capacity for point region quadtree generation. + */ +#define __PCL_QUADTREE_DEFAULT_BUCKET_CAPACITY 40 + +/* + * Default minimum allowed dimension of a quadtree node region. + */ +#define __PCL_QUADTREE_DEFAULT_EPSILON 1.0e-08 + +// ---------------------------------------------------------------------------- + +/*! + * \class QuadTree + * \brief Bucket PR quadtree for two-dimensional point data. + * + * A quadtree is a specialized binary search tree for partitioning of a set of + * points in two dimensions. Quadtrees have important applications in + * computational geometry problems requiring efficient rectangular range + * searching and nearest neighbor queries. + * + * This class implements a bucket point region quadtree structure + * (see Reference 2). + * + * The template type argument T represents the type of a \e point object stored + * in a %QuadTree structure. The type T must have the following properties: + * + * \li The standard default and copy constructors are required:\n + * \n + * T::T() \n + * T::T( const T& ) + * + * \li The \c T::component subtype must be defined. It represents a component + * of an object of type T. For example, if T is a vector type, T::component + * must be the type of a vector component. + * + * \li The array subscript operator must be defined as follows:\n + * \n + * component T::operator []( int i ) const \n + * \n + * This operator must return the value of the first or second component of an + * object being stored in the quadtree. The subindex i will be either 0 or 1 + * for the first or second point component, respectively. + * + * \b References + * + * 1. Mark de Berg et al, Computational Geometry: Algorithms and + * Applications Third Edition, Springer, 2010, Chapter 14. + * + * 2. Hanan Samet, Foundations of Multidimensional and Metric Data + * Structures, Morgan Kaufmann, 2006, Section 1.4. + * + * \sa KDTree + */ +template +class QuadTree +{ +public: + + /*! + * Represents a two-dimensional point stored in this quadtree. + */ + typedef T point; + + /*! + * Represents a point component. + */ + typedef typename point::component component; + + /*! + * A list of points. Used for tree build and search operations. + */ + typedef Array point_list; + + /*! + * A rectangular region. Used for rectangular range search operations. + */ + typedef DRect rectangle; + + /*! + * The type of rectangular region coordinates. + */ + typedef rectangle::component coordinate; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::QuadTree::Node + * \brief Quadtree node structure + */ + struct Node + { + rectangle rect = 0.0; //!< The rectangular region represented by this node. + Node* nw = nullptr; //!< North-West child node, representing the top-left subregion. + Node* ne = nullptr; //!< North-East child node, representing the top-right subregion. + Node* sw = nullptr; //!< South-West child node, representing the bottom-left subregion. + Node* se = nullptr; //!< South-East child node, representing the bottom-right subregion. + +#ifdef __PCL_QUADTREE_STRUCTURAL_NODE_HAS_DATA + void* data = nullptr; +#endif + + /*! + * Default constructor. Constructs an uninitialized quadtree node. + */ + Node() = default; + + /*! + * Constructs a quadtree node for the specified rectangular region \a r. + */ + Node( const rectangle& r ) + : rect( r ) + { + } + + /*! + * Returns true iff this is a leaf quadtree node. A leaf node does not + * contain child nodes, that is, there is no further subdivision of the + * domain space beyond a leaf quadtree node. + * + * In a healthy quadtree (as any QuadTree structure should be under + * normal working conditions), you can expect any leaf node to be an + * instance of QuadTree::LeafNode containing a nonempty list of points. + */ + bool IsLeaf() const + { + return nw == nullptr && ne == nullptr && sw == nullptr && se == nullptr; + } + + /*! + * Returns true iff the rectangular region represented by this node + * intersects the specified rectangle \a r. + */ + bool Intersects( const rectangle& r ) const + { + return rect.x1 >= r.x0 && rect.x0 <= r.x1 && + rect.y1 >= r.y0 && rect.y0 <= r.y1; + } + + /*! + * Returns true iff the rectangular region represented by this node + * includes a point in the plane specified by its coordinates \a x, \a y. + */ + bool Includes( coordinate x, coordinate y ) const + { + return x >= rect.x0 && x <= rect.x1 && + y >= rect.y0 && y <= rect.y1; + } + + /*! + * Returns true iff the rectangular region represented by this node + * includes the specified point \a p in the plane. + */ + bool Includes( const rectangle::point& p ) const + { + return Includes( p.x, p.y ); + } + + /*! + * Returns the Northwest (top left) splitting rectangle for this node. + */ + rectangle NWRect() const + { + return rectangle( rect.TopLeft(), rect.Center() ); + } + + /*! + * Returns the Northeast (top right) splitting rectangle for this node. + */ + rectangle NERect() const + { + return rectangle( rect.CenterTop(), rect.CenterRight() ); + } + + /*! + * Returns the Southwest (bottom left) splitting rectangle for this node. + */ + rectangle SWRect() const + { + return rectangle( rect.CenterLeft(), rect.CenterBottom() ); + } + + /*! + * Returns the Southeast (bottom right) splitting rectangle for this + * node. + */ + rectangle SERect() const + { + return rectangle( rect.Center(), rect.BottomRight() ); + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \class pcl::QuadTree::LeafNode + * \brief Quadtree leaf node structure + */ + struct LeafNode : public Node + { + /*! + * The list of points contained by this leaf node. + * + * In a healthy quadtree (as any QuadTree structure should be under + * normal working conditions), every existing leaf node should contain a + * nonempty point list. + */ + point_list points; + +#ifndef __PCL_QUADTREE_STRUCTURAL_NODE_HAS_DATA + + /*! + * Pointer to an arbitrary data structure that can be associated with + * this leaf node. Its default value is \c nullptr. + * + * The quadtree structure does not access this pointer in any way. + * Destruction of the object pointed to by this member, if required, is + * the sole responsibility of the external code that has defined it. + */ + void* data = nullptr; + +#endif + + /*! + * Constructs a new leaf node representing the specified rectangular + * region \a r and storing a nonempty point list \a p. + */ + LeafNode( const rectangle& r, const point_list& p ) + : Node( r ) + , points( p ) + { + PCL_CHECK( !points.IsEmpty() ) + } + + /*! + * Constructs a new leaf node representing the specified rectangular + * region \a r and storing the specified point \a p. + */ + LeafNode( const rectangle& r, const point& p ) + : Node( r ) + { + points << p; + } + + /*! + * Returns the number of points contained by this leaf node. Under normal + * conditions, the returned value must be > 0. + */ + int Length() const + { + return int( points.Length() ); + } + }; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty quadtree. + */ + QuadTree() = default; + + /*! + * Constructs a quadtree and builds it for the specified list of \a points. + * + * \param points A list of points that will be stored in this + * quadtree. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be ≥ 1. The default value is 40. + * + * \param epsilon The minimum allowed dimension of a quadtree node + * region. Must be larger than or equal to twice the + * machine epsilon for the \c coordinate type. The + * default value is 1e-8. + * + * If the specified list of \a points is empty, this constructor yields an + * empty quadtree. + */ + QuadTree( const point_list& points, + int bucketCapacity = __PCL_QUADTREE_DEFAULT_BUCKET_CAPACITY, + double epsilon = __PCL_QUADTREE_DEFAULT_EPSILON ) + { + Build( points, bucketCapacity, epsilon ); + } + + /*! + * Constructs a quadtree and builds it for the specified list of \a points + * and a prescribed rectangular search region. + * + * \param rect The rectangular search region. + * + * \param points A list of points that will be stored in this + * quadtree. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be ≥ 1. The default value is 40. + * + * \param epsilon The minimum allowed dimension of a quadtree node + * region. Must be larger than or equal to twice the + * machine epsilon for the \c coordinate type. The + * default value is 1e-8. + * + * If the specified list of \a points is empty, or if no points lie within + * the \a rect region, this constructor yields an empty quadtree. + */ + QuadTree( const rectangle& rect, const point_list& points, + int bucketCapacity = __PCL_QUADTREE_DEFAULT_BUCKET_CAPACITY, + double epsilon = __PCL_QUADTREE_DEFAULT_EPSILON ) + { + Build( rect, points, bucketCapacity, epsilon ); + } + + /*! + * Copy constructor. Copy construction is disabled because this class uses + * internal data structures that cannot be copy-constructed. However, + * %QuadTree implements move construction and move assignment. + */ + QuadTree( const QuadTree& ) = delete; + + /*! + * Copy assignment operator. Copy assignment is disabled because this class + * uses internal data structures that cannot be copy-assigned. However, + * %QuadTree implements move assignment and move construction. + */ + QuadTree& operator =( const QuadTree& ) = delete; + + /*! + * Move constructor. + */ + QuadTree( QuadTree&& x ) + : m_root( x.m_root ) + , m_bucketCapacity( x.m_bucketCapacity ) + , m_epsilon( x.m_epsilon ) + , m_length( x.m_length ) + { + x.m_root = nullptr; + x.m_length = 0; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + QuadTree& operator =( QuadTree&& x ) + { + if ( &x != this ) + { + DestroyTree( m_root ); + m_root = x.m_root; + m_bucketCapacity = x.m_bucketCapacity; + m_epsilon = x.m_epsilon; + m_length = x.m_length; + x.m_root = nullptr; + x.m_length = 0; + } + return *this; + } + + /*! + * Destroys a quadtree. All the stored point objects are deleted. + */ + ~QuadTree() + { + Clear(); + } + + /*! + * Removes all the stored point objects, yielding an empty quadtree. + */ + void Clear() + { + DestroyTree( m_root ); + m_root = nullptr; + m_length = 0; + } + + /*! + * Builds a new quadtree for the specified list of \a points. + * + * \param points A list of points that will be stored in this + * quadtree. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be ≥ 1. The default value is 40. + * + * \param epsilon The minimum allowed dimension of a quadtree node + * region. Must be larger than or equal to twice the + * machine epsilon for the \c coordinate type. The + * default value is 1e-8. + * + * If the tree stores point objects before calling this function, they are + * destroyed and removed before building a new tree. + * + * If the specified list of \a points is empty, this member function yields + * an empty quadtree. + */ + void Build( const point_list& points, + int bucketCapacity = __PCL_QUADTREE_DEFAULT_BUCKET_CAPACITY, + double epsilon = __PCL_QUADTREE_DEFAULT_EPSILON ) + { + Clear(); + m_bucketCapacity = Max( 1, bucketCapacity ); + m_epsilon = Max( 2*std::numeric_limits::epsilon(), epsilon ); + + if ( !points.IsEmpty() ) + { + component x = points[0][0]; + component y = points[0][1]; + rectangle rect( x, y, x, y ); + for ( const point& p : points ) + { + x = p[0]; + y = p[1]; + if ( x < rect.x0 ) + rect.x0 = x; + if ( y < rect.y0 ) + rect.y0 = y; + if ( x > rect.x1 ) + rect.x1 = x; + if ( y > rect.y1 ) + rect.y1 = y; + } + m_root = BuildTree( rect, points ); + } + } + + /*! + * Builds a new quadtree with the specified list of \a points and a + * prescribed rectangular search region. + * + * \param rect The rectangular search region. + * + * \param points A list of points to be stored in this quadtree. + * Only points included in the specified \a rect + * search region will be inserted in the tree. + * All points outside \a rect will be ignored. + * + * \param bucketCapacity The maximum number of points in a leaf tree node. + * Must be ≥ 1. The default value is 40. + * + * \param epsilon The minimum allowed dimension of a quadtree node + * region. Must be larger than or equal to twice the + * machine epsilon for the \c coordinate type. The + * default value is 1e-8. + * + * If the tree stores point objects before calling this function, they are + * destroyed and removed before building a new tree. + * + * If the specified list of \a points is empty, or if no points lie within + * the \a rect region, this member function yields an empty quadtree. + */ + void Build( const rectangle& rect, const point_list& points, + int bucketCapacity = __PCL_QUADTREE_DEFAULT_BUCKET_CAPACITY, + double epsilon = __PCL_QUADTREE_DEFAULT_EPSILON ) + { + Clear(); + m_bucketCapacity = Max( 1, bucketCapacity ); + m_epsilon = Max( 2*std::numeric_limits::epsilon(), epsilon ); + if ( !points.IsEmpty() ) + m_root = BuildTree( rect.Ordered(), points ); + } + + /*! + * Performs a rectangular range search in this quadtree. + * + * \param rect The rectangular search region. + * + * Returns a (possibly empty) list with all the points found in this tree + * within the specified search range. + */ + point_list Search( const rectangle& rect ) const + { + point_list found; + SearchTree( found, rect.Ordered(), m_root ); + return found; + } + + /*! + * Performs a rectangular range search in this quadtree. + * + * \param rect The rectangular search region. + * + * \param callback Callback functional. + * + * \param data Callback data. + * + * The callback function prototype should be: + * + * \code void callback( const point& pt, void* data ) \endcode + * + * The callback function will be called once for each point found in the + * tree within the specified search range. + */ + template + void Search( const rectangle& rect, F callback, void* data ) const + { + SearchTree( rect.Ordered(), callback, data, m_root ); + } + + /*! + * Inserts a point in this quadtree. + */ + void Insert( const point& pt ) + { + if ( m_root != nullptr ) + InsertTree( pt, m_root ); + else + { + component x = pt[0]; + component y = pt[1]; + m_root = new LeafNode( rectangle( x, y, x, y ), pt ); + } + } + + /*! + * Deletes all points in this quadtree equal to the specified point. + */ + void Delete( const point& pt ) + { + DeleteTree( pt, m_root ); + } + + /*! + * Deletes all points in this quadtree included in the specified rectangular + * region \a rect. + */ + void Delete( const rectangle& rect ) + { + DeleteTree( rect.Ordered(), m_root ); + } + + /*! + * Returns the bucket capacity of this quadtree, or the maximum number of + * points that can be stored in a leaf tree node. This parameter is + * specified when a new tree is built. + */ + int BucketCapacity() const + { + return m_bucketCapacity; + } + + /*! + * Returns the total number of points stored in this quadtree. + */ + size_type Length() const + { + return m_length; + } + + /*! + * Returns true iff this quadtree is empty. + */ + bool IsEmpty() const + { + return m_root == nullptr; + } + + /*! + * Returns a pointer to the root node of this quadtree, or nullptr if this + * quadtree is empty. + * + * The returned pointer is const qualified to forbid uncontrolled + * alterations that might invalidate the quadtree structure. + */ + const Node* Root() const + { + return m_root; + } + + /*! + * Returns a pointer to the (mutable) root node of this quadtree, or nullptr + * if this quadtree is empty. + */ + Node* Root() + { + return m_root; + } + + /*! + * Returns a pointer to the (immutable) leaf node of this quadtree that + * includes the specified point \a p in the plane, or nullptr if no such + * leaf node exists in this quadtree. + */ + const LeafNode* LeafNodeAt( rectangle::point p ) const + { + return SearchLeafNode( p, m_root ); + } + + /*! + * Returns a pointer to the leaf node of this quadtree that includes the + * specified point \a p in the plane, or nullptr if no such leaf node exists + * in this quadtree. + */ + LeafNode* LeafNodeAt( rectangle::point p ) + { + return SearchLeafNode( p, m_root ); + } + + /*! + * Returns a pointer to the (immutable) node of this quadtree that includes + * the specified point \a p in the plane, or nullptr if no such node exists + * in this quadtree. + * + * The returned node can be a leaf node or a structural node. This function + * should only return nullptr if the specified point \a p is exterior to the + * root rectangular region of this quadtree, or if this quadtree is empty. + */ + const Node* NodeAt( rectangle::point p ) const + { + return SearchNode( p, m_root ); + } + + /*! + * Returns a pointer to the node of this quadtree that includes the + * specified point \a p in the plane, or nullptr if no such node exists in + * this quadtree. + * + * The returned node can be a leaf node or a structural node. This function + * should only return nullptr if the specified point \a p is exterior to the + * root rectangular region of this quadtree, or if this quadtree is empty. + */ + Node* NodeAt( rectangle::point p ) + { + return SearchNode( p, m_root ); + } + + /*! + * Forces a quadtree subdivision of the leaf node that includes the + * specified point \a p in the plane. + * + * Returns the newly created structural node. This function should only + * return nullptr if the specified point \a p is exterior to the root + * rectangular region of this quadtree, or if this quadtree is empty. It + * could also return nullptr in degenerate cases where no further + * subdivision of the plane would be possible because of numerical limits. + */ + Node* SplitAt( rectangle::point p ) + { + Node* node = SearchDeepestStructuralNodeAt( p, m_root ); + if ( node != nullptr ) + { + Node** leaf = nullptr; + if ( node->nw != nullptr && node->nw->Includes( p ) ) + leaf = &node->nw; + else if ( node->ne != nullptr && node->ne->Includes( p ) ) + leaf = &node->ne; + else if ( node->sw != nullptr && node->sw->Includes( p ) ) + leaf = &node->sw; + else if ( node->se != nullptr && node->se->Includes( p ) ) + leaf = &node->se; + + if ( leaf != nullptr ) // cannot be false! + { + Node* newNode = SplitLeafNode( *leaf ); + if ( newNode != nullptr ) // should be true + { + delete static_cast( *leaf ); + *leaf = newNode; + } + return newNode; + } + } + + return nullptr; + } + + /*! + * Performs a recursive left-to-right, depth-first traversal of the subtree + * rooted at the specified \a node, invoking the specified function \a f + * successively for each leaf node. + * + * The function \a f must be compatible with the form: + * + * \code void f( const rectangle& r, const point_list& p, void*& d ) \endcode + * + * where \a r is the plane region covered by the current leaf node, \a p is + * the list of points in the current leaf node, and \a d is the optional + * pointer to arbitrary data associated with the current leaf node. + * + * The sequence of calls for the subtrees in each non-leaf node is: NW, NE, + * SW, SE. Only non-empty leaf nodes are included in the traversal, hence + * the function \a f will be invoked exclusively for non-empty point lists. + * + * If the specified \a node is nullptr, this function takes no action. + */ + template + static void Traverse( const Node* node, F f ) + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + f( node->rect, + static_cast( node )->points, + static_cast( node )->data ); + else + { + Traverse( node->nw, f ); + Traverse( node->ne, f ); + Traverse( node->sw, f ); + Traverse( node->se, f ); + } + } + + /*! + * Performs a recursive left-to-right, depth-first traversal of the subtree + * rooted at the specified (mutable) \a node, invoking the specified + * function \a f successively for each leaf node. + * + * The function \a f must be compatible with the form: + * + * \code void f( const rectangle& r, point_list& p, void*& d ) \endcode + * + * where \a r is the plane region covered by the current leaf node, \a p is + * the list of points in the current leaf node, and \a d is the optional + * pointer to arbitrary data associated with the current leaf node. + * + * The sequence of calls for the subtrees in each non-leaf node is: NW, NE, + * SW, SE. Only non-empty leaf nodes are included in the traversal, hence + * the function \a f will be invoked exclusively for non-empty point lists. + * + * If the specified \a node is nullptr, this function takes no action. + */ + template + static void Traverse( Node* node, F f ) + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + f( node->rect, static_cast( node )->points, + static_cast( node )->data ); + else + { + Traverse( node->nw, f ); + Traverse( node->ne, f ); + Traverse( node->sw, f ); + Traverse( node->se, f ); + } + } + + /*! + * Performs a recursive left-to-right, depth-first traversal of the entire + * quadtree, invoking the specified function \a f successively for each leaf + * node. Calling this function is equivalent to: + * + * \code Traverse( Root(), f ) \endcode + * + * If this quadtree is empty, this function takes no action. + */ + template + void Traverse( F f ) const + { + Traverse( m_root, f ); + } + + /*! + * Performs a recursive left-to-right, depth-first traversal of the entire + * (mutable) quadtree, invoking the specified function \a f successively for + * each leaf node. Calling this function is equivalent to: + * + * \code Traverse( Root(), f ) \endcode + * + * If this quadtree is empty, this function takes no action. + */ + template + void Traverse( F f ) + { + Traverse( m_root, f ); + } + + /*! + * Returns the total number of existing nodes in the subtree rooted at the + * specified \a node, including structural and leaf nodes. + */ + static size_type NumberOfNodes( const Node* node ) + { + size_type N = 0; + GetNumberOfNodes( N, node ); + return N; + } + + /*! + * Returns the total number of existing nodes in this quadtree, including + * structural and leaf nodes. + */ + size_type NumberOfNodes() const + { + return NumberOfNodes( m_root ); + } + + /*! + * Returns the total number of existing leaf nodes in the subtree rooted at + * the specified \a node. + */ + static size_type NumberOfLeafNodes( const Node* node ) + { + size_type N = 0; + GetNumberOfLeafNodes( N, node ); + return N; + } + + /*! + * Returns the total number of existing leaf nodes in this quadtree. + */ + size_type NumberOfLeafNodes() const + { + return NumberOfLeafNodes( m_root ); + } + + /*! + * Returns the height of the subtree rooted at the specified \a node. + */ + static int Height( const Node* node ) + { + return TreeHeight( node, 0 ); + } + + /*! + * Returns the height of this quadtree. + */ + int Height() const + { + return Height( m_root ); + } + + /*! + * Exchanges two %QuadTree objects \a x1 and \a x2. + */ + friend void Swap( QuadTree& x1, QuadTree& x2 ) + { + pcl::Swap( x1.m_root, x2.m_root ); + pcl::Swap( x1.m_bucketCapacity, x2.m_bucketCapacity ); + pcl::Swap( x1.m_epsilon, x2.m_epsilon ); + pcl::Swap( x1.m_length, x2.m_length ); + } + +private: + + Node* m_root = nullptr; + int m_bucketCapacity = 0; + double m_epsilon = 0; + size_type m_length = 0; + + Node* NewLeafNode( const rectangle& rect, const point_list& points ) + { + m_length += points.Length(); + return new LeafNode( rect, points ); + } + + LeafNode* SearchLeafNode( const rectangle::point& p, const Node* node ) const + { + if ( node != nullptr ) + if ( node->Includes( p ) ) + { + if ( node->IsLeaf() ) + return const_cast( static_cast( node ) ); + + LeafNode* child = SearchLeafNode( p, node->nw ); + if ( child == nullptr ) + { + child = SearchLeafNode( p, node->ne ); + if ( child == nullptr ) + { + child = SearchLeafNode( p, node->sw ); + if ( child == nullptr ) + child = SearchLeafNode( p, node->se ); + } + } + return child; + } + + return nullptr; + } + + Node* SearchNode( const rectangle::point& p, const Node* node ) const + { + if ( node != nullptr ) + if ( node->Includes( p ) ) + { + if ( node->IsLeaf() ) + return const_cast( node ); + + Node* child = SearchNode( p, node->nw ); + if ( child == nullptr ) + { + child = SearchNode( p, node->ne ); + if ( child == nullptr ) + { + child = SearchNode( p, node->sw ); + if ( child == nullptr ) + { + child = SearchNode( p, node->se ); + if ( child == nullptr ) + return const_cast( node ); + } + } + } + return child; + } + + return nullptr; + } + + Node* SearchDeepestStructuralNodeAt( const rectangle::point& p, const Node* node ) const + { + if ( node != nullptr ) + if ( !node->IsLeaf() ) + if ( node->Includes( p ) ) + { + Node* child = SearchDeepestStructuralNodeAt( p, node->nw ); + if ( child == nullptr ) + { + child = SearchDeepestStructuralNodeAt( p, node->ne ); + if ( child == nullptr ) + { + child = SearchDeepestStructuralNodeAt( p, node->sw ); + if ( child == nullptr ) + { + child = SearchDeepestStructuralNodeAt( p, node->se ); + if ( child == nullptr ) + return const_cast( node ); + } + } + } + return child; + } + + return nullptr; + } + + Node* BuildTree( const rectangle& rect, const point_list& points ) + { + if ( points.IsEmpty() ) + return nullptr; + + if ( points.Length() <= size_type( m_bucketCapacity ) ) + return NewLeafNode( rect, points ); + + double x2 = (rect.x0 + rect.x1)/2; + double y2 = (rect.y0 + rect.y1)/2; + // Prevent geometrically degenerate subtrees. For safety, we enforce + // minimum region dimensions larger than twice the machine epsilon for + // the rectangle coordinate type. + if ( x2 - rect.x0 < m_epsilon || rect.x1 - x2 < m_epsilon || + y2 - rect.y0 < m_epsilon || rect.y1 - y2 < m_epsilon ) + { + return NewLeafNode( rect, points ); + } + + point_list nw, ne, sw, se; + for ( const point& p : points ) + { + component x = p[0]; + component y = p[1]; + if ( x <= x2 ) + { + if ( y <= y2 ) + nw << p; + else + sw << p; + } + else + { + if ( y <= y2 ) + ne << p; + else + se << p; + } + } + + Node* node = new Node( rect ); + node->nw = BuildTree( rectangle( rect.x0, rect.y0, x2, y2 ), nw ); + node->ne = BuildTree( rectangle( x2, rect.y0, rect.x1, y2 ), ne ); + node->sw = BuildTree( rectangle( rect.x0, y2, x2, rect.y1 ), sw ); + node->se = BuildTree( rectangle( x2, y2, rect.x1, rect.y1 ), se ); + + // Further degeneracies may result, e.g. if the point class is not + // behaving as expected. Do not allow them. + if ( node->IsLeaf() ) + { + delete node; + return NewLeafNode( rect, points ); + } + + return node; + } + + Node* SplitLeafNode( const Node* node ) + { + if ( node == nullptr || !node->IsLeaf() ) + return nullptr; + + double x2 = (node->rect.x0 + node->rect.x1)/2; + double y2 = (node->rect.y0 + node->rect.y1)/2; + // Prevent geometrically degenerate subtrees. For safety, we enforce + // minimum region dimensions larger than twice the machine epsilon for + // the rectangle coordinate type. + if ( x2 - node->rect.x0 < m_epsilon || node->rect.x1 - x2 < m_epsilon || + y2 - node->rect.y0 < m_epsilon || node->rect.y1 - y2 < m_epsilon ) + { + return nullptr; + } + + const LeafNode* leaf = static_cast( node ); + point_list nw, ne, sw, se; + for ( const point& p : leaf->points ) + { + component x = p[0]; + component y = p[1]; + if ( x <= x2 ) + { + if ( y <= y2 ) + nw << p; + else + sw << p; + } + else + { + if ( y <= y2 ) + ne << p; + else + se << p; + } + } + + size_type savedLength = m_length; + Node* newNode = new Node( node->rect ); + newNode->nw = BuildTree( rectangle( node->rect.x0, node->rect.y0, x2, y2 ), nw ); + newNode->ne = BuildTree( rectangle( x2, node->rect.y0, node->rect.x1, y2 ), ne ); + newNode->sw = BuildTree( rectangle( node->rect.x0, y2, x2, node->rect.y1 ), sw ); + newNode->se = BuildTree( rectangle( x2, y2, node->rect.x1, node->rect.y1 ), se ); + m_length = savedLength; + + // Further degeneracies may result, e.g. if the point class is not + // behaving as expected. Do not allow them. + if ( newNode->IsLeaf() ) + { + delete newNode; + return nullptr; + } + + return newNode; + } + + void SearchTree( point_list& found, const rectangle& rect, const Node* node ) const + { + if ( node != nullptr ) + if ( node->Intersects( rect ) ) + if ( node->IsLeaf() ) + { + const LeafNode* leaf = static_cast( node ); + for ( const point& p : leaf->points ) + { + component x = p[0]; + if ( x >= rect.x0 ) + if ( x <= rect.x1 ) + { + component y = p[1]; + if ( y >= rect.y0 ) + if ( y <= rect.y1 ) + found << p; + } + } + } + else + { + SearchTree( found, rect, node->nw ); + SearchTree( found, rect, node->ne ); + SearchTree( found, rect, node->sw ); + SearchTree( found, rect, node->se ); + } + } + + template + void SearchTree( const rectangle& rect, F callback, void* data, const Node* node ) const + { + if ( node != nullptr ) + if ( node->Intersects( rect ) ) + if ( node->IsLeaf() ) + { + const LeafNode* leaf = static_cast( node ); + for ( const point& p : leaf->points ) + { + component x = p[0]; + if ( x >= rect.x0 ) + if ( x <= rect.x1 ) + { + component y = p[1]; + if ( y >= rect.y0 ) + if ( y <= rect.y1 ) + callback( p, data ); + } + } + } + else + { + SearchTree( rect, callback, data, node->nw ); + SearchTree( rect, callback, data, node->ne ); + SearchTree( rect, callback, data, node->sw ); + SearchTree( rect, callback, data, node->se ); + } + } + + void InsertTree( const point& pt, Node*& node ) + { + PCL_CHECK( node != nullptr ) + + component x = pt[0]; + component y = pt[1]; + + if ( x < node->rect.x0 ) + node->rect.x0 = x; + else if ( x > node->rect.x1 ) + node->rect.x1 = x; + + if ( y < node->rect.y0 ) + node->rect.y0 = y; + else if ( y > node->rect.y1 ) + node->rect.y1 = y; + + if ( node->IsLeaf() ) + { + LeafNode* leaf = static_cast( node ); + if ( leaf->Length() < m_bucketCapacity ) + leaf->points << pt; + else + { + rectangle rect = leaf->rect; + double x2 = (rect.x0 + rect.x1)/2; + double y2 = (rect.y0 + rect.y1)/2; + // Prevent geometrically degenerate subtrees. For safety, we + // enforce minimum region dimensions larger than twice the + // machine epsilon for the rectangle coordinate type. + if ( x2 - rect.x0 < m_epsilon || rect.x1 - x2 < m_epsilon || + y2 - rect.y0 < m_epsilon || rect.y1 - y2 < m_epsilon ) + { + leaf->points << pt; + } + else + { + point_list nw, ne, sw, se; + for ( const point& p : leaf->points ) + { + component x = p[0]; + component y = p[1]; + if ( x <= x2 ) + { + if ( y <= y2 ) + nw << p; + else + sw << p; + } + else + { + if ( y <= y2 ) + ne << p; + else + se << p; + } + } + + if ( x <= x2 ) + { + if ( y <= y2 ) + nw << pt; + else + sw << pt; + } + else + { + if ( y <= y2 ) + ne << pt; + else + se << pt; + } + + delete leaf; + + node = new Node( rect ); + + if ( !nw.IsEmpty() ) + node->nw = new LeafNode( rectangle( rect.x0, rect.y0, x2, y2 ), nw ); + if ( !ne.IsEmpty() ) + node->ne = new LeafNode( rectangle( x2, rect.y0, rect.x1, y2 ), ne ); + if ( !sw.IsEmpty() ) + node->sw = new LeafNode( rectangle( rect.x0, y2, x2, rect.y1 ), sw ); + if ( !se.IsEmpty() ) + node->se = new LeafNode( rectangle( x2, y2, rect.x1, rect.y1 ), se ); + } + } + + ++m_length; + } + else + { + rectangle rect = node->rect; + double x2 = (rect.x0 + rect.x1)/2; + double y2 = (rect.y0 + rect.y1)/2; + if ( pt[0] <= x2 ) + { + if ( pt[1] <= y2 ) + { + if ( node->nw == nullptr ) + node->nw = new LeafNode( rectangle( rect.x0, rect.y0, x2, y2 ), pt ); + else + InsertTree( pt, node->nw ); + } + else + { + if ( node->sw == nullptr ) + node->sw = new LeafNode( rectangle( rect.x0, y2, x2, rect.y1 ), pt ); + else + InsertTree( pt, node->sw ); + } + } + else + { + if ( pt[1] <= y2 ) + { + if ( node->ne == nullptr ) + node->ne = new LeafNode( rectangle( x2, rect.y0, rect.x1, y2 ), pt ); + else + InsertTree( pt, node->ne ); + } + else + { + if ( node->se == nullptr ) + node->se = new LeafNode( rectangle( x2, y2, rect.x1, rect.y1 ), pt ); + else + InsertTree( pt, node->se ); + } + } + } + } + + void DeleteTree( const rectangle& rect, Node*& node ) + { + if ( node != nullptr ) + if ( node->Intersects( rect ) ) + { + if ( node->IsLeaf() ) + { + LeafNode* leaf = static_cast( node ); + point_list points; + for ( const point& p : leaf->points ) + { + component x = p[0]; + if ( x >= rect.x0 ) + if ( x <= rect.x1 ) + { + component y = p[1]; + if ( y >= rect.y0 ) + if ( y <= rect.y1 ) + { + --m_length; + continue; + } + } + points << p; + } + + if ( points.IsEmpty() ) + { + delete leaf; + node = nullptr; + } + else + leaf->points = points; + } + else + { + DeleteTree( rect, node->nw ); + DeleteTree( rect, node->ne ); + DeleteTree( rect, node->sw ); + DeleteTree( rect, node->se ); + + if ( node->IsLeaf() ) + { + delete node; + node = nullptr; + } + } + } + } + + void DeleteTree( const point& pt, Node*& node ) + { + if ( node != nullptr ) + { + component x = pt[0]; + component y = pt[1]; + if ( node->Includes( x, y ) ) + if ( node->IsLeaf() ) + { + LeafNode* leaf = static_cast( node ); + point_list points; + for ( const point& p : leaf->points ) + { + if ( p[0] == x ) + if ( p[1] == y ) + { + --m_length; + continue; + } + points << p; + } + + if ( points.IsEmpty() ) + { + delete leaf; + node = nullptr; + } + else + leaf->points = points; + } + else + { + DeleteTree( pt, node->nw ); + DeleteTree( pt, node->ne ); + DeleteTree( pt, node->sw ); + DeleteTree( pt, node->se ); + + if ( node->IsLeaf() ) + { + delete node; + node = nullptr; + } + } + } + } + + void DestroyTree( Node* node ) + { + if ( node != nullptr ) + if ( node->IsLeaf() ) + delete static_cast( node ); + else + { + DestroyTree( node->nw ); + DestroyTree( node->ne ); + DestroyTree( node->sw ); + DestroyTree( node->se ); + delete node; + } + } + + static void GetNumberOfNodes( size_type& N, const Node* node ) + { + if ( node != nullptr ) + { + ++N; + GetNumberOfNodes( N, node->nw ); + GetNumberOfNodes( N, node->ne ); + GetNumberOfNodes( N, node->sw ); + GetNumberOfNodes( N, node->se ); + } + } + + static void GetNumberOfLeafNodes( size_type& N, const Node* node ) + { + if ( node != nullptr ) + { + if ( node->IsLeaf() ) + ++N; + GetNumberOfLeafNodes( N, node->nw ); + GetNumberOfLeafNodes( N, node->ne ); + GetNumberOfLeafNodes( N, node->sw ); + GetNumberOfLeafNodes( N, node->se ); + } + } + + static int TreeHeight( const Node* node, int h ) + { + if ( node == nullptr ) + return h; + return h + 1 + Max( Max( Max( TreeHeight( node->nw, h ), + TreeHeight( node->ne, h ) ), + TreeHeight( node->sw, h ) ), + TreeHeight( node->se, h ) ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_QuadTree_h + +// ---------------------------------------------------------------------------- +// EOF pcl/QuadTree.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RGBColorSystem.h b/3rdparty/include/pcl/RGBColorSystem.h new file mode 100644 index 0000000..23ce26b --- /dev/null +++ b/3rdparty/include/pcl/RGBColorSystem.h @@ -0,0 +1,1587 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RGBColorSystem.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RGBColorSystem_h +#define __PCL_RGBColorSystem_h + +/// \file pcl/RGBColorSystem.h + +#include + +#include +#include +#include + +#define _1_3 3.333333333333333e-01 // 1/3 +#define _1_6 1.666666666666667e-01 // 1/6 +#define _2_3 6.666666666666667e-01 // 2/3 +#define _16_116 1.379310344827586e-01 // 16/116 +#define CIEEpsilon 8.856451679035631e-03 // 216/24389 +#define CIEKappa 9.032962962962963e+02 // 24389/27 +#define CIEKappa116 7.787037037037037e+00 // CIEKappa/116 +#define sRGBEpsilon 0.04045 +#define sRGBEpsilonInv 0.0031308 +#define sRGBGamma 2.4 +#define sRGBGammaInv 4.166666666666667e-01 //1/sRGBGamma + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class RGBColorSystem + * \brief A colorimetrically defined RGB working color space. + * + * %RGBColorSystem is a rigorous and efficient implementation of a RGB working + * space (RGBWS). This class provides all conversions between the supported + * color spaces: RGB, CIE XYZ, CIE L*a*b*, CIE L*c*h* and grayscale, plus the + * HSV and HSI color ordering systems, which are also supported for + * convenience, although obviously not linked to any particular RGBWS. + * + * Color components and channel values are represented as reals by means of + * \c double floating point variables. Normalization of components and channel + * values to the standard real range [0,1] is ensured for all supported color + * spaces and color ordering systems. + * + * Chrominance coordinates and luminance coefficients are always considered + * relative to the D50 reference white, in conformance to the ICC standard. + * + * Finally, our implementation maximizes dynamic range usage (coding + * efficiency) by ensuring that all components and channel values make use of + * the entire [0,1] normalized real range to the maximum possible extent. + * + * \sa ImageColor, AbstractImage, GenericImage, ImageVariant + */ +class PCL_CLASS RGBColorSystem +{ +public: + + /*! + * The type used to represent components and channel values for all + * supported color spaces and color ordering systems. + */ + typedef double sample; + + /*! + * Constructs a %RGBColorSystem object as a new instance of the default RGB + * working space. The default RGBWS is sRGB in current versions of the + * PixInsight platform. + * + * This constructor increments the reference counter of the source RGB + * working space data. + */ + RGBColorSystem() + : m_data( RGBColorSystem::sRGB.m_data ) + { + if ( m_data != nullptr ) + m_data->Attach(); + else + m_data = new Data( 2.2F/*gamma*/, true/*issRGB*/, sRGB_x, sRGB_y, sRGB_Y ); + } + + /*! + * Constructs a %RGBColorSystem object as a copy of an existing instance. + * + * This constructor increments the reference counter of the source RGB + * working space data. + */ + RGBColorSystem( const RGBColorSystem& s ) + : m_data( s.m_data ) + { + m_data->Attach(); + } + + /*! + * Constructs a new %RGBColorSystem instance by its RGB working space + * parameters. + * + * \param gamma Gamma value of the RGB working space. + * + * \param issRGB If true, this space uses the sRGB gamma function. If this + * parameter is false, the space uses a standard raise gamma + * function. + * + * \param x,y Vectors of chromaticity coordinates of the RGB working + * space, relative to the D50 reference white. + * + * \param Y Vector of luminance coefficients of the RGB working space, + * with respect to the D50 reference white. + * + * This constructor creates a new RGB working space data object with a + * reference count value of one. + */ + RGBColorSystem( float gamma, bool issRGB, const FVector& x, const FVector& y, const FVector& Y ) + { + m_data = new Data( gamma, issRGB, x, y, Y ); + } + + /*! + * Constructs a new %RGBColorSystem instance by its RGB working space + * parameters. + * + * \param gamma Gamma value of the RGB working space. + * + * \param issRGB If true, this space uses the sRGB gamma function. If this + * parameter is false, the space uses a standard raise gamma + * function. + * + * \param x,y Arrays of chromaticity coordinates of the RGB working + * space, relative to the D50 reference white. + * + * \param Y Arrays of luminance coefficients of the RGB working space, + * with respect to the D50 reference white. + * + * This constructor creates a new RGB working space data object with a + * reference count value of one. + */ + RGBColorSystem( float gamma, bool issRGB, const float* x, const float* y, const float* Y ) + { + m_data = new Data( gamma, issRGB, FVector( x, 3 ), FVector( y, 3 ), FVector( Y, 3 ) ); + } + + /*! + * Destroys a %RGBColorSystem instance. + * + * Decrements the reference count of the RGB working space data object. If + * the data object becomes \e garbage, i.e. if its reference count becomes + * zero, it is destroyed and its allocated space is disposed. + */ + virtual ~RGBColorSystem() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Returns true iff this %RGBColorSystem object uniquely references its RGB + * working space data. + */ + bool IsUnique() const + { + return m_data->IsUnique(); + } + + /*! + * Returns true iff this %RGBColorSystem object is an alias of another + * %RGBColorSystem instance \a s. + * + * Two instances of %RGBColorSystem are aliases if both share the same RGB + * working space data. + */ + bool IsAliasOf( const RGBColorSystem& s ) const + { + return m_data == s.m_data; + } + + /*! + * Ensures that this %RGBColorSystem object uniquely references its RGB + * working space data. + * + * If necessary, this member function generates a duplicate of the RGB + * working space data, references it, and then decrements the reference + * counter of the original data. + */ + void EnsureUnique() + { + if ( !IsUnique() ) + { + Data* newData = new Data( *m_data ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the gamma value of this RGB working space. + * + * \note If this space uses a sRGB gamma function, the returned value is + * 2.2, but the space doesn't use that value as the exponent of a standard + * raise gamma function. + */ + float Gamma() const + { + return m_data->gamma; + } + + /*! + * Returns true iff this space uses a sRGB gamma function. + */ + bool IsSRGB() const + { + return m_data->issRGB; + } + + /*! + * Returns true iff this space uses a linear gamma function. + * + * A linear RGB space has gamma=1 and doesn't use a sRGB gamma function. + */ + bool IsLinear() const + { + return m_data->isLinear; + } + + /*! + * Returns a reference to a vector with the elements of the immutable 3x3 + * RGB to CIE XYZ conversion matrix used in this RGB working space. + * + * The RGB->XYZ conversion matrix is a function of the luminance + * coefficients and chromaticity coordinates that define this RGB color + * space. + * + * The nine matrix elements are stored contiguously in row order in the + * returned vector: M[0][0], M[0][1], ..., M[2][2]. + */ + const Vector& RGBToXYZMatrix() const + { + return m_data->M; + } + + /*! + * Returns a reference to a vector with the elements of the immutable 3x3 + * CIE XYZ to RGB inverse conversion matrix used in this RGB working space. + * + * The XYZ->RGB inverse conversion matrix is a function of the luminance + * coefficients and chromaticity coordinates that define this RGB color + * space. + * + * The nine inverse matrix elements are stored contiguously in row order in + * the returned vector: M_[0][0], M_[0][1], ..., M_[2][2]. + */ + const Vector& XYZToRGBMatrix() const + { + return m_data->M_; + } + + /*! + * Returns a reference to the immutable vector of X chromaticity coordinates + * in this RGB working space. + * + * In PCL, chromaticity coordinates are relative to the D50 reference white. + */ + const FVector& ChromaticityXCoordinates() const + { + return m_data->x; + } + + /*! + * Returns a reference to the immutable vector of Y chromaticity coordinates + * in this RGB working space. + * + * In PCL, chromaticity coordinates are relative to the D50 reference white. + */ + const FVector& ChromaticityYCoordinates() const + { + return m_data->y; + } + + /*! + * Returns a reference to the immutable vector of luminance coefficients in + * this RGB working space. + * + * In PCL, luminance coefficients are relative to the D50 reference white. + */ + const FVector& LuminanceCoefficients() const + { + return m_data->Y; + } + + /*! + * Returns true iff two %RGBColorSystem instances define the same RGB working + * space. This happens when either both instances are aliases, or if they + * define exactly the same RGB space parameters. + */ + friend bool operator ==( const RGBColorSystem& S1, const RGBColorSystem& S2 ) + { + return S1.IsAliasOf( S2 ) || *S1.m_data == *S2.m_data; + } + + /*! + * Causes this %RGBColorSystem instance to reference the same RGB working + * space as another instance. + * + * The reference count of the previously referenced space is decremented, + * and the previous space is deleted if it becomes unreferenced. The + * reference count of the new space is then incremented. + */ + void Assign( const RGBColorSystem& s ) + { + s.m_data->Attach(); + DetachFromData(); + m_data = s.m_data; + } + + /*! + * Assignment iterator. Returns a reference to this object. + * + * This operator calls Assign() with the specified source space \a s. + */ + RGBColorSystem& operator =( const RGBColorSystem& s ) + { + Assign( s ); + return *this; + } + + /*! + * Returns the lightness component in the CIE L*a*b* space corresponding to + * a set of specified RGB components. + * + * \param R,G,B RGB components from which lightness will be calculated. + * + * \note A synonym for this function is CIEL(). + */ + sample Lightness( sample R, sample G, sample B ) const + { + XYZLab( R = m_data->CIEY( R, G, B ) ); + return sample( (1.16 * R) - 0.16 ); + } + + // ### Deprecated - retained for compatibility -> suppress in PCL 2.x + sample Luminance( sample R, sample G, sample B ) const + { + return Lightness( R, G, B ); + } + + /*! + * A synonym for Lightness(). + */ + sample CIEL( sample R, sample G, sample B ) const + { + return Lightness( R, G, B ); + } + + /*! + * Calculates the lightness component in the CIE L*a*b* space corresponding + * to a set of RGB components, and copies it to a specified variable \a K. + * + * \param[out] K Reference to an output variable for the calculated + * lightness component. + * + * \param R,G,B Input RGB components. + */ + void RGBToGray( sample& K, sample R, sample G, sample B ) const + { + K = Lightness( R, G, B ); + } + + /*! + * Returns the Value channel value in the HSV color ordering system, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * \note This is an utility function provided for convenience; HSV is not a + * color space, but a color ordering system not based on a RGBWS. + */ + sample Value( sample R, sample G, sample B ) const + { + return pcl::Max( pcl::Max( R, G ), B ); + } + + /*! + * Returns the Intensity channel value in the HSI color ordering system, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + * + * \note This is an utility function provided for convenience; HSI is not a + * color space, but a color ordering system not based on a RGBWS. + */ + sample Intensity( sample R, sample G, sample B ) const + { + return sample( 0.5*( pcl::Min( pcl::Min( R, G ), B ) + + pcl::Max( pcl::Max( R, G ), B ) ) ); + } + + /*! + * Returns the Hue channel value in the HSV and HSI color ordering systems, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * The returned value is a normalized hue, which is the hue angle + * rescaled to the normalized [0,1[ range. A normalized hue value of 1 + * corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note This is an utility function, provided for convenience. HSV and HSI + * are not color spaces, but color ordering systems not based on any RGBWS. + */ + sample Hue( sample R, sample G, sample B ) const + { + sample max = pcl::Max( pcl::Max( R, G ), B ); + sample delta = max - pcl::Min( pcl::Min( R, G ), B ); + if ( delta != 0 ) + { + sample H; + if ( R == max ) + H = (G - B)/delta; // between yellow & magenta + else if ( G == max ) + H = 2 + (B - R)/delta; // between cyan & yellow + else + H = 4 + (R - G)/delta; // between magenta & cyan + + H /= 6; + if ( H < 0 ) + H += 1; + return H; + } + + // Achromatic case: R = G = B + // Hue is undefined (H is set to 0 conventionally) + return 0; + } + + /*! + * Returns the Saturation channel value in the HSV color ordering system, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * \note This is an utility function provided for convenience; HSV is not a + * color space, but a color ordering system not based on a RGBWS. + */ + sample HSVSaturation( sample R, sample G, sample B ) const + { + sample max = pcl::Max( pcl::Max( R, G ), B ); + sample delta = max - pcl::Min( pcl::Min( R, G ), B ); + return sample( (1.0 + max != 1.0) ? delta/max : 0.0 ); + } + + /*! + * Returns the Saturation channel value in the HSI color ordering system, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + * + * \note This is an utility function provided for convenience; HSI is not a + * color space, but a color ordering system not based on a RGBWS. + */ + sample HSISaturation( sample R, sample G, sample B ) const + { + sample min = pcl::Min( pcl::Min( R, G ), B ); + sample max = pcl::Max( pcl::Max( R, G ), B ); + sample delta = max - min; + if ( delta != 0 ) + { + sample sum = min + max; + return delta/((sum <= 1) ? sum : 2-sum); + } + return sample( 0 ); + } + + /*! + * Returns the Saturation channel value in the HSV color ordering system, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function is a synonym for HSVSaturation(). + */ + sample Saturation( sample R, sample G, sample B ) const + { + return HSVSaturation( R, G, B ); + } + + /*! + * Converts a set of RGB components to the corresponding channel values in + * the HSV (Hue, Saturation, Value) color ordering system. + * + * \param[out] H,S,V References to the variables where output HSV channel + * values will be copied. + * + * \param R,G,B Input RGB components. + * + * The output \a H value is a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note This is a static function provided for convenience; HSV is not a + * color space, but a color ordering system not based on a RGBWS. + */ + static void RGBToHSV( sample& H, sample& S, sample& V, sample R, sample G, sample B ) + { + V = pcl::Max( pcl::Max( R, G ), B ); // V = Value( R, G, B ); + + sample delta = V - pcl::Min( pcl::Min( R, G ), B ); + if ( delta != 0 ) + { + S = delta/V; + + if ( R == V ) + H = (G - B)/delta; // between yellow & magenta + else if ( G == V ) + H = 2 + (B - R)/delta; // between cyan & yellow + else + H = 4 + (R - G)/delta; // between magenta & cyan + + H /= 6; + if ( H < 0 ) + H += 1; + } + else + { + // Achromatic case: R = G = B + // S = 0, and H is undefined (H is set to 0 conventionally) + S = H = 0; + } + } + + /*! + * Converts a set of RGB components to the corresponding channel values in + * the HSI (Hue, Saturation, Intensity) color ordering system. + * + * \param[out] H,S,I References to the variables where output HSI channel + * values will be copied. + * + * \param R,G,B Input RGB components. + * + * The output \a H value is a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + * + * \note This is a static function provided for convenience; HSV is not a + * color space, but a color ordering system not based on a RGBWS. + */ + static void RGBToHSI( sample& H, sample& S, sample& I, sample R, sample G, sample B ) + { + sample min = pcl::Min( pcl::Min( R, G ), B ); + sample max = pcl::Max( pcl::Max( R, G ), B ); + sample delta = max - min; + sample sum = min + max; + + I = 0.5*sum; + + if ( delta != 0 ) + { + S = delta/((sum <= 1) ? sum : 2-sum); + + if ( R == max ) + H = (G - B)/delta; // between yellow & magenta + else if ( G == max ) + H = 2 + (B - R)/delta; // between cyan & yellow + else + H = 4 + (R - G)/delta; // between magenta & cyan + + H /= 6; + if ( H < 0 ) + H += 1; + } + else + { + // Achromatic case: R = G = B + // S = 0, and H is undefined (H is set to 0 conventionally) + S = H = 0; + } + } + + /*! + * Converts a set of RGB components to the corresponding channel values in + * the HSV (Hue, Saturation, Value) color ordering system, plus the + * L* component (lightness) in the CIE L*a*b* space. + * + * \param[out] H,S,V References to the variables where output HSV channel + * values will be copied. + * + * \param[out] L Reference to a variable where the output CIE L* + * component will be copied. + * + * \param R,G,B Input RGB components. + * + * The output \a H value is a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + */ + void RGBToHSVL( sample& H, sample& S, sample& V, sample& L, sample R, sample G, sample B ) const + { + RGBToHSV( H, S, V, R, G, B ); + L = Lightness( R, G, B ); + } + + /*! + * Converts a set of RGB components to the corresponding channel values in + * the HSI (Hue, Saturation, Intensity) color ordering system, plus the + * L* component (lightness) in the CIE L*a*b* space. + * + * \param[out] H,S,I References to the variables where output HSI channel + * values will be copied. + * + * \param[out] L Reference to a variable where the output CIE L* + * component will be copied. + * + * \param R,G,B Input RGB components. + * + * The output \a H value is a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + */ + void RGBToHSIL( sample& H, sample& S, sample& I, sample& L, sample R, sample G, sample B ) const + { + RGBToHSI( H, S, I, R, G, B ); + L = Lightness( R, G, B ); + } + + /*! + * Conversion from the RGB color space to the CIE XYZ color space. + * + * \param[out] X,Y,Z References to the variables where output CIE XYZ + * components will be copied. + * + * \param R,G,B Input RGB components. + */ + void RGBToCIEXYZ( sample& X, sample& Y, sample& Z, sample R, sample G, sample B ) const + { + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + } + + /*! + * Calculates the chrominance components in the CIE XYZ color space + * corresponding to a specified set of RGB components. + * + * \param[out] X,Z References to the variables where output CIE X and Z + * components will be copied. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the CIE Y component, which saves + * computing time when only the chrominance components are required. + */ + void RGBToCIEXZ( sample& X, sample& Z, sample R, sample G, sample B ) const + { + m_data->RGBToCIEXZ( X, Z, R, G, B ); + } + + /*! + * CIE X component from RGB components. + * + * \param R,G,B Input RGB components. + */ + sample CIEX( sample R, sample G, sample B ) const + { + return m_data->CIEX( R, G, B ); + } + + /*! + * CIE Y component from RGB components. + * + * \param R,G,B Input RGB components. + */ + sample CIEY( sample R, sample G, sample B ) const + { + return m_data->CIEY( R, G, B ); + } + + /*! + * CIE Z component from RGB components. + * + * \param R,G,B Input RGB components. + */ + sample CIEZ( sample R, sample G, sample B ) const + { + return m_data->CIEZ( R, G, B ); + } + + /*! + * CIE L* component from CIE Y. + * + * \param Y Source CIE Y component. + */ + sample CIEYToCIEL( sample Y ) const + { + XYZLab( Y ); return 1.16*Y - 0.16; + } + + /*! + * CIE Y component from CIE L*. + * + * \param L Source CIE L* component. + */ + sample CIELToCIEY( sample L ) const + { + LabXYZ( L = (L + 0.16)/1.16 ); return L; + } + + /*! + * Conversion from the RGB color space to the CIE L*a*b* color space. + * + * \param[out] L,a,b References to the variables where output CIE L*a*b* + * components will be copied. + * + * \param R,G,B Input RGB components. + */ + void RGBToCIELab( sample& L, sample& a, sample& b, sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + CIEXYZToCIELab( L, a, b, X, Y, Z ); + } + + /*! + * Calculates the chrominance components in the CIE L*a*b* color space + * corresponding to a specified set of RGB components. + * + * \param[out] a,b References to the variables where output CIE a* and b* + * components will be copied. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the CIE L* component, which saves + * computing time when only the chrominance components are required. + */ + void RGBToCIEab( sample& a, sample& b, sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + a = (5*(X - Y) + m_data->abOffset)/m_data->abDelta; + b = (2*(Y - Z) + m_data->abOffset)/m_data->abDelta; + } + + /*! + * Returns the a* chrominance component in the CIE L*a*b* color space, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function avoids calculation of the L* and b* components, which + * saves computing time when only the a* component is required. + */ + sample CIEa( sample R, sample G, sample B ) const + { + sample X, Y; + m_data->RGBToCIEXY( X, Y, R, G, B ); + XYZLab( X ); XYZLab( Y ); + return (5*(X - Y) + m_data->abOffset)/m_data->abDelta; + } + + /*! + * Returns the b* chrominance component in the CIE L*a*b* color space, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the L* and a* channels, which + * saves computing time when only the b* chrominance component is required. + */ + sample CIEb( sample R, sample G, sample B ) const + { + sample Y, Z; + m_data->RGBToCIEYZ( Y, Z, R, G, B ); + XYZLab( Y ); XYZLab( Z ); + return (2*(Y - Z) + m_data->abOffset)/m_data->abDelta; + } + + /*! + * Returns the c* chrominance component in the CIE L*c*h* color space, + * corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the L* and h* channels, which + * saves computing time when only the c* chrominance component is required. + */ + sample CIEc( sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + sample a = 5*(X - Y); + sample b = 2*(Y - Z); + return pcl::Sqrt( a*a + b*b )/m_data->cDelta; + } + + /*! + * Returns the normalized h* chrominance component in the CIE L*c*h* color + * space, corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the L* and c* channels, which + * saves computing time when only the h* chrominance component is required. + * + * The returned value is the hue angle normalized to the range [0,1[, where + * 0 corresponds to a hue angle of zero degrees, and 1 to an angle of 360 + * degrees (2*pi radians). + */ + sample CIEh( sample R, sample G, sample B ) const + { + return CIEhr( R, G, B )/Const::_2pi(); + } + + /*! + * Returns the h* chrominance component in the CIE L*c*h* color space, + * expressed in radians, corresponding to a specified set of RGB components. + * + * \param R,G,B Input RGB components. + * + * This function avoids the calculation of the L* and c* channels, which + * saves computing time when only the h* chrominance component is required. + * + * The returned value is the hue angle in radians, in the range [0,2pi[. + */ + sample CIEhr( sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + sample h = ArcTan( 2*(Y - Z), 5*(X - Y) ); + if ( h < 0 ) + h += Const::_2pi(); + return h; + } + + /*! + * Conversion from the RGB color space to the CIE L*c*h* color space. + * + * \param[out] L,c,h References to the variables where output CIE L*c*h* + * components will be copied. + * + * \param R,G,B Input RGB components. + */ + void RGBToCIELch( sample& L, sample& c, sample& h, sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + L = sample( (1.16 * Y) - 0.16 ); + sample a = 5*(X - Y); + sample b = 2*(Y - Z); + c = pcl::Sqrt( a*a + b*b )/m_data->cDelta; + h = ArcTan( b, a ); + if ( h < 0 ) + h += Const::_2pi(); + h /= Const::_2pi(); + } + + /*! + * Conversion from the RGB color space to the CIE L*a*b* color space, with + * optimized, on-the-fly calculation of the CIE c* component. + * + * \param[out] L,a,b References to the variables where output CIE L*a*b* + * components will be copied. + * + * \param[out] c Reference to a variable where the output CIE c* + * component will be copied. + * + * \param R,G,B Input RGB components. + * + * If only the CIE c* component is required besides CIE L*a*b* components, + * this function is much faster than performing two separate conversions to + * the CIE L*a*b* and L*c*h* color spaces. + */ + void RGBToCIELabc( sample& L, sample& a, sample& b, sample& c, sample R, sample G, sample B ) const + { + sample X, Y, Z; + m_data->RGBToCIEXYZ( X, Y, Z, R, G, B ); + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + L = sample( (1.16 * Y) - 0.16 ); + a = ((X = 5*(X - Y)) + m_data->abOffset)/m_data->abDelta; + b = ((Z = 2*(Y - Z)) + m_data->abOffset)/m_data->abDelta; + c = pcl::Sqrt( X*X + Z*Z )/m_data->cDelta; + } + + /*! + * Conversion from the HSV color ordering system to the RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param H,S,V Input HSV channel values. + * + * The input \a H value must be a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note This is a static function provided for convenience; HSV is not a + * color space, but a color ordering system not based on a RGBWS. + */ + static void HSVToRGB( sample& R, sample& G, sample& B, sample H, sample S, sample V ) + { + if ( S != 0 ) + { + H *= 6; // degrees -> quadrant index + + int i = TruncInt( Floor( H ) ); // i = sector 0 to 5 + sample f = H - i; // f = fractional part of H + sample p = V*(1 - S); + sample q = V*(1 - S*f); + sample t = V*(1 - S*(1 - f)); + + switch( i ) + { + case 0: R = V; G = t; B = p; break; + case 1: R = q; G = V; B = p; break; + case 2: R = p; G = V; B = t; break; + case 3: R = p; G = q; B = V; break; + case 4: R = t; G = p; B = V; break; + case 5: R = V; G = p; B = q; break; + default: R = G = B = V; break; // out-of-range H argument + } + } + else + R = G = B = V; // achromatic + } + + /*! + * Transformation from separate HSV chrominance and CIE L* components to the + * RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param H,S,V Input HSV channel values for chrominance. + * + * \param L Input CIE L* (lightness) component. + * + * The lightness implicitly defined by the input HSV values is discarded + * and replaced with the specified CIE L* component. + * + * Strictly speaking, the resulting chrominance is not colorimetrically + * defined, since it derives from HSV channel values. However, the + * chrominance is supposed to be expressed in the RGB working space + * referenced by this %RGBColorSystem instance. + * + * The input \a H value must be a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * The primary usefulness of this function is implementing accurate + * hue/saturation image transformations in the HSV system with full + * preservation of the CIE lightness component. + */ + void HSVLToRGB( sample& R, sample& G, sample& B, sample H, sample S, sample V, sample L ) const + { + HSVToRGB( R, G, B, H, S, V ); +#define a H +#define b S + RGBToCIEab( a, b, R, G, B ); + CIELabToRGB( R, G, B, L, a, b ); +#undef a +#undef b + } + + /*! + * Conversion from the HSI color ordering system to the RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param H,S,I Input HSI channel values. + * + * The input \a H value must be a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + * + * \note This is a static function provided for convenience; HSI is not a + * color space, but a color ordering system not based on a RGBWS. + */ + static void HSIToRGB( sample& R, sample& G, sample& B, sample H, sample S, sample I ) + { + if ( S != 0 ) + { + sample v2 = (I < 0.5) ? I*(1 + S) : I + S - S*I; + sample v1 = I+I - v2; + R = HSIH2RGB( v1, v2, H+_1_3 ); + G = HSIH2RGB( v1, v2, H ); + B = HSIH2RGB( v1, v2, H-_1_3 ); + } + else + R = G = B = I; // achromatic + } + + /*! + * Transformation from separate HSI chrominance and CIE L* components to the + * RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param H,S,I Input HSI channel values for chrominance. + * + * \param L Input CIE L* component (lightness). + * + * The lightness implicitly defined by the input HSI values is discarded + * and replaced with the specified CIE L* component. + * + * Strictly speaking, the resulting chrominance is not colorimetrically + * defined, since it derives from HSI channel values. However, the + * chrominance is supposed to be expressed in the RGB working space + * referenced by this %RGBColorSystem instance. + * + * The input \a H value must be a normalized hue, which is the hue + * angle rescaled to the normalized [0,1] range. A normalized hue value of + * one corresponds to a hue angle of 2*pi radians, or 360 degrees. + * + * The primary usefulness of this function is implementing accurate + * hue/saturation image transformations in the HSI system with full + * preservation of the CIE lightness component. + * + * \note HSI is more often known as HSL; however we reserve the L channel + * identifier exclusively for the CIE L* component (lightness) in PCL. + */ + void HSILToRGB( sample& R, sample& G, sample& B, sample H, sample S, sample I, sample L ) const + { + HSIToRGB( R, G, B, H, S, I ); +#define a H +#define b S + RGBToCIEab( a, b, R, G, B ); + CIELabToRGB( R, G, B, L, a, b ); +#undef a +#undef b + } + + /*! + * Conversion from the CIE XYZ color space to the RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param X,Y,Z Input CIE XYZ components. + */ + void CIEXYZToRGB( sample& R, sample& G, sample& B, sample X, sample Y, sample Z ) const + { + m_data->CIEXYZToRGB( R, G, B, X, Y, Z ); + } + + /*! + * Conversion from the CIE XYZ color space to the CIE L*a*b* color space. + * + * \param[out] L,a,b References to the variables where output CIE L*a*b* + * components will be copied. + * + * \param X,Y,Z Input CIE XYZ components. + */ + void CIEXYZToCIELab( sample& L, sample& a, sample& b, sample X, sample Y, sample Z ) const + { + XYZLab( X ); XYZLab( Y ); XYZLab( Z ); + L = sample( (1.16 * Y) - 0.16 ); + a = (5*(X - Y) + m_data->abOffset)/m_data->abDelta; + b = (2*(Y - Z) + m_data->abOffset)/m_data->abDelta; + } + + /*! + * Conversion from the CIE L*a*b* color space to the RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param L,a,b Input CIE L*a*b* components. + */ + void CIELabToRGB( sample& R, sample& G, sample& B, sample L, sample a, sample b ) const + { + sample X, Y, Z; + CIELabToCIEXYZ( X, Y, Z, L, a, b ); + m_data->CIEXYZToRGB( R, G, B, X, Y, Z ); + } + + /*! + * Conversion from the CIE L*a*b* color space to the CIE XYZ color space. + * + * \param[out] X,Y,Z References to the variables where output CIE XYZ + * components will be copied. + * + * \param L,a,b Input CIE L*a*b* components. + */ + void CIELabToCIEXYZ( sample& X, sample& Y, sample& Z, sample L, sample a, sample b ) const + { + Y = sample( (L + 0.16)/1.16 ); + X = (m_data->abDelta*a - m_data->abOffset)/5 + Y; + Z = Y - (m_data->abDelta*b - m_data->abOffset)/2; + LabXYZ( X ); LabXYZ( Y ); LabXYZ( Z ); + } + + /*! + * Conversion from the CIE L*a*b* color space to the CIE L*c*h* color space. + * + * \param[out] L,c,h References to the variables where output CIE L*c*h* + * components will be copied. + * + * \param L0,a,b Input CIE L*a*b* components. + * + * \note The output L component is always identical to the input L0 + * component; the L parameter of this function has been included for the + * sake of coherence in function signatures. + */ + void CIELabToCIELch( sample& L, sample& c, sample& h, sample L0, sample a, sample b ) const + { + L = L0; + a = m_data->abDelta*a - m_data->abOffset; + b = m_data->abDelta*b - m_data->abOffset; + c = Sqrt( a*a + b*b )/m_data->cDelta; + h = ArcTan( b, a )/Const::pi(); + if ( h < 0 ) + h += 1; + } + + /*! + * Conversion from the CIE L*c*h* color space to the RGB color space. + * + * \param[out] R,G,B References to the variables where output RGB + * components will be copied. + * + * \param L,c,h Input CIE L*c*h* components. + */ + void CIELchToRGB( sample& R, sample& G, sample& B, sample L, sample c, sample h ) const + { + sample a, b; + SinCos( h*Const::_2pi(), b, a ); + c *= m_data->cDelta; + a *= c; + b *= c; + sample Y = sample( (L + 0.16)/1.16 ); + sample X = a/5 + Y; + sample Z = Y - b/2; + LabXYZ( X ); LabXYZ( Y ); LabXYZ( Z ); + m_data->CIEXYZToRGB( R, G, B, X, Y, Z ); + } + + /*! + * Conversion from the CIE L*c*h* color space to the CIE L*a*b* color space. + * + * \param[out] L,a,b References to the variables where output CIE L*a*b* + * components will be copied. + * + * \param L0,c,h Input CIE L*c*h* components. + * + * \note The output L component is always identical to the input L0 + * component; the L parameter of this function has been included for the + * sake of coherence in function signatures. + */ + void CIELchToCIELab( sample& L, sample& a, sample& b, sample L0, sample c, sample h ) const + { + L = L0; + SinCos( h*Const::_2pi(), b, a ); + c *= m_data->cDelta; + a = (c*a + m_data->abOffset)/m_data->abDelta; + b = (c*b + m_data->abOffset)/m_data->abDelta; + } + +protected: + + struct Data : public ReferenceCounter + { + float gamma, gammaInv; // gamma, 1/gamma + bool issRGB; // true if sRGB gamma function is being used + bool isLinear; // true if gamma=1.0 and is not sRGB, for optimization + + /* + * Chromaticity coordinates w.r.t. the D50 reference white + */ + FVector x, y; + + /* + * Luminance coefficients w.r.t. the D50 reference white + */ + FVector Y; + + /* + * RGB <-> CIE XYZ transformation matrices + */ + Vector M; // RGB -> CIE XYZ + Vector M_; // CIE XYZ -> RGB + + /* + * Normalization coefficients for X and Z coordinates + */ + sample mX, mZ; + + /* + * Normalization of CIE a*, b* and c* components + */ + sample abOffset; + sample abDelta; + sample cDelta; + + Data( float, bool, const FVector&, const FVector&, const FVector& ); + Data( float, bool, const float*, const float*, const float* ); + Data( const Data& ) = default; + + void Initialize(); + + bool operator ==( const RGBColorSystem::Data& data ) const + { + return gamma == data.gamma && + issRGB == data.issRGB && + Y == data.Y && + x == data.x && y == data.y; + } + + /* + * Primary gamma functions + */ + + void LinearRGB( sample& x ) const + { + x = issRGB ? + ((x > sRGBEpsilon) ? + Pow( sample( (x + 0.055)/1.055 ), sample( sRGBGamma ) ) : sample( x/12.92 )) : + Pow( x, sample( gamma ) ); + } + + void GammaRGB( sample& x ) const + { + x = issRGB ? + ((x > sRGBEpsilonInv) ? + sample( 1.055*Pow( x, sample( sRGBGammaInv ) ) - 0.055 ) : sample( 12.92*x )) : + Pow( x, sample( gammaInv ) ); + } + + /* + * Primary linear transformations + */ + + void RGBToCIEXYZ( sample& X, sample& Y, sample& Z, sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + X = Range( (R*M[0] + G*M[1] + B*M[2])/mX ); + Y = Range( R*M[3] + G*M[4] + B*M[5] ); + Z = Range( (R*M[6] + G*M[7] + B*M[8])/mZ ); + } + + void CIEXYZToRGB( sample& R, sample& G, sample& B, sample X, sample Y, sample Z ) const + { + X *= mX; + Z *= mZ; + R = Range( X*M_[0] + Y*M_[1] + Z*M_[2] ); + G = Range( X*M_[3] + Y*M_[4] + Z*M_[5] ); + B = Range( X*M_[6] + Y*M_[7] + Z*M_[8] ); + + if ( !isLinear ) + { + GammaRGB( R ); + GammaRGB( G ); + GammaRGB( B ); + } + } + + /* + * Utility functions for fast partial luminance/chrominance calculations + */ + + sample CIEX( sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + return Range( (R*M[0] + G*M[1] + B*M[2])/mX ); + } + + sample CIEY( sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + return Range( R*M[3] + G*M[4] + B*M[5] ); + } + + sample CIEZ( sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + return Range( (R*M[6] + G*M[7] + B*M[8])/mZ ); + } + + void RGBToCIEXY( sample& X, sample& Y, sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + X = Range( (R*M[0] + G*M[1] + B*M[2])/mX ); + Y = Range( R*M[3] + G*M[4] + B*M[5] ); + } + + void RGBToCIEYZ( sample& Y, sample& Z, sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + Y = Range( R*M[3] + G*M[4] + B*M[5] ); + Z = Range( (R*M[6] + G*M[7] + B*M[8])/mZ ); + } + + void RGBToCIEXZ( sample& X, sample& Z, sample R, sample G, sample B ) const + { + if ( !isLinear ) + { + LinearRGB( R ); + LinearRGB( G ); + LinearRGB( B ); + } + + X = Range( (R*M[0] + G*M[1] + B*M[2])/mX ); + Z = Range( (R*M[6] + G*M[7] + B*M[8])/mZ ); + } + + static bool ValidateParameters( const FVector& x, const FVector& y, const FVector& Y ); + + static sample Range( const sample& x ) // Ensure nominal [0,1] range + { + return pcl::Range( x, sample( 0 ), sample( 1 ) ); + } + }; + + Data* m_data = nullptr; + + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } + + static void XYZLab( sample& x ) + { + x = (x > CIEEpsilon) ? Pow( x, sample( _1_3 ) ) : sample( CIEKappa116*x + _16_116 ); + } + + static void LabXYZ( sample& x ) + { + sample x3 = x*x*x; + x = (x3 > CIEEpsilon) ? x3 : sample( (x - _16_116)/CIEKappa116 ); + } + + static sample HSIH2RGB( sample v1, sample v2, sample H ) + { + if ( H < 0 ) + H += 1; + else if ( H > 1 ) + H -= 1; + + if ( H < _1_6 ) + return v1 + 6*H*(v2 - v1); + + if ( H < 0.5 ) + return v2; + + if ( H < _2_3 ) + return v1 + 6*(_2_3 - H)*(v2 - v1); + + return v1; + } + + friend struct Data; + +public: + + /*! + * sRGB x chromaticity coordinates (D50). + */ + static const float sRGB_x[ 3 ]; + + /*! + * sRGB y chromaticity coordinates (D50). + */ + static const float sRGB_y[ 3 ]; + + /*! + * sRGB luminance coefficients (D50). + */ + static const float sRGB_Y[ 3 ]; + + /*! + * The sRGB (D50) working space. + */ + static const RGBColorSystem sRGB; + +#ifdef __PCL_WITH_STANDARD_RGB_WORKING_SPACES + + /* + * Adobe RGB 1998 + */ + static const float AdobeRGB1998_x[ 3 ]; + static const float AdobeRGB1998_y[ 3 ]; + static const float AdobeRGB1998_Y[ 3 ]; + + /* + * Apple RGB + */ + static const float AppleRGB_x[ 3 ]; + static const float AppleRGB_y[ 3 ]; + static const float AppleRGB_Y[ 3 ]; + + /* + * Best RGB + */ + static const float BestRGB_x[ 3 ]; + static const float BestRGB_y[ 3 ]; + static const float BestRGB_Y[ 3 ]; + + /* + * Beta RGB (by Bruce Lindbloom) + */ + static const float BetaRGB_x[ 3 ]; + static const float BetaRGB_y[ 3 ]; + static const float BetaRGB_Y[ 3 ]; + + /* + * Bruce RGB + */ + static const float BruceRGB_x[ 3 ]; + static const float BruceRGB_y[ 3 ]; + static const float BruceRGB_Y[ 3 ]; + + /* + * CIE RGB + */ + static const float CIERGB_x[ 3 ]; + static const float CIERGB_y[ 3 ]; + static const float CIERGB_Y[ 3 ]; + + /* + * Color Match RGB + */ + static const float ColorMatchRGB_x[ 3 ]; + static const float ColorMatchRGB_y[ 3 ]; + static const float ColorMatchRGB_Y[ 3 ]; + + /* + * NTSC RGB + */ + static const float NTSCRGB_x[ 3 ]; + static const float NTSCRGB_y[ 3 ]; + static const float NTSCRGB_Y[ 3 ]; + + /* + * PAL/SECAM RGB + */ + static const float PALSECAMRGB_x[ 3 ]; + static const float PALSECAMRGB_y[ 3 ]; + static const float PALSECAMRGB_Y[ 3 ]; + + /* + * ProPhoto RGB + */ + static const float ProPhotoRGB_x[ 3 ]; + static const float ProPhotoRGB_y[ 3 ]; + static const float ProPhotoRGB_Y[ 3 ]; + + /* + * SMPTE-C RGB + */ + static const float SMPTECRGB_x[ 3 ]; + static const float SMPTECRGB_y[ 3 ]; + static const float SMPTECRGB_Y[ 3 ]; + + /* + * Wide Gamut RGB + */ + static const float WideGamutRGB_x[ 3 ]; + static const float WideGamutRGB_y[ 3 ]; + static const float WideGamutRGB_Y[ 3 ]; + +#endif // __PCL_WITH_STANDARD_RGB_WORKING_SPACES + +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#undef _1_3 +#undef _1_6 +#undef _2_3 +#undef _16_116 +#undef CIEEpsilon +#undef CIEKappa +#undef CIEKappa116 +#undef sRGBEpsilon +#undef sRGBEpsilonInv +#undef sRGBGamma +#undef sRGBGammaInv + +#endif // __PCL_RGBColorSystem_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RGBColorSystem.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RadioButton.h b/3rdparty/include/pcl/RadioButton.h new file mode 100644 index 0000000..2ae2728 --- /dev/null +++ b/3rdparty/include/pcl/RadioButton.h @@ -0,0 +1,117 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RadioButton.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RadioButton_h +#define __PCL_RadioButton_h + +/// \file pcl/RadioButton.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class RadioButton + * \brief Client-side interface to a PixInsight %RadioButton control. + * + * ### TODO: Write a detailed description for %RadioButton + */ +class PCL_CLASS RadioButton : public Button +{ +public: + + /*! + * Constructs a %RadioButton with the specified \a text, as a child control + * of \a parent. + */ + RadioButton( const String& text = String(), Control& parent = Control::Null() ); + + /*! + * Destroys a %RadioButton control. + */ + virtual ~RadioButton() + { + } + + /*! + * Returns false, since radio buttons are not pushable buttons. + */ + bool IsPushable() const override + { + return false; + } + + /*! + * Returns true, since radio buttons are checkable buttons. + */ + bool IsCheckable() const override + { + return true; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_RadioButton_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RadioButton.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Random.h b/3rdparty/include/pcl/Random.h new file mode 100644 index 0000000..3d49988 --- /dev/null +++ b/3rdparty/include/pcl/Random.h @@ -0,0 +1,921 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Random.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Random_h +#define __PCL_Random_h + +/// \file pcl/Random.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup random_numbers Random Number Generation + */ + +/*! + * Returns a 64-bit random generator seed. + * + * On UNIX/Linux platforms, this function reads the /dev/urandom system device + * to acquire a high-quality random seed. On Windows, the rand_s() CRT function + * is invoked with the same purpose. + * + * In the extremely rare cases where a system random seed cannot be obtained, + * the time() function is used to get a unique initialization value. + * + * Subsequent calls to this function are guaranteed to return unique values. + * + * This function is thread-safe. It can be safely called from multiple + * execution threads running concurrently. + * + * \ingroup random_numbers + */ +extern uint64 RandomSeed64(); + +/*! + * Returns a 32-bit random generator seed. + * + * This function simply calls RandomSeed64() and returns the XOR combination of + * the 32-bit words in the 64-bit random seed. + * + * As RandomSeed64(), this function is thread-safe and is guaranteed to return + * a unique value on each call. + * + * \ingroup random_numbers + */ +inline uint32 RandomSeed32() +{ + union { uint64 u64; uint32 u32[ 2 ]; } seed; + seed.u64 = RandomSeed64(); + return seed.u32[0] ^ seed.u32[1]; +} + +// ---------------------------------------------------------------------------- + +class FastMersenneTwister; + +// ---------------------------------------------------------------------------- + +/*! + * \class RandomNumberGenerator + * \brief Mersenne Twister (MT19937) pseudo-random number generator. + * + * \deprecated This class has been deprecated. Use the XoShiRo256ss and + * XoRoShiRo1024ss classes for all newly produced code. + * + * Generation of pseudo-random numbers with user-selectable range and + * probability distributions. + * + * This generator supports the uniform, normal (Gaussian) and Poisson + * distributions. In addition, the upper range of generated uniform deviates + * can be arbitrarily defined. + * + * %RandomNumberGenerator is a functional class. The function call operator()() + * returns pseudo-random numbers in the range [0,ymax], where ymax is the + * user-defined arbitrary upper range. + * + * Example of use: + * + * \code + * RandomNumberGenerator R, R1( 10 ); // R's ymax = 1, R1's ymax = 10 + * // ... + * double y = R(); // y = random uniform deviate in the range [0,1] + * double z = R1(); // z = random uniform deviate in the range [0,10] + * \endcode + * + * References + * + * Based on an adaptation of SIMD-oriented Fast Mersenne Twister (SFMT) by + * Mutsuo Saito and Makoto Matsumoto (Hiroshima University). + * + * Currently PCL implements a SFMT generator with a period of 2^19937-1. + * + * SFMT Copyright (C) 2006, 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima + * University. All rights reserved. + * + * \ingroup random_numbers + */ +class PCL_CLASS RandomNumberGenerator +{ +public: + + /*! + * Constructs a %RandomNumberGenerator object. + * + * \param ymax Upper bound of uniform deviates. The function call + * operator double operator()() and the Uniform() member + * function (which are synonyms) will return uniform + * pseudo-random deviates in the range [0,ymax]. The default + * value is 1.0. + * + * \param seed 32-bit initialization seed. If this parameter is zero, a + * unique random seed will be generated automatically. The + * default value is zero. + */ + RandomNumberGenerator( double ymax = 1.0, uint32 seed = 0 ); + + /*! + * Destroys a %RandomNumberGenerator object. + */ + virtual ~RandomNumberGenerator(); + + /*! + * Generates a floating point uniform deviate in the range [0,UpperBound()] + */ + double operator ()() + { + return m_rmax*Rand32(); + } + + /*! + * Generates a 32-bit unsigned integer uniform deviate. + */ + uint32 Rand32(); + + /*! + * Generates a floating point uniform deviate in the range [0,1] (i.e., + * ignoring UpperBound()). + */ + double Rand1() + { + return double( Rand32() )/uint32_max; + } + + /*! + * Generates a floating point uniform deviate in the range [0,UpperBound()] + * + * This is a convenience alias for operator()(). + */ + double Uniform() + { + return operator()(); + } + + /*! + * Generates a floating point normal deviate with the specified \a mean and + * standard deviation \a sigma. + */ + double Normal( double mean = 0, double sigma = 1 ); + + /*! + * Generates a floating point normal deviate with the specified \a mean and + * standard deviation \a sigma. + * + * This is a convenience alias for Normal( mean, sigma ). + */ + double Gaussian( double mean = 0, double sigma = 1 ) + { + return Normal( mean, sigma ); + } + + /*! + * Generates a discrete random deviate from a Poisson distribution with the + * specified expected value \a lambda. + */ + int Poisson( double lambda ); + + /*! + * Returns the current upper bound of this random number generator. + */ + double UpperBound() const + { + return m_ymax; + } + + /*! + * Sets the upper bound \a ymax > 0 for this random number generator. + */ + void SetUpperBound( double ymax ) + { + PCL_PRECONDITION( ymax > 0 ) + PCL_PRECONDITION( 1 + ymax != 1 ) + m_rmax = (m_ymax = ymax)/double( uint32_max ); + m_normal = false; + } + +private: + + AutoPointer m_generator; + double m_ymax; + double m_rmax; + bool m_normal; + double m_vs; // second result from Box–Muller transform + DVector m_lambda; // precalculated for current Poisson lambda +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XorShift1024 + * \brief Implementation of the XorShift1024* pseudo-random number generator. + * + * \deprecated This class has been deprecated. Use the XoShiRo256ss and + * XoRoShiRo1024ss classes for all newly produced code. + * + * Generation of pseudo-random uniform deviates using the xorshift1024* + * generator developed in 2014 by Sebastiano Vigna. This is a fast, top-quality + * generator with a period of 2^1024-1, passing strong statistical test suites. + * + * Examples of use: + * + * \code + * XorShift1024 X; // initialized automatically + * // ... + * double x = X(); // x = random uniform deviate in the range [0,1) + * uint64 y = X.UI64(); // y = 64-bit unsigned integer random uniform deviate + * uint32 z = X.UI32(); // z = 32-bit unsigned integer random uniform deviate + * uint32 t = X.UIN( 100 ); // t = integer uniform deviate in the range [0,99] + * \endcode + * + * References + * + * Sebastiano Vigna (2014), An experimental exploration of Marsaglia's + * xorshift generators, scrambled, arXiv:1402.6246 + * + * Sebastiano Vigna (2014), Further scramblings of Marsaglia's xorshift + * generators, arXiv:1404.0390 + * + * See also: http://xorshift.di.unimi.it/ + * + * \ingroup random_numbers + */ +class PCL_CLASS XorShift1024 +{ +public: + + /*! + * Constructs a %XorShift1024 pseudo-random number generator. + * + * \param seed 64-bit initialization seed. If this parameter is zero, a + * unique random seed will be generated automatically. The + * default value is zero. + */ + XorShift1024( uint64 seed = 0 ) noexcept( false ) + { + Initialize( seed ); + } + + /*! + * Returns a double precision uniform random deviate in the [0,1) range. + */ + double operator ()() noexcept + { + return 5.4210108624275221703311e-20 * UI64(); // 1.0/(2^64 -1) + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate. + */ + uint64 UI64() noexcept + { + uint64 s0 = m_s[m_p]; + uint64 s1 = m_s[m_p = (m_p + 1) & 15]; + s1 ^= s1 << 31; // a + s1 ^= s1 >> 11; // b + s0 ^= s0 >> 30; // c + return (m_s[m_p] = s0 ^ s1) * 1181783497276652981ull; + } + + /*! + * Returns a 32-bit unsigned integer uniform random deviate. + */ + uint32 UI32() noexcept + { + return uint32( UI64() ); + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate in the range + * [0,n-1]. + */ + uint64 UI64N( uint64 n ) noexcept + { + return UI64() % n; + } + + /*! + * Returns an unsigned integer uniform random deviate in the range [0,n-1]. + */ + uint32 UIN( uint32 n ) noexcept + { + return UI64() % n; + } + + /*! + * A synonym for UIN(). + */ + uint32 UI32N( uint32 n ) noexcept + { + return UIN( n ); + } + + /*! + * Reinitializes this generator with a new \a seed. + * + * If the specified \a seed is zero, a unique, high-quality random seed will + * be generated automatically by calling RandomSeed64(). + */ + void Initialize( uint64 x ) + { + if ( x == 0 ) + x = RandomSeed64(); + // Use a xorshift64* generator to initialize the state space. + for ( int i = 0; i < 16; ++i ) + { + x ^= x >> 12; // a + x ^= x << 25; // b + x ^= x >> 27; // c + m_s[i] = x * 2685821657736338717ull; + } + m_p = 0; + } + +private: + + uint64 m_s[ 16 ]; // state space + int m_p; // current index +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XoRoShiRo1024ss + * \brief Base class of xoshiro and xoroshiro pseudo-random number generators. + */ +class PCL_CLASS XoShiRoBase +{ +public: + + /*! + * Default constructor. + */ + XoShiRoBase() = default; + +protected: + + /*! + * \internal + * The left rotation function used by the generator. + */ + static uint64 RotL( const uint64 x, int k ) noexcept + { + return (x << k) | (x >> (64 - k)); + } + + /*! + * \internal + * The SplitMix64 generator used for state space initialization, as + * recommended by Blackman/Vigna. + */ + static uint64 SplitMix64( uint64& x ) noexcept + { + uint64 z = (x += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); + } + + /*! + * \internal + * Conversion of a 64-bit unsigned inteter to 64-bit floating point with + * uniform probability over the entire 53-bit significant digits. + * See: http://prng.di.unimi.it/#remarks + */ + static double UI64ToDouble( uint64 x ) noexcept + { + return (x >> 11) * 0x1.0p-53; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XoShiRo256ss + * \brief Implementation of the xoshiro256** pseudo-random number generator. + * + * Generation of pseudo-random uniform deviates using the xoroshiro1024** + * generator developed in 2019 by David Blackman and Sebastiano Vigna. This is + * a fast, top-quality generator with a period of 2^256-1, passing strong + * statistical test suites—actually, it passes all tests we are aware of. + * + * Examples of use: + * + * \code + * XoShiRo256ss X; // initialized automatically + * // ... + * double x = X(); // x = random uniform deviate in the range [0,1) + * uint64 y = X.UI64(); // y = 64-bit unsigned integer random uniform deviate + * uint32 z = X.UI32(); // z = 32-bit unsigned integer random uniform deviate + * uint32 t = X.UIN( 100 ); // t = integer uniform deviate in the range [0,99] + * \endcode + * + * References + * + * David Blackman and Sebastiano Vigna (2019), Scrambled linear + * pseudorandom number generators (preprint). + * + * See also: http://prng.di.unimi.it/ + * + * \ingroup random_numbers + */ +class PCL_CLASS XoShiRo256ss : public XoShiRoBase +{ +public: + + /*! + * Constructs a %XoShiRo256ss pseudo-random number generator. + * + * \param seed 64-bit initialization seed. If this parameter is zero, a + * unique random seed will be generated automatically. The + * default value is zero. + */ + XoShiRo256ss( uint64 seed = 0 ) noexcept( false ) + { + Initialize( seed ); + } + + /*! + * Returns a double precision uniform random deviate in the [0,1) range. + */ + double operator ()() noexcept + { + return UI64ToDouble( UI64() ); + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate. + */ + uint64 UI64() noexcept + { + const uint64 result = RotL( m_s[1]*5, 7 ) * 9; + const uint64 t = m_s[1] << 17; + m_s[2] ^= m_s[0]; + m_s[3] ^= m_s[1]; + m_s[1] ^= m_s[2]; + m_s[0] ^= m_s[3]; + m_s[2] ^= t; + m_s[3] = RotL( m_s[3], 45 ); + return result; + } + + /*! + * Returns a 32-bit unsigned integer uniform random deviate. + */ + uint32 UI32() noexcept + { + return uint32( UI64() ); + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate in the range + * [0,n-1]. + */ + uint64 UI64N( uint64 n ) noexcept + { + return UI64() % n; + } + + /*! + * Returns an unsigned integer uniform random deviate in the range [0,n-1]. + */ + uint32 UIN( uint32 n ) noexcept + { + return UI64() % n; + } + + /*! + * A synonym for UIN(). + */ + uint32 UI32N( uint32 n ) noexcept + { + return UIN( n ); + } + + /*! + * Reinitializes this generator with a new \a seed. + * + * If the specified \a seed is zero, a unique, high-quality random seed will + * be generated automatically by calling RandomSeed64(). + */ + void Initialize( uint64 x ) + { + if ( x == 0 ) + x = RandomSeed64(); + // Use a SplitMix64 generator to initialize the state space. + for ( int i = 0; i < 4; ++i ) + m_s[i] = SplitMix64( x ); + } + +private: + + uint64 m_s[ 4 ]; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XoRoShiRo1024ss + * \brief Implementation of the xoroshiro1024** pseudo-random number generator. + * + * Generation of pseudo-random uniform deviates using the xoroshiro1024** + * generator developed in 2019 by David Blackman and Sebastiano Vigna. This is + * a fast, top-quality generator with a period of 2^1024-1, passing strong + * statistical test suites—actually, it passes all tests we are aware of. + * + * Examples of use: + * + * \code + * XoRoShiRo1024ss X; // initialized automatically + * // ... + * double x = X(); // x = random uniform deviate in the range [0,1) + * uint64 y = X.UI64(); // y = 64-bit unsigned integer random uniform deviate + * uint32 z = X.UI32(); // z = 32-bit unsigned integer random uniform deviate + * uint32 t = X.UIN( 100 ); // t = integer uniform deviate in the range [0,99] + * \endcode + * + * References + * + * David Blackman and Sebastiano Vigna (2019), Scrambled linear + * pseudorandom number generators (preprint). + * + * See also: http://prng.di.unimi.it/ + * + * \ingroup random_numbers + */ +class PCL_CLASS XoRoShiRo1024ss : public XoShiRoBase +{ +public: + + /*! + * Constructs a %XoRoShiRo1024ss pseudo-random number generator. + * + * \param seed 64-bit initialization seed. If this parameter is zero, a + * unique random seed will be generated automatically. The + * default value is zero. + */ + XoRoShiRo1024ss( uint64 seed = 0 ) noexcept( false ) + { + Initialize( seed ); + } + + /*! + * Returns a double precision uniform random deviate in the [0,1) range. + */ + double operator ()() noexcept + { + return UI64ToDouble( UI64() ); + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate. + */ + uint64 UI64() noexcept + { + const int q = m_p; + const uint64 s0 = m_s[m_p = (m_p + 1) & 15]; + uint64 s15 = m_s[q]; + const uint64 result = RotL( s0*5, 7 ) * 9; + s15 ^= s0; + m_s[q] = RotL( s0, 25 ) ^ s15 ^ (s15 << 27); + m_s[m_p] = RotL( s15, 36 ); + return result; + } + + /*! + * Returns a 32-bit unsigned integer uniform random deviate. + */ + uint32 UI32() noexcept + { + return uint32( UI64() ); + } + + /*! + * Returns a 64-bit unsigned integer uniform random deviate in the range + * [0,n-1]. + */ + uint64 UI64N( uint64 n ) noexcept + { + return UI64() % n; + } + + /*! + * Returns an unsigned integer uniform random deviate in the range [0,n-1]. + */ + uint32 UIN( uint32 n ) noexcept + { + return UI64() % n; + } + + /*! + * A synonym for UIN(). + */ + uint32 UI32N( uint32 n ) noexcept + { + return UIN( n ); + } + + /*! + * Reinitializes this generator with a new \a seed. + * + * If the specified \a seed is zero, a unique, high-quality random seed will + * be generated automatically by calling RandomSeed64(). + */ + void Initialize( uint64 x ) + { + if ( x == 0 ) + x = RandomSeed64(); + // Use a SplitMix64 generator to initialize the state space. + for ( int i = 0; i < 16; ++i ) + m_s[i] = SplitMix64( x ); + m_p = 0; + } + +private: + + uint64 m_s[ 16 ]; + int m_p; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class NormalRandomDeviates + * \brief Generation of random normal (Gaussian) deviates. + * \ingroup random_numbers + */ +template +class PCL_CLASS NormalRandomDeviates +{ +public: + + /*! + * Constructs a %NormalRandomDeviates objects using the specified + * pseudo-random number generator \a R. + */ + NormalRandomDeviates( RNG& R ) noexcept( false ) + : m_R( R ) + { + } + + /*! + * Returns a random deviate from a Gaussian distribution with zero mean and + * unit standard deviation. + */ + double operator ()() noexcept + { + /* + * Marsaglia polar method. + */ + double x; + if ( m_first ) + { + do + { + double u1 = m_R(); + double u2 = m_R(); + m_v1 = 2*u1 - 1; + m_v2 = 2*u2 - 1; + m_s = m_v1*m_v1 + m_v2*m_v2; + } + while ( m_s >= 1 || m_s <= std::numeric_limits::epsilon() ); + + x = m_v1 * Sqrt( -2*Ln( m_s )/m_s ); + } + else + x = m_v2 * Sqrt( -2*Ln( m_s )/m_s ); + + m_first = !m_first; + return x; + } + +private: + + RNG& m_R; + double m_v1 = 0; + double m_v2 = 0; + double m_s = 0; + bool m_first = true; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PoissonRandomDeviates + * \brief Generation of random Poisson deviates. + * \ingroup random_numbers + */ +template +class PCL_CLASS PoissonRandomDeviates +{ +public: + + /*! + * Constructs a %PoissonRandomDeviates objects using the specified + * pseudo-random number generator \a R. + */ + PoissonRandomDeviates( RNG& R ) noexcept( false ) + : m_R( R ) + { + } + + /*! + * Returns a random Poisson deviate for the specified \a value. + */ + int operator ()( double value ) noexcept + { + if ( value < 30 ) + { + /* + * Implementation of the algorithm by Donald E. Knuth, 1969. + * + * This algorithm is slow (unusable) for large values. + */ + double p = 1, L = Exp( -value ); + int k = 0; + do + { + ++k; + p *= m_R(); + } + while ( p > L ); + return k-1; + } + + /* + * Code adapted from 'Random number generation in C++', by John D. Cook: + * + * https://www.johndcook.com/blog/cpp_random_number_generation/ + * + * The algorithm is from "The Computer Generation of Poisson Random + * Variables" by A. C. Atkinson, Journal of the Royal Statistical + * Society Series C (Applied Statistics) Vol. 28, No. 1. (1979) + * + * This algorithm is slow (unusable) for small values. + */ + double c = 0.767 - 3.36/value; + double beta = Const::pi()/Sqrt( 3*value ); + double alpha = beta*value; + double k = Ln( c ) - value - Ln( beta ); + for ( ;; ) + { + double u = m_R(); + double x = (alpha - Ln( (1 - u)/u ))/beta; + int n = int( Floor( x + 0.5 ) ); + if ( n < 0 ) + continue; + double v = m_R(); + double y = alpha - beta*x; + double temp = 1 + Exp( y ); + double lhs = y + Ln( v/temp/temp ); + double rhs = k + n*Ln( value ) - LnFactorial( n ); + if ( lhs <= rhs ) + return n; + } + } + +private: + + RNG& m_R; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GammaRandomDeviates + * \brief Generation of random gamma deviates. + * \ingroup random_numbers + */ +template +class PCL_CLASS GammaRandomDeviates +{ +public: + + /*! + * Constructs a %GammaRandomDeviates objects using the specified + * pseudo-random number generator \a R. + */ + GammaRandomDeviates( RNG& R, double shape = 1, double scale = 1 ) noexcept( false ) + : m_R( R ) + , m_shape( shape ) + , m_scale( scale ) + , m_normal( R ) + { + if ( m_shape <= 0 ) + throw Error( "GammaRandomDeviates(): The function shape parameter must be > 0." ); + if ( m_scale <= 0 ) + throw Error( "GammaRandomDeviates(): The scale parameter must be > 0." ); + + m_d = ((m_shape >= 1) ? m_shape : m_shape + 1) - 1.0/3.0; + m_c = 1/Sqrt( 9*m_d ); + } + + /*! + * Returns a random deviate from a Gaussian distribution with zero mean and + * unit standard deviation. + */ + double operator ()() noexcept + { + /* + * Code adapted from 'Random number generation in C++', by John D. Cook: + * https://www.johndcook.com/blog/cpp_random_number_generation/ + * + * Implementation based on "A Simple Method for Generating Gamma + * Variables" by George Marsaglia and Wai Wan Tsang. ACM Transactions on + * Mathematical Software Vol 26, No 3, September 2000, pages 363-372. + */ + for ( ;; ) + { + double x, v; + do + { + x = m_normal(); + v = 1 + m_c*x; + } + while ( v <= 0 ); + v = v*v*v; + double u = m_R(); + double xsquared = x*x; + if ( u < 1 - 0.0331*xsquared*xsquared || Ln( u ) < 0.5*xsquared + m_d*(1 - v + Ln( v )) ) + { + double g = m_scale*m_d*v; + if ( m_shape < 1 ) + g *= Pow( m_R(), 1/m_shape ); + return g; + } + } + } + +private: + + RNG& m_R; + double m_shape; + double m_scale; + double m_d; + double m_c; + NormalRandomDeviates m_normal; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Random_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Random.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ReadWriteMutex.h b/3rdparty/include/pcl/ReadWriteMutex.h new file mode 100644 index 0000000..56fa9c9 --- /dev/null +++ b/3rdparty/include/pcl/ReadWriteMutex.h @@ -0,0 +1,194 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ReadWriteMutex.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ReadWriteMutex_h +#define __PCL_ReadWriteMutex_h + +/// \file pcl/ReadWriteMutex.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ReadWriteMutex + * \brief Client-side interface to a PixInsight read/write mutex object + * + * %ReadWriteMutex provides separate thread synchronization for read and write + * operations. This can be more efficient than plain Mutex synchronization + * because multiple threads can access a data item for read-only operations + * simultaneously, which in turn improves concurrency if write accesses are + * relatively infrequent. + * + * \sa Mutex + */ +class PCL_CLASS ReadWriteMutex : public UIObject +{ +public: + + /*! + * Constructs a ReadWriteMutex object. + */ + ReadWriteMutex(); + + /*! + * Destroys a ReadWriteMutex object. + * + * \warning Destroying a locked %ReadWriteMutex object may result in + * undefined (mostly catastrophic) behavior. Always ensure that a read/write + * mutex has been unlocked before destroying it. + */ + virtual ~ReadWriteMutex() + { + } + + /*! + * Copy constructor. This constructor is disabled because %ReadWriteMutex + * represents unique server-side objects. + */ + ReadWriteMutex( const ReadWriteMutex& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %ReadWriteMutex + * represents unique server-side objects. + */ + ReadWriteMutex& operator =( const ReadWriteMutex& ) = delete; + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since mutexes are unique objects by definition, calling this member + * function has no effect. + */ + void EnsureUnique() override + { + // ReadWriteMutex instances are unique objects + } + + /*! + * Returns a reference to a null %ReadWriteMutex instance. A null + * %ReadWriteMutex does not correspond to an existing read/write mutex in + * the PixInsight core application. + */ + static ReadWriteMutex& Null(); + + /*! + * Locks this read/write mutex object for reading. + * + * The calling thread will block its execution if other thread has locked + * this read/write mutex for writing. + */ + void LockForRead(); + + /*! + * Locks this read/write mutex object for writing. + * + * The calling thread will block its execution if other thread has locked + * this read/write mutex for reading or writing. + */ + void LockForWrite(); + + /*! + * Attempts locking this read/write mutex object for reading. Returns true + * if this mutex has been successfully locked by the calling thread, false + * otherwise. + * + * Locking for reading will only fail if other thread has locked this object + * for writing. If other threads have locked this object for reading only, + * the calling thread will also lock it and this function will return true. + * + * Unlike LockForRead(), this function does not block execution of the + * calling thread if this %ReadWriteMutex cannot be locked for reading. + */ + bool TryLockForRead(); + + /*! + * Attempts locking this read/write mutex object for writing. Returns true if + * this mutex has been successfully locked by the calling thread, false + * otherwise. + * + * Locking for writing will fail if other thread has locked this object for + * reading or writing. + * + * Unlike LockForWrite(), this function does not block execution of the + * calling thread if this %ReadWriteMutex cannot be locked for writing. + */ + bool TryLockForWrite(); + + /*! + * Unlocks this %ReadWriteMutex object. + */ + void Unlock(); + +private: + + ReadWriteMutex( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ReadWriteMutex_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ReadWriteMutex.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ReadoutOptions.h b/3rdparty/include/pcl/ReadoutOptions.h new file mode 100644 index 0000000..fed809e --- /dev/null +++ b/3rdparty/include/pcl/ReadoutOptions.h @@ -0,0 +1,724 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ReadoutOptions.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ReadoutOptions_h +#define __PCL_ReadoutOptions_h + +/// \file pcl/ReadoutOptions.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ReadoutData + * \brief Pixel readout data modes. + * + * + * + * + * + * + * + * + * + * + *
ReadoutData::RGBK RGB components or grayscale
ReadoutData::RGBL RGB components + CIE L* (lightness)
ReadoutData::RGBY RGB components + CIE Y (luminance)
ReadoutData::CIEXYZ CIE XYZ unit vectors
ReadoutData::CIELab CIE L*a*b* normalized components
ReadoutData::CIELch CIE L*c*h* normalized components
ReadoutData::HSV HSV components
ReadoutData::HSI HSI components
+ */ +namespace ReadoutData +{ + enum value_type + { + RGBK, // RGB components or grayscale + RGBL, // RGB components + CIE L* + RGBY, // RGB components + CIE Y + CIEXYZ, // CIE XYZ unit vectors + CIELab, // CIE L*a*b* normalized components + CIELch, // CIE L*c*h* normalized components + HSV, // HSV components + HSI, // HSI components + NumberOfModes + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ReadoutMode + * \brief Pixel readout calculation modes. + * + * + * + * + * + * + *
ReadoutMode::Mean Average of readout probe pixel values
ReadoutMode::Median Median of readout probe pixel values
ReadoutMode::Minimum The maximum pixel value in the readout probe area
ReadoutMode::Maximum The minimum pixel value in the readout probe area
+ */ +namespace ReadoutMode +{ + enum value_type + { + Mean, // Average of probe pixel values + Median, // Median of probe pixel values + Minimum, // The maximum pixel value in the probe area + Maximum, // The minimum pixel value in the probe area + NumberOfModes + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class ReadoutOptions + * \brief A structure to hold global pixel readout options. + * + * %ReadoutOptions holds a set of parameters that define how PixInsight + * calculates and presents numerical pixel data obtained directly from images. + * + * Readouts are generated dynamically when the user moves a pointing device + * cursor over an image in PixInsight. Generated readout data are shown on the + * %Readout toolbar, normally located at the bottom of the core application's + * main window, and are also shown on popup windows when the user clicks on the + * image. Furthermore, when the user presses the mouse over an image, readout + * values are sent to interface windows that request them (see + * \ref readout_notifications). When those interfaces receive readout values, + * they usually provide some visual feedback, or use them to modify their + * behavior, as appropriate. + * + * With %ReadoutOptions you can specify two sets of parameters: a first set + * that defines how readout values are calcualted, and a second set that + * indicates how the numerical readout values are presented to the user. + * + * The first parameter set includes the color space in which data is generated + * (e.g. RGB, HSV, CIE Lab, etc), the calculation mode used (average, median, + * minimum or maximum), and the size of the square box used to calculate + * readouts. + * + * The second set of parameters lets you choose between real and integer + * readouts. Real readouts are normalized to the [0,1] interval, where 0=black + * and 1=white. For real readouts you may also specify a resolution degree in + * terms of the amount of decimal digits shown (from 0 to 15). Integer readouts + * are given in the range from zero to an arbitrary maximum value that you can + * specify from 1 to 2^32-1. + * + * \sa ProcessInterface + */ +class PCL_CLASS ReadoutOptions +{ +public: + + /*! + * Represents a pixel readout data mode. + */ + typedef ReadoutData::value_type readout_data; + + /*! + * Represents a pixel readout calculation mode. + */ + typedef ReadoutMode::value_type readout_mode; + + /*! + * Maximum allowed size of a square readout probe. + */ + enum { MaxProbeSize = 15 }; + + /*! + * Maximum allowed number of decimal digits for real readout display. + */ + enum { MaxPrecision = 15 }; + + /*! + * Minimum and maximum allowed sizes of a square readout preview. + */ + enum { MinPreviewSize = 15, MaxPreviewSize = 127 }; + + /*! + * Maximum allowed zoom factor for readout previews. + */ + enum { MaxPreviewZoomFactor = 16 }; + + /*! + * Constructs a default %ReadoutOptions object. + */ + ReadoutOptions() = default; + + /*! + * Copy constructor. + */ + ReadoutOptions( const ReadoutOptions& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ReadoutOptions& operator =( const ReadoutOptions& ) = default; + + /*! + * Returns the current readout options retrieved from the PixInsight core + * application. + */ + static ReadoutOptions GetCurrentOptions(); + + /*! + * Sets new readout options in the PixInsight core application. + */ + static void SetCurrentOptions( const ReadoutOptions& ); + + /*! + * Returns the readout data mode in this %ReadoutOptions object. + */ + readout_data Data() const + { + return data; + } + + /*! + * Sets the readout data mode in this %ReadoutOptions object. + */ + void SetData( readout_data d ) + { + data = d; + } + + /*! + * Returns the readout calculation mode in this %ReadoutOptions object. + */ + readout_mode Mode() const + { + return mode; + } + + /*! + * Sets the readout calculation mode in this %ReadoutOptions object. + */ + void SetMode( readout_mode m ) + { + mode = m; + } + + /*! + * Returns true iff this %ReadoutOptions object enables presentation of alpha + * channel pixel readouts. + */ + bool ShowAlphaChannel() const + { + return showAlpha; + } + + /*! + * Enables inclusion of alpha channel values on pixel readouts. + */ + void EnableAlphaChannel( bool enable = true ) + { + showAlpha = enable; + } + + /*! + * Disables inclusion of alpha channel values on pixel readouts. + * + * This is a convenience function, equivalent to: + * EnableAlphaChannel( !disable ) + */ + void DisableAlphaChannel( bool disable = true ) + { + EnableAlphaChannel( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables presentation of mask + * channel pixel readouts. + */ + bool ShowMaskChannel() const + { + return showMask; + } + + /*! + * Enables inclusion of mask channel values on pixel readouts. + */ + void EnableMaskChannel( bool enable = true ) + { + showMask = enable; + } + + /*! + * Disables inclusion of mask channel values on pixel readouts. + * + * This is a convenience function, equivalent to: + * EnableMaskChannel( !disable ) + */ + void DisableMaskChannel( bool disable = true ) + { + EnableMaskChannel( !disable ); + } + + /*! + * Returns the readout probe size in pixels. + */ + int ProbeSize() const + { + return probeSize; + } + + /*! + * Sets the readout probe size in pixels. If a value of one is specified, + * readouts will be calculated for a single pixel. The specified size \a sz + * must be an odd integer in the range [1,15]. + */ + void SetProbeSize( int sz ) + { + probeSize = pcl::Range( sz, 1, int( MaxProbeSize ) ) | 1; + } + + /*! + * Returns the size in pixels of the real-time readout preview. + */ + int PreviewSize() const + { + return previewSize; + } + + /*! + * Sets the size in pixels of the real-time readout preview. The specified + * size \a sz must be an odd integer in the range [15,127]. + */ + void SetPreviewSize( int sz ) + { + previewSize = pcl::Range( sz, int( MinPreviewSize ), int( MaxPreviewSize ) ) | 1; + } + + /*! + * Returns the zoom factor applied to real-time readout previews. The + * returned value has the same meaning as for ImageWindow::ZoomFactor() and + * ImageWindow::SetViewport(). + */ + int PreviewZoomFactor() const + { + return previewZoom; + } + + /*! + * Sets the zoom factor to apply for generation of real-time readout + * previews. The specified \a zoom factor must be in the range [1,16], and + * has the same meaning as zoom factors for ImageWindow::SetViewport(). + */ + void SetPreviewZoomFactor( int zoom ) + { + previewZoom = pcl::Range( zoom, 1, int( MaxPreviewZoomFactor ) ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables generation of + * real-time readout previews. + */ + bool ShowPreview() const + { + return showPreview; + } + + /*! + * Enables generation of real-time readout previews. + */ + void EnablePreview( bool enable = true ) + { + showPreview = enable; + } + + /*! + * Disables generation of real-time readout previews. + */ + void DisablePreview( bool disable = true ) + { + EnablePreview( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables crosshair center + * lines on real-time readout previews. + */ + bool ShowPreviewCenter() const + { + return previewCenter; + } + + /*! + * Enables or disables crosshair center lines on real-time readout previews. + */ + void EnablePreviewCenter( bool enable = true ) + { + previewCenter = enable; + } + + /*! + * Disables or enables crosshair center lines on real-time readout previews. + */ + void DisablePreviewCenter( bool disable = true ) + { + EnablePreviewCenter( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables equatorial + * coordinates, which can be shown when the image has a valid astrometric + * solution. + */ + bool ShowEquatorialCoordinates() const + { + return showEquatorial; + } + + /*! + * Enables equatorial coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void EnableEquatorialCoordinates( bool enable = true ) + { + showEquatorial = enable; + } + + /*! + * Disables equatorial coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void DisableEquatorialCoordinates( bool disable = true ) + { + EnableEquatorialCoordinates( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables ecliptic + * coordinates, which can be shown when the image has a valid astrometric + * solution. + */ + bool ShowEclipticCoordinates() const + { + return showEcliptic; + } + + /*! + * Enables ecliptic coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void EnableEclipticCoordinates( bool enable = true ) + { + showEcliptic = enable; + } + + /*! + * Disables ecliptic coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void DisableEclipticCoordinates( bool disable = true ) + { + EnableEclipticCoordinates( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables galactic + * coordinates, which can be shown when the image has a valid astrometric + * solution. + */ + bool ShowGalacticCoordinates() const + { + return showGalactic; + } + + /*! + * Enables galactic coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void EnableGalacticCoordinates( bool enable = true ) + { + showGalactic = enable; + } + + /*! + * Disables galactic coordinates, which can be shown when the image has a + * valid astrometric solution. + */ + void DisableGalacticCoordinates( bool disable = true ) + { + EnableGalacticCoordinates( !disable ); + } + + /*! + * Returns the number of items used in sexagesimal representations of + * celestial spherical coordinates. The returned value can be one of: + * + * \li 1 - degrees/hours only. + * \li 2 - degrees/hours and minutes. + * \li 3 - degrees/hours, minutes and secons. + */ + int CoordinateItems() const + { + return coordinateItems; + } + + /*! + * Sets the number of items used in sexagesimal representations of celestial + * spherical coordinates. The specified value \a n must be one of: + * + * \li 1 - degrees/hours only. + * \li 2 - degrees/hours and minutes. + * \li 3 - degrees/hours, minutes and secons. + */ + void SetCoordinateItems( int n ) + { + coordinateItems = Range( n, 1, 3 ); + } + + /*! + * Returns the number of decimal digits represented for the last item in + * sexagesimal representations of celestial spherical coordinates. The + * returned value is an integer in the range [0,8]. + */ + int CoordinatePrecision() const + { + return coordinatePrecision; + } + + /*! + * Returns the actual number of decimal digits that should be used to + * represent spherical coordinates, as a function of the number of + * represented sexagesimal items. Returns a maximum of 3, 5 and 7 digits, + * respectively for 3, 2 and 1 represented items. These constraints allow + * for the representation of coordinates with milliarcsecond precision. + */ + int RealCoordinatePrecision() const + { + return Range( coordinatePrecision, 0, 3 + 2*(3 - coordinateItems) ); + } + + /*! + * Sets the number of decimal digits represented for the last item in + * sexagesimal representations of celestial spherical coordinates. The + * specified value \a n must be in the range [0,8]. + */ + void SetCoordinatePrecision( int n ) + { + coordinatePrecision = Range( n, 0, 8 ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables broadcasting of + * readout notifications. + * \sa \ref readout_notifications "readout notifications" + */ + bool IsBroadcastEnabled() const + { + return broadcast; + } + + /*! + * Enables or disables broadcasting of readout notifications. + * \sa \ref readout_notifications "readout notifications" + */ + void EnableBroadcast( bool enable = true ) + { + broadcast = enable; + } + + /*! + * Disables or enables broadcasting of readout notifications. + * \sa \ref readout_notifications "readout notifications" + */ + void DisableBroadcast( bool disable = true ) + { + EnableBroadcast( !disable ); + } + + /*! + * Returns true iff this %ReadoutOptions object enables floating point real + * pixel readouts. + */ + bool IsReal() const + { + return real; + } + + /*! + * Enables or disables floating point real pixel readouts. + */ + void SetReal( bool b = true ) + { + real = b; + } + + /*! + * Returns true iff this %ReadoutOptions object disables floating point real + * pixel readouts. + * + * This is a convenience function, equivalent to: + * !IsReal(). + */ + bool IsInteger() const + { + return !IsReal(); + } + + /*! + * Enables or disables integer pixel readouts. + * + * This is a convenience function, equivalent to: + * SetReal( !b ) + */ + void SetInteger( bool b = true ) + { + SetReal( !b ); + } + + /*! + * Returns the precision for floating point real pixel readouts. The + * returned value is the number of decimal digits employed to represent real + * pixel readouts. + */ + int Precision() const + { + return precision; + } + + /*! + * Sets the precision for floating point real pixel readouts. The specified + * value is the number \a n of decimal digits employed to represent real + * pixel readouts. + */ + void SetPrecision( int n ) + { + precision = pcl::Range( n, 0, int( MaxPrecision ) ); + } + + /*! + * Returns the maximum value of integer pixel readouts. + */ + unsigned IntegerRange() const + { + return range; + } + + /*! + * Sets the maximum value of integer pixel readouts. + */ + void SetIntegerRange( unsigned n ) + { + range = pcl::Range( uint32( n ), uint32( 1 ), ~uint32( 0 ) ); + } + + /*! + * Selects the 8-bit integer readout range. + * + * This is a convenience function, equivalent to: + * SetIntegerRange( uint8_max ) + */ + void Set8BitRange() + { + SetIntegerRange( uint8_max ); + } + + /*! + * Selects the 16-bit integer readout range. + * + * This is a convenience function, equivalent to: + * SetIntegerRange( uint16_max ) + */ + void Set16BitRange() + { + SetIntegerRange( uint16_max ); + } + + /*! + * Selects the 32-bit integer readout range. + * + * This is a convenience function, equivalent to: + * SetIntegerRange( uint32_max ) + */ + void Set32BitRange() + { + SetIntegerRange( uint32_max ); + } + +#ifdef __PCL_BUILDING_PIXINSIGHT_APPLICATION +protected: +#else +private: +#endif + + readout_data data = ReadoutData::RGBK; + readout_mode mode = ReadoutMode::Mean; + int probeSize = 1; // size of the square probe - must be an odd number + int previewSize = 25; // size of the square preview - must be an odd number + int previewZoom = 8; // readout preview zoom factor >= 1 + int precision = 4; // number of decimal digits if real==true + unsigned range = uint16_max; // maximum discrete value if real==false + bool showAlpha = true; // show alpha channel readouts? + bool showMask = true; // show mask channel readouts? + bool showPreview = true; // show real-time readout previews? + bool previewCenter = true; // draw center crosshairs on readout previews? + bool showEquatorial = true; // show equatorial coordinates + bool showEcliptic = false; // show ecliptic coordinates + bool showGalactic = false; // show galactic coordinates + int coordinateItems = 3; // 1=degrees/hours 2=minutes 3=seconds + int coordinatePrecision = 2; // decimal digits of last represented item + bool broadcast = true; // broadcast readouts? + bool real = true; // true=real, false=integer +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ReadoutOptions_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ReadoutOptions.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RealTimePreview.h b/3rdparty/include/pcl/RealTimePreview.h new file mode 100644 index 0000000..4d75853 --- /dev/null +++ b/3rdparty/include/pcl/RealTimePreview.h @@ -0,0 +1,241 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RealTimePreview.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RealTimePreview_h +#define __PCL_RealTimePreview_h + +/// \file pcl/RealTimePreview.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class ProcessInterface; + +/*! + * \class RealTimePreview + * \brief Client-side interface to the Real-Time Preview system. + * + * %RealTimePreview is a high-level, client-side interface to the Real-Time + * Preview system available in the PixInsight core application. + * + * \note The Real-Time Preview system is undergoing extensive development in + * PixInsight. Be aware that this class will be updated and enhanced + * considerably in future PCL releases. + */ +class PCL_CLASS RealTimePreview +{ +public: + + /*! + * Default constructor. This constructor is disabled because + * %RealTimePreview is not an instantiable class. + */ + RealTimePreview() = delete; + + /*! + * Copy constructor. This constructor is disabled because %RealTimePreview + * is not an instantiable class. + */ + RealTimePreview( const RealTimePreview& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %RealTimePreview is + * not an instantiable class. + */ + RealTimePreview& operator =( const RealTimePreview& ) = delete; + + /*! + * Destructor. This destructor is disabled because %RealTimePreview is not + * an instantiable class. + */ + ~RealTimePreview() = delete; + + /*! + * Sets the owner of the Real-Time Preview interface. + * + * \param owner Reference to a process interface that will own the + * Real-Time Preview interface in the PixInsight core + * application. + * + * The owner of the Real-Time Preview is the interface currently providing + * data for generation of real-time image renditions. Only one interface can + * own the Real-Time Preview at a given time. + * + * Calling this function causes the immediate regeneration of the real-time + * image rendition, in the terms described for the Update() member function. + */ + static bool SetOwner( ProcessInterface& owner ); + + /*! + * Generates a new Real-Time Preview image rendition. + * + * A new real-time preview image can always be generated if there is a view + * currently selected on the Real-Time Preview window, if the selected view + * is not read-locked, and if the Real-Time Preview is not already busy. + * When all of that conditions are met, calling this function causes the + * immediate regeneration of the real-time preview image. + */ + static void Update(); + + /*! + * Returns true iff the Real-Time Preview is currently busy, i.e. if there is + * an active real-time rendition process. + */ + static bool IsUpdating(); + + /*! + * Requests a modal progress dialog associated with the Real-Time Preview + * interface during a real-time preview generation process. + * + * \param title The title of the modal progress dialog. + * + * \param text The informative text shown on the progress dialog. Keep in + * mind that this string will be shown on a single text line, + * so a reasonable maximum length should be about 50-60 + * characters. + * + * \param total Total number of progress steps. The progress bar + * on the dialog can be incremented by successive calls to + * SetProgressCount() up to this value. If this parameter is + * zero, the progress dialog will be \e unbounded and will + * only show a busy state (typically, a progress bar + * bouncing horizontally at regular intervals). + * + * This function allows you to show a modal dialog with a horizontal + * progress bar, a single-line text label and a standard Cancel button + * during long real-time generation procedures. These dialogs are useful to + * provide feedback to the user and to allow her or him to abort the ongoing + * real-time rendition task. + * + * This member function can only be called during a real-time preview + * generation process, that is, when a reimplemented + * ProcessInterface::GenerateRealTimePreview() function is running. Calling + * this function when no real-time rendition is taking place has no effect. + * + * Unlike most PCL routines involving dynamic changes to graphical interface + * elements, this function is thread-safe. You can safely call it from a + * running thread, which is a typical use because real-time generation tasks + * are normally (and \e should normally be) implemented as parallel threads + * to keep the GUI responsive. However, for the progress dialog to work it + * is necessary that the application's main event queue be active with + * sufficient granularity. In general, if you follow good UI programming + * techniques and use PCL example modules as a starting point to write your + * code, there should be no practical problems. + * + * \note Be aware that the progress dialog shown by this function is + * application-modal. This means that the only user interaction allowed + * while the dialog is visible is closing it, either by clicking its Cancel + * button, by pressing the Esc key, or by clicking its Close title bar icon. + * An important consequence of this is that you \e must ensure that your + * real-time generation process will end immediately and unconditionally + * when the dialog is closed. If your code is coherent with the GUI states + * of your process interface, the default PCL implementation should work. In + * some complex scenarios you may need to reimplement the + * ProcessInterface::CancelRealTimePreview() member function. + */ + static void ShowProgressDialog( const String& title, const String& text, size_type total ); + + /*! + * Requests closing a progress dialog previously shown by a call to + * ShowProgressDialog(). + */ + static void CloseProgressDialog(); + + /*! + * Returns true iff a modal progress dialog is currently visible after a call + * to ShowProgressDialog(). + */ + static bool IsProgressDialogVisible(); + + /*! + * Sets the current value of the modal progress dialog associated with the + * Real-Time Preview interface to the specified \a count. + * + * If the progress dialog is bounded, i.e. if you specified a nonzero total + * count when you called ShowProgressDialog(), then the \a count value set + * by this function should never be greater than the dialog's total count. + * If the dialog is unbounded, then you just have to increment the count to + * animate the dialog's busy state. + * + * If a progress dialog is not visible after a successful call to + * ShowProgressDialog(), this function is simply ignored. + */ + static void SetProgressCount( size_type count ); + + /*! + * Sets the current single-line label's \a text shown on the modal progress + * dialog associated with the Real-Time Preview interface. + * + * If a progress dialog is not visible after a successful call to + * ShowProgressDialog(), this function is simply ignored. + */ + static void SetProgressText( const String& text ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_RealTimePreview_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RealTimePreview.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RealTimeProgressStatus.h b/3rdparty/include/pcl/RealTimeProgressStatus.h new file mode 100644 index 0000000..e183788 --- /dev/null +++ b/3rdparty/include/pcl/RealTimeProgressStatus.h @@ -0,0 +1,188 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RealTimeProgressStatus.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RealTimeProgressStatus_h +#define __PCL_RealTimeProgressStatus_h + +/// \file pcl/RealTimeProgressStatus.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class RealTimeProgressStatus + * \brief A status monitoring callback to provide progress feedback during long + * real-time preview generation procedures. + * + * %RealTimeProgressStatus allows you to drive the Real-Time Preview progress + * dialog during long real-time preview generation tasks. Using this class is + * recommended for real-time renditions consistently taking more than a couple + * of seconds to complete on contemporary hardware. + * + * For detailed information on the Real-Time Preview system and its associated + * modal progress dialog functionality, please refer to the RealTimePreview + * class and the RealTimePreview::ShowProgressDialog() static member function. + * + * \sa RealTimePreview, StatusCallback, StatusMonitor, MuteStatus + */ +class PCL_CLASS RealTimeProgressStatus : public MuteStatus +{ +public: + + /*! + * Constructs a %RealTimeProgressStatus instance. + * + * \param title The text that will be shown as the tile of the Real-Time + * Preview progress dialog window. Typically this text will + * be shown centered on the dialog's title bar. + */ + RealTimeProgressStatus( const String& title ) + : m_title( title ) + { + } + + /*! + * Copy constructor. + */ + RealTimeProgressStatus( const RealTimeProgressStatus& x ) + : MuteStatus( x ) + , m_title( x.m_title ) + { + } + + /*! + * This function is called by a status \a monitor object when a new + * monitored process is about to start. + * + * As reimplemented in %RealTimeProgressStatus, this function opens the + * Real-Time Preview progress dialog window and initializes it with the + * monitor's total count and information text. + */ + int Initialized( const StatusMonitor& monitor ) const override + { + if ( MuteStatus::Initialized( monitor ) == 0 ) + { + RealTimePreview::ShowProgressDialog( m_title, monitor.Info(), monitor.Total() ); + return 0; + } + return 1; + } + + /*! + * Function called by a status \a monitor object to signal an update of the + * progress count for the current process. + * + * As reimplemented in %RealTimeProgressStatus, this function updates the + * Real-Time Preview progress dialog with the current monitor's count. + */ + int Updated( const StatusMonitor& monitor ) const override + { + if ( MuteStatus::Updated( monitor ) == 0 ) + { + RealTimePreview::SetProgressCount( monitor.Count() ); + return 0; + } + return 1; + } + + /*! + * Function called by a status \a monitor object to signal that the current + * process has finished. + * + * As reimplemented in %RealTimeProgressStatus, this function closes the + * Real-Time Preview progress dialog window. + */ + int Completed( const StatusMonitor& monitor ) const override + { + if ( MuteStatus::Completed( monitor ) == 0 ) + { + RealTimePreview::CloseProgressDialog(); + return 0; + } + return 1; + } + + /*! + * Function called by a status \a monitor object when the progress + * information for the current process has been changed. + * + * As reimplemented in %RealTimeProgressStatus, this function updates the + * single-line label text on the Real-Time Preview progress dialog. + */ + void InfoUpdated( const StatusMonitor& monitor ) const override + { + RealTimePreview::SetProgressText( monitor.Info() ); + } + +private: + + String m_title; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_RealTimeProgressStatus_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RealTimeProgressStatus.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Rectangle.h b/3rdparty/include/pcl/Rectangle.h new file mode 100644 index 0000000..1662402 --- /dev/null +++ b/3rdparty/include/pcl/Rectangle.h @@ -0,0 +1,3024 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Rectangle.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Rectangle_h +#define __PCL_Rectangle_h + +/// \file pcl/Rectangle.h + +#include + +#include +#include +#include +#include + +#ifdef __PCL_QT_INTERFACE +# include +# ifndef __PCL_QT_NO_RECT_DRAWING_HELPERS +# include +# include +# endif +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::Clip + * \brief %Clip codes used by the Sutherland-Cohen line clipping algorithm. + * + * Sutherland-Cohen clip codes: + * + * + * + * + * + * + *
Clip::Left Clipping occurs at the left side of the clipping rectangle
Clip::Top Clipping occurs at the top side of the clipping rectangle
Clip::Right Clipping occurs at the right side of the clipping rectangle
Clip::Bottom Clipping occurs at the bottom side of the clipping rectangle
+ */ +namespace Clip +{ + enum mask_type + { + Left = 0x01, // Clipped at the left side + Top = 0x02, // Clipped at the top side + Right = 0x04, // Clipped at the right side + Bottom = 0x08 // Clipped at the bottom side + }; +} + +/*! + * A collection of Sutherland-Cohen clip code flags. + */ +typedef Flags ClipFlags; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup rect_classification_2d Rectangle Classification Functions + */ + +/*! + * Returns true iff a set of rectangle coordinates correspond to a point. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a point if and only if + * \a x0 = \a x1 and \a y0 = \a y1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsPoint( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 == x1 && y0 == y1; +} + +/*! + * Returns true iff a set of rectangle coordinates define a line. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a line if any of two conditions hold: + * \a x0 = \a x1 or \a y0 = \a y1, but not both conditions, that is, if + * the coordinates don't define a point. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsLine( T x0, T y0, T x1, T y1 ) noexcept +{ + return ((x0 == x1) ^ (y0 == y1)) != 0; +} + +/*! + * Returns true iff a set of rectangle coordinates define a horizontal line. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a horizontal line if and only if + * \a y0 = \a y1 and \a x0 != \a x1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsHorizontalLine( T x0, T y0, T x1, T y1 ) noexcept +{ + return y0 == y1 && x0 != x1; +} + +/*! + * Returns true iff a set of rectangle coordinates define a vertical line. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a vertical line if and only if + * \a x0 = \a x1 and \a y0 != \a y1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsVerticalLine( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 == x1 && y0 != y1; +} + +/*! + * Returns true iff a set of rectangle coordinates define a point or a line. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a point or line if either + * \a x0 = \a x1 or \a y0 = \a y1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsPointOrLine( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 == x1 || y0 == y1; +} + +/*! + * Returns true iff a set of rectangle coordinates define a rectangle. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * The specified coordinates define a rectangle if and only if + * \a x0 != \a x1 and \a y0 != \a y1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsRect( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 != x1 && y0 != y1; +} + +/*! + * Returns true iff a set of rectangle coordinates define a normal rectangle. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * A normal rectangle requires that \a x0 < \a x1 and \a y0 < \a y1. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsNormalRect( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 < x1 && y0 < y1; +} + +/*! + * Returns true iff a set of rectangle coordinates define an ordered rectangle. + * + * \param x0,y0 Upper left corner coordinates. + * \param x1,y1 Lower right corner coordinates. + * + * An ordered rectangle requires that \a x0 <= \a x1 and \a y0 <= \a y1, that + * is, it can be a normal rectangle, a line, or a point. + * + * \ingroup rect_classification_2d + */ +template inline +bool IsOrderedRect( T x0, T y0, T x1, T y1 ) noexcept +{ + return x0 <= x1 && y0 <= y1; +} + +/*! + * Orders a set of rectangle coordinates to define an ordered rectangle. + * + * \param[out] x0,y0 References to the upper left corner coordinates. + * \param[out] x1,y1 References to the lower right corner coordinates. + * + * This function ensures that \a x0 <= \a x1 and \a y0 <= \a y1, by exchanging + * coordinates if necessary. + * + * \ingroup rect_classification_2d + */ +template inline +void OrderRect( T& x0, T& y0, T& x1, T& y1 ) noexcept +{ + if ( x1 < x0 ) + pcl::Swap( x0, x1 ); + if ( y1 < y0 ) + pcl::Swap( y0, y1 ); +} + +// ---------------------------------------------------------------------------- + +/* + * ### NB: Template class GenericRectangle cannot have virtual member + * functions. This is because internal PCL and core routines rely on + * GenericRectangle, GenericRectangle and + * GenericRectangle to be directly castable to int*, float* and + * double*, respectively. See also the PCL_ASSERT_RECT_SIZE() macro. + */ + +#define PCL_ASSERT_RECT_SIZE() \ + static_assert( sizeof( *this ) == 4*sizeof( T ), "Invalid sizeof( GenericRectangle<> )" ) + +/*! + * \class GenericRectangle + * \brief A generic rectangle in the two-dimensional space. + * + * %GenericRectangle implements a rectangle in the plane, specified by the \a x + * and \a y coordinates of two of its corners. The type T represents scalar + * rectangle coordinates and can be any real or integer numerical type. + * + * The coordinates of %GenericRectangle are directly accessed by its x0, y0, x1 + * and y1 data members. If the rectangle is \e ordered, x0 and y0 are the + * coordinates of its upper left corner, and x1, y1 are the coordinates of its + * lower right corner. Given a %GenericRectangle instance \a r, you can use + * \a r.x0, \a r.y0, \a r.x1 and \a r.y1 directly to get or set coordinate + * values. + * + * \b Important - In PCL, the right and bottom coordinates of a rectangle (that + * is, the values of its x1 and y1 members) are \e excluded from the + * corresponding rectangular area. The following holds for any rectangle \a r + * in PCL: + * + * \a r.Width() = \a r.x1 - \a r.x0 \n + * \a r.Height() = \a r.y1 - \a r.y0 + * + * This is particularly relevant with template instantiations for integer + * types, as GenericRectangle\. + * + * \sa \ref rect_types_2d "2-D Rectangle Types", + * \ref rect_functions_2d "2-D Rectangle Operators and Functions", + * \ref rect_classification_2d "2-D Rectangle Classification Functions", + * GenericPoint + */ +template +class PCL_CLASS GenericRectangle +{ +public: + + /*! + * Represents the type of a point or rectangle component. + */ + typedef T component; + + /*! + * Represents a point on the plane. + */ + typedef GenericPoint point; + + /* + * Rectangle coordinates: x0=left, y0=top, x1=right, y1=bottom. + * The x1 (right) and y1 (bottom) coordinates are excluded from the + * rectangular area, so we always have: width=x1-x0 and height=y1-y0. + */ + component x0; //!< Horizontal coordinate of the upper left corner. + component y0; //!< Vertical coordinate of the upper left corner. + component x1; //!< Horizontal coordinate of the lower right corner. + component y1; //!< Vertical coordinate of the lower right corner. + + /*! + * Constructs a default %GenericRectangle instance. Rectangle coordinates + * are not initialized, so they'll have unpredictable garbage values. + */ + constexpr GenericRectangle() + { + PCL_ASSERT_RECT_SIZE(); + } + + /*! + * Constructs a %GenericRectangle instance given by its coordinates in the + * plane. + * + * \param left,top Coordinates of the upper left corner. + * \param right,bottom Coordinates of the lower right corner. + * + * The type T1 can be any suitable real or integer numerical type, or a + * type with numeric conversion semantics. + */ + template + constexpr GenericRectangle( T1 left, T1 top, T1 right, T1 bottom ) + : x0( component( left ) ) + , y0( component( top ) ) + , x1( component( right ) ) + , y1( component( bottom ) ) + { + PCL_ASSERT_RECT_SIZE(); + } + + /*! + * Constructs a %GenericRectangle instance from coordinates taken from the + * specified initializer list \a l. + * + * This constructor will copy 4, 3, 2, 1 or zero rectangle coordinates, + * depending on the number of values in the initializer list. Coordinates + * that cannot be initialized from list values will be set to zero. For + * example, the following code: + * + * \code + * Rect r1 = {}; + * Rect r2 = { 1, 2 }; + * Rect r3 = { 1, 2, 3 }; + * Rect r4 = { 1, 2, 3, 4 }; + * \endcode + * + * is functionally equivalent to: + * + * \code + * Rect r1( 0, 0, 0, 0 ); + * Rect r2( 1, 2, 0, 0 ); + * Rect r3( 1, 2, 3, 0 }; + * Rect r4( 1, 2, 3, 4 }; + * \endcode + */ + template + GenericRectangle( std::initializer_list l ) + { + PCL_ASSERT_RECT_SIZE(); + switch ( l.size() ) + { + default: + case 4: y1 = component( l.begin()[3] ); + case 3: x1 = component( l.begin()[2] ); + case 2: y0 = component( l.begin()[1] ); + case 1: x0 = component( l.begin()[0] ); + case 0: break; + } + switch ( l.size() ) + { + case 0: x0 = component( 0 ); + case 1: y0 = component( 0 ); + case 2: x1 = component( 0 ); + case 3: y1 = component( 0 ); + default: + case 4: break; + } + } + + /*! + * Constructs a %GenericRectangle instance given two points in the plane. + * + * \param leftTop Position of the upper left corner. + * \param rightBottom Position of the lower right corner. + * + * The type T1 can be any suitable real or integer numerical type, or a + * type with numeric conversion semantics. + */ + template + GenericRectangle( const pcl::GenericPoint& leftTop, const pcl::GenericPoint& rightBottom ) + : GenericRectangle( component( leftTop.x ), component( leftTop.y ), + component( rightBottom.x ), component( rightBottom.y ) ) + { + PCL_ASSERT_RECT_SIZE(); + } + + /*! + * Constructs a %GenericRectangle instance given its \a width and \a height. + * The coordinates of the constructed rectangle will be as follows: + * + * x0 = y0 = 0 \n + * x1 = width \n + * y1 = height + */ + constexpr GenericRectangle( component width, component height ) + : GenericRectangle( component( 0 ), component( 0 ), width, height ) + { + PCL_ASSERT_RECT_SIZE(); + } + + /*! + * Constructs a %GenericRectangle instance corresponding to a point located + * at the coordinates specified by a scalar \a d. + * + * The constructed rectangle will have all of its coordinates equal to the + * scalar \a d. + */ + constexpr GenericRectangle( component d ) + : GenericRectangle( d, d, d, d ) + { + PCL_ASSERT_RECT_SIZE(); + } + + /*! + * Nontrivial copy constructor. Constructs a %GenericRectangle instance as a + * copy of the specified rectangle \a r. + */ + template + GenericRectangle( const GenericRectangle& r ) + : GenericRectangle( component( r.x0 ), component( r.y0 ), + component( r.x1 ), component( r.y1 ) ) + { + PCL_ASSERT_RECT_SIZE(); + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle( const QRect& r ) + : GenericRectangle( component( r.left() ), component( r.top() ), + component( r.right()+1 ), component( r.bottom()+1 ) ) + { + PCL_ASSERT_RECT_SIZE(); + } + + GenericRectangle( const QPoint& p0, const QPoint& p1 ) + : GenericRectangle( component( p0.x() ), component( p0.y() ), + component( p1.x() ), component( p1.y() ) ) + { + PCL_ASSERT_RECT_SIZE(); + } +#endif + + /*! + * Returns the left coordinate of this rectangle. This function returns the + * value of the x0 data member. + */ + component Left() const noexcept + { + return x0; + } + + /*! + * Returns the top coordinate of this rectangle. This function returns the + * value of the y0 data member. + */ + component Top() const noexcept + { + return y0; + } + + /*! + * Returns the right coordinate of this rectangle. This function returns the + * value of the x1 data member. + */ + component Right() const noexcept + { + return x1; + } + + /*! + * Returns the bottom coordinate of this rectangle. This function returns + * the value of the y1 data member. + */ + component Bottom() const noexcept + { + return y1; + } + + /*! + * Returns a point with the coordinates of the upper left (left-top) corner + * of this rectangle. + */ + point LeftTop() const noexcept + { + return point( pcl::Min( x0, x1 ), pcl::Min( y0, y1 ) ); + } + + /*! + * A synonym for LeftTop(). + */ + point TopLeft() const noexcept + { + return LeftTop(); + } + + /*! + * Returns a point with the coordinates of the upper right (right-top) + * corner of this rectangle. + */ + point RightTop() const noexcept + { + return point( pcl::Max( x0, x1 ), pcl::Min( y0, y1 ) ); + } + + /*! + * A synonym for RightTop(). + */ + point TopRight() const noexcept + { + return RightTop(); + } + + /*! + * Returns a point with the coordinates of the lower left (left-bottom) + * corner of this rectangle. + */ + point LeftBottom() const noexcept + { + return point( pcl::Min( x0, x1 ), pcl::Max( y0, y1 ) ); + } + + /*! + * A synonym for LeftBottom(). + */ + point BottomLeft() const noexcept + { + return LeftBottom(); + } + + /*! + * Returns a point with the coordinates of the lower right (right-bottom) + * corner of this rectangle. + */ + point RightBottom() const noexcept + { + return point( pcl::Max( x0, x1 ), pcl::Max( y0, y1 ) ); + } + + /*! + * A synonym for RightBottom(). + */ + point BottomRight() const noexcept + { + return RightBottom(); + } + + /*! + * Returns a point with the coordinates of the center of this rectangle. + */ + point Center() const noexcept + { + return point( (x0 + x1)/2, (y0 + y1)/2 ); + } + + /*! + * Returns the upper middle (center-top) point of this rectangle. + */ + point CenterTop() const noexcept + { + return point( (x0 + x1)/2, pcl::Min( y0, y1 ) ); + } + + /*! + * Returns the lower middle (center-bottom) point of this rectangle. + */ + point CenterBottom() const noexcept + { + return point( (x0 + x1)/2, pcl::Min( y0, y1 ) ); + } + + /*! + * Returns the left middle (center-left) point of this rectangle. + */ + point CenterLeft() const noexcept + { + return point( pcl::Min( x0, x1 ), (y0 + y1)/2 ); + } + + /*! + * Returns the right middle (center-right) point of this rectangle. + */ + point CenterRight() const noexcept + { + return point( pcl::Min( x0, x1 ), (y0 + y1)/2 ); + } + + /*! + * Returns the width of this rectangle. The returned value is the absolute + * difference between the x1 and x0 data members. + */ + component Width() const noexcept + { + return pcl::Abs( x1 - x0 ); + } + + /*! + * Returns the height of this rectangle. The returned value is the absolute + * difference between the y1 and y0 data members. + */ + component Height() const noexcept + { + return pcl::Abs( y1 - y0 ); + } + + /*! + * Returns the perimeter of this rectangle. The returned value is equal to + * twice the width plus twice the height. + */ + component Perimeter() const noexcept + { + component w = Width(), h = Height(); + return w+w+h+h; + } + + /*! + * Returns the Manhattan distance between two opposite corners of this + * rectangle. + * + * The returned value is equal to the width plus the height. + */ + component ManhattanDistance() const noexcept + { + return Width() + Height(); + } + + /*! + * Returns the area of this rectangle. The returned value is equal to the + * width multiplied by the height. + */ + component Area() const noexcept + { + return pcl::Abs( (x1 - x0)*(y1 - y0) ); + } + + /*! + * Returns the x coordinate of the central point of this rectangle. The + * returned value is a \c double real value equal to 0.5*(x0 + x1). + */ + double CenterX() const noexcept + { + return 0.5*(x0 + x1); + } + + /*! + * Returns the y coordinate of the central point of this rectangle. The + * returned value is a \c double real value equal to 0.5*(y0 + y1). + */ + double CenterY() const noexcept + { + return 0.5*(y0 + y1); + } + + /*! + * Returns the square of the diagonal of this rectangle. This is also the + * square of the hypotenuse of the half-triangle defined by this rectangle. + * The returned value is equal to the square of the width multiplied by the + * square of the height. + */ + double Hypot() const noexcept + { + double w = x1 - x0, h = y1 - y0; + return w*w + h*h; + } + + /*! + * Returns the length of the diagonal of this rectangle, equal to the square + * root of the Hypot() function. + */ + double Diagonal() const noexcept + { + return pcl::Sqrt( Hypot() ); + } + + /*! + * Returns true iff this rectangle defines a point in the plane. + */ + bool IsPoint() const noexcept + { + return pcl::IsPoint( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this rectangle defines a line. + */ + bool IsLine() const noexcept + { + return pcl::IsLine( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this rectangle defines a horizontal line. + */ + bool IsHorizontalLine() const noexcept + { + return pcl::IsHorizontalLine( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this rectangle defines a vertical line. + */ + bool IsVerticalLine() const noexcept + { + return pcl::IsVerticalLine( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this rectangle defines a point or a line. + */ + bool IsPointOrLine() const noexcept + { + return pcl::IsPointOrLine( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff the coordinates of this object define a rectangle, + * instead of a point or a line. + */ + bool IsRect() const noexcept + { + return pcl::IsRect( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this is a normal rectangle. + */ + bool IsNormal() const noexcept + { + return pcl::IsNormalRect( x0, y0, x1, y1 ); + } + + /*! + * Returns true iff this is an ordered rectangle. + */ + bool IsOrdered() const noexcept + { + return pcl::IsOrderedRect( x0, y0, x1, y1 ); + } + + /*! + * Orders the coordinates of this rectangle. + */ + void Order() noexcept + { + pcl::OrderRect( x0, y0, x1, y1 ); + } + + /*! + * Returns an ordered rectangle equivalent to this. + */ + GenericRectangle Ordered() const noexcept + { + GenericRectangle r = *this; + r.Order(); + return r; + } + + /*! + * Given the coordinates \a x and \a y of a point in the plane, this + * function returns a clip code for the Sutherland-Cohen line clipping + * algorithm. + * + * The returned value is a combination of flags defined in the Clip + * namespace. + */ + template + ClipFlags ClipCode( T1 x, T1 y ) const noexcept + { + ClipFlags clip; // defaults to zero + + if ( x0 <= x1 ) + { + if ( x < x0 ) clip |= Clip::Left; + if ( x > x1 ) clip |= Clip::Right; + } + else + { + if ( x < x1 ) clip |= Clip::Left; + if ( x > x0 ) clip |= Clip::Right; + } + + if ( y0 <= y1 ) + { + if ( y < y0 ) clip |= Clip::Top; + if ( y > y1 ) clip |= Clip::Bottom; + } + else + { + if ( y < y1 ) clip |= Clip::Top; + if ( y > y0 ) clip |= Clip::Bottom; + } + + return clip; + } + + /*! + * Given a point \a p in the plane, this function returns a clip code for + * the Sutherland-Cohen line clipping algorithm. + * + * The returned value is a combination of flags defined in the Clip + * namespace. + */ + template + ClipFlags ClipCode( const pcl::GenericPoint& p ) const noexcept + { + return ClipCode( p.x, p.y ); + } + + /*! + * Returns true iff this rectangle includes a point specified by its + * separate \a x and \a y coordinates. + */ + template + bool Includes( T1 x, T1 y ) const noexcept + { + return ((x0 < x1) ? (x >= x0 && x <= x1) : (x >= x1 && x <= x0)) && + ((y0 < y1) ? (y >= y0 && y <= y1) : (y >= y1 && y <= y0)); + } + + /*! + * Returns true iff this rectangle includes a point \a p. + */ + template + bool Includes( const pcl::GenericPoint& p ) const noexcept + { + return Includes( p.x, p.y ); + } + + /*! + * Returns true iff this rectangle completely includes a rectangle \a r. + */ + template + bool Includes( const GenericRectangle& r ) const noexcept + { + return Includes( r.x0, r.y0 ) && Includes( r.x1, r.y1 ); + } + +#ifdef __PCL_QT_INTERFACE + bool Includes( const QPoint& p ) const noexcept + { + return Includes( p.x(), p.y() ); + } + + bool Includes( const QRect& r ) const noexcept + { + return Includes( r.left(), r.top() ) && Includes( r.right()+1, r.bottom()+1 ); + } +#endif + + /*! + * Returns true iff this rectangle includes a point specified by its + * separate \a x and \a y coordinates. + * + * This function assumes an ordered rectangle, that is, it requires that the + * conditions x0 ≤ x1 and y0 ≤ y1 hold. Otherwise this function will + * return a wrong result. + */ + template + bool IncludesFast( T1 x, T1 y ) const noexcept + { + return x >= x0 && y >= y0 && x <= x1 && y <= y1; + } + + /*! + * Returns true iff this rectangle includes a point \a p. + * + * This function assumes an ordered rectangle, that is, it requires that the + * conditions x0 ≤ x1 and y0 ≤ y1 hold. Otherwise this function will + * return a wrong result. + */ + template + bool IncludesFast( const pcl::GenericPoint& p ) const noexcept + { + return IncludesFast( p.x, p.y ); + } + + /*! + * Returns true iff this rectangle intersects a rectangle specified by its + * individual coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle to test + * for intersection. + * + * \param right,bottom Lower right corner coordinates of a rectangle to test + * for intersection. + */ + template + bool Intersects( T1 left, T1 top, T1 right, T1 bottom ) const noexcept + { + OrderRect( left, top, right, bottom ); + return ((x0 < x1) ? (right >= x0 && left <= x1) : (right >= x1 && left <= x0)) && + ((y0 < y1) ? (bottom >= y0 && top <= y1) : (bottom >= y1 && top <= y0)); + } + + /*! + * Returns true iff this rectangle intersects a rectangle \a r. + */ + template + bool Intersects( const pcl::GenericRectangle& r ) const noexcept + { + return Intersects( r.x0, r.y0, r.x1, r.y1 ); + } + +#ifdef __PCL_QT_INTERFACE + bool Intersects( const QRect& r ) const noexcept + { + return Intersects( r.left(), r.top(), r.right()+1, r.bottom()+1 ); + } +#endif + + /*! + * Returns true iff this rectangle intersects a rectangle specified by its + * individual coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle to test + * for intersection. + * + * \param right,bottom Lower right corner coordinates of a rectangle to test + * for intersection. + * + * For a valid result, this function assumes the following conditions: + * + * \li The specified set \a left, \a top, \a right and \a bottom must define + * an ordered rectangle, that is, the conditions \a left ≤ \a right and + * \a top ≤ \a bottom must hold. + * + * \li This rectangle must be ordered, that is, the conditions x0 ≤ x1 + * and y0 ≤ y1 must hold. + */ + template + bool IntersectsFast( T1 left, T1 top, T1 right, T1 bottom ) const noexcept + { + return right >= x0 && left <= x1 && bottom >= y0 && top <= y1; + } + + /*! + * Returns true iff this rectangle intersects a rectangle \a r. + * + * To give a valid result, this function assumes that both this and the + * specified object \a r are ordered rectangles. + */ + template + bool IntersectsFast( const pcl::GenericRectangle& r ) const noexcept + { + return IntersectsFast( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Causes this rectangle to include a given rectangle \a r, by adjusting its + * coordinates as necessary. + */ + template + void Unite( const GenericRectangle& r ) noexcept + { + Unite( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Causes this rectangle to include a rectangle specified by its individual + * coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle that + * will be included by this rectangle. + * + * \param right,bottom Lower right corner coordinates of a rectangle that + * will be included by this rectangle. + */ + template + void Unite( T1 left, T1 top, T1 right, T1 bottom ) noexcept + { + if ( right < left ) + Swap( left, right ); + if ( bottom < top ) + Swap( top, bottom ); + + if ( x0 <= x1 ) + { + x0 = pcl::Min( x0, component( left ) ); + x1 = pcl::Max( x1, component( right ) ); + } + else + { + x0 = pcl::Max( x0, component( right ) ); + x1 = pcl::Min( x1, component( left ) ); + } + + if ( y0 <= y1 ) + { + y0 = pcl::Min( y0, component( top ) ); + y1 = pcl::Max( y1, component( bottom ) ); + } + else + { + y0 = pcl::Max( y0, component( bottom ) ); + y1 = pcl::Min( y1, component( top ) ); + } + } + + /*! + * Causes this rectangle to include a given rectangle \a r, by adjusting its + * coordinates as necessary. + * + * To produce a valid result, this function assumes that both this and the + * specified object \a r are ordered rectangles. + */ + template + void UniteFast( const GenericRectangle& r ) noexcept + { + UniteFast( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Causes this rectangle to include a rectangle specified by its individual + * coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle that + * will be included by this rectangle. + * + * \param right,bottom Lower right corner coordinates of a rectangle that + * will be included by this rectangle. + * + * For a valid result, this function assumes the following conditions: + * + * \li The specified set \a left, \a top, \a right and \a bottom must define + * an ordered rectangle, that is, the conditions \a left ≤ \a right and + * \a top ≤ \a bottom must hold. + * + * \li This rectangle must be ordered, that is, the conditions x0 ≤ x1 + * and y0 ≤ y1 must hold. + */ + template + void UniteFast( T1 left, T1 top, T1 right, T1 bottom ) noexcept + { + x0 = pcl::Min( x0, component( left ) ); + y0 = pcl::Min( y0, component( top ) ); + x1 = pcl::Max( x1, component( right ) ); + y1 = pcl::Max( y1, component( bottom ) ); + } + + /*! + * Returns a rectangle that includes this one and another rectangle \a r. + */ + template + GenericRectangle Union( const GenericRectangle& r ) const noexcept + { + GenericRectangle r1 = *this; + r1.Unite( r ); + return r1; + } + + /*! + * Returns a rectangle that includes this one and another rectangle \a r. + * + * To give a valid result, this function assumes that both this and the + * specified object \a r are ordered rectangles. + */ + template + GenericRectangle UnionFast( const GenericRectangle& r ) const noexcept + { + GenericRectangle r1 = *this; + r1.UniteFast( r ); + return r1; + } + + /*! + * Causes this rectangle to include a given rectangle \a r, by adjusting + * coordinates as necessary. Returns a reference to this rectangle. + */ + template + GenericRectangle& operator |=( const GenericRectangle& r ) noexcept + { + Unite( r ); + return *this; + } + +#ifdef __PCL_QT_INTERFACE + void Unite( const QRect& r ) + { + Unite( r.left(), r.top(), r.right()+1, r.bottom()+1 ); + } + + GenericRectangle Union( const QRect& r ) const noexcept + { + GenericRectangle r1 = *this; + r1.Unite( r ); + return r1; + } + + GenericRectangle& operator |=( const QRect& r ) noexcept + { + Unite( r ); + return *this; + } +#endif + + /*! + * Causes this rectangle to be equal to its intersection with a given + * rectangle \a r. + * + * Returns true iff the resulting intersection is a nonempty rectangle, i.e. + * iff this->x0 != this->x1 and this->y0 != this->y1 after calling this + * function. + */ + template + bool Intersect( const GenericRectangle& r ) noexcept + { + return Intersect( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Causes this rectangle to be equal to its intersection with a rectangle + * specified by its individual coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle that + * will intersect this rectangle. + * + * \param right,bottom Lower right corner coordinates of a rectangle that will + * intersect this rectangle. + * + * Returns true iff the resulting intersection is a nonempty rectangle, i.e. + * iff this->x0 != this->x1 and this->y0 != this->y1 after calling this + * function. + */ + template + bool Intersect( T1 left, T1 top, T1 right, T1 bottom ) noexcept + { + if ( right < left ) + Swap( left, right ); + if ( bottom < top ) + Swap( top, bottom ); + + if ( x0 <= x1 ) + { + x0 = pcl::Max( x0, component( left ) ); + x1 = pcl::Min( x1, component( right ) ); + } + else + { + x0 = pcl::Min( x0, component( right ) ); + x1 = pcl::Max( x1, component( left ) ); + } + + if ( y0 <= y1 ) + { + y0 = pcl::Max( y0, component( top ) ); + y1 = pcl::Min( y1, component( bottom ) ); + } + else + { + y0 = pcl::Min( y0, component( bottom ) ); + y1 = pcl::Max( y1, component( top ) ); + } + + return IsRect(); + } + + /*! + * Causes this rectangle to be equal to its intersection with a given + * rectangle \a r. + * + * Returns true iff the resulting intersection is a nonempty rectangle, i.e. + * iff this->x0 != this->x1 and this->y0 != this->y1 after calling this + * function. + * + * To produce a valid result, this function assumes that both this and the + * specified object \a r are ordered rectangles. + */ + template + bool IntersectFast( const GenericRectangle& r ) noexcept + { + return IntersectFast( r.x0, r.y0, r.x1, r.y1 ); + } + + /*! + * Causes this rectangle to be equal to its intersection with a rectangle + * specified by its individual coordinates. + * + * \param left,top Upper left corner coordinates of a rectangle that + * will intersect this rectangle. + * + * \param right,bottom Lower right corner coordinates of a rectangle that will + * intersect this rectangle. + * + * Returns true iff the resulting intersection is a nonempty rectangle, i.e. + * iff this->x0 != this->x1 and this->y0 != this->y1 after calling this + * function. + * + * For a valid result, this function assumes the following conditions: + * + * \li The specified set \a left, \a top, \a right and \a bottom must define + * an ordered rectangle, that is, the conditions \a left ≤ \a right and + * \a top ≤ \a bottom must hold. + * + * \li This rectangle must be ordered, that is, the conditions x0 ≤ x1 + * and y0 ≤ y1 must hold. + */ + template + bool IntersectFast( T1 left, T1 top, T1 right, T1 bottom ) noexcept + { + x0 = pcl::Max( x0, component( left ) ); + y0 = pcl::Max( y0, component( top ) ); + x1 = pcl::Min( x1, component( right ) ); + y1 = pcl::Min( y1, component( bottom ) ); + return IsRect(); + } + + /*! + * Returns a rectangle equal to the intersection of this rectangle and + * another rectangle \a r. + */ + template + GenericRectangle Intersection( const GenericRectangle& r ) const noexcept + { + GenericRectangle r1 = *this; + (void)r1.Intersect( r ); + return r1; + } + + /*! + * Returns a rectangle equal to the intersection of this rectangle and + * another rectangle \a r. + * + * To give a valid result, this function assumes that both this and the + * specified object \a r are ordered rectangles. + */ + template + GenericRectangle IntersectionFast( const GenericRectangle& r ) const noexcept + { + GenericRectangle r1 = *this; + (void)r1.IntersectFast( r ); + return r1; + } + + /*! + * Causes this rectangle to be equal to its intersection with another + * rectangle \a r. Returns a reference to this rectangle. + */ + template + GenericRectangle& operator &=( const GenericRectangle& r ) noexcept + { + Intersect( r ); + return *this; + } + +#ifdef __PCL_QT_INTERFACE + bool Intersect( const QRect& r ) noexcept + { + return Intersect( r.left(), r.top(), r.right()+1, r.bottom()+1 ); + } + + GenericRectangle Intersection( const QRect& r ) const noexcept + { + GenericRectangle r1 = *this; + (void)r1.Intersect( r ); + return r1; + } + + GenericRectangle& operator &=( const QRect& r ) noexcept + { + Intersect( r ); + return *this; + } +#endif + + /*! + * Sets the four coordinates of this rectangle to the specified values. + * + * \param left,top New upper left corner coordinates. + * \param right,bottom New lower right corner coordinates. + */ + template + void Set( T1 left, T1 top, T1 right, T1 bottom ) noexcept + { + x0 = component( left ); + y0 = component( top ); + x1 = component( right ); + y1 = component( bottom ); + } + + /*! + * Moves this rectangle to the specified location, by setting its upper left + * corner coordinates to those of a given point \a p. + * + * The coordinates of the lower right corner of this rectangle are + * readjusted to keep its width and height unmodified. + */ + template + void MoveTo( const pcl::GenericPoint& p ) noexcept + { + MoveTo( p.x, p.y ); + } + + /*! + * Moves this rectangle to the specified location, by setting its upper left + * corner coordinates equal to the given \a x and \a y coordinates. + * + * The coordinates of the lower right corner of this rectangle are + * readjusted to keep its width and height unmodified. + */ + template + void MoveTo( T1 x, T1 y ) noexcept + { + component dx = x1 - x0, dy = y1 - y0; + x0 = component( x ); + y0 = component( y ); + x1 = x0 + dx; + y1 = y0 + dy; + } + +#ifdef __PCL_QT_INTERFACE + void MoveTo( const QPoint& p ) noexcept + { + MoveTo( p.x(), p.y() ); + } +#endif + + /*! + * Returns a rectangle \a r equal to this rectangle moved to the specified + * location: + * + * \code GenericRectangle r( *this ); r.MoveTo( p ); \endcode + */ + template + GenericRectangle MovedTo( const pcl::GenericPoint& p ) const noexcept + { + GenericRectangle r( *this ); + r.MoveTo( p ); + return r; + } + + /*! + * Returns a rectangle \a r equal to this rectangle moved to the specified + * location: + * + * \code GenericRectangle r( *this ); r.MoveTo( x, y ); \endcode + */ + template + GenericRectangle MovedTo( T1 x, T1 y ) const noexcept + { + GenericRectangle r( *this ); + r.MoveTo( x, y ); + return r; + } + + /*! + * Moves this rectangle relative to its current position, by applying the + * coordinates of a point \a d as increments in the X and Y directions. + */ + template + void MoveBy( const pcl::GenericPoint& d ) noexcept + { + MoveBy( d.x, d.y ); + } + + /*! + * Moves this rectangle relative to its current position, by applying the + * specified \a dx and \a dy increments to its coordinates in the X and Y + * directions, respectively. + */ + template + void MoveBy( T1 dx, T1 dy ) noexcept + { + x0 += component( dx ); + y0 += component( dy ); + x1 += component( dx ); + y1 += component( dy ); + } + + /*! + * Moves this rectangle relative to its current position, by applying the + * specified \a dxy increment to its four coordinates in the X and Y + * directions. + * + * This function is functionally equivalent to: + * + * \code MoveBy( dxy, dxy ); \endcode + */ + template + void MoveBy( T1 dxy ) noexcept + { + x0 += component( dxy ); + y0 += component( dxy ); + x1 += component( dxy ); + y1 += component( dxy ); + } + +#ifdef __PCL_QT_INTERFACE + void MoveBy( const QPoint& p ) noexcept + { + MoveBy( p.x(), p.y() ); + } +#endif + + /*! + * Returns a rectangle \a r equal to this rectangle moved relative to its + * current position: + * + * \code GenericRectangle r( *this ); r.MoveBy( d ); \endcode + */ + template + GenericRectangle MovedBy( const pcl::GenericPoint& d ) const noexcept + { + GenericRectangle r( *this ); + r.MoveBy( d ); + return r; + } + + /*! + * Returns a rectangle \a r equal to this rectangle moved relative to its + * current position: + * + * \code GenericRectangle r( *this ); r.MoveBy( dx, dy ); \endcode + */ + template + GenericRectangle MovedBy( T1 dx, T1 dy ) const noexcept + { + GenericRectangle r( *this ); + r.MoveBy( dx, dy ); + return r; + } + + /*! + * Changes the size of this rectangle to the specified width \a w and height + * \a h, respectively. + * + * This function does not vary the current order of rectangle coordinates. + * If a coordinate of the upper left corner is less than or equal to its + * bottom right counterpart, the bottom right coordinate is modified. + * Inversely, if the bottom right coordinate is less than the upper left + * one, the upper left coordinate is modified. + */ + template + void ResizeTo( T1 w, T1 h ) noexcept + { + if ( x0 <= x1 ) + x1 = x0 + component( w ); + else + x0 = x1 + component( w ); + + if ( y0 <= y1 ) + y1 = y0 + component( h ); + else + y0 = y1 + component( h ); + } + + /*! + * Returns a rectangle \a r equal to this rectangle resized to the specified + * dimensions: + * + * \code GenericRectangle r( *this ); r.ResizeTo( w, h ); \endcode + */ + template + GenericRectangle ResizedTo( T1 w, T1 h ) const noexcept + { + GenericRectangle r( *this ); + r.ResizeTo( w, h ); + return r; + } + + /*! + * Changes the size of this rectangle relative to its current dimensions, by + * applying the specified \a dw and \a dh increments to its width and + * height, respectively. + * + * This function does not vary the current order of rectangle coordinates. + * If a coordinate of the upper left corner is less than or equal to its + * bottom right counterpart, the bottom right coordinate is modified. + * Inversely, if the bottom right coordinate is less than the upper left + * one, the upper left coordinate is modified. + */ + template + void ResizeBy( T1 dw, T1 dh ) noexcept + { + if ( x0 <= x1 ) + x1 += component( dw ); + else + x0 += component( dw ); + + if ( y0 <= y1 ) + y1 += component( dh ); + else + y0 += component( dh ); + } + + /*! + * Returns a rectangle \a r equal to this rectangle resized relative to its + * current dimensions: + * + * \code GenericRectangle r( *this ); r.ResizeBy( dw, dh ); \endcode + */ + template + GenericRectangle ResizedBy( T1 dw, T1 dh ) const noexcept + { + GenericRectangle r( *this ); + r.ResizeBy( dw, dh ); + return r; + } + + /*! + * Sets the width of this rectangle to the specified value \a w. + * + * This function does not vary the current order of horizontal rectangle + * coordinates. If the x0 rectangle coordinate is less than or equal to x1, + * the x1 coordinate is modified. Inversely, if the x1 coordinate is less + * than x0, then x0 is modified. + */ + template + void SetWidth( T1 w ) noexcept + { + if ( x0 <= x1 ) + x1 = x0 + component( w ); + else + x0 = x1 + component( w ); + } + + /*! + * Sets the height of this rectangle to the specified value \a h. + * + * This function does not vary the current order of vertical rectangle + * coordinates. If the y0 rectangle coordinate is less than or equal to y1, + * the y1 coordinate is modified. Inversely, if the y1 coordinate is less + * than y0, then y0 is modified. + */ + template + void SetHeight( T1 h ) noexcept + { + if ( y0 <= y1 ) + y1 = y0 + component( h ); + else + y0 = y1 + component( h ); + } + + /*! + * Inflates this rectangle by the specified \a dx and \a dy increments on + * the X and Y axes respectively. Subtracts \a dx and \a dy to the upper + * left corner, and adds them to the bottom right corner. + */ + template + void InflateBy( T1 dx, T1 dy ) noexcept + { + if ( x1 < x0 ) + dx = -dx; + if ( y1 < y0 ) + dy = -dy; + x0 -= dx; + y0 -= dy; + x1 += dx; + y1 += dy; + } + + /*! + * Inflates this rectangle by the specified \a d increment on both axes. + * Subtracts \a d to the upper left corner, and adds it to the bottom right + * corner. + */ + template + void InflateBy( T1 d ) noexcept + { + if ( x0 <= x1 ) + x0 -= d, x1 += d; + else + x0 += d, x1 -= d; + + if ( y0 <= y1 ) + y0 -= d, y1 += d; + else + y0 += d, y1 -= d; + } + + /*! + * Returns a rectangle equivalent to this rectangle inflated by the + * specified \a dx and \a dy increments. + */ + template + GenericRectangle InflatedBy( T1 dx, T1 dy ) const noexcept + { + GenericRectangle r( *this ); + r.InflateBy( dx, dy ); + return r; + } + + /*! + * Returns a rectangle equivalent to this rectangle inflated by the + * specified \a d increments on both axes. + */ + template + GenericRectangle InflatedBy( T1 d ) const noexcept + { + GenericRectangle r( *this ); + r.InflateBy( d ); + return r; + } + + /*! + * Shrinks this rectangle by the specified \a dx and \a dy increments on the + * X and Y axes respectively. Adds \a dx and \a dy to the upper left corner, + * and subtracts them to the bottom right corner. + */ + template + void DeflateBy( T1 dx, T1 dy ) noexcept + { + if ( x1 < x0 ) + dx = -dx; + if ( y1 < y0 ) + dy = -dy; + x0 += dx; + y0 += dy; + x1 -= dx; + y1 -= dy; + } + + /*! + * Shrinks this rectangle by the specified \a d increment on both axes. Adds + * \a d to the upper left corner, and subtracts it to the bottom right + * corner. + */ + template + void DeflateBy( T1 d ) noexcept + { + if ( x0 <= x1 ) + x0 += d, x1 -= d; + else + x0 -= d, x1 += d; + + if ( y0 <= y1 ) + y0 += d, y1 -= d; + else + y0 -= d, y1 += d; + } + + /*! + * Returns a rectangle equivalent to this rectangle shrunk by the specified + * \a dx and \a dy increments. + */ + template + GenericRectangle DeflatedBy( T1 dx, T1 dy ) const noexcept + { + GenericRectangle r( *this ); + r.DeflateBy( dx, dy ); + return r; + } + + /*! + * Returns a rectangle equivalent to this rectangle shrunk by the specified + * \a d increment on both axes. + */ + template + GenericRectangle DeflatedBy( T1 d ) const noexcept + { + GenericRectangle r( *this ); + r.DeflateBy( d ); + return r; + } + + /*! + * Returns a rectangle \a r equal to this rectangle resized horizontally to + * the specified width \a w: + * + * \code GenericRectangle r( *this ); r.SetWidth( w ); \endcode + */ + template + GenericRectangle WidthSetTo( T1 w ) const noexcept + { + GenericRectangle r( *this ); + r.SetWidth( w ); + return r; + } + + /*! + * Returns a rectangle \a r equal to this rectangle resized vertically to + * the specified height \a h: + * + * \code GenericRectangle r( *this ); r.SetHeight( h ); \endcode + */ + template + GenericRectangle HeightSetTo( T1 h ) const noexcept + { + GenericRectangle r( *this ); + r.SetHeight( h ); + return r; + } + + /*! + * Rotates this rectangle in the plane by the specified \a angle in radians, + * with respect to a center of rotation given by its coordinates \a xc and + * \a yc. + */ + template + void Rotate( T1 angle, T2 xc, T2 yc ) noexcept + { + T1 sa, ca; pcl::SinCos( angle, sa, ca ); + pcl::Rotate( x0, y0, sa, ca, xc, yc ); + pcl::Rotate( x1, y1, sa, ca, xc, yc ); + } + + /*! + * Rotates this rectangle in the plane by the specified \a angle in radians, + * with respect to the specified \a center of rotation. + */ + template + void Rotate( T1 angle, const GenericPoint& center ) noexcept + { + Rotate( angle, center.x, center.y ); + } + + /*! + * Rotates this rectangle in the plane by the specified angle, given by its + * sine and cosine, \a sa and \a ca respectively, with respect to a center + * of rotation given by its coordinates \a xc and \a yc. + */ + template + void Rotate( T1 sa, T1 ca, T2 xc, T2 yc ) noexcept + { + pcl::Rotate( x0, y0, sa, ca, xc, yc ); + pcl::Rotate( x1, y1, sa, ca, xc, yc ); + } + + /*! + * Rotates this rectangle in the plane by the specified angle, given by its + * sine and cosine, \a sa and \a ca respectively, with respect to the + * specified \a center of rotation. + */ + template + void Rotate( T1 sa, T1 ca, const GenericPoint& center ) noexcept + { + Rotate( sa, ca, center.x, center.y ); + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rotated in the plane by the specified \a angle in radians, with respect + * to a center of rotation given by its coordinates \a xc and \a yc. + */ + template + GenericRectangle Rotated( T1 angle, T2 xc, T2 yc ) const noexcept + { + GenericRectangle r( *this ); + r.Rotate( angle, xc, yc ); + return r; + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rotated in the plane by the specified \a angle in radians, with respect + * to the specified \a center of rotation. + */ + template + GenericRectangle Rotated( T1 angle, const GenericPoint& center ) const noexcept + { + GenericRectangle r( *this ); + r.Rotate( angle, center ); + return r; + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rotated in the plane by the specified angle given by its sine and cosine, + * \a sa and \a ca respectively, with respect to a center of rotation given + * by its coordinates \a xc and \a yc. + */ + template + GenericRectangle Rotated( T1 sa, T1 ca, T2 xc, T2 yc ) const noexcept + { + GenericRectangle r( *this ); + r.Rotate( sa, ca, xc, yc ); + return r; + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rotated in the plane by the specified angle given by its sine and cosine, + * \a sa and \a ca respectively, with respect to the specified \a center of + * rotation. + */ + template + GenericRectangle Rotated( T1 sa, T1 ca, const GenericPoint& center ) const noexcept + { + GenericRectangle r( *this ); + r.Rotate( sa, ca, center ); + return r; + } + + /*! + * Rounds the coordinates of this rectangle to their corresponding nearest + * integer coordinates. + */ + void Round() noexcept + { + x0 = component( pcl::Round( double( x0 ) ) ); + y0 = component( pcl::Round( double( y0 ) ) ); + x1 = component( pcl::Round( double( x1 ) ) ); + y1 = component( pcl::Round( double( y1 ) ) ); + } + + /*! + * Rounds the coordinates of this rectangle to \a n fractional digits + * (\a n >= 0). + */ + void Round( int n ) noexcept + { + PCL_PRECONDITION( n >= 0 ) + if ( n < 0 ) + n = 0; + x0 = component( pcl::Round( double( x0 ), n ) ); + y0 = component( pcl::Round( double( y0 ), n ) ); + x1 = component( pcl::Round( double( x1 ), n ) ); + y1 = component( pcl::Round( double( y1 ), n ) ); + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rounded to their nearest integers. + */ + GenericRectangle Rounded() const noexcept + { + return GenericRectangle( component( pcl::Round( double( x0 ) ) ), component( pcl::Round( double( y0 ) ) ), + component( pcl::Round( double( x1 ) ) ), component( pcl::Round( double( y1 ) ) ) ); + } + + /*! + * Returns a rectangle whose coordinates are the coordinates of this object + * rounded to \a n fractional digits (\a n >= 0). + */ + GenericRectangle Rounded( int n ) const noexcept + { + PCL_PRECONDITION( n >= 0 ) + return GenericRectangle( component( pcl::Round( double( x0 ), n ) ), component( pcl::Round( double( y0 ), n ) ), + component( pcl::Round( double( x1 ), n ) ), component( pcl::Round( double( y1 ), n ) ) ); + } + + /*! + * Returns a rectangle of integer template type whose coordinates are the + * coordinates of this object rounded to their nearest integers. + */ + GenericRectangle RoundedToInt() const noexcept + { + return GenericRectangle( pcl::RoundInt( double( x0 ) ), pcl::RoundInt( double( y0 ) ), + pcl::RoundInt( double( x1 ) ), pcl::RoundInt( double( y1 ) ) ); + } + + /*! + * Integer truncation of coordinates. Sets the coordinates x0, y0, x1, y1 of + * this rectangle to the nearest integer coordinates a, b, c, d such that + * a <= x0, b <= y0, c <= x1, d <= y1. + */ + void Truncate() noexcept + { + x0 = component( pcl::Trunc( double( x0 ) ) ); + y0 = component( pcl::Trunc( double( y0 ) ) ); + x1 = component( pcl::Trunc( double( x1 ) ) ); + y1 = component( pcl::Trunc( double( y1 ) ) ); + } + + /*! + * Integer truncation of coordinates. Returns a rectangle whose coordinates + * are the coordinates x0, y0, x1, y1 of this rectangle, truncated to their + * nearest integer coordinates a, b, c, d such that a <= x0, b <= y0, + * c <= x1, d <= y1. + */ + GenericRectangle Truncated() const noexcept + { + return GenericRectangle( component( pcl::Trunc( double( x0 ) ) ), component( pcl::Trunc( double( y0 ) ) ), + component( pcl::Trunc( double( x1 ) ) ), component( pcl::Trunc( double( y1 ) ) ) ); + } + + /*! + * Integer truncation of coordinates. Returns a rectangle of integer + * template type whose coordinates are the coordinates x0, y0, x1, y1 of + * this rectangle truncated to the nearest integer coordinates a, b, c, d + * such that a <= x0, b <= y0, c <= x1, d <= y1. + */ + GenericRectangle TruncatedToInt() const noexcept + { + return GenericRectangle( pcl::TruncInt( double( x0 ) ), pcl::TruncInt( double( y0 ) ), + pcl::TruncInt( double( x1 ) ), pcl::TruncInt( double( y1 ) ) ); + } + + /*! + * Assigns a rectangle \a r to this rectangle. Returns a reference to this + * rectangle. + */ + template + GenericRectangle& operator =( const GenericRectangle& r ) noexcept + { + x0 = component( r.x0 ); + y0 = component( r.y0 ); + x1 = component( r.x1 ); + y1 = component( r.y1 ); + return *this; + } + + /*! + * Assigns a point \a p to this rectangle. Returns a reference to this + * rectangle. + * + * The \a p.x and \a p.y coordinates are assigned, respectively, to the + * horizontal and vertical coordinates of this rectangle. + */ + template + GenericRectangle& operator =( const pcl::GenericPoint& p ) noexcept + { + x0 = x1 = component( p.x ); + y0 = y1 = component( p.y ); + return *this; + } + + /*! + * Assigns a scalar \a d to this rectangle. Returns a reference to this + * rectangle. + * + * The scalar \a d is assigned to the four coordinates of this rectangle. + */ + GenericRectangle& operator =( component d ) noexcept + { + x0 = y0 = x1 = y1 = d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle& operator =( const QRect& r ) noexcept + { + x0 = component( r.left() ); + y0 = component( r.top() ); + x1 = component( r.right()+1 ); + y1 = component( r.bottom()+1 ); + return *this; + } +#endif + + /*! + * Adds a rectangle \a r to this rectangle. Returns a reference to this + * rectangle. + * + * This function adds homonym coordinates. Given two rectangles \a r1 and + * \a r2, the sum rectangle \a s = \a r1 + \a r2 is given by: + * + * \a s.x0 = \a r1.x0 + \a r2.x0 \n + * \a s.y0 = \a r1.y0 + \a r2.y0 \n + * \a s.x1 = \a r1.x1 + \a r2.x1 \n + * \a s.y1 = \a r1.y1 + \a r2.y1 + */ + template + GenericRectangle& operator +=( const GenericRectangle& r ) noexcept + { + x0 += component( r.x0 ); + y0 += component( r.y0 ); + x1 += component( r.x1 ); + y1 += component( r.y1 ); + return *this; + } + + /*! + * Adds a point \a p to this rectangle. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position. Given a rectangle \a r and a point \a p, the sum rectangle + * \a s = \a r + \a p is given by: + * + * \a s.x0 = \a r.x0 + \a p.x \n + * \a s.y0 = \a r.y0 + \a p.y \n + * \a s.x1 = \a r.x1 + \a p.x \n + * \a s.y1 = \a r.y1 + \a p.y + */ + template + GenericRectangle& operator +=( const pcl::GenericPoint& p ) noexcept + { + x0 += component( p.x ); + y0 += component( p.y ); + x1 += component( p.x ); + y1 += component( p.y ); + return *this; + } + + /*! + * Adds a scalar \a d to this rectangle. Returns a reference to this + * rectangle. + * + * This function adds the specified scalar to the four rectangle + * coordinates. This is equivalent to a translation relative to the current + * position. Given a rectangle \a r and a scalar \a d, the sum rectangle + * \a s = \a r + \a d is given by: + * + * \a s.x0 = \a r.x0 + \a d \n + * \a s.y0 = \a r.y0 + \a d \n + * \a s.x1 = \a r.x1 + \a d \n + * \a s.y1 = \a r.y1 + \a d + */ + GenericRectangle& operator +=( component d ) noexcept + { + x0 += d; + y0 += d; + x1 += d; + y1 += d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle& operator +=( const QPoint& p ) noexcept + { + component dx = component( p.x() ), dy = component( p.y() ); + x0 += dx; + y0 += dy; + x1 += dx; + y1 += dy; + return *this; + } +#endif + + /*! + * Subtracts a rectangle \a r from this rectangle. Returns a reference to + * this rectangle. + * + * This function subtracts homonym coordinates. Given two rectangles \a r1 + * and \a r2, the difference rectangle \a s = \a r1 - \a r2 is given by: + * + * \a s.x0 = \a r1.x0 - \a r2.x0 \n + * \a s.y0 = \a r1.y0 - \a r2.y0 \n + * \a s.x1 = \a r1.x1 - \a r2.x1 \n + * \a s.y1 = \a r1.y1 - \a r2.y1 + */ + template + GenericRectangle& operator -=( const GenericRectangle& r ) noexcept + { + x0 -= component( r.x0 ); + y0 -= component( r.y0 ); + x1 -= component( r.x1 ); + y1 -= component( r.y1 ); + return *this; + } + + /*! + * Subtracts a point \a p from this rectangle. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position. Given a rectangle \a r and a point \a p, the difference + * rectangle \a s = \a r - \a p is given by: + * + * \a s.x0 = \a r.x0 - \a p.x \n + * \a s.y0 = \a r.y0 - \a p.y \n + * \a s.x1 = \a r.x1 - \a p.x \n + * \a s.y1 = \a r.y1 - \a p.y + */ + template + GenericRectangle& operator -=( const pcl::GenericPoint& p ) noexcept + { + x0 -= component( p.x ); + y0 -= component( p.y ); + x1 -= component( p.x ); + y1 -= component( p.y ); + return *this; + } + + /*! + * Subtracts a scalar \a d from this rectangle. Returns a reference to this + * rectangle. + * + * This function subtracts the specified scalar from the four rectangle + * coordinates. This is equivalent to a translation relative to the current + * position. Given a rectangle \a r and a scalar \a d, the difference + * rectangle \a s = \a r - \a d is given by: + * + * \a s.x0 = \a r.x0 - \a d \n + * \a s.y0 = \a r.y0 - \a d \n + * \a s.x1 = \a r.x1 - \a d \n + * \a s.y1 = \a r.y1 - \a d + */ + GenericRectangle& operator -=( component d ) noexcept + { + x0 -= d; + y0 -= d; + x1 -= d; + y1 -= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle& operator -=( const QPoint& p ) noexcept + { + component dx = component( p.x() ), dy = component( p.y() ); + x0 -= dx; + y0 -= dy; + x1 -= dx; + y1 -= dy; + return *this; + } +#endif + + /*! + * Multiplies this rectangle by a rectangle \a r. Returns a reference to + * this rectangle. + * + * This function multiplies homonym coordinates. Given two rectangles \a r1 + * and \a r2, the product rectangle \a P = \a r1 * \a r2 is given by: + * + * \a P.x0 = \a r1.x0 * \a r2.x0 \n + * \a P.y0 = \a r1.y0 * \a r2.y0 \n + * \a P.x1 = \a r1.x1 * \a r2.x1 \n + * \a P.y1 = \a r1.y1 * \a r2.y1 + */ + template + GenericRectangle& operator *=( const GenericRectangle& r ) noexcept + { + x0 *= component( r.x0 ); + y0 *= component( r.y0 ); + x1 *= component( r.x1 ); + y1 *= component( r.y1 ); + return *this; + } + + /*! + * Multiplies this rectangle by a point \a p. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position, plus a scaling factor applied to both sides of the rectangle. + * Given a rectangle \a r and a point \a p, the product rectangle + * \a P = \a r * \a p is given by: + * + * \a P.x0 = \a r.x0 * \a p.x \n + * \a P.y0 = \a r.y0 * \a p.y \n + * \a P.x1 = \a r.x1 * \a p.x \n + * \a P.y1 = \a r.y1 * \a p.y + */ + template + GenericRectangle& operator *=( const pcl::GenericPoint& p ) noexcept + { + x0 *= component( p.x ); + y0 *= component( p.y ); + x1 *= component( p.x ); + y1 *= component( p.y ); + return *this; + } + + /*! + * Multiplies this rectangle by a scalar \a d. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position, plus a scaling factor applied to both sides of the rectangle. + * Given a rectangle \a r and a scalar \a d, the product rectangle + * \a P = \a r * \a d is given by: + * + * \a P.x0 = \a r.x0 * \a d \n + * \a P.y0 = \a r.y0 * \a d \n + * \a P.x1 = \a r.x1 * \a d \n + * \a P.y1 = \a r.y1 * \a d + */ + GenericRectangle& operator *=( component d ) noexcept + { + x0 *= d; + y0 *= d; + x1 *= d; + y1 *= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle& operator *=( const QPoint& p ) noexcept + { + component dx = component( p.x() ), dy = component( p.y() ); + x0 *= dx; y0 *= dy; x1 *= dx; y1 *= dy; + return *this; + } +#endif + + /*! + * Divides this rectangle by a rectangle \a r. Returns a reference to this + * rectangle. + * + * This function divides homonym coordinates. Given two rectangles \a r1 + * and \a r2, the quotient rectangle \a Q = \a r1 / \a r2 is given by: + * + * \a Q.x0 = \a r1.x0 / \a r2.x0 \n + * \a Q.y0 = \a r1.y0 / \a r2.y0 \n + * \a Q.x1 = \a r1.x1 / \a r2.x1 \n + * \a Q.y1 = \a r1.y1 / \a r2.y1 + */ + template + GenericRectangle& operator /=( const GenericRectangle& r ) noexcept + { + PCL_PRECONDITION( component( r.x0 ) != component( 0 ) && component( r.y0 ) != component( 0 ) && + component( r.x1 ) != component( 0 ) && component( r.y1 ) != component( 0 ) ) + x0 /= component( r.x0 ); + y0 /= component( r.y0 ); + x1 /= component( r.x1 ); + y1 /= component( r.y1 ); + return *this; + } + + /*! + * Divides this rectangle by a point \a p. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position, plus a scaling factor applied to both sides of the rectangle. + * Given a rectangle \a r and a point \a p, the quotient rectangle + * \a Q = \a r / \a p is given by: + * + * \a Q.x0 = \a r.x0 / \a p.x \n + * \a Q.y0 = \a r.y0 / \a p.y \n + * \a Q.x1 = \a r.x1 / \a p.x \n + * \a Q.y1 = \a r.y1 / \a p.y + */ + template + GenericRectangle& operator /=( const pcl::GenericPoint& p ) noexcept + { + PCL_PRECONDITION( component( p.x ) != component( 0 ) && component( p.y ) != component( 0 ) ) + x0 /= component( p.x ); + y0 /= component( p.y ); + x1 /= component( p.x ); + y1 /= component( p.y ); + return *this; + } + + /*! + * Divides this rectangle by a scalar \a d. Returns a reference to this + * rectangle. + * + * This function is equivalent to a translation relative to the current + * position, plus a scaling factor applied to both sides of the rectangle. + * Given a rectangle \a r and a scalar \a d, the quotient rectangle + * \a Q = \a r / \a d is given by: + * + * \a Q.x0 = \a r.x0 / \a d \n + * \a Q.y0 = \a r.y0 / \a d \n + * \a Q.x1 = \a r.x1 / \a d \n + * \a Q.y1 = \a r.y1 / \a d + */ + GenericRectangle& operator /=( component d ) noexcept + { + PCL_PRECONDITION( d != component( 0 ) ) + x0 /= d; y0 /= d; x1 /= d; y1 /= d; + return *this; + } + +#ifdef __PCL_QT_INTERFACE + GenericRectangle& operator /=( const QPoint& p ) noexcept + { + PCL_PRECONDITION( component( p.x() ) != component( 0 ) && component( p.y() ) != component( 0 ) ) + component dx = component( p.x() ), dy = component( p.y() ); + x0 /= dx; + y0 /= dy; + x1 /= dx; + y1 /= dy; + return *this; + } +#endif + + /*! + * Returns a copy of this rectangle. + */ + GenericRectangle operator +() const noexcept + { + return *this; + } + + /*! + * Returns a rectangle whose coordinates have the same magnitudes as the + * coordinates of this rectangle, but opposite signs. The returned rectangle + * so defined is symmetric to this rectangle with respect to the origin of + * coordinates. + */ + GenericRectangle operator -() const noexcept + { + return GenericRectangle( -x0, -y0, -x1, -y1 ); + } + +#ifdef __PCL_QT_INTERFACE + operator QRect() const noexcept + { + return QRect( int( x0 ), int( y0 ), int( x1-x0 ), int( y1-y0 ) ); + } +#endif + +#ifdef __PCL_QT_INTERFACE +# ifndef __PCL_QT_NO_RECT_DRAWING_HELPERS + + void Draw( QPainter& p, const QBrush* b ) const + { + int rx0, ry0, rx1, ry1; + + if ( x0 <= x1 ) + rx0 = x0, rx1 = x1; + else + rx0 = x1, rx1 = x0; + + if ( y0 <= y1 ) + ry0 = y0, ry1 = y1; + else + ry0 = y1, ry1 = y0; + + if ( rx1 - rx0 <= 1 ) + { + if ( ry1 - ry0 <= 1 ) + p.drawPoint( rx0, ry0 ); + else + p.drawLine( rx0, ry0, rx0, ry1-1 ); + } + else if ( ry1 - ry0 <= 1 ) + { + p.drawLine( rx0, ry0, rx1-1, ry0 ); + } + else + { +# if ( QT_VERSION >= 0x040000 ) + int w = rx1-rx0-1, h = ry1-ry0-1; +# else + int w = rx1-rx0, h = ry1-ry0; +# endif + if ( b != 0 ) + p.fillRect( rx0, ry0, w, h, *b ); + p.drawRect( rx0, ry0, w, h ); + } + } + + void Draw( QPainter& p ) const + { + Draw( p, 0 ); + } + + void Draw( QPainter& p, const QColor& c ) const + { + QBrush b( c ); + Draw( p, &b ); + } + +# endif // !__PCL_QT_NO_RECT_DRAWING_HELPERS +#endif // __PCL_QT_INTERFACE + +}; // GenericRectangle + +#undef PCL_ASSERT_RECT_SIZE + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup rect_functions_2d Rectangle Operators and Functions + */ + +/*! + * Returns true iff two rectangles \a r1 and \a r2 are equal. Two rectangles + * are equal if their homonym coordinates are equal. + * \ingroup rect_functions_2d + */ +template inline +bool operator ==( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + return r1.x0 == r2.x0 && r1.y0 == r2.y0 && r1.x1 == r2.x1 && r1.y1 == r2.y1; +} + +/*! + * Returns true iff a rectangle \a r1 is equal to a scalar \a d2. A rectangle + * is equal to a scalar \a d if the four coordinates of \a r are equal to \a d. + * \ingroup rect_functions_2d + */ +template inline +bool operator ==( const GenericRectangle& r1, T d2 ) noexcept +{ + return r1.x0 == d2 && r1.y0 == d2 && r1.x1 == d2 && r1.y1 == d2; +} + +/*! + * Returns true iff a scalar \a d1 is equal to a rectangle \a r2. A scalar \a d + * is equal to a rectangle \a r if the four coordinates of \a r are equal to + * \a d. + * \ingroup rect_functions_2d + */ +template inline +bool operator ==( T d1, const GenericRectangle& r2 ) noexcept +{ + return d1 == r2.x0 && d1 == r2.y0 && d1 == r2.x1 && d1 == r2.y1; +} + +/*! + * Returns true iff a rectangle \a r1 is less than another rectangle \a r2. + * For rectangle comparisons, vertical coordinates have precedence over + * horizontal coordinates. + * \ingroup rect_functions_2d + */ +template inline +bool operator <( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + T1 x01 = Min( r1.x0, r1.x1 ); T1 y01 = Min( r1.y0, r1.y1 ); + T1 x11 = Max( r1.x0, r1.x1 ); T1 y11 = Max( r1.y0, r1.y1 ); + T2 x02 = Min( r2.x0, r2.x1 ); T2 y02 = Min( r2.y0, r2.y1 ); + T2 x12 = Max( r2.x0, r2.x1 ); T2 y12 = Max( r2.y0, r2.y1 ); + if ( y01 != y02 ) + return y01 < y02; + if ( x01 != x02 ) + return x01 < x02; + if ( y11 != y12 ) + return y11 < y12; + return x11 < x12; +} + +/*! + * Adds two rectangles \a r1 and \a r2, and returns the resulting sum + * rectangle. + * + * Rectangle addition consists in adding homonym coordinates. Given two + * rectangles \a r1 and \a r2, the sum rectangle \a s = \a r1 + \a r2 is + * given by: + * + * \a s.x0 = \a r1.x0 + \a r2.x0 \n + * \a s.y0 = \a r1.y0 + \a r2.y0 \n + * \a s.x1 = \a r1.x1 + \a r2.x1 \n + * \a s.y1 = \a r1.y1 + \a r2.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator +( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 + r2.x0 ), T1( r1.y0 + r2.y0 ), + T1( r1.x1 + r2.x1 ), T1( r1.y1 + r2.y1 ) ); +} + +/*! + * Adds a rectangle \a r1 and a point \a p2, and returns the resulting sum + * rectangle. + * + * Given a rectangle \a r and a point \a p, the sum rectangle + * \a s = \a r + \a p is given by: + * + * \a s.x0 = \a r.x0 + \a p.x \n + * \a s.y0 = \a r.y0 + \a p.y \n + * \a s.x1 = \a r.x1 + \a p.x \n + * \a s.y1 = \a r.y1 + \a p.y + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator +( const GenericRectangle& r1, const GenericPoint& p2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 + p2.x ), T1( r1.y0 + p2.y ), + T1( r1.x1 + p2.x ), T1( r1.y1 + p2.y ) ); +} + +/*! + * Adds a point \a p1 and a rectangle \a r2, and returns the resulting sum + * rectangle. + * + * Rectangle addition is a commutative operation, thus see + * pcl::operator +( const GenericRectangle&, const GenericPoint& ). + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator +( const GenericPoint& p1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T2( p1.x + r2.x0 ), T2( p1.y + r2.y0 ), + T2( p1.x + r2.x1 ), T2( p1.y + r2.y1 ) ); +} + +/*! + * Adds a rectangle \a r1 and a scalar \a d2, and returns the resulting sum + * rectangle. + * + * Given a rectangle \a r and a scalar \a d, the sum rectangle + * \a s = \a r + \a d is given by: + * + * \a s.x0 = \a r.x0 + \a d \n + * \a s.y0 = \a r.y0 + \a d \n + * \a s.x1 = \a r.x1 + \a d \n + * \a s.y1 = \a r.y1 + \a d + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator +( const GenericRectangle& r1, T d2 ) noexcept +{ + return GenericRectangle( r1.x0+d2, r1.y0+d2, r1.x1+d2, r1.y1+d2 ); +} + +/*! + * Adds a scalar \a d1 and a rectangle \a r2, and returns the resulting sum + * rectangle. + * + * Rectangle addition is a commutative operation, thus see + * pcl::operator +( const GenericRectangle&, T ). + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator +( T d1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( d1+r2.x0, d1+r2.y0, d1+r2.x1, d1+r2.y1 ); +} + +/*! + * Subtracts two rectangles \a r1 and \a r2, and returns the resulting + * difference rectangle. + * + * Rectangle subtraction consists in subtracting homonym coordinates. Given + * two rectangles \a r1 and \a r2, the difference rectangle + * \a s = \a r1 - \a r2 is given by: + * + * \a s.x0 = \a r1.x0 - \a r2.x0 \n + * \a s.y0 = \a r1.y0 - \a r2.y0 \n + * \a s.x1 = \a r1.x1 - \a r2.x1 \n + * \a s.y1 = \a r1.y1 - \a r2.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator -( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 - r2.x0 ), T1( r1.y0 - r2.y0 ), + T1( r1.x1 - r2.x1 ), T1( r1.y1 - r2.y1 ) ); +} + +/*! + * Subtracts a point \a p2 from a rectangle \a r1, and returns the resulting + * difference rectangle. + * + * Given a rectangle \a r and a point \a p, the difference rectangle + * \a s = \a r - \a p is given by: + * + * \a s.x0 = \a r.x0 - \a p.x \n + * \a s.y0 = \a r.y0 - \a p.y \n + * \a s.x1 = \a r.x1 - \a p.x \n + * \a s.y1 = \a r.y1 - \a p.y + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator -( const GenericRectangle& r1, const GenericPoint& p2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 - p2.x ), T1( r1.y0 - p2.y ), + T1( r1.x1 - p2.x ), T1( r1.y1 - p2.y ) ); +} + +/*! + * Subtracts a rectangle \a r2 from a point \a p1, and returns the resulting + * difference rectangle. + * + * Given a rectangle \a r and a point \a p, the difference rectangle + * \a s = \a p - \a r is given by: + * + * \a s.x0 = \a p.x - \a r.x0 \n + * \a s.y0 = \a p.y - \a r.y0 \n + * \a s.x1 = \a p.x - \a r.x1 \n + * \a s.y1 = \a p.y - \a r.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator -( const GenericPoint& p1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T2( p1.x - r2.x0 ), T2( p1.y - r2.y0 ), + T2( p1.x - r2.x1 ), T2( p1.y - r2.y1 ) ); +} + +/*! + * Subtracts a scalar \a d2 from a rectangle \a r1, and returns the resulting + * difference rectangle. + * + * Given a rectangle \a r and a scalar \a d, the difference rectangle + * \a s = \a r - \a d is given by: + * + * \a s.x0 = \a r.x0 - \a d \n + * \a s.y0 = \a r.y0 - \a d \n + * \a s.x1 = \a r.x1 - \a d \n + * \a s.y1 = \a r.y1 - \a d + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator -( const GenericRectangle& r1, T d2 ) noexcept +{ + return GenericRectangle( r1.x0-d2, r1.y0-d2, r1.x1-d2, r1.y1-d2 ); +} + +/*! + * Subtracts a rectangle \a r2 from a scalar \a d1, and returns the resulting + * difference rectangle. + * + * Given a rectangle \a r and a scalar \a d, the difference rectangle + * \a s = \a d - \a r is given by: + * + * \a s.x0 = \a d - \a r.x0 \n + * \a s.y0 = \a d - \a r.y0 \n + * \a s.x1 = \a d - \a r.x1 \n + * \a s.y1 = \a d - \a r.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator -( T d1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( d1-r2.x0, d1-r2.y0, d1-r2.x1, d1-r2.y1 ); +} + +/*! + * Multiplies two rectangles \a r1 and \a r2, and returns the resulting + * product rectangle. + * + * Rectangle multiplication consists in multiplying homonym coordinates. Given + * two rectangles \a r1 and \a r2, the product rectangle \a P = \a r1 * \a r2 + * is given by: + * + * \a P.x0 = \a r1.x0 * \a r2.x0 \n + * \a P.y0 = \a r1.y0 * \a r2.y0 \n + * \a P.x1 = \a r1.x1 * \a r2.x1 \n + * \a P.y1 = \a r1.y1 * \a r2.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator *( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 * r2.x0 ), T1( r1.y0 * r2.y0 ), + T1( r1.x1 * r2.x1 ), T1( r1.y1 * r2.y1 ) ); +} + +/*! + * Multiplies a rectangle \a r1 by a point \a p2, and returns the resulting + * product rectangle. + * + * Given a rectangle \a r and a point \a p, the product rectangle + * \a P = \a r * \a p is given by: + * + * \a P.x0 = \a r1.x0 * \a p.x \n + * \a P.y0 = \a r1.y0 * \a p.y \n + * \a P.x1 = \a r1.x1 * \a p.x \n + * \a P.y1 = \a r1.y1 * \a p.y + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator *( const GenericRectangle& r1, const GenericPoint& p2 ) noexcept +{ + return GenericRectangle( T1( r1.x0 * p2.x ), T1( r1.y0 * p2.y ), + T1( r1.x1 * p2.x ), T1( r1.y1 * p2.y ) ); +} + +/*! + * Multiplies a point \a p1 by a rectangle \a r2, and returns the resulting + * product rectangle. + * + * Rectangle multiplication is a commutative operation, thus see + * pcl::operator *( const GenericRectangle&, const GenericPoint& ). + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator *( const GenericPoint& p1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( T2( p1.x * r2.x0 ), T2( p1.y * r2.y0 ), + T2( p1.x * r2.x1 ), T2( p1.y * r2.y1 ) ); +} + +/*! + * Multiplies a rectangle \a r1 by a scalar \a d2, and returns the resulting + * product rectangle. + * + * Given a rectangle \a r and a scalar \a d, the product rectangle + * \a P = \a r * \a d is given by: + * + * \a P.x0 = \a r1.x0 * \a d \n + * \a P.y0 = \a r1.y0 * \a d \n + * \a P.x1 = \a r1.x1 * \a d \n + * \a P.y1 = \a r1.y1 * \a d + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator *( const GenericRectangle& r1, T d2 ) noexcept +{ + return GenericRectangle( r1.x0*d2, r1.y0*d2, r1.x1*d2, r1.y1*d2 ); +} + +/*! + * Multiplies a scalar \a d1 by a rectangle \a r2, and returns the resulting + * product rectangle. + * + * Rectangle multiplication is a commutative operation, thus see + * pcl::operator *( const GenericRectangle&, T ). + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator *( T d1, const GenericRectangle& r2 ) noexcept +{ + return GenericRectangle( d1*r2.x0, d1*r2.y0, d1*r2.x1, d1*r2.y1 ); +} + +/*! + * Divides two rectangles \a r1 and \a r2, and returns the resulting quotient + * rectangle. + * + * Rectangle division consists in dividing homonym coordinates. Given two + * rectangles \a r1 and \a r2, the quotient rectangle + * \a Q = \a r1 / \a r2 is given by: + * + * \a Q.x0 = \a r1.x0 / \a r2.x0 \n + * \a Q.y0 = \a r1.y0 / \a r2.y0 \n + * \a Q.x1 = \a r1.x1 / \a r2.x1 \n + * \a Q.y1 = \a r1.y1 / \a r2.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator /( const GenericRectangle& r1, const GenericRectangle& r2 ) noexcept +{ + PCL_PRECONDITION( r2.x0 != T2( 0 ) && r2.y0 != T2( 0 ) && + r2.x1 != T2( 0 ) && r2.y1 != T2( 0 ) ) + return GenericRectangle( T1( r1.x0 / r2.x0 ), T1( r1.y0 / r2.y0 ), + T1( r1.x1 / r2.x1 ), T1( r1.y1 / r2.y1 ) ); +} + +/*! + * Divides a rectangle \a r1 by a point \a p2, and returns the resulting + * quotient rectangle. + * + * Given a rectangle \a r and a point \a p, the quotient rectangle + * \a Q = \a r / \a p is given by: + * + * \a Q.x0 = \a r.x0 / \a p.x \n + * \a Q.y0 = \a r.y0 / \a p.y \n + * \a Q.x1 = \a r.x1 / \a p.x \n + * \a Q.y1 = \a r.y1 / \a p.y + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator /( const GenericRectangle& r1, const GenericPoint& p2 ) noexcept +{ + PCL_PRECONDITION( p2.x != T2( 0 ) && p2.y != T2( 0 ) ) + return GenericRectangle( T1( r1.x0 / p2.x ), T1( r1.y0 / p2.y ), + T1( r1.x1 / p2.x ), T1( r1.y1 / p2.y ) ); +} + +/*! + * Divides a point \a p1 by a rectangle \a r2, and returns the resulting + * quotient rectangle. + * + * Given a rectangle \a r and a point \a p, the quotient rectangle + * \a Q = \a p / \a r is given by: + * + * \a Q.x0 = \a p.x / \a r.x0 \n + * \a Q.y0 = \a p.y / \a r.y0 \n + * \a Q.x1 = \a p.x / \a r.x1 \n + * \a Q.y1 = \a p.y / \a r.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator /( const GenericPoint& p1, const GenericRectangle& r2 ) noexcept +{ + PCL_PRECONDITION( r2.x0 != T2( 0 ) && r2.y0 != T2( 0 ) && + r2.x1 != T2( 0 ) && r2.y1 != T2( 0 ) ) + return GenericRectangle( T2( p1.x / r2.x0 ), T2( p1.y / r2.y0 ), + T2( p1.x / r2.x1 ), T2( p1.y / r2.y1 ) ); +} + +/*! + * Divides a rectangle \a r1 by a scalar \a d2, and returns the resulting + * quotient rectangle. + * + * Given a rectangle \a r and a scalar \a d, the quotient rectangle + * \a Q = \a r / \a d is given by: + * + * \a Q.x0 = \a r.x0 / \a d \n + * \a Q.y0 = \a r.y0 / \a d \n + * \a Q.x1 = \a r.x1 / \a d \n + * \a Q.y1 = \a r.y1 / \a d + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator /( const GenericRectangle& r1, T d2 ) noexcept +{ + PCL_PRECONDITION( d2 != T( 0 ) ) + return GenericRectangle( r1.x0/d2, r1.y0/d2, r1.x1/d2, r1.y1/d2 ); +} + +/*! + * Divides a scalar \a d1 by a rectangle \a r2, and returns the resulting + * quotient rectangle. + * + * Given a rectangle \a r and a scalar \a d, the quotient rectangle + * \a Q = \a d / \a r is given by: + * + * \a Q.x0 = \a d / \a r.x0 \n + * \a Q.y0 = \a d / \a r.y0 \n + * \a Q.x1 = \a d / \a r.x1 \n + * \a Q.y1 = \a d / \a r.y1 + * + * \ingroup rect_functions_2d + */ +template inline +GenericRectangle operator /( T d1, const GenericRectangle& r2 ) noexcept +{ + PCL_PRECONDITION( r2.x0 != T( 0 ) && r2.y0 != T( 0 ) && + r2.x1 != T( 0 ) && r2.y1 != T( 0 ) ) + return GenericRectangle( d1/r2.x0, d1/r2.y0, d1/r2.x1, d1/r2.y1 ); +} + +/*! + * Rotates a rectangle in the plane, given a rotation angle and the + * coordinates of a center of rotation. + * + * \param r Reference to a rectangle that will be rotated. + * \param a Rotation angle in radians. Positive angles are measured + * counter-clockwise. + * \param xc Abscissa (x coordinate) of the center of rotation. + * \param yc Ordinate (y coordinate) of the center of rotation. + * + * The coordinates \a r.x0, \a r.y0, \a r.x1 and \a r.y1 are replaced by their + * corresponding rotated values. + * + * \ingroup rect_functions_2d + */ +template inline +void Rotate( GenericRectangle& r, T1 a, T2 xc, T2 yc ) noexcept +{ + T1 sa, ca; pcl::SinCos( a, sa, ca ); + pcl::Rotate( r.x0, r.y0, sa, ca, xc, yc ); + pcl::Rotate( r.x1, r.y1, sa, ca, xc, yc ); +} + +/*! + * Rotates a rectangle in the plane, given a rotation angle and a rotation + * center point. + * + * \param r Reference to a rectangle that will be rotated. + * \param a Rotation angle in radians. Positive angles are measured + * counter-clockwise. + * \param c Reference to a point that will be taken as the center of + * rotation. + * + * The coordinates \a r.x0, \a r.y0, \a r.x1 and \a r.y1 are replaced by their + * corresponding rotated values. + * + * \ingroup rect_functions_2d + */ +template inline +void Rotate( GenericRectangle& r, T1 a, const GenericPoint& c ) noexcept +{ + pcl::Rotate( r, a, c.x, c.y ); +} + +/*! + * Rotates a rectangle in the plane, given a rotation angle by its sine and + * cosine, and the coordinates of a center of rotation. + * + * \param r Reference to a rectangle that will be rotated. + * \param sa Sine of the rotation angle. + * \param ca Cosine of the rotation angle. + * \param xc Abscissa (x coordinate) of the center of rotation. + * \param yc Ordinate (y coordinate) of the center of rotation. + * + * The coordinates \a r.x0, \a r.y0, \a r.x1 and \a r.y1 are replaced by their + * corresponding rotated values. + * + * \ingroup rect_functions_2d + */ +template inline +void Rotate( GenericRectangle& r, T1 sa, T1 ca, T2 xc, T2 yc ) noexcept +{ + pcl::Rotate( r.x0, r.y0, sa, ca, xc, yc ); + pcl::Rotate( r.x1, r.y1, sa, ca, xc, yc ); +} + +/*! + * Rotates a rectangle in the plane, given a rotation angle by its sine and + * cosine, and a rotation center point. + * + * \param r Reference to a rectangle that will be rotated. + * \param sa Sine of the rotation angle. + * \param ca Cosine of the rotation angle. + * \param c Reference to a point that will be taken as the center of + * rotation. + * + * The coordinates \a r.x0, \a r.y0, \a r.x1 and \a r.y1 are replaced by their + * corresponding rotated values. + * + * \ingroup rect_functions_2d + */ +template inline +void Rotate( GenericRectangle& r, T1 sa, T1 ca, const GenericPoint& c ) noexcept +{ + pcl::Rotate( r, sa, ca, c.x, c.y ); +} + +/*! + * Exchanges two rectangles \a r1 and \a r2. Calling this function is + * equivalent to: + * + * \code + * pcl::Swap( r1.x0, r2.x0 ); pcl::Swap( r1.y0, r2.y0 ); + * pcl::Swap( r1.x1, r2.x1 ); pcl::Swap( r1.y1, r2.y1 ); + * \endcode + * + * \ingroup rect_functions_2d + */ +template inline +void Swap( GenericRectangle& r1, GenericRectangle& r2 ) noexcept +{ + pcl::Swap( r1.x0, r2.x0 ); pcl::Swap( r1.y0, r2.y0 ); + pcl::Swap( r1.x1, r2.x1 ); pcl::Swap( r1.y1, r2.y1 ); +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_RECT_INSTANTIATE + +/*! + * \defgroup rect_types_2d Rectangle Types + */ + +/*! + * \class pcl::I32Rect + * \ingroup rect_types_2d + * \brief 32-bit integer rectangle on the plane. + * + * %I32Rect is a template instantiation of GenericRectangle for \c int32. + */ +typedef GenericRectangle I32Rect; + +/*! + * \class pcl::Rect + * \ingroup rect_types_2d + * \brief 32-bit integer rectangle on the plane. + * + * %Rect is an alias for I32Rect. It is a template instantiation of + * GenericRectangle for \c int32. + */ +typedef I32Rect Rect; + +/*! + * \class pcl::F32Rect + * \ingroup rect_types_2d + * \brief 32-bit floating-point rectangle in the R^2 space. + * + * %F32Rect is a template instantiation of GenericRectangle for \c float. + */ +typedef GenericRectangle F32Rect; + +/*! + * \class pcl::FRect + * \ingroup rect_types_2d + * \brief 32-bit floating-point rectangle in the R^2 space. + * + * %FRect is an alias for F32Rect. It is a template instantiation of + * GenericRectangle for \c float. + */ +typedef F32Rect FRect; + +/*! + * \class pcl::F64Rect + * \ingroup rect_types_2d + * \brief 64-bit floating-point rectangle in the R^2 space. + * + * %F64Rect is a template instantiation of GenericRectangle for \c double. + */ +typedef GenericRectangle F64Rect; + +/*! + * \class pcl::DRect + * \ingroup rect_types_2d + * \brief 64-bit floating-point rectangle in the R^2 space. + * + * %DRect is an alias for F64Rect. It is a template instantiation of + * GenericRectangle for \c double. + */ +typedef F64Rect DRect; + +#endif + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Rectangle_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Rectangle.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RedundantMultiscaleTransform.h b/3rdparty/include/pcl/RedundantMultiscaleTransform.h new file mode 100644 index 0000000..93c8814 --- /dev/null +++ b/3rdparty/include/pcl/RedundantMultiscaleTransform.h @@ -0,0 +1,576 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RedundantMultiscaleTransform.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RedundantMultiscaleTransform_h +#define __PCL_RedundantMultiscaleTransform_h + +/// \file pcl/RedundantMultiscaleTransform.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup multiscale_transforms Multiscale Transforms + */ + +/*! + * \class RedundantMultiscaleTransform + * \brief Base class of all redundant multiscale transforms. + * + * A redundant multiscale transform produces a set {w1,w2,...,wN,cN}, where + * each wj is a set of coefficients at scale j, which we call detail + * layer, and cN is a large-scale smoothed residual, which we call + * residual layer. Each layer has the same dimensions as the input + * image, so the generated multiscale transform is called \e redundant. Two + * well-known examples of redundant multiscale transform algorithms are the + * à trous (with holes) wavelet transform, also known as starlet + * transform, and the multiscale median transform. + * + * In all cases the reconstruction algorithm consists of the sum of all wj + * multiscale layers for 1 <= j <= N, plus the residual layer cN. + * + * In our implementation, each layer in a redundant multiscale transform is a + * floating-point image with the same dimensions as the transformed image. + * Layers are indexed from 0 to N. Layers at indexes from 0 to N-1 are + * detail layers, whose elements are actually difference coefficients. Pixel + * samples in a detail layer can be negative, zero or positive real values. + * + * The last layer, at index N, is the large-scale residual layer. Pixel samples + * in the residual layer image can only be positive or zero real values. + * + * \ingroup multiscale_transforms + * \sa ATrousWaveletTransform, StarletTransform, MultiscaleMedianTransform, + * MultiscaleLinearTransform + */ +class PCL_CLASS RedundantMultiscaleTransform : public BidirectionalImageTransformation, + public ParallelProcess +{ +public: + + /*! + * Represents a multiscale layer. + */ + typedef Image layer; + + /*! + * Represents a set of multiscale layers, or multiscale transform. + */ + typedef Array transform; + + /*! + * Represents a set of layer enabled/disabled states. + */ + typedef GenericVector layer_state_set; + + /*! + * Constructs a redundant multiscale transform. + * + * \param n Number of detail layers. The transform will consist of \a n + * detail layers plus a residual layer, that is n+1 total + * layers. The default value is 4. + * + * \param d Scaling sequence. If \a d ≤ 0, the transform will use the + * dyadic sequence: 1, 2, 4, ... 2^i. If \a d > 0, its value is + * the distance in pixels between two successive scales. + * + * The default values for \a n and \a d are 4 and 0, respectively (four + * layers and the dyadic scaling sequence). + * + * Successive layers are computed by applying linear or nonlinear operations + * with kernels of size 2*s + 1. The scaling sequence parameter \a d is + * interpreted as follows: + * + * - If the specified sequence parameter \a d is zero 0, then the transform + * uses the dyadic sequence: s = 1, 2, 4, ..., 2^j for 0 ≤ j < n. + * + * - If \a d > 0, then \a d is the constant increment in pixels between two + * successive scales (linear scaling sequence): s = d*j for 1 ≤ j < n. + */ + RedundantMultiscaleTransform( int n = 4, int d = 0 ) + : m_delta( Max( 0, d ) ) + , m_numberOfLayers( Max( 1, n ) ) + { + PCL_PRECONDITION( n >= 1 ) + PCL_PRECONDITION( d >= 0 ) + InitializeLayersAndStates(); + } + + /*! + * Copy constructor. + */ + RedundantMultiscaleTransform( const RedundantMultiscaleTransform& x ) + : BidirectionalImageTransformation( x ) + , ParallelProcess( x ) + , m_delta( x.m_delta ) + , m_numberOfLayers( x.m_numberOfLayers ) + , m_transform( x.m_transform ) + , m_layerEnabled( x.m_layerEnabled ) + { + m_transform.EnsureUnique(); + } + + /*! + * Move constructor. + */ + RedundantMultiscaleTransform( RedundantMultiscaleTransform&& ) = default; + + /*! + * Destroys this %RedundantMultiscaleTransform object. All existing layers + * are destroyed and deallocated. + */ + virtual ~RedundantMultiscaleTransform() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + RedundantMultiscaleTransform& operator =( const RedundantMultiscaleTransform& x ) + { + (void)BidirectionalImageTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + m_delta = x.m_delta; + m_numberOfLayers = x.m_numberOfLayers; + m_transform = x.m_transform; + m_transform.EnsureUnique(); + m_layerEnabled = x.m_layerEnabled; + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + RedundantMultiscaleTransform& operator =( RedundantMultiscaleTransform&& ) = default; + + /*! + * Returns the scaling sequence used by this multiscale transform. + * + * Successive layers are computed by applying linear on nonlinear operations + * with kernels of size 2*s + 1. + * + * If the value returned by this function is zero 0, then the transform uses + * the dyadic sequence: s = 1, 2, 4, ..., 2^j for 0 <= j < n. + * + * If the returned value is > 0, it is the constant increment in pixels + * between two successive scales (linear scaling sequence): s = d*j for + * 1 <= j < n. + */ + int ScalingSequence() const + { + return m_delta; + } + + /*! + * Sets the scaling sequence \a d used by this multiscale transform. + * + * For the meaning of the \a d scaling sequence parameter, see the + * documentation for the ScalingSequence() member function. + * + * \note As a consequence of calling this member function, all existing + * layers in this transform are destroyed. + */ + void SetScalingSequence( int d ) + { + PCL_PRECONDITION( d >= 0 ) + DestroyLayers(); + m_delta = Max( 0, d ); + } + + /*! + * Selects the dyadic scaling sequence for this multiscale transform. + * + * This is a convenience function, equivalent to: + * SetScalingSequence( 0 ); + * + * \note As a consequence of calling this member function, all existing + * layers in this transform are destroyed. + */ + void SetDyadicScalingSequence() + { + SetScalingSequence( 0 ); + } + + /*! + * Selects a linear scaling sequence with distance \a d in pixels. + * + * This is a convenience function, equivalent to: + * SetScalingSequence( d ); + * + * \note As a consequence of calling this member function, all existing + * layers in this transform are destroyed. + */ + void SetLinearScalingSequence( int d = 1 ) + { + PCL_PRECONDITION( d >= 1 ) + SetScalingSequence( Max( 1, d ) ); + } + + /*! + * Returns the filter size for the specified layer \a j. Returns an odd + * integer larger than or equal to three. For the dyadic scaling sequence, + * the returned value is equal to 1 + 2*2^j (3, 5, 9, 17, 33, ...). For a + * linear scaling sequence with distance d, returns 1 + 2*d*(1 + j). + */ + int FilterSize( int j ) const + { + return 1 + (((m_delta < 1) ? 1 << j : (1 + j)*m_delta) << 1); + } + + /*! + * Returns the number of detail layers that will be (or have been) generated + * by this transform. + * + * The number returned does not include the residual layer. In + * other words, the total number of layers generated is always equal to one + * plus the value returned by this member function, since the large-scale + * residual layer is always generated by all multiscale transforms. + */ + int NumberOfLayers() const + { + return m_numberOfLayers; + } + + /*! + * Sets the number of detail layers that will be generated by this + * transform. + * + * \param n Number of detail layers, not including the last, + * large-scale residual layer. Must be \a n >= 1. + * + * \note Calling this function implicitly performs a complete reset of this + * object, including the deletion of all existing layers. + */ + void SetNumberOfLayers( int n ) + { + PCL_PRECONDITION( n >= 1 ) + m_numberOfLayers = Max( 1, n ); + InitializeLayersAndStates(); + } + + /*! + * Returns a reference to the immutable layer at scale index \a i, + * 0 <= \a i <= \a n, where \a n is the number of generated detail layers. + * If \a i == \a n, this member function returns a reference to the + * large-scale residual layer. + * + * \note Before trying to access layers, the multiscale transform must be + * performed on an image. In addition, the specified layer must exist (must + * not have been deleted). Otherwise this function (as well as others that + * provide access to layer images) throws an Error exception. + */ + const layer& Layer( int i ) const + { + ValidateLayerAccess( i ); + return m_transform[i]; + } + + /*! + * Returns a reference to the (mutable) layer at scale index \a i. This is + * an overloaded member function, provided for convenience. + * + * See Layer( int ) const for more information. + */ + layer& Layer( int i ) + { + ValidateLayerAccess( i ); + return m_transform[i]; + } + + /*! + * Returns a reference to the (immutable) layer at scale index \a i. This is + * a convenience operator, equivalent to: + * + * \code Layer( i ) const; \endcode + * + * The array subscript operators can produce more elegant code than the + * %Layer functions. + */ + const layer& operator []( int i ) const + { + return Layer( i ); + } + + /*! + * Returns a reference to the (mutable) layer at scale index \a i. This is a + * convenience operator, equivalent to: + * + * \code Layer( i ); \endcode + * + * The array subscript operators can produce more elegant code than the + * %Layer functions. + */ + layer& operator []( int i ) + { + return Layer( i ); + } + + /*! + * Deletes the layer at layer index \a i, 0 <= \a i <= \a n, where \a n is + * the number of generated layers. If \a i == \a n this member function + * deletes the large-scale residual layer. + * + * Deleted layers are excluded from image reconstructions performed by + * subsequent inverse multiscale transforms. + * + * For example, if you delete the first two layers of a transform, a + * subsequent inverse transform will remove all small-scale image structures + * smaller than four pixels, assuming a dyadic scaling sequence. + */ + void DeleteLayer( int i ) + { + ValidateLayerAccess( i ); + m_transform[i].FreeData(); + } + + /*! + * Returns true iff the layer at layer index \a i exists (0 <= \a i <= \a n, + * where \a n is the number of generated layers), that is, if the multiscale + * transform has been generated and the specified layer has been calculated + * (because it was not disabled) and has not been deleted. + */ + bool IsLayer( int i ) const + { + ValidateLayerIndex( i ); + return !m_transform[i].IsEmpty(); + } + + /*! + * Enables or disables the layer at index \a i, 0 <= \a i <= \a n, where + * \a n is the number of generated layers. If \a i == \a n, this member + * function enables or disables the large-scale residual layer. + * + * Disabled layers are not generated during multiscale transforms, so they + * are obviously excluded from image reconstructions (inverse transforms). + * This has the advantage that a lot of memory can be saved if one or more + * layers aren't required or have to be excluded from the inverse transform. + * + * For the reason explained, disabling layers is more efficient, in terms of + * memory consumption, if done \e before the multiscale transform. When the + * transform has already been performed, disabling one or more layers + * excludes them from reconstructions, but does not delete them, so the + * after-transformation layer disable operation, unlike layer deletion, is + * reversible. + */ + void EnableLayer( int i, bool enable = true ) + { + ValidateLayerIndex( i ); + m_layerEnabled[i] = enable; + } + + /*! + * Disables or enables the layer at index \a i, 0 <= \a i <= \a n, where + * \a n is the number of generated layers. If \a i == \a n, this member + * function disables or enables the large-scale residual layer. + * + * This is a convenience function, equivalent to: + * EnableLayer( i, !disable ); + */ + void DisableLayer( int i, bool disable = true ) + { + EnableLayer( i, !disable ); + } + + /*! + * Returns true iff the layer at index \a i is enabled, false if it is + * disabled. See the documentation for EnableLayer( int, bool ) for detailed + * information about disabled layers. + */ + bool IsLayerEnabled( int i ) const + { + ValidateLayerIndex( i ); + return m_layerEnabled[i]; + } + + /*! + * Biases a multiscale transform layer. + * + * \param i Layer index, 0 <= \a i <= \a n, where \a n is the number of + * generated multiscale layers. If \a i == \a n, the residual + * layer is biased. + * + * \param k Bias factor. Positive biases increase the relative weight of + * biased layers in image reconstructions (inverse transforms). + * Negative biases decrease relative layer weights. A zero bias + * factor does not change a layer. + * + * This member function can be used to enhance or attenuate image structures + * at selected scales. Consider this code: + * + * \code + * Image img; + * // ... + * RedundantMultiscaleTransform* M; + * // ... + * *M << img; // decomposition (transform) + * M->BiasLayer( 1, +2.5 ); + * M->BiasLayer( 3, -1 ); + * *M >> img; // reconstruction (inverse transform) + * \endcode + * + * In the example above, the second and fourth layers of a multiscale + * transform have been biased. The layer at index 1 (the second layer) has + * been enhanced because a positive layer bias has been applied (2.5). The + * layer at index 3 (fourth layer) has been attenuated because a negative + * bias (-1) has been applied. + * + * \note Layer biasing is an \e irreversible operation because it works by + * multiplying all coefficients in the specified layer by a constant derived + * from the specified bias factor. + */ + void BiasLayer( int i, float k ) + { + ValidateLayerAccess( i ); + if ( k != 0 ) + m_transform[i] *= (k > 0) ? (1 + k) : 1/(1 - k); + } + + /*! + * Returns the set of layers in this transform, after clearing the transform + * without destroying its layers, whose ownership is then transferred to the + * caller. + * + * If no multiscale transform has been performed, this function returns an + * empty set. + * + * The caller is responsible for deallocation of the returned layers. After + * calling this function, this object will be empty, just as if no transform + * had been performed. + */ + virtual transform ReleaseTransform() + { + transform r = m_transform; + DestroyLayers(); + return r; + } + + /*! + * Destroys and deallocates all existing layers and resets all layer states + * so that all layers are enabled. + */ + virtual void Reset() + { + InitializeLayersAndStates(); + } + +protected: + + /* + * delta >= 1 : + * Linear scaling sequence. delta is the constant scale difference + * between two consecutive layers. + * + * delta < 1 : + * Dyadic scaling sequence (1, 2, 4, 8, 16, ...). + */ + int m_delta = 0; + + /* + * Number of detail layers, *not including* the residual smoothed layer, + * which is always generated in a multiscale transform. + */ + int m_numberOfLayers = 4; + + /* + * Array of transform layers, including the residual layer, so the length + * of this array is numberOfLayers+1. + */ + transform m_transform; + + /* + * Vector of layer enable/disable states. + */ + layer_state_set m_layerEnabled; + + /* + * Inverse transform (reconstruction) + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::ComplexImage& ) const override; + void Apply( pcl::DComplexImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + + void InitializeLayersAndStates() + { + DestroyLayers(); + m_layerEnabled = layer_state_set( true, m_numberOfLayers+1 ); + } + + void DestroyLayers() + { + m_transform = transform( size_type( m_numberOfLayers+1 ) ); + } + + void ValidateLayerIndex( int j ) const; + void ValidateLayerAccess( int j ) const; + + friend class MTReconstruction; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_RedundantMultiscaleTransform_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RedundantMultiscaleTransform.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ReferenceArray.h b/3rdparty/include/pcl/ReferenceArray.h new file mode 100644 index 0000000..0089bcb --- /dev/null +++ b/3rdparty/include/pcl/ReferenceArray.h @@ -0,0 +1,2253 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ReferenceArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ReferenceArray_h +#define __PCL_ReferenceArray_h + +/// \file pcl/ReferenceArray.h + +#include + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ReferenceArray + * \brief Dynamic array of pointers to objects providing direct iteration and + * element access by reference. + * + * %ReferenceArray is a generic, finite ordered sequence of pointers to + * objects, implemented as a reference-counted, dynamic array of pointers to T + * instances. The type A provides dynamic allocation for contiguous sequences + * of void* (StandardAllocator is used by default). + * + * Unlike IndirectArray, %ReferenceArray provides direct access to the objects + * pointed to by its contained pointers, including direct iteration through + * references instead of pointers. This makes %ReferenceArray a perfect + * replacement for Array in cases where storing copies of objects is inviable + * or impractical; for example, when the objects to be stored are unique by + * nature, when the cost of a copy operation is excessive, or as the underlying + * implementation of an heterogeneous container. As a prerequisite for this + * functionality, %ReferenceArray, unlike IndirectArray, cannot contain null + * pointers. + * + * \sa ReferenceSortedArray, IndirectArray, IndirectSortedArray, Array, + * SortedArray, ReferenceCounter + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS ReferenceArray : public DirectContainer +{ +public: + + /*! # + */ + typedef IndirectArray array_implementation; + + /*! # + */ + typedef typename array_implementation::block_allocator + block_allocator; + + /*! # + */ + typedef typename array_implementation::allocator + allocator; + + /*! # + */ + typedef typename array_implementation::iterator + indirect_iterator; + + /*! # + */ + typedef typename array_implementation::const_iterator + const_indirect_iterator; + + /*! + * \class pcl::ReferenceArray::iterator + * \brief Mutable %ReferenceArray iterator + */ + class iterator : public Iterator + { + public: + + typedef Iterator iterator_base; + + typedef typename iterator_base::iterator_class + iterator_class; + + typedef typename iterator_base::item_type item_type; + + /*! + * Default constructor. Constructs an uninitialized iterator object. + */ + iterator() = default; + + /*! + * Copy constructor. + */ + iterator( const iterator& ) = default; + + /*! + * Constructs a null iterator. + */ + iterator( std::nullptr_t ) : it( nullptr ) + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + iterator& operator =( const iterator& ) = default; + + /*! + * Pointer-to-object conversion operator. Returns a pointer to the object + * pointed to by this iterator. + */ + operator T*() const + { + return *it; + } + + /*! + * Indirection operator. Returns a reference to the object pointed to by + * this iterator. + */ + T& operator *() const + { + return **it; + } + + /*! + * Structure selection operator. Returns a pointer to the object pointed + * to by this iterator. + */ + T* operator ->() const + { + return *it; + } + + /*! + * Preincrement operator. Increments this iterator so that it points to + * the next object in the iterated container, then returns a reference to + * this iterator. + */ + iterator& operator ++() + { + ++it; + return *this; + } + + /*! + * Postincrement operator. Increments this iterator so that it points to + * the next object in the iterated container. Returns a copy of the + * iterator as it was before incrementing it. + */ + iterator operator ++( int ) + { + indirect_iterator it0 = it; + ++it; + return it0; + } + + /*! + * Predecrement operator. Decrements this iterator so that it points to + * the previous object in the iterated container, then returns a + * reference to this iterator. + */ + iterator& operator --() + { + --it; + return *this; + } + + /*! + * Postdecrement operator. Decrements this iterator so that it points to + * the previous object in the iterated container. Returns a copy of the + * iterator as it was before decrementing it. + */ + iterator operator --( int ) + { + indirect_iterator it0 = it; + --it; + return it0; + } + + /*! + * Assignment/addition operator. Increments this iterator by a distance + * \a d from its current position. Positive increments cause this + * iterator to move forward by \a d elements. Negative increments move + * this iterator backward by \a d elements. Returns a reference to this + * iterator. + */ + iterator& operator +=( distance_type d ) + { + it += d; + return *this; + } + + /*! + * Assignment/subtraction operator. Decrements this iterator by a + * distance \a d from its current position. Positive increments cause + * this iterator to move backward by \a d elements. Negative increments + * move this iterator forward by \a d elements. Returns a reference to + * this iterator. + */ + iterator& operator -=( distance_type d ) + { + it -= d; + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to this iterator incremented by a distance \a d. + */ + iterator operator +( distance_type d ) const + { + return iterator( it + d ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * this iterator decremented by a distance \a d. + */ + iterator operator -( distance_type d ) const + { + return iterator( it - d ); + } + + /*! + * Iterator subtraction operator. Returns the distance (in container + * elements) between this iterator and another iterator \a i. + */ + distance_type operator -( const iterator& i ) const + { + return it - i.it; + } + + /*! + * Equality operator. Returns true if this iterator points to the same + * object as another iterator \a i. + */ + bool operator ==( const iterator& i ) const + { + return it == i.it; + } + + /*! + * Less than operator. Returns true if this iterator points to a + * container element that precedes another iterator \a i. + */ + bool operator <( const iterator& i ) const + { + return it < i.it; + } + + private: + + indirect_iterator it = nullptr; + + /*! + * Constructor from an IndirectArray iterator (a pointer to a pointer to + * an object in the iterated container). + */ + explicit + iterator( indirect_iterator i ) : it( i ) + { + } + + friend class ReferenceArray; + friend class ReferenceArray::const_iterator; + }; + + /*! + * \class pcl::ReferenceArray::const_iterator + * \brief Immutable %ReferenceArray iterator + */ + class const_iterator : public Iterator + { + public: + + typedef Iterator iterator_base; + + typedef typename iterator_base::iterator_class + iterator_class; + + typedef typename iterator_base::item_type item_type; + + /*! + * Default constructor. Constructs an uninitialized iterator object. + */ + const_iterator() = default; + + /*! + * Constructor from non-const iterator. + */ + const_iterator( const iterator& i ) : it( i.it ) + { + } + + /*! + * Constructs a null iterator. + */ + const_iterator( std::nullptr_t ) : it( nullptr ) + { + } + + /*! + * Copy constructor. + */ + const_iterator( const const_iterator& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this immutable + * iterator. + */ + const_iterator& operator =( const const_iterator& ) = default; + + /*! + * Mutable iterator assignment operator. Returns a reference to this + * immutable iterator object. + */ + const_iterator& operator =( const iterator& i ) + { + it = i.it; + return *this; + } + + /*! + * Pointer-to-const-object conversion operator. Returns a pointer to the + * immutable object pointed to by this iterator. + */ + operator const T*() const + { + return *it; + } + + /*! + * Indirection operator. Returns a reference to the object pointed to by + * this iterator. + */ + const T& operator *() const + { + return **it; + } + + /*! + * Structure selection operator. Returns a pointer to the object pointed + * to by this iterator. + */ + const T* operator ->() const + { + return *it; + } + + /*! + * Preincrement operator. Increments this iterator so that it points to + * the next object in the iterated container, then returns a reference to + * this iterator. + */ + const_iterator& operator ++() + { + ++it; + return *this; + } + + /*! + * Postincrement operator. Increments this iterator so that it points to + * the next object in the iterated container. Returns a copy of the + * iterator as it was before incrementing it. + */ + const_iterator operator ++( int ) + { + const_indirect_iterator it0 = it; + ++it; + return it0; + } + + /*! + * Predecrement operator. Decrements this iterator so that it points to + * the previous object in the iterated container, then returns a + * reference to this iterator. + */ + const_iterator& operator --() + { + --it; + return *this; + } + + /*! + * Postdecrement operator. Decrements this iterator so that it points to + * the previous object in the iterated container. Returns a copy of the + * iterator as it was before decrementing it. + */ + const_iterator operator --( int ) + { + const_indirect_iterator it0 = it; + --it; + return it0; + } + + /*! + * Assignment/addition operator. Increments this iterator by a distance + * \a d from its current position. Positive increments cause this + * iterator to move forward by \a d elements. Negative increments move + * this iterator backward by \a d elements. Returns a reference to this + * iterator. + */ + const_iterator& operator +=( distance_type d ) + { + it += d; + return *this; + } + + /*! + * Assignment/subtraction operator. Decrements this iterator by a + * distance \a d from its current position. Positive increments cause + * this iterator to move backward by \a d elements. Negative increments + * move this iterator forward by \a d elements. Returns a reference to + * this iterator. + */ + const_iterator& operator -=( distance_type d ) + { + it -= d; + return *this; + } + + /*! + * Scalar-to-iterator addition operator. Returns an iterator equivalent + * to this iterator incremented by a distance \a d. + */ + const_iterator operator +( distance_type d ) const + { + return const_iterator( it + d ); + } + + /*! + * Scalar-to-iterator subtraction operator. Returns an iterator equal to + * this iterator decremented by a distance \a d. + */ + const_iterator operator -( distance_type d ) const + { + return const_iterator( it - d ); + } + + /*! + * Iterator subtraction operator. Returns the distance (in container + * elements) between this iterator and another iterator \a i. + */ + distance_type operator -( const const_iterator& i ) const + { + return it - i.it; + } + + /*! + * Iterator subtraction operator. Returns the distance (in container + * elements) between this iterator and a mutable iterator \a i. + */ + distance_type operator -( const iterator& i ) const + { + return it - i.it; + } + + /*! + * Equality operator. Returns true if this iterator points to the same + * object as another iterator \a i. + */ + bool operator ==( const const_iterator& i ) const + { + return it == i.it; + } + + /*! + * Equality operator. Returns true if this iterator points to the same + * object as a mutable iterator \a i. + */ + bool operator ==( const iterator& i ) const + { + return it == i.it; + } + + /*! + * Less than operator. Returns true if this iterator precedes another + * iterator \a i. + */ + bool operator <( const const_iterator& i ) const + { + return it < i.it; + } + + /*! + * Less than operator. Returns true if this iterator points to a + * container element that precedes a mutable iterator \a i. + */ + bool operator <( const iterator& i ) const + { + return it < i.it; + } + + private: + + const_indirect_iterator it = nullptr; + + /*! + * Constructor from an IndirectArray iterator (a pointer to a pointer to + * an object in the iterated container). + */ + explicit + const_iterator( const_indirect_iterator i ) : it( i ) + { + } + + friend class ReferenceArray; + }; + + /*! + * \class pcl::ReferenceArray::reverse_iterator + * \brief Mutable %ReferenceArray reverse iterator. + */ + typedef ReverseRandomAccessIterator + reverse_iterator; + + /*! + * \class pcl::ReferenceArray::const_reverse_iterator + * \brief Immutable %ReferenceArray reverse iterator. + */ + typedef ReverseRandomAccessIterator + const_reverse_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty reference array. + */ + ReferenceArray() = default; + + /*! + * Constructs a reference array that stores \a n copies of a non-null + * pointer \a p. + * + * If \a p is \c nullptr, this function constructs an empty reference array. + */ + ReferenceArray( size_type n, const T* p ) + { + PCL_PRECONDITION( p != nullptr ) + if ( p != nullptr ) + m_array = array_implementation( n, p ); + } + + /*! + * Constructs a reference array as a copy of the sequence of non-null + * pointers defined by the range [i,j) of forward iterators. + * + * If the range [i,j) contains null pointers, these are ignored and hence + * not included in the constructed reference array. + */ + template + ReferenceArray( FI i, FI j ) + { + for ( ; i != j; ++i ) + if ( *i != nullptr ) + m_array.Append( *i ); + } + + /*! + * Copy constructor. + */ + ReferenceArray( const ReferenceArray& ) = default; + + /*! + * Move constructor. + */ + ReferenceArray( ReferenceArray&& ) = default; + + /*! + * Destroys a %ReferenceArray object. + * + * Deallocates the internal array of pointers to objects, but does not + * destroy the pointed objects. To destroy them, you have to call Destroy() + * or Delete() explicitly. + */ + ~ReferenceArray() + { + } + + /*! + * Returns true iff this reference array uniquely references its contained + * array of pointers to objects. + */ + bool IsUnique() const + { + return m_array.IsUnique(); + } + + /*! + * Returns true iff this reference array is an alias of the array \a x. + * + * Two objects are aliases if both share the same data. Two reference + * containers are aliases if they share a unique set of object pointers. + */ + bool IsAliasOf( const ReferenceArray& x ) const + { + return m_array.IsAliasOf( x.m_array ); + } + + /*! + * Ensures that this reference array uniquely references its contained + * object pointers. + * + * If necessary, this member function generates a duplicate of the array + * of pointers, references it, and then decrements the reference counter of + * the original pointer array. + */ + void EnsureUnique() + { + m_array.EnsureUnique(); + } + + /*! + * Returns the total number of bytes required to store the array of object + * pointers contained by this reference array. + */ + size_type Size() const + { + return m_array.Size(); + } + + /*! + * Returns the length of this reference array. + */ + size_type Length() const + { + return m_array.Length(); + } + + /*! + * Returns the capacity of this reference array. The capacity is the maximum + * number of pointers to objects that this reference array can contain + * without requiring a reallocation. + */ + size_type Capacity() const + { + return m_array.Capacity(); + } + + /*! + * Returns the length of the space available in this reference array, or + * zero if this reference array cannot contain more pointers. The available + * space is the number of pointers to objects that can be added to this + * reference array without requiring a reallocation. It is equal to + * Capacity() - Length() by definition. + */ + size_type Available() const + { + return m_array.Available(); + } + + /*! + * Returns true only if this reference array is valid. A reference array is + * valid if it references an internal structure with an array of pointers, + * even if it is an empty array. + * + * In general, all %ReferenceArray objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other arrays. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid array object cannot be used and should be destroyed + * immediately. Invalid arrays are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const + { + return m_array.IsValid(); + } + + /*! + * Returns true iff this reference array is empty. + */ + bool IsEmpty() const + { + return m_array.IsEmpty(); + } + + /*! + * Returns the minimum legal index in this array (always zero). For empty + * arrays, this function returns a meaningless value. + */ + size_type LowerBound() const + { + return m_array.LowerBound(); + } + + /*! + * Returns the maximum legal index in this array. It is equal to Length()-1. + * For empty arrays, this function returns a meaningless value. + */ + size_type UpperBound() const + { + return m_array.UpperBound(); + } + + /*! + * Returns a reference to the allocator object used by this reference array. + */ + const allocator& Allocator() const + { + return m_array.Allocator(); + } + + /*! + * Sets a new allocator object for this reference array. + */ + void SetAllocator( const allocator& a ) + { + m_array.SetAllocator( a ); + } + + /*! + * Returns a mutable reference array iterator located at the specified array + * index \a i. + */ + iterator At( size_type i ) + { + return iterator( m_array.At( i ) ); + } + + /*! + * Returns an immutable reference array iterator located at the specified + * array index \a i. + */ + const_iterator At( size_type i ) const + { + return const_iterator( m_array.At( i ) ); + } + + /*! + * Returns a mutable iterator pointing to the same array element as the + * specified immutable iterator \a i. + * + * \warning As a side-effect of calling this function, the specified + * immutable iterator \a i may become invalid. This happens when this + * function is called for a shared array, since in this case getting a + * mutable iterator involves a deep copy of the array through an implicit + * call to EnsureUnique(). + */ + iterator MutableIterator( const_iterator i ) + { + return iterator( m_array.MutableIterator( i.it ) ); + } + + /*! + * Returns a reference to the object at the specified array index + * \a i. No bounds checking is performed. + */ + T& operator []( size_type i ) + { + return *m_array[i]; + } + + /*! + * Returns a reference to the immutable object at the specified array + * index \a i. No bounds checking is performed. + */ + const T& operator []( size_type i ) const + { + return *m_array[i]; + } + + /*! + * Returns a reference to the first object in this reference array. + */ + T& operator *() + { + return **m_array.Begin(); + } + + /*! + * Returns a reference to the unmodifiable first object in this reference + * array. + */ + const T& operator *() const + { + return **m_array.Begin(); + } + + /*! + * Returns a mutable iterator located at the beginning of this array. + */ + iterator Begin() + { + return iterator( m_array.Begin() ); + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator Begin() const + { + return const_iterator( m_array.Begin() ); + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator ConstBegin() const + { + return const_iterator( m_array.ConstBegin() ); + } + + /*! + * Returns a mutable iterator located at the end of this array. + */ + iterator End() + { + return iterator( m_array.End() ); + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator End() const + { + return const_iterator( m_array.End() ); + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator ConstEnd() const + { + return const_iterator( m_array.ConstEnd() ); + } + + /*! + * Returns a mutable reverse iterator located at the reverse + * beginning of this reference array. + * + * The reverse beginning corresponds to the last object in the array. + */ + reverse_iterator ReverseBegin() + { + return iterator( m_array.End()-1 ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this reference array. + * + * The reverse beginning corresponds to the last object in the array. + */ + const_reverse_iterator ReverseBegin() const + { + return const_iterator( m_array.End()-1 ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this indirect array. + * + * The reverse beginning corresponds to the last pointer in the array. + */ + const_reverse_iterator ConstReverseBegin() const + { + PCL_PRECONDITION( !IsEmpty() ) + return const_iterator( m_array.End()-1 ); + } + + /*! + * Returns a mutable reverse iterator located at the reverse end of + * this reference array. + * + * The reverse end corresponds to a (nonexistent) object immediately before + * the first object in the array. + */ + reverse_iterator ReverseEnd() + { + PCL_PRECONDITION( !IsEmpty() ) + return iterator( m_array.Begin()-1 ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this reference array. + * + * The reverse end corresponds to a (nonexistent) object immediately before + * the first object in the array. + */ + const_reverse_iterator ReverseEnd() const + { + PCL_PRECONDITION( !IsEmpty() ) + return const_iterator( m_array.Begin()-1 ); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this reference array. + * + * The reverse end corresponds to a (nonexistent) object immediately before + * the first object in the array. + */ + const_reverse_iterator ConstReverseEnd() const + { + PCL_PRECONDITION( !IsEmpty() ) + return const_iterator( m_array.Begin()-1 ); + } + + /*! + * Returns a reference to the first object in this reference array. This + * function should never be called for an empty array. + */ + T& First() + { + return **m_array.Begin(); + } + + /*! + * Returns a reference to the first unmodifiable object in this reference + * array. This function should never be called for an empty array. + */ + const T& First() const + { + return **m_array.Begin(); + } + + /*! + * Returns a reference to the last object in this reference array. This + * function should never be called for an empty array. + */ + T& Last() + { + return **m_array.ReverseBegin(); + } + + /*! + * Returns a reference to the last unmodifiable object in this reference + * array. This function should never be called for an empty array. + */ + const T& Last() const + { + return **m_array.ReverseBegin(); + } + + /*! + * Ensures that the specified iterator represents a pointer stored in a + * uniquely referenced indirect array. If necessary, this function builds a + * new, uniquely referenced copy of the underlying indirect array by calling + * EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the object + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + m_array.UniquifyIterator( i.it ); + } + + /*! + * Ensures that the specified iterators represents a pointer stored in a + * uniquely referenced indirect array. If necessary, this function builds a + * new, uniquely referenced copy of the underlying indirect array by calling + * EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the objects at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + m_array.UniquifyIterators( i.it, j.it ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this reference array to reference the same set of objects as + * another array \a x. Returns a reference to this object. + */ + ReferenceArray& operator =( const ReferenceArray& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns a reference array \a x to this reference array. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Increments the reference counter of the source array's data and + * references it in this array. + */ + void Assign( const ReferenceArray& x ) + { + m_array.Assign( x.m_array ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ReferenceArray& operator =( ReferenceArray&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another reference array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( ReferenceArray& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! + * Transfers data from another reference array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( ReferenceArray&& x ) + { + m_array.Transfer( std::move( x.m_array ) ); + } + + /*! + * Replaces the contents of this reference array with a sequence of \a n + * pointers equal to \a p. + * + * if \a p is \c nullptr, this function yields an empty array. + */ + void Assign( const T* p, size_type n = 1 ) + { + if ( p != nullptr ) + m_array.Assign( p, n ); + else + m_array.Clear(); + } + + /*! + * Replaces the contents of this reference array with a copy of the sequence + * of pointers defined by the range [i,j) of forward iterators. + * + * If the range [i,j) contains null pointers, these are ignored and hence + * not included in this reference array. + * + * \note \a i and \a j must not be iterators into this array. + */ + template + void Assign( FI i, FI j ) + { + m_array.Clear(); + for ( ; i != j; ++i ) + if ( *i != nullptr ) + m_array.Append( *i ); + } + + /*! + * Replaces the contents of this reference array with a set of pointers to + * newly created copies of the objects stored in the specified container + * \a x. This function works for both direct and indirect containers. + * + * Keep in mind that after calling this function (with a reference to a + * nonempty container) this array will store newly allocated objects. You + * should call Destroy() to deallocate these objects before destructing this + * reference array in order to avoid a memory leak. + */ + template + void CloneAssign( const C& x ) + { + PCL_ASSERT_CONTAINER( C, T ); + CloneObjects( x, (C*)nullptr ); + } + + /*! + * Causes this reference array to store the sequence of pointers defined by + * the range [i,j) of iterators. The previously referenced data structure is + * dereferenced and deallocated if it becomes unreferenced. + */ + void Import( iterator i, iterator j ) + { + m_array.Import( i.it, j.it ); + } + + /*! + * Releases the set of pointers contained by this reference array. + * + * This member function returns a pointer to the internal block of pointers + * stored in this object, after ensuring that it is uniquely referenced. + * If the array is empty, this function may return the null pointer. + * + * Before returning, this member function empties this array without + * deallocating its contained data. The caller is then responsible for + * deallocating the returned block when it is no longer required. + */ + indirect_iterator Release() + { + return m_array.Release(); + } + + /*! + * Inserts a copy of the sequence of pointers contained by the reference + * array \a x at the specified location \a i in this reference array. + * + * The insertion point \a i is constrained to stay in the range + * [Begin(),End()) of existing array elements. The source array \a x can + * safely be a reference to this array. + * + * Returns an iterator pointing to the first newly created array element, or + * \a i if \a x is empty. + */ + iterator Insert( const_iterator i, const ReferenceArray& x ) + { + return iterator( m_array.Insert( i.it, x.m_array ) ); + } + + /*! + * Inserts a contiguous sequence of \a n non-null pointers equal to \a p at + * the specified location \a i. + * + * If \a p is \c nullptr, this function has no effect. The insertion point + * \a i is constrained to stay in the range [Begin(),End()) of existing + * array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a n is zero or \a p is \c nullptr. + */ + iterator Insert( const_iterator i, const T* p, size_type n = 1 ) + { + return (p != nullptr) ? iterator( m_array.Insert( i.it, p, n ) ) : + iterator( const_cast( i.it ) ); + } + + /*! + * Inserts a copy of the sequence of pointers defined by the range [p,q) + * of forward iterators at the specified location \a i in this reference + * array. + * + * If the range [p,q) contains null pointers, these are ignored and not + * inserted in this array. The insertion point \a i is constrained to stay + * in the range [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first inserted array element, or \a i + * if \a q <= \a p or no element in [p,q) is a non-null pointer. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Insert( const_iterator i, FI p, FI q ) + { + const_indirect_iterator it = i.it; + for ( ; p != q; ++p ) + if ( *p != nullptr ) + it = m_array.Insert( it, *p ); + return iterator( const_cast( it ) ); + } + + /*! + * Appends a copy of the sequence of pointers contained by the reference + * array \a x to this array. + */ + void Append( const ReferenceArray& x ) + { + m_array.Append( x.m_array ); + } + + /*! + * Appends a contiguous sequence of \a n pointers equal to \a p to this + * reference array. + * + * If \a p is \c nullptr, this function has no effect. + */ + void Append( const T* p, size_type n = 1 ) + { + if ( p != nullptr ) + m_array.Append( p, n ); + } + + /*! + * Appends a copy of the sequence of pointers defined by the range [p,q) + * of forward iterators to this reference array. + * + * If the range [p,q) contains null pointers, these are ignored and not + * inserted in this array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Append( FI p, FI q ) + { + for ( ; p != q; ++p ) + if ( *p != nullptr ) + m_array.Append( *p ); + } + + /*! + * Inserts a copy of the sequence of pointers contained by the reference + * array \a x at the beginning of this reference array. + */ + void Prepend( const ReferenceArray& x ) + { + m_array.Prepend( x.m_array ); + } + + /*! + * Inserts a contiguous sequence of \a n pointers equal to \a p at the + * beginning of this indirect array. + * + * If \a p is \c nullptr, this function has no effect. + */ + void Prepend( const T* p, size_type n = 1 ) + { + if ( p != nullptr ) + m_array.Prepend( p, n ); + } + + /*! + * Inserts a copy of the sequence of pointers defined by the range [p,q) of + * forward iterators at the beginning of this indirect array. + * + * If the range [p,q) contains null pointers, these are ignored and not + * inserted in this array. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + void Prepend( FI p, FI q ) + { + for ( ; p != q; ++p ) + if ( *p != nullptr ) + m_array.Prepend( *p ); + } + + /*! + * A synonym for Append( const ReferenceArray<>& ) + */ + void Add( const ReferenceArray& x ) + { + Append( x ); + } + + /*! + * A synonym for Append( const T*, size_type ) + */ + void Add( const T* p, size_type n = 1 ) + { + Append( p, n ); + } + + /*! + * A synonym for Append( FI, FI ) + */ + template + void Add( FI i, FI j ) + { + Append( i, j ); + } + + /*! + * Removes a sequence of \a n contiguous pointers starting at the specified + * location \a i in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, size_type n = 1 ) + { + m_array.Remove( i.it, n ); + } + + /*! + * Removes a sequence of contiguous pointers in the range [i,j) of this + * reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, const_iterator j ) + { + m_array.Remove( i.it, j.it ); + } + + /*! + * Removes a trailing sequence of contiguous pointers from the specified + * iterator of this reference array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator is located at or after the end of this array, + * this function does nothing. Otherwise the iterator is constrained to stay + * in the range [Begin(),End()) of existing array elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Truncate( const_iterator i ) + { + m_array.Truncate( i.it ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing pointers from + * this reference array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Shrink( size_type n = 1 ) + { + m_array.Shrink( n ); + } + + /*! + * Removes all existing pointers whose pointed objects are equal to the + * specified value \a v in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const T& v ) + { + m_array.Remove( v ); + } + + /*! + * Removes every pointer x in this reference array such that the binary + * predicate p( *x, \a v ) is true. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + template + void Remove( const T& v, BP p ) + { + m_array.Remove( v, p ); + } + + /*! + * Removes all contained pointers equal to \a p in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void RemovePointer( const T* p ) + { + m_array.Remove( p ); + } + + /*! + * Removes all pointers contained by this object, yielding an empty + * reference array. + * + * If this array is empty, then calling this member function has no effect. + * + * If this array uniquely references its internal array data structure, all + * pointers contained are deallocated; otherwise its reference counter is + * decremented. Then a new, empty array data structure is created and + * uniquely referenced. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Clear() + { + m_array.Clear(); + } + + /*! + * Destroys and removes a sequence of \a n contiguous objects, starting at + * the specified location \a i in this reference array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( iterator i, size_type n = 1 ) + { + m_array.Destroy( i.it, n ); + } + + /*! + * Destroys and removes the objects in a range [i,j) of iterators in this + * reference array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning This function is potentially dangerous. If the array contains + * duplicate pointers in the specified range of iterators, this function + * will lead to a crash as a result of multiple deletions. To minimize the + * risk of multiple deletions, this function ignores the normal data sharing + * mechanism so that all objects sharing the same array data structure will + * correctly have the destroyed objects removed. However, be aware of + * potential problems if other reference or indirect containers store + * pointers to deleted objects in different data structures, which will be + * invalid after calling this function. + */ + void Destroy( iterator i, iterator j ) + { + m_array.Destroy( i.it, j.it ); + } + + /*! + * Destroys and removes all objects equal to \a v in this reference array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( const T& v ) + { + m_array.Destroy( v ); + } + + /*! + * Destroys and removes every object x in this reference array such that the + * binary predicate p( x, \a v ) is true. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + template + void Destroy( const T& v, BP p ) + { + m_array.Destroy( v, p ); + } + + /*! + * Destroys and removes all objects in this reference array, yielding an + * empty array. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy() + { + m_array.Destroy(); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) of + * iterators in this array by the pointers stored in a reference array \a x. + * + * If the starting iterator \a i is located at or after the end of this + * array, or if \a j precedes \a i, this function does nothing. Otherwise + * the range [i,j) is constrained to stay in the range [Begin(),End()) of + * existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or a null iterator if the resulting array is + * empty. + */ + iterator Replace( const_iterator i, const_iterator j, const ReferenceArray& x ) + { + return iterator( m_array.Replace( i.it, j.it, x.m_array ) ); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) in + * this reference array by \a n copies of the specified non-null pointer + * \a p. + * + * If \a p is \c nullptr, this function removes the subset [i,j) from this + * array, as if \a n = 0 had been specified. + */ + iterator Replace( const_iterator i, const_iterator j, const T* p, size_type n = 1 ) + { + return iterator( m_array.Replace( i.it, j.it, p, (p != nullptr) ? n : size_type( 0 ) ) ); + } + + /*! + * Replaces a sequence of contiguous pointers defined by the range [i,j) in + * this reference array by the sequence of pointers in the range [p,q) of + * forward iterators. + * + * If the range [p,q) contains null pointers, these are ignored and not + * inserted in this array. If the starting iterator \a i is located at or + * after the end of this array, or if \a j precedes \a i, this function does + * nothing. Otherwise the range [i,j) is constrained to stay in the range + * [Begin(),End()) of existing array elements. + * + * Returns an iterator pointing to the first replaced array element, \a i + * if no elements are replaced, or a null iterator if the resulting array is + * empty. + * + * \note \a p and \a q must not be iterators into this array. + */ + template + iterator Replace( const_iterator i, const_iterator j, FI p, FI q ) + { + array_implementation m; + for ( ; p != q; ++p ) + if ( *p != nullptr ) + m.Append( *p ); + return iterator( m_array.Replace( i.it, j.it, m ) ); + } + + /*! + * Ensures that this reference array has enough capacity to store \a n + * pointers. + * + * After calling this member function with \a n > 0, this object is + * guaranteed to uniquely reference its array data. + */ + void Reserve( size_type n ) + { + m_array.Reserve( n ); + } + + /*! + * Causes this reference array to allocate the exact required memory space + * to store its contained pointers. + * + * If the array has excess capacity, a new copy of its contained pointers is + * generated and stored in a newly allocated memory block that fits them + * exactly, then the previous memory block is deallocated. + * + * If the array is empty, calling this function is equivalent to Clear(). + * Note that in this case a previously allocated memory block (by a call to + * Reserve()) may also be deallocated. + */ + void Squeeze() + { + m_array.Squeeze(); + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + pcl::Fill( Begin(), End(), v ); + } + + /*! + * Calls f( T& x ) for every object x in this reference array, successively + * from the first contained object to the last. + */ + template + void Apply( F f ) + { + pcl::Apply( Begin(), End(), f ); + } + + /*! + * Calls f( const T& x ) for every unmodifiable object x in this reference + * array, successively from the first contained object to the last. + */ + template + void Apply( F f ) const + { + pcl::Apply( Begin(), End(), f ); + } + + /*! + * Returns an iterator pointing to the first object x in this reference + * array such that f( const T& x ) is true. Returns End() if such pointer + * does not exist. + */ + template + iterator FirstThat( F f ) const + { + return iterator( const_cast( pcl::FirstThat( Begin(), End(), f ).it ) ); + } + + /*! + * Returns an iterator pointing to the last object x in this reference array + * such that f( const T& x ) is true. Returns End() if such pointer does not + * exist. + */ + template + iterator LastThat( F f ) const + { + return iterator( const_cast( pcl::LastThat( Begin(), End(), f ).it ) ); + } + + /*! + * Returns the number of objects equal to \a v in this reference array. + */ + size_type Count( const T& v ) const + { + return pcl::Count( Begin(), End(), v ); + } + + /*! + * Returns the number of pointers equal to \a p stored in this reference + * array. + * + * If \a p is \c nullptr, this function \e should return zero --- or you are + * in serious trouble! + */ + size_type Count( const T* p ) const + { + return m_array.Count( p ); + } + + /*! + * Returns the number of objects in this reference array such that for each + * counted object x the binary predicate p( x, v ) returns true. + */ + template + size_type Count( const T& v, BP p ) const + { + return pcl::Count( Begin(), End(), v, p ); + } + + /*! + * Returns the number of objects in this reference array such that for each + * counted object x the unary predicate p( x ) returns true. + */ + template + size_type CountIf( UP p ) const + { + return pcl::CountIf( Begin(), End(), p ); + } + + /*! # + */ + iterator MinItem() const + { + return iterator( const_cast( pcl::MinItem( Begin(), End() ).it ) ); + } + + /*! # + */ + template + iterator MinItem( BP p ) const + { + return iterator( const_cast( pcl::MinItem( Begin(), End(), p ).it ) ); + } + + /*! # + */ + iterator MaxItem() const + { + return iterator( const_cast( pcl::MaxItem( Begin(), End() ).it ) ); + } + + /*! # + */ + template + iterator MaxItem( BP p ) const + { + return iterator( const_cast( pcl::MaxItem( Begin(), End(), p ).it ) ); + } + + /*! # + */ + void Reverse() + { + m_array.Reverse(); + } + + /*! # + */ + void Rotate( distance_type n ) + { + m_array.Rotate( n ); + } + + /*! # + */ + void ShiftLeft( const T* p, size_type n = 1 ) + { + m_array.ShiftLeft( p, n ); + } + + /*! # + */ + void ShiftRight( const T* p, size_type n = 1 ) + { + m_array.ShiftRight( p, n ); + } + + /*! # + */ + iterator Search( const T& v ) const + { + return iterator( const_cast( pcl::LinearSearch( Begin(), End(), v ).it ) ); + } + + /*! # + */ + iterator Search( const T* p ) const + { + return iterator( m_array.Search( p ) ); + } + + /*! # + */ + template + iterator Search( const T& v, BP p ) const + { + return iterator( const_cast( pcl::LinearSearch( Begin(), End(), v, p ).it ) ); + } + + /*! # + */ + iterator SearchLast( const T& v ) const + { + return iterator( const_cast( pcl::LinearSearchLast( Begin(), End(), v ).it ) ); + } + + /*! # + */ + iterator SearchLast( const T* p ) const + { + return iterator( m_array.SearchLast( p ) ); + } + + /*! # + */ + template + iterator SearchLast( const T& v, BP p ) const + { + return iterator( const_cast( pcl::LinearSearchLast( Begin(), End(), v, p ).it ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j ) const + { + return iterator( const_cast( pcl::Search( Begin(), End(), i, j ).it ) ); + } + + /*! # + */ + template + iterator SearchSubset( FI i, FI j, BP p ) const + { + return iterator( const_cast( pcl::Search( Begin(), End(), i, j, p ).it ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& c ) const + { + return iterator( const_cast( pcl::Search( Begin(), End(), c.Begin(), c.End() ).it ) ); + } + + /*! # + */ + template + iterator SearchSubset( const C& c, BP p ) const + { + return iterator( const_cast( pcl::Search( Begin(), End(), c.Begin(), c.End(), p ).it ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j ) const + { + return iterator( const_cast( pcl::SearchLast( Begin(), End(), i, j ).it ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( BI i, BI j, BP p ) const + { + return iterator( const_cast( pcl::SearchLast( Begin(), End(), i, j, p ).it ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& c ) const + { + return iterator( const_cast( pcl::SearchLast( Begin(), End(), c.Begin(), c.End() ).it ) ); + } + + /*! # + */ + template + iterator SearchLastSubset( const C& c, BP p ) const + { + return iterator( const_cast( pcl::SearchLast( Begin(), End(), c.Begin(), c.End(), p ).it ) ); + } + + /*! # + */ + bool Contains( const T& v ) const + { + return Search( v ) != End(); + } + + /*! # + */ + bool Contains( const T* p ) const + { + return m_array.Contains( p ); + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const + { + return Search( v, p ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j ) const + { + return SearchSubset( i, j ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( FI i, FI j, BP p ) const + { + return SearchSubset( i, j, p ) != End(); + } + + /*! # + */ + template + iterator ContainsSubset( const C& c ) const + { + return m_array.ContainsSubset( c ); + } + + /*! # + */ + template + iterator ContainsSubset( const C& c, BP p ) const + { + return SearchSubset( c ) != End(); + } + + /*! # + */ + void Sort() + { + pcl::QuickSort( m_array.Begin(), m_array.End(), + []( const T* a, const T* b ){ return *a < *b; } ); + } + + /*! # + */ + template + void Sort( BP p ) + { + pcl::QuickSort( m_array.Begin(), m_array.End(), + [p]( const T* a, const T* b ){ return p( *a, *b ); } ); + } + + /*! + * Exchanges two reference arrays \a x1 and \a x2. + */ + friend void Swap( ReferenceArray& x1, ReferenceArray& x2 ) + { + pcl::Swap( x1.m_array, x2.m_array ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each element in this array, this function appends a string + * representation (known as a \e token) to the target string \a s. If the + * array contains more than one element, successive tokens are separated + * with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + const_iterator i = Begin(); + if ( i < End() ) + { + s.Append( S( *i ) ); + if ( ++i < End() ) + do + { + s.Append( separator ); + s.Append( S( *i ) ); + } + while ( ++i < End() ); + } + return s; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each element x in this array, this function appends a string + * representation (known as a \e token) to the target string \a s by + * calling the \a append function: + * + *\code append( s, S( x ) ); \endcode + * + * If the array contains more than one element, successive tokens are + * separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + const_iterator i = Begin(); + if ( i < End() ) + { + append( s, S( *i ) ); + if ( ++i < End() ) + { + S p( separator ); + do + { + append( s, p ); + append( s, S( *i ) ); + } + while ( ++i < End() ); + } + } + return s; + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return ToSeparated( s, ',' ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return ToSeparated( s, ' ' ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return ToSeparated( s, '\t' ); + } + + /*! + * Generates a newline-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\n' ); \endcode + */ + template + S& ToNewLineSeparated( S& s ) const + { + return ToSeparated( s, '\n' ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this reference + * array. + * + * This function calls pcl::Hash64() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return m_array.Hash64( seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this reference + * array. + * + * This function calls pcl::Hash32() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const + { + return m_array.Hash32( seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this reference array. + * This function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const + { + return Hash64( seed ); + } + +private: + + array_implementation m_array; + + template + void CloneObjects( const C& x, DirectContainer* ) + { + m_array.CloneAssign( x ); + } + + template + void CloneObjects( const C& x, IndirectContainer* ) + { + m_array.Clear(); + m_array.Reserve( x.Length() ); + allocator a; + for ( typename C::const_iterator p = x.Begin(); p != x.End(); ++p ) + if ( *p != nullptr ) + { + T* o = a.Allocate( 1 ); + pcl::Construct( o, **p, a ); + m_array.Append( o ); + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff two reference arrays \a x1 and \a x2 are equal. This + * operator compares the objects pointed to by the pointers stored in the + * reference arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator ==( const ReferenceArray& x1, const ReferenceArray& x2 ) +{ + return x1.Length() == x2.Length() && pcl::Equal( x1.Begin(), x2.Begin(), x2.End() ); +} + +/*! + * Returns true iff a reference array \a x1 precedes another reference array + * \a x2. This operator compares the objects pointed to by the pointers stored + * in the reference arrays. + * \ingroup array_relational_operators + */ +template inline +bool operator <( const ReferenceArray& x1, const ReferenceArray& x2 ) +{ + return pcl::Compare( x1.Begin(), x1.End(), x2.Begin(), x2.End() ) < 0; +} + +/*! + * Appends a non-null pointer \a p to a reference array \a x. Returns a + * reference to the left-hand reference array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +ReferenceArray& operator <<( ReferenceArray& x, const V* p ) +{ + x.Append( static_cast( p ) ); + return x; +} + +/*! + * Appends a non-null pointer \a p to a temporary reference array \a x. Returns + * a reference to the left-hand reference array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +ReferenceArray& operator <<( ReferenceArray&& x, const V* p ) +{ + x.Append( static_cast( p ) ); + return x; +} + +/*! + * Appends a reference array \a x2 to a reference array \a x1. Returns a + * reference to the left-hand reference array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceArray& operator <<( ReferenceArray& x1, const ReferenceArray& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +/*! + * Appends a reference array \a x2 to a temporary reference array \a x1. + * Returns a reference to the left-hand reference array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceArray& operator <<( ReferenceArray&& x1, const ReferenceArray& x2 ) +{ + x1.Append( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ReferenceArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ReferenceArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ReferenceCounter.h b/3rdparty/include/pcl/ReferenceCounter.h new file mode 100644 index 0000000..ffceb85 --- /dev/null +++ b/3rdparty/include/pcl/ReferenceCounter.h @@ -0,0 +1,231 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ReferenceCounter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ReferenceCounter_h +#define __PCL_ReferenceCounter_h + +/// \file pcl/ReferenceCounter.h + +#include + +#include + +#ifdef __PCL_REFCOUNT_CHECK_DETACHMENT +# include +#else +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ReferenceCounter + * \brief Thread-safe reference counter for copy-on-write data structures. + * + * %ReferenceCounter is used internally by most PCL container and image classes + * to implement reference-counted, copy-on-write shared data. + * + * %ReferenceCounter is a thread-safe reference counter because it implements + * its internal counter as an instance of the AtomicInt class. This means that + * counter increment and decrement are implemented as atomic operations. + * + * Copy-on-write is a fundamental technique for optimization of resources and + * execution speed by preventing unnecessary duplication of data, especially + * when objects are copied and aliased frequently but seldom modified. + * Basically, a set of objects can share the same data with the condition that + * the data remains unmodified. In this case, the set of objects is said to be + * \e referencing a single data item, and all objects in the set are considered + * as \e aliases of the data. When an alias object tries to modify its + * referenced data, a new copy is generated on-demand and the object uniquely + * references the newly generated data, which can then be freely modified. This + * mechanism works in a completely automatic and transparent way, and + * %ReferenceCounter just provides a thread-safe counter to keep track of the + * number of aliased objects that reference the same data structure at a given + * time, plus a number of useful related functions. + * + * \sa AtomicInt + */ +class PCL_CLASS ReferenceCounter +{ +public: + + /*! + * Constructs a new %ReferenceCounter object. The reference counter is + * initialized to one, which means that only one object (the caller) is + * referencing the data associated with this object. + */ + ReferenceCounter() = default; + + /*! + * Destroys a %ReferenceCounter object. + */ + ~ReferenceCounter() + { + } + + /*! + * Copy constructor. This constructor is equivalent to the default + * constructor because reference counters are unique objects. In other + * words, the reference counter is always initialized to one for newly + * constructed %ReferenceCounter objects. + * + * This constructor exists and is not disabled to allow reference-counted + * data structures to have copy constructors. + */ + ReferenceCounter( const ReferenceCounter& ) + : ReferenceCounter() + { + } + + /*! + * Copy assignment. This operator is disabled because reference counters are + * unique objects. + */ + ReferenceCounter& operator =( const ReferenceCounter& ) = delete; + + /*! + * Increments the reference counter by one unit. This happens when a new + * object references the data being controlled with this counter. + * + * \note This attachment operation is thread-safe: the internal increment + * operation is atomic. + * + * \sa Detach() + */ + void Attach() + { + m_count.Increment(); + } + + /*! + * Decrements the reference counter by one unit. This happens when an object + * ceases to reference the data being controlled with this counter. + * + * Returns true if the reference counter is greater than zero after the + * decrement; false if the reference counter becomes zero. When the + * reference counter is zero, the data being controlled with this counter is + * no longer referenced by any object and thus can be safely destroyed. + * + * \note This detachment operation is thread-safe: the internal dereference + * operation is atomic. + * + * \sa Attach() + */ + bool Detach() + { + PCL_CHECK( m_count.Load() > 0 ) + return m_count.Dereference(); + } + + /*! + * Returns the current value of this reference counter. + * + * \sa RefCountAtomic(), IsUnique() + */ + int RefCount() const + { + return m_count; + } + + /*! + * Returns the current value of this reference counter. + * + * \note This operation is thread-safe: the integer load has been + * implemented as an atomic operation. + * + * \sa RefCount(), IsUniqueAtomic() + */ + int RefCountAtomic() const + { + return m_count.Load(); + } + + /*! + * Returns true iff the data being controlled with this counter is not being + * referenced by more than one object. + * + * \sa IsUniqueAtomic(), Attach(), Detach() + */ + bool IsUnique() const + { + return RefCount() < 2; + } + + /*! + * Returns true iff the data being controlled with this counter is not being + * referenced by more than one object. + * + * \note This operation is thread-safe: the integer comparison has been + * implemented as an atomic operation. + * + * \sa IsUnique(), Attach(), Detach() + */ + bool IsUniqueAtomic() const + { + return RefCountAtomic() < 2; + } + +private: + + mutable AtomicInt m_count = 1; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ReferenceCounter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ReferenceCounter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ReferenceSortedArray.h b/3rdparty/include/pcl/ReferenceSortedArray.h new file mode 100644 index 0000000..60b87c3 --- /dev/null +++ b/3rdparty/include/pcl/ReferenceSortedArray.h @@ -0,0 +1,1552 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ReferenceSortedArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ReferenceSortedArray_h +#define __PCL_ReferenceSortedArray_h + +/// \file pcl/ReferenceSortedArray.h + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ReferenceSortedArray + * \brief Dynamic sorted array of pointers to objects providing direct + * iteration and element access by reference. + * + * %ReferenceSortedArray is a generic, finite sorted sequence of pointers to + * objects, implemented as a reference-counted, dynamic array of pointers to T + * instances with automatic sorting of inserted array elements. The type A + * provides dynamic allocation for contiguous sequences of void* + * (StandardAllocator is used by default). + * + * Ordering of array elements is implemented by indirection, that is, the + * pointed-to objects are compared for sorting, not the contained pointers. + * + * Unlike IndirectArray and IndirectSortedArray, %ReferenceSortedArray provides + * direct access to the objects pointed to by its contained pointers, including + * direct iteration through references instead of pointers. This makes + * %ReferenceSortedArray a perfect replacement for SortedArray in cases where + * storing copies of objects is impractical or inviable; for example, when the + * objects to be stored are unique by nature. As a prerequisite for this + * functionality, %ReferenceSortedArray, unlike IndirectSortedArray and + * IndirectArray, and like ReferenceArray, cannot contain null pointers. + * + * \sa ReferenceArray, IndirectArray, IndirectSortedArray, Array, SortedArray, + * ReferenceCounter + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS ReferenceSortedArray : public DirectContainer +{ +public: + + /*! # + */ + typedef ReferenceArray array_implementation; + + /*! # + */ + typedef typename array_implementation::block_allocator + block_allocator; + + /*! # + */ + typedef typename array_implementation::allocator + allocator; + + /*! # + */ + typedef typename array_implementation::iterator + iterator; + + /*! # + */ + typedef typename array_implementation::const_iterator + const_iterator; + + /*! # + */ + typedef typename array_implementation::reverse_iterator + reverse_iterator; + + /*! # + */ + typedef typename array_implementation::const_reverse_iterator + const_reverse_iterator; + + /*! # + */ + typedef typename array_implementation::indirect_iterator + indirect_iterator; + + /*! # + */ + typedef typename array_implementation::const_indirect_iterator + const_indirect_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty reference sorted array. + */ + ReferenceSortedArray() = default; + + /*! + * Constructs a reference sorted array that stores \a n copies of a non-null + * pointer \a p. + * + * If \a p is \c nullptr, this function constructs an empty reference array. + */ + ReferenceSortedArray( size_type n, const T* p ) + { + PCL_PRECONDITION( p != nullptr ) + if ( p != nullptr ) + m_array = array_implementation( n, p ); + } + + /*! + * Constructs a reference array as a copy of the sequence of non-null + * pointers defined by the range [i,j) of forward iterators. The stored + * sequence of pointers is sorted in ascending order by comparing the + * pointed objects. + * + * If the range [i,j) contains null pointers, these are ignored and hence + * not included in the constructed reference array. + */ + template + ReferenceSortedArray( FI i, FI j ) + : m_array( i, j ) + { + Sort(); + } + + /*! + * Copy constructor. + */ + ReferenceSortedArray( const ReferenceSortedArray& ) = default; + + /*! + * Move constructor. + */ + ReferenceSortedArray( ReferenceSortedArray&& ) = default; + + /*! + * Destroys a %ReferenceSortedArray object. + * + * Deallocates the internal array of pointers to objects, but does not + * destroy the pointed objects. To destroy them, you have to call Destroy() + * or Delete() explicitly. + */ + ~ReferenceSortedArray() + { + } + + /*! + * Returns true iff this reference array uniquely references its contained + * array of pointers to objects. + */ + bool IsUnique() const + { + return m_array.IsUnique(); + } + + /*! + * Returns true iff this reference array is an alias of the array \a x. + * + * Two objects are aliases if both share the same data. Two reference + * containers are aliases if they share a unique set of object pointers. + */ + bool IsAliasOf( const ReferenceSortedArray& x ) const + { + return m_array.IsAliasOf( x.m_array ); + } + + /*! + * Ensures that this reference array uniquely references its contained + * object pointers. + * + * If necessary, this member function generates a duplicate of the array + * of pointers, references it, and then decrements the reference counter of + * the original pointer array. + */ + void EnsureUnique() + { + m_array.EnsureUnique(); + } + + /*! + * Returns the total number of bytes required to store the array of object + * pointers contained by this reference array. + */ + size_type Size() const + { + return m_array.Size(); + } + + /*! + * Returns the length of this reference array. + */ + size_type Length() const + { + return m_array.Length(); + } + + /*! + * Returns the capacity of this reference array. The capacity is the maximum + * number of pointers to objects that this reference array can contain + * without requiring a reallocation. + */ + size_type Capacity() const + { + return m_array.Capacity(); + } + + /*! + * Returns the length of the space available in this reference array, or + * zero if this reference array cannot contain more pointers. The available + * space is the number of pointers to objects that can be added to this + * reference array without requiring a reallocation. It is equal to + * Capacity() - Length() by definition. + */ + size_type Available() const + { + return m_array.Available(); + } + + /*! + * Returns true only if this reference array is valid. A reference array is + * valid if it references an internal structure with an array of pointers, + * even if it is an empty array. + * + * In general, all %ReferenceSortedArray objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other arrays. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid array object cannot be used and should be destroyed + * immediately. Invalid arrays are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const + { + return m_array.IsValid(); + } + + /*! + * Returns true iff this reference array is empty. + */ + bool IsEmpty() const + { + return m_array.IsEmpty(); + } + + /*! + * Returns the minimum legal index in this array (always zero). For empty + * arrays, this function returns a meaningless value. + */ + size_type LowerBound() const + { + return m_array.LowerBound(); + } + + /*! + * Returns the maximum legal index in this array. It is equal to Length()-1. + * For empty arrays, this function returns a meaningless value. + */ + size_type UpperBound() const + { + return m_array.UpperBound(); + } + + /*! + * Returns a reference to the allocator object used by this reference array. + */ + const allocator& Allocator() const + { + return m_array.Allocator(); + } + + /*! + * Sets a new allocator object for this reference array. + */ + void SetAllocator( const allocator& a ) + { + m_array.SetAllocator( a ); + } + + /*! + * Returns an immutable reference array iterator located at the specified + * array index \a i. + */ + const_iterator At( size_type i ) const + { + return m_array.At( i ); + } + + /*! + * Returns a mutable reference array iterator located at the specified + * array index \a i. + */ + iterator MutableAt( size_type i ) + { + return m_array.At( i ); + } + + /*! + * Returns a mutable iterator pointing to the same array element as the + * specified immutable iterator \a i. + * + * \warning As a side-effect of calling this function, the specified + * immutable iterator \a i may become invalid. This happens when this + * function is called for a shared array, since in this case getting a + * mutable iterator involves a deep copy of the array through an implicit + * call to EnsureUnique(). + */ + iterator MutableIterator( const_iterator i ) + { + return m_array.MutableIterator( i ); + } + + /*! + * Returns a reference to the immutable object at the specified array + * index \a i. No bounds checking is performed. + */ + const T& operator []( size_type i ) const + { + return m_array[i]; + } + + /*! + * Returns a reference to the unmodifiable first object in this reference + * array. + */ + const T& operator *() const + { + return *m_array; + } + + /*! + * Returns an immutable iterator located at the beginning of this array. + */ + const_iterator Begin() const + { + return m_array.ConstBegin(); + } + + /*! + * Returns a mutable iterator located at the beginning of this array. + */ + iterator MutableBegin() + { + return m_array.Begin(); + } + + /*! + * Returns an immutable iterator located at the end of this array. + */ + const_iterator End() const + { + return m_array.ConstEnd(); + } + + /*! + * Returns a mutable iterator located at the end of this array. + */ + iterator MutableEnd() + { + return m_array.End(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse + * beginning of this reference array. + * + * The reverse beginning corresponds to the last object in the array. + */ + const_reverse_iterator ReverseBegin() const + { + return m_array.ConstReverseBegin(); + } + + /*! + * Returns a mutable reverse iterator located at the reverse + * beginning of this reference array. + * + * The reverse beginning corresponds to the last object in the array. + */ + reverse_iterator MutableReverseBegin() + { + return m_array.ReverseBegin(); + } + + /*! + * Returns an immutable reverse iterator located at the reverse end + * of this reference array. + * + * The reverse end corresponds to a (nonexistent) object immediately before + * the first object in the array. + */ + const_reverse_iterator ReverseEnd() const + { + return m_array.ConstReverseEnd(); + } + + /*! + * Returns a mutable reverse iterator located at the reverse end of + * this reference array. + * + * The reverse end corresponds to a (nonexistent) object immediately before + * the first object in the array. + */ + reverse_iterator MutableReverseEnd() + { + return m_array.ReverseEnd(); + } + + /*! + * Returns a reference to the first unmodifiable object in this reference + * array. This function should never be called for an empty array. + */ + const T& First() const + { + return m_array.First(); + } + + /*! + * Returns a reference to the first object in this reference array. This + * function should never be called for an empty array. + */ + T& MutableFirst() + { + return m_array.First(); + } + + /*! + * Returns a reference to the last unmodifiable object in this reference + * array. This function should never be called for an empty array. + */ + const T& Last() const + { + return m_array.Last(); + } + + /*! + * Returns a reference to the last object in this reference array. This + * function should never be called for an empty array. + */ + T& MutableLast() + { + return m_array.Last(); + } + + /*! + * Ensures that the specified iterator represents a pointer stored in a + * uniquely referenced indirect array. If necessary, this function builds a + * new, uniquely referenced copy of the underlying indirect array by calling + * EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the object + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + m_array.UniquifyIterator( i ); + } + + /*! + * Ensures that the specified iterators represents a pointer stored in a + * uniquely referenced indirect array. If necessary, this function builds a + * new, uniquely referenced copy of the underlying indirect array by calling + * EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the objects at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + m_array.UniquifyIterators( i, j ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this reference sorted array to reference the same set of objects + * as another reference sorted array \a x. Returns a reference to this + * object. + */ + ReferenceSortedArray& operator =( const ReferenceSortedArray& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns a reference sorted array \a x to this reference sorted array. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Increments the reference counter of the source array's data and + * references it in this array. + */ + void Assign( const ReferenceSortedArray& x ) + { + m_array.Assign( x.m_array ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ReferenceSortedArray& operator =( ReferenceSortedArray&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another reference sorted array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( ReferenceSortedArray& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! + * Transfers data from another reference sorted array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. + */ + void Transfer( ReferenceSortedArray&& x ) + { + m_array.Transfer( std::move( x.m_array ) ); + } + + /*! + * Assigns a reference array \a x to this reference sorted array. + * + * Causes this reference sorted array to store a sorted copy of the pointers + * in the source array \a x. Sorting is performed by comparing the pointed + * objects, not the pointers. Returns a reference to this object. + */ + ReferenceSortedArray& operator =( const array_implementation& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns a reference array \a x to this reference sorted array. + * + * Causes this reference sorted array to store a sorted copy of the pointers + * in the source array \a x. Sorting is performed by comparing the pointed + * objects, not the pointers. + */ + void Assign( const array_implementation& x ) + { + m_array.Assign( x ); + Sort(); + } + + /*! + * Move assignment of a reference array. + * + * The transferred array is sorted after the assignment. Returns a reference + * to this object. + */ + ReferenceSortedArray& operator =( array_implementation&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from a reference array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. The transferred array is sorted after the assignment. + */ + void Transfer( array_implementation& x ) + { + m_array.Transfer( x ); + Sort(); + } + + /*! + * Transfers data from a reference array \a x to this object. + * + * Decrements the reference counter of the current array data, and destroys + * it if it becomes unreferenced. + * + * Transfers source array data to this object, leaving empty and invalid the + * source object \a x. The transferred array is sorted after the assignment. + */ + void Transfer( array_implementation&& x ) + { + m_array.Transfer( std::move( x ) ); + Sort(); + } + + /*! + * Replaces the contents of this reference sorted array with a sequence of + * \a n pointers equal to \a p. + * + * if \a p is \c nullptr, this function yields an empty array. + */ + void Assign( const T* p, size_type n = 1 ) + { + m_array.Assign( p, n ); + } + + /*! + * Replaces the contents of this reference sorted array with a sorted copy + * of the sequence of pointers defined by the range [i,j) of forward + * iterators. + * + * If the range [i,j) contains null pointers, these are ignored and hence + * not included in this reference array. Sorting is performed by comparing + * the pointed objects, not the pointers. + * + * \note \a i and \a j must not be iterators into this array. + */ + template + void Assign( FI i, FI j ) + { + m_array.Assign( i, j ); + Sort(); + } + + /*! + * Replaces the contents of this reference sorted array with a sorted list + * of pointers to newly created copies of the objects stored in the + * specified container \a x. This function works for both direct and + * indirect containers. + * + * Keep in mind that after calling this function (with a reference to a + * nonempty container) this array will store newly allocated objects. You + * should call Destroy() to deallocate these objects before destructing this + * reference array in order to avoid a memory leak. + */ + template + void CloneAssign( const C& x ) + { + m_array.CloneAssign( x ); + Sort(); + } + + /*! # + */ + void CloneAssign( ReferenceSortedArray& x ) + { + m_array.CloneAssign( x.m_array ); + } + + /*! # + */ + void CloneAssign( SortedArray& x ) + { + m_array.CloneAssign( x ); + } + + /*! # + */ + void CloneAssign( IndirectSortedArray& x ) + { + m_array.CloneAssign( x ); + } + + /*! + * Causes this reference sorted array to store the sequence of pointers + * defined by the range [i,j) of iterators. The previously referenced data + * structure is dereferenced and deallocated if it becomes unreferenced. The + * sequence [i,j) is sorted in ascending order by comparing the pointed + * objects. + */ + void Import( iterator i, iterator j ) + { + m_array.Import( i, j ); + Sort(); + } + + /*! + * Releases the set of pointers contained by this reference sorted array. + * + * This member function returns a pointer to the internal block of pointers + * stored in this object, after ensuring that it is uniquely referenced. + * If the array is empty, this function may return the null pointer. + * + * Before returning, this member function empties this array without + * deallocating its contained data. The caller is then responsible for + * deallocating the returned block when it is no longer required. + */ + indirect_iterator Release() + { + return m_array.Release(); + } + + /*! # + */ + void Add( const ReferenceSortedArray& x ) + { + const_iterator p = x.Begin(), q = x.End(); + for ( iterator i = Begin(); i < End() && p < q; ++i ) + if ( *p < *i ) + i = m_array.Insert( i, (T*)p++ ); + if ( p < q ) + m_array.Append( p, q ); + } + + /*! # + */ + void Add( const array_implementation& x ) + { + Add( x.Begin(), x.End() ); + } + + /*! # + */ + const_iterator Add( const T* p, size_type n = 1 ) + { + if ( p != nullptr ) + return m_array.Insert( pcl::InsertionPoint( Begin(), End(), *p ), p, n ); + return const_iterator( nullptr ); + } + + /*! # + */ + template + void Add( FI i, FI j ) + { + if ( i != j ) + { + EnsureUnique(); + for ( const_iterator l = Begin(), r = End(); ; ) + { + FI h = i; + const_iterator m = m_array.Insert( pcl::InsertionPoint( l, r, **i ), *i ); + + if ( ++i == j ) + break; + + if ( **i < **h ) + { + l = m_array.Begin(); + r = m; + } + else + { + l = m + 1; + r = m_array.End(); + } + } + } + } + + /*! + * Removes a sequence of \a n contiguous pointers starting at the specified + * location \a i in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, size_type n = 1 ) + { + m_array.Remove( i, n ); + } + + /*! + * Removes a sequence of contiguous pointers in the range [i,j) of this + * reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const_iterator i, const_iterator j ) + { + m_array.Remove( i, j ); + } + + /*! + * Removes a trailing sequence of contiguous pointers from the specified + * iterator of this reference array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator is located at or after the end of this array, + * this function does nothing. Otherwise the iterator is constrained to stay + * in the range [Begin(),End()) of existing array elements. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Truncate( const_iterator i ) + { + m_array.Truncate( i ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing pointers from + * this reference array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Shrink( size_type n = 1 ) + { + m_array.Shrink( n ); + } + + /*! + * Removes all existing pointers whose pointed objects are equal to the + * specified value \a v in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Remove( const T& v ) + { + m_array.Remove( v ); + } + + /*! + * Removes every pointer x in this reference array such that the binary + * predicate p( *x, \a v ) is true. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + template + void Remove( const T& v, BP p ) + { + m_array.Remove( v, p ); + } + + /*! + * Removes all contained pointers equal to \a p in this reference array. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void RemovePointer( const T* p ) + { + m_array.RemovePointer( p ); + } + + /*! + * Removes all pointers contained by this object, yielding an empty + * reference sorted array. + * + * If this array is empty, then calling this member function has no effect. + * + * If this array uniquely references its internal array data structure, all + * pointers contained are deallocated; otherwise its reference counter is + * decremented. Then a new, empty array data structure is created and + * uniquely referenced. + * + * Only pointers are removed by this function; the pointed objects are not + * affected in any way. + */ + void Clear() + { + m_array.Clear(); + } + + /*! + * Destroys and removes a sequence of \a n contiguous objects, starting at + * the specified location \a i in this reference sorted array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( iterator i, size_type n = 1 ) + { + m_array.Destroy( i, n ); + } + + /*! + * Destroys and removes the objects in a range [i,j) of iterators in this + * reference sorted array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning This function is potentially dangerous. If the array contains + * duplicate pointers in the specified range of iterators, this function + * will lead to a crash as a result of multiple deletions. To minimize the + * risk of multiple deletions, this function ignores the normal data sharing + * mechanism so that all objects sharing the same array data structure will + * correctly have the destroyed objects removed. However, be aware of + * potential problems if other reference or indirect containers store + * pointers to deleted objects in different data structures, which will be + * invalid after calling this function. + */ + void Destroy( iterator i, iterator j ) + { + m_array.Destroy( i, j ); + } + + /*! + * Destroys and removes all objects equal to \a v in this reference sorted + * array. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy( const T& v ) + { + m_array.Destroy( v ); + } + + /*! + * Destroys and removes every object x in this reference sorted array such + * that the binary predicate p( x, \a v ) is true. + * + * This function destroys and deallocates the pointed objects, then removes + * the corresponding pointers in this array. The array length is decreased + * by the number of destroyed objects. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + template + void Destroy( const T& v, BP p ) + { + m_array.Destroy( v, p ); + } + + /*! + * Destroys and removes all objects in this reference sorted array, yielding + * an empty array. + * + * \warning See Destroy( iterator, iterator ) for critical information on + * this member function. + */ + void Destroy() + { + m_array.Destroy(); + } + + /*! + * Ensures that this reference array has enough capacity to store \a n + * pointers. + * + * After calling this member function with \a n > 0, this object is + * guaranteed to uniquely reference its array data. + */ + void Reserve( size_type n ) + { + m_array.Reserve( n ); + } + + /*! + * Causes this reference array to allocate the exact required memory space + * to store its contained pointers. + * + * If the array has excess capacity, a new copy of its contained pointers is + * generated and stored in a newly allocated memory block that fits them + * exactly, then the previous memory block is deallocated. + * + * If the array is empty, calling this function is equivalent to Clear(). + * Note that in this case a previously allocated memory block (by a call to + * Reserve()) may also be deallocated. + */ + void Squeeze() + { + m_array.Squeeze(); + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + m_array.Fill( v ); + } + + /*! + * Calls f( const T& x ) for every unmodifiable object x in this reference + * array, successively from the first contained object to the last. + */ + template + void Apply( F f ) const + { + pcl::Apply( Begin(), End(), f ); + } + + /*! + * Returns an immutable iterator pointing to the first object x in this + * reference sorted array such that f( const T& x ) is true. Returns End() + * if such pointer does not exist. + */ + template + const_iterator FirstThat( F f ) const + { + return pcl::FirstThat( Begin(), End(), f ); + } + + /*! + * Returns an immutable iterator pointing to the last object x in this + * reference sorted array such that f( const T& x ) is true. Returns End() + * if such pointer does not exist. + */ + template + const_iterator LastThat( F f ) const + { + return pcl::LastThat( Begin(), End(), f ); + } + + /*! + * Returns the number of objects equal to \a v in this reference array. + */ + size_type Count( const T& v ) const + { + const_iterator i = pcl::BinarySearch( Begin(), End(), v ); + return (i != End()) ? pcl::InsertionPoint( i+1, End(), v ) - i : 0; + } + + /*! + * Returns the number of pointers equal to \a p stored in this reference + * array. + * + * If \a p is \c nullptr, this function \e should return zero --- or you are + * in serious trouble! + */ + size_type Count( const T* p ) const + { + return m_array.Count( p ); + } + + /*! + * Returns the number of objects in this reference array such that for each + * counted object x the binary predicate p( x, v ) returns true. + */ + template + size_type Count( const T& v, BP p ) const + { + return m_array.Count( v, p ); + } + + /*! + * Returns the number of objects in this reference array such that for each + * counted object x the unary predicate p( x ) returns true. + */ + template + size_type CountIf( UP p ) const + { + return m_array.CountIf( p ); + } + + /*! # + */ + const_iterator MinItem() const + { + return Begin(); + } + + /*! # + */ + template + const_iterator MinItem( BP p ) const + { + return pcl::MinItem( Begin(), End(), p ); + } + + /*! # + */ + const_iterator MaxItem() const + { + return IsEmpty() ? End() : End()-1; + } + + /*! # + */ + template + const_iterator MaxItem( BP p ) const + { + return pcl::MaxItem( Begin(), End(), p ); + } + + /*! # + */ + const_iterator Search( const T& v ) const + { + return pcl::BinarySearch( Begin(), End(), v ); + } + + /*! # + */ + const_iterator Search( const T* p ) const + { + return m_array.Search( p ); + } + + /*! # + */ + template + const_iterator Search( const T& v, BP p ) const + { + return pcl::LinearSearch( Begin(), End(), v, p ); + } + + /*! # + */ + const_iterator SearchLast( const T& v ) const + { + return pcl::BinarySearchLast( Begin(), End(), v ); + } + + /*! # + */ + const_iterator SearchLast( const T* p ) const + { + return m_array.SearchLast( p ); + } + + /*! # + */ + template + const_iterator SearchLast( const T& v, BP p ) const + { + return pcl::LinearSearchLast( Begin(), End(), v, p ); + } + + /*! # + */ + bool Contains( const T& v ) const + { + return Search( v ) != End(); + } + + /*! # + */ + bool Contains( const T* p ) const + { + return m_array.Contains( p ); + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const + { + return Search( v, p ) != End(); + } + + /*! # + */ + void Sort() + { + m_array.Sort(); + } + + /*! + * Exchanges two reference sorted arrays \a x1 and \a x2. + */ + friend void Swap( ReferenceSortedArray& x1, ReferenceSortedArray& x2 ) + { + pcl::Swap( x1.m_array, x2.m_array ); + } + + /*! + * Returns true only if two reference sorted arrays \a x1 and \a x2 are + * equal. + * \ingroup array_relational_operators + */ + friend bool operator ==( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 ) + { + return x1.m_array == x2.m_array; + } + + /*! + * Returns true only if a reference sorted array \a x1 is equal to a + * reference array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const ReferenceSortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array == x2; + } + + /*! + * Returns true only if a reference array \a x1 is equal to a reference + * sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const array_implementation& x1, const ReferenceSortedArray& x2 ) + { + return x1 == x2.m_array; + } + + /*! + * Returns true only if a reference sorted array \a x1 precedes another + * reference sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 ) + { + return x1.m_array < x2.m_array; + } + + /*! + * Returns true only if a reference sorted array \a x1 precedes a reference + * array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const ReferenceSortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array < x2; + } + + /*! + * Returns true only if a reference array \a x1 precedes a reference sorted + * array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const array_implementation& x1, const ReferenceSortedArray& x2 ) + { + return x1 < x2.m_array; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each element in this array, this function appends a string + * representation (known as a \e token) to the target string \a s. If the + * array contains more than one element, successive tokens are separated + * with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + return m_array.ToSeparated( s, separator ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each element x in this array, this function appends a string + * representation (known as a \e token) to the target string \a s by + * calling the \a append function: + * + *\code append( s, S( x ) ); \endcode + * + * If the array contains more than one element, successive tokens are + * separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + return m_array.ToSeparated( s, separator, append ); + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return m_array.ToCommaSeparated( s ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return m_array.ToSpaceSeparated( s ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return m_array.ToTabSeparated( s ); + } + + /*! + * Generates a newline-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\n' ); \endcode + */ + template + S& ToNewLineSeparated( S& s ) const + { + return m_array.ToNewLineSeparated( s ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this reference + * array. + * + * This function calls pcl::Hash64() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return m_array.Hash64( seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this reference + * array. + * + * This function calls pcl::Hash32() for the internal array of pointers, + * \e not for the pointed objects. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const + { + return m_array.Hash32( seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this reference array. + * This function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const + { + return Hash64( seed ); + } + +private: + + array_implementation m_array; +}; + +// ---------------------------------------------------------------------------- + +/*! + * Adds a non-null pointer \a p to a reference sorted array \a x. Returns a + * reference to the left-hand reference sorted array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray& x, const V* p ) +{ + x.Add( static_cast( p ) ); + return x; +} + +/*! + * Adds a non-null pointer \a p to a temporary reference sorted array \a x. + * Returns a reference to the left-hand reference sorted array. + * + * A pointer to the template argument type V must be statically castable to T*. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray&& x, const V* p ) +{ + x.Add( static_cast( p ) ); + return x; +} + +/*! + * Adds a reference sorted array \a x2 to a reference sorted array \a x1. + * Returns a reference to the left-hand reference sorted array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray& x1, const ReferenceSortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds a reference sorted array \a x2 to a temporary reference sorted array + * \a x1. Returns a reference to the left-hand reference sorted array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray&& x1, const ReferenceSortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds a reference array \a x2 to a reference sorted array \a x1. Returns a + * reference to the left-hand reference sorted array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray& x1, const ReferenceArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds a reference array \a x2 to a temporary reference sorted array \a x1. + * Returns a reference to the left-hand reference sorted array. + * \ingroup array_insertion_operators + */ +template inline +ReferenceSortedArray& operator <<( ReferenceSortedArray&& x1, const ReferenceArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ReferenceSortedArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ReferenceSortedArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Relational.h b/3rdparty/include/pcl/Relational.h new file mode 100644 index 0000000..6a4b30a --- /dev/null +++ b/3rdparty/include/pcl/Relational.h @@ -0,0 +1,129 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Relational.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Relational_h +#define __PCL_Relational_h + +/// \file pcl/Relational.h + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup generic_relational_operators Generic Relational Operators + * + * This section defines the template operator functions not equal to, + * less than or equal, greater than, and greater than or + * equal. + * + * For applicability of these generic operators, the following conditions are + * assumed for the template argument type T: + * + * \li For the != operator, there must be a meaningful == operator for the + * type T. + * + * \li For the <=, > and >= operators, there must be a meaningful < operator + * for the type T. + */ + +/*! + * Returns true iff two objects \a a and \a b are not equal. + * \ingroup generic_relational_operators + */ +template inline +bool operator !=( const T1& a, const T2& b ) +{ + return !(a == b); +} + +/*! + * Returns true iff an object \a a is less than or equal to another object \a b. + * \ingroup generic_relational_operators + */ +template inline +bool operator <=( const T1& a, const T2& b ) +{ + return !(b < a); +} + +/*! + * Returns true iff an object \a a is greater than another object \a b. + * \ingroup generic_relational_operators + */ +template inline +bool operator >( const T1& a, const T2& b ) +{ + return b < a; +} + +/*! + * Returns true iff an object \a a is greater than or equal to another object + * \a b. + * \ingroup generic_relational_operators + */ +template inline +bool operator >=( const T1& a, const T2& b ) +{ + return !(a < b); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Relational_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Relational.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Resample.h b/3rdparty/include/pcl/Resample.h new file mode 100644 index 0000000..a527038 --- /dev/null +++ b/3rdparty/include/pcl/Resample.h @@ -0,0 +1,406 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Resample.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Resample_h +#define __PCL_Resample_h + +/// \file pcl/Resample.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + \namespace pcl::ResizeMode + \brief Resizing modes for the Resample process. + + + + + + + + +
ResizeMode::RelativeDimensions Resize relative to current image dimensions
ResizeMode::AbsolutePixels Resize to absolute dimensions in pixels
ResizeMode::AbsoluteCentimeters Resize to absolute dimensions in centimeters
ResizeMode::AbsoluteInches Resize to absolute dimensions in inches
ResizeMode::ForceArea Force the total number of pixels and keep existing aspect ratio
ResizeMode::Default Default resizing mode, equal to ResizeMode::RelativeDimensions
+*/ +namespace ResizeMode +{ + enum value_type + { + RelativeDimensions, // Resize relative to current image dimensions + AbsolutePixels, // ... to absolute dimensions in pixels + AbsoluteCentimeters, // ... to absolute dimensions in centimeters + AbsoluteInches, // ... to absolute dimensions in inches + ForceArea, // Force number of pixels, keep aspect ratio + NumberOfResizeModes, + Default = RelativeDimensions + }; +} + +// ---------------------------------------------------------------------------- + +/*! + \namespace pcl::AbsoluteResizeMode + \brief Absolute resizing modes for the Resample process. + + Absolute resize modes are applicable only when the main resize mode is + ResizeMode::AbsolutePixels, ResizeMode::AbsoluteCentimeters or + ResizeMode::AbsoluteInches. + + + + preserve existing aspect ratio + preserve existing aspect ratio + equal to AbsoluteResizeMode::ForceWidthAndHeight +
AbsoluteResizeMode::ForceWidthAndHeight Force both image dimensions
AbsoluteResizeMode::ForceWidth Force width
AbsoluteResizeMode::ForceHeight Force height
AbsoluteResizeMode::Default Default absolute resizing mode
+*/ +namespace AbsoluteResizeMode +{ + enum value_type + { + ForceWidthAndHeight, // Force both dimensions + ForceWidth, // Force width, preserve aspect ratio + ForceHeight, // Force height, preserve aspect ratio + NumberOfAbsoluteResizeModes, + Default = ForceWidthAndHeight + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Resample + * \brief %Image resampling algorithm. + * + * ### TODO: Write a detailed description for %Resample + */ +class PCL_CLASS Resample : public InterpolatingGeometricTransformation, + public ImageResolution, + public ParallelProcess +{ +public: + + /*! + * Represents a resizing mode. + */ + typedef ResizeMode::value_type resize_mode; + + /*! + * Represents an absolute resizing mode. + */ + typedef AbsoluteResizeMode::value_type abs_resize_mode; + + /*! + * Constructs a default %Resample object using the specified pixel + * interpolation \a p and a single scaling ratio for both axes. + * + * The specified pixel interpolation object \a p must remain valid while + * this object exists. + * + * The resizing mode is set relative to current image dimensions. + */ + Resample( PixelInterpolation& p, double scale = 1.0 ) + : InterpolatingGeometricTransformation( p ) + , m_xSize( scale ) + , m_ySize( scale ) + { + } + + /*! + * Constructs a default %Resample object using the specified pixel + * interpolation \a p and separate scaling ratios for the X and Y axes, + * \a scaleX and \a scaleY respectively. + * + * The specified pixel interpolation object \a p must remain valid while + * this object exists. + * + * The resizing mode is set relative to current image dimensions. + */ + Resample( PixelInterpolation& p, double scaleX, double scaleY ) + : InterpolatingGeometricTransformation( p ) + , m_xSize( scaleX ) + , m_ySize( scaleY ) + { + } + + /*! + * Copy constructor. + */ + Resample( const Resample& ) = default; + + /*! + * Gets the resampled image \a width and \a height. + * + * Use GetSizes(), XSize() and YSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + void GetSizes( double& width, double& height ) const + { + width = m_xSize; height = m_ySize; + } + + /*! + * Returns the resampled image width. + * + * Use GetSizes(), XSize() and YSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + double XSize() const + { + return m_xSize; + } + + /*! + * Returns the resampled image height. + * + * Use GetSizes(), XSize() and YSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + double YSize() const + { + return m_ySize; + } + + /*! + * Sets the resampled image \a width and \a height. + * + * Use SetSizes(), SetXSize() and SetYSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + void SetSizes( double width, double height ) + { + m_xSize = width; m_ySize = height; + } + + /*! + * Sets the resampled image \a width. + * + * Use SetSizes(), SetXSize() and SetYSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + void SetXSize( double width ) + { + m_xSize = width; + } + + /*! + * Sets the resampled image \a height. + * + * Use SetSizes(), SetXSize() and SetYSize() semantics to define a %Resample + * instance that resizes images to fixed dimensions. + */ + void SetYSize( double height ) + { + m_ySize = height; + } + + /*! + * Gets the scaling factors \a sx and \a sy for the X and Y axes, + * respectively. + * + * Use GetScalingFactors(), XScale() and YScale() semantics to define a + * %Resample instance that resizes images relative to their current + * dimensions. + */ + void GetScalingFactors( double& sx, double& sy ) const + { + GetSizes( sx, sy ); + } + + /*! + * Returns the horizontal scaling factor. + * + * Use GetScalingFactors(), XScale() and YScale() semantics to define a + * %Resample instance that resizes images relative to their current + * dimensions. + */ + double XScale() const + { + return XSize(); + } + + /*! + * Returns the vertical scaling factor. + * + * Use GetScalingFactors(), XScale() and YScale() semantics to define a + * %Resample instance that resizes images relative to their current + * dimensions. + */ + double YScale() const + { + return YSize(); + } + + /*! + * Sets the scaling factors \a sx and \a sy for the X and Y axes, + * respectively. + * + * Use SetScalingFactors(), SetXScale() and SetYScale() semantics to define + * a %Resample instance that resizes images relative to their current + * dimensions. + */ + void SetScalingFactors( double sx, double sy ) + { + SetSizes( sx, sy ); + } + + /*! + * Sets the horizontal scaling factor. + * + * Use SetScalingFactors(), SetXScale() and SetYScale() semantics to define + * a %Resample instance that resizes images relative to their current + * dimensions. + */ + void SetXScale( double sx ) + { + SetXSize( sx ); + } + + /*! + * Sets the vertical scaling factor. + * + * Use SetScalingFactors(), SetXScale() and SetYScale() semantics to define + * a %Resample instance that resizes images relative to their current + * dimensions. + */ + void SetYScale( double sy ) + { + SetYSize( sy ); + } + + /*! + * Returns the current resize mode. + */ + resize_mode Mode() const + { + return m_mode; + } + + /*! + * Returns true iff this %Resample object resizes images relative to their + * current dimensions, i.e. when Mode() is equal to + * ResizeMode::RelativeDimensions. + */ + bool IsRelative() const + { + return m_mode == ResizeMode::RelativeDimensions; + } + + /*! + * Returns true iff this %Resample object resizes images to fixed dimensions, + * i.e. when Mode() is not equal to ResizeMode::RelativeDimensions. + */ + bool IsAbsolute() const + { + return !IsRelative(); + } + + /*! + * Sets the current resize mode. + */ + void SetMode( resize_mode mode ) + { + m_mode = mode; + } + + /*! + * Returns the current absolute resizing mode. The absolute resizing mode is + * only applied when Mode() is not equal to ResizeMode::RelativeDimensions. + */ + abs_resize_mode AbsMode() const + { + return m_absMode; + } + + /*! + * Sets the absolute resizing mode. The absolute resizing mode is only + * applied when Mode() is not equal to ResizeMode::RelativeDimensions. + */ + void SetAbsMode( abs_resize_mode absMode ) + { + m_absMode = absMode; + } + + /*! + */ + void GetNewSizes( int& width, int& height ) const override; + +protected: + + double m_xSize = 1.0; + double m_ySize = 1.0; + resize_mode m_mode = ResizeMode::Default; + abs_resize_mode m_absMode = AbsoluteResizeMode::Default; + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Resample_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Resample.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/RobustChauvenetRejection.h b/3rdparty/include/pcl/RobustChauvenetRejection.h new file mode 100644 index 0000000..b28a7f6 --- /dev/null +++ b/3rdparty/include/pcl/RobustChauvenetRejection.h @@ -0,0 +1,369 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/RobustChauvenetRejection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_RobustChauvenetRejection_h +#define __PCL_RobustChauvenetRejection_h + +/// \file pcl/RobustChauvenetRejection.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class RobustChauvenetRejection + * \brief Robust Chauvenet outlier rejection algorithm + * + * This class implements a robust iterative sigma clipping outlier rejection + * algorithm with Chauvenet rejection criterion. The design and implementation + * are based on: + * + * Maples, M. P., Reichart, D. E. et al., Robust Chauvenet Outlier + * Rejection, Astrophysical Journal Supplement Series, 2018, ApJS, 238, + * A2, 1-49. + */ +class PCL_CLASS RobustChauvenetRejection +{ +public: + + /*! + * Default constructor. + */ + RobustChauvenetRejection() = default; + + /*! + * Copy constructor. + */ + RobustChauvenetRejection( const RobustChauvenetRejection& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~RobustChauvenetRejection() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + RobustChauvenetRejection& operator =( const RobustChauvenetRejection& ) = default; + + /*! + * Returns the limit for the altered Chauvenet rejection criterion. + * + * The larger the value of this parameter, the more pixels will be rejected + * by the Robust Chauvenet Rejection algorithm. The original Chauvenet + * rejection criterion is N*P(x > |z|) < 0.5, where N is the number of + * measurements and P() represents the probability of x being more than z + * standard deviations from the mean. This parameter alters the rejection + * criterion by replacing 0.5 with an arbitrary limit in the [0,1] range, in + * order to make the algorithm controllable. + * + * The default rejection limit is 0.5, that is, the original Chauvenet + * rejection criterion is applied by default. + */ + float RejectionLimit() const + { + return m_rejectionLimit; + } + + /*! + * Sets the limit for the altered Chauvenet rejection criterion. See + * RejectionLimit() for a description of this parameter. + */ + void SetRejectionLimit( float r ) + { + PCL_PRECONDITION( r > 0 && r < 1 ) + m_rejectionLimit = Range( r, 0.0F, 1.0F ); + } + + /*! + * Returns the minimum length to enable bulk rejection. + * + * For data sets smaller than the value of this parameter the robust + * Chauvenet rejection routine rejects a single value at each iteration. + * This improves stability and accuracy of the rejection process. + * + * For larger data sets, a bulk rejection procedure is enabled for + * performance reasons. The larger the length of the input array with + * respect to this parameter, the more values will be rejected at each + * iteration, which accelerates the process and allows this implementation + * to handle even very large data sets of hundreds of thousands of items. + * + * The default large sample size is 20,000. + */ + int LargeSampleSize() const + { + return m_largeSampleSize; + } + + /*! + * Sets the minimum length to enable bulk rejection. See LargeSampleSize() + * for a description of this parameter. + */ + void SetLargeSampleSize( int n ) + { + m_largeSampleSize = Max( 1, n ); + } + + /*! + * Performs a Robust Chauvenet Rejection procedure for the specified data. + * + * \param[out] i Reference to a variable where the function will + * store the zero-based index of the first non-rejected + * element in the sorted \a data array. + * + * \param[out] j Reference to a variable where the function will + * store the zero-based index of the end of the + * non-rejected sequence in the sorted \a data array. + * + * \param[out] mean Reference to a variable where the function will + * store the mean of the subset of non-rejected + * elements in the \a data array. + * + * \param[out] sigma Reference to a variable where the function will + * store the standard deviation of the subset of + * non-rejected elements in the \a data array. + * + * \param[in,out] data Random-access container of objects to be analyzed + * and rejected. On output, the elements in this + * container will be sorted in ascending order. + * + * On output, the subset of non-rejected array elements is defined by the + * range [i,j) of zero-based array indices relative to the beginning of the + * \a data container. The elements in the \a data container will be sorted + * in ascending order. + * + * This function will perform a three-stage iterative rejection procedure, + * applying a Chauvenet rejection criterion to reject one or more array + * elements at each iteration (depending on the length of the input + * array and the value of the LargeSampleSize() parameter), in succesive + * stages of decreasing robustness/increasing precision. On output, the + * robust location and scale parameters of the non-rejected subset will be + * returned in the specified \a mean and \a sigma variables, respectively. + * + * The template parameter C represents a vector or array-like container with + * indexed random access. If T is the type of an element in a container of + * type C, the following operators must be implicitly or explicitly defined: + * + * \code + * T::operator double() const; + * bool T::operator <( const T& ) const; + * \endcode + * + * The type represented by the I template parameter should correspond to an + * integral scalar type such as int, unsigned, etc. + * + * \note This function is thread-safe. + */ + template + void PerformRejection( I& i, I& j, double& mean, double& sigma, C& data ) const + { + data.Sort(); + i = I( 0 ); + j = I( data.Length() ); + + for ( int phase = 0; phase < 3; ++phase ) + for ( ;; ) + { + switch ( phase ) + { + case 0: // + robustness / - precision + mean = Median( data.At( i ), data.At( j ) ); + sigma = LineFitDeviation( data, i, j, mean ); + break; + case 1: // = robustness / = precision + mean = Median( data.At( i ), data.At( j ) ); + sigma = SampleDeviation( data, i, j, mean ); + break; + case 2: // - robustness / + precision + mean = Mean( data.At( i ), data.At( j ) ); + sigma = StdDev( data.At( i ), data.At( j ), mean ); + break; + } + + if ( 1 + sigma == 1 ) + return; + + I n = j - i; + if ( n < I( 3 ) ) + return; + + if ( n <= I( m_largeSampleSize ) + I( m_largeSampleSize >> 1 ) ) + { + /* + * Optimal single-pixel rejection iteration for 'small' samples. + */ + double d0 = n*QF( (mean - data[i])/sigma ); + double d1 = n*QF( (data[j-1] - mean)/sigma ); + if ( d0 >= m_rejectionLimit ) + if ( d1 >= m_rejectionLimit ) + break; + if ( d1 < d0 ) + --j; + else + ++i; + } + else + { + /* + * Accelerated bulk rejection for large samples. + */ + int nc = RoundInt( double( n )/m_largeSampleSize ); + int c = 0; + for ( int it = 0; it < nc && n*QF( (mean - data[i])/sigma ) < m_rejectionLimit; ++i, ++c, ++it ) {} + for ( int it = 0; it < nc && n*QF( (data[j-1] - mean)/sigma ) < m_rejectionLimit; --j, ++c, ++it ) {} + if ( c == 0 ) + break; + } + } + } + + /*! + * Performs a Robust Chauvenet Rejection procedure. + * + * This operator is equivalent to the PerformRejection() const member + * function. + * + * \note This function is thread-safe. + */ + template + void operator()( I& i, I& j, double& mean, double& sigma, C& data ) const + { + return PerformRejection( i, j, mean, sigma, data ); + } + +private: + + float m_rejectionLimit = 0.5; // 0.5 = Chauvenet rejection criterion + int m_largeSampleSize = 20000; + + /* + * The Q-function: the probability for a value from a normal distribution of + * being more than x standard deviations from the mean. + */ + static double QF( double x ) + { + return 0.5*(1 - Erf( x/Const::sqrt2() )); + } + + /* + * Correction factor for 68.3-percentile deviations to avoid overaggressive + * rejection for small samples. + */ + template + static double FN( I N ) + { + return 1/(1 - 2.9442*Pow( double( N ), -1.073 )); + } + + /* + * The 68.3-percentile value from the distribution of absolute deviations. + */ + template + static double SampleDeviation( const C& R, I i, I j, double m ) + { + int N = int( j - i ); + Vector D( N ); + for ( int k = 0; i < j; ++i, ++k ) + D[k] = Abs( double( R[i] ) - m ); + return FN( N ) * *pcl::Select( D.Begin(), D.End(), TruncInt( 0.683*D.Length() ) ); + } + + /* + * 68.3-percentile deviation by fitting a zero-intercept line to the vector + * of absolute differences. + */ + template + static double LineFitDeviation( const C& R, I i, I j, double m ) + { + int N = int( j - i ); + int n = int( 0.683*N + 0.317 ); + if ( n < 8 ) + return SampleDeviation( R, i, j, m ); + + Vector y( N ); + int k = 0; + for ( I ii = i; ii < j; ++ii, ++k ) + y[k] = Abs( double( R[ii] ) - m ); + y.Sort(); + y = Vector( y.Begin(), n ); + + Vector x( n ); + for ( int i = 0; i < n; ++i ) + x[i] = Const::sqrt2() * ErfInv( (i + 1 - 0.317)/N ); + + double s; + LinearFit f( x, y ); + if ( f.IsValid() ) + s = FN( N ) * f( 1.0 ); + else + s = SampleDeviation( R, i, j, m ); + + return s; + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_RobustChauvenetRejection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/RobustChauvenetRejection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Rotate.h b/3rdparty/include/pcl/Rotate.h new file mode 100644 index 0000000..d79837f --- /dev/null +++ b/3rdparty/include/pcl/Rotate.h @@ -0,0 +1,247 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Rotate.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Rotate_h +#define __PCL_Rotate_h + +#include + +#include +#include + +// Template formal parameters: +// +// FI Forward iterator +// BI Bidirectional iterator +// RI Random access iterator +// UP Unary predicate +// BP Binary predicate +// T Item type +// F Function + +// ### TODO: Document this file. + +namespace pcl +{ + +// ---------------------------------------------------------------------------- +// void Reverse( BI, BI ) +// ---------------------------------------------------------------------------- + +template inline +void Reverse( BI i, BI j ) +{ + __reverse__( i, j, IteratorClass( i ) ); +} + +template inline +void __reverse__( BI i, BI j, BidirectionalIterator ) +{ + for ( ; i != j && i != --j; ++i ) + Swap( *i, *j ); +} + +template inline +void __reverse__( RI i, RI j, RandomAccessIterator ) +{ + if ( i < j ) + for ( ; i < --j; ++i ) + Swap( *i, *j ); +} + +// ---------------------------------------------------------------------------- +// void Rotate( FI, FI, FI ) +// ---------------------------------------------------------------------------- + +template inline +void Rotate( FI i, FI m, FI j ) +{ + if ( m != i && m != j ) + __rotate__( i, m, j, IteratorClass( i ) ); +} + +template inline +void __rotate__( FI i, FI m, FI j, ForwardIterator ) +{ + for ( FI k = m; ; ) + { + Swap( *i, *k ); + if ( ++i == m ) + if ( ++k == j ) + break; + else + m = k; + else if ( ++k == j ) + k = m; + } +} + +template inline +void __rotate__( BI i, BI m, BI j, BidirectionalIterator ) +{ + Reverse( i, m ); + Reverse( m, j ); + Reverse( i, j ); +} + +template inline +void __rotate__( RI i, RI m, RI j, RandomAccessIterator ) +{ + __rotate_ri__( i, m, j, ItemType( i ) ); +} + +template inline +void __rotate_ri__( RI i, RI m, RI j, const T* ) +{ + distance_type d = m-i; + distance_type n = j-i; + + for ( distance_type a = d; a != 0; ) + { + distance_type b = n % a; + n = a; + a = b; + } + + if ( n < j-i ) + for ( ; 0 < n; --n ) + { + RI x = i+n; + RI y = x; + RI z = y+d; + if ( z == j ) + z = i; + + T v = *x; + + while ( z != x ) + { + *y = *z; + y = z; + z = (d < j-z) ? z+d : i+(d-(j-z)); + } + + *y = v; + } +} + +// ---------------------------------------------------------------------------- +// void Shift( FI, FI, FI, T ) +// void ShiftLeft( FI, FI, FI, T ) +// ---------------------------------------------------------------------------- + +template inline +void Shift( FI i, FI m, FI j, const T& v ) +{ + if ( m != i ) + { + for ( ; m != j; ++m, ++i ) + *i = *m; + for ( ; i != j; ++i ) + *i = v; + } +} + +template inline +void ShiftLeft( FI i, FI m, FI j, const T& v ) +{ + Shift( i, m, j, v ); +} + +// ---------------------------------------------------------------------------- +// void ShiftRight( FI, FI, FI, T ) +// ---------------------------------------------------------------------------- + +template inline +void ShiftRight( FI i, FI m, FI j, const T& v ) +{ + if ( i != j && m != j ) + __shift_right__( i, m, j, v, IteratorClass( i ) ); +} + +template inline +void __shift_right__( FI i, FI m, FI j, const T& v, ForwardIterator ) +{ + do + { + if ( m != i ) + { + FI k = i; + do + Swap( *++k, *i ); + while ( k != m ); + *m = *i; + } + + *i = v; + ++i; + } + while ( ++m != j ); +} + +template inline +void __shift_right__( BI i, BI m, BI j, const T& v, BidirectionalIterator ) +{ + while ( m != i ) + *--j = *--m; + do + *m = v; + while ( ++m != j ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Rotate_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Rotate.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Rotation.h b/3rdparty/include/pcl/Rotation.h new file mode 100644 index 0000000..e91fa7d --- /dev/null +++ b/3rdparty/include/pcl/Rotation.h @@ -0,0 +1,272 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Rotation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Rotation_h +#define __PCL_Rotation_h + +/// \file pcl/Rotation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Rotation + * \brief %Image rotation algorithm. + * + * ### TODO: Write a detailed description for %Rotation + */ +class PCL_CLASS Rotation : public InterpolatingGeometricTransformation, + public ParallelProcess +{ +public: + + /*! + * Constructs a new %Rotation object. + * + * \param p Reference to a pixel interpolation, which must remain + * valid while this object exists. + * + * \param angle Rotation angle in radians + * + * \param cx Horizontal coordinate of the center of rotation, measured + * in pixels in the image coordinate system. + * + * \param cy Vertical coordinate of the center of rotation, measured + * in pixels in the image coordinate system. + */ + Rotation( PixelInterpolation& p, double angle = 0, double cx = 0, double cy = 0 ) + : InterpolatingGeometricTransformation( p ) + , m_angle( angle ) + , m_center( cx, cy ) + { + } + + /*! + * Constructs a new %Rotation object. + * + * \param p Reference to a pixel interpolation, which must remain + * valid while this object exists. + * + * \param angle Rotation angle in radians + * + * \param center Coordinates of the center of rotation, measured in pixels + * in the image coordinate system. + */ + Rotation( PixelInterpolation& p, double angle, const DPoint& center ) + : InterpolatingGeometricTransformation( p ) + , m_angle( angle ) + , m_center( center ) + { + } + + /*! + * Copy constructor. + */ + Rotation( const Rotation& ) = default; + + /*! + * Returns the rotation angle in radians. + */ + double Angle() const + { + return m_angle; + } + + /*! + * Sets the rotation angle in radians. + */ + void SetAngle( double rads ) + { + m_angle = rads; + } + + /*! + * Returns the center of rotation. The returned point coordinates are + * measured in pixels in the image coordinate system. + */ + DPoint Center() const + { + return m_center; + } + + /*! + * Returns the horizontal coordinate of the center of rotation, measured in + * pixels in the image coordinate system. + */ + double CenterX() const + { + return m_center.x; + } + + /*! + * Returns the vertical coordinate of the center of rotation, measured in + * pixels in the image coordinate system. + */ + double CenterY() const + { + return m_center.y; + } + + /*! + * Sets the center of rotation. The specified \a center point coordinates + * must be expressed in pixels in the image coordinate system. + */ + void SetCenter( const DPoint& center ) + { + m_center = center; + } + + /*! + * Sets the center of rotation to the specified coordinates \a xc and \a yc, + * which must be expressed in pixels in the image coordinate system. + */ + void SetCenter( double xc, double yc ) + { + m_center.x = xc; m_center.y = yc; + } + + /*! + * Returns true iff this transformation will preserve the entire target + * image without clipping any pixels after rotating it. + * + * An unclipped rotation ignores the specified rotation center coordinates + * (see CenterX() and CenterY(), as well as the class constructor) and + * rotates images with respect to their geometric centers. To accommodate + * all rotated pixels in the result, the unclipped rotated image will always + * be bigger than the original, except for the trivial cases of rotations by + * 0 and 180 degrees. + */ + bool IsUnclipped() const + { + return m_unclipped; + } + + /*! + * Enables unclipped rotations for this object. See IsUnclipped() for + * information on unclipped rotations. + */ + void EnableUnclippedRotation( bool enable = true ) + { + m_unclipped = enable; + } + + /*! + * Disables unclipped rotations for this object. See IsUnclipped() for + * information on unclipped rotations. + */ + void DisableUnclippedRotation( bool disable = true ) + { + EnableUnclippedRotation( !disable ); + } + + /*! + * Returns the current vector of per-channel filling values for uncovered + * image regions. + * + * See the documentation for SetFillValues() for more information. + */ + const DVector& FillValues() const + { + return m_fillValues; + } + + /*! + * Sets a vector of per-channel filling values for uncovered image regions. + * + * Uncovered regions result when an image is rotated by non-orthogonal + * angles. + * + * By default, there are no filling values defined (and hence the returned + * vector is empty by default). When the %Rotation instance is executed and + * a filling value is not defined for a channel of the target image, + * uncovered regions are filled with the minimum sample value in the native + * range of the image (usually zero). + */ + void SetFillValues( const DVector& fillValues ) + { + m_fillValues = fillValues; + } + + /*! + */ + void GetNewSizes( int& width, int& height ) const override; + +protected: + + double m_angle = 0; // radians + bool m_unclipped = false; + DPoint m_center = DPoint( 0 ); + DVector m_fillValues; + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Rotation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Rotation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SVG.h b/3rdparty/include/pcl/SVG.h new file mode 100644 index 0000000..ac3b501 --- /dev/null +++ b/3rdparty/include/pcl/SVG.h @@ -0,0 +1,259 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SVG.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SVG_h +#define __PCL_SVG_h + +/// \file pcl/SVG.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SVG + * \brief Scalable %Vector %Graphics generation. + * + * The %SVG class performs generation of Scalable %Vector %Graphics output. + * Generated %SVG data can be sent to either a disk file or to a memory buffer. + * The Bitmap class can be used to render %SVG objects as images. + * + * \sa Graphics, Bitmap + */ +class PCL_CLASS SVG : public UIObject +{ +public: + + /*! + * Constructs an %SVG object that will send graphics output to a file at the + * specified \a filePath. + * + * The optional \a width and \a height values, if nonzero, will be written + * as the corresponding attributes of the root <svg> XML element. + */ + SVG( const String& filePath, int width = 0, int height = 0 ); + + /*! + * Constructs an %SVG object that will send graphics output to a memory + * buffer. + * + * The optional \a width and \a height values, if nonzero, will be written + * as the corresponding attributes of the <svg> XML element. + */ + SVG( int width = 0, int height = 0 ); + + /*! + * Destroys an %SVG object. + */ + virtual ~SVG() + { + } + + /*! + * Returns a reference to a null %SVG instance. A null %SVG does not + * correspond to an existing SVG object in the PixInsight core application. + */ + static SVG& Null(); + + /*! + * Obtains the dimensions (width, height) of this %SVG object in pixels. + */ + void GetDimensions( int& width, int& height ) const; + + /*! + * Sets the dimensions of this %SVG object, width and height in pixels. + */ + void SetDimensions( int width, int height ) const; + + /*! + * Returns the width of this %SVG object. + */ + int Width() const + { + int w, dum; GetDimensions( w, dum ); return w; + } + + /*! + * Returns the height of this %SVG object. + */ + int Height() const + { + int dum, h; GetDimensions( dum, h ); return h; + } + + /*! + * Returns the bounding rectangle of this %SVG object. The returned + * rectangle is equal to %Rect( 0, 0, Width(), Height() ). + */ + Rect Bounds() const + { + int w, h; GetDimensions( w, h ); return Rect( w, h ); + } + + /*! + * Returns the viewBox attribute of this %SVG object. The viewBox defines a + * clipping rectangle for graphics output. It can be useful when an %SVG + * drawing will be used as an element of a larger drawing. + */ + DRect ViewBox() const; + + /*! + * Sets the viewBox attribute of this %SVG object. + * + * \param x0 Left coordinate of the viewBox rectangle. + * \param y0 Upper coordinate of the viewBox rectangle. + * \param x1 Right coordinate of the viewBox rectangle. + * \param y1 Bottom coordinate of the viewBox rectangle. + * + * The viewBox defines a clipping rectangle for graphics output. It can be + * useful when an %SVG drawing will be used as an element of a larger drawing. + */ + void SetViewBox( double x0, double y0, double x1, double y1 ); + + /*! + * Sets the viewBox attribute of this %SVG object to the specified + * rectangle \a r. + */ + template + void SetViewBox( const GenericRectangle& r ) + { + SetViewBox( double( r.x0 ), double( r.y0 ), double( r.x1 ), double( r.y1 ) ); + } + + /*! + * Returns the resolution attribute of this %SVG object in dots per inch. + */ + int Resolution() const; + + /*! + * Sets the resolution attribute of this %SVG object in dots per inch. + */ + void SetResolution( int r ); + + /*! + * Returns the output file path of this %SVG object. If this object sends + * its graphics output to a memory buffer, this function returns an empty + * string. + */ + String FilePath() const; + + /*! + * Returns a copy of the output data buffer generated by this %SVG object + * as a dynamic array of bytes. If this object sends graphics output to a + * file buffer, or if a Graphics object is still painting it, this function + * returns an empty array. + */ + ByteArray Data() const; + + /*! + * Returns the title attribute of this %SVG object. + */ + String Title() const; + + /*! + * Sets the title attribute of this %SVG object. + * + * If no specific value is set by a call to this function, a default title + * attribute is set to "PixInsight SVG Document" by the PixInsight core + * application. + */ + void SetTitle( const String& title ); + + /*! + * Returns the description attribute of this %SVG object. + */ + String Description() const; + + /*! + * Sets the description attribute of this %SVG object. + * + * If no specific value is set by a call to this function, a default + * description attribute is set to "Generated with " plus a string + * representing the version of the PixInsight core application. + */ + void SetDescription( const String& desc ); + + /*! + * Returns true iff this %SVG instance is being actively painted by a + * Graphics object. + */ + bool IsPainting() const; + +protected: + + SVG( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class GraphicsContextBase; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_SVG_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SVG.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ScrollBox.h b/3rdparty/include/pcl/ScrollBox.h new file mode 100644 index 0000000..efc07a9 --- /dev/null +++ b/3rdparty/include/pcl/ScrollBox.h @@ -0,0 +1,664 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ScrollBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ScrollBox_h +#define __PCL_ScrollBox_h + +/// \file pcl/ScrollBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ScrollBox + * \brief Client-side interface to a PixInsight %ScrollBox control. + * + * ### TODO: Write a detailed description for %ScrollBox. + */ +class PCL_CLASS ScrollBox : public Frame +{ +public: + + /*! + * Constructs a %ScrollBox as a child control of \a parent. + */ + ScrollBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %ScrollBox control. + */ + virtual ~ScrollBox() + { + } + + /*! + * Returns true iff the horizontal scroll bar is currently visible on this + * scroll box. + */ + bool IsHorizontalScrollBarVisible() const; + + /*! + * Returns true iff the vertical scroll bar is currently visible on this + * scroll box. + */ + bool IsVerticalScrollBarVisible() const; + + /*! + * Forces visibility of scroll bars. + * + * \param showHorz Visibility of the horizontal scroll bar. + * \param showVert Visibility of the vertical scroll bar. + */ + void ShowScrollBars( bool showHorz = true, bool showVert = true ); + + /*! + * Forces visibility of scroll bars. + * + * This is a convenience member function, equivalent to + * ShowScrollBars( !hideHorz, !hideVert ) + */ + void HideScrollBars( bool hideHorz = true, bool hideVert = true ) + { + ShowScrollBars( !hideHorz, !hideVert ); + } + + /*! + * Forces visibility of the horizontal scroll bar. + * + * This is a convenience member function, equivalent to + * ShowScrollBars( show, IsVerticalScrollBarVisible() ) + */ + void ShowHorizontalScrollBar( bool show = true ) + { + ShowScrollBars( show, IsVerticalScrollBarVisible() ); + } + + /*! + * Forces visibility of the horizontal scroll bar. + * + * This is a convenience member function, equivalent to + * ShowHorizontalScrollBar( !hide ) + */ + void HideHorizontalScrollBar( bool hide = true ) + { + ShowHorizontalScrollBar( !hide ); + } + + /*! + * Forces visibility of the vertical scroll bar. + * + * This is a convenience member function, equivalent to + * ShowScrollBars( IsHorizontalScrollBarVisible(), show ) + */ + void ShowVerticalScrollBar( bool show = true ) + { + ShowScrollBars( IsHorizontalScrollBarVisible(), show ); + } + + /*! + * Forces visibility of the vertical scroll bar. + * + * This is a convenience member function, equivalent to + * ShowVerticalScrollBar( !hide ) + */ + void HideVerticalScrollBar( bool hide = true ) + { + ShowVerticalScrollBar( !hide ); + } + + /*! + * Returns true iff the automatic scroll mode is enabled for the + * horizontal scroll bar. + * + * In automatic scroll mode, scroll bars are automatically shown or hidden + * as necessary. A scroll bar is shown only if the corresponding scrolling + * range is larger than the visible length of the scrolling area. + */ + bool IsHorizontalAutoScrollEnabled() const; + + /*! + * Returns true iff the automatic scroll mode is enabled for the + * vertical scroll bar. + * + * In automatic scroll mode, scroll bars are automatically shown or hidden + * as necessary. A scroll bar is shown only if the corresponding scrolling + * range is larger than the visible length of the scrolling area. + */ + bool IsVerticalAutoScrollEnabled() const; + + /*! + * Enables the automatic scroll mode. + * + * \param enableHorz New enabled state for the horizontal scroll bar. + * \param enableVert New enabled state for the vertical scroll bar. + * + * In automatic scroll mode, scroll bars are automatically shown or hidden + * as necessary. A scroll bar is shown only if the corresponding scrolling + * range is larger than the visible length of the scrolling area. + */ + void EnableAutoScroll( bool enableHorz = true, bool enableVert = true ); + + /*! + * Disables the automatic scroll mode. + * + * This is a convenience member function, equivalent to + * EnableAutoScroll( !disableHorz, !disableVert ) + */ + void DisableAutoScroll( bool disableHorz = true, bool disableVert = true ) + { + EnableAutoScroll( !disableHorz, !disableVert ); + } + + /*! + * Gets the current horizontal scroll range. + * + * \param[out] minPos Minimum horizontal scrolling position + * \param[out] maxPos Maximum horizontal scrolling position + * + * The virtual document width is equal to + * maxPos - minPos + PageWidth() in scrolling units. + */ + void GetHorizontalScrollRange( int& minPos, int& maxPos ) const; + + /*! + * Gets the current vertical scroll range. + * + * \param[out] minPos Minimum vertical scrolling position + * \param[out] maxPos Maximum vertical scrolling position + * + * The virtual document height is equal to + * maxPos - minPos + PageHeight() in scrolling units. + */ + void GetVerticalScrollRange( int& minPos, int& maxPos ) const; + + /*! + * Returns the minimum horizontal scrolling position. + */ + int MinHorizontalScrollPosition() const + { + int minPos, dum; GetHorizontalScrollRange( minPos, dum ); return minPos; + } + + /*! + * Returns the maximum horizontal scrolling position. + */ + int MaxHorizontalScrollPosition() const + { + int dum, maxPos; GetHorizontalScrollRange( dum, maxPos ); return maxPos; + } + + /*! + * Returns the minimum vertical scrolling position. + */ + int MinVerticalScrollPosition() const + { + int minPos, dum; GetVerticalScrollRange( minPos, dum ); return minPos; + } + + /*! + * Returns the maximum horizontal scrolling position. + */ + int MaxVerticalScrollPosition() const + { + int dum, maxPos; GetVerticalScrollRange( dum, maxPos ); return maxPos; + } + + /*! + * Sets the horizontal scroll range. + * + * \param minPos Minimum horizontal scrolling position + * \param maxPos Maximum horizontal scrolling position + * + * The virtual document width will be equal to + * maxPos - minPos + PageWidth() in scrolling units. + */ + void SetHorizontalScrollRange( int minPos, int maxPos ); + + /*! + * Sets the vertical scroll range. + * + * \param minPos Minimum vertical scrolling position + * \param maxPos Maximum vertical scrolling position + * + * The virtual document height will be equal to + * maxPos - minPos + PageHeight() in scrolling units. + */ + void SetVerticalScrollRange( int minPos, int maxPos ); + + /*! + * Returns the current page width of this scroll box in scrolling + * units. + * + * The page width is the length of the horizontal scroll bar's slider. + */ + int PageWidth() const; + + /*! + * Returns the current page height of this scroll box in scrolling + * units. + * + * The page height is the length of the vertical scroll bar's slider, or + * the amount scrolled when the user presses the PgUp or PgDn keys. + */ + int PageHeight() const; + + /*! + * Sets the page size of this scroll box. + * + * \param width New page width in scrolling units. + * \param height New page height in scrolling units. + */ + void SetPageSize( int width, int height ); + + /*! + * Sets the page width of this scroll box in scrolling units. + */ + void SetPageWidth( int width ) + { + SetPageSize( width, PageHeight() ); + } + + /*! + * Sets the page height of this scroll box in scrolling units. + */ + void SetPageHeight( int height ) + { + SetPageSize( PageWidth(), height ); + } + + /*! + * Returns the current line width of this scroll box control. + * + * The line width is the number of scrolling units scrolled when the user + * clicks on an arrow icon of the horizontal scroll bar. + */ + int LineWidth() const; + + /*! + * Returns the current line height of this scroll box control. + * + * The line height is the number of scrolling units scrolled when the user + * clicks on an arrow icon of the vertical scroll bar. + */ + int LineHeight() const; + + /*! + * Sets the line sizes of this scroll box. + * + * \param width New line width in scrolling units. + * \param height New line height in scrolling units. + */ + void SetLineSize( int width, int height ); + + /*! + * Sets the line width of this scroll box in scrolling units. + */ + void SetLineWidth( int width ) + { + SetLineSize( width, LineHeight() ); + } + + /*! + * Sets the line height of this scroll box in scrolling units. + */ + void SetLineHeight( int height ) + { + SetLineSize( LineWidth(), height ); + } + + /*! + * Returns the current scroll position. Returned oordinates are expressed in + * scrolling units. + */ + pcl::Point ScrollPosition() const; + + /*! + * Returns the current horizontal scroll position in scrolling units. + */ + int HorizontalScrollPosition() const + { + pcl::Point pos = ScrollPosition(); return pos.x; + } + + /*! + * Returns the current vertical scroll position in scrolling units. + */ + int VerticalScrollPosition() const + { + pcl::Point pos = ScrollPosition(); return pos.y; + } + + /*! + * Sets the scroll position \a pos of this scroll box control. + */ + void SetScrollPosition( const pcl::Point& pos ) + { + SetScrollPosition( pos.x, pos.y ); + } + + /*! + * Sets the scroll coordinates \a horzPos and \a vertPos of this scroll box + * control. + */ + void SetScrollPosition( int horzPos, int vertPos ); + + /*! + * Sets the horizontal scroll position. + */ + void SetHorizontalScrollPosition( int horzPos ) + { + SetScrollPosition( horzPos, VerticalScrollPosition() ); + } + + /*! + * Sets the vertical scroll position. + */ + void SetVerticalScrollPosition( int vertPos ) + { + SetScrollPosition( HorizontalScrollPosition(), vertPos ); + } + + /*! + * Returns true iff the automatic tracking mode is enabled for the + * horizontal scroll bar of this scroll box control. + */ + bool IsHorizontalTrackingEnabled() const; + + /*! + * Returns true iff the automatic tracking mode is enabled for the + * vertical scroll bar of this scroll box control. + */ + bool IsVerticalTrackingEnabled() const; + + /*! + * Enables or disables the automatic tracking mode for this scroll + * box control. + * + * \param enableHorz New state of automatic tracking mode for the + * horizontal scroll bar. + * + * \param enableVert New state of automatic tracking mode for the + * vertical scroll bar. + * + * When automatic tracking is enabled, the viewport receives continuous + * update requests while the user is moving an scroll bar with the mouse. + * When automatic tracking is disabled, the viewport is updated only when + * the mouse is released. + */ + void EnableTracking( bool enableHorz = true, bool enableVert = true ); + + /*! + * Enables or disables the automatic tracking mode for the + * horizontal scroll bar of this box control control. + * + * This is a convenience member function, equivalent to + * EnableTracking( enableHorz, IsVerticalTrackingEnabled() ) + */ + void EnableHorizontalTracking( bool enableHorz = true ) + { + EnableTracking( enableHorz, IsVerticalTrackingEnabled() ); + } + + /*! + * Enables or disables the automatic tracking mode for the + * vertical scroll bar of this box control control. + * + * This is a convenience member function, equivalent to + * EnableTracking( IsHorizontalTrackingEnabled(), enableVert ) + */ + void EnableVerticalTracking( bool enableVert = true ) + { + EnableTracking( IsHorizontalTrackingEnabled(), enableVert ); + } + + /*! + * Disables or enables the automatic tracking mode for this scroll + * box control. + * + * This is a convenience member function, equivalent to + * EnableTracking( !disableHorz, !disableVert ) + */ + void DisableTracking( bool disableHorz = true, bool disableVert = true ) + { + EnableTracking( !disableHorz, !disableVert ); + } + + /*! + * Disables or enables the automatic tracking mode for the + * horizontal scroll bar of this box control control. + * + * This is a convenience member function, equivalent to + * EnableTracking( !disableHorz, IsVerticalTrackingEnabled() ) + */ + void DisableHorizontalTracking( bool disableHorz = true ) + { + EnableTracking( !disableHorz, IsVerticalTrackingEnabled() ); + } + + /*! + * Disables or enables the automatic tracking mode for the + * vertical scroll bar of this box control control. + * + * This is a convenience member function, equivalent to + * EnableTracking( IsHorizontalTrackingEnabled(), !disableVert ) + */ + void DisableVerticalTracking( bool disableVert = true ) + { + EnableTracking( IsHorizontalTrackingEnabled(), !disableVert ); + } + + /*! + * Returns a constant reference to the viewport control of this + * scroll box. + * + * The viewport control represents the contents, or "virtual document" of + * the scroll box. + */ + const Control& Viewport() const + { + return m_viewport; + } + + /*! + * Returns a reference to the viewport control of this scroll box. + * + * The viewport control represents the contents, or "virtual document" of + * the scroll box. + */ + Control& Viewport() + { + return m_viewport; + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnHorizontalScrollPosUpdated( ScrollBox& sender, int horzPos ); + // void OnVerticalScrollPosUpdated( ScrollBox& sender, int vertPos ); + // void OnHorizontalScrollRangeUpdated( ScrollBox& sender, int minHorzPos, int maxHorzPos ); + // void OnVerticalScrollRangeUpdated( ScrollBox& sender, int minVertPos, int maxVertPos ); + + /*! + * \defgroup scroll_box_event_handlers ScrollBox Event Handlers + */ + + /*! + * Defines the prototype of a scroll position event handler. + * + * A scroll position event is generated after the scroll position has been + * changed by the user, either by clicking a scroll bar with the mouse or by + * pressing a direction key when a scroll bar has the keyboard focus. + * + * \param sender The control that sends a scroll position event. + * \param pos New scroll position in scrolling units. + * + * \ingroup scroll_box_event_handlers + */ + typedef void (Control::*pos_event_handler)( ScrollBox& sender, int pos ); + + /*! + * Defines the prototype of a scroll range event handler. + * + * A scroll range event is generated after a scrolling range has been + * changed for the horizontal or vertical scroll bars. + * + * \param sender The control that sends a scroll range event. + * \param minValue New minimum scroll position. + * \param maxValue New maximum scroll position. + * + * \ingroup scroll_box_event_handlers + */ + typedef void (Control::*range_event_handler)( ScrollBox& sender, int minValue, int maxValue ); + + /*! + * Sets the scroll position event handler for the horizontal scroll bar. + * + * \param handler The scroll position event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive horizontal scroll + * position events from this scroll box. + * + * \ingroup scroll_box_event_handlers + */ + void OnHorizontalScrollPosUpdated( pos_event_handler handler, Control& receiver ); + + /*! + * Sets the scroll position event handler for the vertical scroll bar. + * + * \param handler The scroll position event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive vertical scroll + * position events from this scroll box. + * + * \ingroup scroll_box_event_handlers + */ + void OnVerticalScrollPosUpdated( pos_event_handler handler, Control& receiver ); + + /*! + * Sets the scroll range event handler for the horizontal scroll bar. + * + * \param handler The scroll range event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive horizontal scroll + * range events from this scroll box. + * + * \ingroup scroll_box_event_handlers + */ + void OnHorizontalScrollRangeUpdated( range_event_handler handler, Control& receiver ); + + /*! + * Sets the scroll range event handler for the vertical scroll bar. + * + * \param handler The scroll range event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive vertical scroll + * range events from this scroll box. + * + * \ingroup scroll_box_event_handlers + */ + void OnVerticalScrollRangeUpdated( range_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + pos_event_handler onHorizontalScrollPosUpdated = nullptr; + pos_event_handler onVerticalScrollPosUpdated = nullptr; + range_event_handler onHorizontalScrollRangeUpdated = nullptr; + range_event_handler onVerticalScrollRangeUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + +protected: + + Control m_viewport; + + /*! + * \internal + */ + ScrollBox( void* ); + + /*! + * \internal + */ + ScrollBox( void*, void* ); + + friend class ScrollBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ScrollBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ScrollBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Search.h b/3rdparty/include/pcl/Search.h new file mode 100644 index 0000000..5c489ec --- /dev/null +++ b/3rdparty/include/pcl/Search.h @@ -0,0 +1,510 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Search.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Search_h +#define __PCL_Search_h + +/// \file pcl/Search.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup search_algorithms Search Algorithms + * + * Template formal parameters: + * + * FI Forward iterator \n + * BI Bidirectional iterator \n + * RI Random access iterator \n + * UP Unary predicate \n + * BP Binary predicate \n + * T Item type \n + * F Function + */ + +// ---------------------------------------------------------------------------- + +/*! + * Generic linear search algorithm. + * + * Returns the first iterator k in the range [i,j) such that *k == v. Returns + * j if no such occurrence of v is found. + * + * \ingroup search_algorithms + */ +template inline +FI LinearSearch( FI i, FI j, const T& v ) noexcept +{ + for( ; i != j; ++i ) + if ( *i == v ) + break; + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic linear search algorithm. + * + * Returns the first iterator k in the range [i,j) such that p( *k, v ) is + * true. Returns j if no such occurrence of v is found. + * + * \ingroup search_algorithms + */ +template inline +FI LinearSearch( FI i, FI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + for( ; i != j; ++i ) + if ( p( *i, v ) ) + break; + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic linear search algorithm (last occurrence). + * + * Returns the last iterator k in the range [i,j) such that *k == v. Returns + * j if no such occurrence of v is found. + * + * \ingroup search_algorithms + */ +template inline +BI LinearSearchLast( BI i, BI j, const T& v ) noexcept +{ + for( BI k = j; i != k; ) + if ( *--k == v ) + return k; + return j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic linear search algorithm (last occurrence). + * + * Returns the last iterator k in the range [i,j) such that *k == v. Returns + * j if no such occurrence of v is found. + * + * \ingroup search_algorithms + */ +template inline +BI LinearSearchLast( BI i, BI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + for( BI k = j; i != k; ) + if ( p( *--k, v ) ) + return k; + return j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic binary search algorithm. + * + * Returns the first iterator k in the range [i,j) such that *k == v. Returns j + * if no such occurrence of v is found. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, *j < *i must be false. + * + * \ingroup search_algorithms + */ +template inline +FI BinarySearch( FI i, FI j, const T& v ) noexcept +{ + for ( distance_type n = Distance( i, j ); n > 0; ) + { + distance_type h = n >> 1; + FI m = i; + Advance( m, h ); + + if ( *m < v ) + { + i = ++m; + n -= h+1; + } + else + n = h; + } + + return (i != j && !(v < *i)) ? i : j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic binary search algorithm. + * + * Returns the first iterator k in the range [i,j) such that both p( *k, v ) + * and p( v, *k ) are false. Returns j if no such occurrence of v is found. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, p( *j, *i ) must be false. + * + * \ingroup search_algorithms + */ +template inline +FI BinarySearch( FI i, FI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + for ( distance_type n = Distance( i, j ); n > 0; ) + { + distance_type h = n >> 1; + FI m = i; + Advance( m, h ); + + if ( p( *m, v ) ) + { + i = ++m; + n -= h+1; + } + else + n = h; + } + + return (i != j && !p( v, *i )) ? i : j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic binary search algorithm (last occurrence). + * + * Returns the last iterator k in the range [i,j) such that *k == v. Returns j + * if no such occurrence of v is found. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, *j < *i must be false. + * + * \ingroup search_algorithms + */ +template inline +FI BinarySearchLast( FI i, FI j, const T& v ) noexcept +{ + FI k = BinarySearch( i, j, v ); + if ( k != j ) + for( FI l = k; ++l != j && *l == v; ) + ++k; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic binary search algorithm (last occurrence). + * + * Returns the last iterator k in the range [i,j) such that both p( *k, v ) + * and p( v, *k ) are false. Returns j if no such occurrence of v is found. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, p( *j, *i ) must be false. + * + * \ingroup search_algorithms + */ +template inline +FI BinarySearchLast( FI i, FI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + FI k = BinarySearch( i, j, v, p ); + if ( k != j ) + for( FI l = k; ++l != j && !p( *l, v ) && !p( v, *l ); ) + ++k; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic binary search algorithm. + * + * Returns the first iterator k in the range [i,j) such that both p1( *k, v ) + * and p2( v, *k ) are false. Returns j if no such occurrence of v is found. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, both p1( *j, *i ) and p2( *j, *i ) must be + * false. + * + * \ingroup search_algorithms + */ +template inline +FI BinarySearch( FI i, FI j, const T& v, BP1 p1, BP2 p2 ) noexcept( noexcept( p1 ) && noexcept( p2 ) ) +{ + for ( distance_type n = Distance( i, j ); n > 0; ) + { + distance_type h = n >> 1; + FI m = i; + Advance( m, h ); + + if ( p1( *m, v ) ) + { + i = ++m; + n -= h+1; + } + else + n = h; + } + + return (i != j && !p2( v, *i )) ? i : j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic insertion point algorithm. + * + * Returns an iterator k in the range [i,j) such that: + * + * \li for all a in [i,j) that precedes k, v \< *a is false. + * + * \li for all b in [i,j) that postcedes k, *b \< v is false. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, *j < *i must be false. + * + * The resulting iterator k corresponds to a location where the value \a v could + * be inserted in the [i,j) sequence without breaking the existing order of + * values, as defined by operator <. + * + * \ingroup search_algorithms + */ +template inline +FI InsertionPoint( FI i, FI j, const T& v ) noexcept +{ + for ( distance_type n = Distance( i, j ); n > 0; ) + { + distance_type h = n >> 1; + FI m = i; + Advance( m, h ); + + if ( v < *m ) + n = h; + else + { + i = ++m; + n -= h+1; + } + } + + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Generic insertion point algorithm. + * + * Returns an iterator k in the range [i,j) such that: + * + * \li for all a in [i,j) that precedes k, p( v, *a ) is false. + * + * \li for all b in [i,j) that postcedes k, p( *b, v ) is false. + * + * The sequence [i,j) must be ordered in ascending order: for every pair a,b in + * [i,j) such that i precedes j, p( *j, *i ) must be false. + * + * The resulting iterator k corresponds to a location where the value \a v could + * be inserted in the [i,j) sequence without breaking the existing order of + * values, as defined by the binary predicate p. + * + * \ingroup search_algorithms + */ +template inline +FI InsertionPoint( FI i, FI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + for ( distance_type n = Distance( i, j ); n > 0; ) + { + distance_type h = n >> 1; + FI m = i; + Advance( m, h ); + + if ( p( v, *m ) ) + n = h; + else + { + i = ++m; + n -= h+1; + } + } + + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the starting iterator of the first subsequence within the range + * [i1,j1) that is identical to the sequence [i2,j2) when compared element by + * element, or j1 if no such subsequence is found. + * + * \ingroup search_algorithms + */ +template inline +FI1 Search( FI1 i1, FI1 j1, FI2 i2, FI2 j2 ) noexcept +{ + distance_type n1 = Distance( i1, j1 ); + distance_type n2 = Distance( i2, j2 ); + if ( n1 > 0 && n2 > 0 ) + for ( ; n2 <= n1; ++i1, --n1 ) + { + FI1 k1 = i1; + FI2 k2 = i2; + for ( ; *k1 == *k2; ++k1 ) + if ( ++k2 == j2 ) + return i1; + } + return j1; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the starting iterator of the first subsequence within the range + * [i1,j1) that corresponds to the sequence [i2,j2) when the binary predicate p + * is applied element by element, or j1 if no such subsequence is found. + * + * \ingroup search_algorithms + */ +template inline +FI1 Search( FI1 i1, FI1 j1, FI2 i2, FI2 j2, BP p ) noexcept( noexcept( p ) ) +{ + distance_type n1 = Distance( i1, j1 ); + distance_type n2 = Distance( i2, j2 ); + if ( n1 > 0 && n2 > 0 ) + for ( ; n2 <= n1; ++i1, --n1 ) + { + FI1 k1 = i1; + FI2 k2 = i2; + for ( ; p( *k1, *k2 ); ++k1 ) + if ( ++k2 == j2 ) + return i1; + } + return j1; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the starting iterator of the last subsequence within the range + * [i1,j1) that is identical to the sequence [i2,j2) when compared element by + * element, or j1 if no such subsequence is found. + * + * \ingroup search_algorithms + */ +template inline +BI1 SearchLast( BI1 i1, BI1 j1, FI2 i2, FI2 j2 ) noexcept +{ + distance_type n1 = Distance( i1, j1 ); + distance_type n2 = Distance( i2, j2 ); + if ( n1 > 0 && n2 > 0 && n2 <= n1 ) + { + i1.Advance( n1 - n2 ); + for ( ;; ) + { + BI1 k1 = i1; + FI2 k2 = i2; + for ( ; *k1 == *k2; ++k1 ) + if ( ++k2 == j2 ) + return i1; + if ( --n1 < n2 ) + break; + --i1; + } + } + return j1; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the starting iterator of the last subsequence within the range + * [i1,j1) that corresponds to the sequence [i2,j2) when the binary predicate p + * is applied element by element, or j1 if no such subsequence is found. + * + * \ingroup search_algorithms + */ +template inline +BI1 SearchLast( BI1 i1, BI1 j1, FI2 i2, FI2 j2, BP p ) noexcept( noexcept( p ) ) +{ + distance_type n1 = Distance( i1, j1 ); + distance_type n2 = Distance( i2, j2 ); + if ( n1 > 0 && n2 > 0 && n2 <= n1 ) + { + i1.Advance( n1 - n2 ); + for ( ;; ) + { + BI1 k1 = i1; + FI2 k2 = i2; + for ( ; p( *k1, *k2 ); ++k1 ) + if ( ++k2 == j2 ) + return i1; + if ( --n1 < n2 ) + break; + --i1; + } + } + return j1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Search_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Search.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SectionBar.h b/3rdparty/include/pcl/SectionBar.h new file mode 100644 index 0000000..f682959 --- /dev/null +++ b/3rdparty/include/pcl/SectionBar.h @@ -0,0 +1,379 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SectionBar.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SectionBar_h +#define __PCL_SectionBar_h + +/// \file pcl/SectionBar.h + +#include + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SectionBar + * \brief A control to manage collapsible sections of interface windows and + * dialogs. + * + * %SectionBar manages collapsible/extensible sections on processing interfaces + * and dialogs. It includes a section title label and an icon that + * represents the current collapsed/extended state. + * + * When a %SectionBar control is clicked, it toggles visibility of a + * section control and adjusts the height of the top-level parent + * window to fit to its new contents. %SectionBar is useful to organize complex + * user interfaces and is extensively used by most standard process interfaces + * in PixInsight. + * + * \sa ProcessInterface, Dialog + */ +class PCL_CLASS SectionBar : public Control +{ +public: + + /*! + * Constructs a %SectionBar as a child control of \a parent. + */ + SectionBar( Control& parent = Null() ); + + /*! + * Destroys a %SectionBar object. + */ + virtual ~SectionBar(); + + /*! + * Returns a reference to the immutable section control managed by + * this %SectionBar. + * + * \sa SetSection() + */ + const Control& Section() const + { + return (m_section != nullptr) ? *m_section : Control::Null(); + } + + /*! + * Returns a reference to the section control managed by this + * %SectionBar. + * + * \sa SetSection() + */ + Control& Section() + { + return (m_section != nullptr) ? *m_section : Control::Null(); + } + + /*! + * Sets the section control managed by this %SectionBar. + * + * \sa Section() + */ + void SetSection( Control& ); + + /*! + * Returns the title of this %SectionBar. + * + * \sa SetTitle() + */ + String Title() const + { + return Title_Label.Text(); + } + + /*! + * Sets the title of this %SectionBar. + * + * \sa Title() + */ + void SetTitle( const String& title ) + { + Title_Label.SetText( title ); + } + + /*! + * Returns true iff this %SectionBar is \e checkable. + * + * \sa EnableTitleCheckBox(), DisableTitleCheckBox(), IsChecked(), OnCheck() + */ + bool HasTitleCheckBox() const + { + return !Title_CheckBox.IsNull(); + } + + /*! + * Creates (or removes) a check box in this %SectionBar. + * + * \sa DisableTitleCheckBox(), HasTitleCheckBox(), IsChecked(), OnCheck() + */ + void EnableTitleCheckBox( bool = true ); + + /*! + * Removes (or creates) the check box in this %SectionBar. + * + * \sa EnableTitleCheckBox(), HasTitleCheckBox(), IsChecked(), OnCheck() + */ + void DisableTitleCheckBox( bool disable = true ) + { + EnableTitleCheckBox( !disable ); + } + + /*! + * Returns true iff there is a check box in this %SectionBar and it is + * currently checked. + * + * \sa SetChecked(), EnableTitleCheckBox(), HasTitleCheckBox(), OnCheck() + */ + bool IsChecked() const + { + return !Title_CheckBox.IsNull() && Title_CheckBox->IsChecked(); + } + + /*! + * Checks or unchecks the check box in this %SectionBar. + * + * The \e enabled state of the section control (if there is one) will be + * automatically toggled according to the state of the check box: the + * section control will be enabled if the check box is checked; it will be + * disabled otherwise. + * + * \note If this %SectionBar is not checkable, this function is ignored. + * + * \sa IsChecked(), EnableTitleCheckBox(), HasTitleCheckBox(), OnCheck() + */ + void SetChecked( bool checked = true ); + + /*! + * A convenient synonym for SetChecked( true ). + */ + void Check() + { + SetChecked( true ); + } + + /*! + * A convenient synonym for SetChecked( false ). + */ + void Uncheck() + { + SetChecked( false ); + } + + /*! + * Returns true iff this %SectionBar object is enabled. + * + * \sa Enable() + */ + virtual bool IsEnabled() const + { + return Title_Label.IsEnabled(); + } + + /*! + * Enables (or disables) this %SectionBar object. + * + * When a SectionBar object is disabled, its section control is also + * disabled, and in case it has a title checkbox, it is also disabled. + * However, the collapse/extend functionality of SectionBar is unaffected by + * its enabled/disabled state. + * + * \sa IsEnabled() + */ + virtual void Enable( bool enabled = true ); + + /*! + * Shows or hides the section control managed by this %SectionBar. + * + * In general, this function should be used instead of simply calling + * Control::SetVisible() (or Control::Show()/Control::Hide()). This function + * ensures that the parent control (typically a process interface) + * regenerates its layout correctly after changing visibility of the section + * control. + * + * \sa ShowSection(), HideSection() + */ + void SetSectionVisible( bool visible = true ); + + /*! + * A convenient synonym for SetSectionVisible( true ). + */ + void ShowSection() + { + SetSectionVisible( true ); + } + + /*! + * A convenient synonym for SetSectionVisible( false ). + */ + void HideSection() + { + SetSectionVisible( false ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnToggleSection( SectionBar& sender, Control& section, bool start ); + + /*! + * \defgroup section_bar_event_handlers SectionBar Event Handlers + */ + + /*! + * Defines the prototype of a section event handler. + * + * A section event is generated when the user clicks on this section bar to + * collapse or extend the managed section control. + * + * For each section event, two \e subevents are generated: one \e before the + * collapse/extend operation, and a second one once the operation has been + * completed. + * + * \param sender The control that sends a section event. + * + * \param section The section control that has been collapsed or extended. + * + * \param start True if this is a first subevent that is being sent before + * the collapse/extend operation; false if it is a second + * subevent, sent after having completed the operation. + * + * \ingroup section_bar_event_handlers + */ + typedef void (Control::*section_event_handler)( SectionBar& sender, Control& section, bool start ); + + /*! + * Sets the section event handler for this %SectionBar control. + * + * \param handler The section event handler. Must be a member function of + * the receiver object's class. + * + * \param receiver The control that will receive section events from this + * %SectionBar. + * + * \ingroup section_bar_event_handlers + */ + void OnToggleSection( section_event_handler handler, Control& receiver ); + + /*! + * Defines the prototype of a check event handler + * + * A check event is generated when the user toggles the state of the check + * box in a checkable section bar, either by clicking it with the mouse, or + * by focusing it and pressing the space bar key. + * + * \param sender The control that sends a check event. + * + * \param checked True if the check box is now checked in the sender section + * bar. False if the check box is currently unchecked. + * + * \ingroup section_bar_event_handlers + */ + typedef void (Control::*check_event_handler)( SectionBar& sender, bool checked ); + + /*! + * Sets the check event handler for this %SectionBar control. + * + * \param handler The check event handler. Must be a member function of + * the receiver object's class. + * + * \param receiver The control that will receive check events from this + * %SectionBar. + * + * \ingroup section_bar_event_handlers + */ + void OnCheck( check_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + section_event_handler onToggleSection = nullptr; + Control* onToggleSectionReceiver = nullptr; + + check_event_handler onCheck = nullptr; + Control* onCheckReceiver = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + Control* m_section = nullptr; + + VerticalSizer Global_Sizer; + HorizontalSizer Title_Sizer; + Label Title_Label; + AutoPointer Title_CheckBox; // non-null for a checkable SectionBar + ToolButton Title_ToolButton; + + void ButtonClick( Button&, bool ); + void MousePress( Control&, const pcl::Point&, int, unsigned, unsigned ); + void ControlShow( Control& ); + void ControlHide( Control& ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SectionBar_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SectionBar.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Selection.h b/3rdparty/include/pcl/Selection.h new file mode 100644 index 0000000..c8749c8 --- /dev/null +++ b/3rdparty/include/pcl/Selection.h @@ -0,0 +1,250 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Selection.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Selection_h +#define __PCL_Selection_h + +/// \file pcl/Selection.h + +#include + +#include +#include + +// Template formal parameters: +// +// FI Forward iterator +// BI Bidirectional iterator +// RI Random access iterator +// UP Unary predicate +// BP Binary predicate +// T Item type +// F Function + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup selection_algorithms Selection Algorithms + */ + +// ---------------------------------------------------------------------------- + +template inline +RI __pcl_quick_select__( RI i, RI j, distance_type k, T* ) +{ + distance_type n = j - i; + if ( k < 0 || n < 1 || n <= k ) + return j; + + for ( distance_type l = 0, r = n-1; ; ) + { + RI x0 = i + l; + RI y = i + r; + + if ( r <= l+1 ) + { + if ( r == l+1 && *y < *x0 ) + Swap( *x0, *y ); + return i + k; + } + + RI x = x0; + + Swap( *++x, *(i + ((l+r) >> 1)) ); + + if ( *y < *x0 ) + Swap( *x0, *y ); + if ( *y < *x ) + Swap( *x, *y ); + if ( *x < *x0 ) + Swap( *x, *x0 ); + + T v = *x; + + for ( ;; ) + { + while ( *++x < v ); + while ( v < *--y ); + if ( y < x ) + break; + Swap( *x, *y ); + } + + *(x0+1) = *y; + *y = v; + + distance_type dy = y - i; + if ( dy >= k ) + r = dy - 1; + if ( dy <= k ) + l = x - i; + } +} + +/*! + * Generic quick selection algorithm. + * + * Given a range defined by two random access iterators [i,j) and a distance k, + * such that j-i > k, returns an iterator t whose associated value is the k-th + * element in the sorted sequence [i,j) in ascending order. + * + * For example, the following call: + * + * \code t = Select( i, j, (j - i) >> 1 ); \endcode + * + * will return the \e median of the distribution of elements in the [i,j) + * sequence: the central value for which the probabilities that a greater and a + * lesser element exist are equal. + * + * \b References + * + * \li William H. Press et al., Numerical Recipes 3rd Edition: The Art of + * Scientific Computing, Cambridge University Press, 2007, Section 8.5. + * + * \li Robert Sedgewick, Kevin Wayne, Algorithms, 4th Edition, + * Addison-Wesley Professional, 2011, pp. 345-347. + * + * \warning This function performs a destructive selection search: + * There is no guarantee that the existing order of elements in the [i,j) + * sequence is preserved after calling this function. + * + * \ingroup selection_algorithms + */ +template inline +RI Select( RI i, RI j, distance_type k ) +{ + return __pcl_quick_select__( i, j, k, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +RI __pcl_quick_select__( RI i, RI j, distance_type k, BP p, T* ) +{ + distance_type n = j - i; + if ( k < 0 || n < 1 || n <= k ) + return j; + + for ( distance_type l = 0, r = n-1; ; ) + { + RI x0 = i + l; + RI y = i + r; + + if ( r <= l+1 ) + { + if ( r == l+1 && p( *y, *x0 ) ) + Swap( *x0, *y ); + return i + k; + } + + RI x = x0; + + Swap( *++x, *(i + ((l+r) >> 1)) ); + + if ( p( *y, *x0 ) ) + Swap( *x0, *y ); + if ( p( *y, *x ) ) + Swap( *x, *y ); + if ( p( *x, *x0 ) ) + Swap( *x, *x0 ); + + T v = *x; + + for ( ;; ) + { + while ( p( *++x, v ) ); + while ( p( v, *--y ) ); + if ( y < x ) + break; + Swap( *x, *y ); + } + + *(x0+1) = *y; + *y = v; + + distance_type dy = y - i; + if ( dy >= k ) + r = dy - 1; + if ( dy <= k ) + l = x - i; + } +} + +/*! + * Generic quick selection algorithm. + * + * Given a range defined by two random access iterators [i,j) and a distance k, + * such that j-i > k, returns an iterator t whose associated value is the k-th + * element in the sorted sequence [i,j) in ascending order. Element comparison + * is given by a binary predicate \a p such that p( a, b ) is true for any pair + * a, b of elements such that a precedes b. + * + * See Select( RI, RI, distance_type ) for more information. + * + * \ingroup selection_algorithms + */ +template inline +RI Select( RI i, RI j, distance_type k, BP p ) +{ + return __pcl_quick_select__( i, j, k, p, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Selection_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Selection.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SeparableConvolution.h b/3rdparty/include/pcl/SeparableConvolution.h new file mode 100644 index 0000000..2d5ddc9 --- /dev/null +++ b/3rdparty/include/pcl/SeparableConvolution.h @@ -0,0 +1,488 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SeparableConvolution.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SeparableConvolution_h +#define __PCL_SeparableConvolution_h + +/// \file pcl/SeparableConvolution.h + +#include +#include + +#include +#include +#include +#include + +#define __PCL_SEPARABLE_CONVOLUTION_TINY_WEIGHT 1.0e-20 + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SeparableConvolution + * \brief Discrete two-dimensional separable convolution in the spatial domain + * + * %SeparableConvolution implements a fully multithreaded, two-dimensional + * discrete separable convolution algorithm. It performs automatic fixing of + * border artifacts by applying Neumann boundary conditions (mirroring). + * + * \sa Convolution, FFTConvolution, SeparableFilter + */ +class PCL_CLASS SeparableConvolution : public InterlacedTransformation, + public ParallelProcess +{ +public: + + /*! + * Represents a filter coefficient. + */ + typedef SeparableFilter::coefficient coefficient; + + /*! + * Represents a one-dimensional filter. + */ + typedef SeparableFilter::coefficient_vector coefficient_vector; + + /*! + * Default constructor. + * + * \note This constructor yields an uninitialized instance that cannot be + * used before explicit association with a SeparableFilter instance. + */ + SeparableConvolution() = default; + + /*! + * Constructs a %SeparableConvolution object with the specified filter. + * + * \param filter Response function, or convolution filter. The + * specified object does not have to remain valid while this + * instance is actively used, since %SeparableConvolution + * owns a private copy of the separable filter (note that + * SeparableFilter is a reference-counted class). + */ + SeparableConvolution( const SeparableFilter& filter ) + { + SetFilter( filter ); + } + + /*! + * Copy constructor. + */ + SeparableConvolution( const SeparableConvolution& x ) + : InterlacedTransformation( x ) + , ParallelProcess( x ) + , m_weight( x.m_weight ) + , m_highPass( x.m_highPass ) + , m_rawHighPass( x.m_rawHighPass ) + , m_rescaleHighPass( x.m_rescaleHighPass ) + , m_convolveRows( x.m_convolveRows ) + , m_convolveCols( x.m_convolveCols ) + { + if ( !x.m_filter.IsNull() ) + m_filter = x.m_filter->Clone(); + } + + /*! + * Move constructor. + */ + SeparableConvolution( SeparableConvolution&& ) = default; + + /*! + * Destroys this %SeparableConvolution object. + */ + virtual ~SeparableConvolution() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SeparableConvolution& operator =( const SeparableConvolution& x ) + { + if ( &x != this ) + { + (void)InterlacedTransformation::operator =( x ); + (void)ParallelProcess::operator =( x ); + if ( x.m_filter.IsNull() ) + m_filter.Destroy(); + else + m_filter = x.m_filter->Clone(); + m_weight = x.m_weight; + m_highPass = x.m_highPass; + m_rawHighPass = x.m_rawHighPass; + m_rescaleHighPass = x.m_rescaleHighPass; + m_convolveRows = x.m_convolveRows; + m_convolveCols = x.m_convolveCols; + } + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SeparableConvolution& operator =( SeparableConvolution&& ) = default; + + /*! + * Returns a constant reference to the separable filter currently associated + * with this %SeparableConvolution object. + * + * \note If this object has not been initialized, this member function + * throws an Error exception. + */ + const SeparableFilter& Filter() const + { + PCL_PRECONDITION( !m_filter.IsNull() ) + return *m_filter; + } + + /*! + * Returns a copy of the internal vector of filter coefficients + * corresponding to the specified \a phase. If \a phase is zero, the + * one-dimensional row filter is returned; otherwise the one-dimensional + * column filter is returned. + * + * \note If this object has not been initialized, this member function + * throws an Error exception. + */ + coefficient_vector Filter( int phase ) const + { + PCL_PRECONDITION( !m_filter.IsNull() ) + return m_filter->Filter( phase ); + } + + /*! + * Sets a new filter to be applied by this %SeparableConvolution object. + */ + void SetFilter( const SeparableFilter& filter ) + { + m_filter = filter.Clone(); + CacheFilterProperties(); + } + + /*! + * Returns the current filter weight. The filter weight is computed each + * time a separable filter is associated with this object. It is only + * applied for low-pass filters as a normalization factor. For more + * information, see the documentation for SeparableFilter::Weight(). + * + * The filter weight and other filter properties are cached in private data + * members for quick reference. + */ + double FilterWeight() const + { + return m_weight; + } + + /*! + * Returns true if the separable filter currently associated with this + * %SeparableConvolution object is a high-pass filter; false if it is a + * low-pass filter. For more information, see the documentation for + * SeparableFilter::IsHighPassFilter(). + * + * Each time a separable filter is associated with this object, its + * high-pass nature is checked and stored, along with other filter + * properties, in private data members. This allows for quick lookup of + * critical filter characteristics without degrading performance. + */ + bool IsHighPassFilter() const + { + return m_highPass; + } + + /*! + * Returns true iff out-of-range values will be rescaled for normalization of + * images after convolution with a high-pass filter. + * + * A high-pass filter has negative coefficients. As a result, some pixels in + * the convolved image may have negative values. Saturated pixels (values + * above one) can also result, depending on the filter coefficients. The + * standard behavior is to truncate out-of-range pixel values to the [0,1] + * range, which preserves the dynamics of the convolved image, so high-pass + * rescaling is disabled by default. When high-pass rescaling is enabled, + * the resulting image is \e normalized (that is, rescaled to [0,1] only if + * there are out-of-range values) and hence all the data after convolution + * are preserved at the cost of reducing the overall contrast of the image. + * Finally, if raw high-pass convolution has been enabled, + * out-of-range values are neither truncated nor rescaled irrespective of + * the value returned by this function. See the documentation for + * IsRawHighPassEnabled() for more information. + */ + bool IsHighPassRescalingEnabled() const + { + return m_rescaleHighPass; + } + + /*! + * Enables (or disables) high-pass rescaling of out-of-range convolved pixel + * values. See the documentation for IsHighPassRescalingEnabled() for more + * information. + */ + void EnableHighPassRescaling( bool enable = true ) + { + m_rescaleHighPass = enable; + } + + /*! + * Disables (or enables) high-pass rescaling of out-of-range convolved pixel + * values. See the documentation for IsHighPassRescalingEnabled() for more + * information. + */ + void DisableHighPassRescaling( bool disable = true ) + { + EnableHighPassRescaling( !disable ); + } + + /*! + * Returns true iff raw high-pass convolution is enabled. When raw + * high-pass convolution is enabled, out-of-range values after convolution + * with a high-pass filter are neither truncated nor normalized. Note that + * this is only relevant to convolution of floating point data. + * + * Raw high-pass convolution is disabled by default. For more information on + * out-of-range convolution results, refer to the documentation for + * IsHighPassRescalingEnabled(). + */ + bool IsRawHighPassEnabled() const + { + return m_rawHighPass; + } + + /*! + * Enables (or disables) raw high-pass convolution. See the documentation + * for IsRawHighPassEnabled() for more information. + */ + void EnableRawHighPass( bool enable = true ) + { + m_rawHighPass = enable; + } + + /*! + * Disables (or enables) raw high-pass convolution. See the documentation + * for IsRawHighPassEnabled() for more information. + */ + void DisableRawHighPass( bool disable = true ) + { + EnableRawHighPass( !disable ); + } + + /*! + * Returns true iff this object will convolve pixel rows on target images. + */ + bool IsRowConvolutionEnabled() const + { + return m_convolveRows; + } + + /*! + * Enables (or disables) convolution of pixel rows. + */ + void EnableRowConvolution( bool enable = true ) + { + m_convolveRows = enable; + } + + /*! + * Disables (or enables) convolution of pixel rows. + * + * This is a convenience function, equivalent to: + * EnableRowConvolution( !disable ) + */ + void DisableRowConvolution( bool disable = true ) + { + EnableRowConvolution( !disable ); + } + + /*! + * Returns true iff this object will convolve pixel columns on target images. + */ + bool IsColumnConvolutionEnabled() const + { + return m_convolveCols; + } + + /*! + * Enables (or disables) convolution of pixel columns. + */ + void EnableColumnConvolution( bool enable = true ) + { + m_convolveCols = enable; + } + + /*! + * Disables (or enables) convolution of pixel columns. + * + * This is a convenience function, equivalent to: + * EnableColumnConvolution( !disable ) + */ + void DisableColumnConvolution( bool disable = true ) + { + EnableColumnConvolution( !disable ); + } + + /*! + * Returns the length in pixels of the overlapping regions between adjacent + * areas processed by parallel execution threads. The overlapping distance + * is a function of the filter size and the interlacing distance. + */ + int OverlappingDistance() const + { + PCL_PRECONDITION( !m_filter.IsNull() ) + return m_filter->Size() + (m_filter->Size() - 1)*(InterlacingDistance() - 1); + } + + /*! + * Returns the minimum filter size in pixels for which separable convolution + * is consistently faster than nonseparable convolution on the current + * PixInsight/PCL platform, for the specified number of parallel execution + * threads. + * + * The values returned by this function have been determined experimentally + * on reference hardware for optimized execution on machines and builds with + * and without AVX2/FMA3 processor instruction support. + * + * \ingroup convolution_speed_limits + */ + static constexpr int FasterThanNonseparableFilterSize( int numThreads ) + { +#ifdef __PCL_COMPATIBILITY + + // No vectorization + + if ( numThreads >= 32 ) + return 15; + if ( numThreads >= 16 ) + return 11; + if ( numThreads >= 8 ) + return 9; + if ( numThreads >= 4 ) + return 7; + return 5; + +#else + + // Vectorization with SSE4.2 / AVX2 and FMA instructions + + if ( numThreads >= 32 ) + return 29; + if ( numThreads >= 28 ) + return 25; + if ( numThreads >= 24 ) + return 21; + if ( numThreads >= 16 ) + return 19; + if ( numThreads >= 8 ) + return 13; + if ( numThreads >= 4 ) + return 11; + if ( numThreads >= 2 ) + return 9; + return 7; + +#endif + } + +protected: + + /* + * The response function for convolution is a separable filter. + */ + AutoPointer m_filter; + + /* + * Cached filter properties. + */ + double m_weight = 0; // filter weight for low-pass normalization + bool m_highPass = false; // true iff this is a high-pass filter + + /* + * User-selectable options. + */ + bool m_rawHighPass = false; // neither truncate nor normalize out-of-range values + bool m_rescaleHighPass = false; // truncate out-of-range values instead of normalize + bool m_convolveRows = true; // perform one-dimensional convolution of pixel rows + bool m_convolveCols = true; // perform one-dimensional convolution of pixel columns + + /* + * In-place 2-D separable convolution algorithm. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; + +private: + + void CacheFilterProperties() + { + PCL_PRECONDITION( !m_filter.IsNull() ) + PCL_PRECONDITION( !m_filter->IsEmpty() ) + ValidateFilter(); + m_highPass = m_filter->IsHighPassFilter(); + m_weight = m_filter->Weight(); + if ( pcl::Abs( m_weight ) < __PCL_SEPARABLE_CONVOLUTION_TINY_WEIGHT ) + m_weight = 1; + } + + void ValidateFilter() const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SeparableConvolution_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SeparableConvolution.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SeparableFilter.h b/3rdparty/include/pcl/SeparableFilter.h new file mode 100644 index 0000000..3f7a70c --- /dev/null +++ b/3rdparty/include/pcl/SeparableFilter.h @@ -0,0 +1,399 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SeparableFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SeparableFilter_h +#define __PCL_SeparableFilter_h + +/// \file pcl/SeparableFilter.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SeparableFilter + * \brief Separable filter in two dimensions. + * + * %SeparableFilter stores two one-dimensional filter vectors of floating point + * filter coefficients, plus an optional filter name. This class provides + * automatic allocation and deallocation of coefficients, implicit data sharing, + * thread-safe access and a number of utility functions for filter management. + * + * In the same way as the KernelFilter and Convolution PCL classes, + * %SeparableFilter can be used with the SeparableConvolution class. In, + * addition, ATrousWaveletTransform also accepts a %SeparableFilter as the + * implementation of a wavelet scaling function. + * + * The SeparableConvolution PCL class uses separable filters to implement a + * separable convolution algorithm. This allows for important performance + * improvements, since separable convolution has O(N*n) complexity, as opposed + * to O(N*n^2) for non-separable convolution. + * + * \sa SeparableConvolution, ATrousWaveletTransform, KernelFilter + */ +class PCL_CLASS SeparableFilter +{ +public: + + /*! + * Represents a filter coefficient. + */ + typedef float coefficient; + + /*! + * Represents a one-dimensional filter. + */ + typedef GenericVector coefficient_vector; + + /*! + * Represents a two-dimensional filter matrix. + */ + typedef GenericMatrix coefficient_matrix; + + /*! + * Constructs an empty %SeparableFilter object with optional \a name. + */ + SeparableFilter( const String& name = String() ) + : filterName( name ) + { + } + + /*! + * Constructs a %SeparableFilter object with the specified size \a n and + * optional \a name. Filter elements are not initialized, so they will + * contain unpredictable values. + * + * A %SeparableFilter object must be initialized with either a zero size + * (which yields an empty filter), or an odd size >= 3. + */ + SeparableFilter( int n, const String& name = String() ) + : rowFilter( PCL_VALID_KERNEL_SIZE( n ) ) + , colFilter( PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Constructs a %SeparableFilter object with the specified size \a n, initial + * element value \a x, and optional \a name. + * + * This constructor yields a separable filter corresponding to a box average + * two-dimentional filter whose weight is \a x. + */ + template + SeparableFilter( int n, const T& x, const String& name = String() ) + : rowFilter( x, PCL_VALID_KERNEL_SIZE( n ) ) + , colFilter( x, PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Constructs a %SeparableFilter object with the specified one-dimensional + * row and column filter vectors \a h and \a v, respectively, and an + * optional \a name. + */ + SeparableFilter( const coefficient_vector& h, const coefficient_vector& v, const String& name = String() ) + : rowFilter( h ) + , colFilter( v ) + , filterName( name ) + { + PCL_PRECONDITION( v.Length() == h.Length() ) + PCL_PRECONDITION( v.IsEmpty() || v.Length() >= 3 ) + PCL_PRECONDITION( v.IsEmpty() || (v.Length() & 1) ) + } + + /*! + * Constructs a %SeparableFilter object with the specified size \a n and + * optional \a name. Copies \a n filter coefficients from the specified + * static arrays \a h and \a v to the one-dimensional row and column filter + * vectors in this object, respectively. + */ + template + SeparableFilter( const T* h, const T* v, int n, const String& name = String() ) + : rowFilter( h, PCL_VALID_KERNEL_SIZE( n ) ) + , colFilter( v, PCL_VALID_KERNEL_SIZE( n ) ) + , filterName( name ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + } + + /*! + * Copy constructor. + */ + SeparableFilter( const SeparableFilter& ) = default; + + /*! + * Move constructor. + */ + SeparableFilter( SeparableFilter&& ) = default; + + /*! + * Destroys a %SeparableFilter object. + */ + virtual ~SeparableFilter() + { + } + + /*! + * Returns a pointer to a dynamically allocated duplicate of this separable + * filter. + * + * \note All derived classes from %SeparableFilter must reimplement this + * virtual member function. + */ + virtual SeparableFilter* Clone() const + { + return new SeparableFilter( *this ); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SeparableFilter& operator =( const SeparableFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SeparableFilter& operator =( SeparableFilter&& ) = default; + + /*! + * Assigns the specified scalar \a x to all filter coefficients. Returns a + * reference to this object. + */ + SeparableFilter& operator =( const coefficient& x ) + { + rowFilter = x; + colFilter = x; + return *this; + } + + /*! + * Returns true iff this %SeparableFilter object is equal to another instance + * \a f. Two %SeparableFilter instances are equal if their name and filter + * coefficients are equal. + */ + bool operator ==( const SeparableFilter& f ) const + { + return Name() == f.Name() && SameCoefficients( f ); + } + + /*! + * Returns the name of this %SeparableFilter object. + */ + String Name() const + { + return filterName; + } + + /*! + * Sets the name of this %SeparableFilter object. + */ + virtual void Rename( const String& newName ) + { + filterName = newName.Trimmed(); + } + + /*! + * Returns the size of this separable filter. The filter size is the length + * of the one-dimensional row and column filter vectors. + */ + int Size() const + { + return rowFilter.Length(); // both 1D filters have the same length + } + + /*! + * Sets the size of this separable filter. Previous filter contents are + * lost; the internal filter coefficient vectors will contain unpredictable + * values after calling this function. + */ + virtual void Resize( int n ) + { + PCL_PRECONDITION( n == 0 || n >= 3 ) + PCL_PRECONDITION( n == 0 || (n & 1) ) + if ( n == 0 ) + colFilter = rowFilter = coefficient_vector(); + else + colFilter = rowFilter = coefficient_vector( PCL_VALID_KERNEL_SIZE( n ) ); + } + + /*! + * Returns true iff this is an empy filter, i.e. if it has no coefficients. + */ + bool IsEmpty() const + { + return rowFilter.IsEmpty(); // both 1D filters have the same length + } + + /*! + * Returns a copy of the internal one-dimensional row filter vector. + */ + coefficient_vector RowFilter() const + { + return rowFilter; + } + + /*! + * Returns a copy of the internal one-dimensional column filter vector. + */ + coefficient_vector ColumnFilter() const + { + return colFilter; + } + + /*! + * This member function is an alias to ColumnFilter(). + */ + coefficient_vector ColFilter() const + { + return colFilter; + } + + /*! + * Returns a copy of the internal one-dimensional filter vector + * corresponding to the specified \a phase. If \a phase is zero, the row + * filter vector is returned; otherwise the column filter vector is returned. + */ + coefficient_vector Filter( int phase ) const + { + return phase ? colFilter : rowFilter; + } + + /*! + * Returns the weight of this separable filter. The weight is equal to the + * product of the sums of components in the row and column filter vectors. + */ + double Weight() const + { + return rowFilter.Sum() * colFilter.Sum(); + } + + /*! + * Returns true if this is a high-pass separable filter; false if this is a + * low-pass separable filter. + * + * A high-pass kernel filter has one or more negative coefficients. A + * low-pass kernel filter is either empty or all of its coefficients are + * positive or zero. For separable low-pass filters, all the nonzero + * coefficients in both the row and column filter vectors have the same + * sign. If this condition doesn't hold (i.e. if coefficient signs differ) + * then the object is a high-pass filter. + */ + bool IsHighPassFilter() const + { + int s = -1; + for ( coefficient_vector::const_iterator i = rowFilter.Begin(); i < rowFilter.End(); ++i ) + if ( *i != 0 ) + for ( s = *i < 0; ++i < rowFilter.End(); ) + if ( *i != 0 && (*i < 0) != s ) + return true; + for ( coefficient_vector::const_iterator i = colFilter.Begin(); i < colFilter.End(); ++i ) + if ( *i != 0 ) + for ( s = (s < 0) ? *i++ < 0 : s; i < colFilter.End(); ++i ) + if ( *i != 0 && (*i < 0) != s ) + return true; + return false; + } + + /*! + * Returns true iff this %SeparableFilter object has the same filter + * coefficients as another instance \a f. + */ + bool SameCoefficients( const SeparableFilter& f ) const + { + return colFilter == f.colFilter && rowFilter == f.rowFilter; + } + + /*! + * Deallocates filter coefficients and yields an empy %SeparableFilter + * object. This member function does not change the current filter name. + */ + virtual void Clear() + { + colFilter = rowFilter = coefficient_vector(); + } + +protected: + + /* + * Horizontal and vertical one-dimensional filters. The 2D filter matrix is + * equal to the product of these two vectors. + */ + coefficient_vector rowFilter; + coefficient_vector colFilter; + + /* + * Identifying name. + */ + String filterName; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SeparableFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SeparableFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SeparableMedianFilter.h b/3rdparty/include/pcl/SeparableMedianFilter.h new file mode 100644 index 0000000..f64388c --- /dev/null +++ b/3rdparty/include/pcl/SeparableMedianFilter.h @@ -0,0 +1,143 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SeparableMedianFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SeparableMedianFilter_h +#define __PCL_SeparableMedianFilter_h + +/// \file pcl/SeparableMedianFilter.h + +#include +#include + +#include +#include // PCL_VALID_KERNEL_SIZE() +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SeparableMedianFilter + * \brief A two-dimensional separable filter that approximates a median filter. + * + * ### TODO: Write a detailed description for %SeparableMedianFilter. + */ +class PCL_CLASS SeparableMedianFilter : public ImageTransformation, + public ParallelProcess +{ +public: + + /*! + * Constructs a %SeparableMedianFilter object with the specified size. + * + * \param size Size of the separable median filter in pixels. Must be an + * odd integer >= 3 (3, 5, 7, ...). + */ + SeparableMedianFilter( int size = 3 ) + : m_size( PCL_VALID_KERNEL_SIZE( size ) ) + { + PCL_PRECONDITION( size >= 3 && size&1 == 1 ) + } + + /*! + * Copy constructor. + */ + SeparableMedianFilter( const SeparableMedianFilter& ) = default; + + /*! + * Destroys this %SeparableMedianFilter object. + */ + virtual ~SeparableMedianFilter() + { + } + + /*! + * Returns the current size in pixels of this separable median filter. + */ + int Size() const + { + return m_size; + } + + /*! + * Sets a new \a size in pixels for this separable median filter object. The + * specified size must be an odd integer > 3 (3, 5, 7, ...). + */ + void SetSize( int size ) + { + PCL_PRECONDITION( size >= 3 && size&1 == 1 ) + m_size = PCL_VALID_KERNEL_SIZE( size ); + } + +protected: + + int m_size; // filter size + + /* + * In-place 2-D separable median approximation filter. + */ + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SeparableMedianFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SeparableMedianFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Settings.h b/3rdparty/include/pcl/Settings.h new file mode 100644 index 0000000..1406168 --- /dev/null +++ b/3rdparty/include/pcl/Settings.h @@ -0,0 +1,896 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Settings.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Settings_h +#define __PCL_Settings_h + +/// \file pcl/Settings.h + +#include +#include + +#include +#include + +#ifndef __PCL_NO_FLAGS_SETTINGS_IO +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Settings + * \brief Persistent module settings. + * + * %Settings implements an interface to store and manage module settings that + * can persist across sessions. %Settings makes it possible for a module to + * \e remember its own private data, as specific user preferences and other + * operating parameters. %Settings data items are stored and retrieved as + * \e key/value pairs. + * + * %Module settings can be accessed in two \e spaces. One is the local + * settings space, which is used by a module to read and write its own + * private settings data, or settings \e keys that have been created by the + * module. %Module settings can also be accessed from the global module + * settings space, which refers to settings data created by other modules. + * Thanks to the global module settings space, processes and file formats can + * share their working settings publicly on the whole PixInsight platform. For + * example, a module can learn the current orientation of FITS images by + * reading the value of the \e /FITS/FITSBottomUp key, which is maintained by + * the standard FITS support module. + * + * %Settings provides a high-level, platform-independent mechanism for settings + * management. The PixInsight core application carries out all the necessary + * platform-specific work to store and retrieve module settings data behind the + * scenes. + * + * This class must not be confused with PixInsightSettings, which provides + * access to \e global settings pertaining to the whole PixInsight platform. + * %Settings manages private module settings exclusively. Private module + * settings cannot be retrieved through %PixInsightSettings. + * + * \sa PixInsightSettings + */ +class PCL_CLASS Settings +{ +public: + + /*! + * Default constructor. This constructor is disabled because %Settings is + * not an instantiable class. + */ + Settings() = delete; + + /*! + * Copy constructor. This constructor is disabled because %Settings is not + * an instantiable class. + */ + Settings( const Settings& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %Settings is not an + * instantiable class. + */ + Settings& operator =( const Settings& ) = delete; + + /*! + * Destructor. This destructor is disabled because %Settings is not an + * instantiable class. + */ + ~Settings() = delete; + + /*! + * Reads a sequence of bytes from the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param[out] b Reference to a ByteArray object where existing data will + * be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to a + * sequence of bytes, in which case the existing data are read and stored in + * the \a b array. Otherwise this function returns false and the previous + * contents of the \a b array are not modified. + */ + static bool Read( const IsoString& key, ByteArray& b ); + + /*! + * Reads a sequence of bytes from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] b Reference to a ByteArray object where existing data will + * be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to a sequence of bytes, in which case the + * existing data are read and stored in the \a b array. Otherwise this + * function returns false and the previous contents of the \a b array are + * not modified. + */ + static bool ReadGlobal( const IsoString& key, ByteArray& b ); + + /*! + * Reads a Unicode string (UTF-16) from the local settings space of + * the current module. + * + * \param key A settings key for the current module. + * + * \param[out] s Reference to a String object where existing data will be + * stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to a + * Unicode string, in which case the existing data are read and stored in + * the \a s string. Otherwise this function returns false and the previous + * contents of the \a s string are not modified. + */ + static bool Read( const IsoString& key, String& s ); + + /*! + * Reads a Unicode string (UTF-16) from the global module settings + * space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] s Reference to a String object where existing data will be + * stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to a Unicode string, in which case the + * existing data are read and stored in the \a s string. Otherwise this + * function returns false and the previous contents of the \a s string are + * not modified. + */ + static bool ReadGlobal( const IsoString& key, String& s ); + + /*! + * Reads a Boolean value from the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param[out] b Reference to a \c bool variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to + * the \c bool type, in which case the existing data are read and stored in + * the \a b variable. Otherwise this function returns false and the previous + * contents of the \a b variable are not modified. + */ + static bool Read( const IsoString& key, bool& b ); + + /*! + * Reads a Boolean value from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] b Reference to a \c bool variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to the \c bool type, in which case the + * existing data are read and stored in the \a b variable. Otherwise this + * function returns false and the previous contents of the \a b variable are + * not modified. + */ + static bool ReadGlobal( const IsoString& key, bool& b ); + + /*! + * Reads an integer value from the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param[out] i Reference to an \c int variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to + * the \c int type, in which case the existing data are read and stored in + * the \a i variable. Otherwise this function returns false and the previous + * contents of the \a i variable are not modified. + */ + static bool Read( const IsoString& key, int& i ); + + /*! + * Reads an integer value from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] i Reference to an \c int variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to the \c int type, in which case the existing + * data are read and stored in the \a i variable. Otherwise this function + * returns false and the previous contents of the \a i variable are not + * modified. + */ + static bool ReadGlobal( const IsoString& key, int& i ); + + /*! + * Reads an unsigned integer value from the local settings space of + * the current module. + * + * \param key A settings key for the current module. + * + * \param[out] u Reference to an \c unsigned \c int variable where the + * existing value will be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to + * the \c unsigned type, in which case the existing data are read and stored + * in the \a u variable. Otherwise this function returns false and the + * previous contents of the \a u variable are not modified. + */ + static bool Read( const IsoString& key, unsigned& u ); + + /*! + * Reads an unsigned integer value from the global module settings + * space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] u Reference to an \c unsigned \c int variable where the + * existing value will be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to the \c unsigned type, in which case the + * existing data are read and stored in the \a u variable. Otherwise this + * function returns false and the previous contents of the \a u variable are + * not modified. + */ + static bool ReadGlobal( const IsoString& key, unsigned& u ); + + /*! + * Reads a \c double value from the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param[out] f Reference to a \c double variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to + * the \c double type, in which case the existing data are read and stored + * in the \a f variable. Otherwise this function returns false and the + * previous contents of the \a f variable are not modified. + */ + static bool Read( const IsoString& key, double& f ); + + /*! + * Reads a \c double value from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] f Reference to a \c double variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to the \c double type, in which case the + * existing data are read and stored in the \a f variable. Otherwise this + * function returns false and the previous contents of the \a f variable are + * not modified. + */ + static bool ReadGlobal( const IsoString& key, double& f ); + + /*! + * Reads a \c float value from the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param[out] f Reference to a \c float variable where the existing value + * will be stored. + * + * This is an overloaded member function, provided for convenience. It + * behaves essentially like the Read( const IsoString&, double& ) member + * function. + */ + static bool Read( const IsoString& key, float& f ) + { + double d; Read( key, d ); + if ( LastReadOK() ) { f = float( d ); return true; } + return false; + } + + /*! + * Reads a \c float value from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] f Reference to a \c float variable where the existing value + * will be stored. + * + * This is an overloaded member function, provided for convenience. It + * behaves essentially like the ReadGlobal( const IsoString&, double& ) + * member function. + */ + static bool ReadGlobal( const IsoString& key, float& f ) + { + double d; ReadGlobal( key, d ); + if ( LastReadOK() ) { f = float( d ); return true; } + return false; + } + +#ifndef __PCL_NO_SETTINGS_TEMPLATES + + /*! + * A generalized function that reads a settings \a key as a \c signed + * \c int, converts that value to type T, and stores it in the specified + * variable \a t. + * + * Returns true iff the \a key exists and its value can be converted to + * \c int. If the function fails (if it returns false), the previous value + * of the \a t variable is not changed. + * + * This is a convenience template member function. It behaves essentially + * like the Read( const IsoString&, int& ) member function. + */ + template + static bool ReadI( const IsoString& key, T& t ) + { + int i; Read( key, i ); + if ( LastReadOK() ) { t = T( i ); return true; } + return false; + } + + + /*! + * A generalized function that reads a settings \a key as an \c unsigned + * \c int, converts that value to type T, and stores it in the specified + * variable \a t. + * + * Returns true iff the \a key exists and its value can be converted to + * \c unsigned \c int. If the function fails (if it returns false), the + * previous value of the \a t variable is not changed. + * + * This is a convenience template member function. It behaves essentially + * like the Read( const IsoString&, unsigned& ) member function. + */ + template + static bool ReadU( const IsoString& key, T& t ) + { + unsigned u; Read( key, u ); + if ( LastReadOK() ) { t = T( u ); return true; } + return false; + } + +#endif + +#ifndef __PCL_NO_FLAGS_SETTINGS_IO + + /*! + * Reads a Flags value from the local settings space of the current + * module. + * + * \param key A settings key for the current module. + * + * \param[out] f Reference to a Flags variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the local + * settings space of the current module and its value can be converted to + * the \c unsigned \c int type, in which case the existing data are read and + * stored in the \a f variable as a flags mask. Otherwise this + * function returns false and the previous contents of the \a f variable are + * not modified. + */ + template + static bool Read( const IsoString& key, Flags& f ) + { + return Read( key, f.m_flags ); + } + + /*! + * Reads a Flags value from the global module settings space. + * + * \param key A module settings key. Should include the name of a + * module, as in /ModuleName/KeyName. + * + * \param[out] f Reference to a Flags variable where the existing value + * will be stored. + * + * Returns true if the specified settings \a key exists in the global module + * settings space, it has not been read-protected by its owner module, and + * its value can be converted to the \c unsigned \c int type, in which case + * the existing data are read and stored in the \a f variable as a flags + * mask. Otherwise this function returns false and the previous + * contents of the \a f variable are not modified. + */ + template + static bool ReadGlobal( const IsoString& key, Flags& f ) + { + return ReadGlobal( key, f.m_flags ); + } + +#endif + + /*! + * Returns true iff the last call to a Read member function successfully + * read a settings key. + */ + static bool LastReadOK(); + + /*! + * Writes a sequence of bytes to the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param b Reference to a ByteArray object whose contents will be + * written as the value associated to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a b. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, const ByteArray& b ); + + /*! + * Writes a sequence of bytes to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param b Reference to a ByteArray object whose contents will be + * written as the value associated to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a b. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, const ByteArray& b ); + + /*! + * Writes a Unicode string (UTF-16) to the local settings space of + * the current module. + * + * \param key A settings key for the current module. + * + * \param s Reference to a String object whose contents will be written + * as the value associated to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a s. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, const String& s ); + + /*! + * Writes a Unicode string (UTF-16) to the global module settings + * space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param s Reference to a String object whose contents will be written + * as the value associated to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a s. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, const String& s ); + + /*! + * Writes a Boolean value to the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param b A \c bool value that will be written as the value associated + * to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a b. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, bool b ); + + /*! + * Writes a Boolean value to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param b A \c bool value that will be written as the value associated + * to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a b. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, bool b ); + + /*! + * Writes an integer value to the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param i An \c int value that will be written as the value associated + * to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a i. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, int i ); + + /*! + * Writes an integer value to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param i An \c int value that will be written as the value associated + * to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a i. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, int i ); + + /*! + * Writes an unsigned integer value to the local settings space of + * the current module. + * + * \param key A settings key for the current module. + * + * \param u An \c unsigned \c int value that will be written as the value + * associated to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a u. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, unsigned u ); + + /*! + * Writes an unsigned integer value to the global module settings + * space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param u An \c unsigned \c int value that will be written as the value + * associated to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a u. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, unsigned u ); + + /*! + * Writes a \c double value to the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param f A \c double value that will be written as the value + * associated to \a key. + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a f. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Write( const IsoString& key, double f ); + + /*! + * Writes a \c double value to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param f A \c double value that will be written as the value + * associated to \a key. + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a f. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void WriteGlobal( const IsoString& key, double f ); + + /*! + * Writes a \c float value to the local settings space of the + * current module. + * + * \param key A settings key for the current module. + * + * \param f A \c float value that will be written as the value associated + * to \a key. + * + * This is an overloaded member function, provided for convenience. It + * behaves essentially like the Write( const IsoString&, double ) member + * function. + */ + static void Write( const IsoString& key, float f ) + { + Write( key, double( f ) ); + } + + /*! + * Writes a \c float value to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param f A \c float value that will be written as the value associated + * to \a key. + * + * This is an overloaded member function, provided for convenience. It + * behaves essentially like the WriteGlobal( const IsoString&, double ) + * member function. + */ + static void WriteGlobal( const IsoString& key, float f ) + { + WriteGlobal( key, double( f ) ); + } + +#ifndef __PCL_NO_SETTINGS_TEMPLATES + + /*! + * A generalized function that converts a value of type T to \c signed + * \c int and writes it to the specified settings \a key. + * + * This is a convenience template member function. It behaves essentially + * like the Write( const IsoString&, int ) member function. + */ + template + static void WriteI( const IsoString& key, T t ) + { + Write( key, int( t ) ); + } + + /*! + * A generalized function that converts a value of type T to \c unsigned + * \c int and writes it to the specified settings \a key. + * + * This is a convenience template member function. It behaves essentially + * like the Write( const IsoString&, unsigned ) member function. + */ + template + static void WriteU( const IsoString& key, T t ) + { + Write( key, unsigned( t ) ); + } + +#endif + +#ifndef __PCL_NO_FLAGS_SETTINGS_IO + + /*! + * Writes a Flags value to the local settings space of the current + * module. + * + * \param key A settings key for the current module. + * + * \param f A Flags value that will be written as the value associated to + * \a key (as an \c unsigned \c int value). + * + * If the specified settings \a key does not exist in the local settings + * space of the current module, it is newly created with the specified value + * \a f. If \a key already exists, its previous value is replaced. + * + * In the event of I/O error this member function throws an Error exception. + */ + template + static void Write( const IsoString& key, Flags f ) + { + Write( key, f.m_flags ); + } + + /*! + * Writes a Flags value to the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * \param f A Flags value that will be written as the value associated to + * \a key (as an \c unsigned \c int value). + * + * If the specified settings \a key does not exist in the global module + * settings space, it is newly created with the specified value \a f. If + * \a key already exists, its previous value is replaced. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + template + static void WriteGlobal( const IsoString& key, Flags f ) + { + WriteGlobal( key, f.m_flags ); + } + +#endif + + /*! + * Deletes the specified settings \a key from the local settings + * space of the current module. + * + * In the event of I/O error this member function throws an Error exception. + */ + static void Remove( const IsoString& key ); + + /*! + * Deletes a settings key from the global module settings space. + * + * \param key A module settings key. Should include the name of a module, + * as in /ModuleName/KeyName. + * + * In the event of I/O error, or if the specified \a key is write-protected, + * this member function throws an Error exception. + * + * \note By default, write access to module settings items is not allowed + * unless explicitly enabled through a call to SetGlobalKeyAccess(). + */ + static void RemoveGlobal( const IsoString& key ); + + /*! + * Returns true iff the specified \a key can be read from the global + * module settings space. + * + * By default, a module settings key can be freely read unless its owner + * module explicitly disables global reading by calling the + * SetGlobalKeyAccess() static member function. + */ + static bool CanReadGlobal( const IsoString& key ); + + /*! + * Returns true iff the specified \a key can be written from the global + * module settings space. + * + * By default, global write access to a module settings key is not allowed + * unless its owner module explicitly enables global writing by calling the + * SetGlobalKeyAccess() static member function. + */ + static bool CanWriteGlobal( const IsoString& key ); + + /*! + * Changes global access permissions for the specified settings \a key in + * the local settings space of the current module. + * + * \param key A settings key for the current module. + * + * \param allowRead Whether other modules can read the value of \a key. + * + * \param allowWrite Whether other modules can write the value of \a key + * and delete \a key. + * + * If this function is not called for a particular settings key, only read + * access is possible by default from the global module settings space. + */ + static void SetGlobalKeyAccess( const IsoString& key, bool allowRead, bool allowWrite ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Settings_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Settings.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SharedPixelData.h b/3rdparty/include/pcl/SharedPixelData.h new file mode 100644 index 0000000..90a52c1 --- /dev/null +++ b/3rdparty/include/pcl/SharedPixelData.h @@ -0,0 +1,249 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SharedPixelData.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SharedPixelData_h +#define __PCL_SharedPixelData_h + +/// \file pcl/SharedPixelData.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SharedPixelData + * \brief Handles transparent, type-independent allocation of local and shared + * pixel data blocks. + * + * \internal This is a low-level class internally used by PCL classes and + * functions. It is not intended to be used directly by user-level modules. + * Unless you are a PixInsight core or PCL maintainer, you should not need or + * attempt to use or instantiate this class. + */ +class PCL_CLASS SharedPixelData +{ +public: + + typedef ColorSpace::value_type color_space; + + /*! + * Constructs a %SharedPixelData object that represents a local image. + */ + SharedPixelData() = default; + + /*! + * References an existing shared image with the specified handle and sample + * data type. + * + * \param handle Handle to a shared image. + * + * \param bitsPerSample Number of bits per pixel sample. + * + * \param floatSample Whether this image stores floating point pixel + * data, or integer pixel data. + * + * \param complexSample Whether this image stores complex pixel data or + * real pixel data. + * + * \note This constructor throws an Error exception if the specified handle + * does not correspond to an existing shared image, or if the existing + * shared image does not have the specified sample data type. + */ + SharedPixelData( void* handle, int bitsPerSample, bool floatSample, bool complexSample ); + + /*! + * Creates a new shared image with the specified geometry, sample data type + * and color space. + * + * \param width %Image width in pixels. + * + * \param height %Image height in pixels. + * + * \param numberOfChannels Number of channels, including nominal channels or + * color components and alpha channels. + * + * \param bitsPerSample Number of bits per pixel sample. + * + * \param floatSample Whether this image stores floating point pixel + * data, or integer pixel data. + * + * \param colorSpace Color space where pixels are represented. + */ + SharedPixelData( int width, int height, int numberOfChannels, + int bitsPerSample, bool floatSample, int colorSpace ); + + /*! + * Copy constructor. + * + * If the argument object \a x represents a shared image, this constructor + * references the same shared image. If \a x is a local image, this function + * just copies the null handle and has no further effect. + */ + SharedPixelData( const SharedPixelData& x ) + : m_handle( x.m_handle ) + { + Attach(); + } + + /*! + * Virtual destructor. + * + * If this object represents a shared image, it is dereferenced. If the + * shared image becomes unreferenced, it will be garbage-collected and + * eventually destroyed by the PixInsight core application. + * + * If this object represents a local image, this destructor has no effect. + */ + virtual ~SharedPixelData() + { + Detach(); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * If this object represents a shared image, it is dereferenced. If the + * specified object \a x represents a shared image, then this object will + * reference it; otherwhise this operator just copies the null handle + * without further effect. + */ + SharedPixelData& operator =( const SharedPixelData& x ) + { + if ( m_handle != x.m_handle ) + { + Detach(); + m_handle = x.m_handle; + Attach(); + } + return *this; + } + + /*! + * Returns true iff this object represents the same shared image as another + * object \a x, or if both objects represent local images. + */ + bool operator ==( const SharedPixelData& x ) const noexcept + { + return m_handle == x.m_handle; + } + + /*! + * Returns the handle to the shared image represented by this object, or + * zero (a null pointer) if this object represents a local image. + */ + void* Handle() const noexcept + { + return m_handle; + } + + /*! + * Returns true if this object represents a shared image; false if it + * represents a local image. Shared images live in the PixInsight core + * application. Local images live in the calling module. + */ + bool IsShared() const noexcept + { + return m_handle != nullptr; + } + + /*! + * Returns true iff the shared image represented by this object is not + * uniquely referenced, i.e. if there exist other %SharedPixelData objects + * representing the same shared image. Returns false if the shared image is + * only referenced by this object, or if this object represents a local + * image. + */ + bool IsAliased() const; + + /*! + * Returns true iff this object is the owner of the represented shared image. + * Returns false if this object does not own the shared image, or if this + * object does not represent a shared image. + */ + bool IsOwner() const; + +private: + + void* m_handle = nullptr; + + void Attach(); + void Detach(); + +protected: + + void* Allocate( size_type sizeInBytes ) const; + void Deallocate( void* ) const; + + void** GetSharedData() const; + void SetSharedData( void** ptrToShared ); + + void GetSharedGeometry( int& width, int& height, int& numberOfChannels ); + void SetSharedGeometry( int width, int height, int numberOfChannels ); + + void GetSharedColor( color_space& colorSpace, RGBColorSystem& RGBWS ); + void SetSharedColor( color_space colorSpace, const RGBColorSystem& RGBWS ); + + template friend class GenericImage; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SharedPixelData_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SharedPixelData.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ShepardInterpolation.h b/3rdparty/include/pcl/ShepardInterpolation.h new file mode 100644 index 0000000..e7f1cb3 --- /dev/null +++ b/3rdparty/include/pcl/ShepardInterpolation.h @@ -0,0 +1,842 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ShepardInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ShepardInterpolation_h +#define __PCL_ShepardInterpolation_h + +/// \file pcl/ShepardInterpolation.h + +#include +#include + +#include +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * Default normalized search radius for local Shepard interpolation. This is an + * initial search radius relative to the unit circle for the adaptive quadtree + * search algorithm. + */ +#define __PCL_SHEPARD_DEFAULT_SEARCH_RADIUS 0.10 + +/* + * Default power parameter for local Shepard interpolation. Larger values tend + * to yield more accurate interpolation devices. Small powers lead to more + * approximating (smoothing) devices. The chosen default value is intermediate. + */ +#define __PCL_SHEPARD_DEFAULT_POWER 4 + +/* + * Default regularization (smoothing) factor for local Shepard interpolation, + * in the range [0,1). This is a clipping fraction for Winsorization of nearby + * function values in the point interpolation routine. + */ +#define __PCL_SHEPARD_DEFAULT_REGULARIZATION 0 + +// ---------------------------------------------------------------------------- + +/*! + * \class ShepardInterpolation + * \brief Two-dimensional surface interpolation with the local Shepard method. + * + * %ShepardInterpolation implements the Shepard method of function + * interpolation/approximation for arbitrarily distributed input nodes in two + * dimensions. + * + * This class implements local Shepard interpolation with Franke-Little + * weights, quadtree structures for fast rectangular search of input nodes, + * optional regularization, and an adaptive local interpolation search routine. + * + * \b References + * + * Shepard, Donald (1968). A two-dimensional interpolation function for + * irregularly-spaced data. Proceedings of the 1968 ACM National + * Conference, pp. 517-524. + * + * Franke, Richard (1982). Scattered data interpolation: tests of some + * methods. Mathematics of Computation 38 (1982), pp. 181-200. + * + * Hanan Samet, Foundations of Multidimensional and Metric Data + * Structures, Morgan Kaufmann, 2006, Section 1.4. + * + * Mark de Berg et al, Computational Geometry: Algorithms and Applications + * Third Edition, Springer, 2010, Chapter 14. + * + * \sa SurfaceSpline, SurfacePolynomial, QuadTree + */ +template +class PCL_CLASS ShepardInterpolation +{ +public: + + /*! + * Represents a vector of coordinates or function values. + */ + typedef GenericVector vector_type; + + /*! + * The numeric type used to represent coordinates and function values. + */ + typedef typename vector_type::scalar scalar; + + /*! + * The class used to implement fast coordinate search operations. + */ + typedef QuadTree search_tree; + + /*! + * The class used to specify interpolation regions. + */ + typedef typename search_tree::rectangle search_rect; + + /*! + * The maximum number of interpolation points in a leaf quadtree node. + */ + constexpr static int BucketCapacity = 16; + + /*! + * Default constructor. Constructs an empty %ShepardInterpolation object. + */ + ShepardInterpolation() = default; + + /*! + * Copy constructor. Copy construction is disabled because this class uses + * internal data structures that cannot be copy-constructed. However, + * %ShepardInterpolation implements move construction and move assignment. + */ + ShepardInterpolation( const ShepardInterpolation& ) = delete; + + /*! + * Move constructor. + */ + ShepardInterpolation( ShepardInterpolation&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~ShepardInterpolation() + { + } + + /*! + * Copy assignment operator. Copy assignment is disabled because this class + * uses internal data structures that cannot be copy-assigned. However, + * %ShepardInterpolation implements move assignment and move construction. + */ + ShepardInterpolation& operator =( const ShepardInterpolation& ) = delete; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + ShepardInterpolation& operator =( ShepardInterpolation&& ) = default; + + /*! + * Returns true iff this object is valid. A valid %ShepardInterpolation + * object has been initialized with a sufficient number of input nodes. + */ + bool IsValid() const + { + return !m_T.IsEmpty(); + } + + /*! + * Sets the power parameter of the local Shepard interpolation. + * + * \param m Power parameter. Must be > 0. + * + * The power parameter is a positive real > 0 that defines the behavior of + * the interpolation/approximation function. For large values of \a m, the + * interpolating surface tends to be uniform within boundaries defined + * around input nodes, and hence is more local. For values of \a m ≤ 2, + * the surface is more global, that is, interpolated values are more + * influenced by nodes far away from the interpolation coordinates. The + * default power parameter value is 4. + * + * If an invalid value \a m ≤ 0 is specified, the default \a m = 4 power + * parameter value will be set. + * + * Calling this member function does not reset this %ShepardInterpolation + * object, since no internal structures built upon initialization depend on + * the power parameter. This facilitates the use of this class to compare + * the results of different power parameter values applied to the same data. + */ + void SetPower( int m ) + { + PCL_PRECONDITION( m > 0 ) + m_mu = (m > 0) ? m : __PCL_SHEPARD_DEFAULT_POWER; + } + + /*! + * Returns the current power parameter of this local Shepard interpolation. + * + * See SetPower() for more information. + */ + int Power() const + { + return m_mu; + } + + /*! + * Sets the normalized search radius of the local Shepard interpolation. + * + * \param R Search radius in the range (0,1]. + * + * The search radius defines a distance from the interpolation point where + * existing input nodes will be used to compute an interpolated function + * value. Larger values of \a R will construct more global interpolation + * surfaces, while smaller values will tend to yield more local + * interpolations. Smaller search radii will also lead to faster + * interpolation devices, since the computational complexity is reduced as + * the number of input nodes used for each interpolation point decreases. + * + * The search radius parameter is normalized to the (0,1] range in this + * implementation, where 1 represents the largest distance between two + * distinct input nodes, or equivalently, the size of the interpolation + * region. The default search radius is 0.1. + * + * If an invalid value \a R ≤ 0 is specified, the default \a R = 0.1 + * search radius parameter value will be set. + * + * Calling this member function does not reset this %ShepardInterpolation + * object, since no internal structures built upon initialization depend on + * the search radius. This facilitates the use of this class to compare the + * results of different search radius values applied to the same data. + */ + void SetRadius( double R ) + { + PCL_PRECONDITION( R > 0 ) + m_R = (R < 0 || 1 + R == 1) ? __PCL_SHEPARD_DEFAULT_SEARCH_RADIUS : R; + } + + /*! + * Returns the current normalized search radius of this local Shepard + * interpolation. See SetRadius() for more information. + */ + double Radius() const + { + return m_R; + } + + /*! + * Sets the smoothing factor of the local Shepard interpolation. + * + * \param r Smoothing factor in the range [0,1). + * + * For \a r > 0, a regularized local interpolation will be applied. The \a r + * argument represents a fraction of the count of nearby function samples + * that will be Winsorized, that is, replaced with their r-th nearest value + * at the top and the tail of the interpolation sample. + * + * For \a r = 0, a normal (unsmoothed) local Shepard interpolation scheme is + * used. This is the default state for newly created instances of + * %ShepardInterpolation. + * + * If an invalid value \a r < 0 or \a r ≥ 1 is specified, the default + * \a r = 0 smoothing factor will be set. + */ + void SetSmoothing( float r ) + { + PCL_PRECONDITION( r >= 0 && r < 1 ) + m_r = (r < 0 || r >= 1) ? __PCL_SHEPARD_DEFAULT_REGULARIZATION : r; + } + + /*! + * Returns the smoothing factor of this local Shepard + * interpolation. See SetSmoothing() for more information. + */ + float Smoothing() const + { + return m_r; + } + + /*! + * Generation of a two-dimensional surface approximation. + * + * \param x X node coordinates. + * + * \param y Y node coordinates. + * + * \param z Node values. + * + * \param n Number of nodes. There must be at least three distinct + * input nodes. + * + * The input nodes can be arbitrarily distributed and don't need to follow + * any specific order. However, all node points should be distinct with + * respect to the machine epsilon for the floating point type T. + * + * This initialization function includes a sanitization routine. If there + * are duplicate points in the specified set of input nodes, only the first + * occurrence of each duplicate will be kept to build the interpolation + * surface, and the rest of duplicate points will be ignored. Two points are + * considered equal if their coordinates don't differ more than the machine + * epsilon for the floating point type T. + */ + void Initialize( const T* x, const T* y, const T* z, int n ) + { + DoInitialize( nullptr/*rect*/, x, y, z, n ); + } + + /*! + * Generation of a two-dimensional surface approximation with a prescribed + * rectangular interpolation region. + * + * \param rect The rectangular region for interpolation. + * + * \param x X node coordinates. + * + * \param y Y node coordinates. + * + * \param z Node values. + * + * \param n Number of nodes. There must be at least three distinct + * input nodes within the specified interpolation region. + * + * The input nodes can be arbitrarily distributed and don't need to follow + * any specific order. However, all node points should be distinct with + * respect to the machine epsilon for the floating point type T. + * + * This initialization function includes a sanitization routine. If there + * are duplicate points in the specified set of input nodes, only the first + * occurrence of each duplicate will be kept to build the interpolation + * surface, and the rest of duplicate points will be ignored. Two points are + * considered equal if their coordinates don't differ more than the machine + * epsilon for the floating point type T. + * + * This function will only take into account input nodes located within the + * specified region \a rect; all points outside this region will be ignored. + * A prescribed interpolation region is useful to ensure that the + * approximation surface can be evaluated on the entire region, for example + * to represent images or other data sets, not necessarily bounded by the + * extreme coordinates in the set of input nodes. Specifying a region also + * allows to use a reduced subset of the available data, to accelerate + * calculations. + */ + void Initialize( const search_rect& rect, const T* x, const T* y, const T* z, int n ) + { + DoInitialize( &rect, x, y, z, n ); + } + + /*! + * Two-dimensional surface interpolation/approximation with the local + * Shepard method. Returns an approximated function value at the specified + * \a x and \a y coordinates. + * + * The interpolation function uses an adaptive point search routine. The + * current search radius is used as an initial parameter. If less than + * three input nodes are found within the search radius distance from the + * desired interpolation point, the radius is increased and a new search is + * performed. This is repeated until at least three nodes are found around + * the specified interpolation point. + * + * In degenerate cases where no valid solution can be found, zero is + * returned conventionally. These cases are rare and may only happen if the + * input nodes are very close together with respect to the machine epsilon + * for the numeric type T. + */ + T operator ()( double x, double y ) const + { + PCL_PRECONDITION( !m_T.IsEmpty() ) + + const double dx = m_r0*(x - m_x0); + const double dy = m_r0*(y - m_y0); + + for ( double R = m_R; ; R += m_R ) + { + int m = 0; + double R2 = R*R; + Array V; + m_T.Search( DRect( dx-R, dy-R, dx+R, dy+R ), + [&]( const vector_type& v, void* ) + { + double x = dx - v[0]; + double y = dy - v[1]; + double r2 = x*x + y*y; + if ( r2 < R2 ) + { + ++m; + double w = PowI( 1 - Sqrt( r2 )/R, m_mu ); + /* + * N.B. The equivalent code below is about 400 times + * slower than the above call to PowI() for m_mu=16. + * Measured on a TR 2990WX. + * + double w = 1 - Sqrt( r2 )/R; + for ( int i = 1; i < m_mu; ++i ) + w *= w; + */ + V << DPoint( w, w*v[2] ); + } + }, + nullptr ); + if ( m >= 3 ) + { + if ( m_r > 0 ) + { + /* + * Regularization by Winsorization of the weighted sample. + */ + int r = Min( TruncInt( m_r * m ), (m >> 1) - (m & 1)^1 ); + if ( r > 0 ) + { + V.Sort( []( const DPoint& v1, const DPoint& v2 ) + { + return v1.y < v2.y; + } ); + for ( int i = 0; i < r; ++i ) + { + V[i].y = V[r].y; + V[m-i-1].y = V[m-r-1].y; + } + } + } + DPoint Wz( 0 ); + for ( const DPoint& v : V ) + Wz += v; + if ( 1 + Wz.x != 1 ) + return T( Wz.y/Wz.x ); + if ( R >= 1 ) + break; // degenerate! + } + } + + return 0; // empty!? + } + + /*! + * Returns an interpolated/approximated function value at the specified + * \a p.x and \a p.y point coordinates. See operator()( double, double ) for + * more information. + */ + template + T operator ()( const GenericPoint& p ) const + { + return operator ()( double( p.x ), double( p.y ) ); + } + + /*! + * Resets this %ShepardInterpolation object, deallocating all internal + * working structures. + */ + void Clear() + { + m_T.Clear(); + } + +protected: + + double m_r0 = 1; // scaling factor for normalization of node coordinates + double m_x0 = 0; // zero offset for normalization of X node coordinates + double m_y0 = 0; // zero offset for normalization of Y node coordinates + int m_mu = __PCL_SHEPARD_DEFAULT_POWER; // power parameter (leveling factor) + double m_R = __PCL_SHEPARD_DEFAULT_SEARCH_RADIUS; // initial search radius + float m_r = __PCL_SHEPARD_DEFAULT_REGULARIZATION; // regularization (clipping fraction) + search_tree m_T; // tree points store input coordinates and function values + + /*! + * Performs input data normalization and sanitization. Builds the point + * search quadtree with normalized node coordinates. + * \internal + */ + void DoInitialize( const search_rect* rect, const T* x, const T* y, const T* z, int n ) + { + PCL_PRECONDITION( x != nullptr && y != nullptr && z != nullptr ) + PCL_PRECONDITION( n > 2 ) + + if ( n < 3 ) + throw Error( "ShepardInterpolation::Initialize(): At least three input nodes must be specified." ); + + Clear(); + + try + { + if ( rect == nullptr ) + { + /* + * Find mean coordinate values. + */ + m_x0 = m_y0 = 0; + for ( int i = 0; i < n; ++i ) + { + m_x0 += x[i]; + m_y0 += y[i]; + } + m_x0 /= n; + m_y0 /= n; + + /* + * Find radius of unit circle. + */ + m_r0 = 0; + for ( int i = 0; i < n; ++i ) + { + double dx = x[i] - m_x0; + double dy = y[i] - m_y0; + double r = Sqrt( dx*dx + dy*dy ); + if ( r > m_r0 ) + m_r0 = r; + } + } + else + { + m_x0 = rect->CenterX(); + m_y0 = rect->CenterY(); + m_r0 = rect->Diagonal()/2; + } + + if ( 1 + m_r0 == 1 ) + throw Error( "ShepardInterpolation::Initialize(): Empty or insignificant interpolation space." ); + m_r0 = 1/m_r0; + + /* + * Build working vector. Transform coordinates to the unit circle. + */ + Array V; + for ( int i = 0; i < n; ++i ) + V << vector_type( m_r0*(x[i] - m_x0), m_r0*(y[i] - m_y0), z[i] ); + + /* + * Find and remove duplicate input nodes. Two nodes are equal if their + * coordinates don't differ more than the machine epsilon for the + * floating point type T. + */ + V.Sort( []( const vector_type& p, const vector_type& q ) + { + return (p[0] != q[0]) ? p[0] < q[0] : p[1] < q[1]; + } ); + Array remove; + for ( int i = 0, j = 1; j < n; ++i, ++j ) + if ( Abs( V[i][0] - V[j][0] ) <= std::numeric_limits::epsilon() ) + if ( Abs( V[i][1] - V[j][1] ) <= std::numeric_limits::epsilon() ) + remove << i; + if ( !remove.IsEmpty() ) + { + Array U; + int i = 0; + for ( int j : remove ) + { + for ( ; i < j; ++i ) + U << V[i]; + ++i; + } + for ( ; i < n; ++i ) + U << V[i]; + if ( U.Length() < 3 ) + throw Error( "ShepardInterpolation::Initialize(): Less than three input nodes left after sanitization." ); + V = U; + } + + /* + * Build the point search tree. + */ + if ( rect == nullptr ) + m_T.Build( V, BucketCapacity ); + else + { + m_T.Build( *rect, V, BucketCapacity ); + if ( m_T.Length() < 3 ) + throw Error( "ShepardInterpolation::Initialize(): Less than three input nodes in the specified search region." ); + } + } + catch ( ... ) + { + Clear(); + throw; + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PointShepardInterpolation + * \brief Vector Shepard interpolation/approximation in two dimensions + * + * The template parameter P represents an interpolation point in two + * dimensions. The type P must implement P::x and P::y data members accessible + * from the current %PointShepardInterpolation template specialization. These + * members must provide the values of the horizontal and vertical coordinates, + * respectively, of an interpolation point. In addition, the scalar types of + * the P::x and P::y point members must support conversion to double semantics. + */ +template +class PCL_CLASS PointShepardInterpolation +{ +public: + + /*! + * Represents an interpolation point in two dimensions. + */ + typedef P point; + + /*! + * Represents a sequence of interpolation points. + */ + typedef Array point_list; + + /*! + * Represents a coordinate interpolating/approximating surface. + */ + typedef ShepardInterpolation surface; + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + PointShepardInterpolation() = default; + + /*! + * Copy constructor. + */ + PointShepardInterpolation( const PointShepardInterpolation& ) = default; + + /*! + * Move constructor. + */ + PointShepardInterpolation( PointShepardInterpolation&& ) = default; + + /*! + * Constructs a %PointShepardInterpolation object initialized for the + * specified input data and interpolation parameters. + * + * See the corresponding Initialize() member function for a detailed + * description of parameters. + */ + PointShepardInterpolation( const point_list& P1, const point_list& P2, + int power = __PCL_SHEPARD_DEFAULT_POWER, + double radius = __PCL_SHEPARD_DEFAULT_SEARCH_RADIUS ) + { + Initialize( P1, P2, power, radius ); + } + + /*! + * Constructs a %PointShepardInterpolation object initialized with + * prescribed point surface interpolations. + * + * See the corresponding Initialize() member function for a more detailed + * description of parameters and their required conditions. + */ + PointShepardInterpolation( const surface& Sx, const surface& Sy ) + { + Initialize( Sx, Sy ); + } + + /*! + * Copy assignment operator. Copy assignment has been disabled for this + * class because the ShepardInterpolation class does not implement copy + * assignment. + */ + PointShepardInterpolation& operator =( const PointShepardInterpolation& ) = delete; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PointShepardInterpolation& operator =( PointShepardInterpolation&& ) = default; + + /*! + * Initializes this %PointShepardInterpolation object for the specified + * input data and interpolation parameters. + * + * \param P1 A sequence of distinct interpolation node points. + * + * \param P2 A sequence of interpolation values. For each point in + * \a P1, the coordinates of its counterpart point in + * \a P2 will be used as the interpolation node values in + * the X and Y directions. + * + * \param power Power parameter. Must be > 0. The default value is 4. + * See ShepardInterpolation::SetPower() for a complete + * description of this parameter. + * + * \param radius Normalized search radius. Must be > 0. The default + * value is 0.1. See ShepardInterpolation::SetRadius() for + * a complete description of this parameter. + * + * \param smoothing Smoothing factor. Must be in the range [0,1). The + * default value is zero. See + * ShepardInterpolation::SetSmoothing() for a complete + * description of this parameter. + * + * The input nodes can be arbitrarily distributed and don't need to follow + * any specific order. However, all node points should be distinct with + * respect to the machine epsilon for the floating point type used to + * represent coordinates. + * + * See the ShepardInterpolation::Initialize() member function for a complete + * description of this initialization process. + */ + void Initialize( const point_list& P1, const point_list& P2, + int power = __PCL_SHEPARD_DEFAULT_POWER, + double radius = __PCL_SHEPARD_DEFAULT_SEARCH_RADIUS, + float smoothing = __PCL_SHEPARD_DEFAULT_REGULARIZATION ) + { + PCL_PRECONDITION( P1.Length() >= 3 ) + PCL_PRECONDITION( P1.Length() <= P2.Length() ) + PCL_PRECONDITION( power > 0 ) + PCL_PRECONDITION( radius > 0 ) + PCL_PRECONDITION( smoothing >= 0 && smoothing < 1 ) + + m_Sx.Clear(); + m_Sy.Clear(); + + m_Sx.SetPower( power ); + m_Sy.SetPower( power ); + + m_Sx.SetRadius( radius ); + m_Sy.SetRadius( radius ); + + m_Sx.SetSmoothing( smoothing ); + m_Sy.SetSmoothing( smoothing ); + + if ( P1.Length() < 3 || P2.Length() < 3 ) + throw Error( "PointShepardInterpolation::Initialize(): At least three input nodes must be specified." ); + + if ( P2.Length() < P1.Length() ) + throw Error( "PointShepardInterpolation::Initialize(): Incompatible point array lengths." ); + + DVector X( int( P1.Length() ) ), + Y( int( P1.Length() ) ), + Zx( int( P1.Length() ) ), + Zy( int( P1.Length() ) ); + for ( int i = 0; i < X.Length(); ++i ) + { + X[i] = P1[i].x; + Y[i] = P1[i].y; + Zx[i] = P2[i].x; + Zy[i] = P2[i].y; + } + m_Sx.Initialize( X.Begin(), Y.Begin(), Zx.Begin(), X.Length() ); + m_Sy.Initialize( X.Begin(), Y.Begin(), Zy.Begin(), X.Length() ); + } + + /*! + * Deallocates internal structures, yielding an empty object that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_Sx.Clear(); + m_Sy.Clear(); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return m_Sx.IsValid() && m_Sy.IsValid(); + } + + /*! + * Returns a reference to the internal object used for interpolation in the + * X plane direction. + */ + const surface& SurfaceX() const + { + return m_Sx; + } + + /*! + * Returns a reference to the internal object used for interpolation in the + * Y plane direction. + */ + const surface& SurfaceY() const + { + return m_Sy; + } + + /*! + * Returns an interpolated point at the specified coordinates. + */ + template + DPoint operator ()( T x, T y ) const + { + return DPoint( m_Sx( x, y ), m_Sy( x, y ) ); + } + + /*! + * Returns an interpolated point at the given \a p.x and \a p.y coordinates. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /* + * The surface interpolations in the X and Y plane directions. + */ + surface m_Sx, m_Sy; + + friend class DrizzleData; + friend class DrizzleDataDecoder; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ShepardInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ShepardInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Sizer.h b/3rdparty/include/pcl/Sizer.h new file mode 100644 index 0000000..6a92066 --- /dev/null +++ b/3rdparty/include/pcl/Sizer.h @@ -0,0 +1,644 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Sizer.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Sizer_h +#define __PCL_Sizer_h + +/// \file pcl/Sizer.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::Align + * \brief Control alignment modes. + * + * + * + * + * + * + * + * + * + *
Align::Expand The item can be expanded to occupy the available space
Align::Left The item aligns to the left side of the available space
Align::Top The item aligns to the top side of the available space
Align::Right The item aligns to the right side of the available space
Align::Bottom The item aligns to the bottom side of the available space
Align::Center The item aligns centered within the available space
Align::Default Default alignment, equal to Align::Expand
+ */ +namespace Align +{ + enum value_type + { + Expand, + Left, + Top = Left, + Right, + Bottom = Right, + Center, + Default = Expand + }; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +class PCL_CLASS Control; + +// ---------------------------------------------------------------------------- + +/*! + * \class Sizer + * \brief Base class for PixInsight sizer objects. + * + * %Sizer allows laying out child controls within their parent controls as + * simple one-dimensional stacks with precise control over orientations, + * margins, distances between items, and item alignments. By distributing + * controls in nested %Sizer objects with horizontal and vertical orientations, + * complex albeit clean user interfaces can be easily defined. + * + * \b Automatic \b Scaling + * + * The %Sizer class provides an automatic scaling feature that simplifies the + * adaptation of existing and new PCL-based UI generation code to varying + * display resolutions. This functionality can be controlled with a Boolean + * \a autoScaling parameter available for the following member functions: + * + * Sizer::SetMargin( int margin, bool autoScaling = true );\n + * Sizer::SetSpacing( int spacing, bool autoScaling = true );\n + * Sizer::AddSpacing( int spacing, bool autoScaling = true );\n + * Sizer::InsertSpacing( int index, int spacing, bool autoScaling = true );\n + * int Margin( bool autoScaling = true );\n + * int Spacing( bool autoScaling = true ); + * + * As you can see, automatic scaling is always enabled by default. On the + * PixInsight platform, the reference display density is 109 dpi, corresponding + * to a 27 inch monitor at QHD resolution (2560x1440 physical pixels). + * + * The automatic scaling feature applies the scaling ratio returned by + * Sizer::DisplayPixelRatio() to convert horizontal and vertical spaces between + * items from device-independent (or \e logical) pixel units to physical device + * pixel units. When this feature is enabled through the corresponding + * \a autoScaling parameters, scaling is applied to both automatic and manual + * spacings between controls, that is, to spacings defined by SetSpacing(), + * SetMargin(), AddSpacing(), and InsertSpacing(). The reverse transformation + * is applied from physical pixels to logical units when dimensions are + * retrieved by Spacing() and Margin(). + * + * \sa HorizontalSizer, VerticalSizer + */ +class PCL_CLASS Sizer : public UIObject +{ +public: + + /*! + * Represents the alignment of a %Sizer item. + */ + typedef Align::value_type item_alignment; + + /*! + * Constructs a %Sizer object. + * + * \param vertical If true, this sizer will lay out items vertically. If + * false, items will be laid out horizontally. + */ + Sizer( bool vertical ); + + /*! + * Destroys a %Sizer object. + */ + virtual ~Sizer() + { + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since sizers are unique objects by definition, calling this member + * function has no effect. + */ + void EnsureUnique() override + { + // Sizers are unique objects by definition + } + + /*! + * Returns a reference to a null %Sizer instance. A null %Sizer does not + * correspond to an existing sizer in the PixInsight core application. + */ + static Sizer& Null(); + + /*! + * Returns a reference to the parent control of this %Sizer object, or + * Control::Null() if this sizer has no parent control. + */ + Control& ParentControl() const; + + /*! + * Returns true iff this %Sizer lays out items vertically. + */ + bool IsVertical() const; + + /*! + * Returns true iff this %Sizer lays out items horizontally. + */ + bool IsHorizontal() const + { + return !IsVertical(); + } + + /*! + * Returns the number of items in this %Sizer object. + */ + int NumberOfItems() const; + + /*! + * Returns the zero-based index of the specified child %Sizer object \a s in + * this sizer, or -1 if the \a s sizer does not belong to this %Sizer. + */ + int IndexOf( const Sizer& s ) const; + + /*! + * Returns the zero-based index of the specified child control \a c in this + * sizer, or -1 if the \a c control does not belong to this %Sizer. + */ + int IndexOf( const Control& c ) const; + + /*! + * Returns true iff the specified child sizer \a s belongs to this %Sizer. + */ + bool Contains( const Sizer& s ) const + { + return IndexOf( s ) >= 0; + } + + /*! + * Returns true iff the specified child control \a c belongs to this %Sizer. + */ + bool Contains( const Control& c ) const + { + return IndexOf( c ) >= 0; + } + + /*! + * Adds a sizer to this %Sizer object. + * + * \param s The %Sizer object to be added. + * + * \param stretchFactor Indicates how much space the sizer \a s will tend + * to occupy within its parent sizer (this sizer), relative to + * the rest of sibling sizer items. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description. + * + * \sa Add( Control&, int, item_alignment ), AddSpacing(), AddStretch(), + * Insert() + */ + void Add( Sizer& s, int stretchFactor = 0 ); + + /*! + * Adds a control to this %Sizer object. + * + * \param c The control to be added. + * + * \param stretchFactor Indicates how much space the control \a c will + * try to occupy within its parent sizer (this sizer), relative + * to the rest of sibling sizer items. A value of zero indicates + * that the added control has no particular preference and can + * be adapted to the existing space, as necessary/possible. + * + * \param align Item alignment. + * + * In the following example: + * + * \code + * PushButton button1; + * PushButton button2; + * PushButton button3; + * // ... + * Sizer fooSizer; + * fooSizer.Add( button1, 25 ); + * fooSizer.Add( button2, 50 ); + * fooSizer.Add( button3, 25 ); + * \endcode + * + * The button1 control will occupy one half of the total available space for + * fooSizer, and each of button1 and button2 will occupy 1/4 of the space + * available in fooSizer. Stretch factors don't have to be expressed as + * percentages necessarily, although using percentage values is usually more + * readable. The stretch factors 2, 4, 2 would have the same meaning as 25, + * 50, 25 in the example above. + * + * \sa Add( Sizer&, int ), AddSpacing(), AddStretch(), Insert() + */ + void Add( Control& c, int stretchFactor = 0, item_alignment align = Align::Default ); + + /*! + * Adds a non-stretchable space of \a size pixels to this %Sizer. + * + * If the \a autoScaling parameter is set to true, the specified \a size + * will be converted from logical device-independent pixel units to physical + * device pixels automatically. If \a autoScaling is false, the specified + * \a size is assumed to be expressed in physical pixel units, and no + * automatic scaling will be performed. + * + * \sa InsertSpacing(), AddStretch(), InsertStretch() + */ + void AddSpacing( int size, bool autoScaling = true ); + + /*! + * Adds a non-stretchable space of \a size logical pixels to this %Sizer. + * This is a convenience member function equivalent to: + * + * \code AddSpacing( size, true ); \endcode + */ + void AddScaledSpacing( int size ) + { + AddSpacing( size, true ); + } + + /*! + * Adds a non-stretchable space of \a size physical pixels to this %Sizer. + * This is a convenience member function equivalent to: + * + * \code AddSpacing( size, false ); \endcode + */ + void AddUnscaledSpacing( int size ) + { + AddSpacing( size, false ); + } + + /*! + * Adds a stretchable space with the specified stretch factor. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description of stretch factors. + * + * \sa AddSpacing(), InsertSpacing(), InsertStretch() + */ + void AddStretch( int stretchFactor = 100 ); + + /*! + * Inserts a sizer in this %Sizer object. + * + * \param index Zero-based index where the sizer \a s will be inserted. + * + * \param s The %Sizer object to be added. + * + * \param stretchFactor Indicates how much space the sizer \a s will tend + * to occupy within its parent sizer (this sizer), relative to + * the rest of sibling sizer items. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description. + * + * \sa Insert( int, Control&, int, item_alignment ), InsertSpacing(), + * InsertStretch(), Add() + */ + void Insert( int index, Sizer& s, int stretchFactor = 0 ); + + /*! + * Inserts a control in this %Sizer object. + * + * \param index Zero-based index where the control \a c will be inserted. + * + * \param c The control to be added. + * + * \param stretchFactor Indicates how much space the control \a c will + * tend to occupy within its parent sizer (this sizer), relative + * to the rest of sibling sizer items. + * + * \param align Item alignment. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description. + * + * \sa Insert( int, Sizer&, int ), InsertSpacing(), InsertStretch(), Add() + */ + void Insert( int index, Control& c, int stretchFactor = 0, item_alignment align = Align::Default ); + + /*! + * Inserts a non-stretchable space of \a size pixels in this %Sizer. + * + * If the \a autoScaling parameter is set to true, the specified \a size + * will be converted from logical device-independent pixel units to physical + * device pixels automatically. If \a autoScaling is false, the specified + * \a size is assumed to be expressed in physical pixel units, and no + * automatic scaling will be performed. + * + * \sa AddSpacing(), InsertStretch(), AddStretch() + */ + void InsertSpacing( int index, int size, bool autoScaling = true ); + + /*! + * Inserts a non-stretchable space of \a size logical pixels in this %Sizer. + * This is a convenience member function equivalent to: + * + * \code InsertSpacing( index, size, true ); \endcode + */ + void InsertScaledSpacing( int index, int size ) + { + InsertSpacing( index, size, true ); + } + + /*! + * Inserts a non-stretchable space of \a size physical pixels in this + * %Sizer. This is a convenience member function equivalent to: + * + * \code InsertSpacing( index, size, false ); \endcode + */ + void InsertUnscaledSpacing( int index, int size ) + { + InsertSpacing( index, size, false ); + } + + /*! + * Inserts a stretchable space with the specified stretch factor. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description of stretch factors. + * + * \sa InsertSpacing(), AddSpacing(), AddStretch() + */ + void InsertStretch( int index, int stretchFactor = 100 ); + + /*! + * Removes the specified sizer \a s from this %Sizer object. If \a s doesn't + * belong to this sizer, nothing happens. + */ + void Remove( Sizer& s ); + + /*! + * Removes the specified control \a c from this %Sizer object. If \a c + * doesn't belong to this sizer, nothing happens. + */ + void Remove( Control& c ); + + /*! + * Changes the stretch factor for a child sizer \a s belonging to this + * %Sizer object. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description of stretch factors. + */ + void SetStretchFactor( Sizer& s, int stretch ); + + /*! + * Changes the stretch factor for a child control \a s belonging to this + * %Sizer object. + * + * See the documentation for Add( Control&, int, item_alignment ) for a + * detailed description of stretch factors. + */ + void SetStretchFactor( Control& c, int stretch ); + + /*! + * Changes the alignment of a child sizer \a s belonging to this %Sizer + * object. + */ + void SetAlignment( Sizer& s, item_alignment align ); + + /*! + * Changes the alignment of a child control \a c belonging to this %Sizer + * object. + */ + void SetAlignment( Control& c, item_alignment align ); + + /*! + * Returns the margin in pixels around this sizer. + * + * The margin is the empty space that is automatically reserved around + * this sizer on its parent control's (or parent sizer's) client area. + * The default margin is always zero pixels for all sizer types, unless + * explicitly changed with this function. + * + * If the \a autoScaling parameter is set to true, the returned value will + * be expressed in logical device-independent pixel units. This means that + * the returned value has been converted from physical device pixels + * automatically. If \a autoScaling is false, the returned value will be + * expressed in physical device pixels, and no automatic scaling is applied. + * + * \sa SetMargin(), Spacing(), SetSpacing() + */ + int Margin( bool autoScaling = true ) const; + + /*! + * Sets the margin in pixels around this sizer. + * + * If the \a autoScaling parameter is set to true, the specified \a margin + * will be converted from logical device-independent pixel units to physical + * device pixels automatically. If \a autoScaling is false, the specified + * \a margin is assumed to be expressed in physical pixel units, and no + * automatic scaling will be performed. + * + * \sa Margin(), Spacing(), SetSpacing() + */ + void SetMargin( int margin, bool autoScaling = true ); + + /*! + * Returns the spacing in pixels between items in this %Sizer object. + * + * If the \a autoScaling parameter is set to true, the returned value will + * be expressed in logical device-independent pixel units. This means that + * the returned value has been converted from physical device pixels + * automatically. If \a autoScaling is false, the returned value will be + * expressed in physical device pixels, and no automatic scaling is applied. + * + * \sa SetSpacing(), Margin(), SetMargin() + */ + int Spacing( bool autoScaling = true ) const; + + /*! + * Sets the spacing in pixels between items in this %Sizer object. + * + * If the \a autoScaling parameter is set to true, the specified \a spacing + * will be converted from logical device-independent pixel units to physical + * device pixels automatically. If \a autoScaling is false, the specified + * \a spacing is assumed to be expressed in physical pixel units, and no + * automatic scaling will be performed. + * + * \sa Spacing(), Margin(), SetMargin() + */ + void SetSpacing( int spacing, bool autoScaling = true ); + + /*! + * Returns the ratio between physical screen pixels and device-independent + * logical units for the parent control of this %Sizer object. This ratio is + * used as a scaling factor by the LogicalPixelsToPhysical() and PhysicalPixelsToLogical() functions, and + * is also applied automatically when \a autoScaling parameters are set to + * true in a number of member functions; see the class description for more + * information. + * + * The returned value is greater than or equal to one. Typical pixel ratios + * are 2.0 for high-dpi displays such as Retina monitors, or 1.0 for normal + * 96 dpi monitors. + * + * \sa LogicalPixelsToPhysical(), PhysicalPixelsToLogical() + */ + double DisplayPixelRatio() const; + + /*! + * Returns the specified \a size in logical device-independent pixel units + * converted to physical device pixels. + * + * \sa DisplayPixelRatio(), PhysicalPixelsToLogical() + */ + int LogicalPixelsToPhysical( int size ) const + { + return RoundInt( DisplayPixelRatio()*size ); + } + + /*! + * Returns the specified \a size in physical device pixels converted to + * logical device-independent pixel units. + * + * \sa DisplayPixelRatio(), LogicalPixelsToPhysical() + */ + int PhysicalPixelsToLogical( int size ) const + { + return RoundInt( size/DisplayPixelRatio() ); + } + +private: + + Sizer( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class Control; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class HorizontalSizer + * \brief Client-side interface to a PixInsight horizontal sizer. + * + * %HorizontalSizer lays out a sequence of items as a horizontal stack. + */ +class PCL_CLASS HorizontalSizer : public Sizer +{ +public: + + /*! + */ + typedef Sizer::item_alignment item_alignment; + + /*! + * Constructs a %HorizontalSizer object. + */ + HorizontalSizer() + : Sizer( false ) + { + } + + /*! + * Destroys a %HorizontalSizer object. + */ + virtual ~HorizontalSizer() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class VerticalSizer + * \brief Client-side interface to a PixInsight vertical sizer. + * + * %VerticalSizer lays out a sequence of as a vertical stack. + */ +class PCL_CLASS VerticalSizer : public Sizer +{ +public: + + /*! + */ + typedef Sizer::item_alignment item_alignment; + + /*! + * Constructs a %VerticalSizer object. + */ + VerticalSizer() + : Sizer( true ) + { + } + + /*! + * Destroys a %VerticalSizer object. + */ + virtual ~VerticalSizer() + { + } +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Sizer_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Sizer.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Slider.h b/3rdparty/include/pcl/Slider.h new file mode 100644 index 0000000..e23ff99 --- /dev/null +++ b/3rdparty/include/pcl/Slider.h @@ -0,0 +1,492 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Slider.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Slider_h +#define __PCL_Slider_h + +/// \file pcl/Slider.h + +#include + +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::TickStyle + * \brief Slider tick styles. + * + * + * + * + * + * + * + * + *
TickStyle::NoTicks The slider has no ticks
TickStyle::Top Ticks are drawn at the top edge of a horizontal slider
TickStyle::Left Ticks are drawn at the left edge of a vertical slider
TickStyle::Bottom Ticks are drawn at the bottom edge of a horizontal slider
TickStyle::Right Ticks are drawn at the right edge of a vertical slider
TickStyle::BothSides Ticks are drawn at both edges of the slider. Equal to TickStyle::Top|TickStyle::Bottom
+ */ +namespace TickStyle +{ + enum mask_type + { + NoTicks = 0x00, + Top = 0x01, + Bottom = 0x02, + Left = Top, + Right = Bottom, + BothSides = Top|Bottom + }; +} + +/*! + * A collection of slider tick style flags. + */ +typedef Flags TickStyles; + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class Slider + * \brief Client-side interface to a PixInsight %Slider control. + * + * ### TODO: Write a detailed description for %Slider. + */ +class PCL_CLASS Slider : public Control +{ +public: + + /*! + * Constructs a %Slider object as a child control of \a parent. The + * \a vertical parameter indicates the orientation of the slider control + * (vertical or horizontal). + */ + Slider( Control& parent = Control::Null(), bool vertical = false ); + + /*! + * Destroys a %Slider object. + */ + virtual ~Slider() + { + } + + /*! + * Returns the current value of this %Slider control. + */ + int Value() const; + + /*! + * Sets the value of this %Slider control. + */ + void SetValue( int v ); + + /*! + * Returns the current value of this %Slider control as a normalized real + * number in the range [0,1]. + */ + double NormalizedValue() const; + + /*! + * Sets the value of this %Slider control as a normalized real number in the + * range [0,1]. + */ + void SetNormalizedValue( double f ); + + /*! + * Gets the range of values for this %Slider control. + * + * \param[out] minValue, maxValue References to the variables where the + * minimum and maximum values of this %Slider control will be + * copied, respectively. + * + * \sa SetRange(), MinValue(), MaxValue() + */ + void GetRange( int& minValue, int& maxValue ) const; + + /*! + * Returns the minimum value of this %Slider control. + * + * \sa MaxValue(), GetRange() + */ + int MinValue() const + { + int m, dum; GetRange( m, dum ); return m; + } + + /*! + * Returns the maximum value of this %Slider control. + * + * \sa MinValue(), GetRange() + */ + int MaxValue() const + { + int dum, m; GetRange( dum, m ); return m; + } + + /*! + * Sets the range of values for this %Slider control. + * + * \param minValue, maxValue New minimum and maximum values, + * respectively, for this %Slider control. + * + * \sa GetRange(), SetMinValue(), SetMaxValue() + */ + void SetRange( int minValue, int maxValue ); + + /*! + * Sets the minimum value of this %Slider control. + * + * This is a convenience member function, equivalent to + * SetRange( m, MaxValue() ) + * + * \sa SetMaxValue(), SetRange(), MinValue(), MaxValue() + */ + void SetMinValue( int m ) + { + SetRange( m, MaxValue() ); + } + + /*! + * Sets the maximum value of this %Slider control. + * + * This is a convenience member function, equivalent to + * SetRange( MinValue(), m ) + * + * \sa SetMinValue(), SetRange(), MinValue(), MaxValue() + */ + void SetMaxValue( int m ) + { + SetRange( MinValue(), m ); + } + + /*! + * Returns the step size of this %Slider control + * + * The step size is the number of units that are skipped when the user + * presses an arrow key while this %Slider control has the keyboard focus. + * + * \sa SetStepSize() + */ + int StepSize() const; + + /*! + * Sets the step size of this %Slider control + * + * The step size is the number of units that are skipped when the user + * presses an arrow key while this %Slider control has the keyboard focus. + * + * \sa StepSize() + */ + void SetStepSize( int ); + + /*! + * Returns the page size of this %Slider control + * + * The page size is the number of units that are skipped when the user + * clicks on the slider (outside the thumb), or when (s)he presses PgUp or + * PgDn while this %Slider control has the keyboard focus. + * + * \sa SetPageSize() + */ + int PageSize() const; + + /*! + * Sets the page size of this %Slider control + * + * The page size is the number of units that are skipped when the user + * clicks on the slider (outside the thumb), or when (s)he presses PgUp or + * PgDn while this %Slider control has the keyboard focus. + * + * \sa PageSize() + */ + void SetPageSize( int ); + + /*! + * Returns the distance in pixels between two consecutive tick marks. + */ + int TickInterval() const; + + /*! + * Sets the distance in pixels between two consecutive tick marks. + */ + void SetTickInterval( int ); + + /*! + * A synonym for TickInterval(). + */ + int TickFrequency() const + { + return TickInterval(); + } + + /*! + * A synonym for SetTickInterval(). + */ + void SetTickFrequency( int q ) + { + SetTickInterval( q ); + } + + /*! + * Returns the current tick style of this %Slider control. + */ + TickStyles TickStyle() const; + + /*! + * Sets the tick style of this %Slider control. + */ + void SetTickStyle( TickStyles ); + + /*! + * Disables ticks for this %Slider control. + * + * This is a convenience member function, equivalent to + * SetTickStyle( TickStyle::NoTicks ) + */ + void DisableTicks() + { + SetTickStyle( TickStyle::NoTicks ); + } + + /*! + * Returns true iff automatic tracking is currently enabled for this + * %Slider control. + * + * When automatic tracking is enabled, continuous slider value + * events are generated while the user is moving the slider's thumb + * with the mouse. When automatic tracking is disabled, a single slider + * value event is generated when the user releases the mouse button. + * + * \sa EnableTracking(), DisableTracking() + */ + bool IsTrackingEnabled() const; + + /*! + * Enables or disables automatic tracking for this %Slider control. + * + * \sa DisableTracking(), IsTrackingEnabled() + */ + void EnableTracking ( bool = true ); + + /*! + * Disables or enables automatic tracking for this %Slider control. + * + * This is a convenience member function, equivalent to + * EnableTracking( !disable ) + * + * \sa EnableTracking(), IsTrackingEnabled() + */ + void DisableTracking( bool disable = true ) + { + EnableTracking( !disable ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnValueUpdated( Slider& sender, int value ); + // void OnRangeUpdated( Slider& sender, int minValue, int maxValue ); + + /*! + * \defgroup slider_event_handlers Slider Event Handlers + */ + + /*! + * Defines the prototype of a slider value event handler. + * + * A slider value event is generated when the user changes the value of a + * slider control. + * + * \param sender The control that sends a slider value event. + * + * \param value The current value of the slider. + * + * \ingroup slider_event_handlers + */ + typedef void (Control::*value_event_handler)( Slider& sender, int value ); + + /*! + * Defines the prototype of a slider range event handler. + * + * A slider range event is generated when the range of a slider control is + * changed. + * + * \param sender The control that sends a slider range event. + * + * \param minValue, maxValue The current minimum and maximum values of the + * slider, respectively. + * + * \ingroup slider_event_handlers + */ + typedef void (Control::*range_event_handler)( Slider& sender, int minValue, int maxValue ); + + /*! + * Sets the slider value event handler for this %Slider control. + * + * \param handler The slider value event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive slider value events + * from this %Slider. + * + * \ingroup slider_event_handlers + */ + void OnValueUpdated( value_event_handler handler, Control& receiver ); + + /*! + * Sets the slider range event handler for this %Slider control. + * + * \param handler The slider range event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive slider range events + * from this %Slider. + * + * \ingroup slider_event_handlers + */ + void OnRangeUpdated( range_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + value_event_handler onValueUpdated = nullptr; + range_event_handler onRangeUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class SliderEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class HorizontalSlider + * \brief Horizontal slider control. + * + * ### TODO: Write a detailed description for %HorizontalSlider. + */ +class PCL_CLASS HorizontalSlider : public Slider +{ +public: + + /*! + * Constructs a %HorizontalSlider as a child control of \a parent. + */ + HorizontalSlider( Control& parent = Control::Null() ) + : Slider( parent, false ) + { + } + + /*! + * Destroys a %HorizontalSlider control. + */ + virtual ~HorizontalSlider() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class VerticalSlider + * \brief Vertical slider control. + * + * ### TODO: Write a detailed description for %VerticalSlider. + */ +class PCL_CLASS VerticalSlider : public Slider +{ +public: + + /*! + * Constructs a %VerticalSlider as a child control of \a parent. + */ + VerticalSlider( Control& parent = Control::Null() ) + : Slider( parent, true ) + { + } + + /*! + * Destroys a %VerticalSlider control. + */ + virtual ~VerticalSlider() + { + } +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_Slider_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Slider.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Sort.h b/3rdparty/include/pcl/Sort.h new file mode 100644 index 0000000..49cfa9a --- /dev/null +++ b/3rdparty/include/pcl/Sort.h @@ -0,0 +1,573 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Sort.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Sort_h +#define __PCL_Sort_h + +/// \file pcl/Sort.h + +#include + +#include +#include + +#define __PCL_QS_STACK_SIZE 32 // Stack size for the QuickSort algorithms +#define __PCL_QS_IS_THRESHOLD 11 // QuickSort/InsertionSort switch threshold + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup sorting_algorithms Sorting Algorithms + * + * Template formal parameters: + * + * FI Forward iterator \n + * BI Bidirectional iterator \n + * RI Random access iterator \n + * UP Unary predicate \n + * BP Binary predicate \n + * T Item type \n + * F Function + */ + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_insertion_sort__( BI i, BI j, const T* ) +{ + if ( i != j ) + for ( BI k = i; ++k != j; ) + { + T v = *k; + BI y = k; + for ( BI x = y; y != i && v < *--x; --y ) + *y = *x; + *y = v; + } +} + +/*! + * Generic insertion sort algorithm. + * + * Sorts a range [i,j) in ascending order by the insertion sort + * algorithm. Ordering of elements is defined such that for any pair a, b of + * elements in [i,j) a < b is true if a precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void InsertionSort( BI i, BI j ) +{ + __pcl_insertion_sort__( i, j, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_insertion_sort__( BI i, BI j, BP p, const T* ) +{ + if ( i != j ) + for ( BI k = i; ++k != j; ) + { + T v = *k; + BI y = k; + for ( BI x = y; y != i && p( v, *--x ); --y ) + *y = *x; + *y = v; + } +} + +/*! + * Generic insertion sort algorithm. + * + * Sorts a range [i,j) in ascending order by the insertion sort + * algorithm. Ordering of elements is defined such that for any pair a, b of + * elements in [i,j) the binary predicate p(a,b) is true if a precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void InsertionSort( BI i, BI j, BP p ) +{ + __pcl_insertion_sort__( i, j, p, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_quick_sort__( RI i, RI j, T* ) +{ + distance_type n = j - i; + if ( n < 2 ) + return; + + distance_type tos[ 2*__PCL_QS_STACK_SIZE ]; + distance_type* sp = tos; + + for ( distance_type l = 0, r = n-1; ; ) + { + RI x0 = i + l; + RI y = i + r; + + if ( r-l < __PCL_QS_IS_THRESHOLD ) + { + for ( RI x = x0; ++x <= y; ) + { + T v = *x; + RI x1 = x; + for ( ; --x1 >= x0 && v < *x1; ) + *(x1+1) = *x1; + *(x1+1) = v; + } + + if ( sp == tos ) + break; + + r = *--sp; + l = *--sp; + } + else + { + RI x = x0; + + Swap( *++x, *(i + ((l+r) >> 1)) ); + + if ( *y < *x0 ) + Swap( *x0, *y ); + if ( *y < *x ) + Swap( *x, *y ); + if ( *x < *x0 ) + Swap( *x, *x0 ); + + T v = *x; + + for ( ;; ) + { + while ( *++x < v ); + while ( v < *--y ); + if ( y < x ) + break; + Swap( *x, *y ); + } + + *(x0+1) = *y; + *y = v; + + distance_type dx = x - i; + distance_type dy = y - i; + + if ( r-dx+1 >= dy-l ) + { + *sp++ = dx; + *sp++ = r; + r = dy-1; + } + else + { + *sp++ = l; + *sp++ = dy-1; + l = dx; + } + } + } +} + +/*! + * Generic quick sort algorithm. + * + * Sorts a range [i,j) in ascending order by the quick sort algorithm + * (median of three variant). Ordering of elements is defined such that for any + * pair a, b of elements in [i,j) a < b is true if a precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void QuickSort( RI i, RI j ) +{ + __pcl_quick_sort__( i, j, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_quick_sort__( RI i, RI j, BP p, T* ) +{ + distance_type n = j - i; + if ( n < 2 ) + return; + + distance_type tos[ 2*__PCL_QS_STACK_SIZE ]; + distance_type* sp = tos; + + for ( distance_type l = 0, r = n-1; ; ) + { + RI x0 = i + l; + RI y = i + r; + + if ( r-l < __PCL_QS_IS_THRESHOLD ) + { + for ( RI x = x0; ++x <= y; ) + { + T v = *x; + RI x1 = x; + for ( ; --x1 >= x0 && p( v, *x1 ); ) + *(x1+1) = *x1; + *(x1+1) = v; + } + + if ( sp == tos ) + break; + + r = *--sp; + l = *--sp; + } + else + { + RI x = x0; + + Swap( *++x, *(i + ((l+r) >> 1)) ); + + if ( p( *y, *x0 ) ) + Swap( *x0, *y ); + if ( p( *y, *x ) ) + Swap( *x, *y ); + if ( p( *x, *x0 ) ) + Swap( *x, *x0 ); + + T v = *x; + + for ( ;; ) + { + while ( p( *++x, v ) ); + while ( p( v, *--y ) ); + if ( y < x ) + break; + Swap( *x, *y ); + } + + *(x0+1) = *y; + *y = v; + + distance_type dx = x - i; + distance_type dy = y - i; + + if ( r-dx+1 >= dy-l ) + { + *sp++ = dx; + *sp++ = r; + r = dy-1; + } + else + { + *sp++ = l; + *sp++ = dy-1; + l = dx; + } + } + } +} + +/*! + * Generic quick sort algorithm. + * + * Sorts a range [i,j) in ascending order by the quick sort algorithm + * (median of three variant). Ordering of elements is defined such that for any + * pair a, b of elements in [i,j) the binary predicate p(a,b) is true if a + * precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void QuickSort( RI i, RI j, BP p ) +{ + __pcl_quick_sort__( i, j, p, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_heap_sort__( RI i, RI j, T* ) +{ + distance_type dj = j - i; + if ( dj < 2 ) + return; + + T v; + distance_type di = 1 + (dj >> 1); + + for ( i += di-1, --j; ; ) + { + if ( di > 1 ) + { + v = *--i; + --di; + } + else + { + v = *j; + *j = *i; + + if ( --dj == 0 ) + { + *i = v; + break; + } + + --j; + } + + RI x = i; + RI y = i; + + for ( distance_type dy2 = di, dy = di; !(dj < (dy <<= 1)); dy2 = dy ) + { + y += dy2; + + if ( dy < dj && *y < *(y+1) ) + { + ++y; + ++dy; + } + + if ( v < *y ) + { + *x = *y; + x = y; + } + else + break; + } + + *x = v; + } +} + +/*! + * Generic heap sort algorithm. + * + * Sorts a range [i,j) in ascending order by the heap sort algorithm. + * Ordering of elements is defined such that for any pair a, b of elements in + * [i,j) a < b is true if a precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void HeapSort( RI i, RI j ) +{ + __pcl_heap_sort__( i, j, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_heap_sort__( RI i, RI j, BP p, T* ) +{ + distance_type dj = j - i; + if ( dj < 2 ) + return; + + T v; + distance_type di = 1 + (dj >> 1); + + for ( i += di-1, --j; ; ) + { + if ( di > 1 ) + { + v = *--i; + --di; + } + else + { + v = *j; + *j = *i; + + if ( --dj == 0 ) + { + *i = v; + break; + } + + --j; + } + + RI x = i; + RI y = i; + + for ( distance_type dy2 = di, dy = di; !(dj < (dy <<= 1)); dy2 = dy ) + { + y += dy2; + + if ( dy < dj && p( *y, *(y+1) ) ) + { + ++y; + ++dy; + } + + if ( p( v, *y ) ) + { + *x = *y; + x = y; + } + else + break; + } + + *x = v; + } +} + +/*! + * Generic heap sort algorithm. + * + * Sorts a range [i,j) in ascending order by the heap sort algorithm. + * Ordering of elements is defined such that for any pair a, b of elements in + * [i,j) the binary predicate p(a,b) is true if a precedes b. + * + * \ingroup sorting_algorithms + */ +template inline +void HeapSort( RI i, RI j, BP p ) +{ + __pcl_heap_sort__( i, j, p, ItemType( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_sort__( BI i, BI j, BidirectionalIterator ) +{ + InsertionSort( i, j ); +} + +template inline +void __pcl_sort__( RI i, RI j, RandomAccessIterator ) +{ +#ifdef __PCL_PREFER_HEAPSORT + HeapSort( i, j ); +#else + QuickSort( i, j ); +#endif +} + +/*! + * Generic sort algorithm. + * + * Sorts a range [i,j) in ascending order. Ordering of elements is defined such + * that for any pair a, b of elements in [i,j) a < b is true if a precedes b. + * + * This function sorts the specified input sequence employing the fastest + * (known) sorting algorithm for the iterator class BI. Insertion sort is + * used for bidirectional iterators without random access, and the quick sort + * algorithm (median of three variant) is used for random access iterators. + * + * If you want to use the heap sort algorithm instead of quick sort (e.g. for + * performance testing purposes), define the __PCL_PREFER_HEAPSORT macro. + * + * \ingroup sorting_algorithms + */ +template inline +void Sort( BI i, BI j ) +{ + __pcl_sort__( i, j, IteratorClass( i ) ); +} + +// ---------------------------------------------------------------------------- + +template inline +void __pcl_sort__( BI i, BI j, BP p, BidirectionalIterator ) +{ + InsertionSort( i, j, p ); +} + +template inline +void __pcl_sort__( RI i, RI j, BP p, RandomAccessIterator ) +{ +#ifdef __PCL_PREFER_HEAPSORT + HeapSort( i, j, p ); +#else + QuickSort( i, j, p ); +#endif +} + +/*! + * Generic sort algorithm. + * + * Sorts a range [i,j) in ascending order. Ordering of elements is defined such + * that for any pair a, b of elements in [i,j) the binary predicate p(a,b) is + * true if a precedes b. + * + * This function sorts the specified input sequence employing the fastest + * (known) sorting algorithm for the iterator class BI. Insertion sort is + * used for bidirectional iterators without random access, and the quick sort + * algorithm (median of three variant) is used for random access iterators. + * + * If you want to use the heap sort algorithm instead of quick sort (e.g. for + * performance testing purposes), define the __PCL_PREFER_HEAPSORT macro. + * + * \ingroup sorting_algorithms + */ +template inline +void Sort( BI i, BI j, BP p ) +{ + __pcl_sort__( i, j, p, IteratorClass( i ) ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Sort_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Sort.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SortedArray.h b/3rdparty/include/pcl/SortedArray.h new file mode 100644 index 0000000..4f2c0b5 --- /dev/null +++ b/3rdparty/include/pcl/SortedArray.h @@ -0,0 +1,1104 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SortedArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SortedArray_h +#define __PCL_SortedArray_h + +/// \file pcl/SortedArray.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SortedArray + * \brief Generic dynamic sorted array. + * + * %SortedArray is a generic, finite sorted sequence of objects, implemented as + * a reference-counted, dynamic array of T instances with automatic sorting of + * inserted array elements. The type A provides dynamic allocation for + * contiguous sequences of elements of type T (StandardAllocator is used by + * default). + * + * \sa Array, ReferenceArray, ReferenceSortedArray, IndirectArray, + * IndirectSortedArray + * \ingroup dynamic_arrays + */ +template +class PCL_CLASS SortedArray : public DirectSortedContainer +{ +public: + + /*! # + */ + typedef Array array_implementation; + + /*! # + */ + typedef typename array_implementation::block_allocator + block_allocator; + + /*! # + */ + typedef typename array_implementation::allocator + allocator; + + /*! # + */ + typedef typename array_implementation::iterator + iterator; + + /*! # + */ + typedef typename array_implementation::const_iterator + const_iterator; + + /*! # + */ + typedef typename array_implementation::reverse_iterator + reverse_iterator; + + /*! # + */ + typedef typename array_implementation::const_reverse_iterator + const_reverse_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty sorted array. + */ + SortedArray() = default; + + /*! + * Constructs a sorted array of \a n default-constructed objects. + */ + explicit + SortedArray( size_type n ) + : m_array( n ) + { + } + + /*! + * Constructs a sorted array of \a n copies of an object \a v. + */ + SortedArray( size_type n, const T& v ) + : m_array( n, v ) + { + } + + /*! + * Constructs a sorted array that stores a sorted copy of the sequence of + * objects defined by the range [i,j) of forward iterators. + */ + template + SortedArray( FI i, FI j ) + : m_array( i, j ) + { + Sort(); + } + + /*! + * Constructs a sorted array that stores a sorted copy of the objects in the + * specified initializer list \a l. + * + * This constructor is equivalent to: + * + * \code SortedArray( l.begin(), l.end() ) \endcode + */ + template + SortedArray( std::initializer_list l ) + : SortedArray( l.begin(), l.end() ) + { + } + + /*! + * Copy constructor. + */ + SortedArray( const SortedArray& ) = default; + + /*! + * Move constructor. + */ + SortedArray( SortedArray&& ) = default; + + /*! + * Destroys a %SortedArray object. Destroys and deallocates all contained + * objects. + */ + ~SortedArray() + { + } + + /*! + * Returns true iff this array uniquely references its contained data. + */ + bool IsUnique() const + { + return m_array.IsUnique(); + } + + /*! + * Returns true iff this sorted array is an alias of a sorted array \a x. + * + * Two objects are aliases if both of them share the same data. + */ + bool IsAliasOf( const SortedArray& x ) const + { + return m_array.IsAliasOf( x.m_array ); + } + + /*! + * Ensures that this array uniquely references its contained data. + * + * If necessary, this member function generates a duplicate of the array + * data, references it, and then decrements the reference counter of the + * original array data. + */ + void EnsureUnique() + { + m_array.EnsureUnique(); + } + + /*! + * Returns the total number of bytes required to store the objects contained + * by this sorted array. + */ + size_type Size() const + { + return m_array.Size(); + } + + /*! + * Returns the length of this sorted array. + */ + size_type Length() const + { + return m_array.Length(); + } + + /*! # + */ + size_type Capacity() const + { + return m_array.Capacity(); + } + + /*! # + */ + size_type Available() const + { + return m_array.Available(); + } + + /*! # + */ + bool IsValid() const + { + return m_array.IsValid(); + } + + /*! # + */ + bool IsEmpty() const + { + return m_array.IsEmpty(); + } + + /*! # + */ + size_type LowerBound() const + { + return m_array.LowerBound(); + } + + /*! # + */ + size_type UpperBound() const + { + return m_array.UpperBound(); + } + + /*! # + */ + const allocator& Allocator() const + { + return m_array.Allocator(); + } + + /*! # + */ + void SetAllocator( const allocator& a ) + { + m_array.SetAllocator( a ); + } + + /*! # + */ + const_iterator At( size_type i ) const + { + return m_array.At( i ); + } + + /*! # + */ + iterator MutableAt( size_type i ) + { + return m_array.At( i ); + } + + /*! # + */ + iterator MutableIterator( const_iterator i ) + { + return m_array.MutableIterator( i ); + } + + /*! # + */ + const T& operator []( size_type i ) const + { + return m_array[i]; + } + + /*! # + */ + const T& operator *() const + { + return *Begin(); + } + + /*! # + */ + const_iterator Begin() const + { + return m_array.ConstBegin(); + } + + /*! # + */ + iterator MutableBegin() + { + return m_array.Begin(); + } + + /*! # + */ + const_iterator End() const + { + return m_array.ConstEnd(); + } + + /*! # + */ + iterator MutableEnd() + { + return m_array.End(); + } + + /*! # + */ + const_reverse_iterator ReverseBegin() const + { + return m_array.ConstReverseBegin(); + } + + /*! # + */ + reverse_iterator MutableReverseBegin() + { + return m_array.ReverseBegin(); + } + + /*! # + */ + const_reverse_iterator ReverseEnd() const + { + return m_array.ConstReverseEnd(); + } + + /*! # + */ + reverse_iterator MutableReverseEnd() + { + return m_array.ReverseEnd(); + } + + /*! + * Ensures that the specified iterator points to a uniquely referenced + * object. If necessary, this function builds a new, uniquely referenced + * copy of this array by calling EnsureUnique(). + * + * If the iterator \a i is changed, it is guaranteed to point to the object + * at the same array index it was pointing to before calling this function. + */ + void UniquifyIterator( iterator& i ) + { + return m_array.UniquifyIterator( i ); + } + + /*! + * Ensures that the specified iterators point to uniquely referenced + * objects. If necessary, this function builds a new, uniquely referenced + * copy of this array by calling EnsureUnique(). + * + * If the iterators \a i and \a j are changed, they are guaranteed to point + * to the objects at the same array indices they were pointing to before + * calling this function. + */ + void UniquifyIterators( iterator& i, iterator& j ) + { + return m_array.UniquifyIterators( i, j ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Copy assignment operator. + * + * Causes this sorted array to reference the same data as another sorted + * array \a x. Returns a reference to this object. + */ + SortedArray& operator =( const SortedArray& x ) + { + Assign( x ); + return *this; + } + + /*! # + */ + void Assign( const SortedArray& x ) + { + m_array.Assign( x.m_array ); + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SortedArray& operator =( SortedArray&& x ) + { + Transfer( x ); + return *this; + } + + /*! # + */ + void Transfer( SortedArray& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! # + */ + void Transfer( SortedArray&& x ) + { + m_array.Transfer( x.m_array ); + } + + /*! # + */ + SortedArray& operator =( const array_implementation& x ) + { + Assign( x ); + return *this; + } + + /*! # + */ + void Assign( const array_implementation& x ) + { + m_array.Assign( x ); + Sort(); + } + + /*! # + */ + SortedArray& operator =( array_implementation&& x ) + { + Transfer( x ); + return *this; + } + + /*! # + */ + void Transfer( array_implementation& x ) + { + m_array.Transfer( x ); + Sort(); + } + + /*! # + */ + void Transfer( array_implementation&& x ) + { + m_array.Transfer( x ); + Sort(); + } + + /*! # + */ + void Assign( const T& v, size_type n = 1 ) + { + m_array.Assign( v, n ); + } + + /*! # + */ + template + void Assign( FI i, FI j ) + { + m_array.Assign( i, j ); + Sort(); + } + + /*! # + */ + void Import( iterator i, iterator j ) + { + m_array.Import( i, j ); + Sort(); + } + + /*! # + */ + iterator Release() + { + return m_array.Release(); + } + + /*! # + */ + void Add( const SortedArray& x ) + { + const_iterator p = x.Begin(), q = x.End(); + for ( iterator i = m_array.Begin(); i < m_array.End() && p < q; ++i ) + if ( *p < *i ) + i = m_array.Insert( i, *p++ ); + if ( p < q ) + m_array.Append( p, q ); + } + + /*! # + */ + void Add( const Array& x ) + { + Add( x.Begin(), x.End() ); + } + + /*! # + */ + const_iterator Add( const T& v, size_type n = 1 ) + { + return m_array.Insert( pcl::InsertionPoint( m_array.Begin(), m_array.End(), v ), v, n ); + } + + /*! # + */ + template + void Add( FI i, FI j ) + { + if ( i != j ) + { + m_array.EnsureUnique(); + for ( iterator l = m_array.Begin(), r = m_array.End(); ; ) + { + FI h = i; + iterator m = m_array.Insert( pcl::InsertionPoint( l, r, *i ), *i ); + + if ( ++i == j ) + break; + + if ( *i < *h ) + { + l = m_array.Begin(); + r = m; + } + else + { + l = m + 1; + r = m_array.End(); + } + } + } + } + + /*! # + */ + void Remove( const_iterator i, size_type n = 1 ) + { + m_array.Remove( const_cast( i ), n ); + } + + /*! # + */ + void Remove( const_iterator i, const_iterator j ) + { + m_array.Remove( const_cast( i ), const_cast( j ) ); + } + + /*! + * Destroys and removes a trailing sequence of contiguous objects from the + * specified iterator of this array. This operation is equivalent to: + * + * \code Remove( i, End() ) \endcode + * + * If the specified iterator \a i is located at or after the end of this + * array, this function does nothing. Otherwise the iterator is constrained + * to stay in the range [Begin(),End()) of existing array elements. + */ + void Truncate( const_iterator i ) + { + m_array.Truncate( const_cast( i ) ); + } + + /*! + * Removes a contiguous trailing sequence of \a n existing objects from this + * sorted array. This operation is equivalent to: + * + * \code Truncate( End() - n ) \endcode + * + * If the specified count \a n is greater than or equal to the length of + * this array, this function calls Clear() to yield an empty array. + */ + void Shrink( size_type n = 1 ) + { + m_array.Shrink( n ); + } + + /*! # + */ + void Remove( const T& v ) + { + const_iterator i = pcl::BinarySearch( Begin(), End(), v ); + if ( i != End() ) + Remove( i, pcl::InsertionPoint( i+1, End(), v ) ); + } + + /*! # + */ + void Clear() + { + m_array.Clear(); + } + + /*! # + */ + void Reserve( size_type n ) + { + m_array.Reserve( n ); + } + + /*! # + */ + void Squeeze() + { + m_array.Squeeze(); + } + + /*! + * Sets all objects contained by this array equal to \a v. + */ + void Fill( const T& v ) + { + m_array.Fill( v ); + } + + /*! # + */ + template + void Apply( F f ) const + { + pcl::Apply( Begin(), End(), f ); + } + + /*! # + */ + template + const_iterator FirstThat( F f ) const + { + return pcl::FirstThat( Begin(), End(), f ); + } + + /*! # + */ + template + const_iterator LastThat( F f ) const + { + return pcl::LastThat( Begin(), End(), f ); + } + + /*! # + */ + size_type Count( const T& v ) const + { + const_iterator i = pcl::BinarySearch( Begin(), End(), v ); + return (i != End()) ? pcl::InsertionPoint( i+1, End(), v ) - i : 0; + } + + /*! # + */ + template + size_type Count( const T& v, BP p ) const + { + return m_array.Count( v, p ); + } + + /*! # + */ + template + size_type CountIf( UP p ) const + { + return m_array.CountIf( p ); + } + + /*! # + */ + const_iterator MinItem() const + { + return Begin(); + } + + /*! # + */ + template + const_iterator MinItem( BP p ) const + { + return pcl::MinItem( Begin(), End(), p ); + } + + /*! # + */ + const_iterator MaxItem() const + { + return IsEmpty() ? End() : End()-1; + } + + /*! # + */ + template + const_iterator MaxItem( BP p ) const + { + return pcl::MaxItem( Begin(), End(), p ); + } + + /*! # + */ + const_iterator Search( const T& v ) const + { + return pcl::BinarySearch( Begin(), End(), v ); + } + + /*! # + */ + template + const_iterator Search( const T& v, BP p ) const + { + return m_array.Search( v, p ); + } + + /*! # + */ + const_iterator SearchLast( const T& v ) const + { + return pcl::BinarySearchLast( Begin(), End(), v ); + } + + /*! # + */ + template + const_iterator SearchLast( const T& v, BP p ) const + { + return m_array.SearchLast( v, p ); + } + + /*! # + */ + bool Contains( const T& v ) const + { + return Search( v ) != End(); + } + + /*! # + */ + template + bool Contains( const T& v, BP p ) const + { + return Search( v, p ) != End(); + } + + /*! # + */ + void Sort() + { + m_array.Sort(); + } + + /*! + * Exchanges two sorted arrays \a x1 and \a x2. + */ + friend void Swap( SortedArray& x1, SortedArray& x2 ) + { + pcl::Swap( x1.m_array, x2.m_array ); + } + + /*! + * Returns true only if two sorted arrays \a x1 and \a x2 are equal. + * \ingroup array_relational_operators + */ + friend bool operator ==( const SortedArray& x1, const SortedArray& x2 ) + { + return x1.m_array == x2.m_array; + } + + /*! + * Returns true only if a sorted array \a x1 is equal to an array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const SortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array == x2; + } + + /*! + * Returns true only if an array \a x1 is equal to a sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator ==( const array_implementation& x1, const SortedArray& x2 ) + { + return x1 == x2.m_array; + } + + /*! + * Returns true only if a sorted array \a x1 precedes another sorted array + * \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const SortedArray& x1, const SortedArray& x2 ) + { + return x1.m_array < x2.m_array; + } + + /*! + * Returns true only if a sorted array \a x1 precedes an array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const SortedArray& x1, const array_implementation& x2 ) + { + return x1.m_array < x2; + } + + /*! + * Returns true only if an array \a x1 precedes a sorted array \a x2. + * \ingroup array_relational_operators + */ + friend bool operator <( const array_implementation& x1, const SortedArray& x2 ) + { + return x1 < x2.m_array; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each element in this array, this function appends a string + * representation (known as a \e token) to the target string \a s. If the + * array contains more than one element, successive tokens are separated + * with the specified \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform an array element to a string. The + * standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + return m_array.ToSeparated( s, separator ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each element x in this array, this function appends a string + * representation (known as a \e token) to the target string \a s by + * calling the \a append function: + * + *\code append( s, S( x ) ); \endcode + * + * If the array contains more than one element, successive tokens are + * separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform an + * array element to a string. The standard String and IsoString PCL classes + * provide the required functionality for most scalar types, although it is + * probably easier to use String::ToSeparated() and IsoString::ToSeparated() + * instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + return m_array.ToSeparated( s, separator, append ); + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return m_array.ToCommaSeparated( s ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return m_array.ToSpaceSeparated( s ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return m_array.ToTabSeparated( s ); + } + + /*! + * Generates a newline-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\n' ); \endcode + */ + template + S& ToNewLineSeparated( S& s ) const + { + return m_array.ToNewLineSeparated( s ); + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this array. + * + * This function calls pcl::Hash64() for the internal array buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const + { + return m_array.Hash64( seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this array. + * + * This function calls pcl::Hash32() for the internal array buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const + { + return m_array.Hash32( seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this array. This + * function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const + { + return Hash64( seed ); + } + + // ------------------------------------------------------------------------- + +private: + + array_implementation m_array; +}; + +// ---------------------------------------------------------------------------- + +/*! + * Adds an object \a v to a sorted array \a x. Returns a reference to the + * sorted array. + * + * The template argument type T must have conversion semantics from the type V, + * such as T::T( const V& ) or equivalent. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray& x, const V& v ) +{ + x.Add( T( v ) ); + return x; +} + +/*! + * Adds an object \a v to a temporary sorted array \a x. Returns a reference to + * the sorted array. + * + * The template argument type T must have conversion semantics from the type V, + * such as T::T( const V& ) or equivalent. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray&& x, const V& v ) +{ + x.Add( T( v ) ); + return x; +} + +/*! + * Adds a sorted array \a x2 to a sorted array \a x1. Returns a reference to + * the left-hand sorted array \a x1. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray& x1, const SortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds a sorted array \a x2 to a temporary sorted array \a x1. Returns a + * reference to the left-hand sorted array \a x1. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray&& x1, const SortedArray& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds an array \a x2 to a sorted array \a x1. Returns a reference to the + * left-hand sorted array \a x1. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray& x1, const Array& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +/*! + * Adds an array \a x2 to a temporary sorted array \a x1. Returns a reference + * to the left-hand sorted array \a x1. + * \ingroup array_insertion_operators + */ +template inline +SortedArray& operator <<( SortedArray&& x1, const Array& x2 ) +{ + x1.Add( x2 ); + return x1; +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SortedArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SortedArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SphericalRotation.h b/3rdparty/include/pcl/SphericalRotation.h new file mode 100644 index 0000000..9715088 --- /dev/null +++ b/3rdparty/include/pcl/SphericalRotation.h @@ -0,0 +1,131 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SphericalRotation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SphericalRotation_h +#define __PCL_SphericalRotation_h + +/// \file pcl/SphericalRotation.h + +#include + +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SphericalRotation + * \brief Rotation in spherical coordinates + * + * \ingroup astrometry_support + */ +class PCL_CLASS SphericalRotation +{ +public: + + constexpr static double Tolerance = 1.0e-05; + + /*! + * Default constructor. + */ + SphericalRotation() = default; + + /*! + * Copy constructor. + */ + SphericalRotation( const SphericalRotation& ) = default; + + /*! + * + */ + SphericalRotation( double lng0, double lat0, double phi0, double theta0, double phip, + const Optional& latpole ); + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SphericalRotation& operator =( const SphericalRotation& ) = default; + + /*! + * + */ + DPoint NativeToCelestial( const DPoint& np ) const; + + /*! + * + */ + DPoint CelestialToNative( const DPoint& cp ) const; + +private: + + double m_latpole; + double m_alphaP; + double m_deltaP; + double m_phiP; + double m_cosdeltaP; + double m_sindeltaP; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SphericalRotation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SphericalRotation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SpinBox.h b/3rdparty/include/pcl/SpinBox.h new file mode 100644 index 0000000..1ea538f --- /dev/null +++ b/3rdparty/include/pcl/SpinBox.h @@ -0,0 +1,484 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SpinBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SpinBox_h +#define __PCL_SpinBox_h + +/// \file pcl/SpinBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SpinBox + * \brief Client-side interface to a PixInsight %SpinBox control. + * + * ### TODO: Write a detailed description for %Sizer. + */ +class PCL_CLASS SpinBox : public Control +{ +public: + + /*! + * Constructs a %SpinBox as a child control of \a parent. + */ + SpinBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %SpinBox object. + */ + virtual ~SpinBox() + { + } + + /*! + * Returns the current value of this %SpinBox control. + * + * \sa SetValue(), NormalizedValue(), SetNormalizedValue() + */ + int Value() const; + + /*! + * Sets the value of this %SpinBox control. + * + * \sa Value(), NormalizedValue(), SetNormalizedValue() + */ + void SetValue( int v ); + + /*! + * Returns the current value of this %SpinBox control as a normalized real + * value in the range [0,1]. + * + * \sa SetNormalizedValue(), Value() + */ + double NormalizedValue() const; + + /*! + * Sets the value of this %SpinBox control as a normalized real value in the + * range [0,1]. + * + * \sa NormalizedValue(), SetValue() + */ + void SetNormalizedValue( double f ); + + /*! + * Gets the range of values for this %SpinBox control. + * + * \param[out] minValue, maxValue References to the variables where the + * minimum and maximum values of this %SpinBox control will be + * copied, respectively. + * + * \sa SetRange(), MinValue(), MaxValue() + */ + void GetRange( int& minValue, int& maxValue ) const; + + /*! + * Returns the minimum value of this %SpinBox control. + * + * \sa MaxValue(), GetRange() + */ + int MinValue() const + { + int m, dum; GetRange( m, dum ); return m; + } + + /*! + * Returns the maximum value of this %SpinBox control. + * + * \sa MinValue(), GetRange() + */ + int MaxValue() const + { + int dum, m; GetRange( dum, m ); return m; + } + + /*! + * Sets the range of values for this %SpinBox control. + * + * \param minValue, maxValue New minimum and maximum values, + * respectively, for this %SpinBox control. + * + * \sa GetRange(), SetMinValue(), SetMaxValue() + */ + void SetRange( int minValue, int maxValue ); + + /*! + * Sets the minimum value of this %SpinBox control. + * + * This is a convenience member function, equivalent to + * SetRange( m, MaxValue() ) + * + * \sa SetMaxValue(), SetRange(), MinValue(), MaxValue() + */ + void SetMinValue( int m ) + { + SetRange( m, MaxValue() ); + } + + /*! + * Sets the maximum value of this %SpinBox control. + * + * This is a convenience member function, equivalent to + * SetRange( MinValue(), m ) + * + * \sa SetMinValue(), SetRange(), MinValue(), MaxValue() + */ + void SetMaxValue( int m ) + { + SetRange( MinValue(), m ); + } + + /*! + * Returns the step size of this %SpinBox control + * + * The step size is the number of units that are skipped when the user + * clicks an arrow icon on this %SpinBox control. + * + * \sa SetStepSize() + */ + int StepSize() const; + + /*! + * Sets the step size of this %SpinBox control + * + * The step size is the number of units that are skipped when the user + * clicks an arrow icon on this %SpinBox control. + * + * \sa StepSize() + */ + void SetStepSize( int ); + + /*! + * Returns true iff wrapping mode is enabled for this %SpinBox + * control. + * + * When wrapping is enabled, a %SpinBox can wrap around its minimum + * and maximum values: stepping down from MinValue() sets the spin box's + * value to its MaxValue(), and stepping up from MaxValue() will set its + * value to MinValue(). + * + * \sa EnableWrapping(), DisableWrapping() + */ + bool IsWrappingEnabled() const; + + /*! + * Enables or disables wrapping mode for this %SpinBox control. + * + * See IsWrappingEnabled() for a description of %SpinBox's wrapping mode. + * + * \sa IsWrappingEnabled(), DisableWrapping() + */ + void EnableWrapping( bool = true ); + + /*! + * Disables or enables wrapping mode for this %SpinBox control. + * + * See IsWrappingEnabled() for a description of %SpinBox's wrapping mode. + * + * This is a convenience member function, equivalent to + * EnableWrapping( !disable ) + * + * \sa IsWrappingEnabled(), EnableWrapping() + */ + void DisableWrapping( bool disable = true ) + { + EnableWrapping( !disable ); + } + + /*! + * Returns true iff this %SpinBox control is \e editable. + * + * An editable spin box allows the user to enter its current value directly + * on its Edit part. The value of a non-editable spin box can only be + * changed by clicking on its arrow icons, or by pressing the Up and Down + * keys when it has the keyboard focus. + * + * \sa SetEditable() + */ + bool IsEditable() const; + + /*! + * Enables or disables the editable state of this %SpinBox control. + * + * \sa IsEditable() + */ + void SetEditable( bool = true ); + + /*! + * Returns the prefix string of this %SpinBox control. + * + * The prefix is shown prepended to the spin box's text. It is useful to + * shown measuring or currency units. By default no prefix is shown in + * spin boxes. + * + * \sa SetPrefix(), Suffix(), SetSuffix(), MinimumValueText() + */ + String Prefix() const; + + /*! + * Sets the prefix string of this %SpinBox control. + * + * \sa Prefix(), Suffix(), SetSuffix(), MinimumValueText() + */ + void SetPrefix( const String& prefix ); + + /*! + * Disables (clears) the prefix string of this %SpinBox control. + * + * This is a convenience member function, equivalent to + * SetPrefix( String() ) + */ + void ClearPrefix() + { + SetPrefix( String() ); + } + + /*! + * Returns the suffix string of this %SpinBox control. + * + * The suffix is shown appended to the spin box's text. It is useful to + * shown measuring or currency units. By default no suffix is shown in + * spin boxes. + * + * \sa SetSuffix(), Prefix(), SetPrefix(), MinimumValueText() + */ + String Suffix() const; + + /*! + * Sets the suffix string of this %SpinBox control. + * + * \sa Suffix(), Prefix(), SetPrefix(), MinimumValueText() + */ + void SetSuffix( const String& ); + + /*! + * Disables (clears) the suffix string of this %SpinBox control. + * + * This is a convenience member function, equivalent to + * SetSuffix( String() ) + */ + void ClearSuffix() + { + SetSuffix( String() ); + } + + /*! + * Returns the minimum value text string for this %SpinBox control. + * + * When it is set to a non-empty string, the minimum value text is shown + * instead of the usual numeric literal when the spin box's value is equal + * to its minimum value. + * + * \sa SetMinimumValueText(), Prefix(), Suffix() + */ + String MinimumValueText() const; + + /*! + * Sets the minimum value text string for this %SpinBox control. + * + * \sa MinimumValueText(), Prefix(), Suffix() + */ + void SetMinimumValueText( const String& ); + + /*! + * Disables (clears) the minimum value text of this %SpinBox control. + * + * This is a convenience member function, equivalent to + * SetMinimumValueText( String() ) + */ + void ClearMinimumValueText() + { + SetMinimumValueText( String() ); + } + + /*! + * Returns true iff the text in this %SpinBox control is right-aligned. + * + * \sa SetRightAlignment(), IsLeftAligned() + */ + bool IsRightAligned() const; + + /*! + * Returns true iff the text in this %SpinBox control is left-aligned. + * + * This is a convenience member function, equivalent to + * !IsRightAligned() + * + * \sa SetLeftAlignment(), IsRightAligned() + */ + bool IsLeftAligned() const + { + return !IsRightAligned(); + } + + /*! + * Enables or disables right alignment for the text in this %SpinBox + * control. + * + * \sa IsRightAligned() + */ + void SetRightAlignment( bool = true ); + + /*! + * Enables or disables left alignment for the text in this %SpinBox + * control. + * + * This is a convenience member function, equivalent to + * SetRightAlignment( !left ) + * + * \sa IsLeftAligned() + */ + void SetLeftAlignment( bool left = true ) + { + SetRightAlignment( !left ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnValueUpdated( SpinBox& sender, int value ); + // void OnRangeUpdated( SpinBox& sender, int minValue, int maxValue ); + + /*! + * \defgroup spin_box_event_handlers SpinBox Event Handlers + */ + + /*! + * Defines the prototype of a spin box value event handler. + * + * A spin box value event is generated when the user changes the value of a + * spin box control. + * + * \param sender The control that sends a spin box value event. + * + * \param value The current value of the spin box. + * + * \ingroup spin_box_event_handlers + */ + typedef void (Control::*value_event_handler)( SpinBox& sender, int value ); + + /*! + * Defines the prototype of a spin box range event handler. + * + * A spin box range event is generated when the range of a spin box control + * is changed. + * + * \param sender The control that sends a spin box range event. + * + * \param minValue, maxValue The current minimum and maximum values of the + * spin box, respectively. + * + * \ingroup slider_event_handlers + */ + typedef void (Control::*range_event_handler)( SpinBox& sender, int minValue, int maxValue ); + + /*! + * Sets the spin box value event handler for this %SpinBox control. + * + * \param handler The spin box value event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive spin box value events + * from this %SpinBox. + * + * \ingroup spin_box_event_handlers + */ + void OnValueUpdated( value_event_handler handler, Control& receiver ); + + /*! + * Sets the slider range event handler for this %SpinBox control. + * + * \param handler The slider range event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive slider range events + * from this %SpinBox. + * + * \ingroup spin_box_event_handlers + */ + void OnRangeUpdated( range_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + value_event_handler onValueUpdated = nullptr; + range_event_handler onRangeUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class SpinBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_SpinBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SpinBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SpinStatus.h b/3rdparty/include/pcl/SpinStatus.h new file mode 100644 index 0000000..bbaf403 --- /dev/null +++ b/3rdparty/include/pcl/SpinStatus.h @@ -0,0 +1,203 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SpinStatus.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SpinStatus_h +#define __PCL_SpinStatus_h + +/// \file pcl/SpinStatus.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SpinStatus + * \brief A status monitoring callback that shows a spinning character + * animation on the processing console. + * + * %SpinStatus is a StatusCallback derived class that generates a spinning + * character animation on the processing console. The spinning animation + * consists of successively writing the four - \ | / characters at the same + * position on the console. This is a classical form of text-based animation + * that provides a nice feedback to the user while a long process is running. + * + * %SpinStatus is suitable for processes where a total status monitoring + * count cannot be computed in advance. For example, this happens with + * processes that perform an unpredictable number of iterations while a given + * contition is not fulfilled. When a status monitoring count is available + * before running a process, the StandardStatus monitoring class is preferable. + * + * %SpinStatus and %StandardStatus are used by all standard PixInsight + * processes and file formats. Unless a specific module has an extremely good + * reason to proceed otherwise, we recommend that all modules also use these + * monitoring classes. This ensures that efficient and coherent feedback is + * provided to the user on the entire PixInsight platform. + * + * As %StandardStatus, %SpinStatus also allows the PixInsight core application + * to process mouse, keyboard and screen update events. In this way the + * application's GUI remains responsive in case the user requests aborting + * or suspending the monitored process. + * + * \sa StatusCallback, StatusMonitor, Console, StandardStatus, + * ProgressBarStatus, MuteStatus + */ +class PCL_CLASS SpinStatus : public StatusCallback +{ +public: + + /*! + * Constructs a default %SpinStatus object. + */ + SpinStatus() = default; + + /*! + * Copy constructor. + */ + SpinStatus( const SpinStatus& x ) + : StatusCallback( x ) + , m_spinCount( x.m_spinCount ) + { + } + + /*! + * Move constructor. + */ + SpinStatus( SpinStatus&& x ) + : StatusCallback( std::move( x ) ) + , m_console( std::move( x.m_console ) ) + , m_spinCount( x.m_spinCount ) + , m_thread( x.m_thread ) + { + x.m_thread = nullptr; + } + + /*! + * Destroys a %SpinStatus instance. + */ + virtual ~SpinStatus() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SpinStatus& operator =( const SpinStatus& x ) + { + (void)StatusCallback::operator =( x ); + m_spinCount = x.m_spinCount; + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SpinStatus& operator =( SpinStatus&& x ) + { + if ( this != &x ) + { + (void)StatusCallback::operator =( std::move( x ) ); + m_console = std::move( x.m_console ); + m_spinCount = x.m_spinCount; + m_thread = x.m_thread; + x.m_thread = nullptr; + } + return *this; + } + + /*! + * This function is called by a status monitor object \a m when a new + * monitored process is about to start. + */ + int Initialized( const StatusMonitor& m ) const override; + + /*! + * Function called by a status monitor object \a m to signal an update of + * the progress count for the current process. + */ + int Updated( const StatusMonitor& m ) const override; + + /*! + * Function called by a status monitor object \a m to signal that the + * current process has finished. + */ + int Completed( const StatusMonitor& m ) const override; + + /*! + * Function called by a status monitor object \a m when the progress + * information for the current process has been changed. + */ + void InfoUpdated( const StatusMonitor& m ) const override; + +private: + + mutable pcl::Console m_console; + mutable unsigned m_spinCount = 0; + mutable void* m_thread = nullptr; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_SpinStatus_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SpinStatus.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StandardAllocator.h b/3rdparty/include/pcl/StandardAllocator.h new file mode 100644 index 0000000..63cbade --- /dev/null +++ b/3rdparty/include/pcl/StandardAllocator.h @@ -0,0 +1,349 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StandardAllocator.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StandardAllocator_h +#define __PCL_StandardAllocator_h + +/// \file pcl/StandardAllocator.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class StandardAllocator + * \brief A block allocator class that uses the standard new and delete + * operators. + * + * %StandardAllocator is a block allocator class. It is used by + * default for all container classes in PCL. It defines default block sizing + * and growing strategies that work efficiently in most cases. + * + * For a complete description of block allocators and their fundamental role in + * PCL, read the documentation for the Allocator class. + * + * \sa Allocator, AlignedAllocator + */ +class PCL_CLASS StandardAllocator +{ +public: + + /*! + * Constructs a %StandardAllocator object. + * + * \param fastGrowth Whether to enable the fast block size growing policy + * for this allocator. + * + * \param canShrink Whether to enable the block shrinking policy for + * this allocator. + * + * See the IsFastGrowthEnabled() and IsShrinkingEnabled() member functions + * for more information on block allocation policies. + */ + StandardAllocator( bool fastGrowth = true, bool canShrink = true ) + : m_fastGrowth( fastGrowth ) + , m_canShrink( canShrink ) + { + } + + /*! + * Copy constructor. + */ + StandardAllocator( const StandardAllocator& ) = default; + + /*! + * Returns the size in bytes of the largest contiguous block that this + * object is able to allocate. + * + * %StandardAllocator can (theoretically) allocate ~size_type( 0 ) bytes. + * This poses no practical limit on 64-bit systems. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + */ + size_type MaxSize() const + { + return ~size_type( 0 ); + } + + /*! + * Returns the size in bytes of an allocation block suitable for + * storage of at least \a n bytes. + * + * See IsFastGrowthEnabled() for more information about block size growing + * policies in %StandardAllocator. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa ReallocatedBlockSize(), IsFastGrowthEnabled() + */ + size_type BlockSize( size_type n ) const + { + // Check for null allocation attempts. + if ( n == 0 ) + return 0; + + // Take into account a reasonable upper limit for the size in bytes of an + // allocation block header. + const size_type blockHeaderSize = 4*sizeof( void* ); + n += blockHeaderSize; + + // Grow linearly by 8-byte chunks for n < 64 bytes. + if ( n < 64 ) + return ((n >> 3) << 3) + 8 - blockHeaderSize; + + // Grow exponentially by doubling container capacity if fast growing is + // enabled or n < 64 KiB. + if ( IsFastGrowthEnabled() || n < 65536 ) + { + size_type nn = 64; + while ( nn < n ) + nn <<= 1; + return nn - blockHeaderSize; + } + + // If fast growing is disabled or n >= 64 KiB, grow linearly by 4 KiB + // chunks. + return ((n >> 12) << 12) + 4096 - blockHeaderSize; + } + + /*! + * Returns the size in bytes of a reallocated data block. + * + * \param currentSize The current size in bytes of an allocated data block. + * + * \param newSize The new size in bytes of the reallocated data block. + * + * See IsFastGrowthEnabled() and IsShrinkingEnabled() for information about + * block size allocation and reallocation policies in %StandardAllocator. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa BlockSize(), IsShrinkingEnabled(), IsFastGrowthEnabled() + */ + size_type ReallocatedBlockSize( size_type currentSize, size_type newSize ) const + { + return (currentSize < newSize || m_canShrink) ? BlockSize( newSize ) : currentSize; + } + + /*! + * Custom allocation routine. Allocates a contiguous memory block of the + * specified \a size in bytes, and returns the address of the first byte in + * the newly allocated block. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa DeallocateBlock() + */ + void* AllocateBlock( size_type size ) + { + PCL_PRECONDITION( size != 0 ) + return ::operator new( size ); + } + + /*! + * Custom deallocation routine. Deallocates a previously allocated + * contiguous memory block that begins at the specified location \a p. + * + * \note This member function is mandatory for a block allocator to be + * usable by the Allocator class. + * + * \sa AllocateBlock() + */ + void DeallocateBlock( void* p ) + { + PCL_PRECONDITION( p != nullptr ) + ::operator delete( p ); + } + + /*! + * Returns true iff fast growth is currently enabled for this + * allocator. + * + * When fast growth is enabled, %StandardAllocator provides block sizes + * that grow exponentially above 64 bytes: 128, 256, 512, 1K, ... 512K, 1M, + * and so on. This maximizes speed of dynamic allocation operations, but at + * the cost of more memory wasted by partially used blocks in + * contiguous-storage containers such as Array or String. + * + * With fast growth disabled, %StandardAllocator follows a more conservative + * scheme to provide reasonable block sizes while preventing excessive + * memory consumption. For block sizes below 64 kilobytes, blocks grow + * exponentially to improve efficiency of allocation for small objects, such + * as short strings. For blocks larger than 64K, block sizes grow by + * constant chunks of 4K. + * + * The fast block size growing policy is always enabled by default. + * + * \sa EnableFastGrowth(), DisableFastGrowth(), BlockSize() + */ + bool IsFastGrowthEnabled() const + { + return m_fastGrowth; + } + + /*! + * Enables the fast block size growing policy for %StandardAllocator. + * + * See IsFastGrowthEnabled() for more information about block size growing + * policies. + * + * \sa IsFastGrowthEnabled(), DisableFastGrowth() + */ + void EnableFastGrowth( bool enable = true ) + { + m_fastGrowth = enable; + } + + /*! + * Disables the fast block size growing policy for %StandardAllocator. + * + * See IsFastGrowthEnabled() for more information about block size growing + * policies. + * + * \sa IsFastGrowthEnabled(), EnableFastGrowth() + */ + void DisableFastGrowth( bool disable = true ) + { + EnableFastGrowth( !disable ); + } + + /*! + * Returns true iff block shrinking is currently enabled for this + * allocator. + * + * When block shrinking is enabled, %StandardAllocator allows size + * reductions for reallocated blocks in calls to the ReallocatedBlockSize(). + * When block shrinking is disabled, already allocated blocks can only be + * reallocated with increased lengths. + * + * The block shrinking policy is always enabled by default. + * + * \sa EnableShrinking(), DisableShrinking(), ReallocatedBlockSize() + */ + bool IsShrinkingEnabled() const + { + return m_canShrink; + } + + /*! + * Enables a block shrinking policy for %StandardAllocator. + * + * See IsShrinkingEnabled() for more information about block shrinking + * policies. + * + * \sa IsShrinkingEnabled(), DisableShrinking() + */ + void EnableShrinking( bool enable = true ) + { + m_canShrink = enable; + } + + /*! + * Disables a block shrinking policy for %StandardAllocator. + * + * See IsShrinkingEnabled() for more information about block shrinking + * policies. + * + * \sa IsShrinkingEnabled(), EnableShrinking() + */ + void DisableShrinking( bool disable = true ) + { + EnableShrinking( !disable ); + } + +private: + + bool m_fastGrowth : 1; + bool m_canShrink : 1; +}; + +} // pcl + +// ---------------------------------------------------------------------------- + +/*! + * Placement new operator for class StandardAllocator. Returns the specified + * address \a p. + */ +inline void* operator new( pcl::size_type, void* p, pcl::StandardAllocator& ) +{ + PCL_PRECONDITION( p != nullptr ) + return p; +} + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4100 ) // 'unreferenced formal parameter' + +inline void operator delete( void* p, void*, pcl::StandardAllocator& ) +{ + PCL_PRECONDITION( p != nullptr ) +} + +#pragma warning( pop ) +#endif // _MSC_VER + +// ---------------------------------------------------------------------------- + +#endif // __PCL_StandardAllocator_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StandardAllocator.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StandardStatus.h b/3rdparty/include/pcl/StandardStatus.h new file mode 100644 index 0000000..1f205f5 --- /dev/null +++ b/3rdparty/include/pcl/StandardStatus.h @@ -0,0 +1,202 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StandardStatus.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StandardStatus_h +#define __PCL_StandardStatus_h + +/// \file pcl/StandardStatus.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class StandardStatus + * \brief A status monitoring callback that sends progress information to the + * process console. + * + * %StandardStatus uses the processing console associated with the current + * processing thread to provide feedback and progress information on a + * process being monitored by a StatusMonitor object. + * + * %StandardStatus is suitable for processes where a total status + * monitoring count can be computed in advance. For example, this happens + * with processes that operate on a pixel-by-pixel basis and perform a fixed + * number of iterations, or a number of iterations that can be predicted before + * running the process. For cases where a total count is not available or + * cannot be computed, the SpinStatus class is more suitable. + * + * %StandardStatus and %SpinStatus are used by all standard PixInsight + * processes and file formats. Unless a specific module has an extremely good + * reason to proceed otherwise, we recommend that all modules also use these + * monitoring classes. This ensures that efficient and coherent feedback is + * provided to the user on the entire PixInsight platform. + * + * In addition, using %StandardStatus (and also %SpinStatus) allows the + * PixInsight core application to process mouse, keyboard and screen update + * events. In this way the application's GUI can be responsive if the user + * requests aborting or suspending the monitored process. + * + * \sa StatusCallback, StatusMonitor, Console, SpinStatus, ProgressBarStatus, + * MuteStatus + */ +class PCL_CLASS StandardStatus : public StatusCallback +{ +public: + + /*! + * Constructs a default %StandardStatus object. + */ + StandardStatus() = default; + + /*! + * Copy constructor. + */ + StandardStatus( const StandardStatus& x ) + : StatusCallback( x ) + , m_last( x.m_last ) + { + } + + /*! + * Move constructor. + */ + StandardStatus( StandardStatus&& x ) + : StatusCallback( std::move( x ) ) + , m_console( std::move( x.m_console ) ) + , m_last( x.m_last ) + , m_thread( x.m_thread ) + { + x.m_thread = nullptr; + } + + /*! + * Destroys a %StandardStatus instance. + */ + virtual ~StandardStatus() + { + } + + /*! + * Copy constructor. Returns a reference to this object. + */ + StandardStatus& operator =( const StandardStatus& x ) + { + (void)StatusCallback::operator =( x ); + m_last = x.m_last; + return *this; + } + + /*! + * Move constructor. Returns a reference to this object. + */ + StandardStatus& operator =( StandardStatus&& x ) + { + if ( this != &x ) + { + (void)StatusCallback::operator =( std::move( x ) ); + m_console = std::move( x.m_console ); + m_last = x.m_last; + m_thread = x.m_thread; + x.m_thread = nullptr; + } + return *this; + } + + /*! + * This function is called by a status \a monitor object when a new + * monitored process is about to start. + */ + int Initialized( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal an update of the + * progress count for the current process. + */ + int Updated( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object to signal that the current + * process has finished. + */ + int Completed( const StatusMonitor& monitor ) const override; + + /*! + * Function called by a status \a monitor object when the progress + * information for the current process has been changed. + */ + void InfoUpdated( const StatusMonitor& monitor ) const override; + +private: + + mutable pcl::Console m_console; + mutable int m_last = -1; + mutable void* m_thread = nullptr; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_StandardStatus_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StandardStatus.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StarDatabaseFile.h b/3rdparty/include/pcl/StarDatabaseFile.h new file mode 100644 index 0000000..70ad829 --- /dev/null +++ b/3rdparty/include/pcl/StarDatabaseFile.h @@ -0,0 +1,746 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StarDatabaseFile.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StarDatabaseFile_h +#define __PCL_StarDatabaseFile_h + +/// \file pcl/StarDatabaseFile.h + +#include + +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup point_source_databases Star Catalogs and Point Source Databases + */ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS StarDatabaseFile; + +/*! + * \class XPSD + * \brief Base class of point source database implementations. + * + * This class defines a set of fundamental data structures, properties and + * support routines associated with point source database files (XPSD format). + * + * \ingroup point_source_databases + */ +class PCL_CLASS XPSD +{ +public: + + /*! + * \struct pcl::XPSD::Metadata + * \brief %Metadata items available in point source database files. + * + * This structure holds metadata items that can be stored in point source + * database files (current XPSD format version 1.0). For an existing + * database file, available metadata are extracted directly from %XML file + * headers. Currently all items are optional, so all data members of this + * structure can be empty strings. + * + * For generation of new XPSD files, the creationTime and creatorOS members + * of this structure will be ignored, since the corresponding metadata items + * will always be defined automatically by the StarDatabaseFile::Serialize() + * routine. The specified creatorApplication member, if empty, will be + * replaced in the same routine with a default value identifying the current + * PCL version. + * + * \ingroup point_source_databases + */ + struct Metadata + { + TimePoint creationTime; //!< The date this file was created. + String creatorOS; //!< The operating system on which this file was created. + String creatorApplication; //!< The software application or program that created this file. + String databaseIdentifier; //!< The unique identifier of the database this file belongs to. + String databaseVersion; //!< The version of the database this file belongs to. + String title; //!< A title that represents or identifies this XPSD file. + String briefDescription; //!< A brief (single-line) description of this XPSD file. + String description; //!< A full description of the data stored in this XPSD file. + String organizationName; //!< The name of the organization responsible for this file. + String authors; //!< The names of one or more persons or groups that have created the data in this file. + String copyright; //!< Copyright information applicable to the data stored in this XPSD file. + }; + + /*! + * \struct pcl::XPSD::Statistics + * \brief Structural and statistical data about an XPSD database file. + * + * This structure provides information about the number of sources included + * in an XPSD file, as well as critical data about its tree-based database + * index structure. + * + * \ingroup point_source_databases + */ + struct Statistics + { + uint64 totalSources = 0; //!< The total number of sources included in this database. + uint32 totalNodes = 0; //!< Number of quadtree index nodes, including structural and leaf nodes. + uint32 totalLeaves = 0; //!< Number of quadtree index leaf nodes. + float medianLeafLength = 0; //!< The median of quadtree leaf node lengths. + uint32 minimumLeafLength = 0; //!< Minimum quadtree leaf node length. + uint32 maximumLeafLength = 0; //!< Maximum quadtree leaf node length. + }; + + /*! + * \struct SearchData + * \brief Data items and parameters for catalog search operations. + * + * The StarData template parameter represents a catalog-specific structure + * to hold the data associated with a point source extracted during a + * database search operation. + * + * \ingroup point_source_databases + */ + template + struct SearchData + { + double centerRA = 0; //!< Field center right ascension coordinate in degrees (search parameter). + double centerDec = 0; //!< Field center declination coordinate in degrees (search parameter). + double radius = 1; //!< Field radius in degrees (search parameter). + float magnitudeLow = -1.5; /*!< Low magnitude (search parameter). Only stars of magnitude greater + than or equal to this value will be included in the stars list. */ + float magnitudeHigh = 26; /*!< High magnitude (search parameter). Only stars of magnitude less + than or equal to this value will be included in the stars list. */ + uint32 sourceLimit = uint32_max; /*!< The search will not include more objects than this limit + in the stars list (search parameter). */ + uint32 requiredFlags = 0u; /*!< Required flags (search parameter). If non-zero, only stars with + \e all of these flags set will be included in the stars list. */ + uint32 inclusionFlags = 0u; /*!< Inclusion flags (search parameter). If non-zero, only stars with + \e any of these flags set will be included in the stars list. */ + uint32 exclusionFlags = 0u; /*!< Exclusion flags (search parameter). Stars with \e any of these flags + set will \e not be included in the stars list. */ + + Array stars; //!< The list of stars found by the search operation (output data). + uint32 excessCount = 0u; /*!< When \a sourceLimit is exceeded, this is the number of + additional objects found but not included in the stars list (output data). */ + uint32 rejectCount = 0u; /*!< Total number of rejected objects (output data). This refers to + point sources that have been tested for inclusion in the search + result, but have not matched the search criteria. */ + double timeTotal = 0; //!< Total search time in seconds (output data). + double timeIO = 0; //!< Time consumed by I/O operations in seconds (output data). + uint32 countIO = 0u; //!< Total number of I/O operations performed (output data). + double timeUncompress = 0; //!< Time consumed by data uncompression in seconds (output data). + double timeDecode = 0; //!< Time consumed by data decoding in seconds (output data). + + /*! + * Sets all search result data items to null values. + */ + void ResetSearchResults() + { + stars.Clear(); + excessCount = rejectCount = 0u; + timeTotal = timeIO = 0; + countIO = 0u; + timeUncompress = timeDecode = 0; + } + }; + +protected: + + struct ChildNodeData + { + // Zero-based quadtree child node positions in an index node array. + uint32 nw; // top-left child node + uint32 ne; // top-right child node + uint32 sw; // bottom-left child node + uint32 se; // bottom-right child node + }; + +#ifdef _MSC_VER + /* + * Our favorite brain-damaged thing does not know how to implement bit + * fields. Oh well... + */ + struct LeafNodeData + { + uint64 blockOffsetAndLeafFlag; + uint32 blockSize; + uint32 compressedBlockSize; + }; +#else + struct LeafNodeData + { + uint64 blockOffset : 63; // position of source data block, byte offset + bool leafFlag : 1; // quadtree node type: 0=structural 1=leaf + uint32 blockSize; // size of point source data, in bytes + uint32 compressedBlockSize; // size of compressed data, in bytes + }; +#endif + + /* + * Quadtree index node (48 bytes). + */ + struct IndexNode + { + // Projected coordinates of quadtree node rectangle. + double x0; // left + double y0; // top + double x1; // right + double y1; // bottom + + // Quadtree child node indexes or leaf node data. + union { ChildNodeData child; + LeafNodeData leaf; } index; + + IndexNode() + { + static_assert( sizeof( *this ) == 48, "Invalid sizeof( XPSD::IndexNode )" ); + static_assert( sizeof( ChildNodeData ) == 16, "Invalid sizeof( XPSD::ChildNodeData )" ); + static_assert( sizeof( LeafNodeData ) == 16, "Invalid sizeof( XPSD::LeafNodeData )" ); + static_assert( sizeof( index ) == 16, "Invalid sizeof( XPSD::IndexNode::index )" ); + + index.child.nw = index.child.ne = index.child.sw = index.child.se = 0; + } + + bool IsLeaf() const + { +#ifdef _MSC_VER + return (index.leaf.blockOffsetAndLeafFlag & 0x8000000000000000) != 0; +#else + return index.leaf.leafFlag; +#endif + } + + uint64 BlockOffset() const + { +#ifdef _MSC_VER + return index.leaf.blockOffsetAndLeafFlag & 0x7FFFFFFFFFFFFFFF; +#else + return index.leaf.blockOffset; +#endif + } + + uint32 BlockSize() const + { + return index.leaf.blockSize; + } + + uint32 CompressedBlockSize() const + { + return index.leaf.compressedBlockSize; + } + }; + + static double Distance( double lon1, double lat1, double lon2, double lat2 ) + { + return Vector::FromSpherical( Rad( lon1 ), Rad( lat1 ) ).Angle3D( Vector::FromSpherical( Rad( lon2 ), Rad( lat2 ) ) ); + } + + static double CrossTrackDistance( double lon, double lat, double lon1, double lat1, double lon2, double lat2 ) + { + if ( lon == lon1 ) + if ( lat == lat1 ) + return 0; + + Vector p = Vector::FromSpherical( Rad( lon ), Rad( lat ) ); + Vector c = Vector::FromSpherical( Rad( lon1 ), Rad( lat1 ) ).Cross( Vector::FromSpherical( Rad( lon2 ), Rad( lat2 ) ) ); + return c.Angle3D( p ) - Pi()/2; + } + + static bool WithinExtent( double lon, double lat, double lon1, double lat1, double lon2, double lat2 ) + { + if ( lon1 == lon2 ) + if ( lat1 == lat2 ) + return lon == lon1 && lat == lat1; // null segment + + Vector n0 = Vector::FromSpherical( Rad( lon ), Rad( lat ) ); + Vector n1 = Vector::FromSpherical( Rad( lon1 ), Rad( lat1 ) ); + Vector n2 = Vector::FromSpherical( Rad( lon2 ), Rad( lat2 ) ); + + // Get vectors representing p0->p1, p0->p2, p1->p2, p2->p1 + Vector d10 = n0 - n1, d12 = n2 - n1; + Vector d20 = n0 - n2, d21 = n1 - n2; + + // Dot product d10*d12 tells us if p0 is on p2 side of p1, similarly for d20*d21 + if ( d10 * d12 >= 0 ) + if ( d20 * d21 >= 0 ) + return (n0 * n1) >= 0 && (n0 * n2) >= 0; // same hemisphere + + return false; + } + + static bool InRegion( double lon, double lat, + double lon1, double lat1, double lon2, double lat2, + double lon3, double lat3, double lon4, double lat4 ) + { + Vector p = Vector::FromSpherical( Rad( lon ), Rad( lat ) ); + Vector v1 = p - Vector::FromSpherical( Rad( lon1 ), Rad( lat1 ) ); + Vector v2 = p - Vector::FromSpherical( Rad( lon2 ), Rad( lat2 ) ); + Vector v3 = p - Vector::FromSpherical( Rad( lon3 ), Rad( lat3 ) ); + Vector v4 = p - Vector::FromSpherical( Rad( lon4 ), Rad( lat4 ) ); + return Abs( v1.Angle3D( v2, p ) + v2.Angle3D( v3, p ) + v3.Angle3D( v4, p ) + v4.Angle3D( v1, p ) ) > Pi(); + } + + enum projection_type { Equirectangular, TransverseEquirectangular, AzimuthalEquidistant }; + + static String ProjectionToAttributeValue( int ); + static projection_type ProjectionFromAttributeValue( const String& ); + + class IndexTree + { + public: + + IndexTree( StarDatabaseFile* parent, + projection_type projection, double centerRA, double centerDec, + const Array& nodes ) + : m_parent( parent ) + , m_projection( projection ) + , m_centerRA( centerRA ) + , m_centerDec( centerDec ) + , m_nodes( nodes ) + { + } + + IndexTree() = default; + IndexTree( const IndexTree& ) = default; + + void Project( double& x, double& y, double ra, double dec ) const + { + switch( m_projection ) + { + default: // ?! + case Equirectangular: + x = ra - m_centerRA; + y = dec; + break; + case AzimuthalEquidistant: + { + double sa, ca; + SinCos( Rad( ra ), sa, ca ); + double r = 90 - Abs( dec ); + x = r*sa; + y = r*ca; + } + break; + case TransverseEquirectangular: + { + double sa, ca; + SinCos( Rad( ra ), sa, ca ); + double sd, cd; + SinCos( Rad( Abs( dec ) ), sd, cd ); + x = Deg( ArcSin( cd*sa ) ); + y = Deg( ArcTan( sd, cd*ca ) ) - 90; + } + break; + } + } + + void Unproject( double& ra, double& dec, double x, double y ) const + { + switch( m_projection ) + { + default: // ?! + case Equirectangular: + ra = x + m_centerRA; + dec = y; + break; + case AzimuthalEquidistant: + x = Rad( x ); + y = Rad( y ); + ra = Deg( ArcTan( x, y ) ); + if ( ra < 0 ) + ra += 360; + dec = Deg( ArcSin( Cos( Sqrt( x*x + y*y ) ) ) ); + if ( m_centerDec < 0 ) + dec = -dec; + break; + case TransverseEquirectangular: + { + double sx, cx; + SinCos( Rad( x ), sx, cx ); + double sy, cy; + SinCos( Rad( y + 90 ), sy, cy ); + ra = Deg( ArcTan( sx, cx*cy ) ); + if ( ra < 0 ) + ra += 360; + dec = Deg( ArcSin( sy*cx ) ); + if ( m_centerDec < 0 ) + dec = -dec; + } + break; + } + } + + void Search( double ra, double dec, double r, void* searchData ) const + { + SearchRecursive( 0, ra, dec, r, searchData ); + } + + private: + + StarDatabaseFile* m_parent = nullptr; + projection_type m_projection = Equirectangular; + double m_centerRA = 0; + double m_centerDec = 0; + Array m_nodes; + + void GetNodeBounds( double& ra1, double& dec1, double& ra2, double& dec2, + double& ra3, double& dec3, double& ra4, double& dec4, const IndexNode& node ) const + { + Unproject( ra1, dec1, node.x0, node.y0 ); + Unproject( ra2, dec2, node.x1, node.y0 ); + Unproject( ra3, dec3, node.x1, node.y1 ); + Unproject( ra4, dec4, node.x0, node.y1 ); + } + + bool InNodeRegion( double ra, double dec, const IndexNode& node ) const + { + double ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4; + GetNodeBounds( ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4, node ); + return InRegion( ra, dec, ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4 ); + } + + bool IntersectsNodeRegion( double ra, double dec, double r, const IndexNode& node ) const + { + double ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4; + GetNodeBounds( ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4, node ); + double rr = Rad( r ); + return InRegion( ra, dec, ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4 ) + || Distance( ra, dec, ra1, dec1 ) < rr + || Distance( ra, dec, ra2, dec2 ) < rr + || Distance( ra, dec, ra3, dec3 ) < rr + || Distance( ra, dec, ra4, dec4 ) < rr + || WithinExtent( ra, dec, ra1, dec1, ra2, dec2 ) && CrossTrackDistance( ra, dec, ra1, dec1, ra2, dec2 ) < rr + || WithinExtent( ra, dec, ra2, dec2, ra3, dec3 ) && CrossTrackDistance( ra, dec, ra2, dec2, ra3, dec3 ) < rr + || WithinExtent( ra, dec, ra3, dec3, ra4, dec4 ) && CrossTrackDistance( ra, dec, ra3, dec3, ra4, dec4 ) < rr + || WithinExtent( ra, dec, ra4, dec4, ra1, dec1 ) && CrossTrackDistance( ra, dec, ra4, dec4, ra1, dec1 ) < rr; + } + + // Defined after StarDatabaseFile declaration. + void SearchRecursive( uint32 nodeIndex, double ra, double dec, double r, void* searchData ) const; + + friend class StarDatabaseFile; + }; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class StarDatabaseFile + * \brief Point source and star catalog database files (XPSD format). + * + * This class implements fast access to point source data stored in XPSD files + * (Extensible Point Source Database format). It also implements serialization + * of new XPSD files from existing point source or star catalog data. + * + * On the PixInsight/PCL platform, the XPSD file format allows for fast and + * efficient access to large star catalogs, such as Gaia (as of writing this + * documentation the Gaia DR2 and EDR3 catalogs are available) or PPMXL. The + * XPSD format allows for serialization of general purpose star catalogs, with + * special emphasis on astrometric and photometric data. + * + * \ingroup point_source_databases + */ +class PCL_CLASS StarDatabaseFile : public XPSD +{ +public: + + /*! + * Default constructor. + * + * Constructs an invalid instance that cannot be used until initialized by + * calling the Open() member function. + */ + StarDatabaseFile() = default; + + /*! + * Constructs a &StarDatabaseFile instance initialized from the specified + * point source database file in XPSD format. + * + * In the event of errors or invalid data, this constructor will throw the + * appropriate Error exception. + */ + StarDatabaseFile( const String& filePath ) + { + Open( filePath ); + } + + /*! + * Move constructor. + */ + StarDatabaseFile( StarDatabaseFile&& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + StarDatabaseFile& operator =( StarDatabaseFile&& ) = default; + + /*! + * Deleted copy constructor. %StarDatabaseFile instances are unique, hence + * cannot be copied. + */ + StarDatabaseFile( const StarDatabaseFile& ) = delete; + + /*! + * Deleted copy assignment operator. %StarDatabaseFile instances are unique, + * hence cannot be copied. + */ + StarDatabaseFile& operator =( const StarDatabaseFile& ) = delete; + + /*! + * Virtual destructor. + */ + virtual ~StarDatabaseFile() noexcept( false ) + { + } + + /*! + * Initializes this object to provide access to the specified point source + * database file in XPSD format. + * + * This member function opens an existing file at the specified \a filePath, + * loads and parses its XML header, and loads the file indexes ready for + * fast access to point source data. The file will remain open until this + * object is destroyed, or until a new call to this function is made. + * + * If a previous file was already opened by this instance, it will be closed + * and all associated control and file indexing structures will be destroyed + * and deallocated, before accessing the new file. + */ + void Open( const String& filePath ); + + /*! + * Closes the point source database file represented by this object and + * resets all internal structures to a default, uninitialized state. + * + * If a previous file was already opened by this instance, it will be closed + * and all associated control and file indexing structures will be destroyed + * and deallocated. If no file is currently open, calling this member has no + * effect. + */ + void Close(); + + /*! + * Returns true iff this object has an open database file and is ready for + * point source data retrieval. + */ + bool IsOpen() const + { + return m_file.IsOpen(); + } + + /*! + * Returns the path of the point source database file represented by this + * object. Returned file paths are always absolute, full file paths. + */ + const String& FilePath() const + { + return m_file.FilePath(); + } + + /*! + * Returns the low limiting magnitude of this database file. All contained + * sources should have magnitudes greater than the value returned by this + * function. + */ + float MagnitudeLow() const + { + return m_magnitudeLow; + } + + /*! + * Returns the high limiting magnitude of this database file. All contained + * sources should have magnitudes less than or equal to the value returned + * by this function. + */ + float MagnitudeHigh() const + { + return m_magnitudeHigh; + } + + /*! + * Returns a reference to the (immutable) set of metadata items available in + * the point source database file loaded by this object. + */ + const XPSD::Metadata& Metadata() const + { + return m_metadata; + } + + /*! + * Returns a reference to the (immutable) set of statistical and structural + * information items available in the point source database file loaded by + * this object. + */ + const XPSD::Statistics& Statistics() const + { + return m_statistics; + } + + /*! + * Generates a file to store a point source database in XPSD format. + * + * \param filePath Path to the file that will be generated in the local + * filesystem. The file name should carry the '.xpsd' + * suffix. + * + * \param metadata Reference to an XPSD::Metadata structure with + * optional metadata information that will be included + * in the generated XPSD file. + * + * \param statistics Reference to an XPSD::Statistics structure with + * statistical and structural information about the + * XPSD database, which will be included in the + * generated XPSD file. + * + * \param magnitudeLow Low limiting magnitude. All point sources serialized + * in the \a data array should have magnitudes greater + * than the value of this parameter. + * + * \param magnitudeHigh High limiting magnitude. All point sources + * serialized in the \a data array should have + * magnitudes less than or equal to the value of this + * parameter. + * + * \param index Array of quadtree index structures. + * + * \param data Serialized point source data. + * + * \param compression Pointer to a Compression object used to compress + * point source data blocks (leaf node data), or + * nullptr if no compression has been applied. If + * specified, this object will be used exclusively to + * gather information about the compression algorithm + * and parameters used, \e not to compress any data. + * + * In the event of invalid, incongruent or malformed data, or if an I/O + * error occurs, this function will throw an Error exception. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + static void Serialize( const String& filePath, + const XPSD::Metadata& metadata, + const XPSD::Statistics& statistics, + float magnitudeLow, float magnitudeHigh, + const Array& index, + const ByteArray& data, + const Compression* compression = nullptr ); + +protected: + + mutable File m_file; + XPSD::Metadata m_metadata; + XPSD::Statistics m_statistics; + float m_magnitudeLow = 0; + float m_magnitudeHigh = 0; + Array m_index; + uint64 m_dataPosition = 0; + AutoPointer m_compression; + + virtual void LoadData( void* block, uint64 offset, uint32 size, void* ) const + { + m_file.SetPosition( m_dataPosition + offset ); + m_file.Read( block, size ); + } + + virtual void Uncompress( ByteArray& block, uint32 uncompressedSize, void* ) const + { + if ( m_compression ) + block = m_compression->Uncompress( block, uncompressedSize ); + } + + virtual void GetEncodedData( const ByteArray&, const XPSD::IndexTree&, const XPSD::IndexNode&, void* ) const = 0; + + friend class XPSD::IndexTree; +}; + +// ---------------------------------------------------------------------------- + +inline void +XPSD::IndexTree::SearchRecursive( uint32 nodeIndex, double ra, double dec, double r, void* searchData ) const +{ + const IndexNode& node = m_nodes[nodeIndex]; + if ( IntersectsNodeRegion( ra, dec, r, node ) ) + { + if ( node.IsLeaf() ) + { + ByteArray block( size_type( node.CompressedBlockSize() ) ); + m_parent->LoadData( block.Begin(), node.BlockOffset(), node.CompressedBlockSize(), searchData ); + if ( node.CompressedBlockSize() != node.BlockSize() ) + m_parent->Uncompress( block, node.BlockSize(), searchData ); + m_parent->GetEncodedData( block, *this, node, searchData ); + } + else + { + if ( node.index.child.nw != 0 ) + SearchRecursive( node.index.child.nw, ra, dec, r, searchData ); + if ( node.index.child.ne != 0 ) + SearchRecursive( node.index.child.ne, ra, dec, r, searchData ); + if ( node.index.child.sw != 0 ) + SearchRecursive( node.index.child.sw, ra, dec, r, searchData ); + if ( node.index.child.se != 0 ) + SearchRecursive( node.index.child.se, ra, dec, r, searchData ); + } + } +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_StarDatabaseFile_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StarDatabaseFile.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StarDetector.h b/3rdparty/include/pcl/StarDetector.h new file mode 100644 index 0000000..122c33b --- /dev/null +++ b/3rdparty/include/pcl/StarDetector.h @@ -0,0 +1,664 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StarDetector.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StarDetector_h +#define __PCL_StarDetector_h + +/// \file pcl/StarDetector.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class StarDetector + * \brief Automatic star detection + * \sa PSFFit, PSFSignalEstimator + */ +class PCL_CLASS StarDetector : public ParallelProcess +{ +public: + + /*! + * Represents a point spread function type. + */ + typedef PSFFit::psf_function psf_function; + + /*! + * \struct pcl::StarDetector::Star + * \brief Structure to hold the data of a detected star. + */ + struct Star + { + /*! + * The type of a coordinate used to represent star positions (barycenter + * or PSF centroid coordinates). + */ + typedef DPoint::component component; + + DPoint pos = 0.0; /*!< Star position in image coordinates. Corresponds to the centroid of + the fitted PSF when PSF fitting is enabled; to the barycenter + calculated by the star detection algorithm otherwise. */ + Rect rect = 0; //!< Detection region in pixels, image coordinates. + float flux = 0; //!< Total flux minus local background. + float signal = 0; /*!< Estimated mean signal over the local background within the PSF + fitting region. Nonzero only when PSF fitting is enabled. */ + float mad = 0; /*!< Robust average absolute deviation of the fitted PSF with respect + to sampled image data. */ + Star* ref = nullptr; //!< Referenced star, useful for cross-referencing applications. + + /*! + * Default constructor. + */ + Star() = default; + + /*! + * Constructs a new %Star object with the specified position \a p in + * image coordinates, total flux \a f, mean signal \a s and PSF average + * deviation \a m. + */ + Star( const DPoint& p, const Rect& r, float f = 0, float s = 0, float m = 0 ) + : pos( p ), rect( r ), flux( f ), signal( s ), mad( m ) + { + } + + /*! + * Copy constructor. + */ + Star( const Star& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + Star& operator =( const Star& ) = default; + + /*! + * Equality operator. Two stars are equal iff they are located at the + * same coordinates, i.e at the same barycenter or centroid position. + */ + bool operator ==( const Star& s ) const + { + return pos == s.pos; + } + + /*! + * Less-than relational operator. By default stars are sorted by + * brightness in descending order. Stars with larger flux values come + * first in a sorted list. + */ + bool operator <( const Star& s ) const + { + return flux > s.flux; + } + + /*! + * Array subscript operator for coordinate selection, compatible with + * pcl::QuadTree. + */ + component operator []( int i ) const + { + return pos[i]; + } + }; + + /*! + * A dynamic array of detected pcl::StarDetector::Star structures. + */ + typedef Array star_list; + + /*! + * Default constructor. + */ + StarDetector() = default; + + /*! + * Copy constructor. + */ + StarDetector( const StarDetector& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + StarDetector& operator =( const StarDetector& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~StarDetector() + { + } + + /*! + * Number of (dyadic) wavelet layers used for structure detection. + * + * This parameter determines the size in pixels of the largest image + * structures that can be detected. With more layers, larger stars (and + * perhaps also some nonstellar objects) will be detected. The default value + * is 5, which corresponds to structures in the scale of 32 pixels. + * + * \note Although the current star detection algorithm does not use a + * wavelet transform for structure detection, this parameter is still + * expressed as a number of dyadic wavelet layers for convenience and + * compatibility with existing implementations. + */ + int StructureLayers() const + { + return m_structureLayers; + } + + /*! + * Sets the number of wavelet layers used for structure detection. See + * StructureLayers() for a description of this parameter. + */ + void SetStructureLayers( int n ) + { + PCL_PRECONDITION( n > 0 && n <= 8 ) + m_structureLayers = Range( n, 1, 8 ); + } + + /*! + * Number of (dyadic) wavelet layers used for noise reduction. + * + * Noise reduction prevents detection of bright noise structures as false + * stars, including hot pixels and cosmic rays. This parameter can also be + * used to control the sizes of the smallest detected stars (increase it to + * exclude more stars), although the minimum structure size + * parameter can be more efficient for this purpose. The default value is 0, + * which effectively disables this noise reduction feature. + * + * \note Although the current star detection algorithm does not use a + * wavelet transform for structure detection, this parameter is still + * expressed as a number of dyadic wavelet layers for convenience and + * compatibility with existing implementations. + */ + int NoiseLayers() const + { + return m_noiseLayers; + } + + /*! + * Sets the number of wavelet layers used for noise reduction. See + * NoiseLayers() for a description of this parameter. + */ + void SetNoiseLayers( int n ) + { + PCL_PRECONDITION( n >= 0 && n <= 4 ) + m_noiseLayers = Range( n, 0, 4 ); + } + + /*! + * Size of the hot pixel removal filter. + * + * This is the radius in pixels of a median filter applied by the star + * detector before the structure detection phase. A median filter is very + * efficient to remove hot pixels. To disable hot pixel removal, set this + * parameter to zero. The default value is 1 pixel. + */ + int HotPixelFilterRadius() const + { + return m_hotPixelFilterRadius; + } + + /*! + * Sets the size of the hot pixel removal filter. See HotPixelFilterRadius() + * for a description of this parameter. + */ + void SetHotPixelFilterRadius( int n ) + { + PCL_PRECONDITION( n >= 0 && n <= 3 ) + m_hotPixelFilterRadius = Range( n, 0, 3 ); + } + + /*! + * Size of the noise reduction filter. + * + * This is the radius in pixels of a Gaussian convolution filter applied to + * the working image used for calculation of star positions during the star + * detection phase. Use it only for very low SNR images, where the star + * detector cannot find reliable stars with default parameters. + * + * Be aware that noise reduction will modify star profiles and hence the way + * star positions are calculated, resulting in a less accurate centroid + * determination. Under extreme low-SNR conditions, however, this is + * probably better than working with the actual data anyway. + * + * The default value is zero, which effectively disables this feature. + */ + int NoiseReductionFilterRadius() const + { + return m_noiseReductionFilterRadius; + } + + /*! + * Sets the size in pixels of the noise reduction filter. See + * NoiseReductionFilterRadius() for a description of this parameter. + */ + void SetNoiseReductionFilterRadius( int n ) + { + PCL_PRECONDITION( n >= 0 && n <= 64 ) + m_noiseReductionFilterRadius = Range( n, 0, 64 ); + } + + /*! + * Minimum size of a detectable star structure in square pixels. + * + * This parameter can be used to prevent detection of small and bright image + * artifacts as stars. This can be useful to work with uncalibrated or + * wrongly calibrated data, especially demosaiced CFA frames where hot + * pixels have generated large bright artifacts that cannot be removed with + * a median filter, poorly focused images, and images with poor tracking. + * + * The default value is zero, which effectively disables this feature. + */ + int MinStructureSize() const + { + return m_minStructureSize; + } + + /*! + * Sets the minimum size of a detectable star structure in square pixels. + * See MinStructureSize() for a description of this parameter. + */ + void SetMinStructureSize( int n ) + { + PCL_PRECONDITION( n >= 0 ) + m_minStructureSize = Max( 0, n ); + } + + /*! + * Star detection sensitivity. + * + * The sensitivity of the star detection algorithm is measured with respect + * to the local background of each detected star. Given a star with + * estimated brightness \e s and local background \e b, sensitivity is the + * minimum value of (\e s - \e b)/\e b necessary to trigger star detection. + * + * Decrease this value to favor detection of fainter stars. Increase it to + * restrict detection to brighter stars. The default value is 0.1. + */ + float Sensitivity() const + { + return m_sensitivity; + } + + /*! + * Sets the star detection sensitivity. See Sensitivity() for a description + * of this parameter. + */ + void SetSensitivity( float s ) + { + PCL_PRECONDITION( s >= 0.001 && s <= 1000 ) + m_sensitivity = Range( s, 0.001F, 1000.0F ); + } + + /*! + * Star peak response. + * + * If you decrease this value, stars will need to have stronger (or more + * prominent) peaks to be detected by the star detection algorithm. This is + * useful to prevent detection of saturated stars, as well as small + * nonstellar features. By increasing this parameter, the star detection + * algorithm will be more sensitive to \e peakedness, and hence more + * tolerant with relatively flat image features. The default value is 0.8. + */ + float PeakResponse() const + { + return m_peakResponse; + } + + /*! + * Sets the star peak response. See PeakResponse() for a description of this + * parameter. + */ + void SetPeakResponse( float r ) + { + PCL_PRECONDITION( r >= 0 && r <= 1 ) + m_peakResponse = Range( r, 0.0F, 1.0F ); + } + + /*! + * Maximum star distortion. + * + * Star distortion is measured with respect to a perfect square, whose + * distortion is 1. Lower values mean more distortion. The distortion of a + * perfectly circular star is about 0.8 (actually, π/4). Use this + * parameter, if necessary, to control inclusion of elongated stars, + * multiple stars, and nonstellar image features. The default value is 0.5. + */ + float MaxDistortion() const + { + return m_maxDistortion; + } + + /*! + * Sets the maximum star distortion. See MaxDistortion() for a description + * of this parameter. + */ + void SetMaxDistortion( float d ) + { + PCL_PRECONDITION( d >= 0 && d <= 1 ) + m_maxDistortion = Range( d, 0.0F, 1.0F ); + } + + /*! + * Upper star detection limit in the normalized [0,1] range. + * + * Stars with peak values larger than this value won't be detected. This can + * be useful to reject all stars brighter than a fixed level systematically. + * The default value is 1.0, which effectively disables this feature. + */ + float UpperLimit() const + { + return m_upperLimit; + } + + /*! + * Sets the upper star detection limit. See UpperLimit() for a description + * of this parameter. + */ + void SetUpperLimit( float u ) + { + PCL_PRECONDITION( u >= 0 && u <= 1 ) + m_upperLimit = Range( u, 0.0F, 1.0F ); + } + + /*! + * Returns true iff image inversion is enabled for this star detector. + * + * When inversion is enabled, the star detector algorithm will look for dark + * stars over a bright background. This feature is disabled by default. + */ + bool IsImageInversionEnabled() const + { + return m_invert; + } + + /*! + * Enables image inversion. See IsImageInversionEnabled() for a description + * of this parameter. + */ + void EnableImageInversion( bool enabled = true ) + { + m_invert = enabled; + } + + /*! + * Disables image inversion. See IsImageInversionEnabled() for a description + * of this parameter. + */ + void DisableImageInversion( bool disable = true ) + { + EnableImageInversion( !disable ); + } + + /*! + * Returns true iff PSF fitting is enabled for this star detector. + * + * When PSF fitting is enabled, a point spread function of the type + * specified by PSFType() will be fitted numerically for each detected star. + * The Levenberg-Marquardt non-linear least squares algorithm will be used + * to minimize the difference between the fitted function and the pixel + * sample values in the detection region. See the PSFFit class for complete + * information on our PSF fitting implementation. + * + * When PSF fitting is enabled, the \c pos data member of the + * pcl::StarDetector::Star corresponds to the centroid of the fitted PSF + * instead of the barycenter position calculated by the star detection + * algorithm, and the \c signal member is a robust estimate of the mean + * signal evaluated over the local background, also from the fitted PSF. + * + * PSF fitting is disabled by default. + */ + bool IsPSFFittingEnabled() const + { + return m_fitPSF; + } + + /*! + * Enables PSF fitting for this star detector. See IsPSFFittingEnabled() for + * a description of this parameter. + */ + void EnablePSFFitting( bool enable = true ) + { + m_fitPSF = enable; + } + + /*! + * Disables PSF fitting for this star detector. See IsPSFFittingEnabled() + * for a description of this parameter. + */ + void DisablePSFFitting( bool disable = true ) + { + EnablePSFFitting( !disable ); + } + + /*! + * Returns the type of point spread function (PSF) fitted numerically when + * PSF fitting is enabled. See IsPSFFittingEnabled() and the pcl::PSFunction + * namespace. + */ + psf_function PSFType() const + { + return m_psfType; + } + + /*! + * Sets the type of point spread function (PSF) fitted numerically when PSF + * fitting is enabled. See PSFType(). + */ + void SetPSFType( psf_function type ) + { + m_psfType = type; + } + + /*! + * Returns true if elliptical point spread functions (PSFs) will be fitted + * when PSF fitting is enabled. Returns false if circular functions will be + * fitted. Elliptical PSFs are disabled by default. + */ + bool IsEllipticPSF() const + { + return m_psfElliptic; + } + + /*! + * Enables elliptical PSF fits. See IsEllipticPSF(). + */ + void EnableEllipticPSF( bool enable = true ) + { + m_psfElliptic = enable; + } + + /*! + * Disables elliptical PSF fits. See IsEllipticPSF(). + */ + void DisableEllipticPSF( bool disable = true ) + { + EnableEllipticPSF( !disable ); + } + + /*! + * Returns the centroid tolerance in pixels. + * + * The centroid tolerance is the maximum allowed distance in pixels between + * a detected star position (or \e barycenter) and the centroid position of + * the corresponding fitted PSF. Stars where that distance is greater than + * the value returned by this function will be rejected and excluded for + * signal estimation. This allows preventing PSF fits departing too much + * from detected star coordinates, which enforces robustness and stability + * of the PSF fitting process. + * + * The default centroid tolerance is 1.5 pixels. + */ + float PSFCentroidTolerance() const + { + return m_psfCentroidTolerance; + } + + /*! + * Sets the centroid tolerance in pixels. See PSFCentroidTolerance() for a + * description of this parameter. + */ + void SetPSFCentroidTolerance( float t ) + { + PCL_PRECONDITION( t >= 0 ) + m_psfCentroidTolerance = Max( 0.0F, t ); + } + + /*! + * Returns a pointer to the current star detection mask image, or nullptr if + * no detection mask is being used. + * + * If a detection mask is used, star detection will only consider source + * pixels for which the corresponding mask pixels are nonzero. This allows + * for the implementation of partial star detection tasks limited to + * arbitrary regions of interest. + */ + const UInt8Image* DetectionMask() const + { + return m_mask; + } + + /*! + * Sets the detection \a mask image. See DetectionMask() for a description + * of this parameter. + * + * If the specified \a mask pointer is nullptr, no mask will be used in + * subsequent star detection tasks performed by this object. Otherwise, the + * specified \a mask image must have the same dimensions as the image(s) + * that will be specified for star detection, and must remain valid while + * this object performs star detection tasks. + */ + void SetDetectionMask( const UInt8Image* mask ) + { + if ( mask != nullptr ) + if ( mask->IsEmpty() ) + mask = nullptr; + m_mask = mask; + } + + /*! + * Performs star detection with the current parameters. Returns a dynamic + * array of Star structures sorted by brightness (flux) in descending order. + * + * \note This function is thread-safe. + */ + star_list DetectStars( const ImageVariant& image ) const; + + /*! + * Performs star detection with the current parameters. Returns a dynamic + * array of Star structures sorted by brightness (flux) in descending order. + * + * This operator is equivalent to the DetectStars( const ImageVariant& ) + * member function. + * + * \note This function is thread-safe. + */ + star_list operator()( const ImageVariant& image ) const + { + return DetectStars( image ); + } + + /*! + * Computes a binary map of star detection structures for the specified + * \a image and the current set of star detection parameters. + * + * Returns the star detection map as a new image. + */ + Image StructureMap( const ImageVariant& image ) const; + + /*! + * Isolates star detection structures for the specified \a image. + * + * Returns a new image which is the result of multiplying the specified + * \a image by the binarized structure map generated with the current star + * detection parameters. + */ + Image Structures( const ImageVariant& image ) const; + +protected: + + int m_structureLayers = 5; + int m_noiseLayers = 0; + int m_hotPixelFilterRadius = 1; + int m_noiseReductionFilterRadius = 0; + int m_minStructureSize = 0; + float m_sensitivity = 0.1F; + float m_peakResponse = 0.8F; + float m_maxDistortion = 0.5F; + float m_upperLimit = 1.0F; + bool m_invert = false; + bool m_fitPSF = false; + psf_function m_psfType = PSFunction::Gaussian; + bool m_psfElliptic = false; + float m_psfCentroidTolerance = 1.5F; + const UInt8Image* m_mask = nullptr; + +private: + + star_list DetectStars( Image& image ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_StarDetector_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StarDetector.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StatusMonitor.h b/3rdparty/include/pcl/StatusMonitor.h new file mode 100644 index 0000000..3f7a482 --- /dev/null +++ b/3rdparty/include/pcl/StatusMonitor.h @@ -0,0 +1,619 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StatusMonitor.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StatusMonitor_h +#define __PCL_StatusMonitor_h + +/// \file pcl/StatusMonitor.h + +#include + +#include +#include +#include + +namespace pcl +{ + +class PCL_CLASS StatusMonitor; + +// ---------------------------------------------------------------------------- + +/*! + * \class StatusCallback + * \brief Provides status monitoring callback functions. + * + * %StatusCallback is an abstract base class providing a set of pure virtual + * functions that must be reimplemented in derived classes. These virtual + * functions must provide feedback to the user as part of the status + * monitoring of a process. + * + * Status monitoring consists of a set of PCL classes and functions to provide + * feedback and progress information about ongoing processes. Each instance of + * a %StatusCallback subclass is directly managed by a status monitor + * object. A status monitor object is an instance of the StatusMonitor class. + * + * Status monitors provide a generalized mechanism to generate progress + * information while a process is running. A %StatusCallback subclass receives + * that progress information and provides feedback to the user, controlling the + * information provided, its format and its appearance. + * + * The best example of %StatusCallback subclass is the StandardStatus class. + * StandardStatus reimplements %StatusCallback's pure virtual functions to show + * processing progress information on the processing console of the current + * processing thread. + * + * \sa StatusMonitor, StandardStatus, SpinStatus, ProgressBarStatus, + * MuteStatus, Console, Thread + */ +class PCL_CLASS StatusCallback +{ +public: + + /*! + * Constructs a default %StatusCallback object. + */ + StatusCallback() = default; + + /*! + * Copy constructor. + */ + StatusCallback( const StatusCallback& ) = default; + + /*! + * Move constructor. + */ + StatusCallback( StatusCallback&& ) = default; + + /*! + * Destroys this %StatusCallback instance. + */ + virtual ~StatusCallback() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + StatusCallback& operator =( const StatusCallback& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + StatusCallback& operator =( StatusCallback&& ) = default; + + /*! + * This function is called by a status \a monitor object when a new + * monitored process is about to start. + * + * The progress total count can be obtained by calling + * StatusMonitor::Total() for the passed \a monitor object. Similarly, the + * progress information string is given by StatusMonitor::Info(). + * + * This function must return zero if the process can continue. If this + * function returns a nonzero value, the new process is aborted by throwing + * a ProcessAborted exception. + */ + virtual int Initialized( const StatusMonitor& monitor ) const = 0; + + /*! + * Function called by a status \a monitor object to signal an update of the + * progress count for the current process. + * + * The progress count can be obtained by calling + * StatusMonitor::Count() for the passed \a monitor object. Similarly, the + * total count is given by StatusMonitor::Total(). + * + * This function is called repeatedly at regular time intervals until the + * progress count reaches the total count, or until the process is aborted. + * + * This function must return zero if the process can continue. If this + * function returns a nonzero value, the current process is aborted by + * throwing a ProcessAborted exception. + */ + virtual int Updated( const StatusMonitor& monitor ) const = 0; + + /*! + * Function called by a status \a monitor object to signal that the current + * process has finished. + * + * When this function is invoked by the status \a monitor, its progress + * count has already reached its total count. + * + * This function must return zero if the process can continue. If this + * function returns a nonzero value, the current process is aborted by + * throwing a ProcessAborted exception. + * + * \note This function allows aborting a process even when it has + * finished. This makes sense, since after a process has finished, the + * PixInsight core application still has some important work to do: update + * the target view's processing history, organize temporary swap files, send + * notifications, update masking relations, etc. + */ + virtual int Completed( const StatusMonitor& monitor ) const = 0; + + /*! + * Function called by a status \a monitor object when the progress + * information for the current process has been changed. + * + * The progress information is a string that can be obtained by + * calling StatusMonitor::Info() for the passed \a monitor object. + */ + virtual void InfoUpdated( const StatusMonitor& monitor ) const = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class StatusMonitor + * \brief An asynchronous status monitoring system. + * + * Status monitoring consists of a set of PCL classes and functions to manage + * progress information about ongoing processes. A status monitor is + * an instance of the %StatusMonitor class. + * + * Status monitors provide a generalized mechanism to generate and manage + * progress information while a process is running. A status monitor sends + * progress \e events to an instance of a StatusCallback subclass, whose + * primary responsibility is to provide feedback to the user. Progress feedback + * typically consists of a running percentage or similar text-based information + * written to the standard console. + * + * Along with providing progress feedback, the status monitoring concept is + * quite flexible and has other control applications in PCL, some of them quite + * sophisticated. For example, many standard tools use specialized status + * monitors to implement their real-time preview routines as asynchronously + * interruptible processes. + * + * %StatusMonitor utilizes a low-priority timing thread to generate callback + * monitoring calls asynchronously at constant time intervals. This has + * virtually zero impact on the performance of the monitored processes. + * + * \sa StatusCallback, StandardStatus, SpinStatus, MuteStatus, Console, Thread + */ +class PCL_CLASS StatusMonitor +{ +public: + + /*! + * Constructs a default %StatusMonitor object. + */ + StatusMonitor() = default; + + /*! + * Constructs a %StatusMonitor object as a duplicate of an existing + * instance. + */ + StatusMonitor( const StatusMonitor& x ) + { + Assign( x ); + } + + /*! + * Destroys this %StatusMonitor object. + */ + virtual ~StatusMonitor() + { + Clear(); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + StatusMonitor& operator =( const StatusMonitor& x ) + { + if ( this != &x ) + Assign( x ); + return *this; + } + + /*! + * Initializes this status monitor to start a new monitoring procedure. + * + * \param info Progress information. + * + * \param count Total progress count. If a zero total progress count is + * specified, this monitor will be unbounded. That + * means that the monitor will never reach a completed state + * by increasing or incrementing it. To complete an unbounded + * status monitor, the Complete() member function must be + * called explicitly. + * + * If this monitor has an associated status callback object, this function + * will call the StatusCallback::Initialized() virtual member function of + * the associated callback object. + * + * If this function is invoked while an ongoing monitoring procedure is + * active, it is interrupted and a new monitoring procedure is initialized. + */ + void Initialize( const String& info, size_type count = 0 ); + + /*! + * Increments the initialization disabling counter for this status monitor. + * + * When the disabling counter is greater than zero, initialization is + * disabled for this monitor, and subsequent calls to the Initialize() + * member function have no effect. + * + * This is useful if your process calls other subroutines that try to + * initialize private monitoring procedures. If such subroutines are called + * as independent processes, they can perform initialization, but if they + * are used as part of a higher level process, they should update a common + * status monitor without reinitializing it. + * + * Here is an example: + * + * \code + * FunctionA( StatusMonitor& m ) + * { + * if ( m.IsInitializationEnabled() ) + * m.Initialize( "This is function A...", 100 ); + * // ... + * for ( int i = 0; i < 100; ++i, ++m ) + * // ... + * } + * + * FunctionB( StatusMonitor& m ) + * { + * if ( m.IsInitializationEnabled() ) + * m.Initialize( "This is function B...", 100 ); + * // ... + * for ( int i = 0; i < 10; ++i, m += 10 ) + * // ... + * } + * + * ALargerFunction( StatusMonitor& m ) + * { + * m.Initialize( "This is some high-level routine...", 200 ); + * m.DisableInitialization(); + * // ... + * FunctionA( m ); + * FunctionB( m ); + * // ... + * m.EnableInitialization(); + * } + * \endcode + * + * In this example, both FunctionA() and FunctionB() update a %StatusMonitor + * object by a total count of 100 steps. However, these functions don't try + * to initialize the passed monitor if initialization has been disabled. + * + * ALargerFunction() initializes a status monitor with a total count of 200 + * and its own information string, then disables monitor initialization. The + * subsequent calls to FunctionA() and FunctionB() will update the monitor + * by 100 steps each, without reinitializing it. + * + * The final call to EnableInitialization() in ALargerFunction() is + * necessary to return the status monitor to its initial enabled or disabled + * state. + */ + void DisableInitialization() + { + ++m_initDisableCount; + } + + /*! + * Decrements the initialization disabling counter for this status monitor. + * + * When the disabling counter is equal or less than zero, initialization is + * enabled for this monitor. + * + * See DisableInitialization() for further information on the initialization + * enabled/disabled states and a source code example. + */ + void EnableInitialization() + { + --m_initDisableCount; + } + + /*! + * Returns true iff monitor initialization has been disabled for this status + * monitor object. + * + * See DisableInitialization() for further information on the initialization + * enabled/disabled states and a source code example. + */ + bool IsInitializationEnabled() const + { + return m_initDisableCount <= 0; + } + + /*! + * Returns true iff this status monitor has been initialized. + * + * A status monitor is initialized by a call to its Initialize() member + * function. + */ + bool IsInitialized() const + { + return m_initialized; + } + + /*! + * Returns true iff this status monitor has completed a monitoring procedure. + * + * A monitoring procedure is completed if the current monitoring counter + * reaches the total count, or if the Complete() member function is called. + */ + bool IsCompleted() const + { + return m_completed; + } + + /*! + * Returns true iff a monitoring procedure has been aborted. + * + * When a monitoring procedure is aborted, the status monitor object throws + * a ProcessAborted exception. + * + * A monitoring procedure can only be aborted by its associated status + * callback object. This is done by returning a nonzero value from the + * StatusCallback::Initialized(), StatusCallback::Updated(), or + * StatusCallback::Completed() virtual member functions implemented by + * a StatusCallback descendant class. + */ + bool IsAborted() const + { + return m_aborted; + } + + /*! + * Changes the progress information text for this status monitor. + * + * If there is a status callback object associated with this monitor, its + * StatusCallback::InfoUpdated() member function is invoked. + */ + void SetInfo( const String& s ) + { + m_info = s; + if ( m_callback != nullptr ) + m_callback->InfoUpdated( *this ); + } + + /*! + * Increments the progress counter of this status monitor. + * + * If the progress counter reaches Total(), and this monitor has an + * associated status callback object, its StatusCallback::Completed() member + * function is invoked. If the progress counter is less than Total(), the + * StatusCallback::Updated() member function will be invoked by the + * monitoring thread asynchronously. + * + * Note that for \e unbounded monitors the completed state is never reached + * unless a explicit call to Complete() is made, hence the + * StatusCallback::Completed() member function of the status callback + * object, if any, will never be called by this increment operator. + */ + void operator ++() + { + if ( ++m_count == m_total || m_needsUpdate ) + Update(); + } + + /*! + * Increments the progress counter of this status monitor by the specified + * number \a n of progress steps. + * + * This function behaves essentially like the operator ++() function. + */ + void operator +=( size_type n ) + { + m_count += n; + if ( m_total != 0 ) // if not an unbounded monitor + if ( m_count > m_total ) + m_count = m_total; + if ( m_needsUpdate || m_count == m_total ) + Update(); + } + + /*! + * Forces this monitor to complete the current monitoring procedure, by + * assigning the total progress count to the progress counter. + * + * This function forces a call to StatusCallback::Completed(), if this + * monitor has an associated status callback object. + */ + void Complete() + { + m_count = m_total; + Update(); + } + + /*! + * Returns the address of the immutable status callback object associated + * with this status monitor. Returns zero if this monitor has no associated + * status callback object. + */ + const StatusCallback* Callback() const + { + return m_callback; + } + + /*! + * Returns the address of the status callback object associated with this + * status monitor. Returns zero if this monitor has no associated status + * callback object. + */ + StatusCallback* Callback() + { + return m_callback; + } + + /*! + * Associates a status callback object with this status monitor. + * + * Calling this function forces a call to Clear(), which interrupts the + * current monitoring procedure, if any, and reinitializes the internal + * state of this monitor. + * + * To associate no status callback object with this monitor, pass \c nullptr + * as the argument to this function. + */ + void SetCallback( StatusCallback* callback ) + { + Reset(); + m_callback = callback; + } + + /*! + * Returns the last status callback return value. + * + * The returned value is the return value of the last call to + * StatusCallback::Initialized(), StatusCallback::Updated() or + * StatusCallback::Completed() for the associated status callback object, or + * zero if no status callback object has been associated with this monitor. + * + * If a nonzero value is returned, then the current monitoring procedure has + * already been aborted. + */ + int ReturnValue() const + { + return m_retVal; + } + + /*! + * Returns the progress information string that has been set for this status + * monitor object. + */ + String Info() const + { + return m_info; + } + + /*! + * Returns the progress counter for the current monitoring procedure. + * + * When the progress counter reaches the total count, the monitoring + * procedure has been completed. + */ + size_type Count() const + { + return m_count; + } + + /*! + * Returns the total progress count for the current monitoring procedure. + * + * When the progress counter reaches the total count, the monitoring + * procedure has been completed. + */ + size_type Total() const + { + return m_total; + } + + /*! + * Interrupts the current monitoring procedure, if any, and reinitializes + * the internal state of this status monitor. + */ + void Clear() + { + Reset(); + } + + /*! + * Returns the progress monitoring refresh rate in milliseconds. + * + * The StatusCallback::Updated() member functions of all active status + * callback objects are called asynchronously by a low-priority thread. The + * refresh rate is the interval between successive callback update calls. It + * can be in the range from 25 to 999 milliseconds. + */ + static unsigned RefreshRate() + { + return s_msRefreshRate; + } + + /*! + * Sets a new progress monitoring refresh rate in milliseconds. + * + * \param ms New monitoring refresh rate in milliseconds. The specified + * value must be between 25 and 999 milliseconds. If the passed + * value is outside that range, it is discarded and the nearest + * valid bound is set. + * + * The default refresh rate is 250 milliseconds, or 4 monitoring events per + * second. The new refresh rate does take effect immediately, even if there + * are active status monitors. + */ + static void SetRefreshRate( unsigned ms ); + +private: + + StatusCallback* m_callback = nullptr; + bool m_initialized = false; + bool m_completed = false; + bool m_aborted = false; + bool m_needsUpdate = false; // thread-safe flag set by the dispatcher + int m_initDisableCount = 0; + int m_retVal = 0; + String m_info; + size_type m_total = 0; + size_type m_count = 0; + + static unsigned s_msRefreshRate; + + void Reset(); + void Assign( const StatusMonitor& ); + void Update(); + + friend class PCL_CLASS AutoStatusCallbackRestorer; + friend class MonitorDispatcherThread; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_StatusMonitor_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StatusMonitor.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/String.h b/3rdparty/include/pcl/String.h new file mode 100644 index 0000000..10eef7b --- /dev/null +++ b/3rdparty/include/pcl/String.h @@ -0,0 +1,13714 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/String.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_String_h +#define __PCL_String_h + +/// \file pcl/String.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef __PCL_ALIGNED_STRING_ALLOCATION +# include +# define PCL_STRING_ALLOCATOR AlignedAllocator +#else +# include +# define PCL_STRING_ALLOCATOR StandardAllocator +#endif + +#ifndef __PCL_NO_STRING_COMPLEX +# include +#endif + +#ifndef __PCL_NO_STRING_OSTREAM +# ifndef _MSC_VER +# define _GLIBCXX_USE_WCHAR_T 1 +# endif +# include +#endif + +#ifdef __PCL_QT_INTERFACE +# include +# include +# include +# define PCL_GET_CHARPTR_FROM_QSTRING( qs ) (qs.toLatin1().data()) +# define PCL_GET_CHAR16PTR_FROM_QSTRING( qs ) ((char16_type*)( qs.utf16() )) +# define PCL_GET_QSTRING_FROM_CHAR16PTR( s ) (QString::fromUtf16( (const ushort*)(s) )) +# define PCL_GET_CHARPTR_FROM_QBYTEARRAY( qb ) (qb.data()) +# define PCL_QDATE_FMT_STR "yyyy/MM/dd" +# define PCL_QDATETIME_FMT_STR "yyyy/MM/dd hh:mm:ss" +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::RandomizationOption + * \brief String randomization options + * + * + * + * + * + * + * + * + * + * + * + *
RandomizationOption::Lowercase Generate random lowercase alphabetic characters: [a..z]
RandomizationOption::Uppercase Generate random uppercase alphabetic characters: [A..Z]
RandomizationOption::Alpha Generate random lowercase and uppercase alphabetic characters: [a..zA..Z]
RandomizationOption::Digits Generate random decimal digits: [0..9]
RandomizationOption::Symbols Generate random symbol characters: .#/[]() etc.
RandomizationOption::HexDigits Generate random hexadecimal digits: [0..9a..f], or [0..9A..F] if Uppercase is set.
RandomizationOption::BinDigits Generate random binary digits: [01].
RandomizationOption::FullRange Generate random characters in the whole range of code points except zero.
RandomizationOption::Default Default options: Alpha|Digits
+ */ +namespace RandomizationOption +{ + enum mask_type + { + Lowercase = 0x00000001, // Generate random lowercase alphabetic characters: a..z + Uppercase = 0x00000002, // Generate random uppercase alphabetic characters: A..Z + Alpha = Lowercase|Uppercase, // Generate random alphabetic characters: a..zA..Z + Digits = 0x00000004, // Generate random decimal digits: 0..9 + Symbols = 0x00000008, // Generate random symbol characters: .#/[]() etc + HexDigits = 0x00000010, // Generate hexadecimal digits: 0..9a..f or 0..9A..F + BinDigits = 0x00000020, // Generate binary digits: 0 and 1 + FullRange = 0x80000000, // Generate random characters in the whole range of code points except zero + Default = Alpha|Digits + }; +}; + +/*! + * \class pcl::RandomizationOptions + * \brief A collection of string randomization options. + */ +typedef Flags RandomizationOptions; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup sexagesimal_conversion Sexagesimal String Representation and Parsing + */ + +/*! + * \struct SexagesimalConversionOptions + * \brief Formatting options for string sexagesimal representations. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * AngleConversionOptions, LongitudeConversionOptions, RAConversionOptions, + * LatitudeConversionOptions, DecConversionOptions + */ +struct PCL_CLASS SexagesimalConversionOptions +{ + /*! + * Number of represented items. Can be 1, 2 or 3. All items but the last one + * are represented as integer values. The last item is represented as a + * floating point value with the specified precision. The default value is + * three items. + */ + unsigned items : 2; + + /*! + * Number of decimal digits for the last represented sexagesimal item. The + * default value is two decimal digits. + */ + unsigned precision : 4; + + /*! + * Whether to always prepend a sign character to the first represented item, + * even '+' for positive values. This is false by default. + */ + bool sign : 1; + + /*! + * Width of the integer part of the first represented item in characters, + * including the sign when applicable. When the specified width is larger + * than the length of the represented item, it is left-padded with padding + * characters as necessary. The default is zero, which means that no padding + * is performed for the first item by default. + */ + unsigned width : 4; + + /*! + * A single character used for separation of sexagesimal components. The + * default separator is a colon character, ':'. + */ + char separator; + + /*! + * A single character used for padding right-justified representations of + * first sexagesimal components. See the width member. The default padding + * character is the white space, ' '. + */ + char padding; + + /*! + * Default constructor. + */ + constexpr SexagesimalConversionOptions( unsigned items_ = 3, + unsigned precision_ = 2, + bool sign_ = false, + unsigned width_ = 0, + char separator_ = ':', + char padding_ = ' ' ) + : items( items_ ) + , precision( precision_ ) + , sign( sign_ ) + , width( width_ ) + , separator( separator_ ) + , padding( padding_ ) + { + } + + /*! + * Copy constructor. + */ + SexagesimalConversionOptions( const SexagesimalConversionOptions& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SexagesimalConversionOptions& operator =( const SexagesimalConversionOptions& ) = default; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct AngleConversionOptions + * \brief A set of options specific for string representations of angles. + * + * This is a convenience structure to ease string representations of angles in + * the range [0°,360°) as degrees, minutes and seconds of arc. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * SexagesimalConversionOptions, LongitudeConversionOptions, + * RAConversionOptions, LatitudeConversionOptions, DecConversionOptions + */ +struct PCL_CLASS AngleConversionOptions : public SexagesimalConversionOptions +{ + /*! + * Constructs an %AngleConversionOptions structure initialized for the + * specified \a precision and first item \a width and \a padding character. + * The string representation will consist of three items separated by + * spaces. If \a width is nonzero, the first item will be represented + * right-justified within a field of \a width \a padding characters. + */ + constexpr AngleConversionOptions( unsigned precision = 2, unsigned width = 3, char padding = ' ' ) + : SexagesimalConversionOptions( 3/*items*/, precision, false/*sign*/, width, ' '/*separator*/, padding ) + {} +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct LongitudeConversionOptions + * \brief A set of options specific for string representations of longitude + * angles. + * + * This is a convenience structure to ease string representations of angles in + * the range [-180°,+180°] as degrees, minutes and seconds of arc. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * SexagesimalConversionOptions, AngleConversionOptions, RAConversionOptions, + * LatitudeConversionOptions, DecConversionOptions + */ +struct PCL_CLASS LongitudeConversionOptions : public SexagesimalConversionOptions +{ + /*! + * Constructs a %LongitudeConversionOptions structure initialized for the + * specified \a precision and first item \a width and \a padding character. + * The string representation will consist of three items separated by + * spaces. If \a width is nonzero, the first item will be represented + * right-justified within a field of \a width \a padding characters, + * including a leading sign character. + */ + constexpr LongitudeConversionOptions( unsigned precision = 2, unsigned width = 4, char padding = ' ' ) + : SexagesimalConversionOptions( 3/*items*/, precision, true/*sign*/, width, ' '/*separator*/, padding ) + {} +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct RAConversionOptions + * \brief A set of options specific for string representations of right + * ascensions. + * + * This is a convenience structure to ease string representations of hour + * angles in the range [0h,24h) as hours, minutes and + * seconds. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * SexagesimalConversionOptions, AngleConversionOptions, + * LongitudeConversionOptions, LatitudeConversionOptions, DecConversionOptions + */ +struct PCL_CLASS RAConversionOptions : public SexagesimalConversionOptions +{ + /*! + * Constructs a %RAConversionOptions structure initialized for the specified + * \a precision and first item \a width and \a padding character. The string + * representation will consist of three items separated by spaces. If + * \a width is nonzero, the first item will be represented right-justified + * within a field of \a width \a padding characters. + */ + constexpr RAConversionOptions( unsigned precision = 3, unsigned width = 2, char padding = ' ' ) + : SexagesimalConversionOptions( 3/*items*/, precision, false/*sign*/, width, ' '/*separator*/, padding ) + {} +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct LatitudeConversionOptions + * \brief A set of options specific for string representations of latitude + * angles. + * + * This is a convenience structure to ease string representations of angles in + * the range [-90°,+90°] as degrees, minutes and seconds of arc. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * SexagesimalConversionOptions, AngleConversionOptions, + * LongitudeConversionOptions, RAConversionOptions, DecConversionOptions + */ +struct PCL_CLASS LatitudeConversionOptions : public SexagesimalConversionOptions +{ + /*! + * Constructs a %LatitudeConversionOptions structure initialized for the + * specified \a precision and first item \a width and \a padding character. + * The string representation will consist of three items separated by + * spaces. If \a width is nonzero, the first item will be represented + * right-justified within a field of \a width \a padding characters, + * including a leading sign character. + */ + constexpr LatitudeConversionOptions( unsigned precision = 2, unsigned width = 3, char padding = ' ' ) + : SexagesimalConversionOptions( 3/*items*/, precision, true/*sign*/, width, ' '/*separator*/, padding ) + {} +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct DecConversionOptions + * \brief A set of options specific for string representations of declination + * angles. + * + * This structure is a convenience alias of LatitudeConversionOptions. + * + * \ingroup sexagesimal_conversion + * \sa IsoString::ToSexagesimal(), String::ToSexagesimal(), + * SexagesimalConversionOptions, AngleConversionOptions, + * LongitudeConversionOptions, RAConversionOptions, LatitudeConversionOptions + */ +struct PCL_CLASS DecConversionOptions : public LatitudeConversionOptions +{ + /*! + * Constructs a %DecConversionOptions structure initialized for the + * specified \a precision and first item \a width and \a padding character. + * The string representation will consist of three items separated by + * spaces. If \a width is nonzero, the first item will be represented + * right-justified within a field of \a width \a padding characters, + * including a leading sign character. + */ + constexpr DecConversionOptions( unsigned precision = 2, unsigned width = 3, char padding = ' ' ) + : LatitudeConversionOptions( precision, width, padding ) + {} +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct ISO8601ConversionOptions + * \brief Formatting options for string representations of dates and times in + * ISO 8601 format. + * + * \sa IsoString::ToISO8601DateTime(), String::ToISO8601DateTime() + */ +struct PCL_CLASS ISO8601ConversionOptions +{ + /*! + * Number of represented time items. Can be 0, 1, 2 or 3. All items but the + * last one are represented as integer values. The last item is represented + * as a floating point value with the specified precision. The default value + * is three time items. + */ + unsigned timeItems : 2; + + /*! + * Number of decimal digits for the last represented time item. The default + * value is three decimal digits. + */ + unsigned precision : 4; + + /*! + * Whether to append a time zone specifier to the ISO 8601 representation. + * The default value is true. + */ + bool timeZone : 1; + + /*! + * Whether to append the 'Z' special time zone specifier for UTC time, or + * the '+00:00' specifier otherwise. The default value is true. + */ + bool zuluTime : 1; + + /*! + * Default constructor. + */ + constexpr ISO8601ConversionOptions( unsigned timeItems_ = 3, + unsigned precision_ = 3, + bool timeZone_ = true, + bool zuluTime_ = true ) + : timeItems( timeItems_ ) + , precision( precision_ ) + , timeZone( timeZone_ ) + , zuluTime( zuluTime_ ) + { + } + + /*! + * Copy constructor. + */ + ISO8601ConversionOptions( const ISO8601ConversionOptions& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + ISO8601ConversionOptions& operator =( const ISO8601ConversionOptions& ) = default; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericString + * \brief Generic character string. + * + * %GenericString is a finite, ordered sequence of characters implemented as a + * reference-counted, dynamic array of objects of type T, whose fundamental + * behavior is specified by an instantiation type R of GenericCharTraits for + * the character type T (typically GenericCharTraits, or a derived class such + * as CharTraits or IsoCharTraits), and where the type A provides dynamic + * allocation for contiguous sequences of elements of type T (StandardAllocator + * is used by default). + * + * On the PixInsight platform, all dynamically allocated strings have been + * implemented as two instantiations of the %GenericString template class, + * namely the String (UTF-16 string) and IsoString (UTF-8 or ISO/IEC-8859-1 + * string) classes. + * + * \sa String, IsoString, CharTraits, IsoCharTraits + */ +template +class PCL_CLASS GenericString : public DirectContainer +{ +public: + + /*! + * Represents a string character. + */ + typedef T char_type; + + /*! + * The character traits class used by this string class. + */ + typedef R char_traits; + + /*! + * The block allocator used by this string class. + */ + typedef A block_allocator; + + /*! + * The allocator class used by this string class. + */ + typedef pcl::Allocator allocator; + + /*! + * Null-terminated string of char_type characters. + */ + typedef T* c_string; + + /*! + * Immutable null-terminated string of char_type characters. + */ + typedef const T* const_c_string; + + /*! + * String iterator. + */ + typedef T* iterator; + + /*! + * Immutable string iterator. + */ + typedef const T* const_iterator; + + /*! + * Reverse string iterator. + */ + typedef ReverseRandomAccessIterator + reverse_iterator; + + /*! + * Reverse immutable string iterator. + */ + typedef ReverseRandomAccessIterator + const_reverse_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constant used to signal unsuccessful search operations. + */ + static const size_type notFound = ~size_type( 0 ); + + /*! + * Corresponds to the maximum possible character index in a string. + */ + static const size_type maxPos = ~size_type( 0 ); + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty string. + */ + GenericString() + { + m_data = Data::New(); + } + + /*! + * Copy constructor. Increments the reference counter of the string \a s. + */ + GenericString( const GenericString& s ) + : m_data( s.m_data ) + { + m_data->Attach(); + } + + /*! + * Move constructor. + */ + GenericString( GenericString&& s ) + : m_data( s.m_data ) + { + s.m_data = nullptr; + } + + /*! + * Constructs a string with a copy of the null-terminated character sequence + * stored in the specified array \a t. + */ + GenericString( const_c_string t ) + { + size_type len = R::Length( t ); + if ( len > 0 ) + { + m_data = Data::New( len ); + R::Copy( m_data->string, t, len ); + } + else + m_data = Data::New(); + } + + /*! + * Constructs a string with a copy of the character sequence defined by the + * range [i,j). + * + * If \a i is greater than or equal to \a j, this constructor creates an + * empty string. Otherwise it will assign the specified sequence of + * characters. + * + * \b Important - Note that this constructor is \e not equivalent to: + * + * \code GenericString( i, 0, j-i ); \endcode + * + * because the above call would assign a null-terminated sequence, while + * this function assigns the specified range unconditionally, even if it + * contains null characters. Since this constructor does not have to scan + * for a terminating character, it is potentially more efficient. + */ + GenericString( const_iterator i, const_iterator j ) + { + if ( i < j ) + { + size_type len = j - i; + m_data = Data::New( len ); + R::Copy( m_data->string, i, len ); + } + else + m_data = Data::New(); + } + + /*! + * Constructs a string and initializes it with characters taken from the + * specified initializer list \a l. + * + * This constructor is equivalent to: + * + * \code GenericString( l.begin(), l.end() ) \endcode + */ + GenericString( std::initializer_list l ) + : GenericString( l.begin(), l.end() ) + { + } + + /*! + * Constructs a string with a copy of at most \a n characters stored in the + * null-terminated sequence \a t, starting from its \a i-th character. + */ + GenericString( const_c_string t, size_type i, size_type n ) + { + size_type len = R::Length( t ); + if ( i < len && (n = pcl::Min( n, len-i )) > 0 ) + { + m_data = Data::New( n ); + R::Copy( m_data->string, t+i, n ); + } + else + m_data = Data::New(); + } + + /*! + * Constructs a string with \a n copies of a character \a c. + */ + GenericString( char_type c, size_type n = 1 ) + { + if ( n > 0 ) + { + m_data = Data::New( n ); + R::Fill( m_data->string, c, n ); + } + else + m_data = Data::New(); + } + + /*! + * Destroys this string. Decrements the reference counter of the string data + * and, if it becomes unreferenced, it is destroyed and deallocated. + */ + ~GenericString() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Returns true iff this string uniquely references its string data. + * + * \sa EnsureUnique(), IsAliasOf() + */ + bool IsUnique() const noexcept + { + return m_data->IsUnique(); + } + + /*! + * Returns true iff this string is an alias of another string \a s. + * + * Two strings are aliases if both share the same string data. + * + * \sa IsUnique(), EnsureUnique() + */ + bool IsAliasOf( const GenericString& s ) const noexcept + { + return m_data == s.m_data; + } + + /*! + * Ensures that this string uniquely references its string data. + * + * If necessary, this member function generates a duplicate of the string + * data, references it, and then decrements the reference counter of the + * original string data. + * + * \sa IsUnique(), IsAliasOf() + */ + void EnsureUnique() + { + if ( !IsUnique() ) + { + size_type len = Length(); + Data* newData = Data::New( len ); + if ( len > 0 ) + R::Copy( newData->string, m_data->string, len ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the number of bytes necessary to store a single character in this + * string. + * + * This member function returns the R::BytesPerChar() static member function + * of the char traits class R. + */ + static size_type BytesPerChar() noexcept + { + return R::BytesPerChar(); + } + + /*! + * Returns the total number of bytes required to store the string data + * referenced by this string, \e excluding the terminating null character. + * + * \sa Length(), Capacity() + */ + size_type Size() const noexcept + { + return Length()*BytesPerChar(); + } + + /*! + * Returns the length of this string in characters. This \e excludes the + * terminating null character. + * + * \sa IsEmpty(), Available(), Capacity(), Size() + */ + size_type Length() const noexcept + { + return m_data->end - m_data->string; + } + + /*! + * Returns the total capacity of this string in characters. + * + * The capacity of a string is the maximum number of characters that can be + * stored before requiring a reallocation of string data. + * + * \sa Available(), Length(), Size() + */ + size_type Capacity() const noexcept + { + return m_data->capacity - m_data->string; + } + + /*! + * Returns the number of characters available in this string. + * + * The number of available characters is equal to Capacity() - Length(). + * + * \sa Capacity(), Length(), Size() + */ + size_type Available() const noexcept + { + return m_data->capacity - m_data->end; + } + + /*! + * Returns true only if this string is valid. A string is valid if it + * references an internal string structure, even if it is an empty string. + * + * In general, all %GenericString objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other strings. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid string object cannot be used and should be destroyed + * immediately. Invalid strings are always destroyed automatically during + * move construction and move assignment operations. + * + * \sa IsEmpty() + */ + bool IsValid() const noexcept + { + return m_data != nullptr; + } + + /*! + * Returns true only if this string is empty. + * + * An empty string has zero length and stores no characters. + * + * \sa IsValid(), Length(), Available(), Capacity(), Size() + */ + bool IsEmpty() const noexcept + { + return m_data->string == m_data->end; + } + + /*! + * Returns the minimum valid character index. + * + * This member function exists for compatibility with PCL containers. It + * always returns zero. + * + * \sa UpperBound(), Length() + */ + size_type LowerBound() const noexcept + { + return 0; + } + + /*! + * Returns the maximum valid character index. + * + * The returned value is equal to Length()-1. If this string is empty, the + * index returned by this member function is invalid and equal to maxPos. + * + * \sa LowerBound(), Length() + */ + size_type UpperBound() const noexcept + { + PCL_PRECONDITION( !IsEmpty() ) + return Length()-1; + } + + /*! + * Returns a reference to the (immutable) allocator object in this string. + * + * \sa SetAllocator() + */ + const allocator& Allocator() const noexcept + { + return m_data->alloc; + } + + /*! + * Sets the allocator object used by this string to a copy of the specified + * allocator \a a. + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * \sa Allocator() + */ + void SetAllocator( const allocator& a ) + { + EnsureUnique(); + m_data->alloc = a; + } + + /*! + * Returns an iterator located at the \a i-th character of this string. + * The character index \a i must be in the range [0,Length()). + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, or if the specified index \a i is out of range, + * calling this member function is an error that leads to an invalid result. + * + * \sa operator []( size_type ) + */ + iterator At( size_type i ) + { + PCL_PRECONDITION( i < Length() ) + EnsureUnique(); + return m_data->string + i; + } + + /*! + * Returns an immutable iterator located at the \a i-th character in this + * string. The character index \a i must be in the range [0,Length()). + * + * If this string is empty, or if the specified index \a i is out of range, + * calling this member function is an error that leads to an invalid result. + * + * \sa operator []( size_type ) const + */ + const_iterator At( size_type i ) const noexcept + { + PCL_PRECONDITION( i < Length() ) + return m_data->string + i; + } + + /*! + * Returns a reference to the \a i-th character in this string. The + * character index \a i must be in the range [0,Length()). + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, or if the specified index \a i is out of range, + * calling this member function is an error that leads to an invalid result. + * + * \sa At(), operator *() + */ + char_type& operator []( size_type i ) + { + return *At( i ); + } + + /*! + * Returns a copy of the \a i-th character in this string. The character + * index \a i must be in the range [0,Length()). + * + * If this string is empty, or if the specified index \a i is out of range, + * calling this member function is an error that leads to an invalid result. + * + * \sa At() const, operator *() const + */ + char_type operator []( size_type i ) const noexcept + { + return *At( i ); + } + + /*! + * Returns a reference to the first character in this string. + * + * This is a convenience member function, equivalent to *At( 0 ). + * + * \sa operator []( size_type ), At() + */ + char_type& operator *() + { + EnsureUnique(); + return *m_data->string; + } + + /*! + * Returns a copy of the first character in this string. + * + * This is a convenience member function, equivalent to *At( 0 ). + * + * \sa operator []( size_type ) const, At() + */ + char_type operator *() const noexcept + { + return *m_data->string; + } + + /*! + * Returns a mutable iterator pointing to the first character of this + * string. + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, this member function returns \c nullptr. + * + * \sa End() + */ + iterator Begin() + { + EnsureUnique(); + return m_data->string; + } + + /*! + * Returns an immutable iterator pointing to the first character of this + * string. + * + * If this string is empty, this member function returns \c nullptr. + * + * \sa End() const + */ + const_iterator Begin() const noexcept + { + return m_data->string; + } + + /*! + * Returns a mutable iterator pointing to the end of this string. The + * returned iterator points to the next-to-last character of this string. + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, this member function returns \c nullptr. + * + * \sa Begin() + */ + iterator End() + { + EnsureUnique(); + return m_data->end; + } + + /*! + * Returns an immutable iterator pointing to the end of this string. The + * returned iterator points to the next-to-last character of this string. + * + * If this string is empty, this member function returns \c nullptr. + * + * \sa Begin() const + */ + const_iterator End() const noexcept + { + return m_data->end; + } + + /*! + * Returns a reverse mutable iterator pointing to the reverse + * beginning of this string. The returned iterator points to the last + * character of this string. + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, this member function returns a null reverse + * iterator. + * + * \sa ReverseEnd() + */ + reverse_iterator ReverseBegin() + { + EnsureUnique(); + return (m_data->string < m_data->end) ? m_data->end-1 : nullptr; + } + + /*! + * Returns an immutable reverse iterator pointing to the reverse + * beginning of this string. The returned iterator points to the last + * character of this string. + * + * If this string is empty, this member function returns a null reverse + * iterator. + * + * \sa ReverseEnd() const + */ + const_reverse_iterator ReverseBegin() const noexcept + { + return (m_data->string < m_data->end) ? m_data->end-1 : nullptr; + } + + /*! + * Returns a reverse mutable iterator pointing to the reverse end + * of this string. The returned iterator points to the + * previous-to-first character of this string. + * + * If this string is not unique, it is made unique before returning from + * this member function. + * + * If this string is empty, this member function returns a null reverse + * iterator. + * + * \sa ReverseBegin() + */ + reverse_iterator ReverseEnd() + { + EnsureUnique(); + return (m_data->string < m_data->end) ? m_data->string-1 : nullptr; + } + + /*! + * Returns an immutable reverse iterator pointing to the reverse + * end of this string. The returned iterator points to the + * previous-to-first character of this string. + * + * If this string is empty, this member function returns a null reverse + * iterator. + * + * \sa ReverseBegin() const + */ + const_reverse_iterator ReverseEnd() const noexcept + { + return (m_data->string < m_data->end) ? m_data->string-1 : nullptr; + } + + /*! + * Returns the zero-based character index corresponding to a valid iterator + * \a i in this string. This is equivalent to \a i - Begin(). + * + * The specified iterator must be posterior to or located at the starting + * iterator of this string, as returned by Begin(). However, for performance + * reasons this condition is neither enforced nor verified. If an invalid + * iterator is specified, then this function, as well as any subsequent use + * of the returned character index, may invoke undefined behavior. + */ + size_type IndexAt( const_iterator i ) const noexcept + { + PCL_PRECONDITION( i >= m_data->string ) + return i - m_data->string; + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const noexcept + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const noexcept + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Returns a pointer to the immutable internal data array of this string. + * + * If this string is empty, this member function returns a pointer to a + * static, null-terminated, unmodifiable empty string (the "" C string). + * This function always returns a valid pointer to existing character data. + */ + const_c_string c_str() const noexcept + { + static const char_type theNullChar = char_traits::Null(); + return IsEmpty() ? &theNullChar : Begin(); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * This operator calls Assign() with the specified source string \a s. + */ + GenericString& operator =( const GenericString& s ) + { + Assign( s ); + return *this; + } + + /*! + * Assigns a string \a s to this string. + * + * If this instance and the specified source instance \a s reference + * different string data, then the data previously referenced by this object + * is dereferenced. If the previous data becomes unreferenced, it is + * destroyed and deallocated. Then the data being referenced by \a s is also + * referenced by this object. + * + * If this instance and the specified source instance \a s already reference + * the same string data, then this function does nothing. + * + * \sa Transfer() + */ + void Assign( const GenericString& s ) + { + s.m_data->Attach(); + DetachFromData(); + m_data = s.m_data; + } + + /*! + * Move assignment operator. Returns a reference to this object. + * + * This operator calls Transfer() with the specified source string \a s. + */ + GenericString& operator =( GenericString&& s ) + { + Transfer( s ); + return *this; + } + + /*! + * Transfers data from another object \a s to this string. + * + * Decrements the reference counter of the current string data. If the data + * becomes unreferenced, it is destroyed and deallocated. The string data + * referenced by the source object \a s is then transferred to this object. + * + * \warning The source string \a s will be an invalid object after calling + * this function, and hence should be destroyed immediately. Any attempt to + * access an invalid object will most likely lead to a crash. + * + * \sa Assign() + */ + void Transfer( GenericString& s ) + { + DetachFromData(); + m_data = s.m_data; + s.m_data = nullptr; + } + + /*! + * Transfers data from another object \a s to this string. + * + * See Transfer( GenericString& ) for detailed information. + */ + void Transfer( GenericString&& s ) + { + DetachFromData(); + m_data = s.m_data; + s.m_data = nullptr; + } + + /*! + * Assigns a copy of the null-terminated character sequence stored in the + * specified array \a t to this string. Returns a reference to this object. + */ + GenericString& operator =( const_c_string t ) + { + Assign( t ); + return *this; + } + + /*! + * Assigns a single character \a c to this string. Returns a reference to + * this object. + */ + GenericString& operator =( char_type c ) + { + Assign( c, 1 ); + return *this; + } + + /*! + * Assigns a substring of at most \a n characters from a source string \a s, + * starting from its \a i-th character, to this string. + */ + void Assign( const GenericString& s, size_type i, size_type n ) + { + Transfer( s.Substring( i, n ) ); + } + + /*! + * Assigns a copy of the null-terminated character sequence stored in the + * specified array \a t to this string. + * + * If \a t is a pointer to the contents of this string (or, equivalently, an + * iterator on this string), this function invokes undefined behavior. + */ + void Assign( const_c_string t ) + { + size_type len = R::Length( t ); + if ( len > 0 ) + { + MaybeReallocate( len ); + R::Copy( m_data->string, t, len ); + } + else + Clear(); + } + + /*! + * Assigns a copy of the character sequence defined by the range [i,j) to + * this string. + * + * If \a i is greater than or equal to \a j, this function empties the string + * by calling Clear(). Otherwise this function will assign the specified + * sequence of characters. + * + * If \a i and/or \a j are iterators on this string, this function invokes + * undefined behavior. + * + * \b Important - Note that this function is \e not equivalent to: + * + * \code Assign( i, 0, j-i ); \endcode + * + * because the above call would assign a null-terminated sequence, while + * this function assigns the specified range unconditionally, even if it + * contains null characters. Since this function does not have to scan for + * a terminating character, it is potentially much more efficient. + */ + void Assign( const_iterator i, const_iterator j ) + { + if ( i < j ) + { + size_type len = j - i; + MaybeReallocate( len ); + R::Copy( m_data->string, i, len ); + } + else + Clear(); + } + + /*! + * Assigns a sequence of characters defined by the specified initializer + * list \a l to this string. This function is equivalent to: + * + * \code Assign( l.begin(), l.end() ) \endcode + */ + void Assign( std::initializer_list l ) + { + Assign( l.begin(), l.end() ); + } + + /*! + * Assigns a copy of at most \a n characters stored in the null-terminated + * sequence \a t, starting from its \a i-th character, to this string. + * + * If \a t is the null pointer, or \a i is greater than the length of \a t, + * or \a n is zero, this function empties the string by calling Clear(). + * + * If \a t is a pointer to the contents of this string (or, equivalently, an + * iterator on this string), this function invokes undefined behavior. + * + * The character count \a n will be constrained to copy existing characters + * from the null-terminated source sequence. + */ + void Assign( const_c_string t, size_type i, size_type n ) + { + size_type len = R::Length( t ); + if ( i < len && (n = pcl::Min( n, len-i )) > 0 ) + { + MaybeReallocate( n ); + R::Copy( m_data->string, t+i, n ); + } + else + Clear(); + } + + /*! + * Assigns \a n copies of the specified character \a c to this string. If + * either \a c is the null character or \a n is zero, this function empties + * the string by calling Clear(). + */ + void Assign( char_type c, size_type n = 1 ) + { + if ( !R::IsNull( c ) && n > 0 ) + { + MaybeReallocate( n ); + R::Fill( m_data->string, c, n ); + } + else + Clear(); + } + + /*! + * Exchanges this string with another string \a s. + */ + void Swap( GenericString& s ) noexcept + { + pcl::Swap( m_data, s.m_data ); + } + + /*! + * Fills this string (if not empty) with the specified character \a c. + * + * \note The null terminating character can legally be specified as a + * filling character with this function. In this case the internal string + * pointer will be seen as an empty string by C library routines (such as + * strlen or strcpy) and other applications after calling this function, + * although it will continue storing the same allocated data block. + */ + void Fill( char_type c ) + { + size_type len = Length(); + if ( len > 0 ) + { + if ( !IsUnique() ) + { + Data* newData = Data::New( len ); + DetachFromData(); + m_data = newData; + } + R::Fill( m_data->string, c, len ); + } + } + + /*! + * Fills a segment of at most \a n contiguous characters in this string with + * the specified character \a c, starting from the \a i-th character. + * + * If \a i is greater than or equal to the length of this string, then + * calling this function has no effect. Otherwise the character count \a n + * will be constrained to replace existing characters in this string. + * + * \note The null terminating character can legally be specified as a + * filling character with this function. In this case the internal string + * pointer will be seen as an empty string by C library routines (such as + * strlen or strcpy) and other applications after calling this function, + * although it will continue storing the same allocated data block. + */ + void Fill( char_type c, size_type i, size_type n = maxPos ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n < len ) + EnsureUnique(); + else if ( !IsUnique() ) + { + Data* newData = Data::New( len ); + DetachFromData(); + m_data = newData; + } + R::Fill( m_data->string+i, c, n ); + } + } + + /*! + * Securely fills this string and all instances sharing its string data with + * the specified character \a c. + * + * If no filling character \a c is specified, the string will be filled with + * zeros, or null characters. + * + * The normal data sharing mechanism is ignored on purpose by this function, + * so if there are other objects sharing the same string data, all of them + * will be affected unconditionally after calling this function. + * + * This function is useful to ensure that sensitive data, such as user + * passwords and user names, are destroyed without the risk of surviving + * duplicates as a result of implicit data sharing. + * + * \note If the specified filling character \a c is zero, or the null + * character (the default value), the internal string pointer will be seen + * as an empty string by C library routines (such as strlen or strcpy) and + * other applications after calling this function, although it will continue + * storing the same allocated data block. + */ + void SecureFill( char c = '\0' ) noexcept + { + volatile char* s = reinterpret_cast( m_data->string ); + for ( size_type n = Capacity()*sizeof( char_type ); n > 0; --n ) + *s++ = c; + } + + /*! + * Ensures that this string has enough capacity to store \a n characters + * plus a terminating null character. + * + * After calling this member function with \a n > 0, this object is + * guaranteed to uniquely reference its string data. + */ + void Reserve( size_type n ) + { + if ( n > 0 ) + if ( IsUnique() ) + { + if ( Capacity() < n+1 ) + { + iterator old = m_data->string; + size_type len = Length(); + m_data->Reserve( len, n ); + if ( old != nullptr ) + { + if ( len > 0 ) + R::Copy( m_data->string, old, len ); + m_data->alloc.Deallocate( old ); + } + } + } + else + { + size_type len = Length(); + Data* newData = Data::New(); // ### FIXME: unlikely, but this is a potential leak + newData->Reserve( len, pcl::Max( len, n ) ); + if ( len > 0 ) + R::Copy( newData->string, m_data->string, len ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Causes this string to have the specified length \a n in characters. + * + * If \a n is zero, this function calls Clear() to empty the string. + * Otherwise the string data will be shrunk or extended, and possibly + * reallocated. If the resulting string is larger than the original, newly + * allocated or reserved characters won't be initialized and will have + * unpredictable values; in this case it is the caller's responsibility to + * write them as appropriate. + * + * After calling this member function, this object is guaranteed to uniquely + * reference its string data. + */ + void SetLength( size_type n ) + { + if ( n != Length() ) + { + if ( n > 0 ) + { + if ( !IsUnique() || m_data->ShouldReallocate( n ) ) + { + Data* newData = Data::New( n ); + size_type m = Capacity(); + if ( m > 0 ) + R::Copy( newData->string, m_data->string, pcl::Min( n, m ) ); + DetachFromData(); + m_data = newData; + } + else + m_data->SetLength( n ); + } + else + Clear(); + } + else + EnsureUnique(); + } + + /*! + * Returns a copy of this string resized to have the specified length \a n + * in characters. This function is a wrapper for SetLength(); see that + * function for important information. + */ + GenericString SetToLength( size_type n ) const + { + // NB: This can be done more efficiently if this string is unique. + GenericString s( *this ); + s.SetLength( n ); + return s; + } + + /*! + * Resizes this string to match the length of the internal null-terminated + * string buffer. + * + * This member function scans the internal string buffer for a terminating + * null character, then calls SetLength() to set the corresponding length in + * characters. + */ + void ResizeToNullTerminated() + { + SetLength( R::Length( m_data->string ) ); + } + + /*! + * Returns a copy of this string resized to match the length of its internal + * null-terminated string buffer. + */ + GenericString ResizedToNullTerminated() const + { + GenericString s( *this ); + s.ResizeToNullTerminated(); + return s; + } + + /*! + * Causes this string to allocate the exact required memory space to store + * its contained characters, plus a terminating null character. + * + * If the string has excess capacity, a new copy of its existing characters + * is generated and stored in a newly allocated memory block that fits them + * exactly, then the previous memory block is deallocated. + * + * If the string is empty, calling this function is equivalent to Clear(). + * Note that in this case a previously allocated memory block (by a call to + * Reserve()) may also be deallocated. + */ + void Squeeze() + { + if ( Available() > 0 ) + { + size_type len = Length(); + if ( len > 0 ) + { + if ( IsUnique() ) + { + iterator old = m_data->string; + m_data->Allocate( len, 0 ); + R::Copy( m_data->string, old, len ); + m_data->alloc.Deallocate( old ); + } + else + { + Data* newData = Data::New( len, 0 ); + R::Copy( newData->string, m_data->string, len ); + DetachFromData(); + m_data = newData; + } + } + else + Clear(); + } + } + + /*! + * Returns a copy of this string allocated to the exact required memory + * space to store its contained characters and a terminating null character. + */ + GenericString Squeezed() const + { + // NB: This can be done more efficiently if this string is unique. + GenericString s( *this ); + s.Squeeze(); + return s; + } + + /*! + * Releases the data in this string. + * + * This member function returns a pointer to the string data block + * referenced by this object, after ensuring that it is uniquely referenced. + * If the string is empty, this function may return the null pointer. + * + * Before returning, this member function empties this string without + * deallocating its string data. The caller is then responsible for + * destructing and/or deallocating the returned block when it is no longer + * required. + */ + c_string Release() + { + EnsureUnique(); + iterator string = m_data->string; + m_data->Reset(); + return string; + } + + /*! + * Copies characters from this string to a null-terminated character array. + * + * \param[out] dst Destination character array. + * + * \param maxCharsToCopy The total number of characters that can be stored + * at the \a dst array, \e including a null terminating + * character. + * + * \param i Index of the first character to be copied from this + * string. + * + * This function copies at most \a maxCharsToCopy-1 characters from this + * string (or Length()-i, whichever is less) to the \a dst array. Then a + * null terminating character is appended to \a dst. + */ + void c_copy( iterator dst, size_type maxCharsToCopy, size_type i = 0 ) const noexcept + { + if ( dst != nullptr ) + if ( maxCharsToCopy > 0 ) + { + if ( --maxCharsToCopy > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + size_type n = pcl::Min( maxCharsToCopy, len-i ); + R::Copy( dst, m_data->string+i, n ); + dst += n; + } + } + + *dst = R::Null(); + } + } + + /*! + * Inserts a copy of the string \a s at the index \a i in this string. + */ + template + void Insert( size_type i, const GenericString& s ) + { + size_type n = s.Length(); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + R::Copy( m_data->string+i, s.m_data->string, n ); + } + } + + /*! + * Inserts a copy of the character sequence defined by the range [p,q) at + * the index \a i in this string. + * + * If \a p is greater than or equal to \a q, calling this member function + * has no effect. + */ + void Insert( size_type i, const_iterator p, const_iterator q ) + { + if ( p < q ) + { + size_type n = q - p; + UninitializedGrow( i, n ); // -> 0 <= i <= len + R::Copy( m_data->string+i, p, n ); + } + } + + /*! + * Inserts a null-terminated character sequence \a t at the index \a i in + * this string. + */ + void Insert( size_type i, const_c_string t ) + { + size_type n = R::Length( t ); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + R::Copy( m_data->string+i, t, n ); + } + } + + /*! + * Inserts at most the first \a n characters of a null-terminated character + * sequence \a t at the index \a i in this string. + */ + void Insert( size_type i, const_c_string t, size_type n ) + { + if ( (n = pcl::Min( n, R::Length( t ) )) > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + R::Copy( m_data->string+i, t, n ); + } + } + + /*! + * Inserts \a n copies of a character \a c at the index \a i in this string. + */ + void Insert( size_type i, char_type c, size_type n = 1 ) + { + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + R::Fill( m_data->string+i, c, n ); + } + } + + /*! + * Appends a copy of the specified string \a s to this string. + */ + template + void Append( const GenericString& s ) + { + Insert( maxPos, s ); + } + + /*! + * Appends a copy of a string by calling Append( s ). Returns a reference to + * this object. + */ + template + GenericString& operator +=( const GenericString& s ) + { + Append( s ); + return *this; + } + + /*! + * Appends a copy of the character sequence defined by the range [i,j) to + * this string. + * + * If \a i is greater than or equal to \a j, calling this member function + * has no effect. + */ + void Append( const_iterator i, const_iterator j ) + { + Insert( maxPos, i, j ); + } + + /*! + * Appends a copy of the first \a n characters of a null-terminated + * character sequence \a t to this string. + */ + void Append( const_c_string t, size_type n ) + { + Insert( maxPos, t, n ); + } + + /*! + * Appends a copy of a null-terminated character sequence to this string. + */ + void Append( const_c_string t ) + { + Insert( maxPos, t ); + } + + /*! + * Appends a copy of a null-terminated string by calling Append( t ). + * Returns a reference to this object. + */ + GenericString& operator +=( const_c_string t ) + { + Append( t ); + return *this; + } + + /*! + * Appends \a n copies of a character \a c to this string. + */ + void Append( char_type c, size_type n = 1 ) + { + Insert( maxPos, c, n ); + } + + /*! + * A synonym for Append( const GenericString& ), provided for compatibility + * with PCL container classes. + */ + template + void Add( const GenericString& s ) + { + Append( s ); + } + + /*! + * A synonym for Append( const_iterator, const_iterator ), provided for + * compatibility with PCL container classes. + */ + void Add( const_iterator i, const_iterator j ) + { + Append( i, j ); + } + + /*! + * A synonym for Append( const_c_string, size_type ), provided for compatibility + * with PCL container classes. + */ + void Add( const_c_string t, size_type n ) + { + Append( t, n ); + } + + /*! + * A synonym for Append( const_c_string ), provided for compatibility with PCL + * container classes. + */ + void Add( const_c_string t ) + { + Append( t ); + } + + /*! + * A synonym for Append( char_type, size_type ), provided for compatibility with PCL + * container classes. + */ + void Add( char_type c, size_type n = 1 ) + { + Append( c, n ); + } + + /*! + * Appends a copy of the specified character \a c to this string. Returns a + * reference to this object. + */ + GenericString& operator +=( char_type c ) + { + Append( c ); + return *this; + } + + /*! + * Inserts a copy of the specified string \a s at the beginning of this + * string. + */ + template + void Prepend( const GenericString& s ) + { + Insert( 0, s ); + } + + /*! + * Inserts a copy of a string \a s at the beginning of this string. Returns + * a reference to this object. + */ + template + GenericString& operator -=( const GenericString& s ) + { + Prepend( s ); + return *this; + } + + /*! + * Inserts a copy of the character sequence defined by the range [i,j) at + * the beginning of this string. + * + * If \a i is greater than or equal to \a j, calling this member function + * has no effect. + */ + void Prepend( const_iterator i, const_iterator j ) + { + Insert( 0, i, j ); + } + + /*! + * Inserts a copy of the first \a n characters of a character array \a t at + * the beginning of this string. + */ + void Prepend( const_c_string t, size_type n ) + { + Insert( 0, t, n ); + } + + /*! + * Inserts a copy of the null-terminated character sequence \a t at the + * beginning of this string. + */ + void Prepend( const_c_string t ) + { + Insert( 0, t ); + } + + /*! + * Inserts a copy of the null-terminated sequence \a t at the beginning of + * this string. Returns a reference to this object. + */ + GenericString& operator -=( const_c_string t ) + { + Prepend( t ); + return *this; + } + + /*! + * Inserts \a n copies of a character \a c at the beginning of this string. + */ + void Prepend( char_type c, size_type n = 1 ) + { + Insert( 0, c, n ); + } + + /*! + * Inserts a copy of the specified character \a c at the beginning of this + * string. Returns a reference to this object. + */ + GenericString& operator -=( char_type c ) + { + Prepend( c ); + return *this; + } + + /*! + * Replaces a segment of \a n contiguous characters, starting at the \a i-th + * character in this string, with a copy of a string \a s. + */ + template + void Replace( size_type i, size_type n, const GenericString& s ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n != len ) + { + size_type ns = s.Length(); + if ( ns > 0 ) + { + if ( n < ns ) + UninitializedGrow( i, ns-n ); + else if ( ns < n ) + Delete( i, n-ns ); + else + EnsureUnique(); + + R::Copy( m_data->string+i, s.m_data->string, ns ); + } + else + Delete( i, n ); + } + else + Assign( s ); + } + } + } + + /*! + * Replaces a segment of at most \a n contiguous characters, starting at the + * \a i-th character in this string, with a copy of a null-terminated + * sequence \a t. + * + * If \a t is a pointer to the contents of this string (or, equivalently, an + * iterator on this string), this function invokes undefined behavior. + */ + void Replace( size_type i, size_type n, const_c_string t ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n != len ) + { + size_type nt = R::Length( t ); + if ( nt > 0 ) + { + if ( n < nt ) + UninitializedGrow( i, nt-n ); + else if ( nt < n ) + Delete( i, n-nt ); + else + EnsureUnique(); + + R::Copy( m_data->string+i, t, nt ); + } + else + Delete( i, n ); + } + else + Assign( t ); + } + } + } + + /*! + * Replaces a segment of at most \a n contiguous characters, starting at the + * \a i-th character in this string, with \a nc copies of a character \a c. + */ + void Replace( size_type i, size_type n, char_type c, size_type nc = 1 ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n != len ) + { + if ( nc > 0 ) + { + if ( n < nc ) + UninitializedGrow( i, nc-n ); + else if ( nc < n ) + Delete( i, n-nc ); + else + EnsureUnique(); + + R::Fill( m_data->string+i, c, nc ); + } + else + Delete( i, n ); + } + else + Assign( c, nc ); + } + } + } + + /*! + * Replaces all occurrences of a character \a c1 with \a c2 in a segment of + * \a n contiguous characters starting at the \a i-th character in this + * string. + */ + void ReplaceChar( char_type c1, char_type c2, size_type i = 0, size_type n = maxPos ) + { + ReplaceChar( c1, c2, i, n, true/*case*/ ); + } + + /*! + * Replaces all occurrences of a character \a c1 with \a c2 in a segment of + * \a n contiguous characters starting at the \a i-th character in this + * string. + * + * This member function performs case-insensitive character comparisons. + */ + void ReplaceCharIC( char_type c1, char_type c2, size_type i = 0, size_type n = maxPos ) + { + ReplaceChar( c1, c2, i, n, false/*case*/ ); + } + + /*! + * Replaces all occurrences of a string \a s1 with \a s2 in a segment of + * contiguous characters starting at the \a i-th character, and spanning to + * the end of this string. + */ + template + void ReplaceString( const GenericString& s1, + const GenericString& s2, size_type i = 0 ) + { + ReplaceString( s1.m_data->string, s1.Length(), s2.m_data->string, s2.Length(), i, true/*case*/ ); + } + + /*! + * Replaces all occurrences of a null-terminated string \a t1 with \a t2 in + * a segment of contiguous characters starting at the \a i-th character, and + * spanning to the end of this string. + */ + void ReplaceString( const_c_string t1, const_c_string t2, size_type i = 0 ) + { + ReplaceString( t1, R::Length( t1 ), t2, R::Length( t2 ), i, true/*case*/ ); + } + + /*! + * Replaces all occurrences of a string \a s1 with \a s2 in a segment of + * contiguous characters starting at the \a i-th character, and spanning to + * the end of this string. + * + * This member function performs case-insensitive string comparisons. + */ + template + void ReplaceStringIC( const GenericString& s1, + const GenericString& s2, size_type i = 0 ) + { + ReplaceString( s1.m_data->string, s1.Length(), s2.m_data->string, s2.Length(), i, false/*case*/ ); + } + + /*! + * Replaces all occurrences of a null-terminated string \a t1 with \a t2 in + * a segment of contiguous characters starting at the \a i-th character, and + * spanning to the end of this string. + * + * This member function performs case-insensitive string comparisons. + */ + void ReplaceStringIC( const_c_string t1, const_c_string t2, size_type i = 0 ) + { + ReplaceString( t1, R::Length( t1 ), t2, R::Length( t2 ), i, false/*case*/ ); + } + + /*! + * Deletes a contiguous segment of at most \a n characters starting at the + * \a i-th character in this string. + */ + void Delete( size_type i, size_type n = 1 ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n < len ) + { + size_type newLen = len-n; + if ( !IsUnique() || m_data->ShouldReallocate( newLen ) ) + { + Data* newData = Data::New( newLen ); + if ( i > 0 ) + R::Copy( newData->string, m_data->string, i ); + if ( i < newLen ) + R::Copy( newData->string+i, m_data->string+i+n, newLen-i ); + DetachFromData(); + m_data = newData; + } + else + { + if ( i < newLen ) + R::CopyOverlapped( m_data->string+i, m_data->string+i+n, newLen-i ); + m_data->SetLength( newLen ); + } + } + else + Clear(); + } + } + } + + /*! + * Deletes a segment of contiguous characters starting from the \a i-th + * character and spanning to the end of this string. + */ + void DeleteRight( size_type i ) + { + Delete( i, maxPos ); + } + + /*! + * Deletes the initial segment of at most \a i contiguous characters in this + * string. + */ + void DeleteLeft( size_type i ) + { + Delete( 0, i ); + } + + /*! + * Deletes all occurrences of the \a c character in a segment of contiguous + * characters starting from the \a i-th character and spanning to the end of + * this string. + */ + void DeleteChar( char_type c, size_type i = 0 ) + { + ReplaceString( &c, 1, nullptr, 0, i, true/*case*/ ); + } + + /*! + * Deletes all occurrences of the \a c character in a segment of contiguous + * characters starting from the \a i-th character and spanning to the end of + * this string. + * + * This member function performs case-insensitive character comparisons. + */ + void DeleteCharIC( char_type c, size_type i = 0 ) + { + ReplaceString( &c, 1, nullptr, 0, i, false/*case*/ ); + } + + /*! + * Deletes all occurrences of a string \a s in a segment of contiguous + * characters starting from the \a i-th character and spanning to the end of + * this string. + */ + template + void DeleteString( const GenericString& s, size_type i = 0 ) + { + ReplaceString( s.m_data->string, s.Length(), nullptr, 0, i, true/*case*/ ); + } + + /*! + * Deletes all occurrences of a null-terminated string \a s in a segment of + * contiguous characters starting from the \a i-th character and spanning to + * the end of this string. + */ + void DeleteString( const_c_string t, size_type i = 0 ) + { + ReplaceString( t, R::Length( t ), nullptr, 0, i, true/*case*/ ); + } + + /*! + * Deletes all occurrences of a string \a s in a segment of contiguous + * characters starting from the \a i-th character and spanning to the end of + * this string. + * + * This member function performs case-insensitive string comparisons. + */ + template + void DeleteStringIC( const GenericString& s, size_type i = 0 ) + { + ReplaceString( s.m_data->string, s.Length(), nullptr, 0, i, false/*case*/ ); + } + + /*! + * Deletes all occurrences of a null-terminated string \a s in a segment of + * contiguous characters starting from the \a i-th character and spanning to + * the end of this string. + * + * This member function performs case-insensitive string comparisons. + */ + void DeleteStringIC( const_c_string t, size_type i = 0 ) + { + ReplaceString( t, R::Length( t ), nullptr, 0, i, false/*case*/ ); + } + + /*! + * Removes all characters in this string, yielding an empty string. + * + * If this string is empty, then calling this member function has no effect. + * + * If this string uniquely references its string data, it is destroyed and + * deallocated; otherwise its reference counter is decremented. Then a new, + * empty string data structure is created and uniquely referenced. + */ + void Clear() + { + if ( !IsEmpty() ) + if ( IsUnique() ) + m_data->Deallocate(); + else + { + Data* newData = Data::New(); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns a string with a copy of at most \a n contiguous characters + * starting at the \a i-th character in this string. + */ + GenericString Substring( size_type i, size_type n = maxPos ) const + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n > 0 ) + { + if ( n < len ) + { + GenericString t; + t.m_data->Allocate( n ); + R::Copy( t.m_data->string, m_data->string+i, n ); + return t; + } + return *this; + } + } + return GenericString(); + } + + /*! + * Returns a string with a copy of the at most \a n contiguous initial + * characters of this string. + */ + GenericString Left( size_type n ) const + { + size_type len = Length(); + n = pcl::Min( n, len ); + if ( n > 0 ) + { + if ( n < len ) + { + GenericString t; + t.m_data->Allocate( n ); + R::Copy( t.m_data->string, m_data->string, n ); + return t; + } + return *this; + } + return GenericString(); + } + + /*! + * Returns a string with a copy of the at most \a n contiguous ending + * characters of this string. + */ + GenericString Right( size_type n ) const + { + size_type len = Length(); + n = pcl::Min( n, len ); + if ( n > 0 ) + { + if ( n < len ) + { + GenericString t; + t.m_data->Allocate( n ); + R::Copy( t.m_data->string, m_data->string+len-n, n ); + return t; + } + return *this; + } + return GenericString(); + } + + /*! + * Returns the suffix of this string starting at index \a i. Calling this + * member function is equivalent to: + * + * \code Right( Length()-i ) \endcode + */ + GenericString Suffix( size_type i ) const + { + return Substring( i ); + } + + /*! + * Returns the prefix of this string ending at index \a i. Calling this + * member function is equivalent to: + * + * \code Left( i-1 ) \endcode + */ + GenericString Prefix( size_type i ) const + { + return Left( (i > 0) ? i-1 : 0 ); + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a StringList. + * + * \param s The token separator string. + * + * \param trim True to \e trim the extracted tokens. If this parameter is + * true, existing leading and trailing whitespace characters + * will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type Break( C& list, const GenericString& s, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + size_type n = s.Length(); + if ( n > 0 ) + for ( SearchEngine S( s.m_data->string, n, true/*case*/ ); ; ) + { + size_type j = S( m_data->string, i, len ); + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + n; + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a + * StringList. + * + * \param s The token separator null-terminated string. + * + * \param trim True to \e trim the extracted tokens. If this parameter + * is true, existing leading and trailing whitespace + * characters will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type Break( C& list, const_c_string s, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + size_type n = R::Length( s ); + if ( n > 0 ) + for ( SearchEngine S( s, n, true/*case*/ ); ; ) + { + size_type j = S( m_data->string, i, len ); + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + n; + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a StringList. + * + * \param c The token separator character. Tokens will be separated by + * sequences of one or more instances of this character. + * + * \param trim True to \e trim the extracted tokens. If this parameter is + * true, existing leading and trailing whitespace characters + * will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type Break( C& list, char_type c, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + for ( ;; ) + { + size_type j = i; + for ( const_iterator p = m_data->string + i; j < len; ++j, ++p ) + if ( *p == c ) + break; + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + 1; + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a StringList. + * + * \param ca An array of token separator characters. Tokens will be + * separated by instances of any character included in this + * array. The template argument S must have type conversion + * semantics to the character type of this string class + * (char_type). If this array is empty, calling this function + * has no effect and zero is returned. + * + * \param trim True to \e trim the extracted tokens. If this parameter is + * true, existing leading and trailing whitespace characters + * will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type Break( C& list, const Array& ca, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + if ( !ca.IsEmpty() ) + { + size_type len = Length(); + if ( i < len ) + { + for ( ;; ) + { + size_type j = i; + for ( const_iterator p = m_data->string + i; j < len; ++j, ++p ) + for ( auto c : ca ) + if ( *p == char_type( c ) ) + goto __Break_1; +__Break_1: + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + 1; + } + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string by + * performing case-insensitive comparisons with a token separation string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a StringList. + * + * \param s The token separator string. This function performs + * case-insensitive string comparisons to locate instances of + * this string. + * + * \param trim True to \e trim the extracted tokens. If this parameter is + * true, existing leading and trailing whitespace characters + * will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type BreakIC( C& list, const GenericString& s, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + size_type n = s.Length(); + if ( n > 0 ) + { + for ( SearchEngine S( s.m_data->string, n, false/*case*/ ); ; ) + { + size_type j = S( m_data->string, i, len ); + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + n; + } + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string by + * performing case-insensitive comparisons with a null-terminated token + * separation string. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a + * StringList. + * + * \param s The token separator null-terminated string. This + * function performs case-insensitive string comparisons + * to locate instances of this string. + * + * \param trim True to \e trim the extracted tokens. If this parameter + * is true, existing leading and trailing whitespace + * characters will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type BreakIC( C& list, const_c_string s, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + size_type n = R::Length( s ); + if ( n > 0 ) + { + for ( SearchEngine S( s, n, false/*case*/ ); ; ) + { + size_type j = S( m_data->string, i, len ); + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + n; + } + } + } + return count; + } + + /*! + * Gets a sequence of \e tokens (substrings) extracted from this string by + * performing case-insensitive comparisons with a token separator character. + * + * \param[out] list The list of extracted tokens. Must be a reference to a + * container, such as Array or List, or a derived class. + * Typically, this parameter is a reference to a StringList. + * + * \param c The token separator character. Tokens will be separated by + * sequences of one or more instances of this character. This + * function performs case-insensitive character comparisons + * to locate instances of this character. + * + * \param trim True to \e trim the extracted tokens. If this parameter is + * true, existing leading and trailing whitespace characters + * will be removed from each extracted token. + * + * \param i Starting character index. + * + * Returns the number of tokens extracted and added to the list. + */ + template + size_type BreakIC( C& list, char_type c, bool trim = false, size_type i = 0 ) const + { + size_type count = 0; + size_type len = Length(); + if ( i < len ) + { + c = R::ToCaseFolded( c ); + for ( ;; ) + { + size_type j = i; + for ( const_iterator p = m_data->string + i; j < len; ++j, ++p ) + if ( R::ToCaseFolded( *p ) == c ) + break; + + GenericString t; + if ( i < j ) + { + const_iterator l = m_data->string + i; + size_type m = j - i; + if ( trim ) + { + const_iterator r = l + m; + l = R::SearchTrimLeft( l, r ); + m = R::SearchTrimRight( l, r ) - l; + } + if ( m > 0 ) + { + t.m_data->Allocate( m ); + R::Copy( t.m_data->string, l, m ); + } + } + list.Add( t ); + ++count; + + if ( j == len ) + break; + + i = j + 1; + } + } + return count; + } + + /*! + * Returns the first character in this string, or a null character + * (R::Null()) if this string is empty. + */ + char_type FirstChar() const noexcept + { + return (m_data->string != nullptr) ? *m_data->string : R::Null(); + } + + /*! + * Returns the last character in this string, or a null character + * (R::Null()) if this string is empty. + */ + char_type LastChar() const noexcept + { + return (m_data->string < m_data->end) ? *(m_data->end-1) : R::Null(); + } + + /*! + * Returns true iff this string begins with the specified substring \a s. + */ + template + bool StartsWith( const GenericString& s ) const noexcept + { + if ( s.IsEmpty() || Length() < s.Length() ) + return false; + for ( const_iterator p = m_data->string, q = s.m_data->string; q < s.m_data->end; ++p, ++q ) + if ( *p != *q ) + return false; + return true; + } + + /*! + * Returns true iff this string begins with the specified null-terminated + * sequence \a t. + */ + bool StartsWith( const_c_string t ) const noexcept + { + size_type n = R::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->string, e = p+n; p < e; ++p, ++t ) + if ( *p != *t ) + return false; + return true; + } + + /*! + * Returns true iff this string begins with the specified character \a c. + */ + bool StartsWith( char_type c ) const noexcept + { + return m_data->string < m_data->end && *m_data->string == c; + } + + /*! + * Returns true iff this string begins with the specified substring \a s, + * performing case-insensitive character comparisons. + */ + template + bool StartsWithIC( const GenericString& s ) const noexcept + { + if ( s.IsEmpty() || Length() < s.Length() ) + return false; + for ( const_iterator p = m_data->string, q = s.m_data->string; q < s.m_data->end; ++p, ++q ) + if ( R::ToCaseFolded( *p ) != R::ToCaseFolded( *q ) ) + return false; + return true; + } + + /*! + * Returns true iff this string begins with the specified null-terminated + * sequence \a t, performing case-insensitive character comparisons. + */ + bool StartsWithIC( const_c_string t ) const noexcept + { + size_type n = R::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->string, e = p+n; p < e; ++p, ++t ) + if ( R::ToCaseFolded( *p ) != R::ToCaseFolded( *t ) ) + return false; + return true; + } + + /*! + * Returns true iff this string begins with the specified character \a c, + * performing a case-insensitive character comparison. + */ + bool StartsWithIC( char_type c ) const noexcept + { + return m_data->string < m_data->end && R::ToCaseFolded( *m_data->string ) == R::ToCaseFolded( c ); + } + + /*! + * Returns true iff this string ends with the specified substring \a s. + */ + template + bool EndsWith( const GenericString& s ) const noexcept + { + size_type n = s.Length(); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n, q = s.m_data->string; p < m_data->end; ++p, ++q ) + if ( *p != *q ) + return false; + return true; + } + + /*! + * Returns true iff this string ends with the specified null-terminated + * string \a t. + */ + bool EndsWith( const_c_string t ) const noexcept + { + size_type n = R::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n; p < m_data->end; ++p, ++t ) + if ( *p != *t ) + return false; + return true; + } + + /*! + * Returns true iff this string ends with the specified character \a c. + */ + bool EndsWith( char_type c ) const noexcept + { + return m_data->string < m_data->end && *(m_data->end-1) == c; + } + + /*! + * Returns true iff this string ends with the specified substring \a s, + * performing case-insensitive character comparisons. + */ + template + bool EndsWithIC( const GenericString& s ) const noexcept + { + size_type n = s.Length(); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n, q = s.m_data->string; p < m_data->end; ++p, ++q ) + if ( R::ToCaseFolded( *p ) != R::ToCaseFolded( *q ) ) + return false; + return true; + } + + /*! + * Returns true iff this string ends with the specified null-terminated + * string \a t, performing case-insensitive character comparisons. + */ + bool EndsWithIC( const_c_string t ) const noexcept + { + size_type n = R::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n; p < m_data->end; ++p, ++t ) + if ( R::ToCaseFolded( *p ) != R::ToCaseFolded( *t ) ) + return false; + return true; + } + + /*! + * Returns true iff this string ends with the specified character \a c, + * performing a case-insensitive character comparison. + */ + bool EndsWithIC( char_type c ) const noexcept + { + return m_data->string < m_data->end && R::ToCaseFolded( *(m_data->end-1) ) == R::ToCaseFolded( c ); + } + + /*! + * Returns the starting index \a k of the first occurrence of a substring + * \a s in this string, such that \a k >= \a i. Returns notFound if such + * occurrence does not exist. + */ + template + size_type FindFirst( const GenericString& s, size_type i = 0 ) const noexcept + { + size_type len = Length(); + i = SearchEngine( s.m_data->string, s.Length(), true/*case*/ )( m_data->string, i, len ); + return (i < len) ? i : notFound; + } + + /*! + * Returns the starting index \a k of the first occurrence of a + * null-terminated substring \a t in this string, such that \a k >= \a i. + * Returns notFound if such occurrence does not exist. + */ + size_type FindFirst( const_c_string t, size_type i = 0 ) const noexcept + { + size_type len = Length(); + i = SearchEngine( t, R::Length( t ), true/*case*/ )( m_data->string, i, len ); + return (i < len) ? i : notFound; + } + + /*! + * Returns the index \a k of the first occurrence of a character \a c in + * this string, such that \a k >= \a i. Returns notFound if such occurrence + * does not exist. + */ + size_type FindFirst( char_type c, size_type i = 0 ) const noexcept + { + for ( const_iterator p = m_data->string+i; p < m_data->end; ++p ) + if ( *p == c ) + return p - m_data->string; + return notFound; + } + + /*! + * Returns the starting index \a k of the first occurrence of a substring + * \a s in this string, such that \a k >= \a i. Returns notFound if such + * occurrence does not exist. + * + * This member function performs case-insensitive string comparisons to find + * an instance of the substring \a s. + */ + template + size_type FindFirstIC( const GenericString& s, size_type i = 0 ) const noexcept + { + size_type len = Length(); + i = SearchEngine( s.m_data->string, s.Length(), false/*case*/ )( m_data->string, i, len ); + return (i < len) ? i : notFound; + } + + /*! + * Returns the starting index \a k of the first occurrence of a + * null-terminated substring \a s in this string, such that \a k >= \a i. + * Returns notFound if such occurrence does not exist. + * + * This member function performs case-insensitive string comparisons to find + * an instance of the substring \a s. + */ + size_type FindFirstIC( const_c_string t, size_type i = 0 ) const noexcept + { + size_type len = Length(); + i = SearchEngine( t, R::Length( t ), false/*case*/ )( m_data->string, i, len ); + return (i < len) ? i : notFound; + } + + /*! + * Returns the index \a k of the first occurrence of a character \a c in + * this string, such that \a k >= \a i. Returns notFound if such occurrence + * does not exist. + * + * This member function performs case-insensitive character comparisons to + * find an instance of the character \a c. + */ + size_type FindFirstIC( char_type c, size_type i = 0 ) const noexcept + { + c = R::ToCaseFolded( c ); + for ( const_iterator p = m_data->string+i; p < m_data->end; ++p ) + if ( R::ToCaseFolded( *p ) == c ) + return p - m_data->string; + return notFound; + } + + /*! + * A synonym for FindFirst( const GenericString&, size_type ). + */ + template + size_type Find( const GenericString& s, size_type i = 0 ) const noexcept + { + return FindFirst( s, i ); + } + + /*! + * A synonym for FindFirst( const_c_string, size_type ). + */ + size_type Find( const_c_string t, size_type i = 0 ) const noexcept + { + return FindFirst( t, i ); + } + + /*! + * A synonym for FindFirst( char_type, size_type ). + */ + size_type Find( char_type c, size_type i = 0 ) const noexcept + { + return FindFirst( c, i ); + } + + /*! + * A synonym for FindFirstIC( const GenericString&, size_type ). + */ + template + size_type FindIC( const GenericString& s, size_type i = 0 ) const noexcept + { + return FindFirstIC( s, i ); + } + + /*! + * A synonym for FindFirstIC( const_c_string, size_type ). + */ + size_type FindIC( const_c_string t, size_type i = 0 ) const noexcept + { + return FindFirstIC( t, i ); + } + + /*! + * A synonym for FindFirstIC( char_type, size_type ). + */ + size_type FindIC( char_type c, size_type i = 0 ) const noexcept + { + return FindFirstIC( c, i ); + } + + /*! + * Returns the starting index \a k of the last occurrence of a substring + * \a s in this string, such that: + * + * \a k <= \a r - \a n, + * + * where \a n is the length of the substring \a s. Returns notFound if such + * occurrence does not exist. + */ + template + size_type FindLast( const GenericString& s, size_type r = maxPos ) const noexcept + { + r = pcl::Min( r, Length() ); + size_type i = SearchEngine( s.m_data->string, s.Length(), true/*case*/, true/*last*/ )( m_data->string, 0, r ); + return (i < r) ? i : notFound; + } + + /*! + * Returns the starting index \a k of the last occurrence of a + * null-terminated substring \a t in this string, such that: + * + * 0 <= \a k <= \a r - \a n, + * + * where \a n is the length of the substring \a t. Returns notFound if such + * occurrence does not exist. + */ + size_type FindLast( const_c_string t, size_type r = maxPos ) const noexcept + { + r = pcl::Min( r, Length() ); + size_type i = SearchEngine( t, R::Length( t ), true/*case*/, true/*last*/ )( m_data->string, 0, r ); + return (i < r) ? i : notFound; + } + + /*! + * Returns the index \a k of the last occurrence of a character \a c in this + * string, such that \a k < \a r. Returns notFound if such occurrence does + * not exist. + */ + size_type FindLast( char_type c, size_type r = maxPos ) const noexcept + { + r = pcl::Min( r, Length() ); + for ( const_iterator p = m_data->string+r; r > 0; --r ) + if ( *--p == c ) + return r - 1; + return notFound; + } + + /*! + * Returns the starting index \a k of the last occurrence of a substring + * \a s in this string, such that: + * + * \a k <= \a r - \a n, + * + * where \a n is the length of the substring \a s. Returns notFound if such + * occurrence does not exist. + * + * This member function performs case-insensitive string comparisons to + * find an instance of the specified substring \a s. + */ + template + size_type FindLastIC( const GenericString& s, size_type r = maxPos ) const noexcept + { + r = pcl::Min( r, Length() ); + size_type i = SearchEngine( s.m_data->string, s.Length(), false/*case*/, true/*last*/ )( m_data->string, 0, r ); + return (i < r) ? i : notFound; + } + + /*! + * Returns the starting index \a k of the last occurrence of a + * null-terminated substring \a t in this string, such that: + * + * 0 <= \a k <= \a r - \a n, + * + * where \a n is the length of the substring \a t. Returns notFound if such + * occurrence does not exist. + * + * This member function performs case-insensitive string comparisons to + * find an instance of the specified substring \a t. + */ + size_type FindLastIC( const_c_string t, size_type r = maxPos ) const noexcept + { + r = pcl::Min( r, Length() ); + size_type i = SearchEngine( t, R::Length( t ), false/*case*/, true/*last*/ )( m_data->string, 0, r ); + return (i < r) ? i : notFound; + } + + /*! + * Returns the index \a k of the last occurrence of a character \a c in this + * string, such that \a k < \a r. Returns notFound if such occurrence does + * not exist. + * + * This member function performs case-insensitive character comparisons to + * find an instance of the specified character \a c. + */ + size_type FindLastIC( char_type c, size_type r = maxPos ) const noexcept + { + c = R::ToCaseFolded( c ); + r = pcl::Min( r, Length() ); + for ( const_iterator p = m_data->string+r; r > 0; --r ) + if ( R::ToCaseFolded( *--p ) == c ) + return r - 1; + return notFound; + } + + /*! + * Returns true iff this string contains a substring \a s. + */ + template + bool Contains( const GenericString& s ) const noexcept + { + return Find( s ) != notFound; + } + + /*! + * Returns true iff this string contains a null-terminated substring \a t. + */ + bool Contains( const_c_string t ) const noexcept + { + return Find( t ) != notFound; + } + + /*! + * Returns true iff this string contains a character \a c. + */ + bool Contains( char_type c ) const noexcept + { + return Find( c ) != notFound; + } + + /*! + * Returns true iff this string contains a substring \a s. + * + * This member function performs case-insensitive string comparisons to + * find an instance of the specified substring \a s. + */ + template + bool ContainsIC( const GenericString& s ) const noexcept + { + return FindIC( s ) != notFound; + } + + /*! + * Returns true iff this string contains a null-terminated substring \a t. + * + * This member function performs case-insensitive string comparisons to + * find an instance of the specified substring \a t. + */ + bool ContainsIC( const_c_string t ) const noexcept + { + return FindIC( t ) != notFound; + } + + /*! + * Returns true iff this string contains a character \a c. + * + * This member function performs case-insensitive character comparisons to + * find an instance of the specified character \a c. + */ + bool ContainsIC( char_type c ) const noexcept + { + return FindIC( c ) != notFound; + } + + /*! + * Removes all leading and trailing trimable characters. + * + * Trimable characters are determined by the traits class R. A character + * \a c is trimable if R::IsTrimable( c ) is true. Generally, the set of + * trimable characters corresponds to the set of white space characters. + * + * \sa Trimmed(); + */ + void Trim() + { + const_iterator l = R::SearchTrimLeft( m_data->string, m_data->end ); + const_iterator r = R::SearchTrimRight( l, m_data->end ); + if ( m_data->string < l || r < m_data->end ) + Trim( l, r - l ); + } + + /*! + * Removes all leading trimable characters. + * + * Trimable characters are determined by the traits class R. A character + * \a c is trimable if R::IsTrimable( c ) is true. Generally, the set of + * trimable characters corresponds to the set of white space characters. + * + * \sa TrimmedLeft(); + */ + void TrimLeft() + { + const_iterator l = R::SearchTrimLeft( m_data->string, m_data->end ); + if ( m_data->string < l ) + Trim( l, m_data->end - l ); + } + + /*! + * Removes all trailing trimable characters. + * + * Trimable characters are determined by the traits class R. A character + * \a c is trimable if R::IsTrimable( c ) is true. Generally, the set of + * trimable characters corresponds to the set of white space characters. + * + * \sa TrimmedRight(); + */ + void TrimRight() + { + const_iterator r = R::SearchTrimRight( m_data->string, m_data->end ); + if ( r < m_data->end ) + Trim( m_data->string, r - m_data->string ); + } + + /*! + * Returns a duplicate of this string with all leading and trailing + * trimable characters removed. + * \sa Trim() + */ + GenericString Trimmed() const + { + GenericString s( *this ); + s.Trim(); + return s; + } + + /*! + * Returns a duplicate of this string with all leading trimable + * characters removed. + * \sa TrimLeft() + */ + GenericString TrimmedLeft() const + { + GenericString s( *this ); + s.TrimLeft(); + return s; + } + + /*! + * Returns a duplicate of this string with all trailing trimable + * characters removed. + * \sa TrimRight() + */ + GenericString TrimmedRight() const + { + GenericString s( *this ); + s.TrimRight(); + return s; + } + + /*! + * Ensures that this string is enclosed by a leading and a trailing instance + * of the specified character \a c. If this string is already enclosed by + * \a c, this function does nothing. + * \sa Enclosed() + */ + void EnsureEnclosed( char_type c ) + { + int encloseLeft = 1; + int encloseRight = 1; + size_type len = Length(); + if ( len > 0 ) + { + if ( *m_data->string == c ) + encloseLeft = 0; + if ( *(m_data->end-1) == c ) + if ( len > 1 ) + encloseRight = 0; + else + encloseLeft = 0; + } + size_type n = len + encloseLeft + encloseRight; + if ( n > len ) + { + if ( !IsUnique() || m_data->ShouldReallocate( n ) ) + { + Data* newData = Data::New( n ); + R::Copy( newData->string + encloseLeft, m_data->string, len ); + DetachFromData(); + m_data = newData; + } + else + { + m_data->SetLength( n ); + R::CopyOverlapped( m_data->string + encloseLeft, m_data->string, len ); + } + + if ( encloseLeft ) + *m_data->string = c; + if ( encloseRight ) + *(m_data->end-1) = c; + } + } + + /*! + * Returns a duplicate of this string enclosed by the specified character. + * If this string is already enclosed by \a c, this function returns an + * unmodified copy. + * \sa EnsureEnclosed() + */ + GenericString Enclosed( char_type c ) const + { + GenericString s( *this ); + s.EnsureEnclosed( c ); + return s; + } + + /*! + * Ensures that this string is enclosed by a leading and a trailing instance + * of the single quote character ('). If this string is already single + * quoted, this function does nothing. + * \sa SingleQuoted() + */ + void EnsureSingleQuoted() + { + EnsureEnclosed( R::SingleQuote() ); + } + + /*! + * Returns a duplicate of this string enclosed by single quote characters + * ('). If this string is already single quoted, this function returns an + * unmodified copy. + * \sa EnsureSingleQuoted() + */ + GenericString SingleQuoted() const + { + GenericString s( *this ); + s.EnsureSingleQuoted(); + return s; + } + + /*! + * Ensures that this string is enclosed by a leading and a trailing instance + * of the double quote character ("). If this string is already double + * quoted, this function does nothing. + * \sa DoubleQuoted() + */ + void EnsureDoubleQuoted() + { + EnsureEnclosed( R::DoubleQuote() ); + } + + /*! + * Returns a duplicate of this string enclosed by double quote characters + * ("). If this string is already double quoted, this function returns an + * unmodified copy. + * \sa EnsureDoubleQuoted() + */ + GenericString DoubleQuoted() const + { + GenericString s( *this ); + s.EnsureDoubleQuoted(); + return s; + } + + /*! + * Unquotes this string. + * + * If the string starts and ends with single quote characters, the result is + * the same string with the quotes removed and its length decremented by + * two. The same happens if the string starts and ends with double quote + * characters. + * + * If the string does not start and end with the same quote character, this + * function has no effect. + * + * \sa Unquoted() + */ + void Unquote() + { + size_type len = Length(); + if ( len > 1 ) + if ( *m_data->string == R::SingleQuote() && *(m_data->end-1) == R::SingleQuote() || + *m_data->string == R::DoubleQuote() && *(m_data->end-1) == R::DoubleQuote() ) + if ( IsUnique() ) + { + R::CopyOverlapped( m_data->string, m_data->string+1, len-2 ); + m_data->SetLength( len-2 ); + } + else + { + Data* newData = Data::New( len-2 ); + R::Copy( newData->string, m_data->string+1, len-2 ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns an unquoted duplicate of this string. + * \sa Unquote() + */ + GenericString Unquoted() const + { + GenericString s( *this ); + s.Unquote(); + return s; + } + + /*! + * Pads this string to the right, using the specified \a fill character, up + * to the specified \a width. + * + * If the current length \e n of this string is less than the specified + * \a width, \a width - \e n copies of the \a fill character will be + * appended to the string. If the current length is greater than or equal to + * \a width, this function has no effect. + * + * \sa JustifyRight(), JustifyCenter(), LeftJustified() + */ + void JustifyLeft( size_type width, char_type fill = R::Blank() ) + { + size_type len = Length(); + if ( len < width ) + Append( fill, width-len ); + } + + /*! + * Pads this string to the left, using the specified \a fill character, up + * to the specified \a width. + * + * If the current length \e n of this string is less than the specified + * \a width, \a width - \e n copies of the \a fill character will be + * prepended to the string. If the current length is greater than or equal to + * \a width, this function has no effect. + * + * \sa JustifyLeft(), JustifyCenter(), RightJustified() + */ + void JustifyRight( size_type width, char_type fill = R::Blank() ) + { + size_type len = Length(); + if ( len < width ) + Prepend( fill, width-len ); + } + + /*! + * Pads this string equally to the left and right, using the specified + * \a fill character, up to the specified \a width. + * + * If the current length \e n of this string is less than the specified + * \a width, let \e m = \a width - \e n, and let \e m2 = \e m/2. Then \e m2 + * copies of the \a fill character will be prepended to the string, and + * \e m - \e m2 \a fill characters will be appended. If the current length + * is greater than or equal to \a width, this function has no effect. + * + * \sa JustifyLeft(), JustifyRight(), CenterJustified() + */ + void JustifyCenter( size_type width, char_type fill = R::Blank() ) + { + size_type len = Length(); + if ( len < width ) + { + size_type n = width-len; + size_type n2 = n >> 1; + Prepend( fill, n2 ); + Append( fill, n-n2 ); + } + } + + /*! + * Returns a duplicate of this string padded to the right, using the + * specified \a fill character, up to the specified \a width. + * + * \sa JustifyLeft(), RightJustified(), CenterJustified() + */ + GenericString LeftJustified( size_type width, char_type fill = R::Blank() ) const + { + GenericString s( *this ); + s.JustifyLeft( width, fill ); + return s; + } + + /*! + * Returns a duplicate of this string padded to the left, using the + * specified \a fill character, up to the specified \a width. + * + * \sa JustifyRight(), LeftJustified(), CenterJustified() + */ + GenericString RightJustified( size_type width, char_type fill = R::Blank() ) const + { + GenericString s( *this ); + s.JustifyRight( width, fill ); + return s; + } + + /*! + * Returns a duplicate of this string padded equally to the left and right, + * using the specified \a fill character, up to the specified \a width. + * + * \sa JustifyCenter(), LeftJustified(), RightJustified() + */ + GenericString CenterJustified( size_type width, char_type fill = R::Blank() ) const + { + GenericString s( *this ); + s.JustifyCenter( width, fill ); + return s; + } + + /*! + * Compares numeric character values between two strings. + * + * \param s A string to which this string will be compared. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Performs a character-to-character comparison of numeric character values + * between this string and the specified string \a s, and returns an integer + * that indicates the comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a s. + * \li -1 if this string precedes the specified string \a s. + * + * This function ignores the current platform locale. It considers Unicode + * code points exclusively. For case-insensitive comparisons, a standard + * Unicode case folding transformation is applied to each character pair. + */ + template + int CompareCodePoints( const GenericString& s, bool caseSensitive = true ) const noexcept + { + return R::CompareCodePoints( m_data->string, Length(), s.m_data->string, s.Length(), caseSensitive ); + } + + /*! + * Compares numeric character values a string and a null-terminated string. + * + * \param t The starting address of a null-terminated string + * to which this string will be compared. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Performs a character-to-character comparison of numeric character values + * between this string and the specified null-terminated string \a t, and + * returns an integer that indicates the comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a t. + * \li -1 if this string precedes the specified string \a t. + * + * This function ignores the current platform locale. It considers Unicode + * code points exclusively. For case-insensitive comparisons, a standard + * Unicode case folding transformation is applied to each character pair. + */ + int CompareCodePoints( const_c_string t, bool caseSensitive = true ) const noexcept + { + return R::CompareCodePoints( m_data->string, Length(), t, R::Length( t ), caseSensitive ); + } + + /*! + * Compares numeric character values a string and a null-terminated string. + * + * \param c A single character to which this string will be + * compared. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value of this parameter + * is true. + * + * Performs a comparison between this string and the specified character + * \a c, and returns an integer that indicates the comparison result: + * + * \li 0 if this string is equal to \a c. + * \li +1 if this string postcedes the character \a c. + * \li -1 if this string precedes the character \a c. + * + * The performed comparison is equivalent to a comparison of this string + * with a fictitious string of length one, whose only character was equal to + * the specified character \a c. + * + * This function ignores the current platform locale. It considers Unicode + * code points exclusively. For case-insensitive comparisons, a standard + * Unicode case folding transformation is applied to each character pair. + */ + int CompareCodePoints( char_type c, bool caseSensitive = true ) const noexcept + { + return R::CompareCodePoints( m_data->string, Length(), &c, 1, caseSensitive ); + } + + /*! + * Lexicographical comparison between two strings. + * + * \param s A string to which this string will be compared. + * + * \param caseSensitive When true, a case-sensitive comparison is performed; + * otherwise the comparison does not distinguish + * between lowercase and uppercase characters (as + * defined by the selected locale). The default value + * of this parameter is true. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a character-to-character comparison between this string and the + * specified string \a s, and returns an integer that indicates the + * comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a s. + * \li -1 if this string precedes the specified string \a s. + */ + template + int Compare( const GenericString& s, + bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), s.m_data->string, s.Length(), caseSensitive, localeAware ); + } + + /*! + * Lexicographical comparison to a null-terminated string. + * + * \param t The starting address of a null-terminated string to + * which this string will be compared. + * + * \param caseSensitive When true, a case-sensitive comparison is performed; + * otherwise the comparison does not distinguish + * between lowercase and uppercase characters (as + * defined by the selected locale). The default value + * of this parameter is true. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a character-to-character comparison between this string and the + * specified null-terminated string \a t, and returns an integer that + * indicates the comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a t. + * \li -1 if this string precedes the specified string \a t. + */ + int Compare( const_c_string t, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), t, R::Length( t ), caseSensitive, localeAware ); + } + + /*! + * Lexicographical comparison to a single character. + * + * \param c A character to which this string will be compared. + * + * \param caseSensitive When true, a case-sensitive comparison is performed; + * otherwise the comparison does not distinguish + * between lowercase and uppercase characters (as + * defined by the selected locale). The default value + * of this parameter is true. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a comparison between this string and the specified character + * \a c, and returns an integer that indicates the comparison result: + * + * \li 0 if this string is equal to \a c. + * \li +1 if this string postcedes the character \a c. + * \li -1 if this string precedes the character \a c. + * + * The performed comparison is equivalent to a comparison of this string + * with a fictitious string of length one, whose only character was equal to + * the specified character \a c. + */ + int Compare( char_type c, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), &c, 1, caseSensitive, localeAware ); + } + + /*! + * Case-insensitive lexicographical comparison between two strings. + * + * \param s A string to which this string will be compared. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a character-to-character, case-insensitive comparison between + * this string and the specified string \a s, and returns an integer that + * indicates the comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a s. + * \li -1 if this string precedes the specified string \a s. + */ + template + int CompareIC( const GenericString& s, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), s.m_data->string, s.Length(), false/*caseSensitive*/, localeAware ); + } + + /*! + * Case-insensitive lexicographical comparison to a null-terminated string. + * + * \param t The starting address of a null-terminated string to + * which this string will be compared. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a character-to-character, case-insensitive comparison between + * this string and the specified null-terminated string \a t, and returns an + * integer that indicates the comparison result: + * + * \li 0 if both strings are equal. + * \li +1 if this string postcedes the specified string \a s. + * \li -1 if this string precedes the specified string \a s. + */ + int CompareIC( const_c_string t, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), t, R::Length( t ), false/*caseSensitive*/, localeAware ); + } + + /*! + * Case-insensitive lexicographical comparison to a single character. + * + * \param c A character to which this string will be compared. + * + * \param localeAware When true, a locale-dependent comparison is done + * which takes into account the currently selected user + * locale (language and variants). When false, a + * locale-invariant comparison is carried out by + * comparing character code points (which is faster). + * The default value of this parameter is true. + * + * Performs a case-insensitive comparison between this string and the + * specified character \a c, and returns an integer that indicates the + * comparison result: + * + * \li 0 if this string is equal to \a c. + * \li +1 if this string postcedes the character \a c. + * \li -1 if this string precedes the character \a c. + * + * The performed comparison is equivalent to a case-insensitive comparison + * of this string with a fictitious string of length one, whose only + * character was equal to \a c. + */ + int CompareIC( char_type c, bool localeAware = true ) const noexcept + { + return R::Compare( m_data->string, Length(), &c, 1, false/*caseSensitive*/, localeAware ); + } + + /*! + * Wildcard string matching. + * + * \param pattern The pattern string. May contain multiple instances + * of the wildcard characters '*' and '?'. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value is true. + * + * Returns true iff this string matches the specified \a pattern. If either + * this string or the pattern is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + template + bool WildMatch( const GenericString& pattern, bool caseSensitive = true ) const noexcept + { + return R::WildMatch( m_data->string, Length(), pattern.m_data->string, pattern.Length(), caseSensitive ); + } + + /*! + * Wildcard string matching (case-insensitive). + * + * \param pattern The pattern string. May contain multiple instances + * of the wildcard characters '*' and '?'. + * + * This function performs case-insensitive comparisons between string and + * non-wild pattern characters. + * + * Returns true iff this string matches the specified \a pattern. If either + * this string or the pattern is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + template + bool WildMatchIC( const GenericString& pattern ) const noexcept + { + return R::WildMatch( m_data->string, Length(), pattern.m_data->string, pattern.Length(), false/*caseSensitive*/ ); + } + + /*! + * Wildcard string matching with a null-terminated pattern. + * + * \param pattern The pattern string. May contain multiple instances + * of the wildcard characters '*' and '?'. + * + * \param caseSensitive When true, a case-sensitive comparison is + * performed; otherwise the comparison does not + * distinguish between lowercase and uppercase + * characters. The default value is true. + * + * Returns true iff this string matches the specified \a pattern. If either + * this string or the pattern is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + bool WildMatch( const_c_string pattern, bool caseSensitive = true ) const noexcept + { + return R::WildMatch( m_data->string, Length(), pattern, R::Length( pattern ), caseSensitive ); + } + + /*! + * Wildcard string matching with a null-terminated pattern + * (case-insensitive). + * + * \param pattern The pattern string. May contain multiple instances + * of the wildcard characters '*' and '?'. + * + * This function performs case-insensitive comparisons between string and + * non-wild pattern characters. + * + * Returns true iff this string matches the specified \a pattern. If either + * this string or the pattern is empty, this function always returns false + * conventionally, even if the pattern is a single asterisk '*'. + */ + bool WildMatchIC( const_c_string pattern ) const noexcept + { + return R::WildMatch( m_data->string, Length(), pattern, R::Length( pattern ), false/*caseSensitive*/ ); + } + + /*! + * Returns true iff this string contains one or more wildcard characters + * (asterisk '*' or question mark '?'). + */ + bool HasWildcards() const noexcept + { + for ( iterator i = m_data->string; i < m_data->end; ++i ) + if ( R::IsWildcard( *i ) ) + return true; + return false; + } + + /*! + * Replaces all characters in this string with their \e case \e folded + * counterparts. + */ + void ToCaseFolded() + { + size_type len = Length(); + if ( len > 0 ) + { + EnsureUnique(); + R::ToCaseFolded( m_data->string, len ); + } + } + + /*! + * Replaces all \e uppercase characters in this string with their + * \e lowercase counterparts. + */ + void ToLowercase() + { + size_type len = Length(); + if ( len > 0 ) + { + EnsureUnique(); + R::ToLowercase( m_data->string, len ); + } + } + + /*! + * Replaces all \e lowercase characters in this string with their + * \e uppercase counterparts. + */ + void ToUppercase() + { + size_type len = Length(); + if ( len > 0 ) + { + EnsureUnique(); + R::ToUppercase( m_data->string, len ); + } + } + + /*! + * Returns a duplicate of this string with all characters replaced with + * their case folded counterparts. + */ + GenericString CaseFolded() const + { + GenericString s( *this ); + s.ToCaseFolded(); + return s; + } + + /*! + * Returns a duplicate of this string with all uppercase characters replaced + * with their lowercase counterparts. + */ + GenericString Lowercase() const + { + GenericString s( *this ); + s.ToLowercase(); + return s; + } + + /*! + * Returns a duplicate of this string with all lowercase characters replaced + * with their uppercase counterparts. + */ + GenericString Uppercase() const + { + GenericString s( *this ); + s.ToUppercase(); + return s; + } + + /*! + * Transposes the characters in this string, so that the first character + * becomes the last and the last becomes the first, the second becomes the + * next-to-last, and so on. + */ + void Reverse() + { + if ( !IsEmpty() ) + { + EnsureUnique(); + for ( iterator i = m_data->string, j = m_data->end; i < --j; ++i ) + pcl::Swap( *i, *j ); + } + } + + /*! + * Returns a duplicate of this string with its characters in reverse order. + */ + GenericString Reversed() const + { + GenericString s( *this ); + s.Reverse(); + return s; + } + + /*! + * Sorts the characters of this string in ascending order. + */ + void Sort() + { + if ( !IsEmpty() ) + { + EnsureUnique(); + pcl::Sort( m_data->string, m_data->end ); + } + } + + /*! + * Returns a duplicate of this string with its characters sorted in + * ascending order. + */ + GenericString Sorted() const + { + GenericString s( *this ); + s.Sort(); + return s; + } + + /*! + * Sorts the characters of this string in ascending order. Ordering is + * defined such that for any pair a, b of characters, the specified binary + * predicate p( a, b ) is true if a precedes b. + */ + template + void Sort( BP p ) + { + if ( !IsEmpty() ) + { + EnsureUnique(); + pcl::Sort( m_data->string, m_data->end, p ); + } + } + + /*! + * Returns a duplicate of this string with its characters sorted in + * ascending order with the specified binary predicate \a p. + */ + template + GenericString Sorted( BP p ) const + { + GenericString s( *this ); + s.Sort( p ); + return s; + } + + /*! + * Returns true iff this string can be interpreted as a numeric literal: + * + * \li The string is not empty. + * + * \li It is not exclusively composed of trimable characters. + * + * \li Its first non-trimable character is either a sign character, a + * decimal digit, or a decimal separator. + * + * \note This member function does \e not guarantee that this string + * contains a \e valid numeric literal. It only checks for the \e role of + * this string as a token in the context of a syntactic analysis. + */ + bool IsNumeral() const noexcept + { + if ( IsEmpty() ) + return false; + char_type c = *R::SearchTrimLeft( m_data->string, m_data->end ); + return R::IsDigit( c ) || R::IsSign( c ) || R::IsDecimalSeparator( c ); + } + + /*! + * Returns true iff this string can be interpreted as a symbol identifier: + * + * \li The string is not empty. + * + * \li It is not exclusively composed of trimable characters. + * + * \li Its first non-trimable character is either an alphabetic character or + * an underscore character. + * + * \note This member function does \e not guarantee that this string + * contains a \e valid symbol identifier. It only checks for the \e role of + * this string as a token in the context of a syntactic analysis. + */ + bool IsSymbol() const noexcept + { + if ( IsEmpty() ) + return false; + char_type c = *R::SearchTrimLeft( m_data->string, m_data->end ); + return R::IsSymbolDigit( c ); + } + + /*! + * Returns true only if this string contains a valid identifier: + * + * \li It is not an empty string. + * + * \li Its first character is either an alphabetic character or an + * underscore character. + * + * \li Its second and successive characters, if they exist, are all of them + * either alphabetic characters, decimal digits, or underscores. + * + * If this string is not a valid identifier, the \a pos variable will be set + * equal to the index of the first offending character (the first character + * that violates the above conditions). + */ + bool IsValidIdentifier( distance_type& pos ) const noexcept + { + if ( IsEmpty() ) + { + pos = 0; + return false; + } + const_iterator i = m_data->string; + if ( R::IsStartingSymbolDigit( *i ) ) + for ( ;; ) + { + if ( ++i == m_data->end ) + return true; + if ( !R::IsSymbolDigit( *i ) ) + break; + } + pos = i - m_data->string; + return false; + } + + /*! + * Returns true only if this string contains a valid identifier: + * + * \li It is not an empty string. + * + * \li Its first character is either an alphabetic character or an + * underscore character. + * + * \li Its second and successive characters, if they exist, are all of them + * either alphabetic characters, decimal digits, or underscores. + */ + bool IsValidIdentifier() const noexcept + { + if ( !IsEmpty() ) + if ( R::IsStartingSymbolDigit( *m_data->string ) ) + { + for ( const_iterator i = m_data->string; ++i < m_data->end; ) + if ( !R::IsSymbolDigit( *i ) ) + return false; + return true; + } + return false; + } + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this string. + * + * This function calls pcl::Hash64() for the internal string buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const noexcept + { + return pcl::Hash64( m_data->string, Size(), seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this string. + * + * This function calls pcl::Hash32() for the internal string buffer. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const noexcept + { + return pcl::Hash32( m_data->string, Size(), seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this string. This + * function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const noexcept + { + return Hash64( seed ); + } + + /*! + * If the internal free list of string data structures is available, this + * function destroys it and returns the number of deleted structures. + * Otherwise the function has no effect and returns zero. + * + * \note This function is \e not thread-safe. + */ + static size_type DeleteFreeList() + { + return Data::DeleteFreeList(); + } + + // ------------------------------------------------------------------------- + +protected: + + /*! + * \internal + * Dereferences string data and disposes it if it becomes garbage. + */ + void DetachFromData() + { + if ( !m_data->Detach() ) + Data::Dispose( m_data ); + } + + /*! + * \internal + * Internal string reallocation routine. + * + * Reallocates if necessary, ignoring current string contents. Reallocation + * may happen due either to insufficient available space, or (in a + * comparatively lazy fashion) to excessive unused space. + * + * Irrespective of reallocation, this function always updates internal data + * pointers to reflect the specified length in characters. + */ + void MaybeReallocate( size_type len ) + { + if ( IsUnique() ) + { + if ( m_data->ShouldReallocate( len ) ) + { + m_data->Deallocate(); + m_data->Allocate( len ); + } + else + m_data->SetLength( len ); + } + else + { + Data* newData = Data::New( len ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * \internal + * Internal string reallocation routine. + * + * Causes this string to grow by \a n uninitialized characters at the + * specified index \a i. The index \a i is updated as a side effect to + * ensure that 0 <= \a i <= Length() before reallocation. + */ + void UninitializedGrow( size_type& i, size_type n ) + { + size_type len = Length(); + size_type newLen = len+n; + if ( newLen > len ) + { + if ( i > len ) + i = len; + if ( IsUnique() ) + { + if ( size_type( m_data->capacity - m_data->string ) < newLen+1 ) + { + iterator old = m_data->string; + m_data->Allocate( newLen ); + if ( old != nullptr ) + { + if ( i > 0 ) + R::Copy( m_data->string, old, i ); + if ( i < len ) + R::Copy( m_data->string+i+n, old+i, len-i ); + m_data->alloc.Deallocate( old ); + } + } + else + { + if ( i < len ) + R::CopyOverlapped( m_data->string+i+n, m_data->string+i, len-i ); + m_data->SetLength( newLen ); + } + } + else + { + Data* newData = Data::New( newLen ); + if ( i > 0 ) + R::Copy( newData->string, m_data->string, i ); + if ( i < len ) + R::Copy( newData->string+i+n, m_data->string+i, len-i ); + DetachFromData(); + m_data = newData; + } + } + } + + /*! + * \internal + * String trimming primitive. + */ + void Trim( const_iterator left, size_type len ) + { + if ( len > 0 ) + { + if ( IsUnique() ) + { + if ( m_data->ShouldReallocate( len ) ) + { + iterator old = m_data->string; + m_data->Allocate( len ); + R::Copy( m_data->string, left, len ); + if ( old != nullptr ) + m_data->alloc.Deallocate( old ); + } + else + { + if ( left != m_data->string ) // trim left + R::CopyOverlapped( m_data->string, left, len ); + m_data->SetLength( len ); // trim right + } + } + else + { + Data* newData = Data::New( len ); + R::Copy( newData->string, left, len ); + DetachFromData(); + m_data = newData; + } + } + else + Clear(); + } + + /*! + * \internal + * Character replacement primitive. + */ + void ReplaceChar( char_type c1, char_type c2, size_type i, size_type n, bool caseSensitive ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( caseSensitive ) + { + for ( iterator p = m_data->string + i, p1 = p + n; p < p1; ++p ) + if ( *p == c1 ) + { + EnsureUnique(); + *p = c2; + for ( ; ++p < p1; ) + if ( *p == c1 ) + *p = c2; + break; + } + } + else + { + c1 = R::ToCaseFolded( c1 ); + for ( iterator p = m_data->string + i, p1 = p + n; p < p1; ++p ) + if ( R::ToCaseFolded( *p ) == c1 ) + { + EnsureUnique(); + *p = c2; + for ( ; ++p < p1; ) + if ( R::ToCaseFolded( *p ) == c1 ) + *p = c2; + break; + } + } + } + } + } + + /*! + * \internal + * String replacement primitive. + */ + void ReplaceString( const_iterator t1, size_type n1, const_iterator t2, size_type n2, size_type i, bool caseSensitive ) + { + if ( n1 > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + SearchEngine S( t1, n1, caseSensitive ); + if ( n1 == n2 ) + { + EnsureUnique(); + for ( size_type p = i; (p = S( m_data->string, p, len )) < len; p += n1 ) + R::Copy( m_data->string + p, t2, n2 ); + } + else + { + Array P; + for ( size_type p = i; (p = S( m_data->string, p, len )) < len; p += n1 ) + P.Add( p ); + if ( !P.IsEmpty() ) + { + size_type newLen = len; + if ( n1 < n2 ) + newLen += P.Length()*(n2 - n1); + else + newLen -= P.Length()*(n1 - n2); + + if ( newLen > 0 ) + { + Data* newData = Data::New( newLen ); + size_type targetIndex = 0; + size_type sourceIndex = 0; + for ( size_type p : P ) + { + size_type n = p - sourceIndex; + if ( n > 0 ) + R::Copy( newData->string+targetIndex, m_data->string+sourceIndex, n ); + R::Copy( newData->string+targetIndex+n, t2, n2 ); + targetIndex += n + n2; + sourceIndex = p + n1; + } + if ( sourceIndex < len ) + R::Copy( newData->string+targetIndex, m_data->string+sourceIndex, len-sourceIndex ); + DetachFromData(); + m_data = newData; + } + else + Clear(); + } + } + } + } + } + + /*! + * \internal + * \class pcl::GenericString::SearchEngine + * \brief Substring search primitive algorithm + * + * Implements the Boyer-Moore substring search algorithm (mismatched + * character heuristic). + * + * \b References + * + * \li Robert Sedgewick, Kevin Wayne (2011), Algorithms, 4th Edition, + * Addison-Wesley Professional, pp 770-773. + * + * \li Robert S. Boyer and J. Strother Moore (1977), A fast string + * searching algorithm, Communcations of the ACM Vol. 20 No. 10, + * pp 762-772. + */ + class PCL_CLASS SearchEngine + { + public: + + /*! + * Constructs a substring search engine for the specified \a pattern, + * pattern length in characters, and case sensitivity. + * + * Setting the \a useBoyerMoore parameter to \c false forces use of a + * brute-force search routine in all cases (useful for testing purposes + * and unique searches on very short strings). Otherwise a Boyer-Moore + * substring search algorithm will be used except for patterns of less + * than 4 characters. + */ + SearchEngine( const_iterator pattern, size_type patternLength, + bool caseSensitive = true, bool searchLast = false, bool useBoyerMoore = true ) + : m_pattern( pattern ) + , m_patternLength( int( patternLength ) ) + , m_caseSensitive( caseSensitive ) + , m_searchLast( searchLast ) + , m_useBoyerMoore( useBoyerMoore && m_patternLength > 3 ) + { + if ( m_useBoyerMoore ) + InitSkipList(); + } + + /*! + * Performs a substring search in the subset of contiguous characters of + * the specified string \a text defined by the range + * [\a startIndex,\a endIndex). The search pattern, search direction and + * case sensitivity are defined in the class constructor. + * + * Returns the character index where the first exact match has been + * found, or \a endIndex if no match was found. + * + * We implement the mismatched character heuristic version of + * the Boyer-Moore algorithm. + */ + size_type operator()( const_iterator text, size_type startIndex, size_type endIndex ) const noexcept + { + if ( endIndex <= startIndex + || m_patternLength <= 0 + || endIndex-startIndex < size_type( m_patternLength ) + || text == nullptr + || m_pattern == nullptr ) + return endIndex; + + if ( m_caseSensitive ) + { + if ( m_useBoyerMoore ) + { + if ( m_searchLast ) + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; i <= r; ) + { + int skip = 0; + const_iterator t = text + r - i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; --j >= 0; ) + { + char_type c = *t++; + if ( c != *p++ ) + { + skip = j - m_skipList[uint8( c )]; + if ( skip < 1 ) + skip = 1; + break; + } + } + if ( skip == 0 ) + return r - i; + i += skip; + } + } + else + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; i <= r; ) + { + int skip = 0; + const_iterator t = text + i + m_patternLength; + const_iterator p = m_pattern + m_patternLength; + for ( int j = m_patternLength; --j >= 0; ) + { + char_type c = *--t; + if ( c != *--p ) + { + // ### N.B.: Could do better with a precomputed pattern mismatch table. + skip = j - m_skipList[uint8( c )]; + if ( skip < 1 ) + skip = 1; + break; + } + } + if ( skip == 0 ) + return i; + i += skip; + } + } + } + else + { + // Use a brute force search for very small patterns. + if ( m_searchLast ) + { + for ( size_type i = endIndex-m_patternLength; ; --i ) + { + const_iterator t = text + i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; ; ++t, ++p ) + { + if ( *t != *p ) + break; + if ( --j == 0 ) + return i; + } + if ( i == startIndex ) + break; + } + } + else + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; ; ++i ) + { + const_iterator t = text + i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; ; ++t, ++p ) + { + if ( *t != *p ) + break; + if ( --j == 0 ) + return i; + } + if ( i == r ) + break; + } + } + } + } + else + { + if ( m_useBoyerMoore ) + { + if ( m_searchLast ) + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; i <= r; ) + { + int skip = 0; + const_iterator t = text + r - i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; --j >= 0; ) + { + char_type c = R::ToCaseFolded( *t++ ); + if ( c != R::ToCaseFolded( *p++ ) ) + { + skip = j - m_skipList[uint8( c )]; + if ( skip < 1 ) + skip = 1; + break; + } + } + if ( skip == 0 ) + return r - i; + i += skip; + } + } + else + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; i <= r; ) + { + int skip = 0; + const_iterator t = text + i + m_patternLength; + const_iterator p = m_pattern + m_patternLength; + for ( int j = m_patternLength; --j >= 0; ) + { + char_type c = R::ToCaseFolded( *--t ); + if ( c != R::ToCaseFolded( *--p ) ) + { + // ### N.B.: Could do better with a precomputed pattern mismatch table. + skip = j - m_skipList[uint8( c )]; + if ( skip < 1 ) + skip = 1; + break; + } + } + if ( skip == 0 ) + return i; + i += skip; + } + } + } + else + { + // Use a brute force search for very small patterns. + if ( m_searchLast ) + { + for ( size_type i = endIndex-m_patternLength; ; --i ) + { + const_iterator t = text + i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; ; ++t, ++p ) + { + if ( R::ToCaseFolded( *t ) != R::ToCaseFolded( *p ) ) + break; + if ( --j == 0 ) + return i; + } + if ( i == startIndex ) + break; + } + } + else + { + for ( size_type i = startIndex, r = endIndex-m_patternLength; ; ++i ) + { + const_iterator t = text + i; + const_iterator p = m_pattern; + for ( int j = m_patternLength; ; ++t, ++p ) + { + if ( R::ToCaseFolded( *t ) != R::ToCaseFolded( *p ) ) + break; + if ( --j == 0 ) + return i; + } + if ( i == r ) + break; + } + } + } + } + return endIndex; + } + + private: + + int m_skipList[ 256 ]; + const_iterator m_pattern; + int m_patternLength; + bool m_caseSensitive : 1; + bool m_searchLast : 1; + bool m_useBoyerMoore : 1; + + void InitSkipList() noexcept + { + ::memset( m_skipList, 0xff, sizeof( m_skipList ) ); // fill with -1 + if ( m_searchLast ) + { + const_iterator p = m_pattern + m_patternLength; + if ( m_caseSensitive ) + for ( int i = 0; i < m_patternLength; ++i ) + m_skipList[uint8( *--p )] = i; + else + for ( int i = 0; i < m_patternLength; ++i ) + m_skipList[uint8( R::ToCaseFolded( *--p ) )] = i; + } + else + { + const_iterator p = m_pattern; + if ( m_caseSensitive ) + for ( int i = 0; i < m_patternLength; ++i ) + m_skipList[uint8( *p++ )] = i; + else + for ( int i = 0; i < m_patternLength; ++i ) + m_skipList[uint8( R::ToCaseFolded( *p++ ) )] = i; + } + } + }; + + // ------------------------------------------------------------------------- + + /*! + * \internal + * \class pcl::GenericString::Data + * \brief Reference-counted string data structure + */ + class PCL_CLASS Data : public ReferenceCounter + { + private: + +#ifndef __PCL_NO_STRING_FREE_LIST + static Data* freeList; //!< Singly-linked list of free string data structures. + static AtomicInt freeLock; //!< Access synchronization for the free list. +#endif + + public: + + iterator string = nullptr; //!< Beginning of the null-terminated string + iterator end = nullptr; //!< End of the string + iterator capacity = nullptr; //!< End of the allocated block or link in free list + allocator alloc; //!< The allocator object + + /*! + * Constructs an empty string data structure. + */ + Data() = default; + + /*! + * Constructs a string of \a len characters. + */ + Data( size_type len ) + { + Allocate( len ); + } + + /*! + * Constructs a string of \a len characters and space allocated for a + * maximum of \a total characters (plus terminating null). + */ + Data( size_type len, size_type total ) + { + Allocate( len, total ); + } + + /*! + * Destroys a string data structure. + */ + ~Data() + { + Deallocate(); + } + + /*! + * Allocates space to store at least \a total characters plus a + * terminating null character, and updates internal pointers to define a + * string of \a len characters. + * + * If \a total < \a len this routine allocates strictly the space + * required to store \a len + 1 characters. Otherwise the allocated block + * will have an optimized length, generally greater than the number + * \a len + 1 of storable characters. + */ + void Allocate( size_type len, size_type total ) + { + total = (len <= total) ? alloc.PagedLength( total+1 ) : len+1; // +1 is room for a null terminating character + string = alloc.Allocate( total ); + capacity = string + total; + SetLength( len ); + } + + /*! + * Allocates space to store at least \a len characters plus a terminating + * null character. This function is a shortcut for Allocate( len, len ). + */ + void Allocate( size_type len ) + { + Allocate( len, len ); + } + + /*! + * Allocates space to store exactly \a total characters plus a + * terminating null character, and updates internal pointers to define a + * string of \a len <= \a total characters. + * + * This routine allocates strictly the space required to store + * \a total + 1 characters without length optimization. + */ + void Reserve( size_type len, size_type total ) + { + PCL_PRECONDITION( len <= total ) + string = alloc.Allocate( total+1 ); + capacity = string + total+1; + SetLength( pcl::Min( len, total ) ); + } + + /*! + * Deallocates string data, yielding an empty structure. + */ + void Deallocate() + { + PCL_CHECK( (string == nullptr) ? end == nullptr : string < end ) + if ( string != nullptr ) + { + alloc.Deallocate( string ); + Reset(); + } + } + + /*! + * Returns true iff a reallocation of string data should happen in order + * to change the string's length to \a len characters. + */ + bool ShouldReallocate( size_type len ) const noexcept + { + size_type m = capacity - string; + return m <= len || alloc.ReallocatedLength( m, len+1 ) < (m >> 1); + } + + /*! + * Sets the length of the string. Arranges internal pointers and writes a + * null string terminating character. + */ + void SetLength( size_type len ) noexcept + { + *(end = (string + len)) = R::Null(); + } + + /*! + * Sets all string pointers to \c nullptr. + */ + void Reset() noexcept + { + string = end = capacity = nullptr; + } + + /*! + * Returns a pointer to a free string data structure, or \c nullptr if + * none is available. The returned structure must be initialized. + * + * This function is thread-safe. + */ +#ifndef __PCL_NO_STRING_FREE_LIST + static Data* NextFree() noexcept + { + if ( freeLock.TestAndSet( 0, 1 ) ) + { + Data* data = freeList; + if ( data != nullptr ) + freeList = reinterpret_cast( data->string ); + freeLock.Store( 0 ); + return data; + } + return nullptr; + } +#endif // !__PCL_NO_STRING_FREE_LIST + + /*! + * Returns a free empty string data structure. Retrieves an existing data + * structure from the internal free list if available, or creates a new + * one otherwise. + * + * This function is thread-safe. + */ + static Data* New() + { +#ifndef __PCL_NO_STRING_FREE_LIST + Data* data = NextFree(); + if ( data != nullptr ) + { + data->string = nullptr; + return data; + } +#endif // !__PCL_NO_STRING_FREE_LIST + return new Data; + } + + /*! + * Returns a free string data structure of the specified length in + * characters. Retrieves an existing data structure from the internal + * free list if available, or creates a new one otherwise. + * + * This function is thread-safe. + */ + static Data* New( size_type len ) + { +#ifndef __PCL_NO_STRING_FREE_LIST + Data* data = NextFree(); + if ( data != nullptr ) + { + data->Allocate( len ); // ### FIXME: If allocation fails, data is a leak. + return data; + } +#endif // !__PCL_NO_STRING_FREE_LIST + return new Data( len ); + } + + /*! + * Returns a free string data structure with the specified length and + * total available space. Retrieves an existing data structure from the + * internal free list if available, or creates a new one otherwise. + * + * This function is thread-safe. + */ + static Data* New( size_type len, size_type total ) + { +#ifndef __PCL_NO_STRING_FREE_LIST + Data* data = NextFree(); + if ( data != nullptr ) + { + data->Allocate( len, total ); // ### FIXME: If allocation fails, data is a leak. + return data; + } +#endif // !__PCL_NO_STRING_FREE_LIST + return new Data( len, total ); + } + + /*! + * Deallocates and disposes a string data structure. If the internal free + * list is available, the deallocated structure is added to the list for + * subsequent reuse. Otherwise the structure is destroyed. + * + * This function is thread-safe. + */ + static void Dispose( Data* data ) + { + PCL_PRECONDITION( data != nullptr ) + PCL_CHECK( data->RefCount() == 0 ) +#ifndef __PCL_NO_STRING_FREE_LIST + if ( freeLock.TestAndSet( 0, 1 ) ) + { + data->Attach(); + data->Deallocate(); + data->string = reinterpret_cast( freeList ); + freeList = data; + freeLock.Store( 0 ); + } + else +#endif // !__PCL_NO_STRING_FREE_LIST + delete data; + } + + /*! + * If the internal free list is available, this function destroys it and + * returns the number of deleted string data structures. Otherwise the + * function has no effect and returns zero. + * + * \note This function is \e not thread-safe. + */ + static size_type DeleteFreeList() + { + size_type count = 0; +#ifndef __PCL_NO_STRING_FREE_LIST + while ( freeList != nullptr ) + { + Data* data = freeList; + freeList = reinterpret_cast( data->string ); + data->string = nullptr; + delete data; + ++count; + } +#endif // !__PCL_NO_STRING_FREE_LIST + return count; + } + }; + + /* + * The reference-counted string data. + */ + Data* m_data = nullptr; +}; + +#ifndef __PCL_NO_STRING_FREE_LIST + +template +typename GenericString::Data* GenericString::Data::freeList = nullptr; + +template +AtomicInt GenericString::Data::freeLock; + +#endif // !__PCL_NO_STRING_FREE_LIST + +/*! + * Exchanges two strings. + */ +template inline +void Swap( GenericString& s1, GenericString& s2 ) noexcept +{ + s1.Swap( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup genericstring_relational_ops GenericString Relational Operators + */ + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff two strings \a s1 and \a s2 are equal. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator ==( const GenericString& s1, const GenericString& s2 ) noexcept +{ + return s1.CompareCodePoints( s2 ) == 0; +} + +/*! + * Returns true iff a string \a s1 is less than a string \a s2. This function + * performs a character-to-character, locale-unaware comparison of numeric + * character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <( const GenericString& s1, const GenericString& s2 ) noexcept +{ + return s1.CompareCodePoints( s2 ) < 0; +} + +/*! + * Returns true iff a string \a s1 is less than or equal to a string \a s2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <=( const GenericString& s1, const GenericString& s2 ) noexcept +{ + return s1.CompareCodePoints( s2 ) <= 0; +} + +/*! + * Returns true iff a string \a s1 is greater than a string \a s2. This + * function performs a character-to-character, locale-unaware comparison of + * numeric character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >( const GenericString& s1, const GenericString& s2 ) noexcept +{ + return s1.CompareCodePoints( s2 ) > 0; +} + +/*! + * Returns true iff a string \a s1 is greater than or equal to a string \a s2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >=( const GenericString& s1, const GenericString& s2 ) noexcept +{ + return s1.CompareCodePoints( s2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff a string \a s1 is equal to a null-terminated string \a t2. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator ==( const GenericString& s1, typename GenericString::const_c_string t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) == 0; +} + +/*! + * Returns true iff a string \a s1 is less than a null-terminated string \a t2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <( const GenericString& s1, typename GenericString::const_c_string t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) < 0; +} + +/*! + * Returns true iff a string \a s1 is less than or equal to a null-terminated + * string \a t2. This function performs a character-to-character, + * locale-unaware comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <=( const GenericString& s1, typename GenericString::const_c_string t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) <= 0; +} + +/*! + * Returns true iff a string \a s1 is greater than a null-terminated string + * \a t2. This function performs a character-to-character, locale-unaware + * comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >( const GenericString& s1, typename GenericString::const_c_string t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) > 0; +} + +/*! + * Returns true iff a string \a s1 is greater than or equal to a + * null-terminated string \a t2. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >=( const GenericString& s1, typename GenericString::const_c_string t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff a null-terminated string \a t1 is equal to a string \a s2. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator ==( typename GenericString::const_c_string t1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) == 0; +} + +/*! + * Returns true iff a null-terminated string \a t1 is less than a string \a s2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <( typename GenericString::const_c_string t1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) > 0; +} + +/*! + * Returns true iff a null-terminated string \a t1 is less than or equal to a + * string \a s2. This function performs a character-to-character, + * locale-unaware comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <=( typename GenericString::const_c_string t1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) >= 0; +} + +/*! + * Returns true iff a null-terminated string \a t1 is greater than a string + * \a s2. This function performs a character-to-character, locale-unaware + * comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >( typename GenericString::const_c_string t1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) < 0; +} + +/*! + * Returns true iff a null-terminated string \a t1 is greater than or equal to + * a string \a s2. This function performs a character-to-character, + * locale-unaware comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >=( typename GenericString::const_c_string t1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff a string \a s1 is equal to a character \a c2. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator ==( const GenericString& s1, typename GenericString::char_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) == 0; +} + +/*! + * Returns true iff a string \a s1 is less than a character \a c2. This + * function performs a character-to-character, locale-unaware comparison of + * numeric character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <( const GenericString& s1, typename GenericString::char_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) < 0; +} + +/*! + * Returns true iff a string \a s1 is less than or equal to a character \a c2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <=( const GenericString& s1, typename GenericString::char_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) <= 0; +} + +/*! + * Returns true iff a string \a s1 is greater than a character \a c2. This + * function performs a character-to-character, locale-unaware comparison of + * numeric character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >( const GenericString& s1, typename GenericString::char_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) > 0; +} + +/*! + * Returns true iff a string \a s1 is greater than or equal to a character + * \a c2. This function performs a character-to-character, locale-unaware + * comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >=( const GenericString& s1, typename GenericString::char_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff a character \a c1 is equal to a string \a s2. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator ==( typename GenericString::char_type c1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) == 0; +} + +/*! + * Returns true iff a character \a c1 is less than a string \a s2. This + * function performs a character-to-character, locale-unaware comparison of + * numeric character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <( typename GenericString::char_type c1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) > 0; +} + +/*! + * Returns true iff a character \a c1 is less than or equal to a string \a s2. + * This function performs a character-to-character, locale-unaware comparison + * of numeric character values. See GenericString<>::CompareCodePoints() for + * more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator <=( typename GenericString::char_type c1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) >= 0; +} + +/*! + * Returns true iff a character \a c1 is greater than a string \a s2. This + * function performs a character-to-character, locale-unaware comparison of + * numeric character values. See GenericString<>::CompareCodePoints() for more + * information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >( typename GenericString::char_type c1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) < 0; +} + +/*! + * Returns true iff a character \a c1 is greater than or equal to a string + * \a s2. This function performs a character-to-character, locale-unaware + * comparison of numeric character values. See + * GenericString<>::CompareCodePoints() for more information. + * \ingroup genericstring_relational_ops + */ +template inline +bool operator >=( typename GenericString::char_type c1, const GenericString& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class IsoString + * \brief Eight-bit string (ISO/IEC-8859-1 or UTF-8 string) + * + * %IsoString derives from a template instantiation of GenericString for the + * \c char type. On the PixInsight platform, %IsoString represents a dynamic + * ISO/IEC-8859-1 string, an 8-bit Unicode Transformation Format (UTF-8) + * string, or even a sequence of ASCII (or Latin-1) characters, depending on + * the context and type of transformations applied. + * + * \sa String + */ +class PCL_CLASS IsoString : public GenericString +{ +public: + + /*! + * Base class of %IsoString. + */ + typedef GenericString + string_base; + + /*! + * Represents a character pertaining to an %IsoString object. + */ + typedef string_base::char_type char_type; + + /*! + * The character traits class used by this template instantiation. + */ + typedef string_base::char_traits char_traits; + + /*! + * The block allocator used by this template instantiation. + */ + typedef string_base::block_allocator block_allocator; + + /*! + * The allocator class used by this template instantiation. + */ + typedef string_base::allocator allocator; + + /*! + * Null-terminated sequence of 8-bit characters. + */ + typedef string_base::c_string c_string; + + /*! + * Immutable null-terminated sequence of 8-bit characters. + */ + typedef string_base::const_c_string const_c_string; + + /*! + * %IsoString iterator. + */ + typedef string_base::iterator iterator; + + /*! + * Immutable %IsoString iterator. + */ + typedef string_base::const_iterator const_iterator; + + /*! + * Reverse %IsoString iterator. + */ + typedef string_base::reverse_iterator reverse_iterator; + + /*! + * Immutable reverse %IsoString iterator. + */ + typedef string_base::const_reverse_iterator const_reverse_iterator; + + /*! + * Represents a Unicode (UTF-16) string. + * \note This type must be defined as the same template instantiation used + * for the String class. + */ + typedef GenericString + ustring_base; + + /*! + * Represents a Unicode (UTF-16) character. + */ + typedef ustring_base::char_type uchar_type; + + /*! + * Unicode (UTF-16) character traits class. + */ + typedef ustring_base::char_traits uchar_traits; + + /*! + * Null-terminated sequence of UTF-16 characters. + */ + typedef ustring_base::c_string c_ustring; + + /*! + * Immutable null-terminated sequence of UTF-16 characters. + */ + typedef ustring_base::const_c_string const_c_ustring; + + /*! + * Unicode (UTF-16) string iterator. + */ + typedef ustring_base::iterator uchar_iterator; + + /*! + * Immutable Unicode (UTF-16) string iterator. + */ + typedef ustring_base::const_iterator const_uchar_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty %IsoString object. + */ + IsoString() = default; + + /*! + * Constructs an %IsoString object as a shallow copy of the specified + * \c string_base string \a s (copy constructor from the base class). + */ + IsoString( const string_base& s ) + : string_base( s ) + { + } + + /*! + * Copy constructor. + */ + IsoString( const IsoString& ) = default; + + /*! + * Constructs an %IsoString object by transferring data from the specified + * \c string_base string \a s (move constructor from the base class). + */ + IsoString( string_base&& s ) + : string_base( std::move( s ) ) + { + } + + /*! + * Move constructor. + */ + IsoString( IsoString&& ) = default; + + /*! + * Constructs an %IsoString as a copy of the specified Unicode string \a s, + * transformed to ISO/IEC-8859-1. Characters in the Unicode string that + * cannot be converted to ISO/IEC-8859-1 (that is, code points greater than + * 0x100) will have undefined values in the 8-bit string. Undefined values + * are represented with question mark characters (?). + */ + explicit + IsoString( const ustring_base& s ) + { + (void)operator =( s ); + } + + /*! + * Constructs an %IsoString as a copy of a null-terminated string \a t. + */ + IsoString( const_c_string t ) + : string_base( t ) + { + } + + /*! + * Constructs an %IsoString with the \a n first characters of the + * null-terminated string \a t, starting from its \a i-th character. + */ + IsoString( const_c_string t, size_type i, size_type n ) + : string_base( t, i, n ) + { + } + + /*! + * Constructs an %IsoString with \a n copies of a character \a c. + */ + IsoString( char_type c, size_type n = 1 ) + : string_base( c, n ) + { + } + + /*! + * Constructs an %IsoString with a copy of the character sequence defined by + * the range [i,j). + */ + IsoString( const_iterator i, const_iterator j ) + : string_base( i, j ) + { + } + + /*! + * Constructs an %IsoString with a copy of the character sequence stored in + * the specified initializer list \a l. + * + * This constructor is equivalent to: + * + * \code IsoString( l.begin(), l.end() ) \endcode + */ + IsoString( std::initializer_list l ) + : IsoString( l.begin(), l.end() ) + { + } + + /*! + * Constructs an %IsoString as a copy of the null-terminated Unicode + * (UTF-16) string \a t, transformed to ISO/IEC-8859-1. + * + * If the specified Unicode string \a t contains characters that cannot be + * converted to ISO/IEC-8859-1 characters, the corresponding characters in + * this string will have undefined values. For conversions from UTF-16 to + * UTF-8, see String::ToUTF8() and String::UTF16ToUTF8(). + */ + explicit + IsoString( const_c_ustring t ) + { + (void)operator =( t ); + } + + /*! + * Constructs an %IsoString with the \a n first characters of the + * null-terminated Unicode (UTF-16) string \a t, starting from its \a i-th + * character, transformed to ISO/IEC-8859-1. + * + * If the specified Unicode string \a t contains characters that cannot be + * converted to ISO/IEC-8859-1 characters, the corresponding characters in + * this string will have undefined values. For conversions from UTF-16 to + * UTF-8, see String::ToUTF8() and String::UTF16ToUTF8(). + */ + IsoString( const_c_ustring t, size_type i, size_type n ); + + /*! + * Constructs an %IsoString with a copy of the bytes stored in the specified + * ByteArray object. + * + * Source unsigned 8-bit integers will be reinterpreted as signed 8-bit + * characters. + */ + explicit + IsoString( const ByteArray& B ) + : IsoString( const_iterator( B.Begin() ), const_iterator( B.End() ) ) + { + } + + /*! + * Constructs an %IsoString as a literal representation of a \c bool value. + */ + explicit + IsoString( bool x ) + : string_base( x ? "true" : "false" ) + { + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c signed \c short value. + */ + explicit + IsoString( short x ) + { + (void)Format( "%hd", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of an + * \c unsigned \c short value. + */ + explicit + IsoString( unsigned short x ) + { + (void)Format( "%hu", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c signed \c int value. + */ + explicit + IsoString( int x ) + { + (void)Format( "%i", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of an + * \c unsigned \c int value. + */ + explicit + IsoString( unsigned int x ) + { + (void)Format( "%u", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c signed \c long value. + */ + explicit + IsoString( long x ) + { + (void)Format( "%ld", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of an + * \c unsigned \c long value. + */ + explicit + IsoString( unsigned long x ) + { + (void)Format( "%lu", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c signed \c long \c long value. + */ + explicit + IsoString( long long x ) + { + (void)Format( "%lli", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of an + * \c unsigned \c long \c long value. + */ + explicit + IsoString( unsigned long long x ) + { + (void)Format( "%llu", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c float value. + */ + explicit + IsoString( float x ) + { + (void)Format( "%.7g", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c double value. + */ + explicit + IsoString( double x ) + { + (void)Format( "%.16g", x ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c long \c double value. + */ + explicit + IsoString( long double x ) + { +#ifdef _MSC_VER + (void)Format( "%.16Lg", x ); +#else + (void)Format( "%.18Lg", x ); +#endif + } + +#ifndef __PCL_NO_STRING_COMPLEX + + /*! + * Constructs an %IsoString as a literal representation of an + * \c fcomplex value. + */ + explicit + IsoString( Complex& x ) + { + (void)Format( "{%.7g,%.7g}", x.Real(), x.Imag() ); + } + + /*! + * Constructs an %IsoString as a literal representation of a + * \c dcomplex value. + */ + explicit + IsoString( Complex& x ) + { + (void)Format( "{%.16g,%.16g}", x.Real(), x.Imag() ); + } + + /*! + * Constructs an %IsoString as a literal representation of an + * \c lcomplex value. + */ + explicit + IsoString( Complex& x ) + { +#ifdef _MSC_VER + (void)Format( "{%.16Lg,%.16Lg}", x.Real(), x.Imag() ); +#else + (void)Format( "{%.18Lg,%.18Lg}", x.Real(), x.Imag() ); +#endif + } + +#endif // !__PCL_NO_STRING_COMPLEX + +#ifdef __PCL_QT_INTERFACE + + explicit + IsoString( const QString& qs ) + : string_base( qs.isEmpty() ? iterator( nullptr ) : iterator( PCL_GET_CHARPTR_FROM_QSTRING( qs ) ) ) + { + } + + explicit + IsoString( const QByteArray& qb ) + : string_base( qb.isEmpty() ? iterator( nullptr ) : iterator( PCL_GET_CHARPTR_FROM_QBYTEARRAY( qb ) ) ) + { + } + + explicit + IsoString( const QDate& qd ) + : string_base( iterator( PCL_GET_CHARPTR_FROM_QSTRING( qd.toString( PCL_QDATE_FMT_STR ) ) ) ) + { + } + + explicit + IsoString( const QDateTime& qdt ) + : string_base( iterator( PCL_GET_CHARPTR_FROM_QSTRING( qdt.toString( PCL_QDATETIME_FMT_STR ) ) ) ) + { + } + +#endif + + // ------------------------------------------------------------------------- + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + IsoString& operator =( const IsoString& s ) + { + Assign( s ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + IsoString& operator =( IsoString&& s ) + { + Transfer( s ); + return *this; + } + + /*! + * Assigns a shallow copy of the \c string_base string \a s to this string. + * Returns a reference to this object. + */ + IsoString& operator =( const string_base& s ) + { + Assign( s ); + return *this; + } + + /*! + * Transfers the data from the \c string_base string \a s to this string + * (move assignment from base class). Returns a reference to this object. + */ + IsoString& operator =( string_base&& s ) + { + Transfer( s ); + return *this; + } + + /*! + * Assigns a copy of the Unicode string \a s (UTF-16) to this string, after + * converting source UTF-16 characters to ISO/IEC-8859-1 characters. Returns + * a reference to this object. + * + * If the specified UTF-16 string contains characters that cannot be + * converted to ISO/IEC-8859-1, the corresponding characters in this string + * will have undefined values. For conversions from UTF-16 to UTF-8, see + * String::ToUTF8() and String::UTF16ToUTF8(). + */ + IsoString& operator =( const ustring_base& s ) + { + return operator =( s.Begin() ); + } + + /*! + * Assigns a copy of the null-terminated string \a t to this string. Returns + * a reference to this object. + */ + IsoString& operator =( const_c_string t ) + { + Assign( t ); + return *this; + } + + /*! + * Assigns a single copy of a character \a c to this string. Returns a + * reference to this object. + */ + IsoString& operator =( char_type c ) + { + Assign( c, 1 ); + return *this; + } + + /*! + * Assigns a copy of the null-terminated Unicode string \a s (UTF-16) to + * this string, after converting source UTF-16 characters to ISO/IEC-8859-1 + * characters. Returns a reference to this object. + * + * If the specified UTF-16 string contains characters that cannot be + * converted to ISO/IEC-8859-1, the corresponding characters in this string + * will have undefined values. For conversions from UTF-16 to UTF-8, see + * String::ToUTF8() and String::UTF16ToUTF8(). + */ + IsoString& operator =( const_c_ustring t ); + +#ifdef __PCL_QT_INTERFACE + + IsoString& operator =( const QString& qs ) + { + if ( qs.isEmpty() ) + Clear(); + else + Assign( PCL_GET_CHARPTR_FROM_QSTRING( qs ) ); + return *this; + } + + IsoString& operator =( const QByteArray& qb ) + { + if ( qb.isEmpty() ) + Clear(); + else + Assign( PCL_GET_CHARPTR_FROM_QBYTEARRAY( qb ) ); + return *this; + } + + IsoString& operator =( const QDate& qd ) + { + Assign( PCL_GET_CHARPTR_FROM_QSTRING( qd.toString( PCL_QDATE_FMT_STR ) ) ); + return *this; + } + + IsoString& operator =( const QDateTime& qdt ) + { + Assign( PCL_GET_CHARPTR_FROM_QSTRING( qdt.toString( PCL_QDATETIME_FMT_STR ) ) ); + return *this; + } + +#endif + + // ------------------------------------------------------------------------- + + IsoString SetToLength( size_type n ) const + { + return string_base::SetToLength( n ); + } + + IsoString ResizedToNullTerminated() const + { + return string_base::ResizedToNullTerminated(); + } + + IsoString Squeezed() const + { + return string_base::Squeezed(); + } + + // ------------------------------------------------------------------------- + + IsoString Substring( size_type i, size_type n = maxPos ) const + { + return string_base::Substring( i, n ); + } + + IsoString Left( size_type n ) const + { + return string_base::Left( n ); + } + + IsoString Right( size_type n ) const + { + return string_base::Right( n ); + } + + IsoString Suffix( size_type i ) const + { + return string_base::Suffix( i ); + } + + IsoString Prefix( size_type i ) const + { + return string_base::Prefix( i ); + } + + // ------------------------------------------------------------------------- + + IsoString Trimmed() const + { + return string_base::Trimmed(); + } + + IsoString TrimmedLeft() const + { + return string_base::TrimmedLeft(); + } + + IsoString TrimmedRight() const + { + return string_base::TrimmedRight(); + } + + // ------------------------------------------------------------------------- + + IsoString LeftJustified( size_type width, char_type fill = IsoCharTraits::Blank() ) const + { + return string_base::LeftJustified( width, fill ); + } + + IsoString RightJustified( size_type width, char_type fill = IsoCharTraits::Blank() ) const + { + return string_base::RightJustified( width, fill ); + } + + IsoString CenterJustified( size_type width, char_type fill = IsoCharTraits::Blank() ) const + { + return string_base::CenterJustified( width, fill ); + } + + // ------------------------------------------------------------------------- + + IsoString Enclosed( char_type c ) const + { + return string_base::Enclosed( c ); + } + + IsoString SingleQuoted() const + { + return string_base::SingleQuoted(); + } + + IsoString DoubleQuoted() const + { + return string_base::DoubleQuoted(); + } + + IsoString Unquoted() const + { + return string_base::Unquoted(); + } + + // ------------------------------------------------------------------------- + + IsoString CaseFolded() const + { + return string_base::CaseFolded(); + } + + IsoString Lowercase() const + { + return string_base::Lowercase(); + } + + IsoString Uppercase() const + { + return string_base::Uppercase(); + } + + // ------------------------------------------------------------------------- + + IsoString Reversed() const + { + return string_base::Reversed(); + } + + IsoString Sorted() const + { + return string_base::Sorted(); + } + + template + IsoString Sorted( BP p ) const + { + return string_base::Sorted( p ); + } + + // ------------------------------------------------------------------------- + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * character. Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, char_type separator ) + { + Clear(); + return c.ToSeparated( *this, separator ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * character, and built using an \a append binary function. Returns a + * reference to this string. + * + * The binary function must be of the form: + * + * \code void append( IsoString& s, char c ); \endcode + * + * where \a c is being appended to \a s. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, char_type separator, AF append ) + { + Clear(); + return c.ToSeparated( *this, separator, append ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator string. + * Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, const IsoString& separator ) + { + Clear(); + return c.ToSeparated( *this, separator ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator string, + * and built using an \a append binary function. Returns a reference to this + * string. + * + * The binary function must be of the form: + * + * \code void append( IsoString& s1, const IsoString& s2 ); \endcode + * + * where \a s2 is being appended to \a s1. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, const IsoString& separator, AF append ) + { + Clear(); + return c.ToSeparated( *this, separator, append ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated string. Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, const_c_string separator ) + { + return ToSeparated( c, IsoString( separator ) ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated string, and built using an \a append binary function. + * Returns a reference to this string. + * + * The binary function must be of the form: + * + * \code void append( IsoString& s1, const char* s2 ); \endcode + * + * where \a s2 is being appended to \a s1. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + IsoString& ToSeparated( const C& c, const_c_string separator, AF append ) + { + return ToSeparated( c, IsoString( separator ), append ); + } + + /*! + * Replaces the contents of this string with a sequence of comma-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, ',' ); \endcode + */ + template + IsoString& ToCommaSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Comma() ); + } + + /*! + * Replaces the contents of this string with a sequence of colon-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, ':' ); \endcode + */ + template + IsoString& ToColonSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Colon() ); + } + + /*! + * Replaces the contents of this string with a sequence of space-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, ' ' ); \endcode + */ + template + IsoString& ToSpaceSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Blank() ); + } + + /*! + * Replaces the contents of this string with a sequence of + * tabulator-separated tokens extracted from a container \a c. Returns a + * reference to this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, '\t' ); \endcode + */ + template + IsoString& ToTabSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Tab() ); + } + + /*! + * Replaces the contents of this string with a sequence of new line + * separated tokens extracted from a container \a c. Returns a reference to + * this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, '\n' ); \endcode + */ + template + IsoString& ToNewLineSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::LF() ); + } + + /*! + * Replaces the contents of this string with a sequence of null-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, '\0' ); \endcode + */ + template + IsoString& ToNullSeparated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Null() ); + } + + /*! + * Replaces the contents of this string with a hyphenated sequence of tokens + * extracted from a container \a c. Returns a reference to this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, '-' ); \endcode + */ + template + IsoString& ToHyphenated( const C& c ) + { + return ToSeparated( c, IsoCharTraits::Hyphen() ); + } + + // ------------------------------------------------------------------------- + + /*! + * Replaces all occurrences of HTML special characters in this string with + * valid HTML entities. Returns a reference to this string. + * + * The following replacements are performed: + * + * '&' (ampersand) becomes "\&" \n + * '"' (double quote) becomes "\"" \n + * "'" (single quote) becomes "\'" \n + * '<' (less than) becomes "\<" \n + * '>' (greater than) becomes "\>" + * + * \sa EncodedHTMLSpecialChars(), ToDecodedHTMLSpecialChars() + */ + IsoString& ToEncodedHTMLSpecialChars(); + + /*! + * Returns a duplicate of this string with all occurrences of HTML special + * characters replaced with valid HTML entities. + * + * \sa ToEncodedHTMLSpecialChars(), DecodedHTMLSpecialChars() + */ + IsoString EncodedHTMLSpecialChars() const + { + return IsoString( *this ).ToEncodedHTMLSpecialChars(); + } + + /*! + * Replaces all occurrences of special HTML entities in this string with + * their corresponding plain text character equivalents. Returns a reference + * to this string. + * + * The following replacements are performed: + * + * "\&" (ampersand) becomes '&' \n + * "\"" (double quote) becomes '"' \n + * "\'" (single quote) becomes "'" \n + * "\'" (apostrophe) becomes "'" \n + * "\<" (less than) becomes '<' \n + * "\>" (greater than) becomes '>' + * + * \sa DecodedHTMLSpecialChars(), ToEncodedHTMLSpecialChars() + */ + IsoString& ToDecodedHTMLSpecialChars(); + + /*! + * Returns a duplicate of this string with all occurrences of special HTML + * entities replaced with their corresponding plain text character + * equivalents. + * + * \sa ToDecodedHTMLSpecialChars(), EncodedHTMLSpecialChars() + */ + IsoString DecodedHTMLSpecialChars() const + { + return IsoString( *this ).ToDecodedHTMLSpecialChars(); + } + + /*! + * Returns a URL-encoded string that represents a binary \a data block of + * the specified \a length in bytes. + * + * In a URL-encoded string, all characters that are not a-z, A-Z, 0-9, '-', + * '.', '_' or '~' are replaced with their percent-encoded representation + * %NN, where NN is a zero-padded, two-digit uppercase hexadecimal number. + * See RFC 3986 (http://tools.ietf.org/html/rfc3986). + * + * \sa ToURLEncoded( const C& ), ToURLEncoded() + */ + static IsoString ToURLEncoded( const void* data, size_type length ); + + /*! + * Returns a URL-encoded string for a container \a c, whose contents are + * treated as raw binary data. The objects stored in the container + * are considered as a sequence of bytes, irrespective of their actual data + * types or the classes they are instances of. + * + * The type C represents an array of contiguous objects, and must provide + * PCL container semantics: the Begin() and Length() standard container + * functions are required. + * + * \sa ToURLEncoded( const void*, size_type ) + */ + template + static IsoString ToURLEncoded( const C& c ) + { + return ToURLEncoded( c.Begin(), c.Length()*sizeof( *c.Begin() ) ); + } + + /*! + * Replaces all characters that are not a-z, A-Z, 0-9, '-', '.', '_' or '~' + * with their percent-encoded representation %NN, where NN is a zero-padded, + * two-digit uppercase hexadecimal number. Returns a reference to this + * string. See RFC 3986 / URI Generic Syntax, for more information on URL + * encodings. + * + * \sa URLEncoded(), ToURLDecoded() + */ + IsoString& ToURLEncoded(); + + /*! + * Returns a URL-encoded duplicate of this string. See ToURLEncoded() for + * detailed information. + * + * \sa ToURLEncoded(), URLDecoded() + */ + IsoString URLEncoded() const + { + return IsoString( *this ).ToURLEncoded(); + } + + /*! + * Decodes a URL-encoded string stored as a raw \a data vector of the + * specified \a length in bytes. Returns the decoded binary raw data as a + * ByteArray object. + * + * This function replaces all percent-encoded character representations in + * the specified \a data vector with their actual characters in the output + * array. + * + * \sa FromURLEncoded(), ToURLEncoded( const void*, size_type ) + */ + static ByteArray FromURLEncoded( const void* data, size_type length ); + + /*! + * Decodes a URL-encoded generic string represented as a container \a c. + * Returns the decoded binary raw data as a ByteArray object. + * + * \sa FromURLEncoded( const void*, size_type ), + * ToURLEncoded( const void*, size_type ) + */ + template + static ByteArray FromURLEncoded( const C& c ) + { + return FromURLEncoded( c.Begin(), c.Length()*sizeof( *c.Begin() ) ); + } + + /*! + * Decodes this URL-encoded string, and returns the decoded binary raw data + * as a ByteArray object. + * + * This function replaces all percent-encoded character representations in + * this string with their actual characters in the output array. + * + * If this string is empty, this function returns an empty %ByteArray. + * + * \sa FromURLEncoded( const void*, size_type ), ToURLEncoded() + */ + ByteArray FromURLEncoded() const + { + return FromURLEncoded( Begin(), Length() ); + } + + /*! + * Decodes a URL-encoded string stored as a raw \a data vector of the + * specified \a length in bytes. Returns the decoded data stored as an 8-bit + * string. + * + * This function replaces all percent-encoded character representations in + * the specified \a data vector with their actual characters in the output + * string. + * + * \sa ToURLDecoded(), URLDecoded() + */ + static IsoString ToURLDecoded( const void* data, size_type length ); + + /*! + * Decodes a URL-encoded generic string represented as a container \a c. + * Returns the decoded data stored as an 8-bit string. + * + * \sa ToURLDecoded( const void*, size_type ), ToURLDecoded(), URLDecoded() + */ + template + static IsoString ToURLDecoded( const C& c ) + { + return ToURLDecoded( c.Begin(), c.Length()*sizeof( *c.Begin() ) ); + } + + /*! + * Replaces all percent-encoded representations of characters with their + * actual characters. Returns a reference to this string. + * + * This is the reverse transformation to URL encoding. See ToURLEncoded() + * for more information. + * + * \sa URLDecoded(), ToURLEncoded(), FromURLEncoded() + */ + IsoString& ToURLDecoded(); + + /*! + * Returns a URL-decoded duplicate of this string. See ToURLDecoded() for + * detailed information. + * + * \sa ToURLDecoded(), URLEncoded() + */ + IsoString URLDecoded() const + { + return IsoString( *this ).ToURLDecoded(); + } + + // ------------------------------------------------------------------------- + +#ifdef __PCL_QT_INTERFACE + + operator QString() const + { + return QString( c_str() ); + } + + operator QByteArray() const + { + return QByteArray( c_str() ); + } + + operator QDate() const + { + return QDate::fromString( c_str(), PCL_QDATE_FMT_STR ); + } + + operator QDateTime() const + { + return QDateTime::fromString( c_str(), PCL_QDATETIME_FMT_STR ); + } + +#endif + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + IsoString& Format( const_c_string fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)VFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Appends a formatted representation of a variable-length set of values to + * the current contents of this string. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + IsoString& AppendFormat( const_c_string fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)AppendVFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values, specified as a \c va_list standard + * parameter list. Returns the number of characters generated. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int VFormat( const_c_string fmt, va_list paramList ); + + /*! + * Appends a formatted representation of a variable-length set of values, + * specified as a \c va_list standard parameter list, to the current + * contents of this string. Returns the number of characters appended. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int AppendVFormat( const_c_string fmt, va_list paramList ); + + // ------------------------------------------------------------------------- + + /*! + * Returns a UTF-16 string with a converted copy of this %IsoString object. + * + * This function assumes that this %IsoString object contains only valid + * ISO/IEC-8859-1 characters. To perform UTF-8 to UTF-16 conversions, see + * UTF8ToUTF16() and MBSToWCS(). + * + * \sa UTF8ToUTF16(), MBSToWCS() + */ + ustring_base ToString() const + { + ustring_base s; + s.SetLength( Length() ); + uchar_iterator p = s.Begin(); + for ( const_iterator i = m_data->string; i < m_data->end; ++p, ++i ) + *p = uchar_type( *i ); + return s; + } + + /*! + * Returns a UTF-16 string with a representation of a subset of \a n + * contiguous UTF-8 characters from this %IsoString object, starting at the + * \a i-th character. + * + * \sa ToString(), MBSToWCS() + */ + ustring_base UTF8ToUTF16( size_type i = 0, size_type n = maxPos ) const; // implemented inline after String + + /*! + * Returns a copy of this multibyte string converted to a UTF-16 + * string. This conversion is dependent on the current locale. + * + * In the event of conversion error (if there are invalid multibyte + * characters in the source string) this routine returns an empty string. + * + * This member function is a convenience wrapper for the mbstowcs() routine + * of the standard C runtime library. Note that on platforms where the size + * of wchar_t is four bytes (e.g. Linux) this routine performs an additional + * conversion from UTF-32 to UTF-16. On platforms where the size of wchar_t + * is two bytes (e.g. Windows), the conversion is direct. + * + * \sa UTF8ToUTF16(), ToString() + */ + ustring_base MBSToWCS() const; + +#ifdef __PCL_QT_INTERFACE + + QString ToQString() const + { + return operator QString(); + } + + QByteArray ToQByteArray() const + { + return operator QByteArray(); + } + + QDate ToQDate() const + { + return operator QDate(); + } + + QDateTime ToQDateTime() const + { + return operator QDateTime(); + } + +#endif + + /*! + * Evaluates this string as a Boolean literal, and returns the result as a + * \c bool value. + * + * Returns \c true if this string is equal to "1", "true", "TRUE" or "T". + * Returns \c false if this string is equal to "0", "false", "FALSE" or "F". + * Otherwise this function throws a ParseError exception. + * + * \sa TryToBool() + */ + bool ToBool() const; + + /*! + * Attempts to evaluate this string as a Boolean literal. + * + * If this string can legally be converted to a Boolean value, this function + * returns \c true and stores the evaluation result in the \a value + * variable. A string can only be converted to Boolean type if it is equal + * to either "1", "true", "TRUE", "T", "0", "false", "FALSE" or "F". + * + * If this string cannot be converted to a Boolean value, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToBool() + */ + bool TryToBool( bool& value ) const noexcept; + + /*! + * Evaluates this string as a floating point numeric literal, and returns + * the result as a \c float value. + * + * For information about the legal syntax of a floating point literal, see + * the documentation for the ToDouble() member function. + * + * If this string doesn't contain a valid floating point literal, or if the + * range of \c float is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToFloat() + */ + float ToFloat() const; + + /*! + * Attempts to evaluate this string as a floating point numeric literal. + * + * If this string can legally be converted to a floating point number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. For information about the legal syntax of a floating point + * literal, see the documentation for the ToDouble() member function. + * + * If this string cannot be converted to a floating point number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToFloat() + */ + bool TryToFloat( float& value ) const noexcept; + + /*! + * Evaluates this string as a floating point literal, and returns the result + * as a \c double value. + * + * The source string is expected to have the following format (informal + * format specification): + * + * [+|-][\][.[\]][\[+|-]\] + * + * where \ and \ are optional sequences of + * decimal digits from 0 to 9, \ is an exponent specifier + * (the letter 'e' (or 'E')), and \ is a sequence of decimal + * digits specifying a power of ten that multiplies the preceding numeric + * constant. At least a one-digit integer part, or a one-digit decimal part, + * is mandatory. FORTRAN exponent specifiers ('d' and 'f' (or 'D' and 'F')) + * are also recognized by this implementation. + * + * If this string doesn't contain a valid floating point literal, or if the + * range of \c double is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToDouble() + */ + double ToDouble() const; + + /*! + * Attempts to evaluate this string as a floating point numeric literal. + * + * If this string can legally be converted to a floating point number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. For information about the legal syntax of a floating point + * literal, see the documentation for the ToDouble() member function. + * + * If this string cannot be converted to a floating point number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToDouble() + */ + bool TryToDouble( double& value ) const noexcept; + + /*! + * Evaluates this string as an integer literal, and returns the result as a + * \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code long n = s.ToInt( 0 ); \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string doesn't contain a valid integer literal, or if the range + * of \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToInt() + */ + long ToInt() const + { + return ToInt( 0 ); + } + + /*! + * Attempts to evaluate this string as an integer numeric literal. + * + * If this string can legally be converted to an integer number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * int v; + * if ( s.TryToInt( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToInt() + */ + bool TryToInt( int& value ) const noexcept + { + return TryToInt( value, 0 ); + } + + /*! + * Evaluates this string as an integer literal in the specified \a base, and + * returns the result as a \c long value. + * + * If \a base is 0, the source string is expected to represent either a + * decimal constant, an octal constant, or a hexadecimal constant, any of + * which optionally preceded by a sign character (+ or -). A decimal + * constant begins with a non-zero digit, and consists of a sequence of + * decimal digits from '0' to '9'. An octal begins with the prefix '0', + * optionally followed by a sequence of the digits 0 to 7 only. A + * hexadecimal constant begins with the prefix '0x' or '0X', which must be + * followed by a sequence of decimal digits and letters from 'a' (or 'A') + * to 'f' (or 'F'), whose corresponding decimal values are from 10 to 15, + * respectively. + * + * Other legal values of \a base, from 2 to 36, specify the expected base of + * the integer constant represented by the source string. Decimal digits and + * letters from 'a' (or 'A') to 'z' (or 'Z') are used to represent all + * possible digits in the specified base, as necessary. + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of \c long + * is exceeded, this member function throws a ParseError exception. + * + * \sa TryToInt( int&, int ) const + */ + long ToInt( int base ) const; + + /*! + * Attempts to evaluate this string as an integer numeric literal in the + * specified \a base. + * + * If this string can legally be converted to an integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number in the specified + * \a base, this function returns \c false and does not change the \a value + * variable. This function does not throw any exception. + * + * \sa ToInt( int ) const + */ + bool TryToInt( int& value, int base ) const noexcept; + + /*! + * Evaluates this string as an unsigned integer literal, and returns the + * result as an \c unsigned \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code unsigned long n = s.ToUInt( 0 ); \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string doesn't contain a valid unsigned integer literal, or if + * the range of \c unsigned \c long is exceeded, this member function throws + * a ParseError exception. + * + * \sa TryToUInt() + */ + unsigned long ToUInt() const + { + return ToUInt( 0 ); + } + + /*! + * Attempts to evaluate this string as an unsigned integer literal. + * + * If this string can legally be converted to an unsigned integer number, + * this function returns \c true and stores the evaluation result in the + * \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * unsigned v; + * if ( s.TryToUInt( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToUInt() + */ + bool TryToUInt( unsigned& value ) const noexcept + { + return TryToUInt( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). The only exception + * is that for this member function, only a + sign is legal preceding the + * numeric constant represented by the source string. + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of + * \c unsigned \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToUInt( unsigned&, int ) const + */ + unsigned long ToUInt( int base ) const; + + /*! + * Attempts to evaluate this string as an unsigned integer literal in the + * specified \a base. + * + * If this string can legally be converted to an unsigned integer number in + * the specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * See the documentation under ToUInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an unsigned integer number in the + * specified \a base, this function returns \c false and does not change the + * \a value variable. This function does not throw any exception. + * + * \sa ToUInt( int ) const + */ + bool TryToUInt( unsigned& value, int base ) const noexcept; + + /*! + * Evaluates this string as an integer literal, and returns the result as a + * \c long \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code long long n = s.ToInt64( 0 ); \endcode + * + * If this string doesn't contain a valid integer literal, or if the range + * of \c long \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToInt64() + */ + long long ToInt64() const + { + return ToInt64( 0 ); + } + + /*! + * Attempts to evaluate this string as a 64-bit integer numeric literal in + * the specified \a base. + * + * If this string can legally be converted to a 64-bit integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * long long v; + * if ( s.TryToInt64( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to a 64-bit integer number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToInt64() + */ + bool TryToInt64( long long& value ) const noexcept + { + return TryToInt64( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as a \c long \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of + * \c long \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToInt64( long long&, int ) const + */ + long long ToInt64( int base ) const; + + /*! + * Attempts to evaluate this string as a 64-bit integer numeric literal in + * the specified \a base. + * + * If this string can legally be converted to a 64-bit integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string cannot be converted to a 64-bit integer number in the + * specified \a base, this function returns \c false and does not change the + * \a value variable. This function does not throw any exception. + * + * \sa ToInt64( int ) const + */ + bool TryToInt64( long long& value, int base ) const noexcept; + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code unsigned long long n = s.ToUInt64( 0 ); \endcode + * + * If this string doesn't contain a valid unsigned integer literal, or if + * the range of \c unsigned \c long \c long is exceeded, this member + * function throws a ParseError exception. + * + * \sa TryToUInt64() + */ + unsigned long long ToUInt64() const + { + return ToUInt64( 0 ); + } + + /*! + * Attempts to evaluate this string as a 64-bit unsigned integer numeric + * literal in the specified \a base. + * + * If this string can legally be converted to a 64-bit unsigned integer + * number in the specified \a base, this function returns \c true and stores + * the evaluation result in the \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * unsigned long long v; + * if ( s.TryToUInt64( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to a 64-bit unsigned integer number, + * this function returns \c false and does not change the \a value variable. + * This function does not throw any exception. + * + * \sa ToUInt64() + */ + bool TryToUInt64( unsigned long long& value ) const noexcept + { + return TryToUInt64( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string doesn't contain a valid unsigned integer literal in the + * specified \a base, if an illegal \a base is specified, or if the range of + * \c unsigned \c long \c long is exceeded, this member function throws a + * ParseError exception. + * + * \sa TryToUInt64( unsigned long long&, int ) const + */ + unsigned long long ToUInt64( int base ) const; + + /*! + * Attempts to evaluate this string as an unsigned 64-bit integer numeric + * literal in the specified \a base. + * + * If this string can legally be converted to an unsigned 64-bit integer + * number in the specified \a base, this function returns \c true and stores + * the evaluation result in the \a value variable. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string cannot be converted to an unsigned 64-bit integer number + * in the specified \a base, this function returns \c false and does not + * change the \a value variable. This function does not throw any exception. + * + * \sa ToUInt64( int ) const + */ + bool TryToUInt64( unsigned long long& value, int base ) const noexcept; + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * and returns the result as a \c double value. + * + * The source string is expected to have the following format: + * + * [+|-]\[\\[\\]][.[\]] + * + * where \, \, \ and \ are sequences of + * decimal digits from 0 to 9, and \ is any sequence of characters + * specified as the \a separator argument. The default separator is the + * colon character, ':'. + * + * The result is equal to: + * + * \ * (\ + \/60 + \/3600) + * + * where omitted optional components are taken as zero, and \ is -1 + * iff a minus sign '-' leads the representation, or +1 otherwise. + * + * If this string doesn't contain a valid sexagesimal numeric literal, or if + * the range of \c double is exceeded, this member function throws a + * ParseError exception. + * + * \ingroup sexagesimal_conversion + * \sa TrySexagesimalToDouble(), ParseSexagesimal(), TryParseSexagesimal() + */ + double SexagesimalToDouble( const IsoString& separator = ':' ) const + { + int sign, s1, s2; double s3; + ParseSexagesimal( sign, s1, s2, s3, separator ); + return sign*(s1 + (s2 + s3/60)/60); + } + + double SexagesimalToDouble( char separator ) const + { + return SexagesimalToDouble( IsoString( separator ) ); + } + + double SexagesimalToDouble( const ustring_base& separator ) const + { + return SexagesimalToDouble( IsoString( separator ) ); + } + + /*! + * Evaluates this string as a sexagesimal numeric literal representation + * with the specified set of \a separators, and returns the result as a + * \c double value. + * + * This function is identical to SexagesimalToDouble( const IsoString& ), + * but a set of separator characters is specified as a dynamic array. Any + * occurrence of a character contained by \a separators will be valid as a + * token separator. + * + * \ingroup sexagesimal_conversion + * \sa TrySexagesimalToDouble( double&, const Array<>& ) + */ + double SexagesimalToDouble( const Array& separators ) const + { + int sign, s1, s2; double s3; + ParseSexagesimal( sign, s1, s2, s3, separators ); + return sign*(s1 + (s2 + s3/60)/60); + } + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal with + * the specified \a separator. + * + * If this string can legally be evaluated as a sexagesimal literal and + * converted to a floating point number, this function stores the evaluation + * result in the specified \a value variable and returns \c true. For + * information about the legal syntax of a sexagesimal literal, see the + * documentation for SexagesimalToDouble(). + * + * If this string cannot be evaluated as a sexagesimal literal, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble(), ParseSexagesimal(), TryParseSexagesimal() + */ + bool TrySexagesimalToDouble( double& value, const IsoString& separator = ':' ) const noexcept + { + int sign, s1, s2; double s3; + if ( TryParseSexagesimal( sign, s1, s2, s3, separator ) ) + { + value = sign*(s1 + (s2 + s3/60)/60); + return true; + } + return false; + } + + bool TrySexagesimalToDouble( double& value, char separator ) const noexcept + { + return TrySexagesimalToDouble( value, IsoString( separator ) ); + } + + bool TrySexagesimalToDouble( double& value, const ustring_base& separator ) const noexcept + { + return TrySexagesimalToDouble( value, IsoString( separator ) ); + } + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal with + * the specified set of \a separators. + * + * This function is identical to + * TrySexagesimalToDouble( double&, const IsoString& ), but a set of + * separator characters is specified as a dynamic array. Any occurrence of a + * character contained by \a separators will be valid as a token separator. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble( const Array<>& ) + */ + bool TrySexagesimalToDouble( double& value, const Array& separators ) const noexcept + { + int sign, s1, s2; double s3; + if ( TryParseSexagesimal( sign, s1, s2, s3, separators ) ) + { + value = sign*(s1 + (s2 + s3/60)/60); + return true; + } + return false; + } + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * using the specified \a separator, and stores the resulting components in + * the specified \a sign, \a s1, \a s2 and \a s3 variables. + * + * The output value of \a sign is either -1 or +1, respectively for negative + * and positive values. + * + * For information about the legal syntax of a sexagesimal literal, see the + * documentation for SexagesimalToDouble(). + * + * This function stores \e canonical minutes and seconds components, + * irrespective of the actual component values represented by this string. + * The output sexagesimal component values are such that: + * + * 0 ≤ \a s1 \n + * 0 ≤ \a s2 < 60 \n + * 0 ≤ \a s3 < 60 \n + * + * If this string doesn't contain a valid sexagesimal numeric literal, or if + * the range of \c double is exceeded, this member function throws a + * ParseError exception. + * + * \ingroup sexagesimal_conversion + * \sa TryParseSexagesimal(), SexagesimalToDouble(), TrySexagesimalToDouble() + */ + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const IsoString& separator = ':' ) const; + + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, char separator ) const + { + ParseSexagesimal( sign, s1, s2, s3, IsoString( separator ) ); + } + + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const ustring_base& separator ) const + { + ParseSexagesimal( sign, s1, s2, s3, IsoString( separator ) ); + } + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * using the specified set of \a separators, and stores the resulting + * components in the specified \a sign, \a s1, \a s2 and \a s3 variables. + * + * This function is identical to + * ParseSexagesimal( int&, int&, int&, double&, const IsoString& ), but a + * set of separator characters is specified as a dynamic array. Any + * occurrence of a character contained by \a separators will be valid as a + * token separator. + * + * \ingroup sexagesimal_conversion + * \sa TryParseSexagesimal( int&, int&, int&, double&, const Array<>& ) + */ + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const Array& separators ) const; + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal + * representation, using the specified \a separator. If successful, stores + * the resulting components in the specified \a sign, \a s1, \a s2 and \a s3 + * variables, and returns \c true. For more information on syntax and + * output values and ranges, see the documentation for ParseSexagesimal(). + * + * If this string cannot be evaluated as a sexagesimal literal, this + * function returns \c false and does not change any of the \a sign, \a s1, + * \a s2 and \a s3 variables. This function does not throw any exception. + * + * \ingroup sexagesimal_conversion + * \sa ParseSexagesimal(), SexagesimalToDouble(), TrySexagesimalToDouble() + */ + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const IsoString& separator = ':' ) const noexcept; + + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, char separator ) const noexcept + { + return TryParseSexagesimal( sign, s1, s2, s3, IsoString( separator ) ); + } + + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const ustring_base& separator ) const noexcept + { + return TryParseSexagesimal( sign, s1, s2, s3, IsoString( separator ) ); + } + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal + * representation, using the specified set of \a separators. + * + * This function is identical to + * TryParseSexagesimal( int&, int&, int&, double&, const IsoString& ), but a + * set of separator characters is specified as a dynamic array. Any + * occurrence of a character contained by \a separators will be valid as a + * token separator. + * + * \ingroup sexagesimal_conversion + * \sa ParseSexagesimal( int&, int&, int&, double&, const Array<>& ) + */ + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const Array& separators ) const noexcept; + + /*! + * Returns a sexagesimal ASCII representation of the specified components + * \a sign, \a s1, \a s2 and \a s3, generated with the specified conversion + * \a options. + * + * The generated representation will correspond to a negative value iff + * \a sign < 0, positive otherwise. + * + * The generated representation is of the form: + * + * [+|-]\[\\[\\]][.[\]] + * + * where the second and third sexagesimal components are canonicalized: + * + * 0 ≤ \ < 60 + * 0 ≤ \ < 60 + * + * irrespective of the original \a s2 and \a s3 argument values. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble(), SexagesimalConversionOptions, + * AngleConversionOptions, LongitudeConversionOptions, RAConversionOptions, + * LatitudeConversionOptions, DecConversionOptions + */ + static IsoString ToSexagesimal( int sign, double s1, double s2, double s3, + const SexagesimalConversionOptions& options = SexagesimalConversionOptions() ); + + /*! + * Returns a sexagesimal ASCII representation of the specified decimal value + * \a d, generated with the specified conversion \a options. + * + * Calling this member function is equivalent to: + * + * \code ToSexagesimal( (d < 0) ? -1 : +1, Abs( d ), 0, 0, options ); \endcode + * + * \ingroup sexagesimal_conversion + */ + static IsoString ToSexagesimal( double d, const SexagesimalConversionOptions& options = SexagesimalConversionOptions() ) + { + return ToSexagesimal( (d < 0) ? -1 : +1, Abs( d ), 0, 0, options ); + } + + /*! + * Evaluates this string as a date and time specification in ISO 8601 + * extended format, and stores the resulting components in the specified + * variables. + * + * \param year On output, the year of the date. + * + * \param month On output, the month of the date in the range [1,12]. + * + * \param day On output, the day of the date in the range [1,31]. + * + * \param dayf On output, the day fraction corresponding to the time + * specification, in the range [0,1). + * + * \param tz On output, the time zone offset in hours, in the range + * [-12,+12]. + * + * In ISO 8601 extended representations, decimal fractions must be divided + * from integer parts exclusively by the full stop or dot character ('.', + * ASCII code point 46(10) = 2E(16)). + * + * \sa TryParseISO8601DateTime(), TimePoint::FromString() + */ + void ParseISO8601DateTime( int& year, int& month, int& day, double& dayf, double& tz ) const; + + /*! + * Attempts to evaluate this string as a date and time specification in ISO + * 8601 extended format. If successful, stores the resulting components in + * the specified \a year, \a month, \a day and \a dayf and \a tz variables, + * and returns \c true. For more information on syntax and + * output values and ranges, see the ParseISO8601DateTime(). + * + * If this string cannot be evaluated as a valid date and time in ISO 8601 + * format, this function returns \c false and does not change any of the + * passed variables. This function does not throw any exception. + * + * \sa ParseISO8601DateTime(), TimePoint::TryFromString() + */ + bool TryParseISO8601DateTime( int& year, int& month, int& day, double& dayf, double& tz ) const noexcept; + + /*! + * Returns an ASCII representation of a date and time in ISO 8601 extended + * format. + * + * \param year The year of the date. + * + * \param month The month of the date in the range [1,12]. + * + * \param day The day of the date in the range [1,31]. + * + * \param dayf The day fraction corresponding to the time specification, + * in the range [0,1). + * + * \param tz The time zone offset in hours, in the range [-12,+12]. The + * default value is zero, to be interpreted as UTC. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentUTCISO8601DateTime(), CurrentLocalISO8601DateTime(), + * ParseISO8601DateTime(), ISO8601ConversionOptions, + * TimePoint::ToIsoString() + */ + static IsoString ToISO8601DateTime( int year, int month, int day, double dayf, double tz = 0, + const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Returns an ASCII representation of the current UTC date and time in ISO + * 8601 extended format. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentLocalISO8601DateTime(), ToISO8601DateTime(), + * ISO8601ConversionOptions, TimePoint::Now() + */ + static IsoString CurrentUTCISO8601DateTime( const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Returns an ASCII representation of the current local date and time in ISO + * 8601 extended format. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentUTCISO8601DateTime(), ToISO8601DateTime(), + * ISO8601ConversionOptions + */ + static IsoString CurrentLocalISO8601DateTime( const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Returns an hex-encoded string for a binary \a data block of the specified + * \a length in bytes. The hex-encoded string is composed of hexadecimal + * digits: 0-9 and a-f, and its length is twice that of the input length. + * + * \sa ToHex( const C& ), ToBase64(), ToByteArray() + */ + static IsoString ToHex( const void* data, size_type length ); + + /*! + * Returns an hex-encoded string for a container \a c, whose contents are + * treated as raw binary data. The objects stored in the container + * are considered as a sequence of bytes, irrespective of their actual data + * types or the classes they are instances of. + * + * The type C represents an array of contiguous objects, and must provide + * PCL container semantics: the Begin() and Length() standard container + * functions are required. + * + * \sa ToHex( const void*, size_type ) + */ + template + static IsoString ToHex( const C& c ) + { + return ToHex( c.Begin(), c.Length()*sizeof( *c.Begin() ) ); + } + + /*! + * Returns a Base64-encoded string for a binary \a data block of the + * specified \a length in bytes. + * + * Base64 is a MIME content transfer encoding of binary data translated into + * a base 64 representation composed of printable characters. See RFC 1421 + * (http://tools.ietf.org/html/rfc1421). + * + * \sa ToBase64( const C& ), ToHex(), ToByteArray() + */ + static IsoString ToBase64( const void* data, size_type length ); + + /*! + * Returns a Base64-encoded string for a container \a c, whose contents are + * treated as raw binary data. The objects stored in the container + * are considered as a sequence of bytes, irrespective of their actual data + * types or the classes they are instances of. + * + * The type C represents an array of contiguous objects, and must provide + * PCL container semantics: the Begin() and Length() standard container + * functions are required. + * + * \sa ToBase64( const void*, size_type ), ToByteArray() + */ + template + static IsoString ToBase64( const C& c ) + { + return ToBase64( c.Begin(), c.Length()*sizeof( *c.Begin() ) ); + } + + /*! + * Returns a ByteArray object that stores a copy of this string. In the + * returned array, source 8-bit characters have been reinterpreted as + * unsigned 8-bit integers. + * + * \sa ToBase64(), ToHex() + */ + ByteArray ToByteArray() const + { + return ByteArray( Begin(), End() ); + } + + /*! + * Decodes an hex-encoded string, and returns the decoded binary raw data + * stored in a ByteArray object. + * + * This function expects this string to be hex-encoded; if it isn't, or if + * it contains invalid hexadecimal digits, a ParseError exception will be + * thrown. + * + * If this string is empty, this function returns an empty %ByteArray. + * + * \sa ToHex(), FromBase64() + */ + ByteArray FromHex() const; + + /*! + * Decodes a Base64-encoded string, and returns the decoded binary raw data + * stored in a ByteArray object. + * + * This function expects this string to be Base64-encoded; if it isn't, or + * if it contains an invalid Base64 representation, a ParseError exception + * will be thrown. + * + * If this string is empty, this function returns an empty %ByteArray. + * + * \sa ToBase64(), FromHex() + */ + ByteArray FromBase64() const; + + /*! + * Generates a string of \a n random 8-bit code points, with character types + * and ranges as prescribed by the specified \a options. + * + * \sa RandomizationOption + */ + static IsoString Random( size_type n, RandomizationOptions options = RandomizationOption::Default ); + + /*! + * Generates a universally unique identifier (UUID) in canonical form. + * + * The canonical UUID has 36 characters with the following format: + * + * xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx + * + * where 'x' represents a lowercase hexadecimal digit, '4' is the UUID + * version indicator (version 4 = truly random UUID), and 'y' is one of '8', + * '9', 'a', or 'b'. + */ + static IsoString UUID(); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup isostring_concatenation_ops IsoString Concatenation Operators + */ + +/*! + * Returns a string with the concatenation of two strings \a s1 and \a s2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( const IsoString::string_base& s1, const IsoString::string_base& s2 ) +{ + IsoString s( s1 ); + s.Append( s2 ); + return s; +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::string_base&& s1, const IsoString::string_base& s2 ) +{ + s1.Append( s2 ); + return IsoString( std::move( s1 ) ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString&& s1, const IsoString::string_base& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 and \a s2 + * (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( const IsoString::string_base& s1, IsoString::string_base&& s2 ) +{ + s2.Prepend( s1 ); + return IsoString( std::move( s2 ) ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 and \a s2 + * (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( const IsoString::string_base& s1, IsoString&& s2 ) +{ + s2.Prepend( s1 ); + return std::move( s2 ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::string_base&& s1, IsoString::string_base&& s2 ) +{ + s1.Append( s2 ); + return IsoString( std::move( s1 ) ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString&& s1, IsoString::string_base&& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::string_base&& s1, IsoString&& s2 ) +{ + s1.Append( s2 ); + return IsoString( std::move( s1 ) ); +} + +/*! + * Returns a string with the concatenation of two strings \a s1 (rvalue + * reference) and \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString&& s1, IsoString&& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a string with the concatenation of a string \a s1 and a + * null-terminated string \a t2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( const IsoString::string_base& s1, IsoString::const_c_string t2 ) +{ + IsoString s = s1; + s.Append( t2 ); + return s; +} + +/*! + * Returns a string with the concatenation of a string \a s1 (rvalue reference) + * and a null-terminated string \a t2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::string_base&& s1, IsoString::const_c_string t2 ) +{ + s1.Append( t2 ); + return IsoString( std::move( s1 ) ); +} + +/*! + * Returns a string with the concatenation of a string \a s1 (rvalue reference) + * and a null-terminated string \a t2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString&& s1, IsoString::const_c_string t2 ) +{ + s1.Append( t2 ); + return std::move( s1 ); +} + +/*! + * Returns a string with the concatenation of a null-terminated string \a t1 + * and a string \a s2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::const_c_string t1, const IsoString::string_base& s2 ) +{ + IsoString s = s2; + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a string with the concatenation of a null-terminated string \a t1 + * and a string \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::const_c_string t1, IsoString::string_base&& s2 ) +{ + s2.Prepend( t1 ); + return IsoString( std::move( s2 ) ); +} + +/*! + * Returns a string with the concatenation of a null-terminated string \a t1 + * and a string \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::const_c_string t1, IsoString&& s2 ) +{ + s2.Prepend( t1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a string with the concatenation of a string \a s1 and a single + * character \a c2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( const IsoString::string_base& s1, IsoString::char_type c2 ) +{ + IsoString s = s1; + s.Append( c2 ); + return s; +} + +/*! + * Returns a string with the concatenation of a string \a s1 (rvalue reference) + * and a single character \a c2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::string_base&& s1, IsoString::char_type c2 ) +{ + s1.Append( c2 ); + return IsoString( std::move( s1 ) ); +} + +/*! + * Returns a string with the concatenation of a string \a s1 (rvalue reference) + * and a single character \a c2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString&& s1, IsoString::char_type c2 ) +{ + s1.Append( c2 ); + return std::move( s1 ); +} + +/*! + * Returns a string with the concatenation of a single character \a c1 and a + * string \a s2. + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::char_type c1, const IsoString::string_base& s2 ) +{ + IsoString s = s2; + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a string with the concatenation of a single character \a c1 and a + * string \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::char_type c1, IsoString::string_base&& s2 ) +{ + s2.Prepend( c1 ); + return IsoString( std::move( s2 ) ); +} + +/*! + * Returns a string with the concatenation of a single character \a c1 and a + * string \a s2 (rvalue reference). + * \ingroup isostring_concatenation_ops + */ +inline IsoString operator +( IsoString::char_type c1, IsoString&& s2 ) +{ + s2.Prepend( c1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Appends a string \a s2 to a string \a s1. Returns a reference to the + * left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString& s1, const IsoString::string_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends a string \a s2 to a string \a s1. Returns a reference to the + * left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString&& s1, const IsoString::string_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 to a string \a s1. Returns a + * reference to the left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString& s1, IsoString::const_c_string t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 to a string \a s1. Returns a + * reference to the left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString&& s1, IsoString::const_c_string t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a single character \a c2 to a string \a s1. Returns a reference to + * the left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString& s1, IsoString::char_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a single character \a c2 to a string \a s1. Returns a reference to + * the left-hand operand string \a s1 + * \ingroup isostring_concatenation_ops + */ +inline IsoString& operator <<( IsoString&& s1, IsoString::char_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_STRING_OSTREAM + +inline std::ostream& operator <<( std::ostream& o, const IsoString& s ) +{ + return o << s.c_str(); +} + +#endif + +// ---------------------------------------------------------------------------- + +/*! + * \class String + * \brief Unicode (UTF-16) string + * + * %String derives from an instantiation of GenericString for \c char16_type. + * It represents a dynamic string of characters in 16-bit Unicode + * Transformation Format (UTF-16) on the PixInsight platform. + * + * \sa IsoString + */ +class PCL_CLASS String : public GenericString +{ +public: + + /*! + * Base class of %String. + */ + typedef GenericString + string_base; + + /*! + * Represents a character pertaining to a %String object. + */ + typedef string_base::char_type char_type; + + /*! + * The character traits class used by this template instantiation. + */ + typedef string_base::char_traits char_traits; + + /*! + * The block allocator used by this template instantiation. + */ + typedef string_base::block_allocator block_allocator; + + /*! + * The allocator class used by this template instantiation. + */ + typedef string_base::allocator allocator; + + /*! + * Null-terminated sequence of UTF-16 characters. + */ + typedef string_base::c_string c_string; + + /*! + * Immutable null-terminated sequence of UTF-16 characters. + */ + typedef string_base::const_c_string const_c_string; + + /* + * Null-terminated UTF-16 string - C++11 compatibility. + */ + typedef char16_t* c16_string; + + /* + * Immutable null-terminated UTF-16 string - C++11 compatibility. + */ + typedef const char16_t* const_c16_string; + + /*! + * %String iterator. + */ + typedef string_base::iterator iterator; + + /*! + * Immutable %String iterator. + */ + typedef string_base::const_iterator const_iterator; + + /*! + * Reverse %String iterator. + */ + typedef string_base::reverse_iterator reverse_iterator; + + /*! + * Immutable reverse %String iterator. + */ + typedef string_base::const_reverse_iterator const_reverse_iterator; + + /*! + * Represents an 8-bit string. Depending on the context, this type + * represents a sequence of ISO/IEC-8859-1, ASCII, or UTF-8 code points. + * + * \note This type must be defined as the same template instantiation used + * for the IsoString class. + */ + typedef GenericString + string8_base; + + /*! + * Represents an 8-bit character (ISO/IEC-8859-1, ASCII or UTF-8). + */ + typedef string8_base::char_type char8_type; + + /*! + * 8-bit character traits class. + */ + typedef string8_base::char_traits char8_traits; + + /*! + * Null-terminated sequence of 8-bit characters. + */ + typedef string8_base::c_string c_string8; + + /*! + * Immutable null-terminated sequence of 8-bit characters. + */ + typedef string8_base::const_c_string const_c_string8; + + /*! + * 8-bit string iterator. + */ + typedef string8_base::iterator char8_iterator; + + /*! + * Immutable 8-bit string iterator. + */ + typedef string8_base::const_iterator const_char8_iterator; + + // ------------------------------------------------------------------------- + + /*! + * Constructs an empty %String object. + */ + String() = default; + + /*! + * Constructs a %String object as a copy of the specified \c string_base + * string \a s (copy constructor from the base class). + */ + String( const string_base& s ) + : string_base( s ) + { + } + + /*! + * Copy constructor. + */ + String( const String& ) = default; + + /*! + * Constructs a %String object by transferring data from the specified + * \c string_base string \a s (move constructor from the base class). + */ + String( string_base&& s ) + : string_base( std::move( s ) ) + { + } + + /*! + * Move constructor. + */ + String( String&& ) = default; + + /*! + * Constructs a %String as a transformed copy of the specified 8-bit, + * ISO/IEC-8859-1 string \a s. + */ + String( const string8_base& s ) + { + Assign( s ); + } + + /*! + * Constructs a %String as a copy of a null-terminated string \a t. + */ + String( const_iterator t ) + : string_base( t ) + { + } + + /*! + * Constructs a %String with the \a n first characters of the + * null-terminated string \a t, starting from its \a i-th character. + */ + String( const_iterator t, size_type i, size_type n ) + : string_base( t, i, n ) + { + } + + /*! + * Constructs a %String with \a n copies of a UTF-16 character \a c. + */ + String( char_type c, size_type n ) + : string_base( c, n ) + { + } + + /*! + * Constructs a %String with a copy of the character sequence defined by + * the range [i,j). + */ + String( const_iterator i, const_iterator j ) + : string_base( i, j ) + { + } + + /*! + * Constructs a %String with a copy of the character sequence stored in the + * specified initializer list \a l. + * + * This constructor is equivalent to: + * + * \code String( l.begin(), l.end() ) \endcode + */ + String( std::initializer_list l ) + : String( l.begin(), l.end() ) + { + } + + /*! + * Constructs a %String as a copy of a null-terminated string \a t of + * \c char16_t characters. + */ + String( const char16_t* t ) + : string_base( reinterpret_cast( t ) ) + { + } + + /*! + * Constructs a %String with the \a n first characters of the + * null-terminated string \a t of \c char16_t characters, starting from its + * \a i-th character. + */ + String( const char16_t* t, size_type i, size_type n ) + : string_base( reinterpret_cast( t ), i, n ) + { + } + + /*! + * Constructs a %String with \a n copies of a \c char16_t character \a c. + */ + String( char16_t c, size_type n ) + : string_base( char_type( c ), n ) + { + } + + /*! + * Constructs a %String as a copy of a null-terminated string \a t of + * \c wchar_t characters. + */ + String( const wchar_t* t ) + { + Assign( t ); + } + + /*! + * Constructs a %String with the \a n first characters of the + * null-terminated string \a t of \c wchar_t characters, starting from its + * \a i-th character. + */ + String( const wchar_t* t, size_type i, size_type n ) + { + Assign( t, i, n ); + } + + /*! + * Constructs a %String with \a n copies of a \c wchar_t character \a c. + */ + String( wchar_t c, size_type n ) + : string_base( char_type( c ), n ) + { + } + + /*! + * Constructs a %String as a transformed copy of the null-terminated 8-bit, + * ISO/IEC-8859-1 string \a t. + */ + String( const_c_string8 t ) + { + Assign( t ); + } + + /*! + * Constructs a %String with the \a n first characters of the + * null-terminated, 8-bit ISO/IEC-8859-1 string \a t, starting from its + * \a i-th character. + */ + String( const_c_string8 t, size_type i, size_type n ) + { + Assign( t, i, n ); + } + + /*! + * Constructs a %String with the sequence of 8-bit characters in the range + * [i,j) of 8-bit string iterators. + */ + String( const_char8_iterator i, const_char8_iterator j ) + { + Assign( i, j ); + } + + /*! + * Constructs a %String with a copy of the 8-bit ISO/IEC-8859-1 character + * sequence stored in the specified initializer list \a l. + * + * This constructor is equivalent to: + * + * \code String( l.begin(), l.end() ) \endcode + */ + String( std::initializer_list l ) + : String( l.begin(), l.end() ) + { + } + + /*! + * Constructs a %String object with \a n copies of an ISO/IEC-8859-1 + * character \a c. + */ + String( char8_type c, size_type n = 1 ) + : string_base( char_type( c ), n ) + { + } + + /*! + * Constructs a %String as a literal representation of a \c bool value. + */ + explicit + String( bool x ) + { + Assign( x ? "true" : "false" ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c signed \c short value. + */ + explicit + String( short x ) + { + (void)Format( L"%hd", x ); + } + + /*! + * Constructs a %String as a literal representation of an + * \c unsigned \c short value. + */ + explicit + String( unsigned short x ) + { + (void)Format( L"%hu", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c signed \c int value. + */ + explicit + String( int x ) + { + (void)Format( L"%i", x ); + } + + /*! + * Constructs a %String as a literal representation of an + * \c unsigned \c int value. + */ + explicit + String( unsigned int x ) + { + (void)Format( L"%u", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c signed \c long value. + */ + explicit + String( long x ) + { + (void)Format( L"%ld", x ); + } + + /*! + * Constructs a %String as a literal representation of an + * \c unsigned \c long value. + */ + explicit + String( unsigned long x ) + { + (void)Format( L"%lu", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c signed \c long \c long value. + */ + explicit + String( long long x ) + { + (void)Format( L"%lli", x ); + } + + /*! + * Constructs a %String as a literal representation of an + * \c unsigned \c long \c long value. + */ + explicit + String( unsigned long long x ) + { + (void)Format( L"%llu", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c float value. + */ + explicit + String( float x ) + { + (void)Format( L"%.7g", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c double value. + */ + explicit + String( double x ) + { + (void)Format( L"%.16g", x ); + } + + /*! + * Constructs a %String as a literal representation of a + * \c long \c double value. + */ + explicit + String( long double x ) + { +#ifdef _MSC_VER + (void)Format( L"%.16Lg", x ); +#else + (void)Format( L"%.18Lg", x ); +#endif + } + +#ifndef __PCL_NO_STRING_COMPLEX + + /*! + * Constructs a %String as a literal representation of an \c fcomplex value. + */ + explicit + String( Complex& x ) + { + (void)Format( L"{%.7g,%.7g}", x.Real(), x.Imag() ); + } + + /*! + * Constructs a %String as a literal representation of a \c dcomplex value. + */ + explicit + String( Complex& x ) + { + (void)Format( L"{%.16g,%.16g}", x.Real(), x.Imag() ); + } + + /*! + * Constructs a %String as a literal representation of an \c lcomplex value. + */ + explicit + String( Complex& x ) + { +#ifdef _MSC_VER + (void)Format( L"{%.16Lg,%.16Lg}", x.Real(), x.Imag() ); +#else + (void)Format( L"{%.18Lg,%.18Lg}", x.Real(), x.Imag() ); +#endif + } + +#endif // !__PCL_NO_STRING_COMPLEX + +#ifdef __PCL_QT_INTERFACE + + explicit + String( const QString& qs ) + : string_base( qs.isEmpty() ? iterator( nullptr ) : iterator( PCL_GET_CHAR16PTR_FROM_QSTRING( qs ) ) ) + { + } + + explicit + String( const QDate& qd ) + : string_base( iterator( PCL_GET_CHAR16PTR_FROM_QSTRING( qd.toString( PCL_QDATE_FMT_STR ) ) ) ) + { + } + + explicit + String( const QDateTime& qdt ) + : string_base( iterator( PCL_GET_CHAR16PTR_FROM_QSTRING( qdt.toString( PCL_QDATETIME_FMT_STR ) ) ) ) + { + } + +#endif + + // ------------------------------------------------------------------------- + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + String& operator =( const String& s ) + { + string_base::Assign( s ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + String& operator =( String&& s ) + { + string_base::Transfer( s ); + return *this; + } + + /*! + * Assigns a shallow copy of the \c string_base string \a s to this string. + * Returns a reference to this object. + */ + String& operator =( const string_base& s ) + { + string_base::Assign( s ); + return *this; + } + + /*! + * Transfers the data from the \c string_base string \a s to this string + * (move assignment from base class). Returns a reference to this object. + */ + String& operator =( string_base&& s ) + { + string_base::Transfer( s ); + return *this; + } + + /*! + * Assigns a copy of the 8-bit ISO/IEC-8859-1 string \a s to this string. + * Returns a reference to this object. + */ + String& operator =( const string8_base& s ) + { + Assign( s ); + return *this; + } + + /*! + * Assigns a copy of the null-terminated string \a t to this string. Returns + * a reference to this object. + */ + String& operator =( const_iterator t ) + { + string_base::Assign( t ); + return *this; + } + + /*! + * Assigns a single copy of a character \a c to this string. Returns a + * reference to this object. + */ + String& operator =( char_type c ) + { + string_base::Assign( c ); + return *this; + } + + /*! + * Assigns a copy of the null-terminated string \a t of \c char16_t to this + * string. Returns a reference to this object. + */ + String& operator =( const char16_t* t ) + { + string_base::Assign( reinterpret_cast( t ) ); + return *this; + } + + /*! + * Assigns a single copy of a \c char16_t character \a c to this string. + * Returns a reference to this object. + */ + String& operator =( char16_t c ) + { + string_base::Assign( char_type( c ) ); + return *this; + } + + /*! + * Assigns a copy of the null-terminated string \a t of \c wchar_t to this + * string. Returns a reference to this object. + */ + String& operator =( const wchar_t* t ) + { + Assign( t ); + return *this; + } + + /*! + * Assigns a single copy of a \c wchar_t character \a c to this string. + * Returns a reference to this object. + */ + String& operator =( wchar_t c ) + { + Assign( c ); + return *this; + } + + /*! + * Assigns a copy of the null-terminated 8-bit ISO/IEC-8859-1 string \a t to + * this string. Returns a reference to this object. + */ + String& operator =( const_c_string8 t ) + { + Assign( t ); + return *this; + } + + /*! + * Assigns a single copy of an ISO/IEC-8859-1 character \a c to this string. + * Returns a reference to this object. + */ + String& operator =( char8_type c ) + { + Assign( c ); + return *this; + } + +#ifdef __PCL_QT_INTERFACE + + String& operator =( const QString& qs ) + { + if ( qs.isEmpty() ) + Clear(); + else + string_base::Assign( PCL_GET_CHAR16PTR_FROM_QSTRING( qs ) ); + return *this; + } + + String& operator =( const QDate& qd ) + { + string_base::Assign( PCL_GET_CHAR16PTR_FROM_QSTRING( qd.toString( PCL_QDATE_FMT_STR ) ) ); + return *this; + } + + String& operator =( const QDateTime& qdt ) + { + string_base::Assign( PCL_GET_CHAR16PTR_FROM_QSTRING( qdt.toString( PCL_QDATETIME_FMT_STR ) ) ); + return *this; + } + +#endif + + // ------------------------------------------------------------------------- + + /*! + * Assigns a string \a s to this string. + */ + void Assign( const String& s ) + { + string_base::Assign( s ); + } + + /*! + * Assigns a contiguous segment of \a n characters of a string \a s, + * starting from its \a i-th character, to this string. + */ + void Assign( const String& s, size_type i, size_type n ) + { + string_base::Assign( s, i, n ); + } + + /*! + * Assigns a null-terminated string \a t to this string. + */ + void Assign( const_iterator t ) + { + string_base::Assign( t ); + } + + /*! + * Assigns a sequence of characters defined by the range [i,j) to this + * string. + */ + void Assign( const_iterator i, const_iterator j ) + { + string_base::Assign( i, j ); + } + + /*! + * Assigns a sequence of characters defined by the specified initializer + * list \a l to this string. This function is equivalent to: + * + * \code Assign( l.begin(), l.end() ) \endcode + */ + void Assign( std::initializer_list l ) + { + Assign( l.begin(), l.end() ); + } + + /*! + * Assigns a contiguous segment of at most \a n characters of a + * null-terminated sequence \a t, starting from its \a i-th character, to + * this string. + */ + void Assign( const_iterator t, size_type i, size_type n ) + { + string_base::Assign( t, i, n ); + } + + /*! + * Assigns \a n copies of a character \a c to this string. + */ + void Assign( char_type c, size_type n = 1 ) + { + string_base::Assign( c, n ); + } + + /*! + * Assigns a null-terminated string \a t of \c char16_t to this string. + */ + void Assign( const char16_t* t ) + { + string_base::Assign( reinterpret_cast( t ) ); + } + + /*! + * Assigns a contiguous segment of \a n characters of a null-terminated + * string \a t of \c char16_t, starting from its \a i-th character, to this + * string. + */ + void Assign( const char16_t* t, size_type i, size_type n ) + { + string_base::Assign( reinterpret_cast( t ), i, n ); + } + + /*! + * Assigns \a n copies of a \c char16_t character \a c to this string. + */ + void Assign( char16_t c, size_type n = 1 ) + { + string_base::Assign( char_type( c ), n ); + } + + /*! + * Assigns a null-terminated string \a t of \c wchar_t to this string. + */ + void Assign( const wchar_t* t ); + + /*! + * Assigns a contiguous segment of \a n characters of a null-terminated + * string \a t of \c wchar_t, starting from its \a i-th character, to this + * string. + */ + void Assign( const wchar_t* t, size_type i, size_type n ); + + /*! + * Assigns \a n copies of a \c wchar_t character \a c to this string. + */ + void Assign( wchar_t c, size_type n = 1 ) + { + string_base::Assign( char_type( c ), n ); + } + + /*! + * Assigns a copy of the 8-bit ISO/IEC-8859-1 string \a s to this string. + */ + void Assign( const string8_base& s ) + { + size_type n = s.Length(); + if ( n > 0 ) + { + MaybeReallocate( n ); + const_char8_iterator t = s.Begin(); + PCL_IVDEP + for ( iterator i = m_data->string; i < m_data->end; ++i, ++t ) + *i = char_type( uint8( *t ) ); + } + else + Clear(); + } + + /*! + * Assigns a null-terminated 8-bit ISO/IEC-8859-1 string \a t to this + * object. + */ + void Assign( const_c_string8 t ) + { + size_type n = char8_traits::Length( t ); + if ( n > 0 ) + { + MaybeReallocate( n ); + PCL_IVDEP + for ( iterator i = m_data->string; i < m_data->end; ++i, ++t ) + *i = char_type( uint8( *t ) ); + } + else + Clear(); + } + + /*! + * Assigns a contiguous segment of \a n characters of a null-terminated + * 8-bit ISO/IEC-8859-1 string \a t, starting from its \a i-th character, to + * this string. + */ + void Assign( const_c_string8 t, size_type i, size_type n ) + { + size_type len = char8_traits::Length( t ); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + MaybeReallocate( n ); + t += i; + PCL_IVDEP + for ( iterator i = m_data->string; i < m_data->end; ++i, ++t ) + *i = char_type( uint8( *t ) ); + } + else + Clear(); + } + + /*! + * Assigns a contiguous sequence of 8-bit ISO/IEC-8859-1 characters in the + * range [i,j) to this string, replacing its previous contents. + */ + void Assign( const_char8_iterator p, const_char8_iterator q ) + { + if ( p < q ) + { + MaybeReallocate( q - p ); + PCL_IVDEP + for ( iterator i = m_data->string; i < m_data->end; ++i, ++p ) + *i = char_type( uint8( *p ) ); + } + else + Clear(); + } + + /*! + * Assigns a sequence of 8-bit ISO/IEC-8859-1 characters defined by the + * specified initializer list \a l to this string. This function is + * equivalent to: + * + * \code Assign( l.begin(), l.end() ) \endcode + */ + void Assign( std::initializer_list l ) + { + Assign( l.begin(), l.end() ); + } + + /*! + * Assigns \a n copies of an ISO/IEC-8859-1 character \a c to this string. + */ + void Assign( char8_type c, size_type n = 1 ) + { + string_base::Assign( char_type( c ), n ); + } + + // ------------------------------------------------------------------------- + + void Insert( size_type i, const String& s ) + { + string_base::Insert( i, s ); + } + + void Insert( size_type i, const_iterator p, const_iterator q ) + { + string_base::Insert( i, p, q ); + } + + void Insert( size_type i, const_iterator t ) + { + string_base::Insert( i, t ); + } + + void Insert( size_type i, const_iterator t, size_type n ) + { + string_base::Insert( i, t, n ); + } + + void Insert( size_type i, char_type c, size_type n = 1 ) + { + string_base::Insert( i, c, n ); + } + + void Insert( size_type i, const char16_t* t ) + { + string_base::Insert( i, reinterpret_cast( t ) ); + } + + void Insert( size_type i, char16_t c, size_type n = 1 ) + { + string_base::Insert( i, String( c, n ) ); + } + + void Insert( size_type i, const wchar_t* t ) + { +#ifdef __PCL_WINDOWS + string_base::Insert( i, reinterpret_cast( t ) ); +#else + string_base::Insert( i, String( t ) ); +#endif + } + + void Insert( size_type i, wchar_t c, size_type n = 1 ) + { + string_base::Insert( i, String( c, n ) ); + } + + void Insert( size_type i, const string8_base& s, size_type n ) + { + n = pcl::Min( n, s.Length() ); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + const_char8_iterator t = s.Begin(); + PCL_IVDEP + for ( iterator p = m_data->string+i, q = p+n; p < q; ++p, ++t ) + *p = char_type( uint8( *t ) ); + } + } + + void Insert( size_type i, const string8_base& s ) + { + size_type n = s.Length(); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + const_char8_iterator t = s.Begin(); + PCL_IVDEP + for ( iterator p = m_data->string+i, q = p+n; p < q; ++p, ++t ) + *p = char_type( uint8( *t ) ); + } + } + + void Insert( size_type i, const_c_string8 t ) + { + size_type n = char8_traits::Length( t ); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + PCL_IVDEP + for ( iterator p = m_data->string+i, q = p+n; p < q; ++p, ++t ) + *p = char_type( uint8( *t ) ); + } + } + + void Insert( size_type i, const_c_string8 t, size_type n ) + { + n = pcl::Min( n, char8_traits::Length( t ) ); + if ( n > 0 ) + { + UninitializedGrow( i, n ); // -> 0 <= i <= len + PCL_IVDEP + for ( iterator p = m_data->string+i, q = p+n; p < q; ++p, ++t ) + *p = char_type( uint8( *t ) ); + } + } + + void Insert( size_type i, const_char8_iterator p, const_char8_iterator q ) + { + if ( p < q ) + { + size_type n = q - p; + UninitializedGrow( i, n ); // -> 0 <= i <= len + PCL_IVDEP + for ( iterator r = m_data->string+i, s = r+n; r < s; ++r, ++p ) + *r = char_type( uint8( *p ) ); + } + } + + void Insert( size_type i, char8_type c, size_type n = 1 ) + { + string_base::Insert( i, char_type( c ), n ); + } + + // ------------------------------------------------------------------------- + + void Append( const String& s ) + { + string_base::Append( s ); + } + + String& operator +=( const String& s ) + { + Append( s ); + return *this; + } + + void Append( const_iterator i, const_iterator j ) + { + string_base::Append( i, j ); + } + + void Append( const_iterator t ) + { + string_base::Append( t ); + } + + String& operator +=( const_iterator t ) + { + Append( t ); + return *this; + } + + void Append( const_iterator t, size_type n ) + { + string_base::Append( t, n ); + } + + void Append( char_type c, size_type n = 1 ) + { + string_base::Append( c, n ); + } + + String& operator +=( char_type c ) + { + Append( c ); + return *this; + } + + void Append( const char16_t* t ) + { + string_base::Append( reinterpret_cast( t ) ); + } + + String& operator +=( const char16_t* t ) + { + Append( t ); + return *this; + } + + void Append( char16_t c, size_type n = 1 ) + { + string_base::Append( char_type( c ), n ); + } + + String& operator +=( char16_t c ) + { + Append( c ); + return *this; + } + + void Append( const wchar_t* t ) + { +#ifdef __PCL_WINDOWS + string_base::Append( reinterpret_cast( t ) ); +#else + string_base::Append( String( t ) ); +#endif + } + + String& operator +=( const wchar_t* t ) + { + Append( t ); + return *this; + } + + void Append( wchar_t c, size_type n = 1 ) + { + string_base::Append( char_type( c ), n ); + } + + String& operator +=( wchar_t c ) + { + Append( c ); + return *this; + } + + void Append( const string8_base& s ) + { + Insert( maxPos, s ); + } + + String& operator +=( const string8_base& s ) + { + Append( s ); + return *this; + } + + void Append( const string8_base& s, size_type n ) + { + Insert( maxPos, s, n ); + } + + void Append( const_c_string8 t ) + { + Insert( maxPos, t ); + } + + String& operator +=( const_c_string8 t ) + { + Append( t ); + return *this; + } + + void Append( const_c_string8 t, size_type n ) + { + Insert( maxPos, t, n ); + } + + void Append( const_char8_iterator p, const_char8_iterator q ) + { + Insert( maxPos, p, q ); + } + + void Append( char8_type c, size_type n = 1 ) + { + string_base::Append( char_type( c ), n ); + } + + String& operator +=( char8_type c ) + { + Append( c ); + return *this; + } + + void Add( const String& s ) + { + Append( s ); + } + + void Add( const_iterator i, const_iterator j ) + { + Append( i, j ); + } + + void Add( const_iterator t ) + { + Append( t ); + } + + void Add( const_iterator t, size_type n ) + { + Append( t, n ); + } + + void Add( char_type c, size_type n = 1 ) + { + Append( c, n ); + } + + void Add( const char16_t* t ) + { + Append( t ); + } + + void Add( char16_t c, size_type n = 1 ) + { + Append( c, n ); + } + + void Add( const wchar_t* t ) + { + Append( t ); + } + + void Add( wchar_t c, size_type n = 1 ) + { + Append( c, n ); + } + + void Add( const string8_base& s ) + { + Append( s ); + } + + void Add( const string8_base& s, size_type n ) + { + Append( s, n ); + } + + void Add( const_c_string8 t ) + { + Append( t ); + } + + void Add( const_c_string8 t, size_type n ) + { + Append( t, n ); + } + + void Add( const_char8_iterator p, const_char8_iterator q ) + { + Append( p, q ); + } + + void Add( char8_type c, size_type n = 1 ) + { + Append( c, n ); + } + + // ------------------------------------------------------------------------- + + void Prepend( const String& s ) + { + string_base::Prepend( s ); + } + + String& operator -=( const String& s ) + { + Prepend( s ); + return *this; + } + + void Prepend( const_iterator i, const_iterator j ) + { + string_base::Prepend( i, j ); + } + + void Prepend( const_iterator t ) + { + string_base::Prepend( t ); + } + + String& operator -=( const_iterator t ) + { + Prepend( t ); + return *this; + } + + void Prepend( const_iterator t, size_type n ) + { + string_base::Prepend( t, n ); + } + + void Prepend( char_type c, size_type n = 1 ) + { + string_base::Prepend( c, n ); + } + + String& operator -=( char_type c ) + { + Prepend( c ); + return *this; + } + + void Prepend( const char16_t* t ) + { + string_base::Prepend( reinterpret_cast( t ) ); + } + + String& operator -=( const char16_t* t ) + { + Prepend( t ); + return *this; + } + + void Prepend( char16_t c, size_type n = 1 ) + { + string_base::Prepend( char_type( c ), n ); + } + + String& operator -=( char16_t c ) + { + Prepend( c ); + return *this; + } + + void Prepend( const wchar_t* t ) + { +#ifdef __PCL_WINDOWS + string_base::Prepend( reinterpret_cast( t ) ); +#else + string_base::Prepend( String( t ) ); +#endif + } + + String& operator -=( const wchar_t* t ) + { + Prepend( t ); + return *this; + } + + void Prepend( wchar_t c, size_type n = 1 ) + { + string_base::Prepend( char_type( c ), n ); + } + + String& operator -=( wchar_t c ) + { + Prepend( c ); + return *this; + } + + void Prepend( const string8_base& s ) + { + Insert( 0, s ); + } + + String& operator -=( const string8_base& s ) + { + Prepend( s ); + return *this; + } + + void Prepend( const string8_base& s, size_type n ) + { + Insert( 0, s, n ); + } + + void Prepend( const_c_string8 t ) + { + Insert( 0, t ); + } + + String& operator -=( const_c_string8 t ) + { + Prepend( t ); + return *this; + } + + void Prepend( const_c_string8 t, size_type n ) + { + Insert( 0, t, n ); + } + + void Prepend( const_char8_iterator p, const_char8_iterator q ) + { + Insert( 0, p, q ); + } + + void Prepend( char8_type c, size_type n = 1 ) + { + string_base::Prepend( String( c, n ) ); + } + + String& operator -=( char8_type c ) + { + Prepend( c ); + return *this; + } + + // ------------------------------------------------------------------------- + + void Replace( size_type i, size_type n, const String& s ) + { + string_base::Replace( i, n, s ); + } + + void Replace( size_type i, size_type n, const_iterator t ) + { + string_base::Replace( i, n, t ); + } + + void Replace( size_type i, size_type n, char_type c, size_type nc = 1 ) + { + string_base::Replace( i, n, c, nc ); + } + + void Replace( size_type i, size_type n, const char16_t* t ) + { + string_base::Replace( i, n, reinterpret_cast( t ) ); + } + + void Replace( size_type i, size_type n, char16_t c, size_type nc = 1 ) + { + string_base::Replace( i, n, char_type( c ), nc ); + } + + void Replace( size_type i, size_type n, const wchar_t* t ) + { +#ifdef __PCL_WINDOWS + string_base::Replace( i, n, reinterpret_cast( t ) ); +#else + string_base::Replace( i, n, String( t ) ); +#endif + } + + void Replace( size_type i, size_type n, wchar_t c, size_type nc = 1 ) + { + string_base::Replace( i, n, char_type( c ), nc ); + } + + void Replace( size_type i, size_type n, const_c_string8 t ) + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + if ( n == len ) + Assign( t ); + else + { + size_type nt = char8_traits::Length( t ); + if ( nt > 0 ) + { + if ( n < nt ) + UninitializedGrow( i, nt-n ); + else if ( nt < n ) + Delete( i, n-nt ); + else + EnsureUnique(); + + PCL_IVDEP + for ( iterator p = m_data->string+i, q = p+nt; p < q; ++p, ++t ) + *p = char_type( *t ); + } + else + Delete( i, n ); + } + } + } + } + + void Replace( size_type i, size_type n, char8_type c, size_type nc = 1 ) + { + string_base::Replace( i, n, char_type( c ), nc ); + } + + // ------------------------------------------------------------------------- + + void ReplaceChar( char_type c1, char_type c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceChar( c1, c2, i, n ); + } + + void ReplaceCharIC( char_type c1, char_type c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceCharIC( c1, c2, i, n ); + } + + void ReplaceChar( char16_t c1, char16_t c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceChar( char_type( c1 ), char_type( c2 ), i, n ); + } + + void ReplaceCharIC( char16_t c1, char16_t c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceCharIC( char_type( c1 ), char_type( c2 ), i, n ); + } + + void ReplaceChar( wchar_t c1, wchar_t c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceChar( char_type( c1 ), char_type( c2 ), i, n ); + } + + void ReplaceCharIC( wchar_t c1, wchar_t c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceCharIC( char_type( c1 ), char_type( c2 ), i, n ); + } + + void ReplaceChar( char8_type c1, char8_type c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceChar( char_type( c1 ), char_type( c2 ), i, n ); + } + + void ReplaceCharIC( char8_type c1, char8_type c2, size_type i = 0, size_type n = maxPos ) + { + string_base::ReplaceCharIC( char_type( c1 ), char_type( c2 ), i, n ); + } + + // ------------------------------------------------------------------------- + + void ReplaceString( const String& s1, const String& s2, size_type i = 0 ) + { + string_base::ReplaceString( s1, s2, i ); + } + + void ReplaceStringIC( const String& s1, const String& s2, size_type i = 0 ) + { + string_base::ReplaceStringIC( s1, s2, i ); + } + + void ReplaceString( const_iterator t1, const_iterator t2, size_type i = 0 ) + { + string_base::ReplaceString( t1, t2, i ); + } + + void ReplaceStringIC( const_iterator t1, const_iterator t2, size_type i = 0 ) + { + string_base::ReplaceStringIC( t1, t2, i ); + } + + void ReplaceString( const char16_t* t1, const char16_t* t2, size_type i = 0 ) + { + string_base::ReplaceString( reinterpret_cast( t1 ), + reinterpret_cast( t2 ), i ); + } + + void ReplaceStringIC( const char16_t* t1, const char16_t* t2, size_type i = 0 ) + { + string_base::ReplaceStringIC( reinterpret_cast( t1 ), + reinterpret_cast( t2 ), i ); + } + + void ReplaceString( const wchar_t* t1, const wchar_t* t2, size_type i = 0 ) + { +#ifdef __PCL_WINDOWS + string_base::ReplaceString( reinterpret_cast( t1 ), + reinterpret_cast( t2 ), i ); +#else + string_base::ReplaceString( String( t1 ), String( t2 ), i ); +#endif + } + + void ReplaceStringIC( const wchar_t* t1, const wchar_t* t2, size_type i = 0 ) + { +#ifdef __PCL_WINDOWS + string_base::ReplaceStringIC( reinterpret_cast( t1 ), + reinterpret_cast( t2 ), i ); +#else + string_base::ReplaceStringIC( String( t1 ), String( t2 ), i ); +#endif + } + + void ReplaceString( const_c_string8 t1, const_c_string8 t2, size_type i = 0 ) + { + string_base::ReplaceString( String( t1 ), String( t2 ), i ); + } + + void ReplaceStringIC( const_c_string8 t1, const_c_string8 t2, size_type i = 0 ) + { + string_base::ReplaceStringIC( String( t1 ), String( t2 ), i ); + } + + // ------------------------------------------------------------------------- + + void DeleteChar( char_type c, size_type i = 0 ) + { + string_base::DeleteChar( c, i ); + } + + void DeleteCharIC( char_type c, size_type i = 0 ) + { + string_base::DeleteCharIC( c, i ); + } + + void DeleteChar( char16_t c, size_type i = 0 ) + { + string_base::DeleteChar( char_type( c ), i ); + } + + void DeleteCharIC( char16_t c, size_type i = 0 ) + { + string_base::DeleteCharIC( char_type( c ), i ); + } + + void DeleteChar( wchar_t c, size_type i = 0 ) + { + string_base::DeleteChar( char_type( c ), i ); + } + + void DeleteCharIC( wchar_t c, size_type i = 0 ) + { + string_base::DeleteCharIC( char_type( c ), i ); + } + + void DeleteChar( char8_type c, size_type i = 0 ) + { + string_base::DeleteChar( char_type( c ), i ); + } + + void DeleteCharIC( char8_type c, size_type i = 0 ) + { + string_base::DeleteCharIC( char_type( c ), i ); + } + + // ------------------------------------------------------------------------- + + void DeleteString( const String& s, size_type i = 0 ) + { + string_base::DeleteString( s, i ); + } + + void DeleteStringIC( const String& s, size_type i = 0 ) + { + string_base::DeleteStringIC( s, i ); + } + + void DeleteString( const_iterator t, size_type i = 0 ) + { + string_base::DeleteString( t, i ); + } + + void DeleteStringIC( const_iterator t, size_type i = 0 ) + { + string_base::DeleteStringIC( t, i ); + } + + void DeleteString( const char16_t* t, size_type i = 0 ) + { + string_base::DeleteString( reinterpret_cast( t ), i ); + } + + void DeleteStringIC( const char16_t* t, size_type i = 0 ) + { + string_base::DeleteStringIC( reinterpret_cast( t ), i ); + } + + void DeleteString( const wchar_t* t, size_type i = 0 ) + { +#ifdef __PCL_WINDOWS + string_base::DeleteString( reinterpret_cast( t ), i ); +#else + string_base::DeleteString( String( t ), i ); +#endif + } + + void DeleteStringIC( const wchar_t* t, size_type i = 0 ) + { +#ifdef __PCL_WINDOWS + string_base::DeleteStringIC( reinterpret_cast( t ), i ); +#else + string_base::DeleteStringIC( String( t ), i ); +#endif + } + + void DeleteString( const_c_string8 t, size_type i = 0 ) + { + string_base::DeleteString( String( t ), i ); + } + + void DeleteStringIC( const_c_string8 t, size_type i = 0 ) + { + string_base::DeleteStringIC( String( t ), i ); + } + + // ------------------------------------------------------------------------- + + bool StartsWith( const String& s ) const noexcept + { + return string_base::StartsWith( s ); + } + + bool StartsWith( const_iterator t ) const noexcept + { + return string_base::StartsWith( t ); + } + + bool StartsWith( char_type c ) const noexcept + { + return string_base::StartsWith( c ); + } + + bool StartsWithIC( const String& s ) const noexcept + { + return string_base::StartsWithIC( s ); + } + + bool StartsWithIC( const_iterator t ) const noexcept + { + return string_base::StartsWithIC( t ); + } + + bool StartsWithIC( char_type c ) const noexcept + { + return string_base::StartsWithIC( c ); + } + + bool StartsWith( const char16_t* t ) const noexcept + { + return string_base::StartsWith( reinterpret_cast( t ) ); + } + + bool StartsWith( char16_t c ) const noexcept + { + return string_base::StartsWith( char_type( c ) ); + } + + bool StartsWithIC( const char16_t* t ) const noexcept + { + return string_base::StartsWithIC( reinterpret_cast( t ) ); + } + + bool StartsWithIC( char16_t c ) const noexcept + { + return string_base::StartsWithIC( char_type( c ) ); + } + + bool StartsWith( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::StartsWith( reinterpret_cast( t ) ); +#else + return string_base::StartsWith( String( t ) ); +#endif + } + + bool StartsWith( wchar_t c ) const noexcept + { + return string_base::StartsWith( char_type( c ) ); + } + + bool StartsWithIC( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::StartsWithIC( reinterpret_cast( t ) ); +#else + return string_base::StartsWithIC( String( t ) ); +#endif + } + + bool StartsWithIC( wchar_t c ) const noexcept + { + return string_base::StartsWithIC( char_type( c ) ); + } + + bool StartsWith( const_c_string8 t ) const noexcept + { + size_type n = char8_traits::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->string, q = p+n; p < q; ++p, ++t ) + if ( *p != char_type( *t ) ) + return false; + return true; + } + + bool StartsWith( char8_type c ) const noexcept + { + return string_base::StartsWith( char_type( c ) ); + } + + bool StartsWithIC( const_c_string8 t ) const noexcept + { + size_type n = char8_traits::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->string, q = p+n; p < q; ++p, ++t ) + if ( char_traits::ToCaseFolded( *p ) != char_type( char8_traits::ToCaseFolded( *t ) ) ) + return false; + return true; + } + + bool StartsWithIC( char8_type c ) const noexcept + { + return string_base::StartsWithIC( char_type( c ) ); + } + + // ------------------------------------------------------------------------- + + bool EndsWith( const String& s ) const noexcept + { + return string_base::EndsWith( s ); + } + + bool EndsWith( const_iterator t ) const noexcept + { + return string_base::EndsWith( t ); + } + + bool EndsWith( char_type c ) const noexcept + { + return string_base::EndsWith( c ); + } + + bool EndsWithIC( const String& s ) const noexcept + { + return string_base::EndsWithIC( s ); + } + + bool EndsWithIC( const_iterator t ) const noexcept + { + return string_base::EndsWithIC( t ); + } + + bool EndsWithIC( char_type c ) const noexcept + { + return string_base::EndsWithIC( c ); + } + + bool EndsWith( const char16_t* t ) const noexcept + { + return string_base::EndsWith( reinterpret_cast( t ) ); + } + + bool EndsWith( char16_t c ) const noexcept + { + return string_base::EndsWith( char_type( c ) ); + } + + bool EndsWithIC( const char16_t* t ) const noexcept + { + return string_base::EndsWithIC( reinterpret_cast( t ) ); + } + + bool EndsWithIC( char16_t c ) const noexcept + { + return string_base::EndsWithIC( char_type( c ) ); + } + + bool EndsWith( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::EndsWith( reinterpret_cast( t ) ); +#else + return string_base::EndsWith( String( t ) ); +#endif + } + + bool EndsWith( wchar_t c ) const noexcept + { + return string_base::EndsWith( char_type( c ) ); + } + + bool EndsWithIC( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::EndsWithIC( reinterpret_cast( t ) ); +#else + return string_base::EndsWithIC( String( t ) ); +#endif + } + + bool EndsWithIC( wchar_t c ) const noexcept + { + return string_base::EndsWithIC( char_type( c ) ); + } + + bool EndsWith( const_c_string8 t ) const noexcept + { + size_type n = char8_traits::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n; p < m_data->end; ++p, ++t ) + if ( *p != char_type( *t ) ) + return false; + return true; + } + + bool EndsWith( char8_type c ) const noexcept + { + return string_base::EndsWith( char_type( c ) ); + } + + bool EndsWithIC( const_c_string8 t ) const noexcept + { + size_type n = char8_traits::Length( t ); + if ( n == 0 || Length() < n ) + return false; + for ( const_iterator p = m_data->end-n; p < m_data->end; ++p, ++t ) + if ( char_traits::ToCaseFolded( *p ) != char_type( char8_traits::ToCaseFolded( *t ) ) ) + return false; + return true; + } + + bool EndsWithIC( char8_type c ) const noexcept + { + return string_base::EndsWithIC( char_type( c ) ); + } + + // ------------------------------------------------------------------------- + + size_type FindFirst( const String& s, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( s, i ); + } + + size_type FindFirst( const_iterator t, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( t, i ); + } + + size_type FindFirst( char_type c, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( c, i ); + } + + size_type FindFirstIC( const String& s, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( s, i ); + } + + size_type FindFirstIC( const_iterator t, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( t, i ); + } + + size_type FindFirstIC( char_type c, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( c, i ); + } + + size_type FindFirst( const char16_t* t, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( reinterpret_cast( t ), i ); + } + + size_type FindFirst( char16_t c, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( char_type( c ), i ); + } + + size_type FindFirstIC( const char16_t* t, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( reinterpret_cast( t ), i ); + } + + size_type FindFirstIC( char16_t c, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( char_type( c ), i ); + } + + size_type FindFirst( const wchar_t* t, size_type i = 0 ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::FindFirst( reinterpret_cast( t ), i ); +#else + return string_base::FindFirst( String( t ), i ); +#endif + } + + size_type FindFirst( wchar_t c, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( char_type( c ), i ); + } + + size_type FindFirstIC( const wchar_t* t, size_type i = 0 ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::FindFirstIC( reinterpret_cast( t ), i ); +#else + return string_base::FindFirstIC( String( t ), i ); +#endif + } + + size_type FindFirstIC( wchar_t c, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( char_type( c ), i ); + } + + size_type FindFirst( const_c_string8 t, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( String( t ), i ); + } + + size_type FindFirst( char8_type c, size_type i = 0 ) const noexcept + { + return string_base::FindFirst( char_type( c ), i ); + } + + size_type FindFirstIC( const_c_string8 t, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( String( t ), i ); + } + + size_type FindFirstIC( char8_type c, size_type i = 0 ) const noexcept + { + return string_base::FindFirstIC( char_type( c ), i ); + } + + // + + size_type Find( const String& s, size_type i = 0 ) const noexcept + { + return FindFirst( s, i ); + } + + size_type Find( const_iterator t, size_type i = 0 ) const noexcept + { + return FindFirst( t, i ); + } + + size_type Find( char_type c, size_type i = 0 ) const noexcept + { + return FindFirst( c, i ); + } + + size_type Find( const char16_t* t, size_type i = 0 ) const noexcept + { + return FindFirst( t, i ); + } + + size_type Find( char16_t c, size_type i = 0 ) const noexcept + { + return FindFirst( c, i ); + } + + size_type Find( const wchar_t* t, size_type i = 0 ) const noexcept + { + return FindFirst( t, i ); + } + + size_type Find( wchar_t c, size_type i = 0 ) const noexcept + { + return FindFirst( c, i ); + } + + size_type Find( const_c_string8 t, size_type i = 0 ) const noexcept + { + return FindFirst( t, i ); + } + + size_type Find( char8_type c, size_type i = 0 ) const noexcept + { + return FindFirst( c, i ); + } + + size_type FindIC( const String& s, size_type i = 0 ) const noexcept + { + return FindFirstIC( s, i ); + } + + size_type FindIC( const_iterator t, size_type i = 0 ) const noexcept + { + return FindFirstIC( t, i ); + } + + size_type FindIC( char_type c, size_type i = 0 ) const noexcept + { + return FindFirstIC( c, i ); + } + + size_type FindIC( const char16_t* t, size_type i = 0 ) const noexcept + { + return FindFirstIC( t, i ); + } + + size_type FindIC( char16_t c, size_type i = 0 ) const noexcept + { + return FindFirstIC( c, i ); + } + + size_type FindIC( const wchar_t* t, size_type i = 0 ) const noexcept + { + return FindFirstIC( t, i ); + } + + size_type FindIC( wchar_t c, size_type i = 0 ) const noexcept + { + return FindFirstIC( c, i ); + } + + size_type FindIC( const_c_string8 t, size_type i = 0 ) const noexcept + { + return FindFirstIC( t, i ); + } + + size_type FindIC( char8_type c, size_type i = 0 ) const noexcept + { + return FindFirstIC( c, i ); + } + + // ------------------------------------------------------------------------- + + size_type FindLast( const String& s, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( s, r ); + } + + size_type FindLast( const_iterator t, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( t, r ); + } + + size_type FindLast( char_type c, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( c, r ); + } + + size_type FindLastIC( const String& s, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( s, r ); + } + + size_type FindLastIC( const_iterator t, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( t, r ); + } + + size_type FindLastIC( char_type c, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( c, r ); + } + + size_type FindLast( const char16_t* t, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( reinterpret_cast( t ), r ); + } + + size_type FindLast( char16_t c, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( char_type( c ), r ); + } + + size_type FindLastIC( const char16_t* t, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( reinterpret_cast( t ), r ); + } + + size_type FindLastIC( char16_t c, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( char_type( c ), r ); + } + + size_type FindLast( const wchar_t* t, size_type r = maxPos ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::FindLast( reinterpret_cast( t ), r ); +#else + return string_base::FindLast( String( t ), r ); +#endif + } + + size_type FindLast( wchar_t c, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( char_type( c ), r ); + } + + size_type FindLastIC( const wchar_t* t, size_type r = maxPos ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::FindLastIC( reinterpret_cast( t ), r ); +#else + return string_base::FindLastIC( String( t ), r ); +#endif + } + + size_type FindLastIC( wchar_t c, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( char_type( c ), r ); + } + + size_type FindLast( const_c_string8 t, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( String( t ), r ); + } + + size_type FindLast( char8_type c, size_type r = maxPos ) const noexcept + { + return string_base::FindLast( char_type( c ), r ); + } + + size_type FindLastIC( const_c_string8 t, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( String( t ), r ); + } + + size_type FindLastIC( char8_type c, size_type r = maxPos ) const noexcept + { + return string_base::FindLastIC( char_type( c ), r ); + } + + // ------------------------------------------------------------------------- + + bool Contains( const String& s ) const noexcept + { + return string_base::Contains( s ); + } + + bool Contains( const_iterator t ) const noexcept + { + return string_base::Contains( t ); + } + + bool Contains( char_type c ) const noexcept + { + return string_base::Contains( c ); + } + + bool ContainsIC( const String& s ) const noexcept + { + return string_base::ContainsIC( s ); + } + + bool ContainsIC( const_iterator t ) const noexcept + { + return string_base::ContainsIC( t ); + } + + bool ContainsIC( char_type c ) const noexcept + { + return string_base::ContainsIC( c ); + } + + bool Contains( const char16_t* t ) const noexcept + { + return string_base::Contains( reinterpret_cast( t ) ); + } + + bool Contains( char16_t c ) const noexcept + { + return string_base::Contains( char_type( c ) ); + } + + bool ContainsIC( const char16_t* t ) const noexcept + { + return string_base::ContainsIC( reinterpret_cast( t ) ); + } + + bool ContainsIC( char16_t c ) const noexcept + { + return string_base::ContainsIC( char_type( c ) ); + } + + bool Contains( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::Contains( reinterpret_cast( t ) ); +#else + return string_base::Contains( String( t ) ); +#endif + } + + bool Contains( wchar_t c ) const noexcept + { + return string_base::Contains( char_type( c ) ); + } + + bool ContainsIC( const wchar_t* t ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::ContainsIC( reinterpret_cast( t ) ); +#else + return string_base::ContainsIC( String( t ) ); +#endif + } + + bool ContainsIC( wchar_t c ) const noexcept + { + return string_base::ContainsIC( char_type( c ) ); + } + + bool Contains( const_c_string8 t ) const noexcept + { + return string_base::Contains( String( t ) ); + } + + bool Contains( char8_type c ) const noexcept + { + return string_base::Contains( char_type( c ) ); + } + + bool ContainsIC( const_c_string8 t ) const noexcept + { + return string_base::ContainsIC( String( t ) ); + } + + bool ContainsIC( char8_type c ) const noexcept + { + return string_base::ContainsIC( char_type( c ) ); + } + + // ------------------------------------------------------------------------- + + int CompareCodePoints( const String& s, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( s, caseSensitive ); + } + + int CompareCodePoints( const_iterator t, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( t, caseSensitive ); + } + + int CompareCodePoints( char_type c, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( c, caseSensitive ); + } + + int CompareCodePoints( const char16_t* t, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( reinterpret_cast( t ), caseSensitive ); + } + + int CompareCodePoints( char16_t c, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( char_type( c ), caseSensitive ); + } + + int CompareCodePoints( const wchar_t* t, bool caseSensitive = true ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::CompareCodePoints( reinterpret_cast( t ), caseSensitive ); +#else + return string_base::CompareCodePoints( String( t ), caseSensitive ); +#endif + } + + int CompareCodePoints( wchar_t c, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( char_type( c ), caseSensitive ); + } + + int CompareCodePoints( const_c_string8 t, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( String( t ), caseSensitive ); + } + + int CompareCodePoints( char8_type c, bool caseSensitive = true ) const noexcept + { + return string_base::CompareCodePoints( char_type( c ), caseSensitive ); + } + + // ------------------------------------------------------------------------- + + int Compare( const String& s, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( s, caseSensitive, localeAware ); + } + + int Compare( const_iterator t, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( t, caseSensitive, localeAware ); + } + + int Compare( char_type c, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( c, caseSensitive, localeAware ); + } + + int CompareIC( const String& s, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( s, localeAware ); + } + + int CompareIC( const_iterator t, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( t, localeAware ); + } + + int CompareIC( char_type c, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( c, localeAware ); + } + + int Compare( const char16_t* t, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( reinterpret_cast( t ), caseSensitive, localeAware ); + } + + int Compare( char16_t c, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( char_type( c ), caseSensitive, localeAware ); + } + + int CompareIC( const char16_t* t, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( reinterpret_cast( t ), localeAware ); + } + + int CompareIC( char16_t c, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( char_type( c ), localeAware ); + } + + int Compare( const wchar_t* t, bool caseSensitive = true, bool localeAware = true ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::Compare( reinterpret_cast( t ), caseSensitive, localeAware ); +#else + return string_base::Compare( String( t ), caseSensitive, localeAware ); +#endif + } + + int Compare( wchar_t c, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( char_type( c ), caseSensitive, localeAware ); + } + + int CompareIC( const wchar_t* t, bool localeAware = true ) const noexcept + { +#ifdef __PCL_WINDOWS + return string_base::CompareIC( reinterpret_cast( t ), localeAware ); +#else + return string_base::CompareIC( String( t ), localeAware ); +#endif + } + + int CompareIC( wchar_t c, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( char_type( c ), localeAware ); + } + + int Compare( const_c_string8 t, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( String( t ), caseSensitive, localeAware ); + } + + int Compare( char8_type c, bool caseSensitive = true, bool localeAware = true ) const noexcept + { + return string_base::Compare( char_type( c ), caseSensitive, localeAware ); + } + + int CompareIC( const_c_string8 t, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( String( t ), localeAware ); + } + + int CompareIC( char8_type c, bool localeAware = true ) const noexcept + { + return string_base::CompareIC( char_type( c ), localeAware ); + } + + // ------------------------------------------------------------------------- + + bool WildMatch( const String& pattern, bool caseSensitive = true ) const noexcept + { + return string_base::WildMatch( pattern, caseSensitive ); + } + + bool WildMatchIC( const String& pattern ) const noexcept + { + return string_base::WildMatchIC( pattern ); + } + + bool WildMatch( const_iterator pattern, bool caseSensitive = true ) const noexcept + { + return string_base::WildMatch( pattern, caseSensitive ); + } + + bool WildMatchIC( const_iterator pattern ) const noexcept + { + return string_base::WildMatchIC( pattern ); + } + + bool WildMatch( const string8_base& pattern, bool caseSensitive = true ) const noexcept + { + return char_traits::WildMatch( m_data->string, Length(), pattern.Begin(), pattern.Length(), caseSensitive ); + } + + bool WildMatchIC( const string8_base& pattern ) const noexcept + { + return char_traits::WildMatch( m_data->string, Length(), pattern.Begin(), pattern.Length(), false/*caseSensitive*/ ); + } + + bool WildMatch( const_c_string8 pattern, bool caseSensitive = true ) const noexcept + { + return char_traits::WildMatch( m_data->string, Length(), pattern, char8_traits::Length( pattern ), caseSensitive ); + } + + bool WildMatchIC( const_c_string8 pattern ) const noexcept + { + return char_traits::WildMatch( m_data->string, Length(), pattern, char8_traits::Length( pattern ), false/*caseSensitive*/ ); + } + + // ------------------------------------------------------------------------- + + String SetToLength( size_type n ) const + { + return string_base::SetToLength( n ); + } + + String ResizedToNullTerminated() const + { + return string_base::ResizedToNullTerminated(); + } + + String Squeezed() const + { + return string_base::Squeezed(); + } + + // ------------------------------------------------------------------------- + + String Substring( size_type i, size_type n = maxPos ) const + { + return string_base::Substring( i, n ); + } + + String Left( size_type n ) const + { + return string_base::Left( n ); + } + + String Right( size_type n ) const + { + return string_base::Right( n ); + } + + String Suffix( size_type i ) const + { + return string_base::Suffix( i ); + } + + String Prefix( size_type i ) const + { + return string_base::Prefix( i ); + } + + // ------------------------------------------------------------------------- + + template + size_type Break( C& list, const String& s, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, s, trim, i ); + } + + template + size_type Break( C& list, const string8_base& s, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, String( s ), trim, i ); + } + + template + size_type Break( C& list, const_c_string8 s, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, String( s ), trim, i ); + } + + template + size_type Break( C& list, char_type c, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, c, trim, i ); + } + + template + size_type Break( C& list, char8_type c, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, char_type( c ), trim, i ); + } + + template + size_type Break( C& list, const Array& ca, bool trim = false, size_type i = 0 ) const + { + return string_base::Break( list, ca, trim, i ); + } + + // ------------------------------------------------------------------------- + + template + size_type BreakIC( C& list, const String& s, bool trim = false, size_type i = 0 ) const + { + return string_base::BreakIC( list, s, trim, i ); + } + + template + size_type BreakIC( C& list, const string8_base& s, bool trim = false, size_type i = 0 ) const + { + return string_base::BreakIC( list, String( s ), trim, i ); + } + + template + size_type BreakIC( C& list, const_c_string8 s, bool trim = false, size_type i = 0 ) const + { + return string_base::BreakIC( list, String( s ), trim, i ); + } + + template + size_type BreakIC( C& list, char_type c, bool trim = false, size_type i = 0 ) const + { + return string_base::BreakIC( list, c, trim, i ); + } + + template + size_type BreakIC( C& list, char8_type c, bool trim = false, size_type i = 0 ) const + { + return string_base::BreakIC( list, char_type( c ), trim, i ); + } + + // ------------------------------------------------------------------------- + + String Trimmed() const + { + return string_base::Trimmed(); + } + + String TrimmedLeft() const + { + return string_base::TrimmedLeft(); + } + + String TrimmedRight() const + { + return string_base::TrimmedRight(); + } + + // ------------------------------------------------------------------------- + + String LeftJustified( size_type width, char_type fill = CharTraits::Blank() ) const + { + return string_base::LeftJustified( width, fill ); + } + + String RightJustified( size_type width, char_type fill = CharTraits::Blank() ) const + { + return string_base::RightJustified( width, fill ); + } + + String CenterJustified( size_type width, char_type fill = CharTraits::Blank() ) const + { + return string_base::CenterJustified( width, fill ); + } + + // ------------------------------------------------------------------------- + + String Enclosed( char_type c ) const + { + return string_base::Enclosed( c ); + } + + String SingleQuoted() const + { + return string_base::SingleQuoted(); + } + + String DoubleQuoted() const + { + return string_base::DoubleQuoted(); + } + + String Unquoted() const + { + return string_base::Unquoted(); + } + + // ------------------------------------------------------------------------- + + String CaseFolded() const + { + return string_base::CaseFolded(); + } + + String Lowercase() const + { + return string_base::Lowercase(); + } + + String Uppercase() const + { + return string_base::Uppercase(); + } + + // ------------------------------------------------------------------------- + + String Reversed() const + { + return string_base::Reversed(); + } + + String Sorted() const + { + return string_base::Sorted(); + } + + template + String Sorted( BP p ) const + { + return string_base::Sorted( p ); + } + + // ------------------------------------------------------------------------- + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * character. Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, char_type separator ) + { + Clear(); + return c.ToSeparated( *this, separator ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * character, and built using an \a append binary function. Returns a + * reference to this string. + * + * The binary function must be of the form: + * + * \code void append( String& s, char16_type c ); \endcode + * + * where \a c is being appended to \a s. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, char_type separator, AF append ) + { + Clear(); + return c.ToSeparated( *this, separator, append ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator string. + * Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const String& separator ) + { + Clear(); + return c.ToSeparated( *this, separator ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator string, + * and built using an \a append binary function. Returns a reference to this + * string. + * + * The binary function must be of the form: + * + * \code void append( String& s1, const String& s2 ); \endcode + * + * where \a s2 is being appended to \a s1. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const String& separator, AF append ) + { + Clear(); + return c.ToSeparated( *this, separator, append ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated string. Returns a reference to this string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const_c_string separator ) + { + return ToSeparated( c, String( separator ) ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated string, and built using an \a append binary function. + * Returns a reference to this string. + * + * The binary function must be of the form: + * + * \code void append( String& s1, const char16_type* s2 ); \endcode + * + * where \a s2 is being appended to \a s1. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const_c_string separator, AF append ) + { + return ToSeparated( c, String( separator ), append ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated 8-bit string (const char*). Returns a reference to this + * string. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const_c_string8 separator ) + { + return ToSeparated( c, String( separator ) ); + } + + /*! + * Replaces the contents of this string with a sequence of tokens extracted + * from a container \a c, separated with the specified \a separator + * null-terminated 8-bit string (const char*), and built using an \a append + * binary function. Returns a reference to this string. + * + * The binary function must be of the form: + * + * \code void append( String& s1, const char* s2 ); \endcode + * + * where \a s2 is being appended to \a s1. + * + * The container type C must have separated list generation semantics. All + * iterable PCL containers such as Array, Vector, etc. provide the necessary + * ToSeparated member functions. + */ + template + String& ToSeparated( const C& c, const_c_string8 separator, AF append ) + { + return ToSeparated( c, String( separator ), append ); + } + + /*! + * Replaces the contents of this string with a sequence of comma-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( ',' ) ); \endcode + */ + template + String& ToCommaSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::Comma() ); + } + + /*! + * Replaces the contents of this string with a sequence of colon-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( ':' ) ); \endcode + */ + template + String& ToColonSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::Colon() ); + } + + /*! + * Replaces the contents of this string with a sequence of space-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( ' ' ) ); \endcode + */ + template + String& ToSpaceSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::Blank() ); + } + + /*! + * Replaces the contents of this string with a sequence of + * tabulator-separated tokens extracted from a container \a c. Returns a + * reference to this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( '\t' ) ); \endcode + */ + template + String& ToTabSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::Tab() ); + } + + /*! + * Replaces the contents of this string with a sequence of new line + * separated tokens extracted from a container \a c. Returns a reference to + * this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( '\n' ) ); \endcode + */ + template + String& ToNewLineSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::LF() ); + } + + /*! + * Replaces the contents of this string with a sequence of null-separated + * tokens extracted from a container \a c. Returns a reference to this + * string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( '\0' ) ); \endcode + */ + template + String& ToNullSeparated( const C& c ) + { + return ToSeparated( c, CharTraits::Null() ); + } + + /*! + * Replaces the contents of this string with a hyphenated sequence of tokens + * extracted from a container \a c. Returns a reference to this string. + * + * This member function is equivalent to: + * + * \code ToSeparated( c, char16_type( '-' ) ); \endcode + */ + template + String& ToHyphenated( const C& c ) + { + return ToSeparated( c, CharTraits::Hyphen() ); + } + + // ------------------------------------------------------------------------- + + /*! + * Replaces all occurrences of HTML special characters in this string with + * valid HTML entities. Returns a reference to this string. + * + * The following replacements are performed: + * + * '&' (ampersand) becomes "\&" \n + * '"' (double quote) becomes "\"" \n + * "'" (single quote) becomes "\'" \n + * '<' (less than) becomes "\<" \n + * '>' (greater than) becomes "\>" + * + * \sa EncodedHTMLSpecialChars(), ToDecodedHTMLSpecialChars() + */ + String& ToEncodedHTMLSpecialChars(); + + /*! + * Returns a duplicate of this string with all occurrences of HTML special + * characters replaced with valid HTML entities. + * + * \sa ToEncodedHTMLSpecialChars(), DecodedHTMLSpecialChars() + */ + String EncodedHTMLSpecialChars() const + { + return String( *this ).ToEncodedHTMLSpecialChars(); + } + + /*! + * Replaces all occurrences of special HTML entities in this string with + * their corresponding plain text character equivalents. Returns a reference + * to this string. + * + * The following replacements are performed: + * + * "\&" (ampersand) becomes '&' \n + * "\"" (double quote) becomes '"' \n + * "\'" (single quote) becomes "'" \n + * "\'" (apostrophe) becomes "'" \n + * "\<" (less than) becomes '<' \n + * "\>" (greater than) becomes '>' + * + * \sa DecodedHTMLSpecialChars(), ToEncodedHTMLSpecialChars() + */ + String& ToDecodedHTMLSpecialChars(); + + /*! + * Returns a duplicate of this string with all occurrences of special HTML + * entities replaced with their corresponding plain text character + * equivalents. + * + * \sa ToDecodedHTMLSpecialChars(), EncodedHTMLSpecialChars() + */ + String DecodedHTMLSpecialChars() const + { + return String( *this ).ToDecodedHTMLSpecialChars(); + } + + // ------------------------------------------------------------------------- + +#ifdef __PCL_QT_INTERFACE + + operator QString() const + { + return PCL_GET_QSTRING_FROM_CHAR16PTR( c_str() ); + } + + operator QDate() const + { + return QDate::fromString( operator QString(), PCL_QDATE_FMT_STR ); + } + + operator QDateTime() const + { + return QDateTime::fromString( operator QString(), PCL_QDATETIME_FMT_STR ); + } + +#endif + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + String& Format( const_c_string8 fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)VFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Appends a formatted representation of a variable-length set of values to + * the current contents of this string. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + String& AppendFormat( const_c_string8 fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)AppendVFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values, specified as a \c va_list standard + * parameter list. Returns the number of characters generated. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int VFormat( const_c_string8 fmt, va_list paramList ) + { + IsoString s; + int count = s.VFormat( fmt, paramList ); + Assign( s ); + return count; + } + + /*! + * Appends a formatted representation of a variable-length set of values, + * specified as a \c va_list standard parameter list, to the current + * contents of this string. Returns the number of characters appended. + * + * The \a fmt null-terminated string is a standard printf format + * string. It follows the same rules as its counterpart parameter in + * the standard printf( const char* fmt, ... ) C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int AppendVFormat( const_c_string8 fmt, va_list paramList ) + { + IsoString s; + int count = s.VFormat( fmt, paramList ); + Append( s ); + return count; + } + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string of \c wchar_t characters. It follows the same rules as its + * counterpart parameter in the standard wprintf( const wchar_t* fmt, ... ) + * C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + String& Format( const wchar_t* fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)VFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Appends a formatted representation of a variable-length set of values to + * the current contents of this string. Returns a reference to this string. + * + * The \a fmt null-terminated string is a standard printf format + * string of \c wchar_t characters. It follows the same rules as its + * counterpart parameter in the standard wprintf( const wchar_t* fmt, ... ) + * C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + String& AppendFormat( const wchar_t* fmt, ... ) + { + va_list paramList; + va_start( paramList, fmt ); + + (void)AppendVFormat( fmt, paramList ); + + va_end( paramList ); + return *this; + } + + /*! + * Replaces the contents of this string with a formatted representation of a + * variable-length set of values, specified as a \c va_list standard + * parameter list. Returns the number of characters generated. + * + * The \a fmt null-terminated string is a standard printf format + * string of \c wchar_t characters. It follows the same rules as its + * counterpart parameter in the standard wprintf( const wchar_t* fmt, ... ) + * C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int VFormat( const wchar_t* fmt, va_list paramList ); + + /*! + * Appends a formatted representation of a variable-length set of values, + * specified as a \c va_list standard parameter list, to the current + * contents of this string. Returns the number of characters appended. + * + * The \a fmt null-terminated string is a standard printf format + * string of \c wchar_t characters. It follows the same rules as its + * counterpart parameter in the standard wprintf( const wchar_t* fmt, ... ) + * C runtime function. + * + * The required space to store the resulting formatted output is calculated + * and allocated transparently. + */ + int AppendVFormat( const wchar_t* fmt, va_list paramList ); + + // ------------------------------------------------------------------------- + + /*! + * Conversion of a UTF-8 substring to a UTF-16 string. + * + * Converts a contiguous sequence of \a n characters starting at the \a i-th + * position of the specified null-terminated UTF-8 \a string. Returns the + * resulting UTF-16 string. + * + * \sa UTF16ToUTF8(), UTF16ToUTF32(), UTF32ToUTF16() + */ + static String UTF8ToUTF16( const_c_string8 string, size_type i = 0, size_type n = maxPos ); + + /*! + * Conversion of a UTF-16 substring to a UTF-8 string. + * + * Converts a contiguous sequence of \a n characters starting at the \a i-th + * position of the specified null-terminated UTF-16 \a string. Returns the + * resulting UTF-8 string. + * + * \sa UTF8ToUTF16(), UTF16ToUTF32(), UTF32ToUTF16() + */ + static IsoString UTF16ToUTF8( const_c_string string, size_type i = 0, size_type n = maxPos ); + + /*! + * Conversion of a UTF-16 substring to a UTF-32 string. + * + * Converts a contiguous sequence of \a n characters starting at the \a i-th + * position of the specified null-terminated UTF-16 \a string. Returns the + * resulting UTF-32 string as a dynamic array. + * + * \sa UTF8ToUTF16(), UTF16ToUTF8(), UTF32ToUTF16() + */ + static Array UTF16ToUTF32( const_c_string string, size_type i = 0, size_type n = maxPos ); + + /*! + * Conversion of a UTF-32 substring to a UTF-16 string. + * + * Converts a contiguous sequence of \a n characters starting at the \a i-th + * position of the specified null-terminated UTF-32 \a string. Returns the + * resulting UTF-16 string. + * + * \sa UTF8ToUTF16(), UTF16ToUTF8(), UTF16ToUTF32() + */ + static String UTF32ToUTF16( const uint32* string, size_type i = 0, size_type n = maxPos ); + + // ------------------------------------------------------------------------- + + /*! + * Returns an 8-bit, ISO/IEC-8859-1 string with a converted copy of this + * %String object. Characters in this string that cannot be converted to + * ISO-8859-1 (that is, characters with code points greater than 0x100) will + * have undefined values in the returned string. Undefined values are + * represented with question mark characters (?). + * + * \sa ToUTF8(), ToMBS(), ToUTF32(), To7BitASCII() + */ + IsoString ToIsoString() const; + + /*! + * Returns a 7-bit ASCII string with a converted copy of this %String + * object. Characters in this string that cannot be converted to the 7-bit + * ASCII set (that is, characters with code points greater than 0x80) will + * have undefined values in the returned string. Undefined values are + * represented with question mark characters (?). + * + * \sa ToIsoString(), ToUTF8(), ToMBS(), ToUTF32() + */ + IsoString To7BitASCII() const; + + /*! + * Returns an 8-bit string with a UTF-8 representation of a subset of \a n + * contiguous UTF-16 characters from this %String object, starting at the + * \a i-th character. + * + * \sa ToMBS(), ToLocal8Bit(), ToIsoString(), ToUTF32() + */ + IsoString ToUTF8( size_type i = 0, size_type n = maxPos ) const + { + return UTF16ToUTF8( Begin(), i, n ); + } + + /*! + * Returns a copy of this Unicode string converted to a multibyte + * string. This conversion is dependent on the current locale. + * + * In the event of conversion error (if there are invalid wide characters in + * the source string) this routine returns an empty string. + * + * This member function is a convenience wrapper for the wcstombs() routine + * of the standard C runtime library. Note that on platforms where the size + * of wchar_t is four bytes (e.g. Linux) this routine performs an additional + * conversion from UTF-16 to UTF-32. On platforms where the size of wchar_t + * is two bytes (e.g. Windows), the conversion is direct. + * + * \sa ToUTF8(), ToLocal8Bit(), ToIsoString(), ToUTF32(); + */ + IsoString ToMBS() const; + + /*! + * Returns a copy of this Unicode string converted to an 8-bit + * locale-dependent string. On UNIX/Linux systems (FreeBSD, Linux, Mac OS X) + * this function is equivalent to ToUTF8(). On Windows, this function + * returns ToMBS(). + * + * \sa ToUTF8(), ToMBS(); + */ + IsoString ToLocal8Bit() const + { +#ifdef __PCL_WINDOWS + return ToMBS(); +#else + return ToUTF8(); +#endif + } + + /*! + * Returns a copy of a contiguous segment of \a n characters of this string, + * starting from its \a i-th character, as a dynamic array of \c wchar_t. A + * null terminating character (L'\\0' specifically) is always appended to + * the resulting array. + * + * Depending on the platform, the \c wchar_t type may be 16-bit wide + * (Windows) or 32-bit wide (UNIX/Linux). The char16_type used by %String is + * always a 16-bit character (UTF-16) on all supported platforms. + * + * This member function provides a platform-independent way to obtain the + * contents of a %String object as a standard null-terminated string of + * \c wchar_t characters. + * + * On platforms where wchar_t occupies four bytes (UNIX/Linux), this + * function assumes that this %String object contains no surrogates. For a + * generalized conversion from UTF-16 to UTF-32, see ToUTF32(). + * + * \sa ToUTF32(), ToUTF8(), ToMBS(), ToIsoString() + */ + Array ToWCharArray( size_type i = 0, size_type n = maxPos ) const + { + if ( n > 0 ) + { + size_type len = Length(); + if ( i < len ) + { + n = pcl::Min( n, len-i ); + Array a( n+1, wchar_t( 0 ) ); +#ifdef __PCL_WINDOWS + char_traits::Copy( reinterpret_cast( a.Begin() ), m_data->string+i, n ); +#else + Array::iterator w = a.Begin(); + for ( const_iterator s = m_data->string+i, e = s+n; s < e; ++w, ++s ) + *w = wchar_t( *s ); +#endif // __PCL_WINDOWS + return a; + } + } + + return Array( size_type( 1 ), wchar_t( 0 ) ); + } + + /*! + * Returns a dynamic array of 32-bit integers with a UTF-32 representation + * of a subset of \a n contiguous UTF-16 characters from this %String + * object, starting at the \a i-th character. A null terminating character + * (uint32( 0 ) specifically) is always appended to the resulting array. + * + * \sa ToWCharArray(), ToUTF8(), ToMBS(), ToIsoString() + */ + Array ToUTF32( size_type i = 0, size_type n = maxPos ) const + { + return UTF16ToUTF32( Begin(), i, n ); + } + +#ifdef __PCL_QT_INTERFACE + + QString ToQString() const + { + return operator QString(); + } + + QDate ToQDate() const + { + return operator QDate(); + } + + QDateTime ToQDateTime() const + { + return operator QDateTime(); + } + +#endif + + /*! + * Evaluates this string as a Boolean literal, and returns the result as a + * \c bool value. + * + * Returns \c true if this string is equal to "1", "true", "TRUE" or "T". + * Returns \c false if this string is equal to "0", "false", "FALSE" or "F". + * Otherwise this function throws a ParseError exception. + * + * \sa TryToBool() + */ + bool ToBool() const; + + /*! + * Attempts to evaluate this string as a Boolean literal. + * + * If this string can legally be converted to a Boolean value, this function + * returns \c true and stores the evaluation result in the \a value + * variable. A string can only be converted to Boolean type if it is equal + * to either "1", "true", "TRUE", "T", "0", "false", "FALSE" or "F". + * + * If this string cannot be converted to a Boolean value, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToBool() + */ + bool TryToBool( bool& value ) const noexcept; + + /*! + * Evaluates this string as a floating point numeric literal, and returns + * the result as a \c float value. + * + * For information about the legal syntax of a floating point literal, see + * the documentation for the ToDouble() member function. + * + * If this string doesn't contain a valid floating point literal, or if the + * range of \c float is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToFloat() + */ + float ToFloat() const; + + /*! + * Attempts to evaluate this string as a floating point numeric literal. + * + * If this string can legally be converted to a floating point number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. For information about the legal syntax of a floating point + * literal, see the documentation for the ToDouble() member function. + * + * If this string cannot be converted to a floating point number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToFloat() + */ + bool TryToFloat( float& value ) const noexcept; + + /*! + * Evaluates this string as a floating point literal, and returns the result + * as a \c double value. + * + * The source string is expected to have the following format (informal + * format specification): + * + * [+|-][\][.[\]][\[+|-]\] + * + * where \ and \ are optional sequences of + * decimal digits from 0 to 9, \ is an exponent specifier + * (the letter 'e' (or 'E')), and \ is a sequence of decimal + * digits specifying a power of ten that multiplies the preceding numeric + * constant. At least a one-digit integer part, or a one-digit decimal part, + * is mandatory. FORTRAN exponent specifiers ('d' and 'f' (or 'D' and 'F')) + * are also recognized by this implementation. + * + * If this string doesn't contain a valid floating point literal, or if the + * range of \c double is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToDouble() + */ + double ToDouble() const; + + /*! + * Attempts to evaluate this string as a floating point numeric literal. + * + * If this string can legally be converted to a floating point number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. For information about the legal syntax of a floating point + * literal, see the documentation for the ToDouble() member function. + * + * If this string cannot be converted to a floating point number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToDouble() + */ + bool TryToDouble( double& value ) const noexcept; + + /*! + * Evaluates this string as an integer literal, and returns the result as a + * \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code long n = s.ToInt( 0 ); \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string doesn't contain a valid integer literal, or if the range + * of \c long is exceeded, this member function throws a ParseError exception. + * + * \sa TryToInt() + */ + long ToInt() const + { + return ToInt( 0 ); + } + + /*! + * Attempts to evaluate this string as an integer numeric literal. + * + * If this string can legally be converted to an integer number, this + * function returns \c true and stores the evaluation result in the \a value + * variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * int v; + * if ( s.TryToInt( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToInt() + */ + bool TryToInt( int& value ) const noexcept + { + return TryToInt( value, 0 ); + } + + /*! + * Evaluates this string as an integer literal in the specified \a base, and + * returns the result as a \c long value. + * + * If \a base is 0, the source string is expected to represent either a + * decimal constant, an octal constant, or a hexadecimal constant, any of + * which optionally preceded by a sign character (+ or -). A decimal + * constant begins with a non-zero digit, and consists of a sequence of + * decimal digits from '0' to '9'. An octal begins with the prefix '0', + * optionally followed by a sequence of the digits 0 to 7 only. A + * hexadecimal constant begins with the prefix '0x' or '0X', which must be + * followed by a sequence of decimal digits and letters from 'a' (or 'A') + * to 'f' (or 'F'), whose corresponding decimal values are from 10 to 15, + * respectively. + * + * Other legal values of \a base, from 2 to 36, specify the expected base of + * the integer constant represented by the source string. Decimal digits and + * letters from 'a' (or 'A') to 'z' (or 'Z') are used to represent all + * possible digits in the specified base, as necessary. + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of \c long + * is exceeded, this member function throws a ParseError exception. + * + * \sa TryToInt( int&, int ) const + */ + long ToInt( int base ) const; + + /*! + * Attempts to evaluate this string as an integer numeric literal in the + * specified \a base. + * + * If this string can legally be converted to an integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number in the specified + * \a base, this function returns \c false and does not change the \a value + * variable. This function does not throw any exception. + * + * \sa ToInt( int ) const + */ + bool TryToInt( int& value, int base ) const noexcept; + + /*! + * Evaluates this string as an unsigned integer literal, and returns the + * result as an \c unsigned \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code unsigned long n = s.ToUInt( 0 ); \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string doesn't contain a valid unsigned integer literal, or if + * the range of \c unsigned \c long is exceeded, this member function throws + * a ParseError exception. + * + * \sa TryToUInt() + */ + unsigned long ToUInt() const + { + return ToUInt( 0 ); + } + + /*! + * Attempts to evaluate this string as an unsigned integer literal. + * + * If this string can legally be converted to an unsigned integer number, + * this function returns \c true and stores the evaluation result in the + * \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * unsigned v; + * if ( s.TryToUInt( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an integer number, this function + * returns \c false and does not change the \a value variable. This function + * does not throw any exception. + * + * \sa ToUInt() + */ + bool TryToUInt( unsigned& value ) const noexcept + { + return TryToUInt( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). The only exception + * is that for this member function, only a + sign is legal preceding the + * numeric constant represented by the source string. + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of + * \c unsigned \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToUInt( unsigned&, int ) const + */ + unsigned long ToUInt( int base ) const; + + /*! + * Attempts to evaluate this string as an unsigned integer literal in the + * specified \a base. + * + * If this string can legally be converted to an unsigned integer number in + * the specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * See the documentation under ToUInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to an unsigned integer number in the + * specified \a base, this function returns \c false and does not change the + * \a value variable. This function does not throw any exception. + * + * \sa ToUInt( int ) const + */ + bool TryToUInt( unsigned& value, int base ) const noexcept; + + /*! + * Evaluates this string as an integer literal, and returns the result as a + * \c long \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code long long n = s.ToInt64( 0 ); \endcode + * + * If this string doesn't contain a valid integer literal, or if the range + * of \c long \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToInt64() + */ + long long ToInt64() const + { + return ToInt64( 0 ); + } + + /*! + * Attempts to evaluate this string as a 64-bit integer numeric literal in + * the specified \a base. + * + * If this string can legally be converted to a 64-bit integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * long long v; + * if ( s.TryToInt64( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to a 64-bit integer number, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \sa ToInt64() + */ + bool TryToInt64( long long& value ) const noexcept + { + return TryToInt64( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as a \c long \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string doesn't contain a valid integer literal in the specified + * \a base, if an illegal \a base is specified, or if the range of + * \c long \c long is exceeded, this member function throws a ParseError + * exception. + * + * \sa TryToInt64( long long&, int ) const + */ + long long ToInt64( int base ) const; + + /*! + * Attempts to evaluate this string as a 64-bit integer numeric literal in + * the specified \a base. + * + * If this string can legally be converted to a 64-bit integer number in the + * specified \a base, this function returns \c true and stores the + * evaluation result in the \a value variable. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string cannot be converted to a 64-bit integer number in the + * specified \a base, this function returns \c false and does not change the + * \a value variable. This function does not throw any exception. + * + * \sa ToInt64( int ) const + */ + bool TryToInt64( long long& value, int base ) const noexcept; + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long \c long value. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code unsigned long long n = s.ToUInt64( 0 ); \endcode + * + * If this string doesn't contain a valid unsigned integer literal, or if + * the range of \c unsigned \c long \c long is exceeded, this member + * function throws a ParseError exception. + * + * \sa TryToUInt64() + */ + unsigned long long ToUInt64() const + { + return ToUInt64( 0 ); + } + + /*! + * Attempts to evaluate this string as a 64-bit unsigned integer numeric + * literal in the specified \a base. + * + * If this string can legally be converted to a 64-bit unsigned integer + * number in the specified \a base, this function returns \c true and stores + * the evaluation result in the \a value variable. + * + * Calling this member function for a string \c s is equivalent to: + * + * \code + * unsigned long long v; + * if ( s.TryToUInt64( v, 0 ) ) ... + * \endcode + * + * See the documentation under ToInt( int ) for information about automatic + * base conversions when \a base=0 is specified. + * + * If this string cannot be converted to a 64-bit unsigned integer number, + * this function returns \c false and does not change the \a value variable. + * This function does not throw any exception. + * + * \sa ToUInt64() + */ + bool TryToUInt64( unsigned long long& value ) const noexcept + { + return TryToUInt64( value, 0 ); + } + + /*! + * Evaluates this string as an unsigned integer literal in the specified + * \a base, and returns the result as an \c unsigned \c long \c long value. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string doesn't contain a valid unsigned integer literal in the + * specified \a base, if an illegal \a base is specified, or if the range of + * \c unsigned \c long \c long is exceeded, this member function throws a + * ParseError exception. + * + * \sa TryToUInt64( unsigned long long&, int ) const + */ + unsigned long long ToUInt64( int base ) const; + + /*! + * Attempts to evaluate this string as an unsigned 64-bit integer numeric + * literal in the specified \a base. + * + * If this string can legally be converted to an unsigned 64-bit integer + * number in the specified \a base, this function returns \c true and stores + * the evaluation result in the \a value variable. + * + * For information about possible values of \a base and how these are + * interpreted, see the documentation under ToInt( int ). + * + * If this string cannot be converted to an unsigned 64-bit integer number + * in the specified \a base, this function returns \c false and does not + * change the \a value variable. This function does not throw any exception. + * + * \sa ToUInt64( int ) const + */ + bool TryToUInt64( unsigned long long& value, int base ) const noexcept; + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * and returns the result as a \c double value. + * + * The source string is expected to have the following format: + * + * [+|-]\[\\[\\]][.[\]] + * + * where \, \, \ and \ are sequences of + * decimal digits from 0 to 9, and \ is any sequence of characters + * specified as the \a separator argument. The default separator is the + * colon character, ':'. + * + * The result is equal to: + * + * \ * (\ + \/60 + \/3600) + * + * where omitted optional components are taken as zero, and \ is -1 + * iff a minus sign '-' leads the representation, or +1 otherwise. + * + * If this string doesn't contain a valid sexagesimal numeric literal, or if + * the range of \c double is exceeded, this member function throws a + * ParseError exception. + * + * \ingroup sexagesimal_conversion + * \sa TrySexagesimalToDouble(), ParseSexagesimal(), TryParseSexagesimal() + */ + double SexagesimalToDouble( const String& separator = ':' ) const + { + int sign, s1, s2; double s3; + ParseSexagesimal( sign, s1, s2, s3, separator ); + return sign*(s1 + (s2 + s3/60)/60); + } + + /*! + * Evaluates this string as a sexagesimal numeric literal representation + * with the specified set of \a separators, and returns the result as a + * \c double value. + * + * This function is identical to SexagesimalToDouble( const String& ), but a + * set of separator characters is specified as a dynamic array. Any + * occurrence of a character contained by \a separators will be valid as a + * token separator. + * + * \ingroup sexagesimal_conversion + * \sa TrySexagesimalToDouble( double&, const Array<>& ) + */ + double SexagesimalToDouble( const Array& separators ) const + { + int sign, s1, s2; double s3; + ParseSexagesimal( sign, s1, s2, s3, separators ); + return sign*(s1 + (s2 + s3/60)/60); + } + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal with + * the specified \a separator. + * + * If this string can legally be evaluated as a sexagesimal literal and + * converted to a floating point number, this function stores the evaluation + * result in the specified \a value variable and returns \c true. For + * information about the legal syntax of a sexagesimal literal, see the + * documentation for SexagesimalToDouble(). + * + * If this string cannot be evaluated as a sexagesimal literal, this + * function returns \c false and does not change the \a value variable. This + * function does not throw any exception. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble(), ParseSexagesimal(), TryParseSexagesimal() + */ + bool TrySexagesimalToDouble( double& value, const String& separator = ':' ) const noexcept + { + int sign, s1, s2; double s3; + if ( TryParseSexagesimal( sign, s1, s2, s3, separator ) ) + { + value = sign*(s1 + (s2 + s3/60)/60); + return true; + } + return false; + } + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal with + * the specified set of \a separators. + * + * This function is identical to + * TrySexagesimalToDouble( double&, const String& ), but a set of separator + * characters is specified as a dynamic array. Any occurrence of a character + * contained by \a separators will be valid as a token separator. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble( const Array<>& ) + */ + bool TrySexagesimalToDouble( double& value, const Array& separators ) const noexcept + { + int sign, s1, s2; double s3; + if ( TryParseSexagesimal( sign, s1, s2, s3, separators ) ) + { + value = sign*(s1 + (s2 + s3/60)/60); + return true; + } + return false; + } + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * using the specified \a separator, and stores the resulting components in + * the specified \a sign, \a s1, \a s2 and \a s3 variables. + * + * The output value of \a sign is either -1 or +1, respectively for negative + * and positive values. + * + * For information about the legal syntax of a sexagesimal literal, see the + * documentation for SexagesimalToDouble(). + * + * This function stores \e canonical minutes and seconds components, + * irrespective of the actual component values represented by this string. + * The output sexagesimal component values are such that: + * + * 0 ≤ \a s1 \n + * 0 ≤ \a s2 < 60 \n + * 0 ≤ \a s3 < 60 \n + * + * If this string doesn't contain a valid sexagesimal numeric literal, or if + * the range of \c double is exceeded, this member function throws a + * ParseError exception. + * + * \ingroup sexagesimal_conversion + * \sa TryParseSexagesimal(), SexagesimalToDouble(), TrySexagesimalToDouble() + */ + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const String& separator = ':' ) const; + + /*! + * Evaluates this string as a sexagesimal numeric literal representation, + * using the specified set of \a separators, and stores the resulting + * components in the specified \a sign, \a s1, \a s2 and \a s3 variables. + * + * This function is identical to + * ParseSexagesimal( int&, int&, int&, double&, const String& ), but a set + * of separator characters is specified as a dynamic array. Any occurrence + * of a character contained by \a separators will be valid as a token + * separator. + * + * \ingroup sexagesimal_conversion + * \sa TryParseSexagesimal( int&, int&, int&, double&, const Array<>& ) + */ + void ParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const Array& separators ) const; + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal + * representation, using the specified \a separator. If successful, stores + * the resulting components in the specified \a sign, \a s1, \a s2 and \a s3 + * variables, and returns \c true. For more information on syntax and + * output values and ranges, see the documentation for ParseSexagesimal(). + * + * If this string cannot be evaluated as a sexagesimal literal, this + * function returns \c false and does not change any of the \a sign, \a s1, + * \a s2 and \a s3 variables. This function does not throw any exception. + * + * \ingroup sexagesimal_conversion + * \sa ParseSexagesimal(), SexagesimalToDouble(), TrySexagesimalToDouble() + */ + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const String& separator = ':' ) const noexcept; + + /*! + * Attempts to evaluate this string as a sexagesimal numeric literal + * representation, using the specified set of \a separators. + * + * This function is identical to + * TryParseSexagesimal( int&, int&, int&, double&, const String& ), but a + * set of separator characters is specified as a dynamic array. Any + * occurrence of a character contained by \a separators will be valid as a + * token separator. + * + * \ingroup sexagesimal_conversion + * \sa ParseSexagesimal( int&, int&, int&, double&, const Array<>& ) + */ + bool TryParseSexagesimal( int& sign, int& s1, int& s2, double& s3, const Array& separators ) const noexcept; + + /*! + * Returns a sexagesimal ASCII representation of the specified components + * \a sign, \a s1, \a s2 and \a s3, generated with the specified conversion + * \a options. + * + * The generated representation will correspond to a negative value iff + * \a sign < 0, positive otherwise. + * + * The generated representation is of the form: + * + * [+|-]\[\\[\\]][.[\]] + * + * where the second and third sexagesimal components are canonicalized: + * + * 0 ≤ \ < 60 + * 0 ≤ \ < 60 + * + * irrespective of the original \a s2 and \a s3 argument values. + * + * \ingroup sexagesimal_conversion + * \sa SexagesimalToDouble(), SexagesimalConversionOptions, + * AngleConversionOptions, LongitudeConversionOptions, RAConversionOptions, + * LatitudeConversionOptions, DecConversionOptions + */ + static String ToSexagesimal( int sign, double s1, double s2, double s3, + const SexagesimalConversionOptions& options = SexagesimalConversionOptions() ); + + /*! + * Returns a sexagesimal ASCII representation of the specified decimal value + * \a d, generated with the specified conversion \a options. + * + * Calling this member function is equivalent to: + * + * \code ToSexagesimal( (d < 0) ? -1 : +1, Abs( d ), 0, 0, options ); \endcode + * + * \ingroup sexagesimal_conversion + */ + static String ToSexagesimal( double d, const SexagesimalConversionOptions& options = SexagesimalConversionOptions() ) + { + return ToSexagesimal( (d < 0) ? -1 : +1, Abs( d ), 0, 0, options ); + } + + /*! + * Evaluates this string as a date and time specification in ISO 8601 + * extended format, and stores the resulting components in the specified + * variables. + * + * \param year On output, the year of the date. + * + * \param month On output, the month of the date in the range [1,12]. + * + * \param day On output, the day of the date in the range [1,31]. + * + * \param dayf On output, the day fraction corresponding to the time + * specification, in the range [0,1). + * + * \param tz On output, the time zone offset in hours, in the range + * [-12,+12]. + * + * In ISO 8601 extended representations, decimal fractions must be divided + * from integer parts exclusively by the full stop or dot character ('.', + * ASCII code point 46(10) = 2E(16)). + * + * \sa TryParseISO8601DateTime(), TimePoint::FromString() + */ + void ParseISO8601DateTime( int& year, int& month, int& day, double& dayf, double& tz ) const; + + /*! + * Attempts to evaluate this string as a date and time specification in ISO + * 8601 extended format. If successful, stores the resulting components in + * the specified \a year, \a month, \a day and \a dayf and \a tz variables, + * and returns \c true. For more information on syntax and + * output values and ranges, see the ParseISO8601DateTime(). + * + * If this string cannot be evaluated as a valid date and time in ISO 8601 + * format, this function returns \c false and does not change any of the + * passed variables. This function does not throw any exception. + * + * \sa ParseISO8601DateTime(), TimePoint::TryFromString() + */ + bool TryParseISO8601DateTime( int& year, int& month, int& day, double& dayf, double& tz ) const noexcept; + + /*! + * Returns a string representation of a date and time in ISO 8601 extended + * format. + * + * \param year The year of the date. + * + * \param month The month of the date in the range [1,12]. + * + * \param day The day of the date in the range [1,31]. + * + * \param dayf The day fraction corresponding to the time specification, + * in the range [0,1). + * + * \param tz The time zone offset in hours, in the range [-12,+12]. The + * default value is zero, to be interpreted as UTC. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentUTCISO8601DateTime(), CurrentLocalISO8601DateTime(), + * ParseISO8601DateTime(), ISO8601ConversionOptions, + * TimePoint::ToString() + */ + static String ToISO8601DateTime( int year, int month, int day, double dayf, double tz = 0, + const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Returns an ASCII representation of the current UTC date and time in ISO + * 8601 extended format. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentLocalISO8601DateTime(), ToISO8601DateTime(), + * ISO8601ConversionOptions, TimePoint::Now() + */ + static String CurrentUTCISO8601DateTime( const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Returns an ASCII representation of the current local date and time in ISO + * 8601 extended format. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 format. + * + * \sa CurrentUTCISO8601DateTime(), ToISO8601DateTime(), + * ISO8601ConversionOptions + */ + static String CurrentLocalISO8601DateTime( const ISO8601ConversionOptions& options = ISO8601ConversionOptions() ); + + /*! + * Generates a string of \a n random 16-bit code points, with character + * types and ranges as prescribed by the specified \a options. + * + * \sa RandomizationOption + */ + static String Random( size_type n, RandomizationOptions options = RandomizationOption::Default ); + + /*! + * Generates a universally unique identifier (UUID) in canonical form. + * + * The canonical UUID has 36 characters with the following format: + * + * xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx + * + * where 'x' represents a lowercase hexadecimal digit, '4' is the UUID + * version indicator (version 4 = truly random UUID), and 'y' is one of '8', + * '9', 'a', or 'b'. + */ + static String UUID(); +}; + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +inline IsoString::IsoString( const_c_ustring t, size_type p, size_type n ) +{ + size_type len = uchar_traits::Length( t ); + if ( p < len ) + { + m_data->Allocate( n = pcl::Min( n, len-p ) ); + t += p; + for ( iterator i = m_data->string; i < m_data->end; ++i, ++t ) + *i = char_type( uint8( *t ) ); + } +} + +inline IsoString& IsoString::operator =( const_c_ustring t ) +{ + size_type len = uchar_traits::Length( t ); + if ( len > 0 ) + { + MaybeReallocate( len ); + for ( iterator i = m_data->string; i < m_data->end; ++i, ++t ) + *i = char_type( uint8( *t ) ); + } + else + Clear(); + + return *this; +} + +inline IsoString::ustring_base IsoString::UTF8ToUTF16( size_type i, size_type n ) const +{ + return String::UTF8ToUTF16( Begin(), i, n ); +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup string_concatenation_ops String Concatenation Operators + */ + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * and \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, const String::string_base& s2 ) +{ + String s = s1; + s.Append( s2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, const String::string_base& s2 ) +{ + s1.Append( s2 ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, const String::string_base& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String::string_base&& s2 ) +{ + s2.Prepend( s1 ); + return String( std::move( s2 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String&& s2 ) +{ + s2.Prepend( s1 ); + return std::move( s2 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String::string_base&& s2 ) +{ + s1.Append( s2 ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String::string_base&& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String&& s2 ) +{ + s1.Append( s2 ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of two UTF-16 strings \a s1 + * (rvalue reference) and \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String&& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a null-terminated UTF-16 string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String::const_iterator t2 ) +{ + String s = s1; + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated UTF-16 string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String::const_iterator t2 ) +{ + s1.Append( t2 ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated UTF-16 string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String::const_iterator t2 ) +{ + s1.Append( t2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated UTF-16 + * string \a t1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_iterator t1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated UTF-16 + * string \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_iterator t1, String::string_base&& s2 ) +{ + s2.Prepend( t1 ); + return String( std::move( s2 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated UTF-16 + * string \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_iterator t1, String&& s2 ) +{ + s2.Prepend( t1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a single UTF-16 character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String::char_type c2 ) +{ + String s = s1; + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single UTF-16 character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String::char_type c2 ) +{ + s1.Append( c2 ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single UTF-16 character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String::char_type c2 ) +{ + s1.Append( c2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single UTF-16 character + * \a c1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char_type c1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single UTF-16 character + * \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char_type c1, String::string_base&& s2 ) +{ + s2.Prepend( c1 ); + return String( std::move( s2 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single UTF-16 character + * \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char_type c1, String&& s2 ) +{ + s2.Prepend( c1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a null-terminated string of \c char16_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, const char16_t* t2 ) +{ + String s = s1; + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated string of \c char16_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, const char16_t* t2 ) +{ + String s = std::move( s1 ); + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated string of \c char16_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, const char16_t* t2 ) +{ + s1.Append( t2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c char16_t \a t1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const char16_t* t1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c char16_t \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const char16_t* t1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c char16_t \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const char16_t* t1, String&& s2 ) +{ + s2.Prepend( t1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a single \c char16_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, char16_t c2 ) +{ + String s = s1; + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single \c char16_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, char16_t c2 ) +{ + String s = std::move( s1 ); + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single \c char16_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, char16_t c2 ) +{ + s1.Append( c2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c char16_t + * character \a c1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( char16_t c1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c char16_t + * character \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( char16_t c1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c char16_t + * character \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( char16_t c1, String&& s2 ) +{ + s2.Prepend( c1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a null-terminated string of \c wchar_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, const wchar_t* t2 ) +{ + String s = s1; + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated string of \c wchar_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, const wchar_t* t2 ) +{ + String s = std::move( s1 ); + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated string of \c wchar_t \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, const wchar_t* t2 ) +{ + s1.Append( t2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c wchar_t \a t1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const wchar_t* t1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c wchar_t \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const wchar_t* t1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated string + * of \c wchar_t \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const wchar_t* t1, String&& s2 ) +{ + s2.Prepend( t1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a single \c wchar_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, wchar_t c2 ) +{ + String s = s1; + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single \c wchar_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, wchar_t c2 ) +{ + String s = std::move( s1 ); + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single \c wchar_t character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, wchar_t c2 ) +{ + s1.Append( c2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c wchar_t + * character \a c1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( wchar_t c1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c wchar_t + * character \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( wchar_t c1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single \c wchar_t + * character \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( wchar_t c1, String&& s2 ) +{ + s2.Prepend( c1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * an 8-bit string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, const String::string8_base& s2 ) +{ + String s = s1; + s.Append( s2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and an 8-bit string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, const String::string8_base& s2 ) +{ + String s = std::move( s1 ); + s.Append( s2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and an 8-bit string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, const String::string8_base& s2 ) +{ + s1.Append( s2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of an 8-bit string \a s1 and + * a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string8_base& s1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( s1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of an 8-bit string \a s1 and + * a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string8_base& s1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( s1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of an 8-bit string \a s1 and + * a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string8_base& s1, String&& s2 ) +{ + s2.Prepend( s1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a null-terminated 8-bit string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String::const_c_string8 t2 ) +{ + String s = s1; + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated 8-bit string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String::const_c_string8 t2 ) +{ + String s = std::move( s1 ); + s.Append( t2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a null-terminated 8-bit string \a t2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String::const_c_string8 t2 ) +{ + s1.Append( t2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated 8-bit + * string \a t1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_c_string8 t1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated 8-bit + * string \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_c_string8 t1, String::string_base&& s2 ) +{ + String s = std::move( s2 ); + s.Prepend( t1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a null-terminated 8-bit + * string \a t1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::const_c_string8 t1, String&& s2 ) +{ + s2.Prepend( t1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 and + * a single 8-bit character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( const String::string_base& s1, String::char8_type c2 ) +{ + String s = s1; + s.Append( c2 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single 8-bit character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::string_base&& s1, String::char8_type c2 ) +{ + s1.Append( String::char_type( c2 ) ); + return String( std::move( s1 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a UTF-16 string \a s1 + * (rvalue reference) and a single 8-bit character \a c2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String&& s1, String::char8_type c2 ) +{ + s1.Append( c2 ); + return std::move( s1 ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single 8-bit character + * \a c1 and a UTF-16 string \a s2. + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char8_type c1, const String::string_base& s2 ) +{ + String s = s2; + s.Prepend( c1 ); + return s; +} + +/*! + * Returns a UTF-16 string with the concatenation of a single 8-bit character + * \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char8_type c1, String::string_base&& s2 ) +{ + s2.Prepend( String::char_type( c1 ) ); + return String( std::move( s2 ) ); +} + +/*! + * Returns a UTF-16 string with the concatenation of a single 8-bit character + * \a c1 and a UTF-16 string \a s2 (rvalue reference). + * \ingroup string_concatenation_ops + */ +inline String operator +( String::char8_type c1, String&& s2 ) +{ + s2.Prepend( c1 ); + return std::move( s2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Appends a UTF-16 string \a s2 to a UTF-16 string \a s1. Returns a reference + * to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, const String::string_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends a UTF-16 string \a s2 to a UTF-16 string \a s1. Returns a reference + * to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, const String::string_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends a null-terminated UTF-16 string \a t2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, String::const_iterator& t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a null-terminated UTF-16 string \a t2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, String::const_iterator& t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a single UTF-16 character \a c2 to a UTF-16 string \a s1. Returns a + * reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, String::char_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a single UTF-16 character \a c2 to a UTF-16 string \a s1. Returns a + * reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, String::char_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 of \c char16_t to a UTF-16 string + * \a s1. Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, const char16_t* t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 of \c char16_t to a UTF-16 string + * \a s1. Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, const char16_t* t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a single \c char16_t character \a c2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, char16_t c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a single \c char16_t character \a c2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, char16_t c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 of \c wchar_t to a UTF-16 string + * \a s1. Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, const wchar_t* t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a null-terminated string \a t2 of \c wchar_t to a UTF-16 string + * \a s1. Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, const wchar_t* t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a single \c wchar_t character \a c2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, wchar_t c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a single \c wchar_t character \a c2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, wchar_t c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends an 8-bit string \a s2 to a UTF-16 string \a s1. Returns a reference + * to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, const String::string8_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends an 8-bit string \a s2 to a UTF-16 string \a s1. Returns a reference + * to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, const String::string8_base& s2 ) +{ + s1.Append( s2 ); + return s1; +} + +/*! + * Appends a null-terminated 8-bit string \a t2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, String::const_c_string8 t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a null-terminated 8-bit string \a t2 to a UTF-16 string \a s1. + * Returns a reference to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, String::const_c_string8 t2 ) +{ + s1.Append( t2 ); + return s1; +} + +/*! + * Appends a single 8-bit character \a c2 to a UTF-16 string \a s1. Returns a + * reference to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String& s1, String::char8_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +/*! + * Appends a single 8-bit character \a c2 to a UTF-16 string \a s1. Returns a + * reference to the left-hand operand Unicode string \a s1. + * \ingroup string_concatenation_ops + */ +inline String& operator <<( String&& s1, String::char8_type c2 ) +{ + s1.Append( c2 ); + return s1; +} + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup string_relational_ops String Relational Operators + */ + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, const char16_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, const char16_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, const char16_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, const char16_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, const char16_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const char16_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const char16_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const char16_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const char16_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const char16_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, char16_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, char16_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, char16_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, char16_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, char16_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( char16_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( char16_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( char16_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( char16_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( char16_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, const wchar_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, const wchar_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, const wchar_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, const wchar_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, const wchar_t* t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const wchar_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const wchar_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const wchar_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const wchar_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const wchar_t* t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, wchar_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, wchar_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, wchar_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, wchar_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, wchar_t c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( wchar_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( wchar_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( wchar_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( wchar_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( wchar_t c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, String::const_c_string8 t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, String::const_c_string8 t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, String::const_c_string8 t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, String::const_c_string8 t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, String::const_c_string8 t2 ) noexcept +{ + return s1.CompareCodePoints( t2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( String::const_c_string8 t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( String::const_c_string8 t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( String::const_c_string8 t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( String::const_c_string8 t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( String::const_c_string8 t1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( t1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( const String& s1, String::char8_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( const String& s1, String::char8_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) < 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( const String& s1, String::char8_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) <= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( const String& s1, String::char8_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) > 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( const String& s1, String::char8_type c2 ) noexcept +{ + return s1.CompareCodePoints( c2 ) >= 0; +} + +// ---------------------------------------------------------------------------- + +/*! + * Equality operator. + * \ingroup string_relational_ops + */ +inline bool operator ==( String::char8_type c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) == 0; +} + +/*! + * Less than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <( String::char8_type c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) > 0; +} + +/*! + * Less than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator <=( String::char8_type c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) >= 0; +} + +/*! + * Greater than operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >( String::char8_type c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) < 0; +} + +/*! + * Greater than or equal operator. This function performs a + * character-to-character, locale-unaware comparison of numeric character + * values. See GenericString<>::CompareCodePoints() for more information. + * \ingroup string_relational_ops + */ +inline bool operator >=( String::char8_type c1, const String& s2 ) noexcept +{ + return s2.CompareCodePoints( c1 ) <= 0; +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_STRING_OSTREAM + +inline std::wostream& operator <<( std::wostream& o, const String& s ) +{ +#ifdef __PCL_WINDOWS + return o << reinterpret_cast( s.c_str() ); +#else + Array w = s.ToWCharArray(); + return o << w.Begin(); +#endif +} + +inline std::ostream& operator <<( std::ostream& o, const String& s ) +{ + return o << s.ToUTF8(); +} + +#endif // __PCL_NO_STRING_OSTREAM + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_String_h + +// ---------------------------------------------------------------------------- +// EOF pcl/String.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StringList.h b/3rdparty/include/pcl/StringList.h new file mode 100644 index 0000000..93b68e2 --- /dev/null +++ b/3rdparty/include/pcl/StringList.h @@ -0,0 +1,152 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StringList.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StringList_h +#define __PCL_StringList_h + +/// \file pcl/StringList.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup string_lists String List Classes + */ + +/*! + * \class pcl::StringList + * \ingroup string_lists + * \brief Dynamic list of Unicode (UTF-16) strings. + * + * %StringList is a template instantiation of Array for the String class. + */ +typedef Array StringList; + +/*! + * \class pcl::SortedStringList + * \ingroup string_lists + * \brief Dynamic sorted list of Unicode (UTF-16) strings. + * + * %SortedStringList is a template instantiation of SortedArray for String. + */ +typedef SortedArray SortedStringList; + +/*! + * \class pcl::IsoStringList + * \ingroup string_lists + * \brief Dynamic list of 8-bit strings. + * + * %IsoStringList is a template instantiation of Array for IsoString. + */ +typedef Array IsoStringList; + +/*! + * \class pcl::SortedIsoStringList + * \ingroup string_lists + * \brief Dynamic sorted list of 8-bit strings. + * + * %SortedIsoStringList is a template instantiation of SortedArray for the + * IsoString class. + */ +typedef SortedArray SortedIsoStringList; + +/*! + * \defgroup key_value_string_lists Key-Value String List Classes + */ + +/*! + * \class pcl::StringKeyValueList + * \ingroup string_lists + * \ingroup key_value_string_lists + * \brief Dynamic list of key-value associations implemented as Unicode (UTF-16) strings. + */ +typedef Array StringKeyValueList; + +/*! + * \class pcl::SortedStringKeyValueList + * \ingroup string_lists + * \ingroup key_value_string_lists + * \brief Dynamic sorted list of key-value associations implemented as Unicode (UTF-16) strings. + */ +typedef SortedArray SortedStringKeyValueList; + +/*! + * \class pcl::IsoStringKeyValueList + * \ingroup string_lists + * \ingroup key_value_string_lists + * \brief Dynamic list of key-value associations implemented as 8-bit strings. + */ +typedef Array IsoStringKeyValueList; + +/*! + * \class pcl::SortedIsoStringKeyValueList + * \ingroup string_lists + * \ingroup key_value_string_lists + * \brief Dynamic sorted list of key-value associations implemented as 8-bit strings. + */ +typedef SortedArray SortedIsoStringKeyValueList; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_StringList_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StringList.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/StructuringElement.h b/3rdparty/include/pcl/StructuringElement.h new file mode 100644 index 0000000..b9ed2f9 --- /dev/null +++ b/3rdparty/include/pcl/StructuringElement.h @@ -0,0 +1,956 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/StructuringElement.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_StructuringElement_h +#define __PCL_StructuringElement_h + +/// \file pcl/StructuringElement.h + +#include +#include + +#include +#include +#include +#include // Reverse() +#include // BitmapStructure +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class StructuringElement + * \brief Abstract base class of all PCL structuring elements. + * + * %StructuringElement defines a square multiway structure that can be used, + * along with a MorphologicalOperator, to build a MorphologicalTransformation. + * + * A structure is a square matrix of Boolean elements. When an element is true + * we say that that element \e exists. Nonexistent (false) structure elements + * are ignored when a morphological operator is applied to an image. + * + * A structuring element works for morphological transformations in a + * similar way to a kernel filter for spatial convolutions: the + * structure is placed centered on a pixel of the image being processed, and + * only those neighbor pixels falling behind existing structure elements are + * taken into account to compute the result of a morphological operator. When + * this operation is repeated for each pixel in an image, it implements a + * morphological transformation. + * + * %StructuringElement holds a multiway structure. Each way is + * actually a separate structure, so a multiway structure actually groups a + * set of structures with the same dimensions. When a multiway structure is + * used to apply a morphological operator, the operator is first applied + * through each way in the structure, and the result is the same operator + * applied to the partial results. + * + * This class is thread-safe. This means that multiple execution threads can + * access the same %StructuringElement instance concurrently to perform + * morphological transformations. + * + * \sa MorphologicalOperator, MorphologicalTransformation + */ +class PCL_CLASS StructuringElement +{ +public: + + /*! + * Represents an element of a structure existence mask. + */ + typedef uint32 existence_mask_element; + + /*! + * Represents a structure existence mask. + */ + typedef GenericVector existence_mask; + + /*! + * Represents a set of structure existence masks. + */ + typedef GenericVector existence_mask_set; + + /*! + * A vector type used to store the number of existing structure elements. + */ + typedef GenericVector existence_mask_count; + + /*! + * Constructs a default \e box %StructuringElement object of the specified + * \a size in pixels and number of ways \a n. + */ + StructuringElement( int size = 3, int n = 1 ) + : m_size( Max( 3, size|1 ) ) + , m_mask( Max( 1, n ) ) + , m_count( 0, Max( 1, n ) ) + { + PCL_PRECONDITION( size >= 3 ) + PCL_PRECONDITION( (size & 1) != 0 ) + PCL_PRECONDITION( n >= 1 ) + for ( int k = 0; k < NumberOfWays(); ++k ) + m_mask[k] = existence_mask( existence_mask_element( 0 ), NumberOfElements() ); + } + + /*! + * Copy constructor. + */ + StructuringElement( const StructuringElement& x ) + : m_size( x.m_size ) + , m_mask( x.NumberOfWays() ) + , m_count( 0, x.NumberOfWays() ) + { + for ( int k = 0; k < NumberOfWays(); ++k ) + m_mask[k] = existence_mask( existence_mask_element( 0 ), NumberOfElements() ); + } + + /*! + * Destroys a %StructuringElement object. + */ + virtual ~StructuringElement() + { + } + + /*! + * Returns a pointer to a dynamically allocated duplicate of this + * structuring element. + */ + virtual StructuringElement* Clone() const = 0; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + StructuringElement& operator =( const StructuringElement& x ) + { + if ( &x != this ) + { + volatile AutoLock lock( m_mutex ); + m_size = x.m_size; + m_mask = existence_mask_set( x.NumberOfWays() ); + m_count = existence_mask_count( 0, x.NumberOfWays() ); + m_reflected = false; + m_initialized = 0; + for ( int k = 0; k < NumberOfWays(); ++k ) + m_mask[k] = existence_mask( existence_mask_element( 0 ), NumberOfElements() ); + } + return *this; + } + + /*! + * Returns the number of ways in this structure. + */ + int NumberOfWays() const + { + return int( m_mask.Length() ); + } + + /*! + * Returns the size of this structure in pixels. + */ + int Size() const + { + return m_size; + } + + /*! + * Returns the total number of structure elements, or Size()*Size(). Note + * that this includes both existing and nonexistent structure elements. + */ + int NumberOfElements() const + { + return m_size*m_size; + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * The default implementation of this member function returns true if all + * elements in the k-th way are reported as existing elements by the + * ElementExists() member function. + * + * \note This is a performance-critical routine. When possible, derived + * classes should reimplement it in more efficient ways (for example, a + * circular structure is never a box structure). + */ + virtual bool IsBox( int k ) const + { + PCL_PRECONDITION( k >= 0 && k < NumberOfWays() ) + Initialize(); + return m_count[k] == NumberOfElements(); + } + + /*! + * Returns true iff a given element exists in this structure. + * + * \param i column position (X-coordinate) of the requested structure + * element. Must be 0 <= i < n, where n is the structure size. + * + * \param j row position (Y-coordinate) of the requested structure + * element. Must be 0 <= j < n, where n is the structure size. + * + * \param k Way index. Must be 0 <= k < m, where m is the number of ways + * defined in this structure. + */ + virtual bool ElementExists( int i, int j, int k ) const + { + PCL_PRECONDITION( i >= 0 && i < m_size ) + PCL_PRECONDITION( j >= 0 && j < m_size ) + PCL_PRECONDITION( k >= 0 && k < NumberOfWays() ) + return true; + } + + /*! + * Gets the subset of pixel sample values that correspond to existing + * elements in a way of this structure. + * + * \param[out] h1 %Vector of samples from the input \a h array that + * correspond to existing structure elements. + * + * \param[out] nh1 The number of existing elements in the k-th way of + * this structure. This is also the number of samples + * stored in the \a h1 vector. + * + * \param h Input array of samples. Must be the starting address of a + * square matrix of \a n samples stored in row order, where \a n + * is the number of elements in this structure (equal to + * NumberOfElements()). + * + * \param k Way index. Must be 0 <= k < m, where m is the number of ways + * defined in this structure. + * + * \note This function is thread-safe. + */ + template + void PeekElements( T* h1, int& nh1, const T* h, int k ) const + { + PCL_PRECONDITION( h1 != 0 ) + PCL_PRECONDITION( h != 0 ) + PCL_PRECONDITION( k >= 0 && k < NumberOfWays() ) + Initialize(); + nh1 = 0; + for ( existence_mask::const_iterator m = m_mask[k].Begin(), m1 = m_mask[k].End(); m < m1; ++m, ++h ) + if ( *m ) + { + *h1++ = *h; + ++nh1; + } + } + + /*! + * Reflects this structure. + * + * Structure reflection is equivalent to a 180 degrees rotation of the + * underlying structure mask for each way. This member function is called + * internally by MorphologicalTransformation to apply dilation operators. + */ + void Reflect() + { + Initialize(); + for ( existence_mask_set::iterator i = m_mask.Begin(); i != m_mask.End(); ++i ) + pcl::Reverse( i->Begin(), i->End() ); + m_reflected = !m_reflected; + } + + /*! + * Returns true iff this structure has been reflected. Note that after an + * even number of successive reflections (which is a no-op) this member + * function will return false. + */ + bool IsReflected() const + { + return m_reflected; + } + + /*! + * Initializes the internal existence tables. + * + * A structure is a square matrix of Boolean elements. When an element is + * true we say that that element \e exists. Nonexistent (false) structure + * elements are ignored when a morphological operator is applied to + * transform an image. + * + * StructuringElement (and derived classes) uses a set of precomputed + * existence tables that greatly improves performance of + * morphological transformations, especially for complex structures. Calling + * this member function forces the immediate calculation of existence + * tables, if they haven't already been calculated previously. If the + * existence tables already exist, this function does nothing. + * + * You normally should not need to call this member function directly, as + * existence tables are automatically calculated when required. + * + * \note This is a thread-safe routine. It can be safely called from + * multiple running threads. + */ + void Initialize() const + { + if ( !m_initialized ) + { + volatile AutoLock lock( m_mutex ); + if ( m_initialized.Load() == 0 ) + { + int N = NumberOfWays(); + for ( int k = 0; k < N; ++k ) + { + m_count[k] = 0; // redundant, but doesn't hurt + existence_mask::iterator m = m_mask[k].Begin(); + for ( int i = 0; i < m_size; ++i ) + for ( int j = 0; j < m_size; ++j, ++m ) + if ( ElementExists( i, j, k ) ) + { + *m = 1; + ++m_count[k]; + } + else + *m = 0; + } + + m_initialized.Store( 1 ); + } + } + } + +private: + + /* + * Structure size. + */ + int m_size; + + /* + * Element existence masks (one mask per way). + * An element exists iff its corresponding mask element is nonzero. + */ + mutable existence_mask_set m_mask; + + /* + * Number of existing elements for each way. + */ + mutable existence_mask_count m_count; + + /* + * Flag true when the structure has been reflected. + */ + bool m_reflected = false; + + /* + * Flag true when existence masks have been calculated. + */ + mutable AtomicInt m_initialized; + + /* + * Thread synchronization. + */ + mutable Mutex m_mutex; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BoxStructure + * \brief Standard box (square) structure. + * + * A block structure defines all of its elements. For example, a box + * structure of size 5 is: + * + *
+ * x x x x x
+ * x x x x x
+ * x x x x x
+ * x x x x x
+ * x x x x x
+ * 
+ * + * where existing elements are marked as 'x'. + * + * \sa CircularStructure, OrthogonalStructure, DiagonalStructure, StarStructure + */ +class PCL_CLASS BoxStructure : public StructuringElement +{ +public: + + /*! + * Constructs a standard block structure of the specified \a size. + */ + BoxStructure( int size ) + : StructuringElement( size, 1 ) + { + } + + /*! + * Copy constructor. + */ + BoxStructure( const BoxStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new BoxStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %BoxStructure, this member function always + * returns true. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k == 0 ) + return true; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class CircularStructure + * \brief Standard circular structure. + * + * The standard circular structure of size 7 is defined as follows: + * + *
+ * · · x x x · ·
+ * · x x x x x ·
+ * x x x x x x x
+ * x x x x x x x
+ * x x x x x x x
+ * · x x x x x ·
+ * · · x x x · ·
+ * 
+ * + * where existing elements are marked as 'x' and nonexisting elements are + * denoted as '·'. + * + * Circular structures can help in preserving small structures, especially + * rounded ones, like stars. + * + * \sa ThreeWayStructure, OrthogonalStructure, DiagonalStructure, StarStructure + */ +class PCL_CLASS CircularStructure : public StructuringElement +{ +public: + + /*! + * Constructs a standard circular structure of the specified \a diameter. + */ + CircularStructure( int diameter ) + : StructuringElement( diameter, 1 ) + { + } + + /*! + * Copy constructor. + */ + CircularStructure( const CircularStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new CircularStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %CircularStructure, this member function always + * returns false. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k == 0 ) + return false; + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k == 0 ) + float n2 = 0.5F*Size(); + float di = i+0.5F - n2; + float dj = j+0.5F - n2; + return di*di + dj*dj <= n2*n2; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class OrthogonalStructure + * \brief Standard orthogonal structure. + * + * An orthogonal structure of size 5 is defined as follows: + * + *
+ * · · x · ·
+ * · · x · ·
+ * x x x x x
+ * · · x · ·
+ * · · x · ·
+ * 
+ * + * where existing elements are marked as 'x' and nonexisting elements are + * denoted as '·'. + * + * \sa ThreeWayStructure, CircularStructure, DiagonalStructure, StarStructure + */ +class PCL_CLASS OrthogonalStructure : public StructuringElement +{ +public: + + /*! + * Constructs an orthogonal structure of the specified \a size. + */ + OrthogonalStructure( int size ) + : StructuringElement( size, 1 ) + { + } + + /*! + * Copy constructor. + */ + OrthogonalStructure( const OrthogonalStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new OrthogonalStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %OrthogonalStructure, this member function always + * returns false. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k == 0 ) + return false; + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k == 0 ) + int n2 = Size() >> 1; + return i == n2 || j == n2; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class DiagonalStructure + * \brief Standard diagonal structure. + * + * A diagonal structure of size 5 is defined as follows: + * + *
+ * x · · · x
+ * · x · x ·
+ * · · x · ·
+ * · x · x ·
+ * x · · · x
+ * 
+ * + * where existing elements are marked as 'x' and nonexisting elements are + * denoted as '·'. + * + * \sa ThreeWayStructure, CircularStructure, OrthogonalStructure, StarStructure + */ +class PCL_CLASS DiagonalStructure : public StructuringElement +{ +public: + + /*! + * Constructs a diagonal structure of the specified \a size. + */ + DiagonalStructure( int size ) + : StructuringElement( size, 1 ) + { + } + + /*! + * Copy constructor. + */ + DiagonalStructure( const DiagonalStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new DiagonalStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %DiagonalStructure, this member function always + * returns false. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k == 0 ) + return false; + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k == 0 ) + return j == i || j == Size()-i-1; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class StarStructure + * \brief Standard star structure. + * + * A star structure of size 7 is defined as follows: + * + *
+ * · · · x · · ·
+ * · x · x · x ·
+ * · · x x x · ·
+ * x x x x x x x
+ * · · x x x · ·
+ * · x · x · x ·
+ * · · · x · · ·
+ * 
+ * + * where existing elements are marked as 'x' and nonexisting elements are + * denoted as '·'. + * + * \sa ThreeWayStructure, CircularStructure, OrthogonalStructure, + * DiagonalStructure + */ +class PCL_CLASS StarStructure : public StructuringElement +{ +public: + + /*! + * Constructs a star structure of the specified \a size. + */ + StarStructure( int size ) + : StructuringElement( size, 1 ) + { + } + + /*! + * Copy constructor. + */ + StarStructure( const StarStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new StarStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %StarStructure, this member function always + * returns false. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k == 0 ) + return false; + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k == 0 ) + int n2 = Size() >> 1; + if ( i == n2 || j == n2 ) + return true; + if ( j == i || j == Size()-i-1 ) + { + float n2 = 0.5F*Size(); + float di = i+0.5F - n2; + float dj = j+0.5F - n2; + return di*di + dj*dj <= n2*n2; + } + return false; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ThreeWayStructure + * \brief Standard three-way structure. + * + * The standard three-way structure of size 5 is defined as follows: + * + *
+ *   Way #0       Way #1       Way #2
+ *
+ * · · x · ·    x · · · x    · · · · ·
+ * · · x · ·    · x · x ·    · · · · ·
+ * x x · x x    · · · · ·    · · x · ·
+ * · · x · ·    · x · x ·    · · · · ·
+ * · · x · ·    x · · · x    · · · · ·
+ * 
+ * + * where existing elements are marked as 'x' and nonexisting elements are + * denoted as '·'. + * + * The standard three-way structure leads to ranking operations where data + * from different spatial directions are ranked separately. When used to apply + * morphological operators, standard three-way structures can preserve edges + * better than box structures, especially when applied recursively. + * + * \sa CircularStructure, OrthogonalStructure, DiagonalStructure, StarStructure + */ +class PCL_CLASS ThreeWayStructure : public StructuringElement +{ +public: + + /*! + * Constructs a standard three-way structure of the specified \a size. + */ + ThreeWayStructure( int size ) + : StructuringElement( size, 3 ) + { + } + + /*! + * Copy constructor. + */ + ThreeWayStructure( const ThreeWayStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new ThreeWayStructure( *this ); + } + + /*! + * Returns true iff this is a box structure. All elements in a box + * structure are existing elements. + * + * As reimplemented by %ThreeWayStructure, this member function always + * returns false. + */ + bool IsBox( int k ) const override + { + PCL_PRECONDITION( k >= 0 && k < 3 ) + return false; + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k >= 0 && k < 3 ) + int n2 = Size() >> 1; + switch ( k ) + { + default: + case 0: // central element + return i == n2 && j == n2; + case 1: // horizontal and vertical elements + return i == n2 || j == n2; + case 2: // diagonal elements + return (j == i || j == Size()-i-1) && i != n2; + } + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class BitmapStructure + * \brief A structuring element where static strings are used to define custom + * existence matrices. + * + * %BitmapStructure allows you to build a structuring element using character + * strings to define the existence of structure elements. Each string defines a + * structure way, where 'x' characters correspond to existing structure + * elements. For example, the following array of static strings: + * + *
+ * const char* B[] = { "--x--"
+ *                     "-xxx-"
+ *                     "xxxxx"
+ *                     "-xxx-"
+ *                     "--x--",
+ *                     //
+ *                     "-xxx-"
+ *                     "xxxxx"
+ *                     "xxxxx"
+ *                     "xxxxx"
+ *                     "-xxx-" };
+ * 
+ * + * would define a 5x5 structure with two ways. 'x' characters define existing + * elements; other character values ('-' in this case) are interpreted as + * nonexistent elements. The corresponding %BitmapStructure object would be + * constructed as follows: + * + * BitmapStructure S( B, 5, 2 ); + * + * This class is a convenient, straightforward approach to defining multi-way + * custom structuring elements that can be used directly with the + * MorphologicalTransformation class. + */ +class PCL_CLASS BitmapStructure : public StructuringElement +{ +public: + + /*! + * Represents a structure bitmap. Each bitmap defines the existence matrix + * for a \e way of the structuring element. + */ + typedef IsoString bitmap; + + /*! + * Represents a set of bitmaps used to define the structure ways in a + * %BitmapStructure object. + */ + typedef IsoStringList bitmap_set; + + /*! + * Constructs a %BitmapStructure object of the specified \a size and \a n + * number of ways. + * + * \param bitmaps An array of null-terminated strings representing the + * set of ways in this structuring element. There must be + * \a n contiguous null-terminated strings of length + * \a size*size characters at the address specified by + * this argument. In these strings, 'x' characters + * correspond to existing structure elements; other + * character values will be interpreted as nonexistent + * structure elements. + * + * \param size Size of this structure. Must be an odd integer >= 3. + * + * \param n Number of ways in this structure. Must be >= 1. + */ + BitmapStructure( const char** bitmaps, int size, int n = 1 ) + : StructuringElement( size, n ) + { + PCL_PRECONDITION( bitmaps != nullptr ) + PCL_PRECONDITION( *bitmaps != '\0' ) + for ( int i = 0; i < NumberOfWays(); ++i ) + m_bitmaps.Add( bitmap( bitmaps[i] ) ); + } + + /*! + * Copy constructor. + */ + BitmapStructure( const BitmapStructure& ) = default; + + /*! + */ + StructuringElement* Clone() const override + { + return new BitmapStructure( *this ); + } + + /*! + */ + bool ElementExists( int i, int j, int k ) const override + { + PCL_PRECONDITION( i >= 0 && i < Size() ) + PCL_PRECONDITION( j >= 0 && j < Size() ) + PCL_PRECONDITION( k >= 0 && k < NumberOfWays() ) + return m_bitmaps[k][i + j*Size()] == 'x'; + } + +protected: + + bitmap_set m_bitmaps; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_StructuringElement_h + +// ---------------------------------------------------------------------------- +// EOF pcl/StructuringElement.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SurfacePolynomial.h b/3rdparty/include/pcl/SurfacePolynomial.h new file mode 100644 index 0000000..07b5079 --- /dev/null +++ b/3rdparty/include/pcl/SurfacePolynomial.h @@ -0,0 +1,546 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SurfacePolynomial.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SurfacePolynomial_h +#define __PCL_SurfacePolynomial_h + +/// \file pcl/SurfacePolynomial.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class SurfacePolynomial + * \brief Two-dimensional interpolating/approximating surface polynomial. + * + * %SurfacePolynomial implements interpolating surface polynomials for + * arbitrarily distributed input nodes in two dimensions. + * + * Compared to surface splines (also known as thin plates), surface + * polynomials are much more rigid, that is, much less adaptable to local + * function variations. This can be a desirable property in some scenarios. An + * important drawback of polynomials is that they are prone to oscillations, + * especially for relatively high interpolation orders greater than three. An + * important advantage is that they are fast even for very large data sets. + * + * \sa SurfaceSpline + */ +template +class PCL_CLASS SurfacePolynomial +{ +public: + + /*! + * Represents a vector of coordinates, function values or polynomial + * coefficients. + */ + typedef GenericVector vector_type; + + /*! + * The numeric type used to represent coordinates, function values and + * polynomial coefficients. + */ + typedef typename vector_type::scalar scalar; + + /*! + * Default constructor. Constructs an empty, two-dimensional interpolating + * surface polynomial of third degree. + */ + SurfacePolynomial() = default; + + /*! + * Copy constructor. + */ + SurfacePolynomial( const SurfacePolynomial& ) = default; + + /*! + * Move constructor. + */ + SurfacePolynomial( SurfacePolynomial&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~SurfacePolynomial() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SurfacePolynomial& operator =( const SurfacePolynomial& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SurfacePolynomial& operator =( SurfacePolynomial&& ) = default; + + /*! + * Returns true iff this surface polynomial is valid. A valid surface + * polynomial has been initialized with a sufficient number of nodes. + */ + bool IsValid() const + { + return !m_polynomial.IsEmpty(); + } + + /*! + * Returns the degree of this surface polynomial. + */ + int Degree() const + { + return m_degree; + } + + /*! + * Sets the degree of this surface polynomial. + * + * \param degree Polynomial degree. Must be ≥ 1. + * + * Calling this member function implicitly resets this %SurfacePolynomial + * object and destroys all internal working structures. + * + * High-degree polynomials, especially for degrees higher than three, tend + * to oscillate and may generate artifacts in the interpolated surface. + * + * The default degree is 3. Recommended values are 2, 3 and 4. + */ + void SetDegree( int degree ) + { + PCL_PRECONDITION( degree >= 1 ) + Clear(); + m_degree = pcl::Max( 1, degree ); + } + + /*! + * Generation of a two-dimensional surface polynomial. + * + * \param x X node coordinates. + * + * \param y Y node coordinates. + * + * \param z Node values. + * + * \param n Number of nodes. Must be ≥ 3 + * (3 nodes * 2 coordinates = six degrees of freedom). + * + * The input nodes can be arbitrarily distributed, and they don't need to + * follow any specific order. However, all nodes must be distinct with + * respect to the machine epsilon for the floating point type T. + */ + void Initialize( const T* x, const T* y, const T* z, int n ) + { + PCL_PRECONDITION( x != nullptr && y != nullptr && z != nullptr ) + PCL_PRECONDITION( n > 2 ) + + if ( n < 3 ) + throw Error( "At least three input nodes are required in SurfacePolynomial::Initialize()" ); + + Clear(); + + // Find mean coordinate values + m_x0 = m_y0 = 0; + for ( int i = 0; i < n; ++i ) + { + m_x0 += x[i]; + m_y0 += y[i]; + } + m_x0 /= n; + m_y0 /= n; + + // Find radius of unit circle + m_r0 = 0; + for ( int i = 0; i < n; ++i ) + { + double dx = m_x0 - x[i]; + double dy = m_y0 - y[i]; + double r = Sqrt( dx*dx + dy*dy ); + if ( r > m_r0 ) + m_r0 = r; + } + if ( 1 + m_r0 == 1 ) + throw Error( "SurfacePolynomial::Initialize(): Empty or insignificant interpolation space" ); + + m_r0 = 1/m_r0; + + const int size = (m_degree + 1)*(m_degree + 2) >> 1; + + DMatrix M( 0.0, size, size ); + DVector R( 0.0, size ); + { + // Transform coordinates to unit circle + DVector X( n ), Y( n ); + for ( int i = 0; i < n; ++i ) + { + X[i] = m_r0*(x[i] - m_x0); + Y[i] = m_r0*(y[i] - m_y0); + } + + GenericVector Z( n ); + for ( int k = 0; k < n; ++k ) + { + Z[k] = DVector( size ); + for ( int i = 0, l = 0; i <= m_degree; ++i ) + for ( int j = 0; j <= m_degree-i; ++j, ++l ) + Z[k][l] = PowI( X[k], i ) * PowI( Y[k], j ); + } + + int n2 = n*n; + for ( int i = 0; i < size; ++i ) + { + for ( int j = 0; j < size; ++j ) + { + for ( int k = 0; k < n; ++k ) + M[i][j] += Z[k][i] * Z[k][j]; + M[i][j] /= n2; + } + + for ( int k = 0; k < n; ++k ) + R[i] += z[k] * Z[k][i]; + R[i] /= n2; + } + } + + for ( int i = 0; i < size; ++i ) + { + double pMi = M[i][i]; + if ( M[i][i] != 0 ) + { + for ( int j = i; j < size; ++j ) + M[i][j] /= pMi; + R[i] /= pMi; + } + + for ( int k = 1; i+k < size; ++k ) + { + double pMk = M[i+k][i]; + if ( M[i+k][i] != 0 ) + { + for ( int j = i; j < size; ++j ) + { + M[i+k][j] /= pMk; + M[i+k][j] -= M[i][j]; + } + R[i+k] /= pMk; + R[i+k] -= R[i]; + } + } + } + + m_polynomial = vector_type( size ); + for ( int i = size; --i >= 0; ) + { + m_polynomial[i] = scalar( R[i] ); + for ( int j = i; --j >= 0; ) + R[j] -= M[j][i]*R[i]; + } + } + + /*! + * Two-dimensional surface polynomial interpolation. Returns an interpolated + * value at the specified \a x and \a y coordinates. + */ + T operator ()( double x, double y ) const + { + PCL_PRECONDITION( !m_polynomial.IsEmpty() ) + + double dx = m_r0*(x - m_x0); + double dy = m_r0*(y - m_y0); + double z = 0; + double px = 1; + for ( int i = 0, l = 0; ; px *= dx ) + { + double py = 1; + for ( int j = 0; j <= m_degree-i; py *= dy, ++j, ++l ) + z += m_polynomial[l]*px*py; + if ( ++i > m_degree ) + break; + } + return T( z ); + } + + /*! + * Resets this surface polynomial interpolation, deallocating all internal + * working structures. + */ + void Clear() + { + m_polynomial.Clear(); + } + +protected: + + double m_r0 = 1; // scaling factor for normalization of node coordinates + double m_x0 = 0; // zero offset for normalization of X node coordinates + double m_y0 = 0; // zero offset for normalization of Y node coordinates + int m_degree = 3; // polynomial degree > 0 + vector_type m_polynomial; // coefficients of the 2-D surface polynomial +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PointSurfacePolynomial + * \brief Vector polynomial interpolation/approximation in two dimensions + * + * The template parameter P represents an interpolation point in two + * dimensions. The type P must implement P::x and P::y data members accessible + * from the current %PointSurfacePolynomial template specialization. These + * members must provide the values of the horizontal and vertical coordinates, + * respectively, of an interpolation point. In addition, the scalar types of + * the P::x and P::y point members must support conversion to double semantics. + */ +template +class PCL_CLASS PointSurfacePolynomial +{ +public: + + /*! + * Represents an interpolation point in two dimensions. + */ + typedef P point; + + /*! + * Represents a sequence of interpolation points. + */ + typedef Array point_list; + + /*! + * Represents a coordinate interpolating/approximating surface. + */ + typedef SurfacePolynomial surface; + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + PointSurfacePolynomial() = default; + + /*! + * Copy constructor. + */ + PointSurfacePolynomial( const PointSurfacePolynomial& ) = default; + + /*! + * Move constructor. + */ + PointSurfacePolynomial( PointSurfacePolynomial&& ) = default; + + /*! + * Constructs a %PointSurfacePolynomial object initialized for the + * specified input data and interpolation parameters. + * + * See the corresponding Initialize() member function for a detailed + * description of parameters. + */ + PointSurfacePolynomial( const point_list& P1, const point_list& P2, int degree = 3 ) + { + Initialize( P1, P2, degree ); + } + + /*! + * Constructs a %PointSurfacePolynomial object initialized with prescribed + * point surface interpolations. + * + * See the corresponding Initialize() member function for a more detailed + * description of parameters and their required conditions. + */ + PointSurfacePolynomial( const surface& Sx, const surface& Sy ) + { + Initialize( Sx, Sy ); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PointSurfacePolynomial& operator =( const PointSurfacePolynomial& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PointSurfacePolynomial& operator =( PointSurfacePolynomial&& ) = default; + + /*! + * Initializes this %PointSurfacePolynomial object for the specified + * input data and interpolation parameters. + * + * \param P1 A sequence of distinct interpolation node points. + * + * \param P2 A sequence of interpolation values. For each point in + * \a P1, the coordinates of its counterpart point in + * \a P2 will be used as the interpolation node values in + * the X and Y directions. + * + * \param degree Polynomial degree. Must be ≥ 1. The default value is + * 3. See SurfacePolynomial::SetDegree() for a complete + * description of this parameter. + * + * The input nodes can be arbitrarily distributed and don't need to follow + * any specific order. However, all node points should be distinct with + * respect to the machine epsilon for the floating point type used to + * represent coordinates. + * + * See the SurfacePolynomial::Initialize() member function for a complete + * description of this initialization process. + */ + void Initialize( const point_list& P1, const point_list& P2, int degree = 3 ) + { + PCL_PRECONDITION( P1.Length() >= 3 ) + PCL_PRECONDITION( P1.Length() <= P2.Length() ) + PCL_PRECONDITION( degree > 0 ) + + m_Sx.Clear(); + m_Sy.Clear(); + + m_Sx.SetDegree( degree ); + m_Sy.SetDegree( degree ); + + if ( P1.Length() < 3 || P2.Length() < 3 ) + throw Error( "PointSurfacePolynomial::Initialize(): At least three input nodes must be specified." ); + + if ( P2.Length() < P1.Length() ) + throw Error( "PointSurfacePolynomial::Initialize(): Incompatible point array lengths." ); + + DVector X( int( P1.Length() ) ), + Y( int( P1.Length() ) ), + Zx( int( P1.Length() ) ), + Zy( int( P1.Length() ) ); + for ( int i = 0; i < X.Length(); ++i ) + { + X[i] = P1[i].x; + Y[i] = P1[i].y; + Zx[i] = P2[i].x; + Zy[i] = P2[i].y; + } + m_Sx.Initialize( X.Begin(), Y.Begin(), Zx.Begin(), X.Length() ); + m_Sy.Initialize( X.Begin(), Y.Begin(), Zy.Begin(), X.Length() ); + } + + /*! + * Deallocates internal structures, yielding an empty object that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_Sx.Clear(); + m_Sy.Clear(); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return m_Sx.IsValid() && m_Sy.IsValid(); + } + + /*! + * Returns a reference to the internal object used for interpolation in the + * X plane direction. + */ + const surface& SurfaceX() const + { + return m_Sx; + } + + /*! + * Returns a reference to the internal object used for interpolation in the + * Y plane direction. + */ + const surface& SurfaceY() const + { + return m_Sy; + } + + /*! + * Returns an interpolated point at the specified coordinates. + */ + template + DPoint operator ()( T x, T y ) const + { + return DPoint( m_Sx( x, y ), m_Sy( x, y ) ); + } + + /*! + * Returns an interpolated point at the given \a p.x and \a p.y coordinates. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /* + * The surface interpolations in the X and Y plane directions. + */ + surface m_Sx, m_Sy; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SurfacePolynomial_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SurfacePolynomial.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SurfaceSimplifier.h b/3rdparty/include/pcl/SurfaceSimplifier.h new file mode 100644 index 0000000..ab52875 --- /dev/null +++ b/3rdparty/include/pcl/SurfaceSimplifier.h @@ -0,0 +1,581 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SurfaceSimplifier.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SurfaceSimplifier_h +#define __PCL_SurfaceSimplifier_h + +/// \file pcl/SurfaceSimplifier.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * Default tolerance for surface simplification. + * + * The tolerance parameter determines the maximum absolute deviation of + * function values from a plane allowed to simplify the subset of points within + * a subregion of the input point space. This parameter is specified in + * bivariate function values, i.e. in Z-axis units. + */ +#define __PCL_SURFACE_SIMPLIFIER_DEFAULT_TOLERANCE 0.01 + +/* + * Default state of the surface simplification outlier rejection feature. + * + * When enabled, a prescribed fraction of outlier points will be rejected on + * each subregion for estimation of local curvature. + */ +#define __PCL_SURFACE_SIMPLIFIER_DEFAULT_REJECTION_ENABLED true + +/* + * Default rejection fraction for surface simplification. + * + * This parameter specifies the maximum fraction of outliers allowed for + * simplification of a subset of points in a region of the input point space. + * Point rejection makes the surface simplification algorithm robust to outlier + * function values. + */ +#define __PCL_SURFACE_SIMPLIFIER_DEFAULT_REJECT_FRACTION 0.2F + +/* + * Whether to include subregion centroids in simplified point sets. + * + * When enabled, the centroid of each simplified subregion will also be + * included in the corresponding list of simplified points. This can improve + * the shape preservation behavior of the surface simplification algorithm, at + * the cost of a reduced amount of additional points. + */ +#define __PCL_SURFACE_SIMPLIFIER_DEFAULT_INCLUDE_CENTROIDS false + +// ---------------------------------------------------------------------------- + +/*! + * \class SurfaceSimplifier + * \brief Shape-preserving simplification of 2-D surfaces + * + * Given a finite set of three dimensional points representing sampled values + * of a real bivariate function of the form + * + * z = f(x,y), + * + * the shape-preserving surface simplification algorithm attempts to generate a + * reduced set of points with equivalent geometric properties to within a + * prescribed maximum error parameter. + * + * The implemented algorithm divides the input point space recursively on the + * XY plane into rectangular regions using custom quadtree structures. For each + * region, the algorithm finds the orientation of the dominant plane through + * principal component analysis. The deviation of function values from the + * dominant plane is evaluated for the points in the region, and if the region + * is considered flat to within a tolerance parameter, its points are replaced + * with a simplified (reduced) set of points that tends to preserve the local + * shape of the original function over the region. If the region is tagged as + * curve, it is further divided using a new quadtree recursion, until no + * additional simplification can be achieved. + * + * Surface simplification is an important auxiliary tool to improve the + * practical application of surface interpolation and approximation devices. + * These algorithms allow us to work with large-scale data sets by selecting a + * subset of essential data points, usually much smaller than the original set, + * adapted to solve a particular problem. Surface simplification is + * particularly useful for the application of computationally expensive + * approximation algorithms, such as surface splines or thin plates. A good + * example is computation of high accuracy astrometric solutions, where surface + * simplification allows us to use large sets of thousands of stars to generate + * thin plate models of local distortions. Since generation of thin plates has + * roughly O(N^3) time complexity, the efficient reduction of input point sets + * is crucial for this application. + */ +class PCL_CLASS SurfaceSimplifier +{ +private: + + /*! + * \struct SurfaceSimplifier::point + * \brief Working 3-D point structure for quadtree storage used by the + * recursive surface simplification algorithm. + * \internal + */ + struct point + { + typedef double component; + + component x, y, z; + + point() = default; + point( const point& ) = default; + + template + point( T a_x, T a_y, T a_z ) + : x( double( a_x ) ) + , y( double( a_y ) ) + , z( double( a_z ) ) + { + } + + template + point( T k ) + { + x = y = z = double( k ); + } + + component operator[]( int i ) const + { + return i ? y : x; + } + + point& operator +=( const point& p ) + { + x += p.x; y += p.y; z += p.z; + return *this; + } + + template + point& operator /=( T k ) + { + x /= k; y /= k; z /= k; + return *this; + } + + double SquaredDistanceTo( const point& p ) const + { + double dx = p.x - x, dy = p.y - y; + return dx*dx + dy*dy; + } + }; + + typedef QuadTree tree; + + typedef typename tree::rectangle rectangle; + + typedef typename tree::point_list point_list; + +public: + + /*! + * Constructs a new %SurfaceSimplifier object with default parameters: + * + * \li Tolerance = 0.01 in function value units (Z-axis values). + * \li Outlier rejection enabled + * \li Outlier rejection fraction = 0.2 + * \li Inclusion of centroid points disabled + */ + SurfaceSimplifier() = default; + + /*! + * Constructs a new %SurfaceSimplifier instance with the specified + * \a tolerance. + */ + SurfaceSimplifier( double tolerance ) + : m_tolerance( Abs( tolerance ) ) + { + PCL_PRECONDITION( tolerance >= 0 ) + } + + /*! + * Copy constructor. + */ + SurfaceSimplifier( const SurfaceSimplifier& ) = default; + + /*! + * Returns the current tolerance of this surface simplifier. + * + * See the SetTolerance() member function for a description of the + * tolerance parameter. + */ + double Tolerance() const + { + return m_tolerance; + } + + /*! + * Sets the \a tolerance of this surface simplifier. + * + * The tolerance parameter determines the maximum absolute deviation of + * function values from a plane allowed to simplify the subset of points + * within a subregion of the input point space. + * + * The value of this parameter is specified in bivariate function value + * units, i.e. in Z-axis units. Higher tolerances tend to allow for more + * simplification, and hence for shorter simplified point lists. However, an + * excessive tolerance value may degrade the accuracy of the simplified + * surface in terms of preservation of the original function's structure and + * shape. This parameter must be tailored carefully to the requirements of + * the function being simplified and the tasks where the simplified version + * is going to be applied. + */ + void SetTolerance( double tolerance ) + { + PCL_PRECONDITION( tolerance > 0 ) + m_tolerance = Abs( tolerance ); + } + + /*! + * Returns true iff outlier rejection is enabled for this object. + * + * See the EnableRejection() and RejectFraction() member functions for a + * description of outlier rejection in the surface simplification algorithm. + */ + bool IsRejectionEnabled() const + { + return m_enableRejection; + } + + /*! + * Enables outlier rejection for this surface simplifier. + * + * When enabled, a prescribed fraction of outlier points (see the + * RejectFraction() member function) will be rejected on each subregion for + * estimation of local curvature. An adequate amount of rejection is + * important to achieve a robust result, especially for simplification of + * noisy data where outliers may generate false curvatures that prevent + * efficient simplification. + */ + void EnableRejection( bool enabled = true ) + { + m_enableRejection = enabled; + } + + /*! + * Disables outlier rejection for this surface simplifier. See + * EnableRejection() for more information. + */ + void DisableRejection( bool disable = true ) + { + EnableRejection( !disable ); + } + + /*! + * Returns the fraction of outlier points rejected for estimation of local + * curvature. + * + * See the EnableRejection() and RejectFraction() member functions for a + * description of outlier rejection in the surface simplification algorithm. + */ + float RejectFraction() const + { + return m_rejectFraction; + } + + /*! + * Sets the fraction of outlier points rejected by this surface simplifier. + * + * This parameter defines a fraction of outlier points that will be rejected + * on each subregion of the point space being simplified, for estimation of + * local curvature. + * + * Rejecting an adequate fraction of points makes the surface simplification + * algorithm more immune to noise in the input data, including erroneous + * points that may deviate considerably from the true surface represented by + * the sampled function. The result is a more robust and accurate simplified + * surface. However, too high of a rejection fraction may remove significant + * data and lead to an inaccurate result. + * + * The specified \a rejectFraction value must be in the (0,1) range. The + * default value upon construction is 0.2, which is quite appropriate in + * most cases. + */ + void SetRejectFraction( float rejectFraction ) + { + PCL_PRECONDITION( rejectFraction > 0 && rejectFraction < 1 ) + m_rejectFraction = Range( rejectFraction, 0.0F, 1.0F ); + } + + /*! + * Returns true iff inclusion of centroid points is enabled for this object. + * + * See the EnableCentroidInclusion() member function for a description of + * the centroid inclusion feature of the surface simplification algorithm. + */ + bool IsCentroidInclusionEnabled() const + { + return m_includeCentroids; + } + + /*! + * Enables inclusion of centroid points for this surface simplifier. + * + * When a subregion of the input space is simplified, the surface + * simplification algorithm replaces the subset of points in the subregion + * with a simplified, reduced set. If this option is enabled, the average + * point of the subset, also known as \e centroid, is also included in the + * simplified point list. This usually improves the shape preservation + * behavior of the algorithm, at the cost of a small amount of additional + * points in the simplified point list. + */ + void EnableCentroidInclusion( bool enable = true ) + { + m_includeCentroids = enable; + } + + /*! + * Disables inclusion of centroid points for this surface simplifier. See + * EnableCentroidInclusion() for more information. + */ + void DisableCentroidInclusion( bool disable = true ) + { + EnableCentroidInclusion( !disable ); + } + + /*! + * Attempts to simplify a set of points given by its separate coordinates + * and function values. + * + * \param[out] xs The X coordinates of the simplified point set. + * + * \param[out] ys The Y coordinates of the simplified point set. + * + * \param[out] zs The function values for the simplified point set. + * + * \param x The X coordinates of the input point set. + * + * \param y The Y coordinates of the input point set. + * + * \param z The function values for the input point set. + * + * The template argument C must be a direct container of numeric scalars + * with random access semantics, such as Array or GenericVector. + * + * If the specified surface can be simplified with the current working + * parameters defined for this object, the output containers will have less + * elements (usually \e much less) than the input containers. Otherwise an + * exact copy of the input containers will be obtained in \a xs, \a ys and + * \a zs. This will happen also if the input containers have less than four + * coordinates, since a triangular facet cannot be simplified. + */ + template + void Simplify( C& xs, C& ys, C& zs, const C& x, const C& y, const C& z ) const + { + int n = int( Min( Min( x.Length(), y.Length() ), z.Length() ) ); + if ( n < 4 ) + { + xs = x; ys = y; zs = z; + return; + } + + point_list P; + for ( int i = 0; i < n; ++i ) + P << point( x[i], y[i], z[i] ); + + tree R( P, n ); + P = Simplify( R ); + if ( int( P.Length() ) >= n ) + { + xs = x; ys = y; zs = z; + return; + } + + R.Build( P, n ); + P = Simplify( R ); + + n = int( P.Length() ); + xs = C( n ); + ys = C( n ); + zs = C( n ); + for ( int i = 0; i < n; ++i ) + { + xs[i] = typename C::item_type( P[i].x ); + ys[i] = typename C::item_type( P[i].y ); + zs[i] = typename C::item_type( P[i].z ); + } + } + +private: + + double m_tolerance = __PCL_SURFACE_SIMPLIFIER_DEFAULT_TOLERANCE; + float m_rejectFraction = __PCL_SURFACE_SIMPLIFIER_DEFAULT_REJECT_FRACTION; + bool m_enableRejection = __PCL_SURFACE_SIMPLIFIER_DEFAULT_REJECTION_ENABLED; + bool m_includeCentroids = __PCL_SURFACE_SIMPLIFIER_DEFAULT_INCLUDE_CENTROIDS; + + /*! + * Recursive part of the shape-preserving surface simplification algorithm. + * Returns the simplified point list for the set of points stored in the + * local quadtree \a R. + * \internal + */ + point_list Simplify( tree& R ) const + { + point_list Q; + R.Traverse( + [&Q,this]( const rectangle& rect, point_list& points, void*& ) + { + int n = int( points.Length() ); + if ( n < 4 ) // cannot simplify triangles + { + Q << points; + return; + } + + /* + * Compute local centroid coordinates. + */ + point p0( 0 ); + for ( const point& p : points ) + p0 += p; + p0 /= n; + + /* + * Form the covariance matrix. + */ + double xx = 0, xy = 0, xz = 0, yy = 0, yz = 0, zz = 0; + for ( const point& p : points ) + { + double dx = p.x - p0.x; + double dy = p.y - p0.y; + double dz = p.z - p0.z; + xx += dx*dx; + xy += dx*dy; + xz += dx*dz; + yy += dy*dy; + yz += dy*dz; + zz += dz*dz; + } + int n1 = n - 1; + xx /= n1; + xy /= n1; + xz /= n1; + yy /= n1; + yz /= n1; + zz /= n1; + Matrix M( xx, xy, xz, + xy, yy, yz, + xz, yz, zz ); + + /* + * Test all local function values against the plane fitted at the + * centroid, with optional outlier rejection. The plane normal + * vector is the least eigenvector, from which we can form the + * plane equation: ax + by + cz = 0. + */ + ComputeEigenvectors( M ); + double a = M[0][0]; + double b = M[1][0]; + double c = M[2][0]; + int mr = m_enableRejection ? Max( 1, TruncInt( m_rejectFraction*n ) ) : 1; // max. number of outliers + int nr = 0; + point_list P = points; + for ( point& p : P ) + { + double z = p0.z - (a*(p.x - p0.x) + b*(p.y - p0.y))/c; + if ( Abs( p.z - z ) > m_tolerance ) + { + if ( ++nr == mr ) + { + /* + * If the current region deviates from the fitted plane + * more than allowed by the tolerance parameter after + * outlier rejection, try to simplify it further with a + * deeper quadtree subdivision. + */ + tree R( points, TruncInt( 0.75*n ) ); + Q << Simplify( R ); + return; + } + + // Winsorize outlier function values. + p.z = (p.z > z) ? z + m_tolerance : z - m_tolerance; + } + } + + /* + * If the current region is flat to within the tolerance parameter, + * take the convex hull as its simplified point set. This is what + * makes our simplification algorithm shape-preserving. + */ + if ( m_includeCentroids ) + { + // If one or more points have been rejected, calculate a new + // centroid function value from Winsorized z coordinates. + if ( nr > 0 ) + { + p0.z = 0; + for ( const point& p : P ) + p0.z += p.z; + p0.z /= n; + } + Q << p0; + } + Q << ConvexHull( P ); + } + ); + + return Q; + } + + /*! + * \internal + * Compute the eigenvectors of a 3x3 symmetric matrix. + */ + static void ComputeEigenvectors( Matrix& ); + + /*! + * \internal + * Compute the convex hull of a point set. + */ + static point_list ConvexHull( point_list& ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SurfaceSimplifier_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SurfaceSimplifier.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/SurfaceSpline.h b/3rdparty/include/pcl/SurfaceSpline.h new file mode 100644 index 0000000..e5eb2e5 --- /dev/null +++ b/3rdparty/include/pcl/SurfaceSpline.h @@ -0,0 +1,2011 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/SurfaceSpline.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_SurfaceSpline_h +#define __PCL_SurfaceSpline_h + +/// \file pcl/SurfaceSpline.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION +# include +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/* + * Default quadtree bucket capacity for recursive surface subspline generation. + */ +#define __PCL_RSSPLINE_DEFAULT_TREE_BUCKET_CAPACITY 64 + +/* + * Default maximum spline length for a non-recursive quadtree node in a + * recursive surface spline. + */ +#define __PCL_RSSPLINE_DEFAULT_SPLINE_MAX_LENGTH 1600 + +/* + * Whether to allow extrapolation outside the interpolation region for + * recursive surface splines. Extrapolation is disabled by default because + * recursively defined subsplines are slightly more prone to oscillation than + * normal surface splines. + */ +#define __PCL_RSSPLINE_DEFAULT_ALLOW_EXTRAPOLATION false + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::RadialBasisFunction + * \brief Implemented radial basis functions (RBFs) for surface spline + * interpolation. + * + * The symbols used in the following table are: + * + * phi(r) The radial basis function evaluated at a point (x,y) + * r Distance to center, r^2 = (x-xc)^2 + (y-yc)^2 + * (xc,yc) Center point + * eps Shape parameter + * + * + * + * + * + * + * + * + * + *
RadialBasisFunction::Unknown Unknown or unsupported function.
RadialBasisFunction::VariableOrder phi(r) = (r^2)^(m-1) * Ln( r^2 )
RadialBasisFunction::ThinPlateSpline phi(r) = r^2 * Ln( r )
RadialBasisFunction::Gaussian phi(r) = Exp( -(eps*r)^2 )
RadialBasisFunction::Multiquadric phi(r) = Sqrt( 1 + (eps*r)^2 )
RadialBasisFunction::InverseMultiquadric phi(r) = 1/Sqrt( 1 + (eps*r)^2 )
RadialBasisFunction::InverseQuadratic phi(r) = 1/( 1 + (eps*r)^2 )
+ */ +namespace RadialBasisFunction +{ + enum value_type + { + Unknown = -1, + VariableOrder = 0, // phi(r) = (r^2)^(m-1) * Ln( r^2 ) + ThinPlateSpline, // phi(r) = r^2 * Ln( r ) + Gaussian, // phi(r) = Exp( -(eps*r)^2 ) + Multiquadric, // phi(r) = Sqrt( 1 + (eps*r)^2 ) + InverseMultiquadric, // phi(r) = 1/Sqrt( 1 + (eps*r)^2 ) + InverseQuadratic, // phi(r) = 1/( 1 + (eps*r)^2 ) + __number_of_items__, + Default = ThinPlateSpline + }; + + inline static bool Validate( int rbf ) + { + return rbf >= 0 && rbf < __number_of_items__; + } +} + +// ---------------------------------------------------------------------------- + +/*! + * \class SurfaceSplineBase + * \brief Base class of two-dimensional surface splines. + */ +class PCL_CLASS SurfaceSplineBase +{ +public: + + /*! + * Represents a radial basis function (RBF) supported by this surface spline + * implementation. + */ + typedef RadialBasisFunction::value_type rbf_type; + +protected: + + /*! + * Default constructor. + */ + SurfaceSplineBase() = default; + + /*! + * Copy constructor. + */ + SurfaceSplineBase( const SurfaceSplineBase& ) = default; + + /*! + * Move constructor. + */ + SurfaceSplineBase( SurfaceSplineBase&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~SurfaceSplineBase() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SurfaceSplineBase& operator =( const SurfaceSplineBase& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SurfaceSplineBase& operator =( SurfaceSplineBase&& ) = default; + + /*! + * Surface spline generation, 32-bit floating point data. + */ + static void Generate( float* __restrict__ c, + rbf_type, double e2, bool polynomial, + const float* __restrict__ x, const float* __restrict__ y, const float* __restrict__ z, + int n, int m, float r, const float* __restrict__ w ); + + /*! + * Surface spline generation, 64-bit floating point data. + */ + static void Generate( double* __restrict__ c, + rbf_type, double e2, bool polynomial, + const double* __restrict__ x, const double* __restrict__ y, const double* __restrict__ z, + int n, int m, float r, const float* __restrict__ w ); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SurfaceSpline + * \brief Two-dimensional interpolating/approximating surface spline. + * + * %SurfaceSpline implements interpolating or smoothing surface splines for + * arbitrarily distributed input nodes in two dimensions using radial basis + * functions (RBFs). + * + * The most distinctive property of surface splines is their high adaptability + * to local variations, which makes them ideal to model complex two dimensional + * functions with high accuracy. These interpolation properties largely depend + * on the employed radial basis functions. The well-known thin plate + * spline function is the default RBF used by this implementation. A thin + * plate spline describes the minimal-energy bending of a thin sheet of metal + * passing through a set of interpolation points in three-dimensional space. + * This physical justification gives thin plate splines accuracy and + * adaptability properties that we have been applying successfully to many + * critical data modeling tasks, including very especially image registration + * and astrometric solutions with arbitrary distortion corrections. + * + * Other RBFs supported by this class include a variable order function that + * allows imposing the derivability order of the interpolation/approximation + * spline, as well as less globally dependent functions such as Gaussian and + * multiquadric RBFs. See the RadialBasisFunction namespace for the complete + * list of supported RBFs. + * + * An important advantage of our implementation is the possibility to control + * adaptability with approximating (or smoothing) surface splines, as opposed + * to interpolating splines, and the possibility to control adaptability both + * as a global property of the modeling device, or on a point-by-point basis. + * + * The main drawback of surface splines is that they are computationally + * expensive, especially for large data sets. Generation of surface splines + * usually requires solving dense linear systems, which involves the use of + * algorithms with O(N^3) complexity (such as the Bunch-Kaufman diagonal + * pivoting method). This limits the applicability of this implementation to + * data sets of no more than about 2000-3000 interpolation nodes using current + * hardware. See the RecursivePointSurfaceSpline class for a more efficient + * implementation to generate local subsplines based on quadtrees. + * + * For fast evaluation of surface splines in massive problems, see the + * GridInterpolation and PointGridInterpolation classes for highly efficient + * discretized implementations. + * + * \sa PointSurfaceSpline, RecursivePointSurfaceSpline, GridInterpolation, + * PointGridInterpolation, ShepardInterpolation, SurfacePolynomial + */ +template +class PCL_CLASS SurfaceSpline : private SurfaceSplineBase +{ +public: + + /*! + * The numeric type used to represent coordinates, function values and + * spline coefficients. + */ + typedef T scalar; + + /*! + * Represents a vector of coordinates, function values or spline + * coefficients. + */ + typedef GenericVector vector; + + /*! + * The numeric type used to represent the interpolation strength of a + * surface interpolation node. + */ + typedef float weight; + + /*! + * Represents a vector of interpolation node weights. + */ + typedef GenericVector weight_vector; + + /*! + * Represents a radial basis function (RBF) supported by this surface spline + * implementation. + */ + typedef SurfaceSplineBase::rbf_type rbf_type; + + /*! + * Default constructor. Constructs an empty, two-dimensional interpolating + * surface spline of second order. + */ + SurfaceSpline() = default; + + /*! + * Copy constructor. + */ + SurfaceSpline( const SurfaceSpline& ) = default; + + /*! + * Move constructor. + */ + SurfaceSpline( SurfaceSpline&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~SurfaceSpline() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SurfaceSpline& operator =( const SurfaceSpline& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SurfaceSpline& operator =( SurfaceSpline&& ) = default; + + /*! + * Returns true iff this surface spline is valid. A valid surface spline has + * been initialized with three or more interpolation nodes. + */ + bool IsValid() const + { + return m_x.Length() >= 3 && m_x.Length() == m_y.Length(); + } + + /*! + * Returns the number of nodes used by this surface spline interpolation. + */ + int Length() const + { + return m_x.Length(); + } + + /*! + * Returns a vector with the X node coordinates used to initialize this + * surface spline. If this object has not been initialized, this function + * returns an empty vector. + */ + vector X() const + { + vector x( m_x.Length() ); + if ( IsValid() ) + for ( int i = 0; i < m_x.Length(); ++i ) + x[i] = m_x0 + m_x[i]/m_r0; + return x; + } + + /*! + * Returns a vector with the Y node coordinates used to initialize this + * surface spline. If this object has not been initialized, this function + * returns an empty vector. + */ + vector Y() const + { + vector y( m_y.Length() ); + if ( IsValid() ) + for ( int i = 0; i < m_y.Length(); ++i ) + y[i] = m_y0 + m_y[i]/m_r0; + return y; + } + + /*! + * Returns the type of radial basis function (RBF) used by this surface + * spline. See the RadialBasisFunction namespace for the list of supported + * RBFs in the current implementation. + */ + rbf_type RBFType() const + { + return m_rbf; + } + + /*! + * Sets the radial basis function that will be used by this surface spline. + * + * Calling this member function implicitly resets this %SurfaceSpline object + * and destroys all internal working structures. If the specified RBF is not + * of a variable order type, the derivability order of this surface spline + * will be reset to second order. + */ + void SetRBFType( rbf_type rbf ) + { + Clear(); + m_rbf = rbf; + } + + /*! + * Returns the shape parameter applied to scale the radial basis function + * used by this surface spline. + * + * The shape parameter is only used by decreasing RBFs, i.e., it is not used + * by the variable order and thin plate spline RBFs, which are + * parameter-free. + */ + double ShapeParameter() const + { + return Sqrt( m_eps2 ); + } + + /*! + * Sets the shape parameter applied to scale the radial basis function used + * by this surface spline. + * + * If the specified value \a eps is zero, an optimal shape parameter value + * will be computed automatically during initialization of spline functions. + * See the Initialize() member function for more information. + * + * Calling this member function implicitly resets this %SurfaceSpline object + * and destroys all internal working structures. + * + * The shape parameter is only used by decreasing RBFs, i.e., it is not used + * by the variable order and thin plate spline RBFs, which are + * parameter-free. + */ + void SetShapeParameter( double eps ) + { + Clear(); + m_eps = Abs( eps ); + m_eps2 = m_eps*m_eps; + } + + /*! + * Returns the derivability order of this surface spline. + */ + int Order() const + { + return m_order; + } + + /*! + * Sets the derivability order of this surface spline. + * + * \param order Derivability order. Must be ≥ 2. + * + * Calling this member function implicitly resets this %SurfaceSpline object + * and destroys all internal working structures. + * + * Specifying a derivability order ≥ 2 is really useful for variable + * order radial basis functions (RadialBasisFunction::VariableOrder). Other + * RBFs are implicitly of second order, so when they are selected the order + * specified by calling this function will only change the polynomial part + * of the surface spline. + * + * Only when a variable order RBF is selected, the surface spline will be + * continuously differentiable up to the specified \a order after a + * subsequent initialization. If the order is too high, an ill-conditioned + * linear system may result even for a set of valid interpolation nodes. + * + * The default order is 2. Recommended values are 2 and 3. + */ + void SetOrder( int order ) + { + PCL_PRECONDITION( order > 1 ) + Clear(); + m_order = pcl::Max( 2, order ); + } + + /*! + * Returns true iff this surface spline adds a stabilizing first-degree + * polynomial to the RBF interpolation/approximation function. + * + * A polynomial part is always enabled by default. Disabling it can generate + * some stability issues, especially for data sets with highly varying node + * values. + */ + bool IsPolynomialEnabled() const + { + return m_havePolynomial; + } + + /*! + * Enables the use of a stabilizing first-degree polynomial added to the RBF + * interpolation/approximation function. + * + * Calling this member function implicitly resets this %SurfaceSpline object + * and destroys all internal working structures. + */ + void EnablePolynomial( bool enable = true ) + { + Clear(); + m_havePolynomial = enable; + } + + /*! + * Disables the use of a stabilizing first-degree polynomial added to the + * RBF interpolation/approximation function. + * + * Calling this member function implicitly resets this %SurfaceSpline object + * and destroys all internal working structures. + */ + void DisablePolynomial( bool disable = true ) + { + EnablePolynomial( !disable ); + } + + /*! + * Returns the smoothing factor of this surface spline. See + * SetSmoothing() for more information. + */ + float Smoothing() const + { + return m_smoothing; + } + + /*! + * Sets the smoothing factor of this surface spline. + * + * \param s Smoothing factor. Must be ≥ 0. + * + * For \a s = 0, an interpolating surface spline will be generated: all node + * values will be reproduced exactly at their respective coordinates. + * + * For \a s > 0, a smoothing (or approximating) surface spline will be + * generated: increasing \a s values will generate splines closer to the + * reference plane of the input node set. + * + * \note This parameter is only used for the thin plate spline and variable + * order spline radial basis functions. For other RBFs only interpolation + * surface splines can be generated with this implementation, and hence this + * parameter is always ignored. + */ + void SetSmoothing( float s ) + { + PCL_PRECONDITION( s >= 0 ) + Clear(); + m_smoothing = pcl::Max( 0.0F, s ); + } + + /*! + * Generation of a two-dimensional surface spline (thin plate). + * + * \param x X node coordinates. + * + * \param y Y node coordinates. + * + * \param z Node function values. + * + * \param n Number of nodes. Must be ≥ 3 + * (3 nodes * 2 coordinates = six degrees of freedom). + * + * \param w When the smoothing factor of this spline is > 0, this is a + * vector of positive weights > 0 corresponding to the + * specified input nodes. If this parameter is \c nullptr, + * unit weights are assumed for all input nodes. When the + * smoothing factor is zero (interpolating spline), this + * parameter is ignored. + * + * The input nodes can be arbitrarily distributed, and they don't need to + * follow any specific order. However, all nodes should be distinct with + * respect to the machine epsilon for the floating point type T. + * + * This initialization function includes a sanitization routine. If there + * are duplicate points in the specified set of input nodes, only the first + * occurrence of each duplicate will be kept to build the surface spline, + * and the rest of duplicate points will be ignored. Two points are + * considered equal if their coordinates don't differ more than the machine + * epsilon for the floating point type T. + * + * For an interpolating surface spline (when smoothness = 0), all node + * function values will be reproduced exactly at their respective + * coordinates. In this case the vector \a w of node weights will be + * ignored. + * + * For an approximating surface spline (smoothness > 0), if a vector \a w of + * node weights is specified, it will be used to assign a different + * interpolation \e strength to each interpolation node. In this case the + * vector \a w must have at least \a n values greater than zero. A node + * weight larger than one will reduce the smoothness of the interpolating + * surface at the corresponding node coordinates, or in other words, it will + * give more prominence to the corresponding data point. A node weight of + * one will apply the current surface smoothness at its node position. A + * node weight smaller than one will increase the interpolation smoothness. + * + * \note The smoothing factor and the \a w parameter are only used for the + * thin plate spline and variable order spline radial basis functions. For + * other RBFs only interpolation surface splines can be generated with this + * implementation, and hence the \a w parameter is always ignored. + */ + void Initialize( const scalar* x, const scalar* y, const scalar* z, int n, const weight* w = nullptr ) + { + PCL_PRECONDITION( x != nullptr && y != nullptr && z != nullptr ) + PCL_PRECONDITION( n > 2 ) + + if ( x == nullptr || y == nullptr || z == nullptr ) + throw Error( "SurfaceSpline::Initialize(): Null vector pointer(s)." ); + + if ( n < 3 ) + throw Error( "SurfaceSpline::Initialize(): At least three input nodes must be specified." ); + + Clear(); + + if ( m_smoothing <= 0 ) + w = nullptr; + + try + { + /* + * Find mean coordinates. + */ + m_x0 = m_y0 = 0; + for ( int i = 0; i < n; ++i ) + { + m_x0 += x[i]; + m_y0 += y[i]; + } + m_x0 /= n; + m_y0 /= n; + + /* + * Find radius of largest containing circle. + */ + m_r0 = 0; + for ( int i = 0; i < n; ++i ) + { + double dx = x[i] - m_x0; + double dy = y[i] - m_y0; + double r = Sqrt( dx*dx + dy*dy ); + if ( r > m_r0 ) + m_r0 = r; + } + if ( 1 + m_r0 == 1 ) + throw Error( "SurfaceSpline::Initialize(): Empty or insignificant interpolation space." ); + m_r0 = 1/m_r0; + + /* + * If requested, compute an optimal shape parameter. + */ + if ( m_eps == 0 ) + { + Array R2; + for ( int i = 0; i < n; ++i ) + for ( int j = i; ++j < n; ) + { + double dx = x[i] - x[j]; + double dy = y[i] - y[j]; + R2 << dx*dx + dy*dy; + } + m_eps2 = 1/(m_r0*4*Sqrt( Median( R2.Begin(), R2.End() ) )); + } + else + m_eps2 = m_r0*m_eps; + m_eps2 *= m_eps2; + + /* + * Build point list with normalized node coordinates. + */ + Array P; + for ( int i = 0; i < n; ++i ) + P << NodeData( m_r0*(x[i] - m_x0), + m_r0*(y[i] - m_y0), + z[i], + (w != nullptr && w[i] > 0) ? w[i] : 1.0F ); + + /* + * Find duplicate input nodes. Two nodes are considered equal if their + * (normalized) coordinates don't differ more than the machine epsilon + * for the floating point type T. + */ + P.Sort(); + Array remove; + for ( int i = 0, j = 1; j < n; ++i, ++j ) + if ( Abs( P[i].x - P[j].x ) <= std::numeric_limits::epsilon() ) + if ( Abs( P[i].y - P[j].y ) <= std::numeric_limits::epsilon() ) + remove << i; + + /* + * Build working vectors, excluding duplicate input nodes. + */ + int N = n - int( remove.Length() ); + if ( N < 3 ) + throw Error( "SurfaceSpline::Initialize(): Less than three input nodes left after sanitization." ); + m_x = vector( N ); + m_y = vector( N ); + vector fz( N ); + if ( w != nullptr ) + m_weights = weight_vector( N ); + int i = 0, k = 0; + for ( int j : remove ) + { + for ( ; i < j; ++i, ++k ) + { + m_x[k] = P[i].x; + m_y[k] = P[i].y; + fz[k] = P[i].z; + if ( w != nullptr ) + m_weights[k] = P[i].w; + } + ++i; + } + for ( ; i < n; ++i, ++k ) + { + m_x[k] = P[i].x; + m_y[k] = P[i].y; + fz[k] = P[i].z; + if ( w != nullptr ) + m_weights[k] = P[i].w; + } + + m_spline = vector( scalar( 0 ), N + (m_havePolynomial ? ((m_order*(m_order + 1)) >> 1) : 0) ); + + Generate( m_spline.Begin(), m_rbf, m_eps2, m_havePolynomial, + m_x.Begin(), m_y.Begin(), fz.Begin(), N, m_order, + m_smoothing, m_weights.Begin() ); + } + catch ( ... ) + { + Clear(); + throw; + } + } + + /*! + * Resets this surface spline interpolation, deallocating all internal + * working structures. + */ + void Clear() + { + m_x.Clear(); + m_y.Clear(); + m_weights.Clear(); + m_spline.Clear(); + } + + /*! + * Two-dimensional surface spline interpolation/approximation. Returns an + * approximated or interpolated function value at the specified \a x and + * \a y coordinates. + * + * Before calling this function, a valid surface spline must be generated by + * calling Initialize(). If called fon an uninitialized object, this member + * function invokes undefined behavior. + */ + scalar operator ()( double x, double y ) const + { + PCL_PRECONDITION( !m_x.IsEmpty() && !m_y.IsEmpty() ) + PCL_CHECK( m_order >= 2 ) + PCL_CHECK( !m_spline.IsEmpty() ) + + /* + * Normalized interpolation coordinates. + */ + x = m_r0*(x - m_x0); + y = m_r0*(y - m_y0); + + /* + * Add polynomial part of the surface spline. + */ + int n = m_x.Length(); + double z = 0; + if ( m_havePolynomial ) + { + z += m_spline[n]; + switch ( m_order ) + { + case 2: + z += m_spline[n+1]*x + m_spline[n+2]*y; + break; + case 3: + z += (m_spline[n+1] + m_spline[n+3]*x + m_spline[n+4]*y)*x + (m_spline[n+2] + m_spline[n+5]*y)*y; + break; + default: + for ( int i = 1, j = n+1, i1 = (m_order*(m_order + 1))>>1, ix = 0, iy = 0; i < i1; ++i, ++j ) + if ( ix == 0 ) + { + ix = iy + 1; + iy = 0; + z += m_spline[j] * PowI( x, ix ); + } + else + { + --ix; + ++iy; + z += m_spline[j] * PowI( x, ix ) * PowI( y, iy ); + } + break; + } + } + + /* + * Add radial basis functions. + */ + switch ( m_rbf ) + { + case RadialBasisFunction::VariableOrder: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + double r2 = dx*dx + dy*dy; + if ( r2 != 0 ) + { + double r2m1 = r2; + for ( int j = m_order; --j > 1; ) + r2m1 *= r2; + z += m_spline[i] * r2m1 * pcl::Ln( r2 ); + } + } + break; + case RadialBasisFunction::ThinPlateSpline: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + double r2 = dx*dx + dy*dy; + if ( r2 != 0 ) + z += m_spline[i] * r2 * pcl::Ln( Sqrt( r2 ) ); + } + break; + case RadialBasisFunction::Gaussian: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + z += m_spline[i] * pcl::Exp( -m_eps2 * (dx*dx + dy*dy) ); + } + break; + case RadialBasisFunction::Multiquadric: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + z += m_spline[i] * pcl::Sqrt( 1 + m_eps2 * (dx*dx + dy*dy) ); + } + break; + case RadialBasisFunction::InverseMultiquadric: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + z += m_spline[i] / pcl::Sqrt( 1 + m_eps2 * (dx*dx + dy*dy) ); + } + break; + case RadialBasisFunction::InverseQuadratic: + for ( int i = 0; i < n; ++i ) + { + double dx = m_x[i] - x; + double dy = m_y[i] - y; + z += m_spline[i] / (1 + m_eps2 * (dx*dx + dy*dy)); + } + break; + default: + break; + } + + return scalar( z ); + } + + /*! + * Returns an interpolated/approximated function value at the specified + * \a p.x and \a p.y point coordinates. See operator()( double, double ) for + * more information. + */ + template + scalar operator ()( const GenericPoint& p ) const + { + return operator ()( double( p.x ), double( p.y ) ); + } + +protected: + + rbf_type m_rbf = RadialBasisFunction::Default; + bool m_havePolynomial = true; // use 1st order polynomial for stabilization + double m_eps = 0; // shape parameter, 0 -> find optimal value automatically + double m_eps2 = 0; // squared shape parameter + vector m_x; // vector of normalized X node coordinates + vector m_y; // vector of normalized Y node coordinates + double m_r0 = 1; // scaling factor for normalization of node coordinates + double m_x0 = 0; // zero offset for normalization of X node coordinates + double m_y0 = 0; // zero offset for normalization of Y node coordinates + int m_order = 2; // derivative order >= 2 + float m_smoothing = 0; // <= 0 -> interpolating spline, > 0 -> smoothing factor of approximating spline + weight_vector m_weights; // optional node weights for approximating spline + vector m_spline; // coefficients of the 2-D surface spline, polynomial coeffs. at tail + + /*! + * \struct NodeData + * \brief Auxiliary structure for data sanitization. + * \internal + */ + struct NodeData + { + scalar x, y, z; + weight w; + + NodeData( scalar a_x, scalar a_y, scalar a_z, weight a_w ) + : x( a_x ), y( a_y ), z( a_z ), w( a_w ) + { + } + + bool operator ==( const NodeData& p ) const + { + return x == p.x && y == p.y; + } + + bool operator <( const NodeData& p ) const + { + return (x != p.x) ? x < p.x : y < p.y; + } + }; + + friend class DrizzleData; + friend class DrizzleDataDecoder; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PointSurfaceSpline + * \brief Vector surface spline interpolation/approximation in two dimensions + * + * The template parameter P represents an interpolation point in two + * dimensions. The type P must implement P::x and P::y data members accessible + * from the current %PointSurfaceSpline template specialization. These members + * must provide the values of the horizontal and vertical coordinates, + * respectively, of an interpolation point. In addition, the scalar types of + * the P::x and P::y point members must support conversion to double semantics. + * + * \sa SurfaceSpline, RecursivePointSurfaceSpline + */ +template +class PCL_CLASS PointSurfaceSpline +{ +public: + + /*! + * Represents an interpolation point in two dimensions. + */ + typedef P point; + + /*! + * Represents a sequence of interpolation points. + */ + typedef Array point_list; + + /*! + * Represents a coordinate interpolating/approximating surface spline. + */ + typedef SurfaceSpline spline; + + /*! + * Represents a radial basis function (RBF) supported by this point surface + * spline implementation. + */ + typedef spline::rbf_type rbf_type; + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + PointSurfaceSpline() = default; + + /*! + * Copy constructor. + */ + PointSurfaceSpline( const PointSurfaceSpline& ) = default; + + /*! + * Move constructor. + */ + PointSurfaceSpline( PointSurfaceSpline&& ) = default; + + /*! + * Constructs a %PointSurfaceSpline object initialized for the specified + * input data and interpolation parameters. + * + * See the corresponding Initialize() member function for a detailed + * description of parameters. + */ + template + PointSurfaceSpline( const point_list& P1, const point_list& P2, + float smoothness = 0, int order = 2, + const weight_vector& W = weight_vector(), + rbf_type rbf = RadialBasisFunction::Default, + double eps = 0, + bool polynomial = true ) + { + Initialize( P1, P2, smoothness, W, order, rbf, eps, polynomial ); + } + + /*! + * Constructs a %PointSurfaceSpline object initialized with prescribed point + * surface splines. + * + * See the corresponding Initialize() member function for a more detailed + * description of parameters and their required conditions. + */ + PointSurfaceSpline( const spline& Sx, const spline& Sy ) + { + Initialize( Sx, Sy ); + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + PointSurfaceSpline& operator =( const PointSurfaceSpline& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + PointSurfaceSpline& operator =( PointSurfaceSpline&& ) = default; + + /*! + * Initializes this %PointSurfaceSpline object for the specified input data + * and interpolation parameters. + * + * \param P1 A sequence of distinct interpolation node points. + * + * \param P2 A sequence of interpolation values. For each point in + * \a P1, the coordinates of its counterpart point in + * \a P2 will be used as the interpolation node values in + * the X and Y directions. + * + * \param smoothness Smoothing factor. Must be ≥ 0. The default value is + * zero, that is, interpolating surface splines are + * generated by default. + * + * \param W Reference to a vector of positive node \e weights > 0, + * when the smoothing factor is > 1. For an interpolating + * spline this parameter will be ignored (see below). This + * argument must be a reference to a vector or array of + * \c float values. + * + * \param order Derivative order of continuity. Must be ≥ 2. The + * default value is 2. This parameter is only taken into + * account when the \a rbf parameter is + * RadialBasisFunction::VariableOrder. + * + * \param rbf The type of radial basis function (RBF) used for + * surface spline generation. The default is + * RadialBasisFunction::ThinPlateSpline in the current + * implementation. + * + * \param eps The shape parameter used for decreasing radial basis + * functions. Increasing RBFs, such as thin plate splines + * and variable order functions, are parameter-free and + * ignore this parameter. + * + * \param polynomial If true, surface spline generation will include a first + * order polynomial part for stabilization. If false, only + * radial basis functions will be used without a + * polynomial component. + * + * For \a smoothness <= 0, an interpolating spline will be generated: all + * node values will be reproduced exactly at their respective coordinates. + * In this case the \a W parameter will be ignored. + * + * For \a smoothness > 0, a smoothing (or approximating) spline will be + * generated: increasing \a smoothness values will generate splines closer + * to the reference plane of the input node set. If nonempty, the specified + * vector \a W of node weights will be used to assign a different + * interpolation \e strength to each interpolation node. In this case the + * vector \a W must have at least the same length as the shortest of the + * \a P1 and \a P2 vectors, and must contain values greater than zero. A + * node weight larger than one will reduce the smoothness of the + * interpolating surface at the corresponding node coordinates, or in other + * words, it will give more prominence to the corresponding data point. A + * node weight of one will apply the specified \a smoothness at its node + * position. Contrarily, a node weight smaller than one will increase the + * interpolation smoothness locally. + * + * When the variable order RBF is specified, the surface spline will be + * continuously differentiable up to the specified \a order. If this order + * is too high, an ill-conditioned linear system may result, especially for + * large data sets. The recommended values are 2, 3, 4 or 5, but order 2 is + * usually the most useful and safest option for most applications. + * Derivative orders greater than 3 may lead to numerically unstable + * interpolation devices, which should always be used with care. For the + * rest of RBFs the \a order parameter is ignored and second order functions + * are always used. + * + * \note The \a smoothness and \a W parameters are only used for the thin + * plate spline and variable order spline radial basis functions. For other + * RBFs only interpolation surface splines can be generated with this + * implementation, and hence these parameters are always ignored. + */ + template + void Initialize( const point_list& P1, const point_list& P2, + float smoothness = 0, const weight_vector& W = weight_vector(), int order = 2, + rbf_type rbf = RadialBasisFunction::Default, + double eps = 0, + bool polynomial = true ) + { + PCL_PRECONDITION( P1.Length() >= 3 ) + PCL_PRECONDITION( P1.Length() <= P2.Length() ) + PCL_PRECONDITION( order >= 2 ) + PCL_PRECONDITION( W.IsEmpty() || P1.Length() <= W.Length() ) + + Clear(); + + if ( P1.Length() < 3 || P2.Length() < 3 ) + throw Error( "PointSurfaceSpline::Initialize(): At least three input nodes must be specified." ); + + if ( P1.Length() > P2.Length() || + !W.IsEmpty() && P1.Length() > size_type( W.Length() ) ) + throw Error( "PointSurfaceSpline::Initialize(): Insufficient data." ); + + m_Sx.SetRBFType( rbf ); + m_Sx.SetOrder( order ); + m_Sx.SetShapeParameter( eps ); + m_Sx.EnablePolynomial( polynomial ); + m_Sx.SetSmoothing( smoothness ); + + m_Sy.SetRBFType( rbf ); + m_Sy.SetOrder( order ); + m_Sy.SetShapeParameter( eps ); + m_Sy.EnablePolynomial( polynomial ); + m_Sy.SetSmoothing( smoothness ); + + DVector X( int( P1.Length() ) ), + Y( int( P1.Length() ) ), + Zx( int( P1.Length() ) ), + Zy( int( P1.Length() ) ); + for ( int i = 0; i < X.Length(); ++i ) + { + X[i] = P1[i].x; + Y[i] = P1[i].y; + Zx[i] = P2[i].x; + Zy[i] = P2[i].y; + } + m_Sx.Initialize( X.Begin(), Y.Begin(), Zx.Begin(), X.Length(), W.Begin() ); + m_Sy.Initialize( X.Begin(), Y.Begin(), Zy.Begin(), X.Length(), W.Begin() ); + } + + /*! + * \internal + * Internal-use initialization routine. + */ + void Initialize( const DVector& X1, const DVector& Y1, const DVector& Z1, + const DVector& X2, const DVector& Y2, const DVector& Z2, + float smoothness = 0, + const FVector& W1 = FVector(), const FVector& W2 = FVector(), + int order = 2, + rbf_type rbf = RadialBasisFunction::Default, + double eps = 0, + bool polynomial = true ) + { + PCL_PRECONDITION( X1.Length() >= 3 ) + PCL_PRECONDITION( X2.Length() >= 3 ) + PCL_PRECONDITION( X1.Length() <= Y1.Length() ) + PCL_PRECONDITION( X1.Length() <= Z1.Length() ) + PCL_PRECONDITION( W1.IsEmpty() || X1.Length() <= W1.Length() ) + PCL_PRECONDITION( X2.Length() <= Y2.Length() ) + PCL_PRECONDITION( X2.Length() <= Z2.Length() ) + PCL_PRECONDITION( W2.IsEmpty() || X2.Length() <= W2.Length() ) + PCL_PRECONDITION( order >= 2 ) + + Clear(); + + if ( X1.Length() < 3 || X2.Length() < 3 ) + throw Error( "PointSurfaceSpline::Initialize(): At least three input nodes must be specified." ); + + if ( X1.Length() > Y1.Length() || + X1.Length() > Z1.Length() || + !W1.IsEmpty() && X1.Length() > W1.Length() || + X2.Length() > Y2.Length() || + X2.Length() > Z2.Length() || + !W2.IsEmpty() && X2.Length() > W2.Length() ) + throw Error( "PointSurfaceSpline::Initialize(): Insufficient data." ); + + m_Sx.SetRBFType( rbf ); + m_Sx.SetOrder( order ); + m_Sx.SetShapeParameter( eps ); + m_Sx.EnablePolynomial( polynomial ); + m_Sx.SetSmoothing( smoothness ); + m_Sx.Initialize( X1.Begin(), Y1.Begin(), Z1.Begin(), X1.Length(), W1.Begin() ); + + m_Sy.SetRBFType( rbf ); + m_Sy.SetOrder( order ); + m_Sy.SetShapeParameter( eps ); + m_Sy.EnablePolynomial( polynomial ); + m_Sy.SetSmoothing( smoothness ); + m_Sy.Initialize( X2.Begin(), Y2.Begin(), Z2.Begin(), X2.Length(), W2.Begin() ); + } + + /*! + * Initializes this %PointSurfaceSpline object with prescribed point surface + * splines. + * + * \param Sx 2-D point surface spline for interpolation of function values + * in the X direction. + * + * \param Sy 2-D point surface spline for interpolation of function values + * in the Y direction. + * + * Both surface splines must be valid. If one or both splines are invalid, + * calling this member function is equivalent to Clear(). + * + * After calling this member function successfuly, this object will store + * deep copies of the specified surface spline instances. + */ + void Initialize( const spline& Sx, const spline& Sy ) + { + Clear(); + if ( Sx.IsValid() && Sy.IsValid() ) + { + m_Sx = Sx; + m_Sy = Sy; + } + } + + /*! + * Returns an approximation to the inverse surface spline of this object. + * + * The returned object can be used to perform an inverse interpolation: + * Given an interpolation point P2, the returned spline will interpolate the + * corresponding node point P1. See Initialize() for more information on + * spline initialization. + * + * In general, the returned object can only provide an approximation to the + * inverse of the underlying coordinate transformation. In particular, if + * this object has been initialized as an approximating surface spline, its + * inverse spline will compute node point coordinates from approximate + * (smoothed) interpolated coordinates, instead of the original ones. + * + * If two or more interpolation points were identical when this object was + * initialized, calling this member function may lead to an ill-conditioned + * linear system. In such case, an Error exception will be thrown. + * + * If this object has not been initialized, this function returns an + * uninitialized %PointSurfaceSpline object. + */ + PointSurfaceSpline Inverse() const + { + PointSurfaceSpline inverse; + if ( IsValid() ) + { + DVector X = m_Sx.X(), + Y = m_Sx.Y(), + Zx( m_Sx.X().Length() ), + Zy( m_Sx.Y().Length() ); + for ( int i = 0; i < X.Length(); ++i ) + { + Zx[i] = m_Sx( X[i], Y[i] ); + Zy[i] = m_Sy( X[i], Y[i] ); + } + + inverse.m_Sx.SetRBFType( m_Sx.RBFType() ); + inverse.m_Sx.SetOrder( m_Sx.Order() ); + inverse.m_Sx.SetShapeParameter( m_Sx.ShapeParameter() ); + inverse.m_Sx.EnablePolynomial( m_Sx.IsPolynomialEnabled() ); + inverse.m_Sx.Initialize( Zx.Begin(), Zy.Begin(), X.Begin(), X.Length() ); + + inverse.m_Sy.SetRBFType( m_Sy.RBFType() ); + inverse.m_Sy.SetOrder( m_Sy.Order() ); + inverse.m_Sy.SetShapeParameter( m_Sy.ShapeParameter() ); + inverse.m_Sy.EnablePolynomial( m_Sy.IsPolynomialEnabled() ); + inverse.m_Sy.Initialize( Zx.Begin(), Zy.Begin(), Y.Begin(), X.Length() ); + } + return inverse; + } + + /*! + * Deallocates internal structures, yielding an empty spline that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_Sx.Clear(); + m_Sy.Clear(); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return m_Sx.IsValid() && m_Sy.IsValid(); + } + + /*! + * Returns a reference to the internal surface spline object used for + * interpolation in the X plane direction. + */ + const spline& SplineX() const + { + return m_Sx; + } + + /*! + * Returns a reference to the internal surface spline object used for + * interpolation in the Y plane direction. + */ + const spline& SplineY() const + { + return m_Sy; + } + + /*! + * Returns an interpolated point at the specified coordinates. + */ + template + DPoint operator ()( T x, T y ) const + { + return DPoint( m_Sx( x, y ), m_Sy( x, y ) ); + } + + /*! + * Returns an interpolated point at the given \a p.x and \a p.y coordinates. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /* + * The surface splines in the X and Y plane directions. + */ + spline m_Sx, m_Sy; + + friend class DrizzleData; + friend class DrizzleDataDecoder; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class RecursivePointSurfaceSpline + * \brief Vector surface spline interpolation/approximation in two dimensions + * with recursive subspline generation. + * + * This class is a functional replacement for PointSurfaceSpline. It splits the + * interpolation region recursively using quadtrees. At each quadtree leaf node + * a subspline is generated with a subset of the interpolation nodes, with + * additional data redundancy to ensure smoothness across subregion boundaries. + * + * This recursive scheme is appropriate for large-scale problems, where single + * thin plate splines can be impractical because their generation has O(n^3) + * time complexity. An instance of %RecursivePointSurfaceSpline can be built + * with an unlimited number of arbitrarily distributed interpolation points. + * + * \sa PointSurfaceSpline, SurfaceSpline + */ +template +class PCL_CLASS RecursivePointSurfaceSpline : public ParallelProcess +{ +public: + + /*! + * Represents a point surface spline. + */ + typedef PointSurfaceSpline

spline; + + /* + * Represents a recursive point surface spline. + */ + typedef RecursivePointSurfaceSpline

recursive_spline; + + /*! + * Represents an interpolation point in two dimensions. + */ + typedef typename spline::point point; + + /*! + * Represents a sequence of interpolation points. + */ + typedef typename spline::point_list point_list; + + /*! + * Default constructor. Yields an empty instance that cannot be used without + * initialization. + */ + RecursivePointSurfaceSpline() = default; + + /*! + * Copy constructor. Copy construction is disabled because this class uses + * internal data structures that cannot be copy-constructed. However, + * %RecursivePointSurfaceSpline implements move construction and move + * assignment. + */ + RecursivePointSurfaceSpline( const RecursivePointSurfaceSpline& ) = delete; + + /*! + * Copy assignment operator. Copy assignment is disabled because this class + * uses internal data structures that cannot be copy-assigned. However, + * %RecursivePointSurfaceSpline implements move assignment and move + * construction. + */ + RecursivePointSurfaceSpline& operator =( const RecursivePointSurfaceSpline& ) = delete; + + /*! + * Move constructor. + */ + RecursivePointSurfaceSpline( RecursivePointSurfaceSpline&& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + RecursivePointSurfaceSpline& operator =( RecursivePointSurfaceSpline&& ) = default; + + /*! + * Constructs a %RecursivePointSurfaceSpline object initialized for the + * specified input data and interpolation parameters. + * + * See the corresponding Initialize() member function for a detailed + * description of parameters. + */ + template + RecursivePointSurfaceSpline( const point_list& P1, const point_list& P2, + float smoothness = 0, + int order = 2, + const weight_vector& W = weight_vector(), + bool allowExtrapolation = __PCL_RSSPLINE_DEFAULT_ALLOW_EXTRAPOLATION, + int maxSplineLength = __PCL_RSSPLINE_DEFAULT_SPLINE_MAX_LENGTH, + int bucketCapacity = __PCL_RSSPLINE_DEFAULT_TREE_BUCKET_CAPACITY, + bool verbose = true ) + { + Initialize( P1, P2, smoothness, W, order, allowExtrapolation, maxSplineLength, bucketCapacity, verbose ); + } + + /*! + * Virtual destructor. + */ + virtual ~RecursivePointSurfaceSpline() + { + Clear(); + } + + /*! + * Initializes this %RecursivePointSurfaceSpline object for the specified + * input data and interpolation parameters. + * + * \param P1 A sequence of distinct interpolation node points. + * + * \param P2 A sequence of interpolation values. For each point in + * \a P1, the coordinates of its counterpart point in + * \a P2 will be used as the interpolation node values in + * the X and Y directions. + * + * \param smoothness Smoothing factor. Must be ≥ 0 (default = 0). + * + * \param W Reference to a vector of positive node \e weights > 0, + * when the smoothing factor is > 1. For an interpolating + * spline this parameter will be ignored (see below). This + * argument must be a reference to a vector or array of + * \c float values. + * + * \param order Derivative order. Must be ≥ 2 (default = 2). + * + * \param allowExtrapolation Whether to allow extrapolation on points + * exterior to the region defined by the specified set of + * interpolation node points \a P1. Extrapolation is not + * allowed by default because recursively generated + * subsplines are slightly more prone to oscillation than + * normal surface splines. + * + * \param maxSplineLength Maximum length of a point surface spline in a + * non-recursive %RecursivePointSurfaceSpline instance. + * The default value is 1600 points. Be aware that surface + * spline generation has O(n^3) time complexity (that's + * why this class exists after all), and the number of + * generated quadtree nodes grows exponentially with the + * total number of interpolation points. The default value + * is a reasonable compromise for balanced efficiency in + * most practical cases. + * + * \param bucketCapacity Bucket capacity for quadtree generation. The + * default value is 64 points. By decreasing this value + * the recursive surface spline initialization process + * will be faster, but the generated subsplines will be + * less accurate, leading to more border artifacts between + * contiguous quadtree node regions. + * + * \param verbose If true, this function will write information to the + * standard PixInsight console to provide some feedback to + * the user during the (potentially long) initialization + * process. If false, no feedback will be provided. + * + * For \a smoothness ≤ 0, interpolating subsplines will be generated: all + * node values will be reproduced exactly at their respective coordinates. + * In this case the \a W parameter will be ignored. + * + * For \a smoothness > 0, smoothing (or approximating) subsplines will be + * generated: increasing \a smoothness values will generate splines closer + * to the reference planes of their input node sets. If nonempty, the + * specified vector \a W of node weights will be used to assign a different + * interpolation strength to each interpolation node. In this case the + * vector \a W must have at least the same length as the shortest of the + * \a P1 and \a P2 vectors, and must contain values greater than zero. A + * node weight larger than one will reduce the smoothness of the + * interpolating surface at the corresponding node coordinates, or in other + * words, it will give more prominence to the corresponding data point. A + * node weight of one will apply the specified \a smoothness at its node + * position. Contrarily, a node weight smaller than one will increase the + * interpolation smoothness locally. + * + * The generated surface subsplines will be continuously differentiable up + * to the specified \a order. If this order is too high, ill-conditioned + * linear systems may result, especially for large data sets. The + * recommended values are 2, 3, 4 or 5, but order 2 is usually the most + * useful and safest option for most applications. Derivative orders greater + * than 3 may lead to numerically unstable interpolation devices, which + * should always be used with care. + */ + template + void Initialize( const point_list& P1, const point_list& P2, + float smoothness = 0, + const weight_vector& W = weight_vector(), + int order = 2, + bool allowExtrapolation = __PCL_RSSPLINE_DEFAULT_ALLOW_EXTRAPOLATION, + int maxSplineLength = __PCL_RSSPLINE_DEFAULT_SPLINE_MAX_LENGTH, + int bucketCapacity = __PCL_RSSPLINE_DEFAULT_TREE_BUCKET_CAPACITY, + bool verbose = true ) + { + PCL_PRECONDITION( P1.Length() >= 3 ) + PCL_PRECONDITION( P1.Length() <= P2.Length() ) + PCL_PRECONDITION( order >= 2 ) + PCL_PRECONDITION( W.IsEmpty() || P1.Length() <= W.Length() ) + + Clear(); + + if ( P1.Length() < 3 || P2.Length() < 3 ) + throw Error( "RecursivePointSurfaceSpline::Initialize(): At least three input nodes must be specified." ); + + bool weighted = smoothness > 0 && !W.IsEmpty(); + + if ( P1.Length() > P2.Length() || weighted && P1.Length() > size_type( W.Length() ) ) + throw Error( "RecursivePointSurfaceSpline::Initialize(): Insufficient data." ); + + m_extrapolate = allowExtrapolation; + + if ( P1.Length() <= size_type( maxSplineLength ) ) + { + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( "Building surface subsplines", 100 ); + } +#endif + for ( const auto& p : P1 ) + { + if ( p.x < m_rect.x0 ) + m_rect.x0 = p.x; + else if ( p.x > m_rect.x1 ) + m_rect.x1 = p.x; + if ( p.y < m_rect.y0 ) + m_rect.y0 = p.y; + else if ( p.y > m_rect.y1 ) + m_rect.y1 = p.y; + } + + m_spline.Initialize( P1, P2, smoothness, W, order, + (order == 2) ? RadialBasisFunction::ThinPlateSpline + : RadialBasisFunction::VariableOrder ); + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + if ( verbose ) + monitor.Complete(); +#endif + } + else + { + /* + * Find the total interpolation region. + */ + search_rectangle rect = search_coordinate( 0 ); + node_list data; + for ( size_type i = 0; i < P1.Length(); ++i ) + { + const point& p1 = P1[i]; + const point& p2 = P2[i]; + data << (weighted ? Node( p1, p2, W[i] ) : Node( p1, p2 )); + if ( p1.x < rect.x0 ) + rect.x0 = p1.x; + else if ( p1.x > rect.x1 ) + rect.x1 = p1.x; + if ( p1.y < rect.y0 ) + rect.y0 = p1.y; + else if ( p1.y > rect.y1 ) + rect.y1 = p1.y; + } + // Force a square interpolation region for optimal quadtree behavior. + if ( rect.Width() < rect.Height() ) + rect.InflateBy( (rect.Height() - rect.Width())/2, search_coordinate( 0 ) ); + else + rect.InflateBy( search_coordinate( 0 ), (rect.Width() - rect.Height())/2 ); + + /* + * Build the interpolation quadtree. + */ + m_tree.Build( rect, data, bucketCapacity ); + + /* + * Build subspline interpolation data. + */ + Array subsplineData; + m_tree.Traverse( + [&]( const search_rectangle& rect, const node_list& points, void*& D ) + { + /* + * Ensure redundancy for all subsplines by gathering a set of + * interpolation points in an extended rectangular region around + * each quadtree node. + */ + search_rectangle r = rect.InflatedBy( 1.5*Max( rect.Width(), rect.Height() ) ); + node_list N = m_tree.Search( r ); + + /* + * Sort the cloud of interpolation points by proximity to a + * circle centered at the argument of the minimum RBF value + * (approximately 0.61 in normalized coordinates). + */ + if ( N.Length() > size_type( maxSplineLength ) ) + { + point c = rect.Center(); + double d = 0.61 * (Max( r.Width(), r.Height() )/2 + Max( rect.Width(), rect.Height() )/4); + N.Sort( + [&]( const auto& a, const auto& b ) + { + return Abs( a.position.DistanceTo( c ) - d ) < Abs( b.position.DistanceTo( c ) - d ); + } ); + } + + /* + * Get the optimal subset of at most maxSplineLength redundant + * interpolation points for this quadtree node. + */ + point_list P1, P2; + Array PW; + for ( int j = 0, l = Min( int( N.Length() ), maxSplineLength ); j < l; ++j ) + { + P1 << N[j].position; + P2 << N[j].value; + if ( weighted ) + PW << N[j].weight; + } + + subsplineData << SubsplineData( P1, P2, PW, D ); + } ); + + /* + * Generate all subsplines. + */ + StatusMonitor monitor; +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + StandardStatus status; + if ( verbose ) + { + monitor.SetCallback( &status ); + monitor.Initialize( "Building recursive surface subsplines", subsplineData.Length() ); + } +#endif + Array L = Thread::OptimalThreadLoads( subsplineData.Length(), + 1/*overheadLimit*/, + m_parallel ? m_maxProcessors : 1 ); + AbstractImage::ThreadData threadData( monitor, subsplineData.Length() ); + ReferenceArray threads; + for ( int i = 0, n = 0; i < int( L.Length() ); n += int( L[i++] ) ) + threads.Add( new SubsplineGenerationThread( threadData, + subsplineData, + smoothness, + order, + allowExtrapolation, + maxSplineLength, + bucketCapacity, + n, + n + int( L[i] ) ) ); + AbstractImage::RunThreads( threads, threadData ); + threads.Destroy(); + } + } + + /*! + * Deallocates internal structures, yielding an empty object that cannot be + * used before a new call to Initialize(). + */ + void Clear() + { + m_tree.Traverse( + []( const search_rectangle&, node_list&, void*& D ) + { + delete reinterpret_cast( D ); + } ); + m_tree.Clear(); + m_spline.Clear(); + m_rect = search_coordinate( 0 ); + } + + /*! + * Returns true if this object splits the interpolation space recursively + * with subsplines. In such case this object contains a quadtree structure + * that will be searched for suitable point surface splines to interpolate + * function values. + * + * Returns false is this object performs no further recursion. In such case + * this object contains a point surface spline that will be used directly to + * interpolate function values. + */ + bool IsRecursive() const + { + return !m_tree.IsEmpty(); + } + + /*! + * Returns true iff this is a valid, initialized object ready for + * interpolation. + */ + bool IsValid() const + { + return IsRecursive() || m_spline.IsValid(); + } + + /*! + * Returns an interpolated point at the specified \a x, \a y coordinates. + * + * If extrapolation is disabled for this object and the specified + * coordinates fall outside the interpolation region defined upon + * initialization, a point at the origin (that is, with zero coordinates) is + * returned conventionally. Otherwise the nearest subspline will be used to + * extrapolate the returned value. + */ + template + DPoint operator ()( T x, T y ) const + { + if ( m_spline.IsValid() ) + { + if ( m_extrapolate || m_rect.IncludesFast( x, y ) ) + return m_spline( x, y ); + } + else + { + const typename tree::Node* node = m_tree.NodeAt( search_point( x, y ) ); + if ( node == nullptr ) + { + if ( !m_extrapolate ) + return 0.0; + + search_rectangle r0 = m_tree.Root()->rect; + if ( x <= r0.x0 ) + { + if ( y <= r0.y0 ) + node = m_tree.NodeAt( search_point( r0.x0 + SearchDelta, r0.y0 + SearchDelta ) ); + else if ( y >= r0.y1 ) + node = m_tree.NodeAt( search_point( r0.x0 + SearchDelta, r0.y1 - SearchDelta ) ); + else + node = m_tree.NodeAt( search_point( r0.x0 + SearchDelta, search_coordinate( y ) ) ); + } + else if ( x >= r0.x1 ) + { + if ( y <= r0.y0 ) + node = m_tree.NodeAt( search_point( r0.x1 - SearchDelta, r0.y0 + SearchDelta ) ); + else if ( y >= r0.y1 ) + node = m_tree.NodeAt( search_point( r0.x1 - SearchDelta, r0.y1 - SearchDelta ) ); + else + node = m_tree.NodeAt( search_point( r0.x1 - SearchDelta, search_coordinate( y ) ) ); + } + else if ( y <= r0.y0 ) + node = m_tree.NodeAt( search_point( search_coordinate( x ), r0.y0 + SearchDelta ) ); + else // y >= r0.y1 + node = m_tree.NodeAt( search_point( search_coordinate( x ), r0.y1 - SearchDelta ) ); + + if ( node == nullptr ) // ?! + return 0.0; + } + + if ( node->IsLeaf() ) + { + const typename tree::LeafNode* leaf = static_cast( node ); + if ( leaf->data == nullptr ) // ?! + return 0.0; + return reinterpret_cast( leaf->data )->operator()( x, y ); + } + + DPoint p = 0.0; + int n = 0; + if ( node->nw != nullptr ) + { + const typename tree::LeafNode* leaf; + if ( y <= node->nw->rect.y1 ) + leaf = m_tree.LeafNodeAt( search_point( node->nw->rect.x1 - SearchDelta, search_coordinate( y ) ) ); + else if ( x <= node->nw->rect.x1 ) + leaf = m_tree.LeafNodeAt( search_point( search_coordinate( x ), node->nw->rect.y1 - SearchDelta ) ); + else + leaf = m_tree.LeafNodeAt( search_point( node->nw->rect.x1 - SearchDelta, node->nw->rect.y1 - SearchDelta ) ); + + if ( leaf != nullptr ) + { + p += reinterpret_cast( leaf->data )->operator()( x, y ); + ++n; + } + } + if ( node->ne != nullptr ) + { + const typename tree::LeafNode* leaf; + if ( y <= node->ne->rect.y1 ) + leaf = m_tree.LeafNodeAt( search_point( node->ne->rect.x0 + SearchDelta, search_coordinate( y ) ) ); + else if ( x <= node->ne->rect.x0 ) + leaf = m_tree.LeafNodeAt( search_point( node->ne->rect.x0 + SearchDelta, node->ne->rect.y1 - SearchDelta ) ); + else + leaf = m_tree.LeafNodeAt( search_point( search_coordinate( x ), node->ne->rect.y1 - SearchDelta ) ); + + if ( leaf != nullptr ) + { + p += reinterpret_cast( leaf->data )->operator()( x, y ); + ++n; + } + } + if ( node->sw != nullptr ) + { + const typename tree::LeafNode* leaf; + if ( y >= node->sw->rect.y0 ) + leaf = m_tree.LeafNodeAt( search_point( node->sw->rect.x1 - SearchDelta, search_coordinate( y ) ) ); + else if ( x <= node->sw->rect.x1 ) + leaf = m_tree.LeafNodeAt( search_point( search_coordinate( x ), node->sw->rect.y0 + SearchDelta ) ); + else + leaf = m_tree.LeafNodeAt( search_point( node->sw->rect.x1 - SearchDelta, node->sw->rect.y0 + SearchDelta ) ); + + if ( leaf != nullptr ) + { + p += reinterpret_cast( leaf->data )->operator()( x, y ); + ++n; + } + } + if ( node->se != nullptr ) + { + const typename tree::LeafNode* leaf; + if ( y >= node->se->rect.y0 ) + leaf = m_tree.LeafNodeAt( search_point( node->se->rect.x0 + SearchDelta, search_coordinate( y ) ) ); + else if ( x <= node->se->rect.x0 ) + leaf = m_tree.LeafNodeAt( search_point( node->se->rect.x0 + SearchDelta, node->se->rect.y0 + SearchDelta ) ); + else + leaf = m_tree.LeafNodeAt( search_point( search_coordinate( x ), node->se->rect.y0 + SearchDelta ) ); + + if ( leaf != nullptr ) + { + p += reinterpret_cast( leaf->data )->operator()( x, y ); + ++n; + } + } + + if ( n > 0 ) + return p/double( n ); + } + + return 0.0; + } + + /*! + * Returns an interpolated point at the given \a p.x and \a p.y coordinates. + * + * If extrapolation is disabled for this object and the specified point + * lies outside the interpolation region defined upon initialization, a + * point at the origin (that is, with zero coordinates) is returned + * conventionally. Otherwise the nearest subspline will be used to + * extrapolate the returned value. + */ + template + DPoint operator ()( const GenericPoint& p ) const + { + return operator ()( p.x, p.y ); + } + +private: + + /* + * Interpolation data point, QuadTree-compatible. + */ + struct Node + { + typedef typename point::component component; + + point position, value; + float weight; + + Node( const point& p, const point& v ) + : position( p ) + , value( v ) + { + } + + Node( const point& p, const point& v, float w ) + : position( p ) + , value( v ) + , weight( w ) + { + } + + Node( const Node& ) = default; + + component& operator []( int i ) + { + return position[i]; + } + + component operator []( int i ) const + { + return position[i]; + } + }; + + typedef QuadTree tree; + typedef typename tree::point_list node_list; + typedef typename tree::rectangle search_rectangle; + typedef typename tree::coordinate search_coordinate; + typedef GenericPoint search_point; + + tree m_tree; // the tree of subsplines + spline m_spline; // final point spline if there is no further recursion + search_rectangle m_rect = search_coordinate( 0 ); // the interpolation region for this subspline + bool m_extrapolate = __PCL_RSSPLINE_DEFAULT_ALLOW_EXTRAPOLATION; + + static constexpr search_coordinate SearchDelta = + 2 * std::numeric_limits::epsilon(); + + /* + * Parallel subspline generation. + */ + struct SubsplineData + { + point_list P1, P2; + Array PW; + mutable void** nodeData; + + SubsplineData( const point_list& p1, const point_list& p2, const Array& pw, void*& nd ) + : P1( p1 ) + , P2( p2 ) + , PW( pw ) + , nodeData( &nd ) + { + } + }; + + class SubsplineGenerationThread : public Thread + { + public: + + SubsplineGenerationThread( const AbstractImage::ThreadData& data, + const Array& subsplineData, + float smoothness, + int order, + bool allowExtrapolation, + int maxSplineLength, + int bucketCapacity, + int startIndex, int endIndex ) + : m_data( data ) + , m_subsplineData( subsplineData ) + , m_smoothness( smoothness ) + , m_order( order ) + , m_allowExtrapolation( allowExtrapolation ) + , m_maxSplineLength( maxSplineLength ) + , m_bucketCapacity( bucketCapacity ) + , m_startIndex( startIndex ) + , m_endIndex( endIndex ) + { + } + + PCL_HOT_FUNCTION void Run() override + { + INIT_THREAD_MONITOR() + + for ( int i = m_startIndex; i < m_endIndex; ++i ) + { + const SubsplineData& d = m_subsplineData[i]; + AutoPointer s( + new recursive_spline( d.P1, d.P2, m_smoothness, m_order, d.PW, + m_allowExtrapolation, + m_maxSplineLength, + m_bucketCapacity, + false/*verbose*/ ) ); + *reinterpret_cast( d.nodeData ) = s.Release(); + + UPDATE_THREAD_MONITOR( 1 ) + } + + m_success = true; + } + + operator bool() const + { + return m_success; + } + + private: + + const AbstractImage::ThreadData& m_data; + const Array& m_subsplineData; + float m_smoothness; + int m_order; + bool m_allowExtrapolation; + int m_maxSplineLength; + int m_bucketCapacity; + int m_startIndex, m_endIndex; + bool m_success = false; + }; + + friend class DrizzleData; + friend class DrizzleDataDecoder; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_SurfaceSpline_h + +// ---------------------------------------------------------------------------- +// EOF pcl/SurfaceSpline.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/TabBox.h b/3rdparty/include/pcl/TabBox.h new file mode 100644 index 0000000..4ac0098 --- /dev/null +++ b/3rdparty/include/pcl/TabBox.h @@ -0,0 +1,391 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/TabBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_TabBox_h +#define __PCL_TabBox_h + +/// \file pcl/TabBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::TabPosition + * \brief Tab positions in TabBox controls. + * + * + * + * + *
TabPosition::Top Tabs are located at the top side of the TabBox control
TabPosition::Bottom Tabs are located at the bottom side of the TabBox control
+ */ +namespace TabPosition +{ + enum value_type + { + Top, // Tabs are located at the top side of the tab box control + Bottom // Tabs are located at the bottom side of the tab box control + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class TabBox + * \brief Client-side interface to a PixInsight %TabBox control. + * + * ### TODO: Write a detailed description for %TabBox. + */ +class PCL_CLASS TabBox : public Control +{ +public: + + /*! + * Represents a tab position. + */ + typedef TabPosition::value_type tab_position; + + /*! + * Constructs a %TabBox as a child control of \a parent. + */ + TabBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %TabBox control. + */ + virtual ~TabBox() + { + } + + /*! + * Returns the number of page controls in this %TabBox. + */ + int NumberOfPages() const; + + /*! + * Returns the zero-based index of the current page control in this %TabBox, + * or -1 if this %TabBox has no page controls. + */ + int CurrentPageIndex() const; + + /*! + * Selects the current page control by its zero-based \a index. + */ + void SetCurrentPageIndex( int index ); + + /*! + * A synonym for SetCurrentPageIndex( index ) + */ + void SelectPage( int index ) + { + SetCurrentPageIndex( index ); + } + + /*! + * Returns a reference to the current page control in this %TabBox, or + * Control::Null() if this %TabBox has no page controls. + */ + Control& CurrentPageControl() const; + + /*! + * Returns a reference to the page control at the specified zero-based + * \a index in this %TabBox, or Control::Null() if this %TabBox has no page + * controls, or if \a index is not valid. + */ + Control& PageControlByIndex( int index ) const; + + /*! + * Inserts a new page control in this %TabBox. + * + * \param index Zero-based index where the new page control will be + * inserted. If \a index is greater than or equal to the number + * of existing page controls, the new page will be appended to + * the list of existing page controls. If \a index is less than + * zero, the new page will be prepended to the list of existing + * page controls. + * + * \param page The page control to be inserted. + * + * \param label The text that will be shown on the new tab selector. + * + * \param icon The icon that will be shown on the new tab selector. + * + * \sa AddPage(), RemovePage() + */ + void InsertPage( int index, Control& page, const String& label, const Bitmap& icon = Bitmap::Null() ); + + /*! + * Appends a new page control to this %TabBox. + * + * This is a convenience member function, equivalent to + * InsertPage( NumberOfPages(), page, label, icon ) + * + * \a InsertPage, RemovePage() + */ + void AddPage( Control& page, const String& label, const Bitmap& icon = Bitmap::Null() ) + { + InsertPage( NumberOfPages(), page, label, icon ); + } + + /*! + * Removes the page control at the specified zero-based \a index. + * + * This member function does not delete the page control; it simply removes + * it from the list of page controls in this %TabBox. + * + * \sa InsertPage(), AddPage() + */ + void RemovePage( int idx ); + + /*! + * Returns the position of the tab selectors row in this %TabBox. + * + * \sa SetTabPosition() + */ + tab_position TabPosition() const; + + /*! + * Sets the position of the tab selectors row in this %TabBox. + * + * \sa TabPosition() + */ + void SetTabPosition( tab_position pos ); + + /*! + * Returns true iff the page control at the specified \a index is enabled. + * + * \sa EnablePage(), DisablePage() + */ + bool IsPageEnabled( int index ) const; + + /*! + * Enables or disables the page control at the specified \a index. + * + * \sa DisablePage(), IsPageEnabled() + */ + void EnablePage( int index, bool enable = true ); + + /*! + * Disables or enables the page control at the specified \a index. + * + * This is a convenience member function, equivalent to + * EnablePage( index, !disable ) + * + * \sa EnablePage(), IsPageEnabled() + */ + void DisablePage( int index, bool disable = true ) + { + EnablePage( index, !disable ); + } + + /*! # + */ + String PageLabel( int idx ) const; + + /*! # + */ + void SetPageLabel( int idx, const String& ); + + /*! # + */ + void ClearPageLabel( int idx ) + { + SetPageLabel( idx, String() ); + } + + /*! # + */ + Bitmap PageIcon( int idx ) const; + + /*! # + */ + void SetPageIcon( int idx, const Bitmap& ); + + /*! # + */ + void ClearPageIcon( int idx ) + { + SetPageIcon( idx, Bitmap::Null() ); + } + + /*! # + */ + String PageToolTip( int idx ) const; + + /*! # + */ + void SetPageToolTip( int idx, const String& ); + + /*! # + */ + void ClearPageToolTip( int idx ) + { + SetPageToolTip( idx, String() ); + } + + /*! # + */ + Control& LeftControl() const; + + /*! # + */ + Control& RightControl() const; + + /*! # + */ + void SetControls( Control& left, Control& right ); + + /*! # + */ + void SetLeftControl( Control& w ) + { + SetControls( w, RightControl() ); + } + + /*! # + */ + void SetRightControl( Control& w ) + { + SetControls( LeftControl(), w ); + } + + /*! # + */ + void ClearLeftControl() + { + SetLeftControl( Control::Null() ); + } + + /*! # + */ + void ClearRightControl() + { + SetRightControl( Control::Null() ); + } + + /*! # + */ + void ClearControls() + { + SetControls( Control::Null(), Control::Null() ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnPageSelected( TabBox& sender, int pageIndex ); + + /*! + * \defgroup tab_box_event_handlers TabBox Event Handlers + */ + + /*! + * Defines the prototype of a tab box page event handler. + * + * A tab box page event is generated when the user changes the current page + * in a tab box control. + * + * \param sender The control that sends a tab box page event. + * + * \param pageIndex The zero-based index of a tab box page. + * + * \ingroup tab_box_event_handlers + */ + typedef void (Control::*page_event_handler)( TabBox& sender, int pageIndex ); + + /*! + * Sets the tab box page selected event handler for this %TabBox control. + * + * \param handler The tab box page event handler. Must be a member + * function of the receiver object's class. + * + * \param receiver The control that will receive tab box page selected + * events from this %TabBox. + * + * \ingroup tab_box_event_handlers + */ + void OnPageSelected( page_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + page_event_handler onPageSelected = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class TabBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_TabBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/TabBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/TextAlign.h b/3rdparty/include/pcl/TextAlign.h new file mode 100644 index 0000000..2013ead --- /dev/null +++ b/3rdparty/include/pcl/TextAlign.h @@ -0,0 +1,112 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/TextAlign.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_TextAlign_h +#define __PCL_TextAlign_h + +/// \file pcl/TextAlign.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::TextAlign + * \brief Text alignment modes. + * + * + * + * + * + * + * + * + * + * + * + * + *
TextAlign::Unknown Unknown or unsupported alignment
TextAlign::Left Left alignment
TextAlign::Right Right alignment
TextAlign::HorzCenter Centered horizontally
TextAlign::Justify Left and right justified
TextAlign::Top Top alignment
TextAlign::Bottom Bottom alignment
TextAlign::VertCenter Centered vertically
TextAlign::Center Centered horizontally and vertically. Equal to HorzCenter|VertCenter.
TextAlign::Default Default alignment. Equal to Left|Top.
+ */ +namespace TextAlign +{ + enum mask_type + { + Unknown = 0x00, + Left = 0x01, + Right = 0x02, + HorzCenter = 0x04, + Justify = 0x08, + Top = 0x20, + Bottom = 0x40, + VertCenter = 0x80, + Center = HorzCenter|VertCenter, + Default = Left|Top + }; +} + +/*! + * A collection of text alignment mode flags. + */ +typedef Flags TextAlignmentFlags; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_TextAlign_h + +// ---------------------------------------------------------------------------- +// EOF pcl/TextAlign.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/TextBox.h b/3rdparty/include/pcl/TextBox.h new file mode 100644 index 0000000..1557c4c --- /dev/null +++ b/3rdparty/include/pcl/TextBox.h @@ -0,0 +1,316 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/TextBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_TextBox_h +#define __PCL_TextBox_h + +/// \file pcl/TextBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class TextBox + * \brief Client-side interface to a PixInsight %TextBox control. + * + * %TextBox is a multiline, plain text output control. A %TextBox control + * implements the entire text output functionality of a PixInsight console; + * refer to the Console class for full information about console output + * capabilities. + * + * \sa Console, CodeEditor + */ +class PCL_CLASS TextBox : public Frame +{ +public: + + /*! + * Constructs a %TextBox as a child control of \a parent with the specified + * initial \a text. + */ + TextBox( const String& text = String(), Control& parent = Control::Null() ); + + /*! + * Destroys a %TextBox control. + */ + virtual ~TextBox() + { + } + + /*! + * Returns the current text of this %TextBox control. + */ + String Text() const; + + /*! + * Sets the text of this %TextBox control. + */ + void SetText( const String& ); + + /*! + * Returns a string that can be used to write the specified \a text to a + * %TextBox control as plain text, that is without interpreting + * tags or character entities. + */ + template + static S PlainText( const S& text ) + { + return "" + text + ""; + } + + /*! + * Sets the plain text of this %TextBox control. + * + * This member function is equivalent to SetText( PlainText( text ) ). + */ + template + void SetPlainText( const S& text ) + { + SetText( PlainText( text ) ); + } + + /*! + * Clears (removes) the text in this %TextBox control. + */ + void Clear() + { + SetText( String() ); + } + + /*! + * Returns true iff this %TextBox control is in read-only state. + * + * \sa SetReadOnly(), SetReadWrite() + */ + bool IsReadOnly() const; + + /*! + * Enables or disables the read-only state of this %TextBox control. + * + * \sa SetReadWrite(), IsReadOnly() + */ + void SetReadOnly( bool ro = true ); + + /*! + * Disables or enables the read-only state of this %TextBox control. + * + * This is a convenience member function, equivalent to + * SetReadOnly( !rw ) + * + * \sa SetReadOnly(), IsReadOnly() + */ + void SetReadWrite( bool rw = true ) + { + SetReadOnly( !rw ); + } + + /*! + * Selects all the text in this %TextBox control. + * + * \sa Unselect(), GetSelection(), SetSelection() + */ + void SelectAll( bool = true ); + + /*! + * Clears the current text selection in this %TextBox. + * + * This member function does not delete the selected text; it only removes + * the selection. + * + * \sa SelectAll(), GetSelection(), SetSelection() + */ + void Unselect( bool unsel = true ) + { + SelectAll( !unsel ); + } + + /*! + * Gets the current text selection in this %TextBox control. + * + * \param selStart Index of the first selected character. + * \param selEnd Index of the last selected character plus one. + * + * When selStart < selEnd, there is a text selection in this %TextBox. Both + * indexes are zero-based. + * + * \sa SetSelection() + */ + void GetSelection( int& selStart, int& selEnd ) const; + + /*! + * Sets a new text selection in this %TextBox control. + * + * \param selStart Index of the first selected character. + * \param selEnd Index of the last selected character plus one. + * + * When selStart < selEnd, there is a text selection in this %TextBox. Both + * indexes are zero-based. + * + * \sa GetSelection() + */ + void SetSelection( int selStart, int selEnd ); + + /*! + * Returns true iff this %TextBox control has a valid selection. + */ + bool HasSelection() const + { + int s0, s1; + GetSelection( s0, s1 ); + return s0 != s1; + } + + /*! + * Returns the selected text in this %TextBox control, or an empty string if + * there is no selection. + * + * \sa GetSelection(), SetSelection(), SelectAll(), Unselect() + */ + String SelectedText() const; + + /*! # + */ + int CaretPosition() const; + + /*! # + */ + void SetCaretPosition( int ); + + /*! # + */ + void Home() + { + SetCaretPosition( 0 ); + } + + /*! # + */ + void End() + { + SetCaretPosition( int_max ); + } + + /*! # + */ + void Insert( const String& text ); + + /*! # + */ + void Delete(); + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnTextUpdated( TextBox& sender, const String& text ); + // void OnCaretPositionUpdated( TextBox& sender, int oldPos, int newPos ); + // void OnSelectionUpdated( TextBox& sender, int newStart, int newEnd ); + + /*! # + */ + typedef void (Control::*unicode_event_handler)( TextBox& sender, const String& ); + + /*! # + */ + typedef void (Control::*caret_event_handler)( TextBox& sender, int oldPos, int newPos ); + + /*! # + */ + typedef void (Control::*selection_event_handler)( TextBox& sender, int newStart, int newEnd ); + + /*! # + */ + void OnTextUpdated( unicode_event_handler, Control& ); + + /*! # + */ + void OnCaretPositionUpdated( caret_event_handler, Control& ); + + /*! # + */ + void OnSelectionUpdated( selection_event_handler, Control& ); + +private: + + struct EventHandlers + { + unicode_event_handler onTextUpdated = nullptr; + caret_event_handler onCaretPositionUpdated = nullptr; + selection_event_handler onSelectionUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class TextBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_TextBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/TextBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Thread.h b/3rdparty/include/pcl/Thread.h new file mode 100644 index 0000000..f4a3af3 --- /dev/null +++ b/3rdparty/include/pcl/Thread.h @@ -0,0 +1,753 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Thread.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Thread_h +#define __PCL_Thread_h + +/// \file pcl/Thread.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup thread_support Thread Support Classes and Functions + */ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ThreadPriority + * \brief Thread scheduling priorities. + * + * + * + * + * + * + * + * + * + * + * + *
ThreadPriority::Inherit Inherit the caller's thread priority. This is the default value.
ThreadPriority::Idle Schedule when no other threads are busy.
ThreadPriority::Lowest Schedule more often than \e idle priority, but less than \e low priority.
ThreadPriority::Low Schedule more often than \e lowest priority, but less than \e normal priority.
ThreadPriority::Normal Standard thread priority.
ThreadPriority::High Schedule more often than \e normal priority, but less than \e highest priority.
ThreadPriority::Highest Schedule more often than \e high priority, but less than \e time-critical priority.
ThreadPriority::TimeCritical Schedule as often as possible, taking precedence over any other threads.
ThreadPriority::DefaultMax Default maximum priority. This is a platform-dependent, maximum thread priority recommended for processing modules.
+ * + * Note that not all platforms and operating systems handle thread scheduling + * priorities in the same way. In general, modules should use the default + * maximum thread priority by specifying ThreadPriority::DefaultMax instead of + * hard-coded priority values. Time-critical priority should be reserved for + * performance-critical, very brief and fast tasks exclusively, and should only + * be used when it is \e really necessary. This is particularly important on + * Windows platforms. + * + * \ingroup thread_support + */ +namespace ThreadPriority +{ + enum value_type + { + Inherit, // Inherit caller's thread priority. + Idle, // Schedule when no other threads are busy. + Lowest, + Low, + Normal, // Standard thread priority + High, + Highest, + TimeCritical, // Schedule as often as possible, taking precedence over any other threads. +#ifdef __PCL_WINDOWS + DefaultMax = Normal // On Windows, anything above Normal is the same as TimeCritical ... +#else + DefaultMax = Highest +#endif + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Thread + * \brief Client-side interface to a PixInsight thread. + * + * ### TODO: Write a detailed description for %Thread + * + * \ingroup thread_support + */ +class PCL_CLASS Thread : public UIObject +{ +public: + + /*! + * Represents a thread priority. + */ + typedef ThreadPriority::value_type priority; + + /*! + * Constructs a %Thread object. + */ + Thread(); + + /*! + * Destroys a %Thread object. + */ + virtual ~Thread() + { + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since threads are unique objects by nature, calling this member function + * has no effect. + */ + void EnsureUnique() override + { + // Threads are unique objects by definition. + } + + /*! + * Returns a reference to a null %Thread instance. + * + * A null %Thread does not correspond to an existing thread in the core + * PixInsight application. + */ + static Thread& Null(); + + /*! + * Starts thread execution with the specified scheduling \a priority and CPU + * affinity to the specified \a processor. + * + * After calling this member function, the PixInsight core application will + * create a new execution thread from which the Run() virtual member + * function will be invoked for this %Thread instance. + * + * By default, the calling thread's scheduling priority is inherited by + * newly created threads. In general, to maximize performance in a way well + * adapted to the running platform, ThreadPriority::DefaultMax should be + * specified as the value of the \a priority parameter. + * + * By default, threads have no specific CPU affinity. By specifying a valid + * \a processor index, a thread can be scheduled to run on a specific + * logical processor. When the specified \a processor is >= 0, the internal + * thread dispatcher will set the corresponding CPU affinity when this + * thread is executed, just before calling its Run() virtual member + * function. This is usually a more convenient way to control thread + * affinity than the SetAffinity() member function, because it allows + * setting CPU affinity before a thread starts execution. + * + * \note Currently, thread affinity can only be set on Linux and Windows + * platforms. On FreeBSD and Mac OS X, specifying a processor with this + * function has no effect. We hope to overcome this limitation in a future + * version of PCL. + * + * \note Since version 1.8.0 of the PixInsight core application, nested + * parallelism is fully supported. This means that multiple threads can be + * run by calling Thread::Start() from either the root thread or any running + * %Thread object. In versions prior to 1.8.0, a thread could only be run + * from the root thread. + */ + void Start( priority = ThreadPriority::Inherit, int processor = -1 ); + + /*! + * Returns a set of processor indices corresponding to this thread's + * \e CPU \e affinity. + * + * The affinity of a thread defines the set of logical processors on which + * the thread is eligible to run. %Thread affinity allows to improve + * execution speed by restricting each thread to run on a separate + * processor. This prevents the performance cost caused by the cache + * invalidation that occurs when a process ceases to execute on one + * processor and then restarts execution on a different one (e.g. the + * infamous ping-pong effect). + * + * If this thread is not running, this function returns the affinity of the + * calling thread. + * + * \note Currently, this function only works on Linux. On FreeBSD, Mac OS X + * and Windows platforms, this function always returns an empty array. We + * hope to overcome this limitation in a future version of PCL. + */ + Array Affinity() const; + + /*! + * Sets the affinity of this thread to the specified set of \a processors. + * + * Each element on the specified \a processors array is a zero-based index + * corresponding to an existing logical processor. The first processor has + * index zero and the last one has index n-1, where n is the total number of + * logical processors on the host machine. Logical processors include + * physical processors and processor cores, as well as logical processors on + * systems with hyper-threading technology. + * + * Returns true iff the operation was performed correctly. In general, this + * function returns false if this thread is not running, or if the specified + * set contains nonexistent processor indices. It can also return false if + * the calling process does not have the necessary privileges, altough this + * should not happen under normal conditions. + * + * \note The CPU affinity of the calling thread cannot be changed with this + * function. If this thread is not running, this function returns false and + * does nothing. + * + * \note Currently, thread affinity can only be set on Linux and Windows + * platforms. On FreeBSD and Mac OS X, calling this function has no effect. + * We hope to overcome this limitation in a future version of PCL. + */ + bool SetAffinity( const Array& processors ); + + /*! + * Sets the CPU affinity of this thread to the specified \a processor. + * + * The specified \a processor is a zero-based index corresponding to an + * existing logical processor. The first processor has index zero and the + * last one has index n-1, where n is the total number of logical processors + * on the host machine. Logical processors include physical processors and + * processor cores, as well as logical processors on systems with + * hyper-threading technology. + * + * Returns true iff the operation was performed correctly. In general, this + * function returns false if this thread is not running, or if the specified + * processor does not exist. It can also return false if the calling process + * does not have the necessary privileges, altough this should not happen + * under normal conditions. + * + * \note The CPU affinity of the calling thread cannot be changed with this + * function. If this thread is not running, this function returns false and + * does nothing. + * + * \note Currently, thread affinity can only be set on Linux and Windows + * platforms. On FreeBSD and Mac OS X, calling this function has no effect. + * We hope to overcome this limitation in a future version of PCL. + */ + bool SetAffinity( int processor ); + + /*! + * Forces immediate termination of thread execution. + * + * \warning Calling this function is dangerous because it causes the + * immediate termination of a running thread without giving it a chance to + * perform any cleanup. For example, open files will not be closed, locked + * objects will not be unlocked, and shared static variables may be left at + * invalid states, with unpredictable results. + * + * \warning Calling this member function is strongly discouraged - Use it + * at your own risk + */ + void Kill(); // ### Dangerous - Use at your own risk! ### + + /*! + * Returns true iff this thread is running. + */ + bool IsActive() const; + + /*! + * Returns this thread's priority. + */ + priority Priority() const; + + /*! + * Sets this thread's priority. + */ + void SetPriority( priority ); + + /*! + * Resets this thread's priority to the default value, which inherits the + * calling thread's priority. + */ + void ResetPriority() + { + SetPriority( ThreadPriority::Inherit ); + } + + /*! + * Suspends execution of the calling thread until this thread terminates + * execution. If this thread is not running, this function returns + * immediately. + * + * \warning If this thread does not return from its Run() member function, + * for example because this thread hangs or enters an infinite loop, the + * thread that calls this function will remain suspended forever (crashed). + */ + void Wait(); + + /*! + * Suspends execution of the calling thread until one of the following + * conditions is met: + * + * \li This thread terminates execution, or this thread is not running. + * \li The specified time interval \a ms in milliseconds has elapsed. + * + * This member function returns true if this thread has finished execution + * before the specified time \a ms in milliseconds has elapsed. It also + * returns true if this thread is not running. + * + * \note Unlike Wait(), this function cannot crash the calling thread if + * this thread is crashed, unless a huge amount of time is specified as the + * function argument. + */ + bool Wait( unsigned ms ); + + /*! + * Suspends execution of this thread during the specified time interval + * \a ms in milliseconds. + */ + void Sleep( unsigned ms ); + + /* + * Returns a reference to the current thread (the thread from which this + * member function is invoked), or Thread::Null() if the current thread is + * either (a) a thread not being controlled by the PixInsight API, or (b) a + * thread that has been created by another module. + static Thread& CurrentThread(); + */ + + /*! + * This member function returns true if and only if it is called from the + * root thread. The root thread is the thread where the graphical + * user interface is running on the PixInsight core application. + * + * \note Since version 1.8.0 of the PixInsight core application, nested + * parallelism is fully supported. This means that multiple threads can be + * run by calling Thread::Start() from either the root thread or any running + * %Thread object. In versions prior to 1.8.0, a thread could only be run + * from the root thread. + */ + static bool IsRootThread(); + + /*! + * Returns the total number of running %Thread objects. + * + * \note This function knows nothing about threads out of PCL control, so it + * will return zero if no %Thread instance is currently active, even if + * there are other native threads being executed. + */ + static int NumberOfRunningThreads(); + + /*! + * %Thread execution routine. + * + * This member function is invoked by the PixInsight core application upon + * execution start, just after calling the Start() member function. During + * execution of this routine, it is said that this is a running + * thread. + * + * Derived classes must reimplement this member function to provide specific + * thread functionality. + * + * \note There is no problem at all in calling this member function + * directly. This may be useful, for example, if the same code must be + * executed in a single thread (without calling Start()) and as + * multithreaded code. + */ + virtual void Run() + { + // Reimplement this function to provide your thread's functionality. + } + + /*! + * Returns the current status of this thread. The thread status is a 32-bit + * unsigned integer number that can be set for an active thread by calling + * its SetStatus() member function. + * + * %Thread status is primarily intended as an efficient mechanism to send + * custom messages to running threads, for thread synchronization or other + * control purposes. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread. + * + * \note This member function blocks the caller's execution until the thread + * status can be retrieved. Hence, the operation performed by this function + * is expensive in terms of thread synchronization. For a non-blocking + * version of this function see the documentation for TryGetStatus(). + */ + uint32 Status() const; + + /*! + * Attempts to get the current status of this thread without blocking the + * caller's execution. + * + * Returns true iff the thread status could be retrieved and stored in the + * specified \a status variable. + * + * Returns false if the status couldn't be read. In this case the value of + * the \a status variable won't be changed. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread. + * + * \note This is a non-blocking fast version of the Status() member + * function. It should be used when acquiring the thread's status is not + * strictly necessary to continue thread execution. + */ + bool TryGetStatus( uint32& status ) const; + + /*! + * Sets the current status of a running thread. See the documentation of + * Thread::Status() for more information. + * + * \note Calling this function for an inactive thread has no effect. The + * thread status can only be set for a running thread. + * + * \note If the high-order bit of \a status is set, an abort message will be + * sent to the running thread. See the Abort() member function for more + * information. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread, even from other running threads. + */ + void SetStatus( uint32 status ); + + /*! + * Sends an abort message to a running thread. + * + * If the thread calls Module->ProcessEvents() after an abort message has + * been sent, or if it uses some of the standard status monitoring classes + * (such as StandardStatus for example), a ProcessAborted exception will be + * thrown automatically in the thread. The exception will be thrown in the + * (reimplemented) Thread::Run() member function, where it should be caught + * and used to terminate thread execution by returning from Run(). This + * mechanism can be used to synchronize and stop running threads in a + * controlled and thread-safe way. + * + * \note A thread abort message means that the high-order bit of a running + * thread's status has been set. This member function simply sets the thread + * status to 0x80000000. To effectively abort the thread, it should call + * Module->ProcessEvents(), as described above, and should stop its + * execution after catching a ProcessAborted exception. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread, even from other running threads. + */ + void Abort() + { + SetStatus( 0x80000000 ); + } + + /*! + * Returns true iff this thread has been aborted. A thread has been aborted + * if it has received an abort message by a previous call to Abort(), or by + * setting the high-order bit of its thread status word. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread. + * + * \note This function calls Status() to read the current thread's status. + * Consequently, it blocks the caller's execution and has the same + * performance problems. For a non-blocking alternative, see TryIsAborted(). + */ + bool IsAborted() const + { + return (Status() & 0x80000000) != 0; + } + + /*! + * Returns true iff this thread has been aborted, and the current thread's + * status could be retrieved without blocking the caller's execution. + * + * \note This member function is thread-safe. It can be safely called for a + * running thread. + * + * \note This is a non-blocking fast version of the IsAborted() member + * function. It should be used when acquiring the thread's status is not + * strictly necessary to continue thread execution. + */ + bool TryIsAborted() const + { + uint32 status; + return TryGetStatus( status ) && (status & 0x80000000) != 0; + } + + /*! + * Returns the console output text currently accumulated in this thread. + * + * When a %Thread object is running (that is, when its IsActive() member + * function returns true), no operation on the graphical user interface is + * permitted from the thread. This includes console text output. + * + * When a running thread writes text to the console, for example by calling + * Console::Write() or Console::WriteLn(), the text is not sent to the + * console (which in fact would raise an Error exception), but it is instead + * appended to the thread's console output text. The accumulated + * output text can be sent to the console once the thread has finished + * execution, or it can be retrieved by calling this member function. + */ + String ConsoleOutputText() const; + + /*! + * Returns true iff this thread has any accumulated console output text that + * still has not been flushed or cleared. + * + * For information on thread console output, refer to the documentation for + * the ConsoleOutputText() member function. + */ + bool HasConsoleOutputText() const + { + return !ConsoleOutputText().IsEmpty(); + } + + /*! + * Erases the accumulated console output text in this thread. + * + * For information on thread console output, refer to the documentation for + * the ConsoleOutputText() member function. + */ + void ClearConsoleOutputText(); + + /*! + * Sends any accumulated console output text in this thread to the console. + * + * After writing the accumulated text to the console, this member function + * clears it, so that repeated calls to this function will have no effect. + * + * For information on thread console output, refer to the documentation for + * the ConsoleOutputText() member function. + * + * \note This member function must only be called from the root thread. + * Calling it from a running %Thread object has no effect. + */ + void FlushConsoleOutputText(); + + /*! + * Returns the maximum number of threads that can be used concurrently to + * process a set of items. + * + * \param count Number of processing units. A processing unit can + * be a single pixel, a row of pixels, or any suitable item, + * according to the task being performed by the caller. + * + * \param overheadLimit %Thread overhead limit in processing units. The + * function returns a maximum number of threads such that no + * thread would have to process less processing units than this + * value. The default overhead limit is one processing unit. + * + * This function takes into account the number of existing processors in + * the system, as well as the maximum number of processors currently allowed + * for external processes by the core application, and the number of threads + * currently active. The following global variables are taken into account + * (see the PixInsightSettings class for more information about global + * variables on the PixInsight platform): + * + * + * + * + * + * + * + * + * + * + *
Process/EnableParallelProcessingIf this global flag is false, it means that parallel processing + * has been globally disabled for the entire platform, so this function + * will always return one, irrespective of the number of existing + * processors.
Process/EnableParallelModuleProcessingIf this global flag is false, it means that parallel processing + * has been disabled for all installed modules, so this function will + * always return one, as in the previous case.
Process/MaxProcessorsThis global integer variable is the maximum number of processors + * allowed for installed modules, which is always less than or equal to + * the number of existing processors in the system. This function will + * never return a number of threads greater than the value of this + * variable.
+ * + * The number of processors term refers to the number of existing + * logical processors in the system. These include all physical + * processors in multiprocessor systems, as well as all existing processor + * cores in multicore processors, and virtual processors in systems with + * HyperThreading or equivalent technology. + * + * Since version 1.8.0 of the PixInsight core application, nested + * parallelism is fully supported. This means that multiple threads can be + * executed concurrently from a running thread. This function will take into + * account the number of already running threads, as provided by the + * Thread::NumberOfRunningThreads() static member function, to help prevent + * exceeding the maximum number of threads allowed by the platform (see the + * global variables in the table above). In any event, the calling module is + * entirely responsible to comply with these restrictions. + * + * \note A module must never try to run more threads concurrently than the + * amount returned by this function. Failure to follow this rule will + * invalidate a module for certification. + */ + static int NumberOfThreads( size_type count, size_type overheadLimit = 1u ); + + /*! + * Returns a list of per-thread counts optimized for parallel processing of + * a set of items. + * + * \param count Number of processing units. A processing unit can + * be a single pixel, a row of pixels, or any suitable item, + * according to the task being performed by the caller. + * + * \param overheadLimit %Thread overhead limit in processing units. The + * function returns a list with a maximum length such that no + * thread would have to process less processing units than this + * value. The default overhead limit is one processing unit. + * + * \param maxThreads Maximum number of threads to use. The length of the + * returned list will be at most either this value, or the + * maximum number of threads currently allowed for the calling + * process, whichever is less. The default value of this + * parameter does not impose a practical limit. + * + * This function takes into account the number of existing logical + * processors in the system, as well as the maximum number of processors + * currently allowed for external processes by the PixInsight core + * application, and the number of threads currently active. See the + * NumberOfThreads() static member function for more information on thread + * execution and the global settings governing their use in PixInsight. + * + * This function returns a dynamic array of unsigned integers, where each + * element is the number of items that the corresponding thread should + * process in order to make an optimal usage of the processor resources + * currently available. The length of the returned array is the maximum + * number of threads that the calling process should execute concurrently to + * process the specified number of items, with the specified overhead limit + * and maximum number of processors. + * + * In the current implementation of this function, the returned array tends + * to spread the total work load uniformly across the threads available. + * Future implementations may consider additional factors, including the + * possibility of using new global settings specific for thread execution + * optimization. For this reason, under normal conditions a module should + * always use the result of calling this function to define a thread + * execution schedule. See also OptimalThreadLoadsAligned() for a variant of + * this function with prescribed item alignment. + * + * \note A module must never try to run more threads concurrently than the + * length of the array returned by this function. Failure to follow this + * rule will invalidate a module for certification. + * + * \sa OptimalThreadLoadsAligned() + */ + static Array OptimalThreadLoads( size_type count, + size_type overheadLimit = 1u, + int maxThreads = PCL_MAX_PROCESSORS ); + + /*! + * Returns a list of per-thread counts optimized for parallel processing of + * a contiguous set of items stored with a prescribed alignment. + * + * \param count Number of processing units. A processing unit can + * be a single pixel, a row of pixels, or any suitable item, + * according to the task being performed by the caller. For + * optimal performance, the size in bytes of a processing unit + * should be even, assuming that the task will be applied to a + * contiguous list of \a count items. + * + * \param align Item alignment. The function will return a list of counts, + * where all counts but the last one are guaranteed to be + * integer multiples of this parameter. The default value is 16. + * + * \param overheadLimit %Thread overhead limit in processing units. The + * function returns a list with a maximum length such that no + * thread would have to process less processing units than this + * value. The default overhead limit is one processing unit. + * + * \param maxThreads Maximum number of threads to use. The length of the + * returned list will be at most either this value, or the + * maximum number of threads currently allowed for the calling + * process (whichever is less), or maybe a smaller length, if + * necessary to enforce the specified alignment. The default + * value of this parameter does not impose a practical limit. + * + * Other than the prescribed alignment, this function is equivalent to its + * unaligned counterpart OptimalThreadLoads(). + * + * \sa OptimalThreadLoads() + */ + static Array OptimalThreadLoadsAligned( size_type count, + int align = 16, + size_type overheadLimit = 1u, + int maxThreads = PCL_MAX_PROCESSORS ); +private: + + int m_processorIndex = -1; + + Thread( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + +protected: + + virtual bool IsStealth() const + { + return false; + } + + friend class ThreadDispatcher; +}; + +// ---------------------------------------------------------------------------- + +/*! + * Suspends the calling thread from execution until the specified time \a ms in + * milliseconds has elapsed, or until a signal is delivered to the calling + * thread that terminates the process or causes activation of a signal-catching + * routine. + * \ingroup thread_support + */ +void PCL_FUNC Sleep( unsigned ms ); + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Thread_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Thread.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ThresholdedTransformation.h b/3rdparty/include/pcl/ThresholdedTransformation.h new file mode 100644 index 0000000..406300f --- /dev/null +++ b/3rdparty/include/pcl/ThresholdedTransformation.h @@ -0,0 +1,170 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ThresholdedTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ThresholdedTransformation_h +#define __PCL_ThresholdedTransformation_h + +/// \file pcl/ThresholdedTransformation.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ThresholdedTransformation + * \brief Thresholded image transformation. + * + * %ThresholdedTransformation represents a thresholded image + * transformation in PCL. A thresholded transformation modifies its effect + * when applied to pixels within a given range of pixel sample values. + * + * Instead of defining a fixed range of sample values, a thresholded + * transformation defines two \e threshold values in PCL. These thresholds are + * normalized \e distances measured from a \e floating reference value that can + * be specified on a per-pixel basis. + * + * In PCL, convolutions in the spatial domain and morphological transformations + * have been implemented as thresholded transformations. + */ +class PCL_CLASS ThresholdedTransformation : public virtual ImageTransformation +{ +public: + + /*! + * Constructs a %ThresholdedTransformation object with the specified \a low + * and \a high threshold values in the normalized real range [0,1]. + */ + ThresholdedTransformation( double low = 0, double high = 0 ) + : m_lowThreshold( low ) + , m_highThreshold( high ) + { + } + + /*! + * Copy constructor. + */ + ThresholdedTransformation( const ThresholdedTransformation& ) = default; + + /*! + * Destroys a %ThresholdedTransformation object. + */ + virtual ~ThresholdedTransformation() + { + } + + /*! + * Returns true iff this transformation is currently thresholded. + * + * The transformation is thresholded when either threshold (low or high) is + * nonzero. When both thresholds are zero, the transformation applies no + * thresholding at all. + */ + bool IsThresholded() const + { + return 1 + m_lowThreshold != 1 || 1 + m_highThreshold != 1; + } + + /*! + * Returns the current low threshold in the normalized real range. + */ + double LowThreshold() const + { + return m_lowThreshold; + } + + /*! + * Sets the low threshold to the specified sample value \a t in the + * normalized real range. + */ + void SetLowThreshold( double t ) + { + m_lowThreshold = t; + } + + /*! + * Returns the current high threshold in the normalized real range. + */ + double HighThreshold() const + { + return m_highThreshold; + } + + /*! + * Sets the high threshold to the specified sample value \a t in the + * normalized real range. + */ + void SetHighThreshold( double t ) + { + m_highThreshold = t; + } + +private: + + /* + * Normalized threshold values. + */ + double m_lowThreshold = 0; + double m_highThreshold = 0; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ThresholdedTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ThresholdedTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/TimePoint.h b/3rdparty/include/pcl/TimePoint.h new file mode 100644 index 0000000..e2f1fa9 --- /dev/null +++ b/3rdparty/include/pcl/TimePoint.h @@ -0,0 +1,1210 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/TimePoint.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_TimePoint_h +#define __PCL_TimePoint_h + +/// \file pcl/TimePoint.h + +#include + +#include +#include + +/* + * N.B.: Remove potentially conflicting names that may be defined by 3rd-party + * packages used by some standard modules. + */ +#ifdef J2000 +# undef J2000 +#endif +#ifdef J2100 +# undef J2100 +#endif +#ifdef B1950 +# undef B1950 +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup time_representation Time Representation and Utilities + */ + +// ---------------------------------------------------------------------------- + +struct FileTime; + +/*! + * \class TimePoint + * \brief An instant in any timescale + * + * %TimePoint represents an instant, an infinitesimal point in time, in any + * timescale. The internal representation of time consists of the separate + * integer and fractional components of a Julian date. This guarantees a + * numerical resolution better than one nanosecond, as well as fast time + * relational and arithmetic operations. + * + * \ingroup time_representation + * \sa ISO8601ConversionOptions, IsoString::ParseISO8601DateTime() + */ +class PCL_CLASS TimePoint +{ +public: + + /*! + * Default constructor. Yields an invalid %TimePoint object that cannot be + * used until properly initialized. + */ + TimePoint() = default; + + /*! + * Constructs a %TimePoint object for a given instant represented as a + * Julian date. + */ + TimePoint( double jd ) + : m_jdi( TruncInt( jd ) ) + , m_jdf( Frac( jd ) ) + { + } + + /*! + * Constructs a %TimePoint object from two separate Julian date components, + * \a jd1 and \a jd2, where the resulting JD is jd1 + jd2. + * + * Specifying a JD in two parts greatly improves the accuracy of time + * representation, by increasing the effective bit length used to store time + * points. To maximize time resolution and calculation efficiency, + * %TimePoint normalizes its internal representation as the separate integer + * and fractional components of a JD. This guarantees a numerical resolution + * better than one nanosecond. + */ + TimePoint( double jd1, double jd2 ) + : m_jdi( TruncInt( jd1 ) + TruncInt( jd2 ) ) + , m_jdf( Frac( jd1 ) + Frac( jd2 ) ) + { + Normalize(); + } + + /*! + * Constructs a %TimePoint object from separate date components. + */ + TimePoint( int year, int month, double days ) + { + CalendarTimeToJD( m_jdi, m_jdf, year, month, TruncInt( days ), Frac( days ) ); + } + + /*! + * Constructs a %TimePoint object from separate date components plus a day + * fraction. + */ + TimePoint( int year, int month, int day, double dayFraction ) + { + CalendarTimeToJD( m_jdi, m_jdf, year, month, day, dayFraction ); + } + + /*! + * Constructs a %TimePoint object from separate date and time components. + */ + TimePoint( int year, int month, int day, int hour, int minute, double seconds ) + { + CalendarTimeToJD( m_jdi, m_jdf, year, month, day, (hour + (minute + seconds/60)/60)/24 ); + } + + /*! + * Constructs a %TimePoint object from an ISO 8601 extended date/time + * representation specified as an 8-bit ISO/IEC-8859-1 string. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point represented by this object. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale. + */ + TimePoint( const IsoString& dateTime ) + { + int year, month, day; + double dayf, tz; + dateTime.ParseISO8601DateTime( year, month, day, dayf, tz ); + CalendarTimeToJD( m_jdi, m_jdf, year, month, day, dayf - tz/24 ); + } + + /*! + * Constructs a %TimePoint object from an ISO 8601 extended date/time + * representation specified as a UTF-16 string. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point represented by this object. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale. + */ + TimePoint( const String& dateTime ) + { + int year, month, day; + double dayf, tz; + dateTime.ParseISO8601DateTime( year, month, day, dayf, tz ); + CalendarTimeToJD( m_jdi, m_jdf, year, month, day, dayf - tz/24 ); + } + + /*! + * Constructs a %TimePoint object from a time_t value. The specified \a time + * value will be interpreted as UTC. + */ + TimePoint( time_t time ); + + /*! + * Constructs a %TimePoint object from a FileTime object. + * + * \param fileTime Reference to a FileTime structure, from which date and + * time elements will be obtained to construct a + * %TimePoint object. The file time is expected to be + * represented as UTC, which is coherent with most file + * systems. + */ + TimePoint( const FileTime& fileTime ); + + /*! + * Copy constructor. + */ + TimePoint( const TimePoint& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + TimePoint& operator =( const TimePoint& ) = default; + + /*! + * Returns true iff this is a valid %TimePoint instance. An invalid + * %TimePoint does not represent a valid time point, generates empy string + * representations, and cannot be used until properly initialized. + */ + constexpr bool IsValid() const + { + return ((m_jdi > 0) ? m_jdi : -m_jdi) < 2147438065; + } + + /*! + * Extracts the individual date components. + * + * \param[out] year Reference to a variable that will receive the year + * component of this time point. + * + * \param[out] month Reference to a variable that will receive the month + * component of this time point, in the range [1,12]. + * + * \param[out] day Reference to a variable that will receive the day + * component of this time point, in the range [1,31]. + */ + void GetCalendarTime( int& year, int& month, int& day ) const + { + double dum; + JDToCalendarTime( year, month, day, dum, m_jdi, m_jdf ); + } + + /*! + * Extracts the individual date and day fraction components. + * + * \param[out] year Reference to a variable that will receive the year + * component of this time point. + * + * \param[out] month Reference to a variable that will receive the month + * component of this time point, in the range [1,12]. + * + * \param[out] day Reference to a variable that will receive the day + * component of this time point, in the range [1,31]. + * + * \param[out] dayf Reference to a variable that will receive the day + * fraction component of this time point, in the range + * [0,1). + */ + void GetCalendarTime( int& year, int& month, int& day, double& dayf ) const + { + JDToCalendarTime( year, month, day, dayf, m_jdi, m_jdf ); + } + + /*! + * Extracts the individual date and time components. + * + * \param[out] year Reference to a variable that will receive the year + * component of this time point. + * + * \param[out] month Reference to a variable that will receive the month + * component of this time point, in the range [1,12]. + * + * \param[out] day Reference to a variable that will receive the day + * component of this time point, in the range [1,31]. + * + * \param[out] hour Reference to a variable that will receive the hour + * component of this time point, in the range [0,23]. + * + * \param[out] minute Reference to a variable that will receive the minute + * component of this time point, in the range [0,59]. + * + * \param[out] seconds Reference to a variable that will receive the + * seconds component of this time point, in the range + * [0,60). + */ + void GetCalendarTime( int& year, int& month, int& day, int& hour, int& minute, double& seconds ) const + { + double dayf; + JDToCalendarTime( year, month, day, dayf, m_jdi, m_jdf ); + double h = Frac( dayf )*24; + double m = Frac( h )*60; + seconds = Frac( m )*60; + minute = TruncInt( m ); + hour = TruncInt( h ); + } + + /*! + * Returns the year component of this time point. + */ + int Year() const + { + int year, foo; double bar; + JDToCalendarTime( year, foo, foo, bar, m_jdi, m_jdf ); + return year; + } + + /*! + * Returns the month component of this time point in the range [1,12]. + */ + int Month() const + { + int foo, month; double bar; + JDToCalendarTime( foo, month, foo, bar, m_jdi, m_jdf ); + return month; + } + + /*! + * Returns the day component of this time point in the range [1,31]. + */ + int Day() const + { + int foo, day; double bar; + JDToCalendarTime( foo, foo, day, bar, m_jdi, m_jdf ); + return day; + } + + /*! + * Returns the day fraction component of this time point in the range [0,1). + */ + double DayFraction() const + { + int foobar; double dayf; + JDToCalendarTime( foobar, foobar, foobar, dayf, m_jdi, m_jdf ); + return dayf; + } + + /*! + * Returns an ISO 8601 extended date/time representation of this time point + * as a UTF-16 string. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 extended format. + * + * \param tz Time zone offset in hours. The default value is zero. + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + * + * \sa ISO8601ConversionOptions, String::ParseISO8601DateTime(), IsValid() + */ + String ToString( const ISO8601ConversionOptions& options = ISO8601ConversionOptions(), double tz = 0 ) const + { + return ToString( options, tz, (String*)0 ); + } + + /*! + * Returns an ISO 8601 extended date/time representation of this time point + * as a UTF-16 string. + * + * \param timeItems Number of represented time items. Can be 0, 1, 2 or 3. + * All items but the last one are represented as integer + * values. The last item is represented as a floating + * point value with the specified \a precision. + * + * \param precision Number of decimal digits for the last represented time + * item. The default value is three decimal digits. + * + * \param tz Time zone offset in hours. The default value is zero. + * + * \param timeZone Whether to append a time zone specifier to the ISO 8601 + * representation. The default value is true. + * + * \param zuluTime Whether to append the 'Z' special time zone specifier + * for UTC time without offset, or the '+00:00' specifier + * otherwise. The default value is true. + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + * + * \sa ISO8601ConversionOptions, String::ParseISO8601DateTime(), IsValid() + */ + String ToString( unsigned timeItems, unsigned precision = 3, double tz = 0, bool timeZone = true, bool zuluTime = true ) const + { + return ToString( ISO8601ConversionOptions( timeItems, precision, timeZone, zuluTime ), tz ); + } + + /*! + * Returns an ISO 8601 extended date/time representation of this time point + * as an 8-bit ISO/IEC-8859-1 string. + * + * \param options Optional settings to control the representation of date + * and time in ISO 8601 extended format. + * + * \param tz Time zone offset in hours. The default value is zero. + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + * + * \sa ISO8601ConversionOptions, IsoString::ParseISO8601DateTime(), IsValid() + */ + IsoString ToIsoString( const ISO8601ConversionOptions& options = ISO8601ConversionOptions(), double tz = 0 ) const + { + return ToString( options, tz, (IsoString*)0 ); + } + + /*! + * Returns an ISO 8601 extended date/time representation of this time point + * as an 8-bit ISO/IEC-8859-1 string. + * + * \param timeItems Number of represented time items. Can be 0, 1, 2 or 3. + * All items but the last one are represented as integer + * values. The last item is represented as a floating + * point value with the specified \a precision. + * + * \param precision Number of decimal digits for the last represented time + * item. The default value is three decimal digits. + * + * \param tz Time zone offset in hours. The default value is zero. + * + * \param timeZone Whether to append a time zone specifier to the ISO 8601 + * representation. The default value is true. + * + * \param zuluTime Whether to append the 'Z' special time zone specifier + * for UTC time without offset, or the '+00:00' specifier + * otherwise. The default value is true. + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + * + * \sa ISO8601ConversionOptions, IsoString::ParseISO8601DateTime(), IsValid() + */ + IsoString ToIsoString( unsigned timeItems, unsigned precision = 3, double tz = 0, bool timeZone = true, bool zuluTime = true ) const + { + return ToIsoString( ISO8601ConversionOptions( timeItems, precision, timeZone, zuluTime ), tz ); + } + + /*! + * Returns a custom representation of this time point as a UTF-16 string. + * + * \param format A date and time format string. The following format + * tokens will be replaced with formatted date and time + * items, as described in the following table:\n + * \n + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
\%YThe four-digit year.
\%MZero padded, two-digit month number, '01' through '12'.
\%nThe month number, '1' through '12'.
\%NThe English month name, 'January' through 'December'.
\%DZero padded, two-digit day of month, '01' through '31'.
\%dThe day of the month, '1' through '31'.
\%hZero padded, two digits of hour, '00' through '23'.
\%mZero padded, two digits of minute, '00' through '59'.
\%sZero padded, two digits of the seconds truncated to an integer, + * '00' through '59'.
\%s<p>Zero padded representation of seconds rounded or truncated to + * <p> decimal digits, with <p> in [0,9]. Truncation + * instead of rounding will we used if the rounded value is equal to + * 60 seconds.
\n + * Other characters in the format string will be included literally in + * the result. To include a percent sign '\%', escape it by preceding it + * with a backslash: "\\%". To include a backslash character, it must + * also be escaped as two consecutive slashes: "\\\\". + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + * + * Example: + * + * \code + * TimePoint t = TimePoint::Now(); + * std::cout << t.ToString( "%Y-%M-%D %h:%m:%s" ) << '\n' + * << t.ToString( "%Y-%M-%D %h:%m:%s2" ) << '\n' + * << t.ToString( "Today is: %N %d, %Y %h:%m:%s" ) << '\n'; + * \endcode + */ + String ToString( const String& format ) const; + + /*! + * Returns a custom representation of this time point as an 8-bit + * ISO/IEC-8859-1 string. + * + * See ToString( const String& ) for detailed information on the format + * string argument. + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), this function returns an empty string. + */ + IsoString ToIsoString( const IsoString& format ) const; + + IsoString ToIsoString( const char* format ) const + { + return ToIsoString( IsoString( format ) ); + } + + /*! + * String conversion operator. Equivalent to ToString(). + */ + explicit operator String() const + { + return ToString(); + } + + /*! + * IsoString conversion operator. Equivalent to ToIsoString(). + */ + explicit operator IsoString() const + { + return ToIsoString(); + } + + /*! + * Returns the integer part of the Julian date (also referred to as + * Julian day number) corresponding to this time point. + */ + constexpr int JDI() const + { + return m_jdi; + } + + /*! + * Returns the fractional part of the Julian date corresponding to this time + * point. + */ + constexpr double JDF() const + { + return m_jdf; + } + + /*! + * Returns the Julian date corresponding to this time point. + * + * The time point representation returned by this member function only has + * millisecond resolution. For higher resolution time point representations + * up to one nanosecond, use the separate integer and fractional components + * given by JDI() and JDF(). + * + * If this is an invalid %TimePoint (for example, a default constructed + * instance), the value returned by this function is meaningless as a Julian + * date. + */ + constexpr double JD() const + { + return m_jdi + m_jdf; + } + + /*! + * Returns the modified Julian date (MJD) corresponding to this time point. + * + * This function returns JD() - 2400000.5. Refer to the JD() member function + * for more information. + */ + constexpr double MJD() const + { + return (m_jdi-2400000) + (m_jdf-0.5); + } + + /*! + * Returns the value of Delta T, or the difference TT-UT1, corresponding to + * this time point. + * + * If possible, this member function returns an interpolated value from the + * global Delta T database, which will be loaded and parsed upon the first + * call to this function as a thread-safe procedure. See + * EphemerisFile::DeltaTDataFilePath() and + * EphemerisFile::OverrideDeltaTDataFilePath() for more information. + * + * Otherwise, if this time point falls outside the Delta T database time + * span, this function will use the polynomial expressions for Delta T + * included in Five Millennium Canon of Solar Eclipses, by Fred + * Espenak and Jean Meeus (NASA/TP–2006–214141, Revision 1.0, 2007). + * + * The returned value is the difference TT-UT1 in seconds. + */ + double DeltaT() const; + + /*! + * Returns the value of Delta AT, or the difference TAI-UTC, corresponding + * to this time point, which is assumed to represent an instant in the UTC + * timescale. + * + * If possible, this member function returns an interpolated value from the + * global Delta AT database, which will be loaded and parsed upon the first + * call to this function as a thread-safe procedure. See + * EphemerisFile::DeltaATDataFilePath() and + * EphemerisFile::OverrideDeltaATDataFilePath() for more information. + * + * UTC does not exist before 1960, so calling this function for a TimePoint + * before that year is a conceptual error. For convenience, zero is returned + * in such case instead of throwing an exception. + * + * The returned value is the difference TAI-UTC in seconds. + */ + double DeltaAT() const; + + /*! + * Adds the specified number of \a days to this time point. Returns a + * reference to this object. + */ + TimePoint& operator +=( double days ) + { + m_jdf += days; + Normalize(); + return *this; + } + + /*! + * Subtracts the specified number of \a days from this time point. Returns a + * reference to this object. + */ + TimePoint& operator -=( double days ) + { + m_jdf -= days; + Normalize(); + return *this; + } + + /*! + * Returns the time interval in days elapsed since the specified time point + * \a t. + */ + constexpr double DaysSince( const TimePoint& t ) const + { + return m_jdi-t.m_jdi + m_jdf-t.m_jdf; + } + + /*! + * Returns the time interval in Julian years (365.25 days) elapsed since the + * specified time point \a t. + */ + constexpr double YearsSince( const TimePoint& t ) const + { + return DaysSince( t )/365.25; + } + + /*! + * Returns the time interval in Julian centuries (36525 days) elapsed since + * the specified time point \a t. + */ + constexpr double CenturiesSince( const TimePoint& t ) const + { + return DaysSince( t )/36525; + } + + /*! + * Returns the time interval in seconds elapsed since the specified time + * point \a t. + */ + constexpr double SecondsSince( const TimePoint& t ) const + { + return DaysSince( t )*86400; + } + + /*! + * Returns the time interval in days elapsed since the standard J2000 epoch + * (JD 2451545.0 = 2000 January 1.5). + */ + constexpr double DaysSinceJ2000() const + { + return m_jdi-2451545 + m_jdf; + } + + /*! + * Returns the time interval in Julian years (365.25 days) elapsed since the + * standard J2000 epoch (JD 2451545.0 = 2000 January 1.5). + */ + constexpr double YearsSinceJ2000() const + { + return DaysSinceJ2000()/365.25; + } + + /*! + * Returns the time interval in Julian centuries (36525 days) elapsed since + * the standard J2000 epoch (JD 2451545.0 = 2000 January 1.5). + */ + constexpr double CenturiesSinceJ2000() const + { + return DaysSinceJ2000()/36525; + } + + /*! + * Returns the time interval in seconds elapsed since the standard J2000 + * epoch (JD 2451545.0 = 2000 January 1.5). + */ + constexpr double SecondsSinceJ2000() const + { + return DaysSinceJ2000()*86400; + } + + /*! + * Returns the time interval in days elapsed since the standard UNIX epoch + * (JD 2440587.5 = 1970 January 1.0). + */ + constexpr double DaysSinceUNIXEpoch() const + { + return m_jdi-2440587 + m_jdf-0.5; + } + + /*! + * Returns the time interval in Julian years (365.25 days) elapsed since the + * standard UNIX epoch (JD 2440587.5 = 1970 January 1.0). + */ + constexpr double YearsSinceUNIXEpoch() const + { + return DaysSinceUNIXEpoch()/365.25; + } + + /*! + * Returns the time interval in Julian centuries (36525 days) elapsed since + * the standard UNIX epoch (JD 2440587.5 = 1970 January 1.0). + */ + constexpr double CenturiesSinceUNIXEpoch() const + { + return DaysSinceUNIXEpoch()/36525; + } + + /*! + * Returns the time interval in seconds elapsed since the standard UNIX + * epoch (JD 2440587.5 = 1970 January 1.0). + */ + constexpr double SecondsSinceUNIXEpoch() const + { + return DaysSinceUNIXEpoch()*86400; + } + + /*! + * Returns the time interval in milliseconds elapsed since the standard UNIX + * epoch (JD 2440587.5 = 1970 January 1.0). + */ + constexpr double MillisecondsSinceUNIXEpoch() const + { + return DaysSinceUNIXEpoch()*86400000; + } + + /*! + * Returns the UTC offset for this time point on the host machine, or the + * difference Local Standard Time (LST) minus Universal Coordinated Time + * (UTC), in hours, at the date represented by this object. This + * function takes into account daylight saving time when applicable. + */ + double SystemOffsetFromUTC() const; + + /*! + * Returns this time point represented as Local Standard Time (LST), + * assuming that this object represents a time point in the UTC timescale. + */ + TimePoint UTCToLocalTime() const + { + return TimePoint( m_jdi, m_jdf + SystemOffsetFromUTC()/24 ); + } + + /*! + * Returns this time point represented as UTC, assuming that this object + * represents a time point in Local Standard Time (LST). + */ + TimePoint LocalTimeToUTC() const + { + return TimePoint( m_jdi, m_jdf - SystemOffsetFromUTC()/24 ); + } + + /*! + * Returns a %TimePoint object corresponding to the current date and time in + * the UTC timescale. + */ + static TimePoint Now(); + + /*! + * Returns a %TimePoint object corresponding to the standard J2000 epoch, + * namely JD 2451545.0, corresponding to the midday of 2000 January 1. + */ + static TimePoint J2000() + { + TimePoint t; + t.m_jdi = 2451545; + t.m_jdf = 0; + return t; + } + + /*! + * Returns a %TimePoint object corresponding to the standard J2100 epoch, + * namely JD 2488070.0, corresponding to the midday of 2100 January 1. + */ + static TimePoint J2100() + { + TimePoint t; + t.m_jdi = 2488070; + t.m_jdf = 0; + return t; + } + + /*! + * Returns a %TimePoint object corresponding to the B1950.0 epoch, namely + * JD 2433282.42345905, corresponding to 1949 December 31.92345905. + */ + static TimePoint B1950() + { + TimePoint t; + t.m_jdi = 2433282; + t.m_jdf = 0.42345905; + return t; + } + + /*! + * Returns a %TimePoint object corresponding to the standard UNIX epoch, + * namely JD 2440587.5, corresponding to 1970 January 1.0. + */ + static TimePoint UNIXEpoch() + { + TimePoint t; + t.m_jdi = 2440587; + t.m_jdf = 0.5; + return t; + } + + /*! + * Returns a %TimePoint object constructed from an ISO 8601 extended + * date/time representation specified as an 8-bit ISO/IEC-8859-1 string. If + * successful, stores the evaluated time zone offset, in hours, in the + * specified variable \a tz. Otherwise this function throws the appropriate + * Error exception. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point constructed by this function. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale without offset. + * + * \sa TryFromString( TimePoint&, double&, const IsoString& ), + * IsoString::ParseISO8601DateTime() + */ + static TimePoint FromString( double& tz, const IsoString& dateTime ) + { + int year, month, day; + double dayf; + dateTime.ParseISO8601DateTime( year, month, day, dayf, tz ); + return TimePoint( year, month, day, dayf - tz/24 ); + } + + /*! + * Returns a %TimePoint object constructed from an ISO 8601 extended + * date/time representation specified as a UTF-16 string. If successful, + * stores the evaluated time zone offset, in hours, in the specified + * variable \a tz. Otherwise this function throws the appropriate Error + * exception. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point constructed by this function. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale without offset. + * + * \sa TryFromString( TimePoint&, double&, const String& ), + * String::ParseISO8601DateTime() + */ + static TimePoint FromString( double& tz, const String& dateTime ) + { + int year, month, day; + double dayf; + dateTime.ParseISO8601DateTime( year, month, day, dayf, tz ); + return TimePoint( year, month, day, dayf - tz/24 ); + } + + /*! + * Returns a %TimePoint object constructed from an ISO 8601 extended + * date/time representation specified as an 8-bit ISO/IEC-8859-1 string. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point constructed by this function. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale without offset. + * + * \sa TryFromString( TimePoint&, const IsoString& ), + * IsoString::ParseISO8601DateTime() + */ + static TimePoint FromString( const IsoString& dateTime ) + { + return TimePoint( dateTime ); + } + + /*! + * Returns a %TimePoint object constructed from an ISO 8601 extended + * date/time representation specified as a UTF-16 string. + * + * If the source representation specifies a nonzero time zone, it will be + * subtracted from the time point constructed by this function. In other + * words, the newly constructed object will always transport a time point in + * the UTC timescale without offset. + * + * \sa TryFromString( TimePoint&, const String& ), + * String::ParseISO8601DateTime() + */ + static TimePoint FromString( const String& dateTime ) + { + return TimePoint( dateTime ); + } + + /*! + * Attempts to evaluate the specified 8-bit string as a date and time + * specification in ISO 8601 extended format. If successful, stores the + * evaluated UTC time point in the specified variable \a t, and the + * evaluated time zone offset, in hours, in the variable \a tz, then returns + * \c true. + * + * If the specified string cannot be evaluated as a valid date and time in + * ISO 8601 extended format, this function returns \c false and does not + * change the passed variables \a t and \a tz. This function does not throw + * any parsing exceptions. + * + * If the source string contains a time zone offset, it is subtracted from + * the evaluated time point. In other words, the %TimePoint value stored in + * \a t is always represented in the UTC timescale without any offset. + * + * \sa FromString( const IsoString& ), IsoString::TryParseISO8601DateTime() + */ + static bool TryFromString( TimePoint& t, double& tz, const IsoString& dateTime ) + { + int year, month, day; + double dayf; + if ( dateTime.TryParseISO8601DateTime( year, month, day, dayf, tz ) ) + { + t = TimePoint( year, month, day, dayf - tz/24 ); + return true; + } + return false; + } + + /*! + * Attempts to evaluate the specified UTF-16 string as a date and time + * specification in ISO 8601 extended format. If successful, stores the + * evaluated UTC time point in the specified variable \a t, and the + * evaluated time zone offset, in hours, in the variable \a tz, then returns + * \c true. + * + * If the specified string cannot be evaluated as a valid date and time in + * ISO 8601 extended format, this function returns \c false and does not + * change the passed variables \a t and \a tz. This function does not throw + * any parsing exceptions. + * + * If the source string contains a time zone offset, it is subtracted from + * the evaluated time point. In other words, the %TimePoint value stored in + * \a t is always represented in the UTC timescale without any offset. + * + * \sa FromString( const String& ), String::TryParseISO8601DateTime() + */ + static bool TryFromString( TimePoint& t, double& tz, const String& dateTime ) + { + int year, month, day; + double dayf; + if ( dateTime.TryParseISO8601DateTime( year, month, day, dayf, tz ) ) + { + t = TimePoint( year, month, day, dayf - tz/24 ); + return true; + } + return false; + } + + /*! + * Attempts to evaluate the specified 8-bit string as a date and time + * specification in ISO 8601 extended format. If successful, stores the + * evaluated UTC time point in the specified variable \a t, then returns + * \c true. + * + * If the specified string cannot be evaluated as a valid date and time in + * ISO 8601 extended format, this function returns \c false and does not + * change the passed variable \a t. This function does not throw any parsing + * exceptions. + * + * If the source string contains a time zone offset, it is subtracted from + * the evaluated time point. In other words, the %TimePoint value stored in + * \a t is always represented in the UTC timescale without any offset. + * + * \sa FromString( const IsoString& ), IsoString::TryParseISO8601DateTime() + */ + static bool TryFromString( TimePoint& t, const IsoString& dateTime ) + { + double tz; + return TryFromString( t, tz, dateTime ); + } + + /*! + * Attempts to evaluate the specified UTF-16 string as a date and time + * specification in ISO 8601 extended format. If successful, stores the + * evaluated UTC time point in the specified variable \a t, then returns + * \c true. + * + * If the specified string cannot be evaluated as a valid date and time in + * ISO 8601 extended format, this function returns \c false and does not + * change the passed variable \a t. This function does not throw any parsing + * exceptions. + * + * If the source string contains a time zone offset, it is subtracted from + * the evaluated time point. In other words, the %TimePoint value stored in + * \a t is always represented in the UTC timescale without any offset. + * + * \sa FromString( const String& ), String::TryParseISO8601DateTime() + */ + static bool TryFromString( TimePoint& t, const String& dateTime ) + { + double tz; + return TryFromString( t, tz, dateTime ); + } + +private: + + int32 m_jdi = int32_max; // invalid by default + double m_jdf = 0.0; + + /*! + * \internal + * Ensures that the internal Julian date separate representation is optimal + * in terms of time resolution by constraining JDF to [0,1). + */ + void Normalize() + { + if ( Abs( m_jdf ) >= 1 ) + { + m_jdi += TruncInt( m_jdf ); + m_jdf = Frac( m_jdf ); + } + } + + template + S ToString( const ISO8601ConversionOptions& options, double tz, S* ) const + { + if ( IsValid() ) + { + int year, month, day; + double dayf; + JDToCalendarTime( year, month, day, dayf, m_jdi, m_jdf ); + return S::ToISO8601DateTime( year, month, day, dayf, tz, options ); + } + return S(); + } +}; + +/* + * ### N.B.: TimePoint cannot have virtual member functions. + * This is because sizeof( TimePoint ) _must_ be equal to + * sizeof( uint32 ) + sizeof( uint64 ). + */ +struct PCL_AssertTimePointSize +{ + struct TestData { uint32 x; uint64 y; }; + static_assert( sizeof( TimePoint ) == sizeof( TestData ), "Invalid sizeof( TimePoint )" ); +}; + +/*! + * Returns true iff two %TimePoint objects, \a t1 and \a t2, represent the same + * time point. + * \ingroup time_representation + */ +inline constexpr bool operator ==( const TimePoint& t1, const TimePoint& t2 ) +{ + return t1.JDI() == t2.JDI() && t1.JDF() == t2.JDF(); +} + +/*! + * Returns true iff a %TimePoint object \a t1 represents the specified time + * point \a jd2, expressed as a Julian date. + * \ingroup time_representation + */ +inline constexpr bool operator ==( const TimePoint& t1, double jd2 ) +{ + return t1.JD() == jd2; +} + +/*! + * Returns true iff a %TimePoint object \a t2 represents the specified time + * point \a jd1, expressed as a Julian date. This operator implements the + * commutative property of scalar time point equality. + * \ingroup time_representation + */ +inline constexpr bool operator ==( double jd1, const TimePoint& t2 ) +{ + return t2.JD() == jd1; +} + +/*! + * Returns true iff a %TimePoint object \a t1 represents a time point that + * precedes the time point represented by another object \a t2. + * + * Invalid %TimePoint instances are always in the infinite past: if + * \a t1 is invalid, this function returns true; if \a t1 is valid and \a t2 is + * not valid, this function returns false. + * + * \ingroup time_representation + */ +inline constexpr bool operator <( const TimePoint& t1, const TimePoint& t2 ) +{ + return !t1.IsValid() || t2.IsValid() && ((t1.JDI() != t2.JDI()) ? t1.JDI() < t2.JDI() : t1.JDF() < t2.JDF()); +} + +/*! + * Returns true iff a %TimePoint object \a t1 represents a time point that + * precedes another time point \a jd2, expressed as a Julian date. + * + * Invalid %TimePoint instances are always in the infinite past: if + * \a t1 is invalid, this function returns true. + * + * \ingroup time_representation + */ +inline constexpr bool operator <( const TimePoint& t1, double jd2 ) +{ + return !t1.IsValid() || t1.JD() < jd2; +} + +/*! + * Returns true iff a time point \a jd1, expressed as a Julian date, precedes + * the time point represented by a %TimePoint object \a t2. + * + * Invalid %TimePoint instances are always in the infinite past: if + * \a t2 is invalid, this function returns false. + * + * \ingroup time_representation + */ +inline constexpr bool operator <( double jd1, const TimePoint& t2 ) +{ + return t2.IsValid() && t2.JD() < jd1; +} + +/*! + * Returns the time interval in days elapsed from the specified time point + * \a t1 to another time point \a t2. The returned value is positive if \a t2 + * precedes \a t1, negative if \a t1 precedes \a t2. + * \ingroup time_representation + */ +inline constexpr double operator -( const TimePoint& t1, const TimePoint& t2 ) +{ + return (t1.JDI() - t2.JDI()) + (t1.JDF() - t2.JDF()); +} + +/*! + * Returns the time point resulting after \a d days transcurred since a time + * point \a t. + * \ingroup time_representation + */ +inline TimePoint operator +( const TimePoint& t, double d ) +{ + return TimePoint( t.JDI(), t.JDF()+d ); +} + +/*! + * Returns the time point resulting after \a d days transcurred since a time + * point \a t. This operator implements the commutative property of scalar time + * point addition. + * \ingroup time_representation + */ +inline TimePoint operator +( double d, const TimePoint& t ) +{ + return t + d; +} + +/*! + * Returns the time point \a d days before a time point \a t. Note that scalar + * time point subtraction is not a commutative operation, so 'd-t' cannot be + * used. + * \ingroup time_representation + */ +inline TimePoint operator -( const TimePoint& t, double d ) +{ + return TimePoint( t.JDI(), t.JDF()-d ); +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_TimePoint_h + +// ---------------------------------------------------------------------------- +// EOF pcl/TimePoint.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Timer.h b/3rdparty/include/pcl/Timer.h new file mode 100644 index 0000000..93f7387 --- /dev/null +++ b/3rdparty/include/pcl/Timer.h @@ -0,0 +1,238 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Timer.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Timer_h +#define __PCL_Timer_h + +/// \file pcl/Timer.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Timer + * \brief Client-side interface to a PixInsight %Timer object. + * + * A %Timer object can work in two ways: + * + * \li As a periodic timer, which generates a sequence of timer events + * at regular time intervals. + * + * \li As a single-shot timer, which generates a single timer event + * after a prescribed time interval. + * + * ### TODO: Write a detailed description for %Timer. + */ +class PCL_CLASS Timer : public UIObject +{ +public: + + /*! + * Constructs a %Timer object. + */ + Timer(); + + /*! + * Destroys a %Timer object. + */ + virtual ~Timer() + { + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * Since timers are unique objects by definition, calling this member + * function has no effect. + */ + void EnsureUnique() override + { + // Timers are unique objects by definition + } + + /*! + * Returns a reference to a null %Timer instance. A null %Timer does not + * correspond to an existing timer in the PixInsight core application. + */ + static Timer& Null(); + + /*! + * Returns the timer interval in seconds. + */ + double Interval() const; + + /*! + * Sets the timer interval in seconds. + */ + void SetInterval( double seconds ); + + /*! + * Returns true iff this is a single-shot timer. + */ + bool IsSingleShot() const; + + /*! + * Returns true iff this is a periodic timer. + * + * This is a convenience member function, equivalent to + * !IsSingleShot() + */ + bool IsPeriodic() const + { + return !IsSingleShot(); + } + + /*! + * Enables or disables single-shot mode for this %Timer object. + */ + void SetSingleShot( bool = true ); + + /*! + * Enables or disables periodic mode for this %Timer object. + */ + void SetPeriodic( bool p = true ) + { + SetSingleShot( !p ); + } + + /*! + * Returns true iff this %Timer object is active. An active timer is + * generating timer events. + */ + bool IsRunning() const; + + /*! + * Activates this %Timer object. Starts generation of timer event(s). + */ + void Start(); + + /*! + * Stops this %Timer object, if it is currently active. + */ + void Stop(); + + /*! + * Returns the number of timer events generated after the last call to + * Start(). + */ + unsigned Count() const + { + return count; + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnTimer( Timer& sender ); + + /*! + * \defgroup timer_event_handlers Timer Event Handlers + */ + + /*! + * Defines the prototype of a timer event handler. + * + * A timer event is generated by an active %Timer object, either at regular + * intervals (periodic timer), or just once when the timer period elapses + * (single-shot timer). + * + * \param sender The control that sends a timer event. + * + * \ingroup timer_event_handlers + */ + typedef void (Control::*timer_event_handler)( Timer& sender ); + + /*! + * Sets the timer event handler for this %Timer object. + * + * \param handler The timer event handler. Must be a member function of + * the receiver object's class. + * + * \param receiver The control that will receive timer events from this + * %Timer. + * + * \ingroup timer_event_handlers + */ + void OnTimer( timer_event_handler handler, Control& receiver ); + +private: + + timer_event_handler onTimer = nullptr; + unsigned count = 0; + + Timer( void* h ) : UIObject( h ) + { + } + + void* CloneHandle() const override; + + friend class TimerEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_Timer_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Timer.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ToolButton.h b/3rdparty/include/pcl/ToolButton.h new file mode 100644 index 0000000..da9f113 --- /dev/null +++ b/3rdparty/include/pcl/ToolButton.h @@ -0,0 +1,126 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ToolButton.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ToolButton_h +#define __PCL_ToolButton_h + +/// \file pcl/ToolButton.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ToolButton + * \brief Client-side interface to a PixInsight %ToolButton control. + * + * ### TODO: Write a detailed description for %ToolButton + */ +class PCL_CLASS ToolButton : public Button +{ +public: + + /*! + * Constructs a %ToolButton with the specified \a text, \a icon and \a + * checkable state, as a child control of \a parent. + */ + ToolButton( const String& text = String(), + const pcl::Bitmap& icon = Bitmap::Null(), + bool checkable = false, + Control& parent = Control::Null() ); + + /*! + * Destroys a %ToolButton control. + */ + virtual ~ToolButton() + { + } + + /*! + * Returns \c true, since tool buttons are pushable buttons. + */ + bool IsPushable() const override + { + return true; + } + + /*! + * Returns true iff this %ToolButton is \a e checkable. + * + * \sa SetCheckable() + */ + bool IsCheckable() const override; + + /*! + * Enables or disables the checkable state of this %ToolButton. + * + * \sa IsCheckable() + */ + void SetCheckable( bool = true ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ToolButton_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ToolButton.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Translation.h b/3rdparty/include/pcl/Translation.h new file mode 100644 index 0000000..2a02410 --- /dev/null +++ b/3rdparty/include/pcl/Translation.h @@ -0,0 +1,210 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Translation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Translation_h +#define __PCL_Translation_h + +/// \file pcl/Translation.h + +#include +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Translation + * \brief %Image translation algorithm. + * + * ### TODO: Write a detailed description for %Translation + */ +class PCL_CLASS Translation : public InterpolatingGeometricTransformation, + public ParallelProcess +{ +public: + + /*! + * Constructs a %Translation object using the specified pixel interpolation + * \a p, with translation increments \a dx and \a dy in pixels. + * + * The specified pixel interpolation object \a p must remain valid while + * this object exists. + */ + Translation( PixelInterpolation& p, double dx = 0, double dy = 0 ) + : InterpolatingGeometricTransformation( p ) + , m_delta( dx, dy ) + { + } + + /*! + * Constructs a %Translation object using the specified pixel interpolation + * \a p, with translation increments in pixels given by the components of a + * point \a d in the plane. + * + * The specified pixel interpolation object \a p must remain valid while + * this object exists. + */ + Translation( PixelInterpolation& p, const DPoint& d ) + : InterpolatingGeometricTransformation( p ) + , m_delta( d ) + { + } + + /*! + * Copy constructor. + */ + Translation( const Translation& ) = default; + + /*! + * Returns the translation increments in pixels for both axes, as the + * corresponding components of a point in the plane. + */ + const DPoint& Delta() const + { + return m_delta; + } + + /*! + * Returns the horizontal translation increment in pixels. + */ + double DeltaX() const + { + return m_delta.x; + } + + /*! + * Returns the vertical translation increment in pixels. + */ + double DeltaY() const + { + return m_delta.y; + } + + /*! + * Sets the translation increments in pixels as the components of a point + * \a d in the plane. + */ + void SetDelta( const DPoint& d ) + { + m_delta = d; + } + + /*! + * Sets the translation increments \a dx and \a dy in pixels. + */ + void SetDelta( double dx, double dy ) + { + m_delta.x = dx; m_delta.y = dy; + } + + /*! + * Returns the current vector of per-channel filling values for uncovered + * image regions. + * + * See the documentation for SetFillValues() for more information. + */ + const DVector& FillValues() const + { + return m_fillValues; + } + + /*! + * Sets a vector of per-channel filling values for uncovered image regions. + * + * Uncovered regions result each time an image is translated. Note that + * uncovering can be \e partial for one row or column of pixels, when + * fractional displacements are applied in the corresponding plane + * directions. + * + * By default, there are no filling values defined (and hence the returned + * vector is empty by default). When the %Translation instance is executed + * and a filling value is not defined for a channel of the target image, + * uncovered regions are filled with the minimum sample value in the native + * range of the image (usually zero). + */ + void SetFillValues( const DVector& fillValues ) + { + m_fillValues = fillValues; + } + + /*! + */ + void GetNewSizes( int& width, int& height ) const override + { + // No changes + } + +protected: + + DPoint m_delta; // displacements in pixels + DVector m_fillValues; + + // Inherited from ImageTransformation. + void Apply( pcl::Image& ) const override; + void Apply( pcl::DImage& ) const override; + void Apply( pcl::UInt8Image& ) const override; + void Apply( pcl::UInt16Image& ) const override; + void Apply( pcl::UInt32Image& ) const override; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Translation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Translation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/TreeBox.h b/3rdparty/include/pcl/TreeBox.h new file mode 100644 index 0000000..255296d --- /dev/null +++ b/3rdparty/include/pcl/TreeBox.h @@ -0,0 +1,962 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/TreeBox.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_TreeBox_h +#define __PCL_TreeBox_h + +/// \file pcl/TreeBox.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class TreeBox + * \brief Client-side interface to a PixInsight %TreeBox control + * + * ### TODO: Write a detailed description for %TreeBox. + */ +class PCL_CLASS TreeBox : public ScrollBox +{ +public: + + /*! + * \class pcl::TreeBox::Node + * \brief Client-side interface to a PixInsight %TreeBox node + * + * ### TODO: Write a detailed description for %TreeBox::Node. + */ + class PCL_CLASS Node : public UIObject + { + public: + + /*! # + */ + Node(); + + /* + * ### N.B.: If we define a default parameter value index=-1 for the + * following constructor (as expected), the static member function Null() + * cannot be compiled with g++ 4.9.x. The compiler issues the error: + * + * no matching function for call to + * 'pcl::TreeBox::Node::Node(pcl::TreeBox::Node)' + * + * which is obviously incorrect and looks like an obscure compiler bug. + * Note that the same problem exists with g++ 4.8.x (at least). + */ + /*! # + */ + Node( Node& parent, int index ); + + /*! # + */ + Node( TreeBox& parentTree, int index = -1 ); + + /*! + * Destroys a %TreeBox::Node object. + */ + virtual ~Node(); + + /*! # + */ + static Node Null() + { + // ### See note above for Node::Node( Node&, int ). + return Node( nullptr ); + } + + /*! # + */ + const TreeBox& ParentTree() const; + + /*! # + */ + TreeBox& ParentTree(); + + /*! # + */ + const Node* Parent() const; + + /*! # + */ + Node* Parent(); + + /*! # + */ + int NumberOfChildren() const; + + /*! # + */ + const Node* Child( int idx ) const; + + /*! # + */ + Node* Child( int idx ); + + /*! # + */ + const Node* operator []( int idx ) const + { + return Child( idx ); + } + + /*! # + */ + Node* operator []( int idx ) + { + return Child( idx ); + } + + /*! # + */ + int ChildIndex( const Node* ) const; + + /*! # + */ + void Insert( int idx, Node* ); + + /*! # + */ + void Add( Node* node ) + { + Insert( NumberOfChildren(), node ); + } + + /*! # + */ + void Remove( int idx ); + + /*! # + */ + bool IsEnabled() const; + + /*! # + */ + void Enable( bool = true ); + + /*! # + */ + void Disable( bool disable = true ) + { + Enable( !disable ); + } + + /*! # + */ + bool IsExpanded() const; + + /*! # + */ + bool IsCollapsed() const + { + return !IsExpanded(); + } + + /*! # + */ + void Expand( bool expand = true ); + + /*! # + */ + void Collapse( bool collapse = true ) + { + Expand( !collapse ); + } + + /*! # + */ + bool IsSelectable() const; + + /*! # + */ + void SetSelectable( bool = true ); + + /*! # + */ + bool IsSelected() const; + + /*! # + */ + void Select( bool = true ); + + /*! # + */ + void Unselect( bool unselect = true ) + { + Select( !unselect ); + } + + /*! # + */ + bool IsCheckable() const; + + /*! # + */ + void SetCheckable( bool = true ); + + /*! # + */ + bool IsChecked() const; + + /*! # + */ + void Check( bool = true ); + + /*! # + */ + void Uncheck( bool uncheck = true ) + { + Check( !uncheck ); + } + + /*! # + */ + String Text( int col ) const; + + /*! # + */ + void SetText( int col, const String& ); + + /*! # + */ + Bitmap Icon( int col ) const; + + /*! # + */ + void SetIcon( int col, const Bitmap& ); + + /*! # + */ + int Alignment( int col ) const; + + /*! # + */ + void SetAlignment( int col, int align ); + + /*! # + */ + String ToolTip( int col ) const; + + /*! # + */ + void SetToolTip( int col, const String& ); + + /*! # + */ + pcl::Font Font( int col ) const; + + /*! # + */ + void SetFont( int col, const pcl::Font& ); + + /*! # + */ + RGBA BackgroundColor( int col ) const; + + /*! # + */ + void SetBackgroundColor( int col, RGBA ); + + /*! # + */ + RGBA TextColor( int col ) const; + + /*! # + */ + void SetTextColor( int col, RGBA ); + + protected: + + /*! + * \internal + */ + Node( void* h ) : UIObject( h ) + { + } + + /*! + * \internal + */ + Node( std::nullptr_t ) : UIObject( nullptr ) + { + } + + /*! + * \internal + */ + void* CloneHandle() const override; + + private: + + typedef SortedArray child_node_list; + child_node_list m_children; + bool m_removed = false; + + friend class TreeBox; + }; + + // ------------------------------------------------------------------------- + + /*! + * Constructs a %TreeBox as a child control of \a parent. + */ + TreeBox( Control& parent = Control::Null() ); + + /*! + * Destroys a %TreeBox control. + */ + virtual ~TreeBox(); + + /*! # + */ + static TreeBox& NullTree(); + + // + + /*! # + */ + int NumberOfChildren() const; + + /*! # + */ + const Node* Child( int idx ) const; + + /*! # + */ + Node* Child( int idx ); + + /*! # + */ + const Node* operator []( int idx ) const + { + return Child( idx ); + } + + /*! # + */ + Node* operator []( int idx ) + { + return Child( idx ); + } + + /*! # + */ + int ChildIndex( const Node* ) const; + + /*! # + */ + void Insert( int idx, Node* ); + + /*! # + */ + void Add( Node* n ) + { + Insert( NumberOfChildren(), n ); + } + + /*! # + */ + void Remove( int idx ); + + /*! # + */ + void Clear(); + + // + + /*! # + */ + const Node* CurrentNode() const; + + /*! # + */ + Node* CurrentNode(); + + /*! # + */ + void SetCurrentNode( Node* ); + + // + + /*! # + */ + bool AreMultipleSelectionsEnabled() const; + + /*! # + */ + bool AreMultipleSelectionsDisabled() const + { + return !AreMultipleSelectionsEnabled(); + } + + /*! # + */ + void EnableMultipleSelections( bool enable = true ); + + /*! # + */ + void DisableMultipleSelections( bool disable = true ) + { + EnableMultipleSelections( !disable ); + } + + /*! + * Returns a dynamic array of pointers to all selected nodes in this tree. + * If this tree has no selected nodes, an empty array is returned. + * + * The returned object is an instantiation of IndirectArray for the + * TreeBox::Node class: IndirectArray\. + */ + IndirectArray SelectedNodes() const; + + /*! + * Selects all nodes in this tree, that is the entire %TreeBox contents. + */ + void SelectAllNodes(); + + /*! + * Returns true if this %TreeBox object has one or more selected toplevel + * nodes; false if no toplevel nodes are selected. + */ + bool HasSelectedTopLevelNodes() const; + + // + + /*! # + */ + const Node* NodeByPosition( const pcl::Point& p ) const + { + return NodeByPosition( p.x, p.y ); // in client coordinates + } + + /*! # + */ + Node* NodeByPosition( const pcl::Point& p ) + { + return NodeByPosition( p.x, p.y ); + } + + /*! # + */ + const Node* NodeByPosition( int x, int y ) const; + + /*! # + */ + Node* NodeByPosition( int x, int y ); + + /*! # + */ + void SetNodeIntoView( Node* ); + + /*! # + */ + pcl::Rect NodeRect( const Node* ) const; + + // + + /*! # + */ + int NumberOfColumns() const; + + /*! # + */ + void SetNumberOfColumns( int nCols ); + + // Visibility + + /*! # + */ + bool IsColumnVisible( int col ) const; + + /*! # + */ + void ShowColumn( int col, bool show = true ); + + /*! # + */ + void HideColumn( int col, bool hide = true ) + { + ShowColumn( col, !hide ); + } + + // + + /*! # + */ + int ColumnWidth( int col ) const; + + /*! # + */ + void SetColumnWidth( int col, int width ); + + /*! # + */ + int ScaledColumnWidth( int col ) const + { + return PhysicalPixelsToLogical( ColumnWidth( col ) ); + } + + /*! # + */ + void SetScaledColumnWidth( int col, int width ) + { + SetColumnWidth( col, LogicalPixelsToPhysical( width ) ); + } + + /*! # + */ + void AdjustColumnWidthToContents( int col ); + + // + + /*! # + */ + String HeaderText( int col ) const; + + /*! # + */ + void SetHeaderText( int col, const String& ); + + // + + /*! # + */ + Bitmap HeaderIcon( int col ) const; + + /*! # + */ + void SetHeaderIcon( int col, const Bitmap& ); + + // + + /*! # + */ + int HeaderAlignment( int col ) const; + + /*! # + */ + void SetHeaderAlignment( int col, int align ); + + /*! # + */ + bool IsHeaderVisible() const; + + /*! # + */ + void ShowHeader( bool show = true ); + + /*! # + */ + void HideHeader( bool hide = true ) + { + ShowHeader( !hide ); + } + + // + + /*! # + */ + int IndentSize() const; + + /*! # + */ + void SetIndentSize( int ); + + /*! # + */ + int ScaledIndentSize() const + { + return PhysicalPixelsToLogical( IndentSize() ); + } + + /*! # + */ + void SetScaledIndentSize( int size ) + { + SetIndentSize( LogicalPixelsToPhysical( size ) ); + } + + // + + /*! # + */ + bool IsNodeExpansionEnabled() const; + + /*! # + */ + void EnableNodeExpansion( bool = true ); + + /*! # + */ + void DisableNodeExpansion( bool disable = true ) + { + EnableNodeExpansion( !disable ); + } + + // + + /*! # + */ + bool IsRootDecorationEnabled() const; + + /*! # + */ + void EnableRootDecoration( bool = true ); + + /*! # + */ + void DisableRootDecoration( bool disable = true ) + { + EnableRootDecoration( !disable ); + } + + // Alternating row colors + // Even row color is Control::CanvasColor() + // Odd row color is Control::AlternateCanvasColor() + + /*! # + */ + bool IsAlternateRowColorEnabled() const; + + /*! # + */ + void EnableAlternateRowColor( bool = true ); + + /*! # + */ + void DisableAlternateRowColor( bool disable = true ) + { + EnableAlternateRowColor( !disable ); + } + + // + + /*! # + */ + bool IsUniformRowHeightEnabled() const; + + /*! # + */ + void EnableUniformRowHeight( bool = true ); + + /*! # + */ + void DisableUniformRowHeight( bool disable = true ) + { + EnableUniformRowHeight( !disable ); + } + + // + + /*! # + */ + void GetIconSize( int& width, int& height ) const; + + /*! # + */ + int IconWidth() const + { + int w, dum; GetIconSize( w, dum ); return w; + } + + /*! # + */ + int IconHeight() const + { + int dum, h; GetIconSize( dum, h ); return h; + } + + /*! # + */ + void SetIconSize( int width, int height ); + + /*! # + */ + void SetIconSize( int size ) + { + SetIconSize( size, size ); + } + + /*! # + */ + void GetScaledIconSize( int& width, int& height ) const + { + GetIconSize( width, height ); width = PhysicalPixelsToLogical( width ); height = PhysicalPixelsToLogical( height ); + } + + /*! # + */ + int ScaledIconWidth() const + { + int width, dum; GetIconSize( width, dum ); return PhysicalPixelsToLogical( width ); + } + + /*! # + */ + int ScaledIconHeight() const + { + int dum, height; GetIconSize( dum, height ); return PhysicalPixelsToLogical( height ); + } + + /*! # + */ + void SetScaledIconSize( int width, int height ) + { + SetIconSize( LogicalPixelsToPhysical( width ), LogicalPixelsToPhysical( height ) ); + } + + /*! # + */ + void SetScaledIconSize( int size ) + { + size = LogicalPixelsToPhysical( size ); + SetIconSize( size, size ); + } + + // + + /*! # + */ + bool IsHeaderSortingEnabled() const; + + /*! # + */ + void EnableHeaderSorting( bool = true ); + + /*! # + */ + void DisableHeaderSorting( bool disable = true ) + { + EnableHeaderSorting( !disable ); + } + + /*! # + */ + void Sort( int col = 0, bool ascending = true ); + + // + + /*! # + */ + bool IsNodeDraggingEnabled() const; + + /*! # + */ + void EnableNodeDragging( bool = true ); + + /*! # + */ + void DisableNodeDragging( bool disable = true ) + { + EnableNodeDragging( !disable ); + } + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnCurrentNodeUpdated( TreeBox& sender, TreeBox::Node& current, TreeBox::Node& oldCurrent ); + // void OnNodeActivated( TreeBox& sender, TreeBox::Node& node, int col ); + // void OnNodeUpdated( TreeBox& sender, TreeBox::Node& node, int col ); + // void OnNodeEntered( TreeBox& sender, TreeBox::Node& node, int col ); + // void OnNodeClicked( TreeBox& sender, TreeBox::Node& node, int col ); + // void OnNodeDoubleClicked( TreeBox& sender, TreeBox::Node& node, int col ); + // void OnNodeExpanded( TreeBox& sender, TreeBox::Node& node ); + // void OnNodeCollapsed( TreeBox& sender, TreeBox::Node& node ); + // void OnNodeSelectionUpdated( TreeBox& sender ); + + /*! + * \defgroup tree_box_event_handlers TreeBox Event Handlers + */ + + /*! # + * \ingroup tree_box_event_handlers + */ + typedef void (Control::*tree_event_handler)( TreeBox& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + typedef void (Control::*node_event_handler)( TreeBox&, TreeBox::Node&, int ); + + /*! # + * \ingroup tree_box_event_handlers + */ + typedef void (Control::*node_expand_event_handler)( TreeBox&, TreeBox::Node& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + typedef void (Control::*node_navigation_event_handler)( TreeBox&, TreeBox::Node&, TreeBox::Node& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnCurrentNodeUpdated( node_navigation_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeActivated( node_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeUpdated( node_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeEntered( node_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeClicked( node_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeDoubleClicked( node_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeExpanded( node_expand_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeCollapsed( node_expand_event_handler, Control& ); + + /*! # + * \ingroup tree_box_event_handlers + */ + void OnNodeSelectionUpdated( tree_event_handler, Control& ); + +private: + + struct EventHandlers + { + node_navigation_event_handler onCurrentNodeUpdated = nullptr; + node_event_handler onNodeActivated = nullptr; + node_event_handler onNodeUpdated = nullptr; + node_event_handler onNodeEntered = nullptr; + node_event_handler onNodeClicked = nullptr; + node_event_handler onNodeDoubleClicked = nullptr; + node_expand_event_handler onNodeExpanded = nullptr; + node_expand_event_handler onNodeCollapsed = nullptr; + tree_event_handler onNodeSelectionUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + typedef SortedArray child_node_list; + child_node_list m_children; + + static pcl::Font FontFromHandle( void* h ) + { + return pcl::Font( h ); + } + + static const void* HandleFromFont( const pcl::Font& f ) + { + return f.handle; + } + + static Bitmap BitmapFromHandle( void* h ) + { + return Bitmap( h ); + } + + static const void* HandleFromBitmap( const Bitmap& p ) + { + return p.handle; + } + +protected: + + /*! + * \internal + */ + TreeBox( void* ); + + friend class Node; + friend class TreeBoxEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_TreeBox_h + +// ---------------------------------------------------------------------------- +// EOF pcl/TreeBox.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/UIObject.h b/3rdparty/include/pcl/UIObject.h new file mode 100644 index 0000000..49c404f --- /dev/null +++ b/3rdparty/include/pcl/UIObject.h @@ -0,0 +1,409 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/UIObject.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_UIObject_h +#define __PCL_UIObject_h + +/// \file pcl/UIObject.h + +#include + +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class UIObject + * \brief Root base class for all user interface objects. + * + * %UIObject is a high-level, managed client-side interface to a server-side + * object living in the PixInsight core application. %UIObject is the root base + * class of all PCL classes representing objects that can be constructed and + * destroyed in the PixInsight platform, such as most user interface elements, + * file format instances, and process instances. + * + * For example, Bitmap and ProcessInstance are derived classes of %UIObject + * because you can generate new instances of the server-side objects + * represented by these classes. Contrarily, FileFormat and Process are not + * %UIObject descendants because these classes represent installed components + * that cannot be created or modified by a module. + * + * All the server-side objects represented by %UIObject and its derived classes + * are reference counted objects. When you create an instance of + * %UIObject (or a derived class) in your module, you either generate a new + * object in the platform, or increase the reference counter of an already + * existing object. When a server-side object becomes unreferenced, that is, + * when no living %UIObject represents it, it is either destroyed or recycled + * by the PixInsight core application as soon as possible, in order to reuse + * and optimize the available resources. This process is known as garbage + * collection, and works in a completely automatic and transparent fashion + * in the PixInsight platform. + */ +class PCL_CLASS UIObject +{ +public: + + /*! + * Destroys a %UIObject instance. + * + * After destruction of this %UIObject, the server-side object is also + * destroyed or recycled if it is no longer referenced by other high-level + * interfaces (e.g., other instances of %UIObject in this or other modules). + */ + virtual ~UIObject() noexcept( false ); + + /*! + * Returns true iff this is a \e null %UIObject instance. + * + * A null %UIObject does not represent an existing object in the PixInsight + * core application. + */ + bool IsNull() const + { + return handle == nullptr; + } + + /*! + * Returns a reference to a null %UIObject instance. + * + * A null %UIObject does not represent an existing object in the PixInsight + * core application. + */ + static UIObject& Null(); + + /*! + * Returns the total number of existing references to the server-side object + * managed by this %UIObject. + * + * The returned value is the sum of all references to the server-side object + * on the whole PixInsight platform, including all installed modules and the + * PixInsight core application. + */ + size_type RefCount() const; + + /*! + * Returns true iff the server-side object is uniquely referenced by this + * %UIObject instance. + * + * A uniquely referenced server-side object will be destroyed or recycled + * upon destruction of this %UIObject. + */ + bool IsUnique() const + { + return RefCount() < 2; + } + + /*! + * Returns true iff this %UIObject instance is an alias to an existing object + * in the calling module. + * + * An alias and its aliased object are interchangeable; other than + * module-specific functionality, their behaviors are identical since they + * refer to a unique object living in the PixInsight core application. An + * alias %UIObject is generated each time a new %UIObject descendant class + * is instantiated using (explicitly or indirectly) a copy constructor. For + * example: + * + * \code + * ImageWindow w1( 256, 256 ); // ImageWindow is an UIObject derived class + * ImageWindow w2 = w1; // w2 is an alias to w1. + * bool b1 = w1.IsAlias(); // b1 is now false + * bool b2 = w2.IsAlias(); // b2 is now true + * w2.Show(); // OK, shows w1. + * w1.HideMask(); + * bool b3 = w2.IsMaskVisible(); // b3 is now false + * w2.Close(); // OK, the window is destroyed and both w1 and w2 are now invalid objects. + * \endcode + * + * The only limit specific to aliased objects is the fact that an alias + * Control (or descendant) cannot set event handlers. See the documentation + * for Control( const Control& ) for more information. + */ + bool IsAlias() const + { + return alias; + } + + /*! + * Returns true iff this managed object represents an unreferenced + * server-side object. Such objects are said to be 'garbage' in the + * programming jargon, and are subject to eventual destruction through a + * process known as \e garbage \e collection. + */ + bool IsGarbage() const + { + return RefCount() < 1; + } + + /*! + * Returns true iff this instance and other %UIObject \a o reference the same + * server-side object. + * + * If two %UIObject instances reference the same server-side object, each of + * them act as an alias for the other: In all respects, both high-level + * instances are interchangeable. + */ + bool IsSameObject( const UIObject& o ) const + { + return handle == o.handle; + } + + /*! + * Ensures that the server-side object managed by this instance is uniquely + * referenced. + * + * If there are other %UIObject instances that refer to the same server-side + * object, this member function attempts to create a new server-side object + * as a copy of the currently managed object, and references it. + * + * If the server-side object is only referenced by this %UIObject instance, + * calling this member function has no effect. + * + * Some derived classes represent object types whose instances are unique by + * nature. In those cases, calling this member function has no effect. + */ + virtual void EnsureUnique(); + + /*! + * A convenience synonym for IsSameObject( o ). + */ + bool operator ==( const UIObject& o ) const + { + return IsSameObject( o ); + } + + /*! + * Returns true iff this %UIObject instance precedes another %UIObject \a o. + * Performs a comparison based on the low-level handle internally maintained + * by each %UIObject. + * + * This member function is actually intended for fast access to large sets + * of %UIObject instances stored in containers (as for example the whole set + * of user interface objects defined in a module). It is seldom used + * explicitly by modules. + */ + bool operator <( const UIObject& o ) const + { + return handle < o.handle; + } + + /*! + * Returns a string that uniquely identifies the type of the server-side UI + * object managed by this %UIObject. + */ + IsoString ObjectType() const; + + /*! + * Returns the identifier of this UI object. The object identifier is a + * text string associated with the server-side UI object managed by this + * %UIObject instance. + * + * When this function is called for the first time for a given object, and + * no object identifier has been set explicitly in a previous call to + * SetObjectId(), a new identifier is generated automatically. In this case + * the generated object identifier is guaranteed to be unique across the + * entire PixInsight platform. + * + * Object identifiers are useful to select individual instances. For + * example, an object identifier can be used to restrict the scope of an + * interface style sheet to a particular control. See the documentation for + * Control::SetStyleSheet() for more information. + * + * \sa SetObjectId() + */ + String ObjectId() const; + + /*! + * Sets the identifier of this UI object. Forcing an object identifier can + * be useful to select one or more controls for CSS styling with the + * Control::SetStyleSheet() member function. See the documentation for + * ObjectId() for more information. + * + * \sa ObjectId() + */ + void SetObjectId( const String& id ); + +protected: + + void* handle = nullptr; + bool alias = false; + + /*! + * Constructs a null %UIObject instance. + * + * A null %UIObject does not correspond to an existing object in the + * PixInsight core application. + */ + UIObject() = default; + + /*! + * Copy constructor. + * + * Unless a derived class redefines it otherwise (which is rare), this + * constructor does not create a new object in the PixInsight core + * application. It simply creates an alias %UIObject instance that + * references the same server-side object as the source instance \a x. + */ + UIObject( const UIObject& x ); + + /*! + * Move constructor. + */ + UIObject( UIObject&& x ) + : handle( x.handle ) + , alias( x.alias ) + { + x.handle = nullptr; + x.alias = false; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + UIObject& operator =( const UIObject& x ) + { + Assign( x ); + return *this; + } + + /*! + * Move assignment operator. Returns a reference to this object. + */ + UIObject& operator =( UIObject&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * \internal + */ + UIObject( void* ); + + /*! + * \internal + */ + UIObject( const void* ); + + /*! + * \internal + */ + UIObject( std::nullptr_t ) + { + } + + /*! + * \internal + */ + void SetHandle( void* ); + + /*! + * \internal + */ + void TransferHandle( void* ); + + /*! + * \internal + * This virtual function is called to construct object duplicates. Derived + * classes must reimplement this function to return the handle of a newly + * constructed UI object. + */ + virtual void* CloneHandle() const + { + return nullptr; + } + + /*! + * \internal + */ + bool Assign( const UIObject& x ) + { + if ( x.handle != handle ) + { + SetHandle( x.handle ); + return true; + } + return false; + } + + /*! + * \internal + */ + bool Transfer( UIObject& x ) + { + if ( &x != this ) + { + SetHandle( nullptr ); + handle = x.handle; + alias = x.alias; + x.handle = nullptr; + x.alias = false; + return true; + } + return false; + } + + friend class UIObjectIndex; + friend class UIEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_UIObject_h + +// ---------------------------------------------------------------------------- +// EOF pcl/UIObject.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/UIScaling.h b/3rdparty/include/pcl/UIScaling.h new file mode 100644 index 0000000..281ee93 --- /dev/null +++ b/3rdparty/include/pcl/UIScaling.h @@ -0,0 +1,362 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/UIScaling.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_UIScaling_h +#define __PCL_UIScaling_h + +/// \file pcl/UIScaling.h + +#include +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup ui_scaling_functions User Interface Scaling Functions + */ + +#define PCL_UIScaling_LUT_Length 7 + +extern PCL_DATA const double PCL_UIScalingFactor_LUT[ PCL_UIScaling_LUT_Length ]; +extern PCL_DATA const char* PCL_UIScalingSubdir_LUT[ PCL_UIScaling_LUT_Length ]; + +/*! + * Returns the resource scaling index corresponding to the specified resource + * scaling factor. + * + * Resource scaling indexes pertain to the set {0,1,2,3,4,5,6}, respectively + * for the resource scaling factors {1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0}. + * + * \ingroup ui_scaling_functions + */ +inline int UIResourceScalingIndex( double scalingFactor ) +{ + if ( scalingFactor > 1 ) + { + int index = Min( RoundInt( 2*scalingFactor ), PCL_UIScaling_LUT_Length+1 ); + if ( index > 2 ) + return index-2; + } + return 0; +} + +/*! + * Returns the resource scaling factor corresponding to the specified display + * scaling factor. + * + * A display scaling factor is the ratio of physical device pixels to + * device-independent logical pixel units for a particular control or resource. + * A resource scaling factor has the same definition, but is constrained to the + * finite set {1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0}. + * + * On the PixInsight platform, the reference display density is 109 dpi, + * corresponding to a 27-inch monitor at QHD resolution (2560x1440 physical + * display pixels). This density corresponds to a display/resource scaling + * factor of 1.0. + * + * \ingroup ui_scaling_functions + */ +inline double UIResourceScalingFactor( double scalingFactor ) +{ + return PCL_UIScalingFactor_LUT[UIResourceScalingIndex( scalingFactor )]; +} + +/*! + * Returns the resource scaling factor corresponding to the specified resource + * scaling index. + * + * Resource scaling indexes pertain to the set {0,1,2,3,4,5,6}, respectively + * for the resource scaling factors {1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0}. + * + * On the PixInsight platform, the reference display density is 109 dpi, + * corresponding to a 27-inch monitor at QHD resolution (2560x1440 physical + * display pixels). This density corresponds to a display/resource scaling + * factor of 1.0 and a zero resource scaling index. + * + * \ingroup ui_scaling_functions + */ +inline double UIResourceScalingFactorForIndex( int index ) +{ + return PCL_UIScalingFactor_LUT[Range( index, 0, PCL_UIScaling_LUT_Length-1 )]; +} + +/*! + * Applies the specified scaling factor to convert \a size from + * device-independent logical pixel units to physical device pixels. The + * returned value is always rounded to the nearest integer. + * + * \ingroup ui_scaling_functions + */ +inline int UIScaled( double scalingFactor, int size ) +{ + return (scalingFactor <= 1) ? size : RoundInt( scalingFactor*size ); +} + +/*! + * Applies the specified scaling factor to convert \a size from physical device + * pixels to device-independent logical pixel units. The returned value is + * always rounded to the nearest integer. + * + * \ingroup ui_scaling_functions + */ +inline int UIUnscaled( double scalingFactor, int size ) +{ + return (scalingFactor <= 1) ? size : RoundInt( size/scalingFactor ); +} + +/*! + * Returns a user interface resource path corresponding to the specified + * \a resource path scaled for the specified resource scaling \a index. + * + * For example, if this function is called as follows: + * + * \code UIScaledResourceForIndex( 3, "/:icons/delete.png" ); \endcode + * + * the returned string will be "/:icons/2.5/delete.png" for a resource scaling + * factor of 2.5. + * + * \ingroup ui_scaling_functions + */ +template +inline String UIScaledResourceForIndex( int index, R resource ) +{ + String path( resource ); + index = Range( index, 0, PCL_UIScaling_LUT_Length-1 ); + if ( index > 0 ) + { + size_type p = path.FindLast( '/' ); + if ( p != String::notFound && p > 0 ) // assume resource starts with ":/" + return path.Left( p+1 ) + PCL_UIScalingSubdir_LUT[index] + path.Substring( p ); + } + return path; +} + +/*! + * Returns a user interface resource path corresponding to the specified + * \a resource path scaled for the specified resource scaling factor. + * + * For example, if this function is called as follows: + * + * \code UIScaledResourceForIndex( 1.47, "/:icons/pencil.png" ); \endcode + * + * the returned string will be "/:icons/1.5/pencil.png" for a resource scaling + * factor of 1.5. + * + * \ingroup ui_scaling_functions + */ +template +inline String UIScaledResource( double scalingFactor, R resource ) +{ + return UIScaledResourceForIndex( UIResourceScalingIndex( scalingFactor ), resource ); +} + +/* + * Auxiliary structure used by UIScaledStyleSheet(). + */ +struct PCL_UIStringSection +{ + size_type pos = 0; + size_type len = 0; + + PCL_UIStringSection( size_type i, size_type j ) + : pos( i ) + , len( j - i ) + { + } + + PCL_UIStringSection() = default; + PCL_UIStringSection( const PCL_UIStringSection& ) = default; +}; + +/*! + * Returns a CSS source code string transformed with scaled dimensions in + * pixels and scaled resource file paths, and optionally font sizes in points + * converted to scaled pixels. + * + * \param displayScalingFactor The display scaling factor that will be + * applied to scale pixel dimensions and + * (optionally) font sizes. + * + * \param resourceScalingFactor The resource scaling factor that will be + * applied to select bitmap resources. + * + * \param styleSheet A string containing valid input CSS source + * code. The function will return a transformed + * version of this string. + * + * \param fontDPI If greater than zero, this is the font + * resolution, in dots per inch (dpi), for + * transformation of point sizes to scaled pixel + * sizes. If this parameter is zero (the default + * value), this routine will use the font + * resolution currently selected in core user + * preferences (which is the value of the + * "Application/FontResolution" global integer + * variable; see PixInsightSettings). If this + * parameter is a negative integer, no + * point-to-pixel conversions will be applied. + * + * See Control::ScaledStyleSheet() for a detailed example. + * + * \ingroup ui_scaling_functions + */ +template +String UIScaledStyleSheet( double displayScalingFactor, double resourceScalingFactor, S styleSheet, int fontDPI = 0 ) +{ +#define PCL_UI_IS_NUMBER_DIGIT( c ) (CharTraits::IsDigit( c ) || CharTraits::IsDecimalSeparator( c )) + + String cssCode( styleSheet ); + + /* + * Scale resource file paths. + */ + if ( resourceScalingFactor > 0 ) + { + Array urlSections; + for ( size_type p = 0; ; ) + { + p = cssCode.Find( ":/", p ); + if ( p == String::notFound ) + break; + size_type q = cssCode.Find( ')', p+2 ); + if ( q != String::notFound ) + { + urlSections.Add( PCL_UIStringSection( p, q ) ); + p = q+1; + } + else + p += 2; + } + if ( !urlSections.IsEmpty() ) + { + int index = UIResourceScalingIndex( resourceScalingFactor ); + for ( const PCL_UIStringSection& s : ReverseIterable( urlSections ) ) + cssCode.Replace( s.pos, s.len, String( UIScaledResourceForIndex( index, cssCode.Substring( s.pos, s.len ) ) ) ); + } + } + + /* + * Scale pixel dimensions and convert points to scaled pixels. + */ + if ( displayScalingFactor > 0 ) + { + Array pxSections; + for ( size_type q = 0; ; q += 2 ) + { + q = cssCode.Find( "px", q ); + if ( q == String::notFound ) + break; + size_type p = q; + while ( p > 0 && PCL_UI_IS_NUMBER_DIGIT( cssCode[p-1] ) ) + --p; + if ( p < q ) + pxSections.Add( PCL_UIStringSection( p, q ) ); + } + for ( const PCL_UIStringSection& s : ReverseIterable( pxSections ) ) + { + double px; + if ( cssCode.Substring( s.pos, s.len ).TryToDouble( px ) ) + cssCode.Replace( s.pos, s.len, String().Format( "%d", RoundInt( px * displayScalingFactor ) ) ); + } + + /* + * If fontDPI=0 (the default value), use core font resolution settings for + * point-to-pixel conversions. + */ + if ( fontDPI == 0 ) + fontDPI = PixInsightSettings::GlobalInteger( "Application/FontResolution" ); + + /* + * If a valid font resolution is available, convert points to scaled pixels. + */ + if ( fontDPI > 0 ) + { + Array ptSections; + for ( size_type q = 0; ; q += 2 ) + { + q = cssCode.Find( "pt", q ); + if ( q == String::notFound ) + break; + size_type p = q; + while ( p > 0 && PCL_UI_IS_NUMBER_DIGIT( cssCode[p-1] ) ) + --p; + if ( p < q ) + ptSections.Add( PCL_UIStringSection( p, q ) ); + } + for ( const PCL_UIStringSection& s : ReverseIterable( ptSections ) ) + { + double pt; + if ( cssCode.Substring( s.pos, s.len ).TryToDouble( pt ) ) + cssCode.Replace( s.pos, s.len+2, String().Format( "%dpx", RoundInt( displayScalingFactor*pt*fontDPI/72 ) ) ); + } + } + } + + return cssCode; + +#undef PCL_UI_IS_NUMBER_DIGIT +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_UIScaling_h + +// ---------------------------------------------------------------------------- +// EOF pcl/UIScaling.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/UnidimensionalInterpolation.h b/3rdparty/include/pcl/UnidimensionalInterpolation.h new file mode 100644 index 0000000..5f6dfb8 --- /dev/null +++ b/3rdparty/include/pcl/UnidimensionalInterpolation.h @@ -0,0 +1,218 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/UnidimensionalInterpolation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_UnidimensionalInterpolation_h +#define __PCL_UnidimensionalInterpolation_h + +/// \file pcl/UnidimensionalInterpolation.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class UnidimensionalInterpolation + * \brief A generic interface to one-dimensional interpolation algorithms. + * + * %UnidimensionalInterpolation is an abstract base class for all + * one-dimensional interpolation algorithm implementations in PCL. + */ +template +class PCL_CLASS UnidimensionalInterpolation +{ +public: + + /*! + * Represents a vector of independent and dependent variable values. + */ + typedef GenericVector vector_type; + + /*! + * Constructs a %UnidimensionalInterpolation object. + */ + UnidimensionalInterpolation() = default; + + /*! + * Copy constructor. + */ + UnidimensionalInterpolation( const UnidimensionalInterpolation& ) = default; + + /*! + * Destroys a %UnidimensionalInterpolation object. + */ + virtual ~UnidimensionalInterpolation() + { + Clear(); + } + + /*! + * Initializes a new interpolation. + * + * \param x %Vector of x-values:\n + * \n + * \li If this vector is not empty: Must be a set of monotonically\n + * increasing, distinct values: x[0] < x[1] < ... < x[n-1].\n + * \li If this vector is empty: The interpolation will use implicit + * x[i] = i for i = {0,1,...,n-1}. + * + * \param y %Vector of function values for i = {0,1,...,n-1}. + */ + virtual void Initialize( const vector_type& x, const vector_type& y ) + { + if ( !y || x && x.Length() < y.Length() ) + throw Error( "Invalid vector length in UnidimensionalInterpolation::Initialize()" ); + m_x = x; + m_y = y; + } + + /*! + * Initializes a new interpolation. + * + * \param x %Array of x-values:\n + * \n + * \li If \a x != 0: Must be a list of monotonically increasing, + * distinct values: x[0] < x[1] < ... < x[n-1].\n + * \li If \a x == 0: The interpolation will use implicit + * x[i] = i for i = {0,1,...,n-1}. + * + * \param y %Array of function values for i = {0,1,...,n-1}. + * + * \param n Number of data points. The minimum number of required data + * points depends on the interpolation algorithm. In general, + * all algorithms require at least \a n >= 2. + * + * \deprecated This member function has been deprecated. For newly produced + * code, use Initialize( const vector_type&, const vector_type& ). + */ + void Initialize( const T* x, const T* y, int n ) + { + Initialize( vector_type( x, n ), vector_type( y, n ) ); + } + + /*! + * Returns an interpolated function value at \a x location. + */ + virtual double operator()( double x ) const = 0; + + /*! + * Clears auxiliary or intermediate interpolation data. Derived classes + * overriding this function should call their base class version via + * explicit downcast. + */ + virtual void Clear() + { + m_x.Clear(); + m_y.Clear(); + } + + /*! + * Returns true iff this interpolation is valid, i.e. if it has been + * correctly initialized and is ready to interpolate function values. + */ + virtual bool IsValid() const + { + return m_y; + } + + /*! + * Returns a reference to the x-value data vector. Returns an empty vector + * if this interpolation uses implicit x[i] = i for i = {0,1,...,n-1}. + */ + const vector_type& X() const + { + return m_x; + } + + /*! + * Returns a reference to the interpolated function value vector. + */ + const vector_type& Y() const + { + return m_y; + } + + /*! + * Returns true iff this interpolation uses implicit + * x[i] = i for i = {0,1,...,n-1}. + */ + bool UsingImplicitX() const + { + return !m_x && m_y; + } + + /*! + * Returns the length of the interpolated function value vector. + */ + int Length() const + { + return m_y.Length(); + } + +protected: + + vector_type m_x; // x-vector (empty if implicit grid x-values) + vector_type m_y; // y-vector +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_UnidimensionalInterpolation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/UnidimensionalInterpolation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/UnixSignalException.h b/3rdparty/include/pcl/UnixSignalException.h new file mode 100644 index 0000000..c6c9fb0 --- /dev/null +++ b/3rdparty/include/pcl/UnixSignalException.h @@ -0,0 +1,240 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/UnixSignalException.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_UnixSignalException_h +#define __PCL_UnixSignalException_h + +/// \file pcl/UnixSignalException.h + +#if defined( __PCL_WINDOWS ) || !defined( __PCL_LINUX ) && !defined( __PCL_FREEBSD ) && !defined( __PCL_MACOSX ) +# error UnixSignalException can only be used on Linux, FreeBSD and macOS platforms. +#endif + +#include + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class UnixSignalException + * \brief A UNIX synchronous signal handler that throws C++ exceptions. + * + * This class can only be used on Linux, FreeBSD and macOS platforms. On + * Windows platforms, including this header file from compilable code raises a + * compilation error. + * + * For this handler to work properly, all code that may raise synchronous + * signals (SIGSEGV and the like) must be compiled with GCC's + * '-fnon-call-exceptions' flag. Otherwise the exceptions will be thrown + * but terminate() will be called, which is the default critical signal + * management behavior. + * + * To generate a backtrace report (see the UnixSignalException::Details() + * member function), the code must be compiled with the '-rdynamic' GCC flag, + * which instructs the linker to add all symbols to the dynamic symbol table. + * In addition, the generated binaries should not be stripped with the '-s' + * linker flag. + */ +class PCL_CLASS UnixSignalException : public pcl::Exception +{ +public: + + /*! + * Constructs a new %UnixSignalException object with the specified \a signal + * number and optional backtrace \a details. + */ + UnixSignalException( int signal, const IsoString& details = IsoString() ) + : m_signal( signal ) + , m_details( details ) + { + } + + /*! + * Copy constructor. + */ + UnixSignalException( const UnixSignalException& ) = default; + + /*! + * Returns the signal number associated with this object. + */ + int SignalNumber() const + { + return m_signal; + } + + /*! + * Returns the backtrace information associated with this exception. + * + * The returned string will be empty if no backtrace data were available at + * the time this signal exception was generated. This happens when the code + * has not been compiled and linked with the appropriate options (see the + * -rdynamic compiler flag). + */ + const IsoString& Details() const + { + return m_details; + } + + /*! + * Returns an error or warning message corresponding to this signal + * exception. Typical messages are "segmentation violation", "bus error" and + * "floating point exception", returned by specific derived classes. + */ + String Message() const override + { + return "Undefined signal"; + } + + /*! + * Returns a formatted error message with information on this signal + * exception. + */ + String FormatInfo() const override + { + String info = String().Format( "Critical signal caught (%d): ", SignalNumber() ) + Message(); + if ( !m_details.IsEmpty() ) + { + info.Append( '\n' ); + info.Append( m_details ); + } + return info; + } + + /*! + * Returns the type of this exception, intended to be used as a caption for + * a message box. As reimplemented in this class, this member function + * returns the string "PCL Unix Signal Handler". + */ + String Caption() const override + { + return "PCL Unix Signal Handler"; + } + + /*! + * Writes a formatted representation of this exception on the platform + * console. A plain text version of the same textual representation will + * also be written on stdout. + * + * \note UNIX synchronous interrupts are never reported on interactive + * graphical interfaces, such as message boxes, irrespective of global + * platform settings or local settings defined through calls to + * EnableGUIOutput() and similar functions. + */ + void Show() const override; + + /*! + * Initializes the UNIX synchronous signal handler. This static member + * function must be called before the calling process can raise any + * synchronous signal. + * + * \note A module should never call this member function. It is invoked when + * appropriate by the PixInsight core application and internal PCL routines. + */ + static void Initialize(); + +protected: + + int m_signal; // signal number + IsoString m_details; // backtrace information +}; + +// ---------------------------------------------------------------------------- + +#define DECLARE_UNIX_SIGNAL_EXCEPTION( className, sigNum, message ) \ + class PCL_CLASS className : public pcl::UnixSignalException \ + { \ + public: \ + className( const IsoString& details = IsoString() ) : \ + pcl::UnixSignalException( sigNum, details ) \ + { \ + } \ + className( const className& ) = default; \ + String Message() const override \ + { \ + return message; \ + } \ + } + +// ---------------------------------------------------------------------------- + +DECLARE_UNIX_SIGNAL_EXCEPTION( EUnixSegmentationViolation, SIGSEGV, + "Segmentation violation" ); + +DECLARE_UNIX_SIGNAL_EXCEPTION( EUnixBusError, SIGBUS, + "Bus error" ); + +DECLARE_UNIX_SIGNAL_EXCEPTION( EUnixFloatingPointException, SIGFPE, + "Floating point exception" ); + +DECLARE_UNIX_SIGNAL_EXCEPTION( EUnixIllegalInstructionException, SIGILL, + "Illegal instruction" ); + +DECLARE_UNIX_SIGNAL_EXCEPTION( EUnixIBrokenPipeException, SIGPIPE, + "Broken pipe" ); + +// ---------------------------------------------------------------------------- + +#undef DECLARE_UNIX_SIGNAL_EXCEPTION + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_UnixSignalException_h + +// ---------------------------------------------------------------------------- +// EOF pcl/UnixSignalException.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Utility.h b/3rdparty/include/pcl/Utility.h new file mode 100644 index 0000000..a99abd4 --- /dev/null +++ b/3rdparty/include/pcl/Utility.h @@ -0,0 +1,705 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Utility.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Utility_h +#define __PCL_Utility_h + +/// \file pcl/Utility.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup utility_algorithms Utility Algorithms + * + * Template formal parameters: + * + * FI Forward iterator \n + * BI Bidirectional iterator \n + * RI Random access iterator \n + * UP Unary predicate \n + * BP Binary predicate \n + * T Item type \n + * F Function + */ + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the smaller of two objects \a a and \a b. Returns + * \a b if b < a. Returns \a a if a <= b. + * + * \ingroup utility_algorithms + */ +template inline constexpr +const T& Min( const T& a, const T& b ) noexcept +{ + return (b < a) ? b : a; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the smallest of two objects \a a and \a b, as + * specified by the binary predicate \a p. Returns \a b if p(b,a) is true; + * returns \a a otherwise. + * + * \ingroup utility_algorithms + */ +template inline +const T& Min( const T& a, const T& b, BP p ) noexcept( noexcept( p ) ) +{ + return p( b, a ) ? b : a; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the largest of two objects \a a and \a b. Returns + * \a b if a < b. Returns \a a if b <= a. + * + * \ingroup utility_algorithms + */ +template inline constexpr +const T& Max( const T& a, const T& b ) noexcept +{ + return (a < b) ? b : a; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the largest of two objects \a a and \a b, as + * specified by the binary predicate \a p. Returns \a b if p(a,b) is true; + * returns \a a otherwise. + * + * \ingroup utility_algorithms + */ +template inline +const T& Max( const T& a, const T& b, BP p ) noexcept( noexcept( p ) ) +{ + return p( a, b ) ? b : a; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the median of three objects \a a, \a b and \a c: + * + * \li \a a if (c <= a < b) || (b <= a < c) + * \li \a b if (a < b < c) || (c <= b <= a) + * \li \a c if (a < c < b) || (b < c <= a) + * + * \ingroup utility_algorithms + */ +template inline constexpr +const T& Median( const T& a, const T& b, const T& c ) noexcept +{ + return (a < b) ? ((b < c) ? b : ((a < c) ? c : a)) : + ((a < c) ? a : ((b < c) ? c : b)); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the median of three objects \a a, \a b and \a c, as + * specified by the binary predicate \a p: + * + * \li \a a if p(a,b) && !p(b,c) && !p(a,c) || !p(a,b) && p(a,c) + * \li \a b if p(a,b) && p(b,c) || !p(a,b) && !p(a,c) && !p(b,c) + * \li \a c if p(a,b) && !p(b,c) && p(a,c) || !p(a,b) && !p(a,c) && p(b,c) + * + * \ingroup utility_algorithms + */ +template inline +const T& Median( const T& a, const T& b, const T& c, BP p ) noexcept( noexcept( p ) ) +{ + return p( a, b ) ? (p( b, c ) ? b : (p( a, c ) ? c : a)) : + (p( a, c ) ? a : (p( b, c ) ? c : b)); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the specified object \a x, if and only if it belongs + * to the range [a,b]. Returns a reference to the nearest range bounding object + * otherwise. Returns: + * + * \li \a x if (a <= x <= b) + * \li \a a if (x < a) + * \li \a b if (b < x) + * + * \ingroup utility_algorithms + */ +template inline constexpr +const T& Range( const T& x, const T& a, const T& b ) noexcept +{ + PCL_PRECONDITION( a < b ) + return (x < a) ? a : ((b < x) ? b : x); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a reference to the specified object \a x, if and only if it belongs + * to the range [a,b], as specified by the binary predicate \a p. Returns a + * reference to the nearest range bounding object otherwise. Returns: + * + * \li \a x if !p(x,a) && !p(b,x) + * \li \a a if p(x,a) + * \li \a b if p(b,x) + * + * \ingroup utility_algorithms + */ +template inline +const T& Range( const T& x, const T& a, const T& b, BP p ) noexcept( noexcept( p ) ) +{ + PCL_PRECONDITION( p( a, b ) ) + return p( x, a ) ? a : (p( b, x ) ? b : x); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the number of elements in the specified C array \a a. + * + * \ingroup utility_algorithms + */ +#define ItemsInArray( a ) (sizeof( a )/sizeof( *a )) + +// ---------------------------------------------------------------------------- + +/*! + * Exchanges two objects \a a and \a b. + * + * \ingroup utility_algorithms + */ +template inline +void Swap( T& a, T& b ) noexcept( std::is_nothrow_copy_constructible::value + && std::is_nothrow_copy_assignable::value + && std::is_nothrow_move_assignable::value ) +{ + T c( a ); a = b; b = std::move( c ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Applies a unary function \a f to the range [i,j). For each iterator t in the + * range [i,j) this function performs the function call f(*t). + * + * \ingroup utility_algorithms + */ +template inline +void Apply( FI i, FI j, F f ) noexcept( noexcept( f ) ) +{ + for( ; i != j; ++i ) + f( *i ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Applies a binary function \a f to the range [i,j) with the specified + * right-hand constant argument \a x. For each iterator t in the range [i,j) + * this function performs the function call f(*t,x). + * + * \ingroup utility_algorithms + */ +template inline +void Apply( FI i, FI j, F f, T1 x ) noexcept( noexcept( f ) ) +{ + for( ; i != j; ++i ) + f( *i, x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Applies a unary function \a f to those elements in the range [i,j) that + * satisfy a condition given by a unary predicate \a p. For each iterator t in + * the range [i,j) this function performs the function call f(*t) if and only + * if p(*t) is true. + * + * \ingroup utility_algorithms + */ +template inline +void ApplyIf( FI i, FI j, F f, UP p ) noexcept( noexcept( f ) && noexcept( p ) ) +{ + for( ; i != j; ++i ) + if ( p( *i ) ) + f( *i ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Applies a unary function \a f to those elements in the range [i,j) that + * satisfy a condition given by a unary predicate \a p, with right-hand + * constant argument \a x. For each iterator t in the range [i,j) this function + * performs the function call f(*t,x) if and only if p(*t) is true. + * + * \ingroup utility_algorithms + */ +template inline +void ApplyIf( FI i, FI j, F f, UP p, T1 x ) noexcept( noexcept( f ) && noexcept( p ) ) +{ + for( ; i != j; ++i ) + if ( p( *i ) ) + f( *i, x ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the first iterator t in the range [i,j) such that the specified + * unary predicate p(*t) is true, or j if no such iterator exists. + * + * \ingroup utility_algorithms + */ +template inline +FI FirstThat( FI i, FI j, UP p ) noexcept( noexcept( p ) ) +{ + for ( ; i != j; ++i ) + if ( p( *i ) ) + break; + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the first iterator t in the range [i,j) such that the specified + * unary predicate p(*t,x) is true, or j if no such iterator exists. + * + * \ingroup utility_algorithms + */ +template inline +FI FirstThat( FI i, FI j, UP p, T1 x ) noexcept( noexcept( p ) ) +{ + for ( ; i != j; ++i ) + if ( p( *i, x ) ) + break; + return i; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the last iterator t in the range [i,j) such that the specified + * unary predicate p(*t) is true, or j if no such iterator exists. + * + * \ingroup utility_algorithms + */ +template inline +BI LastThat( BI i, BI j, UP p ) noexcept( noexcept( p ) ) +{ + for ( BI k = j; i != k; ) + if ( p( *--k ) ) + return k; + return j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the last iterator t in the range [i,j) such that the specified + * unary predicate p(*t,x) is true, or j if no such iterator exists. + * + * \ingroup utility_algorithms + */ +template inline +BI LastThat( BI i, BI j, UP p, T1 x ) noexcept( noexcept( p ) ) +{ + for ( BI k = j; i != k; ) + if ( p( *--k, x ) ) + return k; + return j; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the total number of objects in the range [i,j) that are equal to + * the specified constant object \a v. + * + * \ingroup utility_algorithms + */ +template inline +size_type Count( FI i, FI j, const T& v ) noexcept +{ + size_type N = 0; + for( ; i != j; ++i ) + if ( *i == v ) + ++N; + return N; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the total number of objects in the range [i,j) that are equal to + * a constant object \a v, as specified by the binary predicate \a p. For each + * iterator t in the range [i,j), counts the number of objects for which + * p(*t,v) is true. + * + * \ingroup utility_algorithms + */ +template inline +size_type Count( FI i, FI j, const T& v, BP p ) noexcept( noexcept( p ) ) +{ + size_type N = 0; + for( ; i != j; ++i ) + if ( p( *i, v ) ) + ++N; + return N; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the total number of objects in the range [i,j) that satisfy a + * condition given by a unary predicate \a p. For each iterator t in the range + * [i,j), counts the number of objects for which p(*t) is true. + * + * \ingroup utility_algorithms + */ +template inline +size_type CountIf( FI i, FI j, UP p ) noexcept( noexcept( p ) ) +{ + size_type N = 0; + for( ; i != j; ++i ) + if ( p( *i ) ) + ++N; + return N; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns an iterator m in the range [i,j) such that *m <= *t for any t != m + * in [i,j). Returns j if and only if i == j. + * + * \ingroup utility_algorithms + */ +template inline +FI MinItem( FI i, FI j ) noexcept +{ + FI k = i; + if ( i != j ) + while ( ++i != j ) + if ( *i < *k ) + k = i; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns an iterator m in the range [i,j) such that p(*t,*m) is false for any + * t != m in [i,j). Returns j if and only if i == j. + * + * \ingroup utility_algorithms + */ +template inline +FI MinItem( FI i, FI j, BP p ) noexcept( noexcept( p ) ) +{ + FI k = i; + if ( i != j ) + while ( ++i != j ) + if ( p( *i, *k ) ) + k = i; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns an iterator m in the range [i,j) such that *m >= *t for any t != m + * in [i,j). Returns j if and only if i == j. + * + * \ingroup utility_algorithms + */ +template inline +FI MaxItem( FI i, FI j ) noexcept +{ + FI k = i; + if ( i != j ) + while ( ++i != j ) + if ( *k < *i ) + k = i; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns an iterator m in the range [i,j) such that p(*m,*t) is false for any + * t != m in [i,j). Returns j if and only if i == j. + * + * \ingroup utility_algorithms + */ +template inline +FI MaxItem( FI i, FI j, BP p ) noexcept( noexcept( p ) ) +{ + FI k = i; + if ( i != j ) + while ( ++i != j ) + if ( p( *k, *i ) ) + k = i; + return k; +} + +// ---------------------------------------------------------------------------- + +/*! + * Finds two iterators n and m in the range [i,j) such that *n <= *u for any + * u != n in [i,j) and *m >= *v for any v != m in [i,j). + * + * \ingroup utility_algorithms + */ +template inline +void FindExtremeItems( FI& kmin, FI& kmax, FI i, FI j ) noexcept +{ + kmin = kmax = i; + if ( i != j ) + while ( ++i != j ) + { + if ( *i < *kmin ) + kmin = i; + if ( *kmax < *i ) + kmax = i; + } +} + +// ---------------------------------------------------------------------------- + +/*! + * Finds two iterators n and m in the range [i,j) such that p(*u,*n) is false + * for any u != n in [i,j) and p(*m,*v) is false for any v != m in [i,j). + * + * \ingroup utility_algorithms + */ +template inline +void FindExtremeItems( FI& kmin, FI& kmax, FI i, FI j, BP p ) noexcept( noexcept( p ) ) +{ + kmin = kmax = i; + if ( i != j ) + while ( ++i != j ) + { + if ( p( *i, *kmin ) ) + kmin = i; + if ( p( *kmax, *i ) ) + kmax = i; + } +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a tuple {i,j} such that *i != *j, where i >= i1 and j is in the + * range [i2,j2), or a tuple {i>=i1,j2} if no such j exists. + * + * \ingroup utility_algorithms + */ +template inline +Association FindNotEqual( FI1 i1, FI2 i2, FI2 j2 ) noexcept +{ + for ( ; i2 != j2 && *i1 == *i2; ++i1, ++i2 ) {} + return Associate( i1, i2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns a tuple {i,j} such that p(*i,*j) is false, where i >= i1 and j is in + * the range [i2,j2), or a tuple {i>=i1,j2} if no such j exists. + * + * \ingroup utility_algorithms + */ +template inline +Association FindNotEqual( FI1 i1, FI2 i2, FI2 j2, BP p ) noexcept +{ + for ( ; i2 != j2 && p( *i1, *i2 ); ++i1, ++i2 ) {} + return Associate( i1, i2 ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff the objects in the range [i1,j1) are equal to the + * corresponding objects in the range [i2,j2), with + * j1 = Advance(i1,Distance(i2,j2)). + * + * \ingroup utility_algorithms + */ +template inline +bool Equal( FI1 i1, FI2 i2, FI2 j2 ) noexcept +{ + return FindNotEqual( i1, i2, j2 ).second == j2; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns true iff the objects in the range [i1,j1) satisfy the condition + * specified by the binary predicate \a p for the corresponding objects in the + * range [i2,j2), with j1 = Advance(i1,Distance(i2,j2)). + * + * \ingroup utility_algorithms + */ +template inline +bool Equal( FI1 i1, FI2 i2, FI2 j2, BP p ) noexcept( noexcept( p ) ) +{ + return FindNotEqual( i1, i2, j2, p ).second == j2; +} + +// ---------------------------------------------------------------------------- + +/*! + * Performs a comparison of the objects in the ranges [i1,j1) and [i2,j2). + * Returns the result of the comparison encoded as an integer: + * + * Returns 0 if: + * + * \li (1) Distance(i1,j1) == Distance(i2,j2). + * \li (2) For each pair {u,v} of iterators such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v), *u == *v. + * + * Returns -1 if: + * + * \li (3) A pair {u,v} of iterators exists such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v) and *u < *v. + * \li (4) Condition (2) is true and Distance(i1,j1) < Distance(i2,j2). + * + * Returns +1 if: + * + * \li (5) A pair {u,v} of iterators exists such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v) and *v < *u. + * \li (6) Condition (2) is true and Distance(i1,j1) > Distance(i2,j2). + * + * \ingroup utility_algorithms + */ +template inline +int Compare( FI1 i1, FI1 j1, FI2 i2, FI2 j2 ) noexcept +{ + for ( ; ; ++i1, ++i2 ) + { + if ( i1 == j1 ) + return (i2 == j2) ? 0 : -1; + if ( i2 == j2 ) + return +1; + if ( *i1 < *i2 ) + return -1; + if ( *i2 < *i1 ) + return +1; + } +} + +// ---------------------------------------------------------------------------- + +/*! + * Performs a comparison of the objects in the ranges [i1,j1) and [i2,j2) as + * specified by a binary predicate \a p. Returns the result of the comparison + * encoded as an integer: + * + * Returns 0 if: + * + * \li (1) Distance(i1,j1) == Distance(i2,j2). + * \li (2) For each pair {u,v} of iterators such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v), both p(*u,*v) and p(*v,*u) are + * false. + * + * Returns -1 if: + * + * \li (3) A pair {u,v} of iterators exists such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v) and p(*u,*v) is true. + * \li (4) Condition (2) is true and Distance(i1,j1) < Distance(i2,j2). + * + * Returns +1 if: + * + * \li (5) A pair {u,v} of iterators exists such that u in [i1,j1) and v in + * [i2,j2) and Distance(i1,u) == Distance(i2,v) and p(*v,*u) is true. + * \li (6) Condition (2) is true and Distance(i1,j1) > Distance(i2,j2). + * + * \ingroup utility_algorithms + */ +template inline +int Compare( FI1 i1, FI1 j1, FI2 i2, FI2 j2, BP p ) noexcept( noexcept( p ) ) +{ + for ( ; ; ++i1, ++i2 ) + { + if ( i1 == j1 ) + return (i2 == j2) ? 0 : -1; + if ( i2 == j2 ) + return +1; + if ( p( *i1, *i2 ) ) + return -1; + if ( p( *i2, *i1 ) ) + return +1; + } +} + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Utility_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Utility.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/VariableShapeFilter.h b/3rdparty/include/pcl/VariableShapeFilter.h new file mode 100644 index 0000000..75178f3 --- /dev/null +++ b/3rdparty/include/pcl/VariableShapeFilter.h @@ -0,0 +1,531 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/VariableShapeFilter.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_VariableShapeFilter_h +#define __PCL_VariableShapeFilter_h + +/// \file pcl/VariableShapeFilter.h + +#include + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class VariableShapeFilter + * \brief A kernel filter with variable kurtosis. + * + * A %VariableShapeFilter object is a specialized KernelFilter whose elements + * are calculated as a discrete representation of the following elliptical + * function centered at the origin: + * + * G(x,y) = Exp( -( x^k/(k*sx^k) + y^k/(k*sy^k) ) ) + * + * where sx and sy are the standard deviations of the filter distribution on + * the horizontal and vertical axes, respectively, and k is a shape + * parameter controlling the kurtosis of the filter function. When k < 2 + * the distribution is leptokurtic (peaked), while k > 2 leads to a platykurtic + * (flat) distribution. When k = 2 the distribution is normal (Gaussian) and + * the %VariableShapeFilter is equivalent to a GaussianFilter object with the + * same standard deviations. + * + * %VariableShapeFilter also supports arbitrary rotation around the origin. + * When the filter is rotated, the coordinates x, y in the equation above are + * replaced by their rotated counterparts. + * + * A %VariableShapeFilter instance is formally defined by the following set of + * parameters: + * + * + * + * + * + * + * + *
\e sigma Standard deviation of the filter distribution on the X axis (sigma > 0).
\e shape Filter shape: 2 = Gaussian, < 2 = leptokurtic, > 2 = platykurtic (shape > 0).
\e rho The ratio sy/sx (see equation above) of the generated filter distribution (0 ≤ rho ≤ 1).
\e theta Rotation angle of the horizontal axis in radians (0 ≤ theta < PI). This parameter only makes sense when rho < 1.
\e epsilon Maximum truncation error of the computed filter coefficients (eps > 0).
+ * + * \sa KernelFilter, GaussianFilter, MoffatFilter, LinearFilter + */ +class PCL_CLASS VariableShapeFilter : public KernelFilter +{ +public: + + /*! + * Constructs an empty %VariableShapeFilter object with default functional + * parameters: sigma=2, shape=2, epsilon=0.01, rho=1, theta=0. + */ + VariableShapeFilter() = default; + + /*! + * Constructs a %VariableShapeFilter object given the standard deviation + * \a sigma > 0, \a shape > 0, and coefficient truncation \a epsilon > 0. + * Assigns an optional \a name to the new filter object. + */ + VariableShapeFilter( float sigma, float shape = 2, float epsilon = 0.01, const String& name = String() ) + { + Initialize( sigma, shape, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %VariableShapeFilter object given the standard deviation + * \a sigma > 0, \a shape > 0, coefficient truncation error \a epsilon > 0, + * aspect ratio 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in + * radians. Assigns an optional \a name to the new filter object. + */ + VariableShapeFilter( float sigma, float shape, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( sigma, shape, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Constructs a %VariableShapeFilter object given the odd kernel size + * \a n >= 3, \a shape > 0, and coefficient truncation error \a epsilon > 0. + * Assigns an optional \a name to the new filter object. + */ + VariableShapeFilter( int n, float shape = 2, float epsilon = 0.01, const String& name = String() ) + { + Initialize( n, shape, epsilon, 1, 0 ); + Rename( name ); + } + + /*! + * Constructs a %VariableShapeFilter object given the odd kernel size + * \a n >= 3, \a shape > 0, coefficient truncation \a epsilon > 0, aspect + * ratio 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in + * radians. Assigns an optional \a name to the new filter object. + */ + VariableShapeFilter( int n, float shape, float epsilon, float rho, float theta = 0, const String& name = String() ) + { + Initialize( n, shape, epsilon, rho, theta ); + Rename( name ); + } + + /*! + * Copy constructor. + */ + VariableShapeFilter( const VariableShapeFilter& ) = default; + + /*! + * Move constructor. + */ + VariableShapeFilter( VariableShapeFilter&& ) = default; + + /*! + * Returns a pointer to a dynamically allocated duplicate of this kernel + * filter. + */ + KernelFilter* Clone() const override + { + return new VariableShapeFilter( *this ); + } + + /*! + * Returns a separable filter equivalent to this %VariableShapeFilter + * object. + * + * A %VariableShapeFilter is separable when it represents an undistorted + * Gaussian distribution. This is only true when shape=2 and the filter is + * circular (rho=1). Otherwise an empty SeparableFilter object is returned + * because this filter is not separable. + */ + SeparableFilter AsSeparableFilter( float tolerance = __PCL_DEFAULT_FILTER_SEPARABILITY_TOLERANCE ) const override + { + if ( m_shape == 2 && m_rho == 1 ) + { + FVector v = coefficients.RowVector( Size()>>1 ); + return SeparableFilter( v, v ); + } + return SeparableFilter(); + } + + /*! + * Returns true iff this filter is separable. + * + * A %VariableShapeFilter is separable only when it represents an + * undistorted Gaussian distribution. This is only true when shape=2 and the + * filter is circular (rho=1). + */ + bool IsSeparable() const override + { + return m_shape == 2 && m_rho == 1; + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + VariableShapeFilter& operator =( const VariableShapeFilter& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + VariableShapeFilter& operator =( VariableShapeFilter&& ) = default; + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + */ + float SigmaX() const + { + return m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the Y + * (vertical) axis. + */ + float SigmaY() const + { + return m_rho*m_sigma; + } + + /*! + * Returns the standard deviation of the filter distribution on the X + * (horizontal) axis. + * + * This function is an alias to SigmaX(). + */ + float Sigma() const + { + return SigmaX(); + } + + /*! + * Returns the \e shape parameter of this %VariableShapeFilter object. The + * shape parameter controls the kurtosis of the filter distribution: + * + * + * + * + * + *
shape \< 2 Leptokurtic distribution
shape = 2 Normal (Gaussian) distribution
shape \> 2 Platykurtic distribution
+ */ + float Shape() const + { + return m_shape; + } + + /*! + * Returns the maximum truncation error of calculated filter coefficients. + */ + float Truncation() const + { + return m_epsilon; + } + + /*! + * Returns the aspect ratio of the filter distribution. This is the ratio + * vertical:horizontal between filter axes in the range [0,1]. + */ + float AspectRatio() const + { + return m_rho; + } + + /*! + * Returns the rotation angle of the filter distribution. This is the + * rotation angle in radians with respect to the central pixel, in the + * range [0,+PI]. + */ + float RotationAngle() const + { + return m_theta; + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * horizontal axis of the elliptical filter distribution. + */ + double FWHMx() const + { + return 2 * m_sigma * Pow( m_shape*0.6931471805599453, 1.0/m_shape ); + + } + + /*! + * Returns the full width at half maximum (FWHM), in sigma units, for the + * vertical axis of the elliptical filter distribution. + */ + double FWHMy() const + { + return m_rho * FWHMx(); + + } + + /*! + * Returns the full width at half maximum, in sigma units, for the + * horizontal axis of the elliptical filter distribution. + * + * This function is an alias to FWHMx(). + */ + double FWHM() const + { + return FWHMx(); + } + + /*! + * Recalculates filter coefficients for the specified \a sigma > 0, + * \a shape > 0, coefficient truncation error \a epsilon > 0, aspect ratio + * 0 <= \a rho <= 1, and rotation angle 0 <= \a theta <= PI in radians. + */ + void Set( float sigma, float shape, float epsilon, float rho, float theta ) + { + Initialize( sigma, shape, epsilon, rho, theta ); + } + + /*! + * Recalculates filter coefficients for the specified \a sigma > 0, + * \a shape > 0, coefficient truncation error \a epsilon > 0, and aspect + * ratio 0 <= \a rho <= 1. Does not change the current rotation angle. + */ + void Set( float sigma, float shape, float epsilon, float rho ) + { + Initialize( sigma, shape, epsilon, rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified \a sigma > 0, + * \a shape > 0, and coefficient truncation error \a epsilon > 0. Does not + * change the current aspect ratio and rotation angle. + */ + void Set( float sigma, float shape, float epsilon ) + { + Initialize( sigma, shape, epsilon, m_rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified \a sigma > 0 and + * \a shape > 0. Coefficient truncation, aspect ratio and rotation angle are + * not changed. + */ + void Set( float sigma, float shape ) + { + Initialize( sigma, shape, m_epsilon, m_rho, m_theta ); + } + + /*! + * Recalculates filter coefficients for the specified \a sigma > 0. The + * current shape, coefficient truncation error, aspect ratio and rotation + * angle are not changed. + */ + void Set( float sigma ) + { + Initialize( sigma, m_shape, m_epsilon, m_rho, m_theta ); + } + + /*! + * This is a convenience member function, equivalent to Set( sigma ). + */ + void SetSigma( float sigma ) + { + Set( sigma ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), shape ). + */ + void SetShape( float shape ) + { + Set( m_sigma, shape ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Shape(), epsilon ). + */ + void SetTruncation( float epsilon ) + { + Set( m_sigma, m_shape, epsilon ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Shape(), Truncation(), rho ). + */ + void SetAspectRatio( float rho ) + { + Set( m_sigma, m_shape, m_epsilon, rho ); + } + + /*! + * This is a convenience member function, equivalent to + * Set( Sigma(), Shape(), Truncation(), AspectRatio(), theta ). + */ + void SetRotationAngle( float theta ) + { + Set( m_sigma, m_shape, m_epsilon, m_rho, theta ); + } + + /*! + * Recalculates filter coefficients for the given odd kernel size \a n >= 3. + * This routine computes the required standard deviation to sample the + * filter function on a matrix of the specified size, preserving the + * current shape, coefficient truncation, aspect ratio and rotation angle. + */ + void Resize( int n ) override + { + Initialize( n, m_shape, m_epsilon, m_rho, m_theta ); + } + +private: + + float m_sigma = 2.0F; // standard deviation, horizontal axis + float m_shape = 2.0F; // controls the kurtosis of the filter distribution (2=normal) + float m_rho = 1.0F; // vertical:horizontal axes ratio + float m_theta = 0.0F; // rotation angle in radians, [0,+pi] + float m_epsilon = 0.01F; // maximum truncation error in sigma units + + void Initialize( float s, float k, float e, float r, float a ) + { + PCL_PRECONDITION( s > 0 ) + PCL_PRECONDITION( k > 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + m_sigma = s; + m_shape = k; + m_epsilon = Abs( e ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + KernelFilter::Resize( 1 + (Max( 1, RoundInt( Pow( -m_shape*Pow( m_sigma, m_shape )*Ln( m_epsilon ), 1/m_shape ) ) ) << 1) ); + Rebuild(); + } + + void Initialize( int n, float k, float e, float r, float a ) + { + PCL_PRECONDITION( n == 0 || n >= 3 && (n & 1) != 0 ) + PCL_PRECONDITION( k > 0 ) + PCL_PRECONDITION( e > 0 ) + PCL_PRECONDITION( r >= 0 && r <= 1 ) + PCL_PRECONDITION( a >= 0 && a <= Const::pi() ) + KernelFilter::Resize( n ); + m_shape = k; + m_epsilon = Abs( e ); + m_sigma = (Size() >> 1)/Pow( -m_shape*Ln( m_epsilon ), 1/m_shape ); + m_rho = Range( r, 0.0F, 1.0F ); + m_theta = Range( a, 0.0F, Const::pi() ); + Rebuild(); + } + + void Rebuild() + { + int size = Size(); + if ( size == 0 ) + return; + + float* h = *coefficients; + float rk = m_shape * Pow( m_sigma, m_shape ); + + for ( int n2 = size >> 1, y = -n2; y <= n2; ++y ) + if ( y > 0 ) + for ( int x = 0; x < size; ++x, ++h ) + *h = *(h - ((y+y)*size)); + else + for ( int x = -n2; x <= n2; ++x, ++h ) + *h = (x > 0) ? *(h - (x+x)) : float( Exp( -Pow( Sqrt( float( x*x + y*y ) ), m_shape )/rk ) ); + + if ( m_rho != 1 ) + { + BicubicPixelInterpolation B; + + { + coefficient_matrix ctemp( coefficients ); + ctemp.EnsureUnique(); // because we need invariant *ctemp for interpolation + AutoPointer > + interpolator( B.NewInterpolator( *ctemp, size, size ) ); + h = *coefficients; + float r = Max( 0.5F/size, m_rho ); + for ( int n2 = size >> 1, i = -n2; i <= n2; ++i ) + { + float y = float( i )/r + n2; + for ( int x = 0; x < size; ++x ) + *h++ = (y < 0 || y >= size) ? 0.0F : (*interpolator)( float( x ), y ); + } + } + + if ( m_theta != 0 ) + { + coefficient_matrix ctemp( coefficients ); + ctemp.EnsureUnique(); // because we need invariant *ctemp for interpolation + AutoPointer > + interpolator( B.NewInterpolator( *ctemp, size, size ) ); + h = *coefficients; + float sa, ca; + SinCos( -m_theta, sa, ca ); + for ( int n2 = size >> 1, i = -n2; i <= n2; ++i ) + for ( int j = -n2; j <= n2; ++j ) + { + float x = ca*j + sa*i + n2; + float y = -sa*j + ca*i + n2; + *h++ = (x < 0 || y < 0 || x >= size || y >= size) ? 0.0F : (*interpolator)( x, y ); + } + } + } + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_VariableShapeFilter_h + +// ---------------------------------------------------------------------------- +// EOF pcl/VariableShapeFilter.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Variant.h b/3rdparty/include/pcl/Variant.h new file mode 100644 index 0000000..683bce3 --- /dev/null +++ b/3rdparty/include/pcl/Variant.h @@ -0,0 +1,1900 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Variant.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Variant_h +#define __PCL_Variant_h + +/// \file pcl/Variant.h + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::VariantType + * \brief %Variant data types. + * + * Currently %Variant supports the following data types: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
VariantType::Invalid Symbolic value used to denote an invalid, undefined or unavailable property.
VariantType::Bool A Boolean value, equivalent to the \c bool C++ type.
VariantType::Boolean A synonym for VariantType::Bool.
VariantType::Int8 Signed 8-bit integer (int8).
VariantType::Char A synonym for VariantType::Int8.
VariantType::Int16 Signed 16-bit integer (int16).
VariantType::Short A synonym for VariantType::Int16.
VariantType::Int32 Signed 32-bit integer (int32).
VariantType::Integer A synonym for VariantType::Int32.
VariantType::Int64 Signed 64-bit integer (int64).
VariantType::UInt8 Unsigned 8-bit integer (uint8).
VariantType::Byte A synonym for VariantType::UInt8.
VariantType::UInt16 Unsigned 16-bit integer (uint16).
VariantType::UShort A synonym for VariantType::UInt16.
VariantType::UInt32 Unsigned 32-bit integer (uint32).
VariantType::UInt A synonym for VariantType::UInt32.
VariantType::UInt64 Unsigned 64-bit integer (uint64).
VariantType::Float32 32-bit floating point real value (\c float).
VariantType::Float A synonym for VariantType::Float32.
VariantType::Float64 64-bit floating point real value (\c float).
VariantType::Double A synonym for VariantType::Float64.
VariantType::Real A synonym for VariantType::Double.
VariantType::Complex32 32-bit floating point complex value (fcomplex).
VariantType::FComplex A synonym for VariantType::Complex32.
VariantType::Complex64 64-bit floating point complex value (dcomplex).
VariantType::DComplex A synonym for VariantType::Complex64.
VariantType::Complex A synonym for VariantType::DComplex.
VariantType::TimePoint A time point value (TimePoint).
VariantType::I32Point Two-dimensional point with 32-bit integer coordinates (Point).
VariantType::Point A synonym for VariantType::I32Point.
VariantType::F32Point Two-dimensional point with 32-bit floating point coordinates (FPoint).
VariantType::FPoint A synonym for VariantType::F32Point.
VariantType::F64Point Two-dimensional point with 64-bit floating point coordinates (DPoint).
VariantType::DPoint A synonym for VariantType::F64Point.
VariantType::I32Rect Rectangle with 32-bit integer coordinates (Rect).
VariantType::Rect A synonym for VariantType::I32Rect.
VariantType::F32Rect Rectangle with 32-bit floating point coordinates (FRect).
VariantType::FRect A synonym for VariantType::F32Rect.
VariantType::F64Rect Rectangle with 64-bit floating point coordinates (DRect).
VariantType::DRect A synonym for VariantType::F64Rect.
VariantType::I8Vector Vector of 8-bit signed integer components (I8Vector).
VariantType::CharVector A synonym for VariantType::I8Vector
VariantType::UI8Vector Vector of 8-bit unsigned integer components (UI8Vector).
VariantType::ByteVector A synonym for VariantType::UI8Vector
VariantType::I16Vector Vector of 16-bit signed integer components (I16Vector).
VariantType::UI16Vector Vector of 16-bit unsigned integer components (UI16Vector).
VariantType::I32Vector Vector of 32-bit signed integer components (I32Vector).
VariantType::IVector A synonym for VariantType::I32Vector
VariantType::UI32Vector Vector of 32-bit unsigned integer components (UI32Vector).
VariantType::UIVector A synonym for VariantType::UI32Vector
VariantType::I64Vector Vector of 64-bit signed integer components (I64Vector).
VariantType::UI64Vector Vector of 64-bit unsigned integer components (UI64Vector).
VariantType::F32Vector Vector of 32-bit floating point real components (F32Vector).
VariantType::FVector A synonym for VariantType::F32Vector
VariantType::F64Vector Vector of 64-bit floating point real components (F64Vector).
VariantType::DVector A synonym for VariantType::F64Vector
VariantType::C32Vector Vector of 32-bit floating point complex components (C32Vector).
VariantType::C64Vector Vector of 64-bit floating point complex components (C64Vector).
VariantType::I8Matrix Matrix of 8-bit signed integer elements (I8Matrix).
VariantType::CharMatrix A synonym for VariantType::I8Matrix
VariantType::UI8Matrix Matrix of 8-bit unsigned integer elements (UI8Matrix).
VariantType::ByteMatrix A synonym for VariantType::UI8Matrix
VariantType::I16Matrix Matrix of 16-bit signed integer elements (I16Matrix).
VariantType::UI16Matrix Matrix of 16-bit unsigned integer elements (UI16Matrix).
VariantType::I32Matrix Matrix of 32-bit signed integer elements (I32Matrix).
VariantType::IMatrix A synonym for VariantType::I32Matrix
VariantType::UI32Matrix Matrix of 32-bit unsigned integer elements (UI32Matrix).
VariantType::UIMatrix A synonym for VariantType::UI32Matrix
VariantType::I64Matrix Matrix of 64-bit signed integer elements (I64Matrix).
VariantType::UI64Matrix Matrix of 64-bit unsigned integer elements (UI64Matrix).
VariantType::F32Matrix Matrix of 32-bit floating point real elements (F32Matrix).
VariantType::FMatrix A synonym for VariantType::F32Matrix
VariantType::F64Matrix Matrix of 64-bit floating point real elements (F64Matrix).
VariantType::DMatrix A synonym for VariantType::F64Matrix
VariantType::C32Matrix Matrix of 32-bit floating point complex elements (C32Matrix).
VariantType::C64Matrix Matrix of 64-bit floating point complex elements (C64Matrix).
VariantType::ByteArray Dynamic array of unsigned 8-bit integers (ByteArray).
VariantType::String UTF-16 Unicode string (String).
VariantType::IsoString 8-bit ISO/IEC 8859-1 or UTF-8 Unicode string (IsoString).
VariantType::StringList Dynamic list of UTF-16 Unicode strings (StringList).
VariantType::IsoStringList Dynamic list of 8-bit strings (IsoStringList).
VariantType::StringKeyValue Key/value pair of UTF-16 Unicode strings (StringKeyValue).
VariantType::IsoStringKeyValue Key/value pair of 8-bit strings (IsoStringKeyValue).
VariantType::StringKeyValueList Dynamic list of key/value pairs of UTF-16 Unicode strings (StringKeyValueList).
VariantType::IsoStringKeyValueList Dynamic list of key/value pairs of 8-bit strings (IsoStringKeyValueList).
+ */ +namespace VariantType +{ + enum value_type + { + Invalid = 0, + + Bool, + Boolean = Bool, + + Int8, + Char = Int8, + Int16, + Short = Int16, + Int32, + Integer = Int32, + Int64, + + UInt8, + Byte = UInt8, + UInt16, + UShort = UInt16, + UInt32, + UInt = UInt32, + UInt64, + + Float32, + Float = Float32, + Float64, + Double = Float64, + Real = Double, + + Complex32, + FComplex = Complex32, + Complex64, + DComplex = Complex64, + Complex = DComplex, + + TimePoint, + + I32Point, + Point = I32Point, + F32Point, + FPoint = F32Point, + F64Point, + DPoint = F64Point, + + I32Rect, + Rect = I32Rect, + F32Rect, + FRect = F32Rect, + F64Rect, + DRect = F64Rect, + + I8Vector, + CharVector = I8Vector, + UI8Vector, + ByteVector = UI8Vector, + I16Vector, + UI16Vector, + I32Vector, + IVector = I32Vector, + UI32Vector, + UIVector = UI32Vector, + I64Vector, + UI64Vector, + F32Vector, + FVector = F32Vector, + F64Vector, + DVector = F64Vector, + C32Vector, + C64Vector, + + I8Matrix, + CharMatrix = I8Matrix, + UI8Matrix, + ByteMatrix = UI8Matrix, + I16Matrix, + UI16Matrix, + I32Matrix, + IMatrix = I32Matrix, + UI32Matrix, + UIMatrix = UI32Matrix, + I64Matrix, + UI64Matrix, + F32Matrix, + FMatrix = F32Matrix, + F64Matrix, + DMatrix = F64Matrix, + C32Matrix, + C64Matrix, + + ByteArray, + + String, + IsoString, + + StringList, + IsoStringList, + + StringKeyValue, + IsoStringKeyValue, + + StringKeyValueList, + IsoStringKeyValueList, + + NumberOfVariantTypes, + + FirstCustomType = 1024 + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class Variant + * \brief Acts like a union to store instances of different data types. + * + * Sometimes you have to implement a single class or function able to work with + * several data types. In C++ and other languages supporting template + * metaprogramming, the obvious way to implement this functionality is by using + * class or function templates. + * + * However, in order to use templates all of the types must be known without + * ambiguity at compile time, which is not always feasible. When the data types + * can only be known at runtime, \e variant constructs are the only practical + * way to implement code able to work with multiple data types dynamically. + * + * An instance of the %Variant class can store one object of any of the + * supported %Variant types, which have been enumerated in the VariantType + * namespace. In this way %Variant can be used as a sort of envelope to + * transport objects of different types under a common interface. + * + * %Variant supports explicit type conversions through a set of dedicated + * %ToXXX() member functions. For example, one of the most useful and often + * used conversion functions is Variant::ToString(): + * + * \code + * Variant v( 3 ); // v transports an integer value + * Console().WriteLn( v.ToString() ); // writes "3" to the console + * \endcode + * + * This conversion function is extremely useful for object serialization. Using + * this conversion, a function can generate string representations of all the + * data types supported by %Variant: + * + * \code + * void PrintVariable( const String& name, const Variant& value ) + * { + * Console().WriteLn( name + " = " + value.ToString() ); + * } + * \endcode + * + * A %Variant instance owns its stored object and cannot share it with other + * objects, including other %Variant instances; it can only provide temporary + * rvalues generated from its stored object, but never references to it. This + * prevents unexpected object destruction and other problems with the objects + * transported by %Variant instances. + * + * %Variant is an essential component of the introspection mechanisms + * implemented by the Process, ProcessParameter and ProcessInstance classes. + * Thanks to %Variant, these classes are able to represent and interface with + * any installed process on the PixInsight platform. + */ +class PCL_CLASS Variant +{ +public: + + /*! + * An enumeration of all supported %Variant data types. + */ + typedef VariantType::value_type data_type; + + /*! + * Constructs an invalid %Variant instance that stores no object. + */ + Variant() + : m_type( VariantType::Invalid ) + { + m_data.anyValue = 0; + } + + /*! + * Constructs a %Variant instance to store a \c bool value. + */ + Variant( bool b ) + : m_type( VariantType::Bool ) + { + m_data.boolValue = b; + } + + /*! + * Constructs a %Variant instance to store a signed 8-bit integer value. + */ + Variant( int8 i8 ) + : m_type( VariantType::Int8 ) + { + m_data.int8Value = i8; + } + + /*! + * Constructs a %Variant instance to store a signed 16-bit integer value. + */ + Variant( int16 i16 ) + : m_type( VariantType::Int16 ) + { + m_data.int16Value = i16; + } + + /*! + * Constructs a %Variant instance to store a signed 32-bit integer value. + */ + Variant( int32 i32 ) + : m_type( VariantType::Int32 ) + { + m_data.int32Value = i32; + } + + /*! + * Constructs a %Variant instance to store a signed 64-bit integer value. + */ + Variant( int64 i64 ) + : m_type( VariantType::Int64 ) + { + m_data.int64Value = i64; + } + + /*! + * Constructs a %Variant instance to store an unsigned 8-bit integer value. + */ + Variant( uint8 u8 ) + : m_type( VariantType::UInt8 ) + { + m_data.uint8Value = u8; + } + + /*! + * Constructs a %Variant instance to store an unsigned 16-bit integer value. + */ + Variant( uint16 u16 ) + : m_type( VariantType::UInt16 ) + { + m_data.uint16Value = u16; + } + + /*! + * Constructs a %Variant instance to store an unsigned 32-bit integer value. + */ + Variant( uint32 u32 ) : m_type( VariantType::UInt32 ) + { + m_data.uint32Value = u32; + } + + /*! + * Constructs a %Variant instance to store an unsigned 64-bit integer value. + */ + Variant( uint64 u64 ) + : m_type( VariantType::UInt64 ) + { + m_data.uint64Value = u64; + } + + /*! + * Constructs a %Variant instance to store a \c float value (32-bit floating + * point). + */ + Variant( float f ) + : m_type( VariantType::Float ) + { + m_data.float32Value = f; + } + + /*! + * Constructs a %Variant instance to store a \c double value (64-bit + * floating point). + */ + Variant( double d ) + : m_type( VariantType::Double ) + { + m_data.float64Value = d; + } + + /*! + * Constructs a %Variant instance to store a complex number with \c float + * components (fcomplex). + */ + Variant( fcomplex fc ) + : m_type( VariantType::FComplex ) + { + m_data.anyValue = 0; + m_data.complex32Value = new fcomplex( fc ); + } + + /*! + * Constructs a %Variant instance to store a complex number with \c double + * components (dcomplex). + */ + Variant( dcomplex dc ) + : m_type( VariantType::DComplex ) + { + m_data.anyValue = 0; + m_data.complex64Value = new dcomplex( dc ); + } + + /*! + * Constructs a %Variant instance to store a time point value (TimePoint). + */ + Variant( const TimePoint& t ) + : m_type( VariantType::TimePoint ) + { + m_data.anyValue = 0; + m_data.timePointValue = new TimePoint( t ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional point with + * integer coordinates (Point). + */ + Variant( const Point& p ) + : m_type( VariantType::Point ) + { + m_data.anyValue = 0; + m_data.i32PointValue = new Point( p ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional point with + * \c float coordinates (FPoint). + */ + Variant( const FPoint& fp ) + : m_type( VariantType::FPoint ) + { + m_data.anyValue = 0; + m_data.f32PointValue = new FPoint( fp ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional point with + * \c double coordinates (DPoint). + */ + Variant( const DPoint& dp ) + : m_type( VariantType::DPoint ) + { + m_data.anyValue = 0; + m_data.f64PointValue = new DPoint( dp ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional rectangle with + * integer coordinates (Rect). + */ + Variant( const Rect& r ) + : m_type( VariantType::Rect ) + { + m_data.anyValue = 0; + m_data.i32RectValue = new Rect( r ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional rectangle with + * \c float coordinates (FRect). + */ + Variant( const FRect& fr ) + : m_type( VariantType::FRect ) + { + m_data.anyValue = 0; + m_data.f32RectValue = new FRect( fr ); + } + + /*! + * Constructs a %Variant instance to store a two-dimensional rectangle with + * \c double coordinates (DRect). + */ + Variant( const DRect& dr ) + : m_type( VariantType::DRect ) + { + m_data.anyValue = 0; + m_data.f64RectValue = new DRect( dr ); + } + + /*! + * Constructs a %Variant instance to store a vector of 8-bit signed integer + * components (CharVector). + */ + Variant( const CharVector& cv ) + : m_type( VariantType::CharVector ) + { + m_data.anyValue = 0; + m_data.i8VectorValue = new CharVector( cv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 8-bit unsigned + * integer components (ByteVector). + */ + Variant( const ByteVector& bv ) + : m_type( VariantType::ByteVector ) + { + m_data.anyValue = 0; + m_data.ui8VectorValue = new ByteVector( bv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 16-bit signed integer + * components (I16Vector). + */ + Variant( const I16Vector& i16v ) + : m_type( VariantType::I16Vector ) + { + m_data.anyValue = 0; + m_data.i16VectorValue = new I16Vector( i16v ); + } + + /*! + * Constructs a %Variant instance to store a vector of 16-bit unsigned + * integer components (UI16Vector). + */ + Variant( const UI16Vector& ui16v ) + : m_type( VariantType::UI16Vector ) + { + m_data.anyValue = 0; + m_data.ui16VectorValue = new UI16Vector( ui16v ); + } + + /*! + * Constructs a %Variant instance to store a vector of 32-bit signed integer + * components (IVector). + */ + Variant( const IVector& iv ) + : m_type( VariantType::IVector ) + { + m_data.anyValue = 0; + m_data.i32VectorValue = new IVector( iv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 32-bit unsigned + * integer components (UIVector). + */ + Variant( const UIVector& uiv ) + : m_type( VariantType::UIVector ) + { + m_data.anyValue = 0; + m_data.ui32VectorValue = new UIVector( uiv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 64-bit signed integer + * components (I64Vector). + */ + Variant( const I64Vector& i64v ) + : m_type( VariantType::I64Vector ) + { + m_data.anyValue = 0; + m_data.i64VectorValue = new I64Vector( i64v ); + } + + /*! + * Constructs a %Variant instance to store a vector of 64-bit unsigned + * integer components (UI64Vector). + */ + Variant( const UI64Vector& ui64v ) + : m_type( VariantType::UI64Vector ) + { + m_data.anyValue = 0; + m_data.ui64VectorValue = new UI64Vector( ui64v ); + } + + /*! + * Constructs a %Variant instance to store a vector of 32-bit floating point + * real components (FVector). + */ + Variant( const FVector& fv ) + : m_type( VariantType::FVector ) + { + m_data.anyValue = 0; + m_data.f32VectorValue = new FVector( fv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 64-bit floating point + * real components (DVector). + */ + Variant( const DVector& dv ) + : m_type( VariantType::DVector ) + { + m_data.anyValue = 0; + m_data.f64VectorValue = new DVector( dv ); + } + + /*! + * Constructs a %Variant instance to store a vector of 32-bit floating point + * complex components (C32Vector). + */ + Variant( const C32Vector& c32v ) + : m_type( VariantType::C32Vector ) + { + m_data.anyValue = 0; + m_data.c32VectorValue = new C32Vector( c32v ); + } + + /*! + * Constructs a %Variant instance to store a vector of 64-bit floating point + * complex components (C64Vector). + */ + Variant( const C64Vector& c64v ) + : m_type( VariantType::C64Vector ) + { + m_data.anyValue = 0; + m_data.c64VectorValue = new C64Vector( c64v ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 8-bit signed integer + * elements (CharMatrix). + */ + Variant( const CharMatrix& cm ) + : m_type( VariantType::CharMatrix ) + { + m_data.anyValue = 0; + m_data.i8MatrixValue = new CharMatrix( cm ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 8-bit unsigned + * integer elements (ByteMatrix). + */ + Variant( const ByteMatrix& bm ) + : m_type( VariantType::ByteMatrix ) + { + m_data.anyValue = 0; + m_data.ui8MatrixValue = new ByteMatrix( bm ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 16-bit signed integer + * elements (I16Matrix). + */ + Variant( const I16Matrix& i16m ) + : m_type( VariantType::I16Matrix ) + { + m_data.anyValue = 0; + m_data.i16MatrixValue = new I16Matrix( i16m ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 16-bit unsigned + * integer elements (UI16Matrix). + */ + Variant( const UI16Matrix& ui16m ) + : m_type( VariantType::UI16Matrix ) + { + m_data.anyValue = 0; + m_data.ui16MatrixValue = new UI16Matrix( ui16m ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 32-bit signed integer + * elements (IMatrix). + */ + Variant( const IMatrix& im ) + : m_type( VariantType::IMatrix ) + { + m_data.anyValue = 0; + m_data.i32MatrixValue = new IMatrix( im ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 32-bit unsigned + * integer elements (UIMatrix). + */ + Variant( const UIMatrix& uim ) + : m_type( VariantType::UIMatrix ) + { + m_data.anyValue = 0; + m_data.ui32MatrixValue = new UIMatrix( uim ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 64-bit integer + * elements (I64Matrix). + */ + Variant( const I64Matrix& i64m ) + : m_type( VariantType::I64Matrix ) + { + m_data.anyValue = 0; + m_data.i64MatrixValue = new I64Matrix( i64m ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 64-bit unsigned + * integer elements (UI64Matrix). + */ + Variant( const UI64Matrix& ui64m ) + : m_type( VariantType::UI64Matrix ) + { + m_data.anyValue = 0; + m_data.ui64MatrixValue = new UI64Matrix( ui64m ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 32-bit floating point + * real elements (FMatrix). + */ + Variant( const FMatrix& fm ) + : m_type( VariantType::FMatrix ) + { + m_data.anyValue = 0; + m_data.f32MatrixValue = new FMatrix( fm ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 64-bit floating point + * real elements (DMatrix). + */ + Variant( const DMatrix& dm ) + : m_type( VariantType::DMatrix ) + { + m_data.anyValue = 0; + m_data.f64MatrixValue = new DMatrix( dm ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 32-bit floating point + * complex elements (C32Matrix). + */ + Variant( const C32Matrix& c32m ) + : m_type( VariantType::C32Matrix ) + { + m_data.anyValue = 0; + m_data.c32MatrixValue = new C32Matrix( c32m ); + } + + /*! + * Constructs a %Variant instance to store a matrix of 64-bit floating point + * complex elements (C64Matrix). + */ + Variant( const C64Matrix& c64m ) + : m_type( VariantType::C64Matrix ) + { + m_data.anyValue = 0; + m_data.c64MatrixValue = new C64Matrix( c64m ); + } + + /*! + * Constructs a %Variant instance to store a dynamic array of unsigned 8-bit + * integers (ByteArray). + */ + Variant( const ByteArray& ba ) + : m_type( VariantType::ByteArray ) + { + m_data.anyValue = 0; + m_data.byteArrayValue = new ByteArray( ba ); + } + + /*! + * Constructs a %Variant instance to store a UTF-16 Unicode string (String). + */ + Variant( const String& s ) + : m_type( VariantType::String ) + { + m_data.anyValue = 0; + m_data.stringValue = new String( s ); + } + + /*! + * Constructs a %Variant instance to store an 8-bit ISO/IEC 8859-1 or UTF-8 + * Unicode string (IsoString). + */ + Variant( const IsoString& s8 ) + : m_type( VariantType::IsoString ) + { + m_data.anyValue = 0; + m_data.isoStringValue = new IsoString( s8 ); + } + + /*! + * Constructs a %Variant instance to store an 8-bit ISO/IEC 8859-1 or UTF-8 + * Unicode string (IsoString), constructed from a null-terminated C string. + */ + Variant( const char* cp ) + : m_type( VariantType::IsoString ) + { + m_data.anyValue = 0; + m_data.isoStringValue = new IsoString( cp ); + } + + /*! + * Constructs a %Variant instance to store a list of UTF-16 Unicode strings + * (StringList). + */ + Variant( const StringList& sl ) + : m_type( VariantType::StringList ) + { + m_data.anyValue = 0; + m_data.stringListValue = new StringList( sl ); + } + + /*! + * Constructs a %Variant instance to store a list of 8-bit strings + * (IsoStringList). + */ + Variant( const IsoStringList& isl ) + : m_type( VariantType::IsoStringList ) + { + m_data.anyValue = 0; + m_data.isoStringListValue = new IsoStringList( isl ); + } + + /*! + * Constructs a %Variant instance to store a key/value pair of UTF-16 + * Unicode strings (StringKeyValue). + */ + Variant( const StringKeyValue& skv ) + : m_type( VariantType::StringKeyValue ) + { + m_data.anyValue = 0; + m_data.stringKeyValueValue = new StringKeyValue( skv ); + } + + /*! + * Constructs a %Variant instance to store a key/value pair of 8-bit strings + * (IsoStringKeyValue). + */ + Variant( const IsoStringKeyValue& iskv ) + : m_type( VariantType::IsoStringKeyValue ) + { + m_data.anyValue = 0; + m_data.isoStringKeyValueValue = new IsoStringKeyValue( iskv ); + } + + /*! + * Constructs a %Variant instance to store a list of key/value pairs of + * UTF-16 Unicode strings (StringKeyValueList). + */ + Variant( const StringKeyValueList& skvl ) + : m_type( VariantType::StringKeyValueList ) + { + m_data.anyValue = 0; + m_data.stringKeyValueListValue = new StringKeyValueList( skvl ); + } + + /*! + * Constructs a %Variant instance to store a list of key/value pairs of + * 8-bit strings (IsoStringKeyValueList). + */ + Variant( const IsoStringKeyValueList& iskvl ) + : m_type( VariantType::IsoStringKeyValueList ) + { + m_data.anyValue = 0; + m_data.isoStringKeyValueListValue = new IsoStringKeyValueList( iskvl ); + } + + /*! + * Copy constructor. This %Variant will store a copy of the object stored in + * another %Variant \a x. + */ + Variant( const Variant& x ) + : m_type( VariantType::Invalid ) + { + m_data.anyValue = 0; + Copy( x ); + } + + /*! + * Move constructor. + */ + Variant( Variant&& x ) + { + m_type = x.m_type; + m_data.anyValue = x.m_data.anyValue; + x.m_type = VariantType::Invalid; + } + + /*! + * Virtual destructor. The object stored in this %Variant will be destroyed. + */ + virtual ~Variant() + { + Clear(); + } + + /*! + * Copy assignment operator. This %Variant will store a copy of the object + * stored in another %Variant \a x. Returns a reference to this object. + */ + Variant& operator =( const Variant& x ) + { + Assign( x ); + return *this; + } + + /*! + * Causes this %Variant to store a copy of the object stored in another + * %Variant \a x. + */ + void Assign( const Variant& x ) + { + if ( &x != this ) + { + Clear(); + Copy( x ); + } + } + + /*! + * Move assignment operator. + */ + Variant& operator =( Variant&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers the object stored in another %Variant \a x to this %Variant. + * The source object \a x is left empty/invalid. + */ + void Transfer( Variant& x ) + { + if ( &x != this ) + { + Clear(); + m_type = x.m_type; + m_data.anyValue = x.m_data.anyValue; + x.m_type = VariantType::Invalid; + } + } + + /*! + * Transfers the object stored in another %Variant \a x to this %Variant. + * The source object \a x is left empty/invalid. + */ + void Transfer( Variant&& x ) + { + if ( &x != this ) + { + Clear(); + m_type = x.m_type; + m_data.anyValue = x.m_data.anyValue; + x.m_type = VariantType::Invalid; + } + } + + /*! + * Returns true iff this %Variant stores an object. Returns false if this is + * an invalid %Variant object. + */ + bool IsValid() const + { + return m_type != VariantType::Invalid; + } + + /*! + * Returns the type of the object currently stored in this %Variant. + */ + data_type Type() const + { + return data_type( m_type ); + } + + /*! + * Converts the object currently stored in this %Variant instance to the + * specified \a type. + * + * Returns a %Variant object with the result of the conversion. + * + * If this %Variant is invalid, or if the currently stored object cannot be + * converted to the requested type, this function throws an Error exception + * with a descriptive message. + */ + Variant ToType( data_type type ) const; + + /*! + * Destroys the object stored in this %Variant and leaves this object in an + * invalid state. + */ + void Clear(); + + /*! + * Compares the object stored in this %Variant with the object stored in + * another %Variant \a x. + * + * If both %Variant instances store objects of different types, the object + * in \a x is converted to the type of this %Variant as a temporary object, + * and the comparison is made between the object in this %variant and the + * temporary object. If the object in \a x cannot be converted to the type + * of this %Variant, an Error exception is thrown. + * + * On success, returns an integer indicating the comparison result: + * + * 0 if the objects are equal. \n + * -1 if this object precedes the object in \a x. \n + * +1 if this object postcedes the object in \a x. + * + * \sa operator ==(), operator <() + */ + int Compare( const Variant& x ) const; + + /*! + * Returns true iff the object stored in this %Variant is equal to the object + * in another %Variant \a x. + * + * This operator is equivalent to: + * + * \code Compare( x ) == 0; \endcode + */ + bool operator ==( const Variant& x ) const + { + return Compare( x ) == 0; + } + + /*! + * Returns true iff the object stored in this %Variant precedes the object + * in another %Variant \a x. + * + * This operator is equivalent to: + * + * \code Compare( x ) < 0; \endcode + */ + bool operator <( const Variant& x ) const + { + return Compare( x ) < 0; + } + + /*! + * Converts the object stored in this %Variant to a Boolean value, and + * returns the result of the conversion. + * + * Throws an Error exception if a Boolean conversion is not possible for the + * object currently stored in this %Variant. + */ + bool ToBool() const; + + /*! + * A convenience synonym for ToBool(). + */ + bool ToBoolean() const + { + return ToBool(); + } + + /*! + * Converts the object stored in this %Variant to a 32-bit integer value, + * and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c int type is not + * possible for the object currently stored in this %Variant. + */ + int ToInt() const; + + /*! + * Converts the object stored in this %Variant to a 64-bit integer value, + * and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c int64 type is not + * possible for the object currently stored in this %Variant. + */ + int64 ToInt64() const; + + /*! + * Converts the object stored in this %Variant to an unsigned 32-bit integer + * value, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c unsigned \c int type + * is not possible for the object currently stored in this %Variant. + */ + unsigned int ToUInt() const; + + /*! + * Converts the object stored in this %Variant to an unsigned 64-bit integer + * value, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c uint64 type is not + * possible for the object currently stored in this %Variant. + */ + uint64 ToUInt64() const; + + /*! + * Converts the object stored in this %Variant to a 32-bit floating point + * value, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c float type is not + * possible for the object currently stored in this %Variant. + */ + float ToFloat() const; + + /*! + * Converts the object stored in this %Variant to a 64-bit floating point + * value, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c double type is not + * possible for the object currently stored in this %Variant. + */ + double ToDouble() const; + + /*! + * Converts the object stored in this %Variant to a complex value with + * \c float components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c fcomplex type is not + * possible for the object currently stored in this %Variant. + */ + fcomplex ToFComplex() const; + + /*! + * Converts the object stored in this %Variant to a complex value with + * \c double components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the \c dcomplex type is not + * possible for the object currently stored in this %Variant. + */ + dcomplex ToDComplex() const; + + /*! + * A convenience synonym for ToDComplex(). + */ + complex ToComplex() const + { + return ToDComplex(); + } + + /*! + * Converts the object stored in this %Variant to a time point value, and + * returns the result of the conversion. + * + * Throws an Error exception if a conversion to the TimePoint class is not + * possible for the object currently stored in this %Variant. + */ + TimePoint ToTimePoint() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional point + * with integer coordinates, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the Point class is not + * possible for the object currently stored in this %Variant. + */ + Point ToPoint() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional point + * with \c float coordinates, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the FPoint class is not + * possible for the object currently stored in this %Variant. + */ + FPoint ToFPoint() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional point + * with \c double coordinates, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the DPoint class is not + * possible for the object currently stored in this %Variant. + */ + DPoint ToDPoint() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional + * rectangle with integer coordinates, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the Rect class is not + * possible for the object currently stored in this %Variant. + */ + Rect ToRect() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional + * rectangle with \c float coordinates, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the FRect class is not + * possible for the object currently stored in this %Variant. + */ + FRect ToFRect() const; + + /*! + * Converts the object stored in this %Variant to a two-dimensional + * rectangle with \c double coordinates, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the DRect class is not + * possible for the object currently stored in this %Variant. + */ + DRect ToDRect() const; + + /*! + * Converts the object stored in this %Variant to a vector of 8-bit signed + * integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the CharVector class is not + * possible for the object currently stored in this %Variant. + */ + CharVector ToCharVector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 8-bit unsigned + * integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the ByteVector class is not + * possible for the object currently stored in this %Variant. + */ + ByteVector ToByteVector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 16-bit signed + * integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the I16Vector class is not + * possible for the object currently stored in this %Variant. + */ + I16Vector ToI16Vector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 16-bit + * unsigned integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UI16Vector class is not + * possible for the object currently stored in this %Variant. + */ + UI16Vector ToUI16Vector() const; + + /*! + * Converts the object stored in this %Variant to a vector of integer + * components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the IVector class is not + * possible for the object currently stored in this %Variant. + */ + IVector ToIVector() const; + + /*! + * Converts the object stored in this %Variant to a vector of unsigned + * integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UIVector class is not + * possible for the object currently stored in this %Variant. + */ + UIVector ToUIVector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 64-bit integer + * components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the I64Vector class is not + * possible for the object currently stored in this %Variant. + */ + I64Vector ToI64Vector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 64-bit + * unsigned integer components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UI64Vector class is not + * possible for the object currently stored in this %Variant. + */ + UI64Vector ToUI64Vector() const; + + /*! + * Converts the object stored in this %Variant to a vector of \c float + * components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the FVector class is not + * possible for the object currently stored in this %Variant. + */ + FVector ToFVector() const; + + /*! + * Converts the object stored in this %Variant to a vector of \c double + * components, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the DVector class is not + * possible for the object currently stored in this %Variant. + */ + DVector ToDVector() const; + + /*! + * A convenience synonym for ToDVector(). + */ + Vector ToVector() const + { + return ToDVector(); + } + + /*! + * Converts the object stored in this %Variant to a vector of 32-bit + * floating point complex components, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the C32Vector class is not + * possible for the object currently stored in this %Variant. + */ + C32Vector ToC32Vector() const; + + /*! + * Converts the object stored in this %Variant to a vector of 64-bit + * floating point complex components, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the C64Vector class is not + * possible for the object currently stored in this %Variant. + */ + C64Vector ToC64Vector() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 8-bit signed + * integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the CharMatrix class is not + * possible for the object currently stored in this %Variant. + */ + CharMatrix ToCharMatrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 8-bit unsigned + * integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the ByteMatrix class is not + * possible for the object currently stored in this %Variant. + */ + ByteMatrix ToByteMatrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 16-bit signed + * integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the I16Matrix class is not + * possible for the object currently stored in this %Variant. + */ + I16Matrix ToI16Matrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 16-bit + * unsigned integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UI16Matrix class is not + * possible for the object currently stored in this %Variant. + */ + UI16Matrix ToUI16Matrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of integer + * elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the IMatrix class is not + * possible for the object currently stored in this %Variant. + */ + IMatrix ToIMatrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of unsigned + * integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UIMatrix class is not + * possible for the object currently stored in this %Variant. + */ + UIMatrix ToUIMatrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 64-bit integer + * elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the I64Matrix class is not + * possible for the object currently stored in this %Variant. + */ + I64Matrix ToI64Matrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 64-bit + * unsigned integer elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the UI64Matrix class is not + * possible for the object currently stored in this %Variant. + */ + UI64Matrix ToUI64Matrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of \c float + * elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the FMatrix class is not + * possible for the object currently stored in this %Variant. + */ + FMatrix ToFMatrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of \c double + * elements, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the DMatrix class is not + * possible for the object currently stored in this %Variant. + */ + DMatrix ToDMatrix() const; + + /*! + * A convenience synonym for ToDMatrix(). + */ + Matrix ToMatrix() const + { + return ToDMatrix(); + } + + /*! + * Converts the object stored in this %Variant to a matrix of 32-bit + * floating point complex elements, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the C32Matrix class is not + * possible for the object currently stored in this %Variant. + */ + C32Matrix ToC32Matrix() const; + + /*! + * Converts the object stored in this %Variant to a matrix of 64-bit + * floating point complex elements, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the C64Matrix class is not + * possible for the object currently stored in this %Variant. + */ + C64Matrix ToC64Matrix() const; + + /*! + * Converts the object stored in this %Variant to a dynamic array of + * unsigned 8-bit integers, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the ByteArray class is not + * possible for the object currently stored in this %Variant. + */ + ByteArray ToByteArray() const; + + /*! + * Converts the object stored in this %Variant to a UTF-16 Unicode string, + * and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the String class is not + * possible for the object currently stored in this %Variant. + */ + String ToString() const; + + /*! + * Converts the object stored in this %Variant to an 8-bit ISO/IEC 8859-1 or + * UTF-8 Unicode string, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the IsoString class is not + * possible for the object currently stored in this %Variant. + */ + IsoString ToIsoString() const; + + /*! + * Converts the object stored in this %Variant to a dynamic list of UTF-16 + * Unicode strings, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the StringList class is not + * possible for the object currently stored in this %Variant. + */ + StringList ToStringList() const; + + /*! + * Converts the object stored in this %Variant to a dynamic list of 8-bit + * strings, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the IsoStringList class is + * not possible for the object currently stored in this %Variant. + */ + IsoStringList ToIsoStringList() const; + + /*! + * Converts the object stored in this %Variant to a key/value pair of UTF-16 + * Unicode strings, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the StringKeyValue class is + * not possible for the object currently stored in this %Variant. + */ + StringKeyValue ToStringKeyValue() const; + + /*! + * Converts the object stored in this %Variant to a key/value pair of 8-bit + * strings, and returns the result of the conversion. + * + * Throws an Error exception if a conversion to the IsoStringKeyValue class is + * not possible for the object currently stored in this %Variant. + */ + IsoStringKeyValue ToIsoStringKeyValue() const; + + /*! + * Converts the object stored in this %Variant to a dynamic list of + * key/value pairs of UTF-16 Unicode strings, and returns the result of the + * conversion. + * + * Throws an Error exception if a conversion to the StringKeyValueList class + * is not possible for the object currently stored in this %Variant. + */ + StringKeyValueList ToStringKeyValueList() const; + + /*! + * Converts the object stored in this %Variant to a dynamic list of + * key/value pairs of 8-bit strings, and returns the result of th + * conversion. + * + * Throws an Error exception if a conversion to the IsoStringKeyValueList + * class is not possible for the object currently stored in this %Variant. + */ + IsoStringKeyValueList ToIsoStringKeyValueList() const; + + /*! + * Returns a pointer to the immutable block of data stored in this %Variant + * object. + * + * For scalar and complex data types (bool, int32, float, fcomplex, etc.), + * this member function returns a pointer to the transported object. + * + * For vector, matrix and string types, this function returns the starting + * address of the contiguous data block stored by the transported object. + * For example, if a ByteArray object is being transported by this %Variant + * object, this function returns ByteArray::Begin(). + * + * For other structured types such as points, rectangles and lists, this + * function throws an Error exception. + */ + const void* InternalBlockAddress() const; + + /*! + * Returns the length of the vector stored in this %Variant object. + * + * If this %Variant does not transport a vector or vector-like object + * (IVector, FVector, DVector, ByteArray, String or IsoString), this member + * function throws an Error exception. + */ + size_type VectorLength() const; + + /*! + * Returns the dimensions of the matrix stored in this %Variant object. + * + * If this %Variant does not transport a matrix object (IMatrix, FMatrix, + * DMatrix), this member function throws an Error exception. + * + * The returned rectangle is anchored at {0,0} and has the same dimensions + * as the transported matrix: Rect::Height() or Rect::y1 is the number of + * matrix rows, and Rect::Width() or Rect::x1 is the number of matrix + * columns. + */ + Rect MatrixDimensions() const; + + /*! + * Returns the size in bytes of the scalar, complex, point, rectangle, + * vector or matrix object transported by this %Variant object. + * + * The value returned by this function can be used along with + * InternalBlockAddress() for object serialization purposes. + * + * If this %Variant does not transport a scalar, complex, vector-like or + * matrix object, this member function throws an Error exception. + */ + size_type BlockSize() const; + + /*! + * Returns the length in bytes of a block element for the specified \a type. + * + * \a type must be a scalar, complex, vector, matrix or string type. + * Otherwise this function will throw an Error exception. + */ + static int BytesPerBlockElementForType( int type ); + + /*! + * Returns the length in bytes of a block element, if this %Variant object + * transports a scalar, complex, vector, matrix or string object. + * + * If this %Variant does not transport a scalar, complex, vector-like or + * matrix object, this function throws an Error exception. + */ + int BytesPerBlockElement() const + { + return BytesPerBlockElementForType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a scalar %Variant type: + * bool, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float or + * double. + */ + static bool IsScalarType( int type ); + + /*! + * Returns true only if the object transported by this %Variant is of a + * scalar type: bool, int8, int16, int32, int64, uint8, uint16, uint32, + * uint64, float or double. + */ + bool IsScalar() const + { + return IsScalarType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a complex %Variant type: + * Complex32 or Complex64. + */ + static bool IsComplexType( int type ) + { + return type == VariantType::Complex32 || type == VariantType::Complex64; + } + + /*! + * Returns true only if the object transported by this %Variant is of a + * complex type: Complex32 or Complex64. + */ + bool IsComplex() const + { + return IsComplexType( m_type ); + } + + /*! + * Returns true only if the specified \a type is VariantType::TimePoint. + */ + static bool IsTimePointType( int type ) + { + return type == VariantType::TimePoint; + } + + /*! + * Returns true only if the object transported by this %Variant is of the + * TimePoint type. + */ + bool IsTimePoint() const + { + return IsTimePointType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a vector or vector-like + * %Variant type: CharVector, ByteVector, IVector, UIVector, I64Vector, + * UI64Vector, FVector, DVector, ByteArray, String or IsoString. + */ + static bool IsVectorType( int type ); + + /*! + * Returns true only if the object transported by this %Variant is of a + * vector or vector-like type: CharVector, ByteVector, IVector, UIVector, + * I64Vector, UI64Vector, FVector, DVector, ByteArray, String or IsoString. + */ + bool IsVector() const + { + return IsVectorType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a matrix %Variant type: + * CharMatrix, ByteMatrix, IMatrix, UIMatrix, I64Matrix, UI64Matrix, FMatrix + * or DMatrix. + */ + static bool IsMatrixType( int type ); + + /*! + * Returns true only if the object transported by this %Variant is of a + * matrix type: CharMatrix, ByteMatrix, IMatrix, UIMatrix, I64Matrix, + * UI64Matrix, FMatrix or DMatrix. + */ + bool IsMatrix() const + { + return IsMatrixType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a character string %Variant + * type: String or IsoString. + */ + static bool IsStringType( int type ) + { + return type == VariantType::String || type == VariantType::IsoString; + } + + /*! + * Returns true only if the object transported by this %Variant is of a + * character string type: String or IsoString. + */ + bool IsString() const + { + return IsStringType( m_type ); + } + + /*! + * Returns true only if the specified \a type is a structured %Variant type: + * fcomplex, dcomplex, Point, FPoint, DPoint, Rect, FRect, DRect, + * StringList, IsoStringList, StringKeyValue, IsoStringKeyValue, + * StringKeyValueList or IsoStringKeyValueList. + */ + static bool IsStructuredType( int type ); + + /*! + * Returns true only if the object transported by this %Variant is of a + * structured type: fcomplex, dcomplex, Point, FPoint, DPoint, Rect, FRect, + * DRect, StringList, IsoStringList, StringKeyValue, IsoStringKeyValue, + * StringKeyValueList or IsoStringKeyValueList. + * + * For structured objects the InternalBlockAddress() and BlockSize() member + * functions cannot be used, since these objects cannot be accessed through + * a unique pointer and a length in bytes. + */ + bool IsStructured() const + { + return IsStructuredType( m_type ); + } + + /*! + * Returns a static null-terminated string with the name of the specified + * %Variant \a type. + */ + static const char* TypeAsString( int type ); + +private: + + union Data + { + bool boolValue; + + int8 int8Value; + int16 int16Value; + int32 int32Value; + int64 int64Value; + + uint8 uint8Value; + uint16 uint16Value; + uint32 uint32Value; + uint64 uint64Value; + + float float32Value; + double float64Value; + + fcomplex* complex32Value; + dcomplex* complex64Value; + + TimePoint* timePointValue; + + I32Point* i32PointValue; + F32Point* f32PointValue; + F64Point* f64PointValue; + + I32Rect* i32RectValue; + F32Rect* f32RectValue; + F64Rect* f64RectValue; + + I8Vector* i8VectorValue; + UI8Vector* ui8VectorValue; + I16Vector* i16VectorValue; + UI16Vector* ui16VectorValue; + I32Vector* i32VectorValue; + UI32Vector* ui32VectorValue; + I64Vector* i64VectorValue; + UI64Vector* ui64VectorValue; + F32Vector* f32VectorValue; + F64Vector* f64VectorValue; + C32Vector* c32VectorValue; + C64Vector* c64VectorValue; + + I8Matrix* i8MatrixValue; + UI8Matrix* ui8MatrixValue; + I16Matrix* i16MatrixValue; + UI16Matrix* ui16MatrixValue; + I32Matrix* i32MatrixValue; + UI32Matrix* ui32MatrixValue; + I64Matrix* i64MatrixValue; + UI64Matrix* ui64MatrixValue; + F32Matrix* f32MatrixValue; + F64Matrix* f64MatrixValue; + C32Matrix* c32MatrixValue; + C64Matrix* c64MatrixValue; + + ByteArray* byteArrayValue; + + String* stringValue; + IsoString* isoStringValue; + + StringList* stringListValue; + IsoStringList* isoStringListValue; + + StringKeyValue* stringKeyValueValue; + IsoStringKeyValue* isoStringKeyValueValue; + + StringKeyValueList* stringKeyValueListValue; + IsoStringKeyValueList* isoStringKeyValueListValue; + + uint64 anyValue; + }; + + Data m_data; + int m_type; + + // Internal + void Copy( const Variant& ); + + friend class PCL_AssertVariantSize; +}; + +class PCL_AssertVariantSize +{ +#ifndef _MSC_VER +# ifdef __clang__ + _Pragma("clang diagnostic push") + _Pragma("clang diagnostic ignored \"-Wunused-private-field\"") +# endif + Variant* v; + static_assert( sizeof( v->m_data ) == sizeof( uint64 ), "Invalid sizeof( Variant::m_data )" ); + static_assert( sizeof( v->m_data.anyValue ) == sizeof( v->m_data ), "Invalid sizeof( Variant::m_data.anyValue )" ); +# ifdef __clang__ + _Pragma("clang diagnostic pop") +# endif +#else + static_assert( sizeof( Variant::Data ) == sizeof( uint64 ), "Invalid sizeof( Variant::m_data )" ); +#endif +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +/*! + * \internal + * API helper routines for internal use. + */ +struct api_property_value; +namespace pcl +{ + Variant VariantFromAPIPropertyValue( const api_property_value& ); + void APIPropertyValueFromVariant( api_property_value&, const Variant& ); + Variant::data_type VariantTypeFromAPIPropertyType( uint64 ); + uint64 APIPropertyTypeFromVariantType( Variant::data_type ); +} // pcl + +#endif // __PCL_Variant_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Variant.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Vector.h b/3rdparty/include/pcl/Vector.h new file mode 100644 index 0000000..db34e44 --- /dev/null +++ b/3rdparty/include/pcl/Vector.h @@ -0,0 +1,3325 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Vector.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Vector_h +#define __PCL_Vector_h + +/// \file pcl/Vector.h + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef __PCL_NO_VECTOR_STATISTICS +# include +#endif + +#ifndef __PCL_NO_VECTOR_INSTANTIATE +# include +#endif + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class GenericVector + * \brief Generic vector of arbitrary length. + * + * %GenericVector is a lightweight template class implementing a vector of + * arbitrary length. This class provides the following main features: + * + * \li Implicit data sharing with reference counting and copy-on-write + * functionality. %GenericVector instances can safely be passed as function + * return values and by-value function arguments. + * + * \li Thread-safe. %GenericVector instances can safely be accessed from + * multiple threads. The reference counter implements atomic reference and + * dereference operations. + * + * \li Efficient vector storage and access to vector elements. Vector + * elements are allocated as a single, contiguous memory block. + * + * \li Support for a large set of vector operations, including scalar-to-vector + * and vector-to-vector arithmetic operations, dot and cross products. + * + * \li Calculation of a variety of descriptive statistics of vector components. + * + * \sa GenericMatrix, \ref vector_operators, \ref vector_types + */ +template +class PCL_CLASS GenericVector : public DirectContainer +{ +public: + + /*! + * Represents a scalar. + */ + typedef T scalar; + + /*! + * Represents a vector component. + */ + typedef T component; + + /*! + * Represents a mutable vector iterator. + */ + typedef T* iterator; + + /*! + * Represents an immutable vector iterator. + */ + typedef const T* const_iterator; + + /*! + * Constructs an empty vector. An empty vector has no components and its + * length is zero. + */ + GenericVector() + { + m_data = new Data; + } + + /*! + * Constructs an uninitialized vector of the specified length. + * + * \param len Number of vector components (≥ 0). + * + * This constructor does not initialize vector components. The newly created + * vector will contain unpredictable values. + */ + GenericVector( int len ) + { + PCL_PRECONDITION( len >= 0 ) + m_data = new Data( len ); + } + + /*! + * Constructs a vector and fills it with a constant component value. + * + * \param x Initial value for all vector components. + * \param len Number of vector components (≥ 0). + */ + GenericVector( const component& x, int len ) + { + PCL_PRECONDITION( len >= 0 ) + m_data = new Data( len ); + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = x; + } + + /*! + * Constructs a vector and initializes it with component values taken from a + * static array. + * + * \param a Address of the first item of a static array for + * initialization of vector components. The array must provide + * at least \a len consecutive items. + * + * \param len Number of vector components (≥ 0). + */ + template + GenericVector( const T1* a, int len ) + { + PCL_PRECONDITION( len >= 0 ) + m_data = new Data( len ); + if ( a != nullptr ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const T1* __restrict__ k = a; + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i = component( *k ); + } + } + + /*! + * Constructs a vector and initializes it with component values taken from + * the specified initializer list \a c. + * + * This constructor is equivalent to: + * + * \code GenericVector( c.begin(), int( c.size() ) ) \endcode + */ + template + GenericVector( std::initializer_list c ) + : GenericVector( c.begin(), int( c.size() ) ) + { + } + + /*! + * Constructs a three-component vector initialized with the specified \a x, + * \a y and \a z component values. + */ + template + GenericVector( const T1& x, const T1& y, const T1& z ) + { + m_data = new Data( 3 ); + iterator v = m_data->Begin(); + *v++ = component( x ); + *v++ = component( y ); + *v = component( z ); + } + + /*! + * Constructs a four-component vector initialized with the specified \a x, + * \a y, \a z and \a t component values. + */ + template + GenericVector( const T1& x, const T1& y, const T1& z, const T1& t ) + { + m_data = new Data( 4 ); + iterator v = m_data->Begin(); + *v++ = component( x ); + *v++ = component( y ); + *v++ = component( z ); + *v = component( t ); + } + + /*! + * Copy constructor. This object references the same data that is being + * referenced by the specified vector \a x. + */ + GenericVector( const GenericVector& x ) + : m_data( x.m_data ) + { + m_data->Attach(); + } + + /*! + * Move constructor. + */ + GenericVector( GenericVector&& x ) + : m_data( x.m_data ) + { + x.m_data = nullptr; + } + + /*! + * Constructs a vector and initializes it with component values taken from + * an instance \a x of a different vector template instantiation. + * + * This constructor is equivalent to: + * + * \code GenericVector( x.Begin(), x.Length() ) \endcode + */ + template + GenericVector( const GenericVector& x ) + : GenericVector( x.Begin(), x.Length() ) + { + } + + /*! + * Destroys a %GenericVector object. This destructor dereferences the vector + * data. If the vector data becomes unreferenced, it is destroyed and + * deallocated immediately. + */ + virtual ~GenericVector() + { + if ( m_data != nullptr ) + { + DetachFromData(); + m_data = nullptr; + } + } + + /*! + * Deallocates vector data, yielding an empty vector. + */ + void Clear() + { + if ( !IsEmpty() ) + if ( m_data->IsUnique() ) + m_data->Deallocate(); + else + { + Data* newData = new Data( 0 ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Copy assignment operator. Returns a reference to this object. + * + * See the Assign() member function for more information. + */ + GenericVector& operator =( const GenericVector& x ) + { + Assign( x ); + return *this; + } + + /*! + * Assigns a vector \a x to this object. + * + * If this instance and the specified source instance \a x reference + * different vector data, the data previously referenced by this object is + * dereferenced. If the previous data becomes unreferenced, it is destroyed + * and deallocated. Then the data being referenced by \a x is also + * referenced by this object. + * + * If this instance and the specified source instance \a x already reference + * the same vector data, then this function does nothing. + */ + void Assign( const GenericVector& x ) + { + x.m_data->Attach(); + DetachFromData(); + m_data = x.m_data; + } + + /*! + * Move assignment operator. Returns a reference to this object. + * + * See the Transfer() member function for more information. + */ + GenericVector& operator =( GenericVector&& x ) + { + Transfer( x ); + return *this; + } + + /*! + * Transfers data from another vector \a x to this object. + * + * Decrements the reference counter of the current vector data. If the data + * becomes unreferenced, it is destroyed and deallocated. The vector data + * referenced by the source object \a x is then transferred to this object, + * and the source object \a x is left as an invalid empty vector. + * + * \warning The source vector \a x will be an invalid object after calling + * this function, and hence should be destroyed immediately. Any attempt to + * access an invalid object will most likely lead to a crash. + */ + void Transfer( GenericVector& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Transfers data from another vector \a x to this object. + * + * Decrements the reference counter of the current vector data. If the data + * becomes unreferenced, it is destroyed and deallocated. The vector data + * referenced by the source object \a x is then transferred to this object, + * and the source object \a x is left as an invalid empty vector. + * + * \warning The source vector \a x will be an invalid object after calling + * this function, and hence should be destroyed immediately. Any attempt to + * access an invalid object will most likely lead to a crash. + */ + void Transfer( GenericVector&& x ) + { + DetachFromData(); + m_data = x.m_data; + x.m_data = nullptr; + } + + /*! + * Exchanges two vectors \a x1 and \a x2. + * + * This function is efficient because it simply swaps the internal vector + * data pointers owned by the objects. + */ + friend void Swap( GenericVector& x1, GenericVector& x2 ) noexcept + { + pcl::Swap( x1.m_data, x2.m_data ); + } + + /*! + * Assigns a constant scalar \a x to all components of this vector. Returns + * a reference to this object. + * + * Before assigning a constant value to all vector components, this function + * ensures that this instance uniquely references its vector data, + * generating a new vector data block if necessary. + */ + GenericVector& operator =( const scalar& x ) + { + if ( !IsUnique() ) + { + Data* newData = new Data( m_data->Length() ); + DetachFromData(); + m_data = newData; + } + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = x; + return *this; + } + + /*! + * Vector addition/assignment. Adds each component of the specified vector + * \a x to the corresponding component of this vector. Returns a reference + * to this object. + * + * Before operating vector components, this function ensures that this + * instance uniquely references its vector data, generating a duplicate if + * necessary. + * + * If the specified vectors are incompatible for component-wise operations + * (because the length of \a x is less than the length of this object), this + * function throws an appropriate Error exception. + */ + GenericVector& operator +=( const GenericVector& x ) + { + if ( x.Length() < Length() ) + throw Error( "Invalid vector addition." ); + EnsureUnique(); + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const_iterator __restrict__ k = x.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i += *k; + return *this; + } + + /*! + * Vector subtraction/assignment. Subtracts each component of the specified + * vector \a x from the corresponding component of this vector. Returns a + * reference to this object. + * + * Before operating vector components, this function ensures that this + * instance uniquely references its vector data, generating a duplicate if + * necessary. + * + * If the specified vectors are incompatible for component-wise operations + * (because the length of \a x is less than the length of this object), this + * function throws an appropriate Error exception. + */ + GenericVector& operator -=( const GenericVector& x ) + { + if ( x.Length() < Length() ) + throw Error( "Invalid vector subtraction." ); + EnsureUnique(); + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const_iterator __restrict__ k = x.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i -= *k; + return *this; + } + + /*! + * Component-wise vector multiplication/assignment. Multiplies each + * component of this vector by the corresponding component of the specified + * vector \a x. Returns a reference to this object. + * + * Before operating vector components, this function ensures that this + * instance uniquely references its vector data, generating a duplicate if + * necessary. + * + * If the specified vectors are incompatible for component-wise operations + * (because the length of \a x is less than the length of this object), this + * function throws an appropriate Error exception. + */ + GenericVector& operator *=( const GenericVector& x ) + { + if ( x.Length() < Length() ) + throw Error( "Invalid vector multiplication." ); + EnsureUnique(); + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const_iterator __restrict__ k = x.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i *= *k; + return *this; + } + + /*! + * Component-wise vector division/assignment. Divides each component of this + * vector by the corresponding component of the specified vector \a x. + * Returns a reference to this object. + * + * Before operating vector components, this function ensures that this + * instance uniquely references its vector data, generating a duplicate if + * necessary. + * + * If the specified vectors are incompatible for component-wise operations + * (because the length of \a x is less than the length of this object), this + * function throws an appropriate Error exception. + * + * \note Make sure that no component of the specified divisor vector \a x is + * zero or insignificant, or calling this member function will lead to + * division(s) by zero. + */ + GenericVector& operator /=( const GenericVector& x ) + { + if ( x.Length() < Length() ) + throw Error( "Invalid vector division." ); + EnsureUnique(); + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const_iterator __restrict__ k = x.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *i /= *k; + return *this; + } + +#define IMPLEMENT_SCALAR_ASSIGN_OP( op ) \ + if ( IsUnique() ) \ + { \ + iterator __restrict__ i = m_data->Begin(); \ + const_iterator __restrict__ j = m_data->End(); \ + PCL_IVDEP \ + for ( ; i < j; ++i ) \ + *i op##= x; \ + } \ + else \ + { \ + Data* newData = new Data( m_data->Length() ); \ + const_iterator __restrict__ i = m_data->Begin(); \ + const_iterator __restrict__ j = m_data->End(); \ + iterator __restrict__ k = newData->Begin(); \ + PCL_IVDEP \ + for ( ; i < j; ++i, ++k ) \ + *k = *i op x; \ + DetachFromData(); \ + m_data = newData; \ + } \ + return *this; + + /*! + * Adds a constant scalar \a x to all components of this vector. Returns a + * reference to this object. + * + * Before adding a constant value to all vector components, this function + * ensures that this instance uniquely references its vector data, + * generating a duplicate if necessary. + */ + GenericVector& operator +=( const scalar& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( + ) + } + + /*! + * Subtracts a constant scalar \a x from all components of this vector. + * Returns a reference to this object. + * + * Before subtracting a constant value from all vector components, this + * function ensures that this instance uniquely references its vector data, + * generating a duplicate if necessary. + */ + GenericVector& operator -=( const scalar& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( - ) + } + + /*! + * Multiplies all components of this vector by a constant scalar \a x. + * Returns a reference to this object. + * + * Before multiplying all vector components by a constant value, this + * function ensures that this instance uniquely references its vector data, + * generating a duplicate if necessary. + */ + GenericVector& operator *=( const scalar& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( * ) + } + + /*! + * Divides all components of this vector by a constant scalar \a x. Returns + * a reference to this object. + * + * Before dividing all vector components by a constant value, this function + * ensures that this instance uniquely references its vector data, + * generating a duplicate if necessary. + */ + GenericVector& operator /=( const scalar& x ) + { + IMPLEMENT_SCALAR_ASSIGN_OP( / ) + } + + /*! + * Raises all components of this vector to a constant scalar \a x. Returns + * a reference to this object. + * + * Before raising all vector components to a constant value, this function + * ensures that this instance uniquely references its vector data, + * generating a duplicate if necessary. + */ + GenericVector& operator ^=( const scalar& x ) + { + if ( IsUnique() ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = pcl::Pow( *i, x ); + } + else + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = pcl::Pow( *i, x ); + DetachFromData(); + m_data = newData; + } + return *this; + } + +#undef IMPLEMENT_SCALAR_ASSIGN_OP + + /*! + * Returns the dot product of this vector and a vector \a v. + * + * \note For performance reasons, this function does not check whether the + * specified vector has at least the same number of components as this + * vector. If that condition does not hold, this function will invoke + * undefined behavior. + */ + scalar Dot( const GenericVector& v ) const noexcept + { + PCL_PRECONDITION( v.Length() >= Length() ) + scalar r = scalar( 0 ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + const_iterator __restrict__ k = v.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + r += scalar( *i ) * scalar( *k ); + return r; + } + + /*! + * Returns the cross product of this vector and a vector \a v2. + * + * \note The cross product is only defined for vectors of three components. + * For performance reasons, this function does not check vector lengths. For + * vectors of length < 3, this function will invoke undefined behavior. + */ + GenericVector Cross( const GenericVector& v2 ) const + { + PCL_PRECONDITION( Length() == 3 && v2.Length() == 3 ) + component x1 = *At( 0 ); + component y1 = *At( 1 ); + component z1 = *At( 2 ); + component x2 = v2[0]; + component y2 = v2[1]; + component z2 = v2[2]; + return GenericVector( y1*z2 - z1*y2, + z1*x2 - x1*z2, + x1*y2 - y1*x2 ); + } + + /*! + * Unary sign reversal operator: returns a vector with the components of + * this vector multiplied by -1. + */ + GenericVector operator -() const + { + GenericVector R( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = R.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = -*i; + return R; + } + + /*! + * Reverses the sign of all components of this vector. + * + * Before performing its task, this function ensures that this instance + * uniquely references its vector data, generating a duplicate if necessary. + */ + void ReverseSign() + { + if ( IsUnique() ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = -*i; + } + else + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = -*i; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the square of this vector. The result is a new vector of the same + * length where each component is the square of its counterpart in this + * vector. + */ + GenericVector Sqr() const + { + GenericVector R( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = R.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = *i * *i; + return R; + } + + /*! + * Replaces all components of this vector with their squares. + * + * Before performing its task, this function ensures that this instance + * uniquely references its vector data, generating a duplicate if necessary. + */ + void SetSqr() + { + if ( IsUnique() ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i *= *i; + } + else + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = *i * *i; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the square root of this vector. The result is a new vector of the + * same length where each component is the square root of its counterpart in + * this vector. + */ + GenericVector Sqrt() const + { + GenericVector R( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = R.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = pcl::Sqrt( *i ); + return R; + } + + /*! + * Replaces all components of this vector with their square roots. + * + * Before performing its task, this function ensures that this instance + * uniquely references its vector data, generating a duplicate if necessary. + */ + void SetSqrt() + { + if ( IsUnique() ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + for ( ; i < j; ++i ) + *i = pcl::Sqrt( *i ); + } + else + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = pcl::Sqrt( *i ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the absolute value of this vector. The result is a new vector of + * the same length where each component is the absolute value of its + * counterpart in this vector. + */ + GenericVector Abs() const + { + GenericVector R( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = R.Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = pcl::Abs( *i ); + return R; + } + + /*! + * Replaces all components of this vector with their absolute values. + * + * Before performing its task, this function ensures that this instance + * uniquely references its vector data, generating a duplicate if necessary. + */ + void SetAbs() + { + if ( IsUnique() ) + { + iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + PCL_IVDEP + for ( ; i < j; ++i ) + *i = pcl::Abs( *i ); + } + else + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = pcl::Abs( *i ); + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the norm of this vector. For any real p > 0, the norm N of a + * vector v is given by: + * + * N = sum( abs( x )^p )^(1/p) + * + * for all vector components x of v. + * + * \sa L1Norm(), L2Norm() + */ + scalar Norm( double p ) const noexcept + { + return pcl::Norm( m_data->Begin(), m_data->End(), p ); + } + + /*! + * Returns the L1 norm (or Manhattan norm) of this vector. The L1 norm is + * the sum of the absolute values of all vector components. + */ + scalar L1Norm() const noexcept + { + return pcl::L1Norm( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the L2 norm (or Euclidean norm) of this vector. The L2 norm is + * the square root of the sum of squared vector components. + */ + scalar L2Norm() const noexcept + { + return pcl::L2Norm( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the L2 norm (or Euclidean norm) of this vector. This function is + * a synonym for L2Norm(). + */ + scalar Norm() const noexcept + { + return L2Norm(); + } + + /*! + * Returns a unit vector with the same direction as this vector. A unit + * vector has a norm (or magnitude) of 1. + */ + GenericVector Unit() const + { + GenericVector R( *this ); + scalar N = L2Norm(); + if ( scalar( 1 ) + N > scalar( 1 ) ) + R /= N; + return R; + } + + /*! + * Transforms this vector to a unit vector with the same direction. A unit + * vector has a norm (or magnitude) of 1. + */ + void SetUnit() + { + scalar N = L2Norm(); + if ( scalar( 1 ) + N > scalar( 1 ) ) + (void)operator /=( N ); + } + + /*! + * Sorts the components of this vector in ascending order. + */ + void Sort() + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns a sorted copy of this vector. + */ + GenericVector Sorted() const + { + GenericVector R( *this ); + R.Sort(); + return R; + } + + /*! + * Sorts the components of this vector in reverse (descending) order. + */ + void ReverseSort() + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End(), + []( const scalar& a, const scalar& b ){ return b < a; } ); + } + + /*! + * Returns a reverse sorted copy of this vector. + */ + GenericVector ReverseSorted() const + { + GenericVector R( *this ); + R.ReverseSort(); + return R; + } + + /*! + * Sorts the components of this vector in ascending order. Ordering of + * vector components is defined such that for any pair a, b of vector + * components, the specified binary predicate p( a, b ) is true if a + * precedes b. + */ + template + void Sort( BP p ) + { + EnsureUnique(); + pcl::Sort( m_data->Begin(), m_data->End(), p ); + } + + /*! + * Returns a sorted copy of this vector, where ordering of vector components + * is defined by the specified binary predicate \a p. See Sort( BP p ). + */ + template + GenericVector Sorted( BP p ) const + { + GenericVector R( *this ); + R.Sort( p ); + return R; + } + + /*! + * Returns the index of the first vector element with the specified value + * \a x, or -1 if this vector does not contain such value. + */ + int Find( const component& x ) const noexcept + { + const_iterator p = pcl::LinearSearch( m_data->Begin(), m_data->End(), x ); + return (p != m_data->End()) ? int( p - m_data->Begin() ) : -1; + } + + /*! + * Returns the index of the first vector element with the specified value + * \a x, or -1 if this vector does not contain such value. + * This function is an alias to Find(). + */ + int FindFirst( const component& x ) const noexcept + { + return Find( x ); + } + + /*! + * Returns the index of the last vector element with the specified value + * \a x, or -1 if this vector does not contain such value. + */ + int FindLast( const component& x ) const noexcept + { + const_iterator p = pcl::LinearSearchLast( m_data->Begin(), m_data->End(), x ); + return (p != m_data->End()) ? int( p - m_data->Begin() ) : -1; + } + + /*! + * Returns true iff this vector contains the specified value \a x. + */ + bool Contains( const component& x ) const noexcept + { + return pcl::LinearSearch( m_data->Begin(), m_data->End(), x ) != m_data->End(); + } + +#ifndef __PCL_NO_VECTOR_STATISTICS + + /*! + * Returns the index of the smallest vector component. + * + * For empty vectors, this function returns zero. For vectors where the + * smallest component occurs more than once, this function returns the index + * of the first occurrence. + */ + int IndexOfSmallestComponent() const noexcept + { + return int( pcl::MinItem( m_data->Begin(), m_data->End() ) - m_data->Begin() ); + } + + /*! + * Returns the index of the largest vector component. + * + * For empty vectors, this function returns zero. For vectors where the + * largest component occurs more than once, this function returns the index + * of the first occurrence. + */ + int IndexOfLargestComponent() const noexcept + { + return int( pcl::MaxItem( m_data->Begin(), m_data->End() ) - m_data->Begin() ); + } + + /*! + * Returns the index of the last occurrence of the smallest vector + * component. + * + * For empty vectors, this function returns zero. For vectors where the + * smallest component occurs more than once, this function returns the index + * of the last occurrence. + */ + int IndexOfLastSmallestComponent() const noexcept + { + iterator i = m_data->Begin(); + if ( m_data->Length() > 0 ) + for ( iterator j = m_data->Begin(); ++j < m_data->End(); ) + if ( *j <= *i ) + i = j; + return i - m_data->Begin(); + } + + /*! + * Returns the index of the last occurrence of the largest vector + * component. + * + * For empty vectors, this function returns zero. For vectors where the + * largest component occurs more than once, this function returns the index + * of the last occurrence. + */ + int IndexOfLastLargestComponent() const noexcept + { + iterator i = m_data->Begin(); + if ( m_data->Length() > 0 ) + for ( iterator j = m_data->Begin(); ++j < m_data->End(); ) + if ( *i <= *j ) + i = j; + return i - m_data->Begin(); + } + + /*! + * Returns the index of the smallest nonzero vector component. + * + * For empty vectors, this function returns zero. For vectors where the + * smallest nonzero component occurs more than once, this function returns + * the index of the first occurrence. + */ + int IndexOfSmallestNonzeroComponent() const noexcept + { + iterator i = m_data->Begin(); + if ( m_data->Length() > 0 ) + for ( iterator j = m_data->Begin(); ++j < m_data->End(); ) + if ( *j != component( 0 ) ) + if ( *j < *i ) + i = j; + return i - m_data->Begin(); + } + + /*! + * Returns the index of the last occurrence of the smallest nonzero vector + * component. + * + * For empty vectors, this function returns zero. For vectors where the + * smallest nonzero component occurs more than once, this function returns + * the index of the last occurrence. + */ + int IndexOfLastSmallestNonzeroComponent() const noexcept + { + iterator i = m_data->Begin(); + if ( m_data->Length() > 0 ) + for ( iterator j = m_data->Begin(); ++j < m_data->End(); ) + if ( *j != component( 0 ) ) + if ( *j <= *i ) + i = j; + return i - m_data->Begin(); + } + + /*! + * Returns the value of the smallest vector component. + * For empty vectors, this function returns zero conventionally. + */ + component MinComponent() const noexcept + { + if ( m_data->Length() > 0 ) + return *pcl::MinItem( m_data->Begin(), m_data->End() ); + return component( 0 ); + } + + /*! + * Returns the value of the largest vector component. + * For empty vectors, this function returns zero conventionally. + */ + component MaxComponent() const noexcept + { + if ( m_data->Length() > 0 ) + return *pcl::MaxItem( m_data->Begin(), m_data->End() ); + return component( 0 ); + } + + /*! + * Returns the \a kth order statistic of the sample in this vector. + * + * Before selecting the specified vector component, this function ensures + * that this instance uniquely references its vector data, generating a + * duplicate if necessary. + * + * The specified index \a k must be valid, that is, it must be in the range + * [0,Length()-1]. If a value of \a k outside the valid range is specified, + * or equivalently, if this function is called for an empty vector, this + * member function will invoke undefined behavior. + * + * \note This function uses a \e destructive selection algorithm: it alters + * the order in the sequence of vector components. For a nondestructive + * version, see the const version of this member function. + */ + component OrderStatistic( int k ) + { + PCL_PRECONDITION( !IsEmpty() ) + PCL_PRECONDITION( k >= 0 && k < m_data->Length() ) + EnsureUnique(); + return *pcl::Select( m_data->Begin(), m_data->End(), k ); + } + + /*! + * Returns the \a kth order statistic of the sample in this vector, without + * modifying this instance. + * + * The specified index \a k must be valid, that is, it must be in the range + * [0,Length()-1]. If a value of \a k outside the valid range is specified, + * or equivalently, if this function is called for an empty vector, this + * member function will invoke undefined behavior. + * + * This is a \e nondestructive selection routine that doesn't modify the + * order of existing vector components. To achieve that goal, this routine + * simply generates a temporary working vector as a copy of this object, + * then calls its OrderStatistic() member function to obtain the function's + * return value. + */ + component OrderStatistic( int k ) const + { + return GenericVector( *this ).OrderStatistic( k ); + } + + /*! + * Returns the sum of vector components. + * For empty vectors, this function returns zero. + */ + double Sum() const noexcept + { + return pcl::Sum( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of vector components using a numerically stable + * summation algorithm to minimize roundoff error. + * + * For empty vectors, this function returns zero. + */ + double StableSum() const noexcept + { + return pcl::StableSum( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the sum of the absolute values of all vector components. + * For empty vectors, this function returns zero. + */ + double Modulus() const noexcept + { + return pcl::Modulus( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of the absolute values of all vector components using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty vectors, this function returns zero. + */ + double StableModulus() const noexcept + { + return pcl::StableModulus( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the sum of the squares of all vector components. + * For empty vectors, this function returns zero. + */ + double SumOfSquares() const noexcept + { + return pcl::SumOfSquares( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the sum of the squares of all vector components using a + * numerically stable summation algorithm to minimize roundoff error. + * + * For empty vectors, this function returns zero. + */ + double StableSumOfSquares() const noexcept + { + return pcl::StableSumOfSquares( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the mean of the values in this vector. + * For empty vectors, this function returns zero. + */ + double Mean() const + { + return pcl::Mean( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the mean of the values in this vector using a numerically stable + * summation algorithm to minimize roundoff error. + * + * For empty vectors, this function returns zero. + */ + double StableMean() const noexcept + { + return pcl::StableMean( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the two-sided, asymmetric trimmed mean of the values in this + * vector. See pcl::TrimmedMean() for a complete description of the + * implemented algorithm with information on function parameters. + * + * For empty vectors, this function returns zero. + */ + double TrimmedMean( distance_type l = 1, distance_type h = 1 ) const noexcept + { + return pcl::TrimmedMean( m_data->Begin(), m_data->End(), l, h ); + } + + /*! + * Computes the two-sided, asymmetric trimmed mean of the squared values in + * this vector. See pcl::TrimmedMeanOfSquares() for a complete description + * of the implemented algorithm with information on function parameters. + * + * For empty vectors, this function returns zero. + */ + double TrimmedMeanOfSquares( distance_type l = 1, distance_type h = 1 ) const noexcept + { + return pcl::TrimmedMeanOfSquares( m_data->Begin(), m_data->End(), l, h ); + } + + /*! + * Returns the variance from the mean for the values in this vector. + * + * For vectors with less than two components, this function returns zero. + */ + double Variance() const noexcept + { + return pcl::Variance( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the standard deviation from the mean for the values in this + * vector. + * + * For vectors with less than two components, this function returns zero. + */ + double StdDev() const noexcept + { + return pcl::StdDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the median of the values in this vector. + * + * For vectors of length < 2, this function returns zero conventionally. + */ + double Median() const + { + return pcl::Median( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the average absolute deviation with respect to the specified + * \a center value. + * + * When the median of the vector elements is used as the center value, this + * function returns the average absolute deviation from the median, which is + * a well-known estimator of dispersion. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double AvgDev( double center ) const noexcept + { + return pcl::AvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Computes the average absolute deviation with respect to the specified + * \a center value, using a numerically stable summation algorithm to + * minimize roundoff error. + * + * When the median of the vector elements is used as the center value, this + * function returns the average absolute deviation from the median, which is + * a well-known estimator of dispersion. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double StableAvgDev( double center ) const noexcept + { + return pcl::StableAvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the average absolute deviation from the median. + * + * The mean absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double AvgDev() const + { + return pcl::AvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Computes the average absolute deviation from the median using a + * numerically stable summation algorithm to minimize roundoff error. + * + * The mean absolute deviation from the median is a well-known estimator of + * dispersion. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the average absolute deviation about the median consistent + * with the standard deviation of a normal distribution, it must be + * multiplied by the constant 1.2533. + */ + double StableAvgDev() const + { + return pcl::StableAvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the two-sided average absolute deviation with respect to the + * specified \a center value. + * + * See AvgDev( double ) for more information. + */ + TwoSidedEstimate TwoSidedAvgDev( double center ) const noexcept + { + return pcl::TwoSidedAvgDev( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the two-sided average absolute deviation from the median. + * + * See AvgDev() for more information. + */ + TwoSidedEstimate TwoSidedAvgDev() const + { + return pcl::TwoSidedAvgDev( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the median absolute deviation (MAD) with respect to the specified + * \a center value. + * + * The MAD is a well-known robust estimator of scale. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, it must be multiplied by the constant 1.4826. + */ + double MAD( double center ) const + { + return pcl::MAD( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the median absolute deviation from the median (MAD). + * + * The MAD is a well-known robust estimator of scale. + * + * For vectors with less than two components, this function returns zero. + * + * \note To make the MAD estimator consistent with the standard deviation of + * a normal distribution, it must be multiplied by the constant 1.4826. + */ + double MAD() const + { + return pcl::MAD( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the two-sided median absolute deviation (MAD) with respect to the + * specified \a center value. + * + * See MAD( double ) for more information. + */ + TwoSidedEstimate TwoSidedMAD( double center ) const + { + return pcl::TwoSidedMAD( m_data->Begin(), m_data->End(), center ); + } + + /*! + * Returns the two-sided median absolute deviation from the median (MAD). + * + * See MAD() for more information. + */ + TwoSidedEstimate TwoSidedMAD() const + { + return pcl::TwoSidedMAD( m_data->Begin(), m_data->End() ); + } + + /*! + * Returns the biweight midvariance (BWMV). + * + * \param center Reference center value. Normally, the median of the vector + * components should be used. + * + * \param sigma A reference estimate of dispersion. Normally, the median + * absolute deviation from the median (MAD) of the vector + * components should be used. + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude + * rejected vector components. This tends to approximate the + * true dispersion of the data more accurately for relatively + * small samples, or samples with large amounts of outliers. + * Note that this departs from the standard definition of + * biweight midvariance, where the total number of data items + * is used to scale the variance estimate. If false, use the + * full vector length, including rejected components, which + * gives a standard biweight midvariance estimate. + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the same as MAD). + * + * For vectors with less than two components, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.1. + */ + double BiweightMidvariance( double center, double sigma, int k = 9, bool reducedLength = false ) const noexcept + { + return pcl::BiweightMidvariance( m_data->Begin(), m_data->End(), center, sigma, k, reducedLength ); + } + + /*! + * Returns the biweight midvariance (BWMV) with respect to the median and + * the median absolute deviation from the median (MAD). + * + * \param k Rejection limit in sigma units. The default value is k=9. + * + * \param reducedLength If true, reduce the sample size to exclude + * rejected vector components. This tends to approximate the + * true dispersion of the data more accurately for relatively + * small samples, or samples with large amounts of outliers. + * Note that this departs from the standard definition of + * biweight midvariance, where the total number of data items + * is used to scale the variance estimate. If false, use the + * full vector length, including rejected components, which + * gives a standard biweight midvariance estimate. + * + * The square root of the biweight midvariance is a robust estimator of + * scale. It is an efficient estimator with respect to many statistical + * distributions (about 87% Gaussian efficiency), and appears to have a + * breakdown point close to 0.5 (the same as MAD). + * + * For vectors with less than two components, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.1. + */ + double BiweightMidvariance( int k = 9, bool reducedLength = false ) const + { + double center = Median(); + return BiweightMidvariance( center, MAD( center ), k, reducedLength ); + } + + /*! + * Returns the two-sided biweight midvariance (BWMV). + * + * \param center Reference center value. Normally, the median of the vector + * components should be used. + * + * \param sigma A two-sided reference estimate of dispersion. Normally, + * the two-sided median absolute deviation from the median + * (MAD) of the vector components should be used. See the + * TwoSidedMAD() member function. + * + * See BiweightMidvariance( double, double, int, bool ) for more information + * on the rest of parameters and references. + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( double center, const TwoSidedEstimate& sigma, + int k = 9, bool reducedLength = false ) const noexcept + { + return pcl::TwoSidedBiweightMidvariance( m_data->Begin(), m_data->End(), center, sigma, k, reducedLength ); + } + + /*! + * Returns the two-sided biweight midvariance (BWMV) with respect to the + * median and the two-sided median absolute deviation from the median (MAD). + * + * See BiweightMidvariance( int, bool ) for more information and references. + */ + TwoSidedEstimate TwoSidedBiweightMidvariance( int k = 9, bool reducedLength = false ) const + { + double center = Median(); + return TwoSidedBiweightMidvariance( center, TwoSidedMAD( center ), k, reducedLength ); + } + + /*! + * Returns a percentage bend midvariance (PBMV). + * + * \param center Reference center value. Normally, the median of the vector + * components should be used. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the + * breakdown point of the estimator) at the expense of a + * lower efficiency. The default value is beta=0.2. + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * For vectors with less than two components, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.3. + */ + double BendMidvariance( double center, double beta = 0.2 ) const + { + return pcl::BendMidvariance( m_data->Begin(), m_data->End(), center, beta ); + } + + /*! + * Returns a percentage bend midvariance (PBMV) with respect to the median. + * + * \param beta Rejection parameter in the [0,0.5] range. Higher values + * improve robustness to outliers (i.e., increase the + * breakdown point of the estimator) at the expense of a + * lower efficiency. The default value is beta=0.2. + * + * The square root of the percentage bend midvariance is a robust estimator + * of scale. With the default beta=0.2, its Gaussian efficiency is 67%. With + * beta=0.1, its efficiency is 85% but its breakdown is only 0.1. + * + * For vectors with less than two components, this function returns zero. + * + * \b References + * + * Rand R. Wilcox (2017), Introduction to Robust Estimation and + * Hypothesis Testing, 4th Edition, Elsevier Inc., Section 3.12.3. + */ + double BendMidvariance( double beta = 0.2 ) const + { + return pcl::BendMidvariance( m_data->Begin(), m_data->End(), Median(), beta ); + } + + /*! + * Returns the Sn scale estimator of Rousseeuw and Croux: + * + *

+    * Sn = c * low_median( high_median( |x_i - x_j| ) )
+    * 
+ * + * where low_median() is the order statistic of rank (n + 1)/2, and + * high_median() is the order statistic of rank n/2 + 1. + * + * For vectors with less than two components, this function returns zero. + * + * The constant c = 1.1926 must be used to make the Sn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for + * consistency with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median + * Absolute Deviation, Journal of the American Statistical Association, + * Vol. 88, pp. 1273-1283. + */ + double Sn() const + { + GenericVector v( *this ); + return pcl::Sn( v.Begin(), v.End() ); + } + + /*! + * Returns the Qn scale estimator of Rousseeuw and Croux: + * + *
+    * Qn = c * first_quartile( |x_i - x_j| : i < j )
+    * 
+ * + * where first_quartile() is the order statistic of rank (n + 1)/4. + * + * For vectors with less than two components, this function returns zero. + * + * The constant c = 2.2219 must be used to make the Qn estimator converge to + * the standard deviation of a pure normal distribution. However, this + * implementation does not apply it (it uses c=1 implicitly), for consistency + * with other implementations of scale estimators. + * + * \b References + * + * P.J. Rousseeuw and C. Croux (1993), Alternatives to the Median + * Absolute Deviation, Journal of the American Statistical Association, + * Vol. 88, pp. 1273-1283. + */ + double Qn() const + { + GenericVector v( *this ); + return pcl::Qn( v.Begin(), v.End() ); + } + +#endif // !__PCL_NO_VECTOR_STATISTICS + + /*! + * Returns a 64-bit non-cryptographic hash value computed for this vector. + * + * This function calls pcl::Hash64() for the internal vector data. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint64 Hash64( uint64 seed = 0 ) const noexcept + { + return pcl::Hash64( m_data->Begin(), m_data->Size(), seed ); + } + + /*! + * Returns a 32-bit non-cryptographic hash value computed for this vector. + * + * This function calls pcl::Hash32() for the internal vector data. + * + * The \a seed parameter can be used to generate repeatable hash values. It + * can also be set to a random value in compromised environments. + */ + uint32 Hash32( uint32 seed = 0 ) const noexcept + { + return pcl::Hash32( m_data->Begin(), m_data->Size(), seed ); + } + + /*! + * Returns a non-cryptographic hash value computed for this vector. This + * function is a synonym for Hash64(). + */ + uint64 Hash( uint64 seed = 0 ) const noexcept + { + return Hash64( seed ); + } + + /*! + * Returns true iff this instance uniquely references its vector data. + */ + bool IsUnique() const noexcept + { + return m_data->IsUnique(); + } + + /*! + * Returns true iff this instance references (shares) the same vector data as + * another instance \a x. + */ + bool IsAliasOf( const GenericVector& x ) const noexcept + { + return m_data == x.m_data; + } + + /*! + * Ensures that this instance uniquely references its vector data. + * + * If necessary, this member function generates a duplicate of the vector + * data, references it, and then decrements the reference counter of the + * original vector data. + */ + void EnsureUnique() + { + if ( !IsUnique() ) + { + Data* newData = new Data( m_data->Length() ); + const_iterator __restrict__ i = m_data->Begin(); + const_iterator __restrict__ j = m_data->End(); + iterator __restrict__ k = newData->Begin(); + PCL_IVDEP + for ( ; i < j; ++i, ++k ) + *k = *i; + DetachFromData(); + m_data = newData; + } + } + + /*! + * Returns the number of components in this vector. If this object is an + * empty vector, this member function returns zero. + */ + int Length() const noexcept + { + return m_data->Length(); + } + + /*! + * Returns the total number of bytes required to store the data contained in + * this vector. + */ + size_type Size() const noexcept + { + return m_data->Size(); + } + + /*! + * Returns true only if this vector is valid. A vector is valid if it + * references an internal vector structure, even if it is an empty vector. + * + * In general, all %GenericVector objects are valid with only two + * exceptions: + * + * \li Objects that have been move-copied or move-assigned to other vectors. + * \li Objects that have been invalidated explicitly by calling Transfer(). + * + * An invalid vector object cannot be used and should be destroyed + * immediately. Invalid vectors are always destroyed automatically during + * move construction and move assignment operations. + */ + bool IsValid() const noexcept + { + return m_data != nullptr; + } + + /*! + * Returns true iff this is an empty vector. An empty vector has no + * components, and hence its length is zero. + */ + bool IsEmpty() const noexcept + { + return Length() == 0; + } + + /*! + * Returns true iff this vector is not empty. This operator is equivalent to: + * + * \code !IsEmpty(); \endcode + */ + operator bool() const noexcept + { + return !IsEmpty(); + } + + /*! + * Equality operator. Returns true if this vector is equal to another vector + * \a x. Two vectors are equal if both have the same length and identical + * component values. + */ + bool operator ==( const GenericVector& x ) const noexcept + { + return IsAliasOf( x ) || SameLength( x ) && pcl::Equal( Begin(), x.Begin(), x.End() ); + } + + /*! + * Less than relational operator. Returns true if this vector is less than + * another vector \a x. + * + * In this operator, vector comparisons are performed component-wise, + * irrespective of vector lengths, until either two vector components differ + * or until the end of one of the vectors is reached. In the latter case, + * the shortest vector is the lesser one. + */ + bool operator <( const GenericVector& x ) const noexcept + { + return !IsAliasOf( x ) && pcl::Compare( Begin(), End(), x.Begin(), x.End() ) < 0; + } + + /*! + * Returns true iff this vector has the same length as other vector \a x. + */ + bool SameLength( const GenericVector& x ) const noexcept + { + return Length() == x.Length(); + } + + /*! + * Returns a mutable vector iterator pointing to the \a i-th component of + * this vector. + * + * Before returning, this function ensures that this instance uniquely + * references its vector data. + */ + iterator At( int i ) + { + EnsureUnique(); + return m_data->At( i ); + } + + /*! + * Returns an immutable vector iterator pointing to the \a i-th component of + * this vector. + */ + const_iterator At( int i ) const noexcept + { + return m_data->At( i ); + } + + /*! + * Returns a mutable vector iterator pointing to the first vector component, + * i.e. to the component at index 0 of this vector. + * + * All vector components are guaranteed to be stored at consecutive + * locations addressable from the iterator returned by this function. + * + * Before returning, this function ensures that this instance uniquely + * references its vector data. + */ + iterator Begin() + { + EnsureUnique(); + return m_data->Begin(); + } + + /*! + * Returns an immutable vector iterator pointing to the first vector + * component, i.e. to the component at index 0 of this vector. + * + * All vector components are guaranteed to be stored at consecutive + * locations addressable from the iterator returned by this function. + */ + const_iterator Begin() const noexcept + { + return m_data->Begin(); + } + + /*! + * A synonym for Begin() const. + */ + const_iterator ConstBegin() const noexcept + { + return Begin(); + } + + /*! + * Returns a mutable vector iterator pointing to the first vector component, + * i.e. to the component at index 0 of this vector. + * + * This member function is a convenience alias to Begin(). + */ + iterator operator *() + { + return Begin(); + } + + /*! + * Returns an immutable vector iterator pointing to the first vector + * component, i.e. to the component at index 0 of this vector. + * + * This member function is a convenience alias to Begin() const. + */ + const_iterator operator *() const noexcept + { + return Begin(); + } + + /*! + * Returns a mutable iterator past the last vector component, i.e. a + * pointer to a (nonexistent) component located at index=Length(). + * + * All vector components are guaranteed to be stored in reverse order at + * consecutive locations addressable from the iterator returned by this + * function. + * + * Before returning, this function ensures that this instance uniquely + * references its vector data. + */ + iterator End() + { + EnsureUnique(); + return m_data->End(); + } + + /*! + * Returns an immutable iterator past the last vector component, i.e. a + * pointer to a (nonexistent) component located at index=Length(). + * + * All vector components are guaranteed to be stored in reverse order at + * consecutive locations addressable from the iterator returned by this + * function. + */ + const_iterator End() const noexcept + { + return m_data->End(); + } + + /*! + * A synonym for End() const. + */ + const_iterator ConstEnd() const noexcept + { + return End(); + } + + /*! + * Returns a reference to the mutable vector component at the specified + * index \a i. Vector indices are relative to zero. + * + * Before returning, this function ensures that this instance uniquely + * references its vector data. + */ + component& operator []( int i ) + { + return *At( i ); + } + + /*! + * Returns a reference to the immutable vector component at the specified + * index \a i. Vector indices are relative to zero. + */ + const component& operator []( int i ) const noexcept + { + return *At( i ); + } + + /*! + * Returns a pointer to the first component in this vector. + * + * The returned pointer can be used as a common C array, where all vector + * components are guaranteed to be stored consecutively starting from the + * pointer returned by this function. + * + * This member function does nothing to ensure that this instance uniquely + * references its vector data. Consequently, the caller must take into + * account that all modifications made to vector components accessed through + * the value returned by this function will apply to all instances sharing + * the same vector data. + * + * This function can be used to perform fast operations on vector components + * avoiding the overhead caused by deep copies of vector data, when such + * copies are not necessary. Typically this happens when two or more threads + * work simultaneously on non-overlapping regions of the same vector. + */ + iterator DataPtr() noexcept + { + return m_data->v; + } + + /*! + * Returns a pointer to the \a ith component in this vector. + * + * All vector components are guaranteed to be stored at consecutive + * locations addressable from the iterator returned by this function. + * + * This member function does not ensure that the data referenced by this + * vector is unique. See DataPtr() for more information on how to use this + * member function. + */ + iterator ComponentPtr( int i ) noexcept + { + return m_data->At( i ); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const noexcept + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const noexcept + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Computes spherical coordinates from this three-component vector. + * + * \param[out] lon Reference to a variable where the computed longitude + * in radians, in the range [-pi,+pi], will be stored. If + * the vector points to one pole, that is, if *lat is + * either -pi/2 or +pi/2, the computed longitude will be + * zero. + * + * \param[out] lat Reference to a variable where the computed latitude + * in radians, in the range [-pi/2,+pi/2], will be stored. + * + * This function requires a vector with at least three coordinates. For + * performance reasons, the vector length is not verified. + * + * The returned coordinates lie on a sphere of unit radius, that is, only + * the direction of the input vector is taken into account, never its + * magnitude. + * + * \sa ToSpherical2Pi(), FromSpherical() + */ + template + void ToSpherical( T1& lon, T2& lat ) const noexcept + { + PCL_PRECONDITION( Length() >= 3 ) + double x = *At( 0 ); + double y = *At( 1 ); + double z = *At( 2 ); + double m2 = x*x + y*y; + lon = T1( (m2 == 0) ? 0.0 : ArcTan( y, x ) ); + lat = T2( (z == 0) ? 0.0 : ArcTan( z, pcl::Sqrt( m2 ) ) ); + } + + /*! + * Computes spherical coordinates from this three-component vector. + * + * This function is identical to ToSpherical(), but the output longitude + * component is normalized to the range [0,2pi) in radians. + * + * \sa ToSpherical(), FromSpherical() + */ + template + void ToSpherical2Pi( T1& lon, T2& lat ) const noexcept + { + ToSpherical( lon, lat ); + if ( lon < 0 ) + lon += TwoPi(); + } + + /*! + * Returns a three-component vector with rectangular coordinates computed + * from spherical coordinates, given by their sines and cosines + * + * \param slon Sine of the longitude. + * \param clon Cosine of the longitude. + * \param slat Sine of the latitude. + * \param clat Cosine of the latitude. + * + * The returned vector contains the direction cosines for the + * specified position on the sphere. It is a unit vector (unit magnitude) + * pointing from the center of the sphere to the specified location. + * + * \sa ToSpherical(), ToSpherical2Pi() + */ + static GenericVector FromSpherical( double slon, double clon, double slat, double clat ) + { + return GenericVector( clon*clat, slon*clat, slat ); + } + + /*! + * Returns a three-component vector with rectangular coordinates computed + * from the specified spherical coordinates. + * + * \param lon Longitude in radians. + * \param lat Latitude in radians. + * + * The returned vector contains the direction cosines for the + * specified position on the sphere. It is a unit vector (unit magnitude) + * pointing from the center of the sphere to the specified location. + * + * \sa ToSpherical() + */ + template + static GenericVector FromSpherical( const T1& lon, const T2& lat ) + { + double slon, clon, slat, clat; + SinCos( double( lon ), slon, clon ); + SinCos( double( lat ), slat, clat ); + return FromSpherical( slon, clon, slat, clat ); + } + + /*! + * Returns the angle between this vector and another vector \a v, with both + * vectors being defined in two-dimensional space. + * + * The returned value is the angle between both vectors in radians, in the + * range [-pi,+pi]. + * + * \note This member function is only defined for vectors of two components. + * For performance reasons, this condition is not verified; if it doesn't + * hold, this function will invoke undefined behavior. + */ + double Angle2D( const GenericVector& v ) const noexcept + { + /* + * https://stackoverflow.com/questions/14066933/direct-way-of-computing-clockwise-angle-between-2-vectors + * https://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product + */ + component x1 = *At( 0 ); + component y1 = *At( 1 ); + component x2 = v[0]; + component y2 = v[1]; + return ArcTan( x1*y2 - y1*x2, Dot( v ) ); + } + + /*! + * Returns the angle between this vector and another vector \a v, with both + * vectors being defined in three-dimensional space. + * + * The returned value is the angle between both vectors in radians, in the + * range [0,pi]. + * + * \note This member function is only defined for vectors of three + * components. For performance reasons, this condition is not verified; if + * it doesn't hold, this function will invoke undefined behavior. + */ + double Angle3D( const GenericVector& v ) const noexcept + { + /* + * https://stackoverflow.com/questions/14066933/direct-way-of-computing-clockwise-angle-between-2-vectors + */ + return ArcTan( Cross( v ).L2Norm(), Dot( v ) ); + } + + /*! + * Returns the angle between this vector and another vector \a v, being both + * vectors defined in three-dimensional space, with sign determined by the + * direction of an additional 3D vector \a n. + * + * The returned value is the angle between both vectors in radians, in the + * range [-pi,+pi]. The angle is positive if this vector is clockwise with + * respect to the direction of \a n, negative otherwise. + * + * \note This member function is only defined for vectors of three + * components. For performance reasons, this condition is not verified; if + * it doesn't hold, this function will invoke undefined behavior. + */ + double Angle3D( const GenericVector& v, const GenericVector& n ) const + { + /* + * https://stackoverflow.com/questions/14066933/direct-way-of-computing-clockwise-angle-between-2-vectors + */ + GenericVector c = Cross( v ); + return ArcTan( (((n * c) >= 0) ? 1 : -1) * c.L2Norm(), Dot( v ) ); + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string. Returns a reference to the target string \a s. + * + * For each vector component, this function appends a string representation + * (known as a \e token) to the target string \a s. If the vector has more + * than one component, successive tokens are separated with the specified + * \a separator. + * + * The string type S must have a meaningful %Append() member function and + * type conversion semantics to transform a vector component to a string. + * The standard String and IsoString PCL classes provide the required + * functionality for most scalar types, although it is probably better to + * use String::ToSeparated() and IsoString::ToSeparated() instead of calling + * these functions directly. + */ + template + S& ToSeparated( S& s, SP separator ) const + { + const_iterator i = m_data->Begin(), j = m_data->End(); + if ( i < j ) + { + s.Append( S( *i ) ); + if ( ++i < j ) + do + { + s.Append( separator ); + s.Append( S( *i ) ); + } + while ( ++i < j ); + } + return s; + } + + /*! + * Generates a sequence of string tokens separated with the specified + * \a separator string by calling an \a append function. Returns a reference + * to the target string \a s. + * + * For each vector component x, this function appends a string + * representation (known as a \e token) to the target string \a s by calling + * the \a append function: + * + *\code append( s, S( x ) ); \endcode + * + * If the vector has more than one component, successive tokens are + * separated by calling: + * + * \code append( s, S( separator ) ); \endcode + * + * The string type S must have type conversion semantics to transform a + * vector component to a string. The standard String and IsoString PCL + * classes provide the required functionality for most scalar types, + * although it is probably better to use String::ToSeparated() and + * IsoString::ToSeparated() instead of calling these functions directly. + */ + template + S& ToSeparated( S& s, SP separator, AF append ) const + { + const_iterator i = m_data->Begin(), j = m_data->End(); + if ( i < j ) + { + append( s, S( *i ) ); + if ( ++i < j ) + { + S p( separator ); + do + { + append( s, p ); + append( s, S( *i ) ); + } + while ( ++i < j ); + } + } + return s; + } + + /*! + * Generates a comma-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ',' ); \endcode + */ + template + S& ToCommaSeparated( S& s ) const + { + return ToSeparated( s, ',' ); + } + + /*! + * Generates a space-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, ' ' ); \endcode + */ + template + S& ToSpaceSeparated( S& s ) const + { + return ToSeparated( s, ' ' ); + } + + /*! + * Generates a tabulator-separated sequence of string tokens. Returns a + * reference to the target string \a s. + * + * This function is equivalent to: + * + * \code ToSeparated( s, '\t' ); \endcode + */ + template + S& ToTabSeparated( S& s ) const + { + return ToSeparated( s, '\t' ); + } + +private: + + /*! + * \struct Data + * \internal + * Reference-counted vector data structure. + */ + struct Data : public ReferenceCounter + { + int n = 0; //!< The vector length + component* v = nullptr; //!< The vector components + + Data() = default; + + Data( int len ) + { + if ( len > 0 ) + Allocate( len ); + } + + ~Data() + { + Deallocate(); + } + + int Length() const noexcept + { + return n; + } + + size_type Size() const noexcept + { + return size_type( n )*sizeof( component ); + } + + iterator At( int i ) const noexcept + { + return v + i; + } + + iterator Begin() const noexcept + { +// if ( likely( std::is_scalar::value ) ) +// return reinterpret_cast( PCL_ASSUME_ALIGNED_32( v ) ); + return v; + } + + iterator End() const noexcept + { + return At( n ); + } + + void Allocate( int len ) + { + n = len; + if ( likely( std::is_scalar::value ) ) + { + v = reinterpret_cast( PCL_ALIGNED_MALLOC( Size(), 32 ) ); + if ( unlikely( v == nullptr ) ) + { + n = 0; + throw std::bad_alloc(); + } + } + else + v = new component[ len ]; + } + + void Deallocate() + { + PCL_PRECONDITION( refCount == 0 ) + if ( likely( std::is_scalar::value ) ) + PCL_ALIGNED_FREE( v ); + else + delete [] v; + v = nullptr; + n = 0; + } + }; + + /*! + * \internal + * The reference-counted vector data. + */ + Data* m_data = nullptr; + + /*! + * \internal + * Dereferences vector data and disposes it if it becomes garbage. + */ + void DetachFromData() + { + if ( !m_data->Detach() ) + delete m_data; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup vector_operators Vector Operators + * + * This section includes scalar-to-vector and vector-to-vector arithmetic + * operator functions that are not members of the GenericVector template class. + */ + +/*! + * Returns the sum of two vectors \a A and \a B. + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( const GenericVector& A, const GenericVector& B ) +{ + int n = A.Length(); + if ( B.Length() < n ) + throw Error( "Invalid vector addition." ); + GenericVector R( n ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + if ( likely( !A.IsAliasOf( B ) ) ) + { + typename GenericVector::const_iterator __restrict__ b = B.Begin(); + PCL_IVDEP + for ( ; a < c; ++a, ++b, ++r ) + *r = *a + *b; + } + else + { + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a + *a; + } + return R; +} + +/*! + * Returns the sum of two vectors \a A (rvalue reference) and \a B. + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( GenericVector&& A, const GenericVector& B ) +{ + A += B; + return std::move( A ); +} + +/*! + * Returns the sum of two vectors \a A and \a B (rvalue reference). + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( const GenericVector& A, GenericVector&& B ) +{ + B += A; + return std::move( B ); +} + +/*! + * Returns the sum of two vectors \a A (rvalue reference) and \a B (rvalue + * reference). + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( GenericVector&& A, GenericVector&& B ) +{ + A += B; + return std::move( A ); +} + +/*! + * Returns the sum of a vector \a A and a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( const GenericVector& A, const S& x ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a + x; + return R; +} + +/*! + * Returns the sum of a vector \a A (rvalue reference) and a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( GenericVector&& A, const S& x ) +{ + A += typename GenericVector::scalar( x ); + return std::move( A ); +} + +/*! + * Returns the sum of a scalar \a x and a vector \a A. + * + * This function exists to implement the commutative property of + * scalar-to-vector addition; it is equivalent to A + x. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( const S& x, const GenericVector& A ) +{ + return A + x; +} + +/*! + * Returns the sum of a scalar \a x and a vector \a A (rvalue reference). + * + * This function exists to implement the commutative property of + * scalar-to-vector addition; it is equivalent to A + x. + * \ingroup vector_operators + */ +template inline +GenericVector operator +( const S& x, GenericVector&& A ) +{ + A += typename GenericVector::scalar( x ); + return std::move( A ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of subtracting a vector \a B from another vector \a A. + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator -( const GenericVector& A, const GenericVector& B ) +{ + int n = A.Length(); + if ( B.Length() < n ) + throw Error( "Invalid vector subtraction." ); + + GenericVector R( n ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + if ( likely( !A.IsAliasOf( B ) ) ) + { + typename GenericVector::const_iterator __restrict__ b = B.Begin(); + PCL_IVDEP + for ( ; a < c; ++a, ++b, ++r ) + *r = *a - *b; + } + else + { + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a - *a; + } + return R; +} + +/*! + * Returns the result of subtracting a vector \a B from another vector \a A + * (rvalue reference). + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator -( GenericVector&& A, const GenericVector& B ) +{ + A -= B; + return std::move( A ); +} + +/*! + * Returns the result of subtracting a vector \a B (rvalue reference) from + * another vector \a A. + * + * If the specified vectors are incompatible for vector addition (because \a A + * has less components than \a B), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator -( const GenericVector& A, GenericVector&& B ) +{ + if ( A.Length() < B.Length() ) + throw Error( "Invalid vector subtraction." ); + + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::iterator __restrict__ b = B.Begin(); + typename GenericVector::const_iterator __restrict__ c = B.End(); + PCL_IVDEP + for ( ; b < c; ++a, ++b ) + *b = *a - *b; + return std::move( B ); +} + +/*! + * Returns the result of subtracting a vector \a B (rvalue reference) from + * another vector \a A (rvalue reference). + * + * If the specified vectors are incompatible for vector addition (because \a B + * has less components than \a A), this function throws an Error exception. + * \ingroup vector_operators + */ +template inline +GenericVector operator -( GenericVector&& A, GenericVector&& B ) +{ + A -= B; + return std::move( A ); +} + +/*! + * Returns the subtraction of a scalar \a x from a vector \a A. + * \ingroup vector_operators + */ +template inline +GenericVector operator -( const GenericVector& A, const S& x ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a - x; + return R; +} + +/*! + * Returns the subtraction of a scalar \a x from a vector \a A (rvalue + * reference). + * \ingroup vector_operators + */ +template inline +GenericVector operator -( GenericVector&& A, const S& x ) +{ + A -= typename GenericVector::scalar( x ); + return std::move( A ); +} + +/*! + * Returns the subtraction of a vector \a A from a scalar \a x. + * + * This function exists because scalar-to-vector subtraction is not a + * commutative operation. A - x is not equal to x - A (the resulting vector + * components have the same magnitudes but opposite signs). + * \ingroup vector_operators + */ +template inline +GenericVector operator -( const S& x, const GenericVector& A ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = x - *a; + return R; +} + +/*! + * Returns the subtraction of a vector \a A (rvalue reference) from a scalar + * \a x. + * + * This function exists because scalar-to-vector subtraction is not a + * commutative operation. A - x is not equal to x - A (the resulting vector + * components have the same magnitudes but opposite signs). + * \ingroup vector_operators + */ +template inline +GenericVector operator -( const S& x, GenericVector&& A ) +{ + typename GenericVector::iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a ) + *a = x - *a; + return std::move( A ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the cross product of two vectors \a A and \a B. + * + * \note The cross product is only defined for vectors of three components. For + * performance reasons, this function does not check vector lengths. For + * vectors of length < 3, this function will invoke undefined behavior. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( const GenericVector& A, const GenericVector& B ) +{ + PCL_PRECONDITION( A.Length() == 3 && B.Length() == 3 ) + return GenericVector( A[1]*B[2] - A[2]*B[1], + A[2]*B[0] - A[0]*B[2], + A[0]*B[1] - A[1]*B[0] ); +} + +/*! + * Returns the cross product of two vectors \a A (rvalue reference) and \a B. + * + * \note The cross product is only defined for vectors of three components. For + * performance reasons, this function does not check vector lengths. For + * vectors of length < 3, this function will invoke undefined behavior. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( GenericVector&& A, const GenericVector& B ) +{ + T x = A[1]*B[2] - A[2]*B[1], + y = A[2]*B[0] - A[0]*B[2], + z = A[0]*B[1] - A[1]*B[0]; + typename GenericVector::iterator a = A.Begin(); + a[0] = x; a[1] = y; a[2] = z; + return std::move( A ); +} + +/*! + * Returns the cross product of two vectors \a A and \a B (rvalue reference). + * + * \note The cross product is only defined for vectors of three components. For + * performance reasons, this function does not check vector lengths. For + * vectors of length < 3, this function will invoke undefined behavior. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( const GenericVector& A, GenericVector&& B ) +{ + T x = A[1]*B[2] - A[2]*B[1], + y = A[2]*B[0] - A[0]*B[2], + z = A[0]*B[1] - A[1]*B[0]; + typename GenericVector::iterator b = B.Begin(); + b[0] = x; b[1] = y; b[2] = z; + return std::move( B ); +} + +/*! + * Returns the cross product of two vectors \a A (rvalue reference) and \a B + * (rvalue reference). + * + * \note The cross product is only defined for vectors of three components. For + * performance reasons, this function does not check vector lengths. For + * vectors of length < 3, this function will invoke undefined behavior. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( GenericVector&& A, GenericVector&& B ) +{ + T x = A[1]*B[2] - A[2]*B[1], + y = A[2]*B[0] - A[0]*B[2], + z = A[0]*B[1] - A[1]*B[0]; + typename GenericVector::iterator a = A.Begin(); + a[0] = x; a[1] = y; a[2] = z; + return std::move( A ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the dot product of two vectors \a A and \a B. + * + * \note For performance reasons, this function does not check whether the + * specified vectors have compatible lengths; in case \a B has less components + * than \a A, this function will invoke undefined behavior. + * \ingroup vector_operators + */ +template inline +T operator *( const GenericVector& A, const GenericVector& B ) noexcept +{ + PCL_PRECONDITION( B.Length() >= A.Length() ) + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + T r = T( 0 ); + if ( likely( !A.IsAliasOf( B ) ) ) + { + typename GenericVector::const_iterator __restrict__ b = B.Begin(); + PCL_IVDEP + for ( ; a < c; ++a, ++b ) + r += *a * *b; + } + else + { + PCL_IVDEP + for ( ; a < c; ++a ) + r += *a * *a; + } + return r; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the product of a vector \a A by a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator *( const GenericVector& A, const S& x ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a * x; + return R; +} + +/*! + * Returns the product of a vector \a A (rvalue reference) by a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator *( GenericVector&& A, const S& x ) +{ + A *= typename GenericVector::scalar( x ); + return std::move( A ); +} + +/*! + * Returns the product of a scalar \a x and a vector \a A. + * + * This function exists to implement the commutative property of + * scalar-to-vector multiplication. It is equivalent to A * x. + * \ingroup vector_operators + */ +template inline +GenericVector operator *( const S& x, const GenericVector& A ) +{ + return A * x; +} + +/*! + * Returns the product of a scalar \a x and a vector \a A (rvalue reference). + * + * This function exists to implement the commutative property of + * scalar-to-vector multiplication. It is equivalent to A * x. + * \ingroup vector_operators + */ +template inline +GenericVector operator *( const S& x, GenericVector&& A ) +{ + A *= typename GenericVector::scalar( x ); + return std::move( A ); +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of dividing a vector \a A by a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( const GenericVector& A, const S& x ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a / x; + return R; +} + +/*! + * Returns the result of dividing a vector \a A (rvalue reference) by a scalar + * \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( GenericVector&& A, const S& x ) +{ + A /= typename GenericVector::scalar( x ); + return std::move( A ); +} + +/*! + * Returns the result of dividing a scalar \a x by a vector \a A. + * + * This function exists because scalar-to-vector division is not a + * commutative operation. A/x is not equal to x/A. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( const S& x, const GenericVector& A ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = x / *a; + return R; +} + +/*! + * Returns the result of dividing a scalar \a x by a vector \a A (rvalue + * reference). + * + * This function exists because scalar-to-vector division is not a + * commutative operation. A/x is not equal to x/A. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( const S& x, GenericVector&& A ) +{ + typename GenericVector::iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a ) + *a = x / *a; + return std::move( A ); +} + +/*! + * Returns the result of the element wise division of a vector \a A by another + * vector \a B. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( const GenericVector& A, const GenericVector& B ) +{ + int n = A.Length(); + if ( B.Length() < n ) + throw Error( "Invalid vector division." ); + + GenericVector R( n ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + if ( likely( !A.IsAliasOf( B ) ) ) + { + typename GenericVector::const_iterator __restrict__ b = B.Begin(); + PCL_IVDEP + for ( ; a < c; ++a, ++b, ++r ) + *r = *a / *b; + } + else + { + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = *a / *a; + } + return R; +} + +/*! + * Returns the result of the element-wise division of an r-value reference to a + * vector \a A by a vector \a B. + * \ingroup vector_operators + */ +template inline +GenericVector operator /( GenericVector&& A, const GenericVector& B ) +{ + return A /= B; +} + +// ---------------------------------------------------------------------------- + +/*! + * Returns the result of raising a vector \a A to a scalar \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( const GenericVector& A, const S& x ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = pcl::Pow( *a, x ); + return R; +} + +/*! + * Returns the result of raising a vector \a A (rvalue reference) to a scalar + * \a x. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( GenericVector&& A, const S& x ) +{ + A ^= typename GenericVector::scalar( x ); + return std::move( A ); +} + +/*! + * Returns the result of raising a scalar \a x to a vector \a A. + * + * This function exists because scalar-to-vector exponentiation is not a + * commutative operation. A^x is not equal to x^A. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( const S& x, const GenericVector& A ) +{ + GenericVector R( A.Length() ); + typename GenericVector::iterator __restrict__ r = R.Begin(); + typename GenericVector::const_iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a, ++r ) + *r = pcl::Pow( x, *a ); + return R; +} + +/*! + * Returns the result of raising a scalar \a x to a vector \a A (rvalue + * reference). + * + * This function exists because scalar-to-vector exponentiation is not a + * commutative operation. A^x is not equal to x^A. + * \ingroup vector_operators + */ +template inline +GenericVector operator ^( const S& x, GenericVector&& A ) +{ + typename GenericVector::iterator __restrict__ a = A.Begin(); + typename GenericVector::const_iterator __restrict__ c = A.End(); + PCL_IVDEP + for ( ; a < c; ++a ) + *a = pcl::Pow( x, *a ); + return std::move( A ); +} + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_NO_VECTOR_INSTANTIATE + +/*! + * \defgroup vector_types Vector Types + */ + +/*! + * \class pcl::I8Vector + * \ingroup vector_types + * \brief 8-bit signed integer vector. + * + * %I8Vector is a template instantiation of GenericVector for \c int8. + */ +typedef GenericVector I8Vector; + +/*! + * \class pcl::CharVector + * \ingroup vector_types + * \brief 8-bit signed integer vector. + * + * %CharVector is an alias for I8Vector. It is a template instantiation of + * GenericVector for \c int8. + */ +typedef I8Vector CharVector; + +/*! + * \class pcl::UI8Vector + * \ingroup vector_types + * \brief 8-bit unsigned integer vector. + * + * %UI8Vector is a template instantiation of GenericVector for \c uint8. + */ +typedef GenericVector UI8Vector; + +/*! + * \class pcl::ByteVector + * \ingroup vector_types + * \brief 8-bit unsigned integer vector. + * + * %ByteVector is an alias for UI8Vector. It is a template instantiation of + * GenericVector for \c uint8. + */ +typedef UI8Vector ByteVector; + +/*! + * \class pcl::I16Vector + * \ingroup vector_types + * \brief 16-bit signed integer vector. + * + * %I16Vector is a template instantiation of GenericVector for \c int16. + */ +typedef GenericVector I16Vector; + +/*! + * \class pcl::UI16Vector + * \ingroup vector_types + * \brief 16-bit unsigned integer vector. + * + * %UI16Vector is a template instantiation of GenericVector for \c uint16. + */ +typedef GenericVector UI16Vector; + +/*! + * \class pcl::I32Vector + * \ingroup vector_types + * \brief 32-bit signed integer vector. + * + * %I32Vector is a template instantiation of GenericVector for \c int32. + */ +typedef GenericVector I32Vector; + +/*! + * \class pcl::IVector + * \ingroup vector_types + * \brief 32-bit signed integer vector. + * + * %IVector is an alias for I32Vector. It is a template instantiation of + * GenericVector for \c int32. + */ +typedef I32Vector IVector; + +/*! + * \class pcl::UI32Vector + * \ingroup vector_types + * \brief 32-bit unsigned integer vector. + * + * %UI32Vector is a template instantiation of GenericVector for \c uint32. + */ +typedef GenericVector UI32Vector; + +/*! + * \class pcl::UIVector + * \ingroup vector_types + * \brief 32-bit unsigned integer vector. + * + * %UIVector is an alias for UI32Vector. It is a template instantiation of + * GenericVector for \c uint32. + */ +typedef UI32Vector UIVector; + +/*! + * \class pcl::I64Vector + * \ingroup vector_types + * \brief 64-bit integer vector. + * + * %I64Vector is a template instantiation of GenericVector for \c int64. + */ +typedef GenericVector I64Vector; + +/*! + * \class pcl::UI64Vector + * \ingroup vector_types + * \brief 64-bit unsigned integer vector. + * + * %UI64Vector is a template instantiation of GenericVector for \c uint64. + */ +typedef GenericVector UI64Vector; + +/*! + * \class pcl::SzVector + * \ingroup vector_types + * \brief size_type integer vector. + * + * %SzVector is a template instantiation of GenericVector for \c size_type. + */ +typedef GenericVector SzVector; + +/*! + * \class pcl::F32Vector + * \ingroup vector_types + * \brief 32-bit floating point real vector. + * + * %F32Vector is a template instantiation of GenericVector for \c float. + */ +typedef GenericVector F32Vector; + +/*! + * \class pcl::FVector + * \ingroup vector_types + * \brief 32-bit floating point real vector. + * + * %FVector is an alias for F32Vector. It is a template instantiation of + * GenericVector for \c float. + */ +typedef F32Vector FVector; + +/*! + * \class pcl::F64Vector + * \ingroup vector_types + * \brief 64-bit floating point real vector. + * + * %F64Vector is a template instantiation of GenericVector for \c double. + */ +typedef GenericVector F64Vector; + +/*! + * \class pcl::DVector + * \ingroup vector_types + * \brief 64-bit floating point real vector. + * + * %DVector is an alias for F64Vector. It is a template instantiation of + * GenericVector for \c double. + */ +typedef F64Vector DVector; + +/*! + * \class pcl::Vector + * \ingroup vector_types + * \brief 64-bit floating point real vector. + * + * %Vector is an alias for DVector. It is a template instantiation of + * GenericVector for \c double. + */ +typedef DVector Vector; + +/*! + * \class pcl::C32Vector + * \ingroup vector_types + * \brief 32-bit floating point complex vector. + * + * %C32Vector is a template instantiation of GenericVector for \c Complex32. + */ +typedef GenericVector C32Vector; + +/*! + * \class pcl::C64Vector + * \ingroup vector_types + * \brief 64-bit floating point complex vector. + * + * %C64Vector is a template instantiation of GenericVector for \c Complex64. + */ +typedef GenericVector C64Vector; + +#ifndef _MSC_VER + +/*! + * \class pcl::F80Vector + * \ingroup vector_types + * \brief 80-bit extended precision floating point real vector. + * + * %F80Vector is a template instantiation of GenericVector for \c long + * \c double. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef GenericVector F80Vector; + +/*! + * \class pcl::LDVector + * \ingroup vector_types + * \brief 80-bit extended precision floating point real vector. + * + * %LDVector is an alias for F80Vector. It is a template instantiation of + * GenericVector for \c long \c double. + * + * \note This template instantiation is not available on Windows with Visual + * C++ compilers. + */ +typedef F80Vector LDVector; + +#endif // !_MSC_VER + +#endif // !__PCL_NO_VECTOR_INSTANTIATE + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Vector_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Vector.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Version.h b/3rdparty/include/pcl/Version.h new file mode 100644 index 0000000..11f415a --- /dev/null +++ b/3rdparty/include/pcl/Version.h @@ -0,0 +1,295 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Version.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Version_h +#define __PCL_Version_h + +/// \file pcl/Version.h + +#include +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Version + * \brief Provides PCL version numbers. + * + * The %Version class reads PCL version data stored in static read-only + * variables. It provides version information for the PCL libraries that have + * been linked to the current module. + */ +class PCL_CLASS Version +{ +public: + + /*! + * Default constructor. This constructor is disabled because %Version is not + * an instantiable class. + */ + Version() = delete; + + /*! + * Copy constructor. This constructor is disabled because %Version is not an + * instantiable class. + */ + Version( const Version& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %Version is not an + * instantiable class. + */ + Version& operator =( const Version& ) = delete; + + /*! + * Destructor. This destructor is disabled because %Version is not an + * instantiable class. + */ + ~Version() = delete; + + /*! + * Returns the current PCL major version number. + */ + static int Major(); + + /*! + * Returns the current PCL minor version number. + */ + static int Minor(); + + /*! + * Returns the current PCL release version number. + */ + static int Release(); + + /*! + * Returns the current PCL build number. + * + * \note Since core version 1.8.7 build numbers have been deprecated. They + * are maintained exclusively for compatibility with previous versions and + * existing code. + */ + static int Build(); + + /*! + * Returns the beta version number of PCL, or zero if the current PCL + * framework is a release (non-beta) version. + */ + static int BetaRelease(); + + /*! + * Returns an ISO 639.2 language code that identifies the primary language + * of the current PCL framework. + */ + static String LanguageCode(); // ISO 639.2 language code + + /*! + * Returns an integer that corresponds to the full PCL version. + * + * The returned value is equal to: + * + * \code Major()*1000000 + Minor()*1000 + Release(); \endcode + */ + static int Number() + { + return Major()*1000000 + Minor()*1000 + Release(); + } + + /*! + * Returns a human-readable representation of the current PCL version. + */ + static String AsString(); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class PixInsightVersion + * \brief Provides version information for the PixInsight core application. + * + * The %PixInsightVersion class retrieves version data from the PixInsight core + * application where the current module has been installed. + */ +class PCL_CLASS PixInsightVersion +{ +public: + + /*! + * Default constructor. This constructor is disabled because + * %PixInsightVersion is not an instantiable class. + */ + PixInsightVersion() = delete; + + /*! + * Copy constructor. This constructor is disabled because %PixInsightVersion + * is not an instantiable class. + */ + PixInsightVersion( const PixInsightVersion& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %PixInsightVersion is + * not an instantiable class. + */ + PixInsightVersion& operator =( const PixInsightVersion& ) = delete; + + /*! + * Destructor. This destructor is disabled because %PixInsightVersion is not + * an instantiable class. + */ + ~PixInsightVersion() = delete; + + /*! + * Returns the major version number of the PixInsight core application. + */ + static int Major(); + + /*! + * Returns the minor version number of the PixInsight core application. + */ + static int Minor(); + + /*! + * Returns the release version number of the PixInsight core application. + */ + static int Release(); + + /*! + * Returns the revision version number of the PixInsight core application. + */ + static int Revision(); + + /*! + * Returns the build number of the PixInsight core application. + * + * \deprecated Since core version 1.8.7 build numbers have been deprecated. + * They are maintained exclusively for compatibility with previous versions + * and existing code. + */ + static int Build(); + + /*! + * Returns the beta or release candidate version number of the PixInsight + * core application: + * + * \li Returns zero for a release version. + * \li Returns a positive nonzero integer for a beta version. + * \li Returns a negative integer for a release candidate (RC) version. + */ + static int BetaRelease(); + + /*! + * Returns true iff the PixInsight core is a confidential (pre-release) + * edition. + */ + static bool Confidential(); + + /*! + * Returns true iff the PixInsight core is a limited edition (LE) release. + */ + static bool LE(); + + /*! + * Returns an ISO 639.2 language code that identifies the primary language + * of the PixInsight core application. + */ + static String LanguageCode(); + + /*! + * Returns the codename for the current PixInsight core application version. + * Starting from version 1.7, each major PixInsight version is given a + * codename that uniquely identifies it. + * + * Codename history: + * + * PixInsight 1.7 Starbuck \n + * PixInsight 1.8 Ripley + */ + static String Codename(); + + /*! + * Returns an integer that corresponds to the full PixInsight core version. + * + * The returned value is equal to: + * + * \code Major()*1000000 + Minor()*1000 + Release(); \endcode + */ + static int Number() + { + return Major()*1000000 + Minor()*1000 + Release(); + } + + /*! + * Returns a human-readable textual representation of the current PixInsight + * core version. + * + * \param withCodename If this parameter is true, the returned version + * string will include the codename of the running + * PixInsight core application. The default value of + * this parameter is false. + */ + static String AsString( bool withCodename = false ); + + friend class GlobalContextDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Version_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Version.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/View.h b/3rdparty/include/pcl/View.h new file mode 100644 index 0000000..36d48fa --- /dev/null +++ b/3rdparty/include/pcl/View.h @@ -0,0 +1,1121 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/View.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_View_h +#define __PCL_View_h + +/// \file pcl/View.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS ImageWindow; + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup view_properties Module-Defined View Properties + */ + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::ViewPropertyAttribute + * \brief Attributes of view properties. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ViewPropertyAttribute::WriteProtectedOnly the module that has created the property can modify it (e.g., + * change its value, or delete it).
ViewPropertyAttribute::ReadProtectedOnly the module that has created the property can read its value. + * Implies write protection, even if the WriteProtected attribute has + * not been set explicitly.
ViewPropertyAttribute::VolatileVolatile properties are not stored in processing histories and get + * lost across undo/redo operations.
ViewPropertyAttribute::PermanentPermanent properties are not stored in processing histories, but + * unlike volatile properties, they are preserved across undo/redo + * operations. A permanent property is not deleted automatically when + * the current process terminates. Permanent properties are mostly + * useful to store metadata that does not depend on pixel values, such + * as astrometric solutions, or image acquisition conditions and similar + * ancillary data.
ViewPropertyAttribute::NotSerializableThe property will not be stored in projects.
ViewPropertyAttribute::StorableThe property can be stored in XISF files.
ViewPropertyAttribute::ReservedThe property has been reserved by the PixInsight core application. It + * can only be generated by calling the View::ComputeProperty() member + * function. This attribute cannot be set explicitly by a modue.
ViewPropertyAttribute::ProtectedThe property will not be deleted after completing execution of the + * current process, even if the Permanent attribute is not set. This + * special flag will be removed automatically after process execution. + * A protected property represents ancillary data that depends on pixel + * values and has been generated by the process that has just finished + * its execution.
ViewPropertyAttribute::NoChangeThis is a special flag used to preserve the existing property + * attributes. Normally it is intended for internal PCL use.
+ * + * \ingroup view_properties + */ +namespace ViewPropertyAttribute +{ + enum mask_type + { + WriteProtected = 0x00000001, + ReadProtected = 0x00000002, + Volatile = 0x00000010, + Permanent = 0x00000020, + NotSerializable = 0x00000040, + Storable = 0x00000080, + Reserved = 0x10000000, + Protected = 0x20000000, + NoChange = 0x80000000 + }; +} + +/*! + * A combination of ViewPropertyAttribute flags. + * \ingroup view_properties + */ +typedef Flags ViewPropertyAttributes; + +// ---------------------------------------------------------------------------- + +/*! + * \class View + * \brief High-level interface to a PixInsight view object. + * + * Instances of %View are managed aliases of actual view objects in the + * PixInsight core application. Views are the main image holders in the + * PixInsight platform. + * + * Views can be main views or \e previews. A main view holds the + * entire image of an image window. A preview is a volatile subimage defined on + * an image window. In all respects, both types of views can be manipulated + * transparently with the abstract interface provided by the %View class. + * The View::IsPreview() and View::IsMainView() members inform you about the + * particular type of a given %View object. + * + * Each view has a unique identifier, which you can get and set through the + * View::Id(), View::FullId(), and View::Rename() member functions. + * + * View::Image() gives you full access to the image in a view as an + * ImageVariant object. + * + * Each view in PixInsight holds a set of histograms and statistical data as + * shared resources that can be accessed by all installed processes and + * interfaces. The View::CalculateHistograms() and View::CalculateStatistics() + * families of member functions give full access to these shared resources. + * + * In a similar way, each view maintains a set of histogram transformations + * used as screen transfer functions (STF). A STF is applied to modify + * the screen representation of an image, without altering actual image data. + * The View::GetScreenTransferFunctions() / View::SetScreenTransferFunctions() + * family of functions allow you to acquire and modify the STF of any view. + * + * The View::Lock() / View::Unlock() family of functions allow you to write + * thread-safe processing routines in current and future PixInsight + * multithreaded environments. + * + * Finally, the static functions View::ViewById(), View::AllViews() and + * View::AllPreviews() provide for global searching and listing of existing + * view objects. + * + * \sa ImageWindow + */ +class PCL_CLASS View : public UIObject +{ +public: + + /*! + * A container of HistogramTransformation instances used to represent the + * managed Screen Transfer Functions (STF) of a view object in the core + * PixInsight application. + */ + typedef Array stf_list; + + /*! + * Constructs a null view. A null view does not correspond to an existing + * view in the PixInsight core application. + */ + View() = default; + + /*! + * Constructs a %View instance as an alias of an existing %View object. + * + * \note It cannot be overemphasized that this constructor does not + * create a new view. It only creates an \e alias object for an + * existing view in the calling module. In all respects, the alias + * and aliased objects are completely interchangeable; they behave exactly + * in the same way because both refer to the same server-side object. + */ + View( const View& v ) : UIObject( v ) + { + } + + /*! + * Destroys this %View object. + * + * Note that this destructor does not destroy the actual view object, which + * is part of the PixInsight core application. Only the managed alias object + * living in the user-defined module is destroyed. + */ + virtual ~View() + { + } + + /*! + * Returns a reference to a null %View instance. A null %View does not + * correspond to an existing view in the PixInsight core application. + */ + static View& Null(); + + /*! + * Returns true iff this is a main view. A main view holds the entire image + * in an image window. + */ + bool IsMainView() const; + + /*! + * Returns true iff this view corresponds to a preview object. A preview is + * a volatile subimage defined in an image window. + */ + bool IsPreview() const; + + /*! + * Returns true iff this view is a preview and is in volatile state. A + * volatile preview contains a temporary image that can be undone/redone + * with the Preview > Undo and Preview > Redo core + * application commands. + */ + bool IsVolatilePreview() const; + + /*! + * Returns true iff this view is a preview and has one or more stored states. + * When a preview has been stored, it behaves as an independent image with + * its own processing history. A stored preview does not rely on its mother + * image to return to a 'base' state. + */ + bool IsStoredPreview() const; + + /*! + * Returns a managed alias for the image window this view pertains to. + */ + ImageWindow Window() const; + + /*! + * Returns the identifier of this view. + * + * %View identifiers are unique within their naming context. Identifiers of + * main views are unique in the global context, since each main view holds + * an image in the core application. The identifier of a preview is unique + * in the context of its parent image window. + */ + IsoString Id() const; + + /*! + * Returns the full identifier of this view. + * + * If this is a main view, this function returns its identifier, which is + * the same string returned by the Id() member function. + * + * If this view corresponds to a preview, this function returns a unique + * identifier of the form: + * + * \-\>\ + * + * where \ is the identifier of the preview's parent image, and + * \ is the identifier of the preview. The "->" sequence is the + * scope resolution operator, used to specify pertenence of a + * preview to its parent image in the PixInsight environment. + */ + IsoString FullId() const; + + /*! + * Changes the identifier of this view to \a newId. + * + * If \a newId is not unique in the naming context of this view, a unique + * identifier is obtained automatically by appending a suffix string to the + * specified \a newId string. + * + * After calling this function, a ImageRenamed() notification message will + * be sent to all process interfaces. + */ + void Rename( const IsoString& newId ); + + void Rename( const IsoString::ustring_base& newId ) + { + Rename( IsoString( newId ) ); + } + + /*! + * Returns true iff this view is not locked for reading. + */ + bool CanRead() const; + + /*! + * Returns true iff this view is not locked for writing. + */ + bool CanWrite() const; + + /*! + * Locks this view for read and write operations. + * + * Processes usually call this function to make sure that a target view's + * image cannot be modified by another thread while they are processing it. + * This is necessary because PixInsight is a multithreaded environment. If a + * process modifies an image without locking it, other processing threads + * could try to read or write the same pixels concurrently, with + * unpredictable results. + * + * If the view is not currently locked by other processing thread, this + * function locks it and returns immediately. If the view is already + * locked, this function waits until it becomes unlocked by other threads. + * + * If the \a notify argument is false, this function will not send + * ViewLocked() notifications to process interfaces. + * + * \warning Always make sure that you unlock a view that you have previously + * locked. If your processing routines leave views locked incorrectly, + * they'll cause serious problems. A locked view is inaccessible to other + * processes, and even the user may be unable to recover locked image data. + */ + void Lock( bool notify = true ) const; + + /*! + * Unlocks this view for read and write operations. + * + * Please read the \e important information given for the Lock() function + * member. + * + * You shouldn't call this function if your routines have not called the + * Lock() function before. In other words, call Unlock() just once for each + * previous call lo Lock(). + * + * \warning Be aware that \e just after this function returns, your + * processing routine \e must \e not try to modify this view or its + * associated image, since other thread might have locked it. If you need + * to gain exclusive read/write rights over this view, call Lock() again. + */ + void Unlock( bool notify = true ) const; + + /*! + * Locks this view for write operations only. + * + * Call this function if you need to make sure that a view's image will not + * be modified by other threads, but your processing routines will not + * modify it. + * + * For example, if your routines need reading this view's image as source + * data for your processing tasks, but not writing to it, you should call + * this function instead of Lock(). In this way you allow other processes + * (including the core application's GUI) to access this view and its image + * for read-only operations. This improves efficiency and useability of the + * whole PixInsight environment. + */ + void LockForWrite( bool notify = true ) const; + + /* + * Unlocks this view for write operations only. + * ### Undocumented (i.e., harmful) function. + */ + void UnlockForWrite( bool notify = true ) const; + + /*! + * Temporarily unlocks a view for reading. + * + * If your code has successfully called Lock() for this view, then its + * screen rendition cannot be updated, because the core application will + * never try to read pixel data from a view that is read-locked. This can be + * a problem if, for example, you need to refresh this view's screen + * rendition to provide feedback to the user at a given stage of your + * processing. + * + * The solution for such situations is calling this function to temporarily + * permit read-only accesses to this view and its image. When you no longer + * want to allow read-only operations for this view, call RelockForRead() + * and continue your processing work. + * + * Your code may call Unlock() safely after this function; you should not + * call RelockForRead() if your processing task has finished, or if this + * view is no longer needed for it. + * + * \warning Do not use this function if your code has not called Lock() + * previously. + */ + void UnlockForRead( bool notify = true ) const; + + /*! + * Relocks a view for reading (after UnlockForRead()). + * + * Call this function after UnlockForRead(), if necessary. Please read the + * information given for that function. + */ + void RelockForRead( bool notify = true ) const; + + /*! + * Returns true iff this view has been selected as a target of an active + * dynamic interface. + */ + bool IsDynamicTarget() const; + + /*! + * Adds this view to the list of targets of the current active dynamic + * interface. + * + * Dynamic interfaces call this function for views that get involved in + * active dynamic procedures. For example, the DynamicCrop interface calls + * this function when you select a view by defining an initial cropping + * rectangle with the mouse. + * + * Any images selected as dynamic targets cannot be closed or modified in + * any way while an active dynamic interface depends on them. + * + * If you implement a dynamic interface, always call this function for a + * view if your dynamic interface depends on it. Failing to do so will lead + * to unstable and incoherent behavior of the core application's GUI. + * + * \warning Once your dynamic interface ceases depending on this view, call + * the RemoveFromDynamicTargets() function for it. + */ + void AddToDynamicTargets(); + + /*! + * Removes this view from the list of targets of the current active + * dynamic interface. + * + * Call this function when your dynamic interface no longer depends on this + * view. Please read the important information given for + * AddToDynamicTargets(). + */ + void RemoveFromDynamicTargets(); + + /*! + * Returns an ImageVariant instance that transports the image in this view. + * + * The returned ImageVariant object transports a shared image. A + * shared image is a managed alias for an actual image living in the core + * PixInsight application. This is because a view is also a managed object. + * + * With this function you gain access to the image in a view, which is + * crucial to perform any kind of processing in the PixInsight/PCL + * framework. + * + * Before calling this function, however, you must make sure that your + * processing thread has the appropriate access rights to the view, since + * PixInsight is a multithreaded environment. This is done by calling the + * Lock() member function of %View. + */ + ImageVariant Image() const; + + /*! + * Returns an ImageVariant instance that transports the image in this view. + * + * \deprecated Use View::Image() in newly produced code. + */ + ImageVariant GetImage() const + { + return this->Image(); + } + + /*! + * Returns true iff this view holds a color image, false if it is a + * grayscale image. + */ + bool IsColor() const; + + /*! + * Copies the width and height in pixels of the image in this view to the + * specified variables. + */ + void GetSize( int& width, int& height ) const; + + /*! + * Returns the width in pixels of the image in this view. + */ + int Width() const + { + int w, dum; GetSize( w, dum ); return w; + } + + /*! + * Returns the height in pixels of the image in this view. + */ + int Height() const + { + int dum, h; GetSize( dum, h ); return h; + } + + /*! + * Returns the bounding rectangle of the image in this view. The upper left + * corner of the returned rectangle (x0, y0) is always (0,0). The lower + * right corner coordinates (x1, y1) correspond to the width and height of + * the image. + */ + Rect Bounds() const + { + int w, h; GetSize( w, h ); return Rect( w, h ); + } + + /*! + * Retrieves the set of screen transfer functions (STF) for this view in the + * specified container. + * + * The STF container is a dynamic array. Each array element is a + * HistogramTransformation object corresponding to the STF for an image + * channel or color component: + * + * %Array element #0 = Red/gray channels \n + * %Array element #1 = Green channel \n + * %Array element #2 = Blue channel \n + * %Array element #3 = Lightness/brightness/luminance components + */ + void GetScreenTransferFunctions( stf_list& ) const; + + /*! + * Sets the screen transfer functions (STF) for this view. + * + * The specified container is a dynamic array. Each array element is a + * HistogramTransformation object corresponding to the STF for an image + * channel or color component: + * + * %Array element #0 = Red/gray channels \n + * %Array element #1 = Green channel \n + * %Array element #2 = Blue channel \n + * %Array element #3 = Lightness/brightness/luminance components + */ + void SetScreenTransferFunctions( const stf_list&, bool notify = true ); + + /*! + * Destroys the screen transfer functions (STF) for this view. + */ + void DestroyScreenTransferFunctions( bool notify = true ); + + /*! + * Returns true iff screen transfer functions (STF) are enabled for this + * view. If STFs are disabled, they are not used for screen renditions. + */ + bool AreScreenTransferFunctionsEnabled() const; + + /*! + * Enables or disables screen transfer functions (STF) for this view. If + * STFs are enabled, each non-identity STF is used to modify screen + * renditions of the corresponding image channel. + */ + void EnableScreenTransferFunctions( bool = true, bool notify = true ); + + /*! + * Disables or enables screen transfer functions (STF) for this view. If + * STFs are enabled, each non-identity STF is used to modify screen + * renditions of the corresponding image channel. + */ + void DisableScreenTransferFunctions( bool disable = true, bool notify = true ) + { + EnableScreenTransferFunctions( !disable, notify ); + } + + /*! + * returns true iff the specified string \a id is the identifier of a + * reserved view property. + * + * Reserved view properties are computed and maintained automatically by the + * core application and cannot be modified arbitrarily by modules. + * + * This member function also returns true if the specified identifier starts + * with the string "PixInsight:". Although these identifiers are not + * strictly reserved, the core application defines a number of properties in + * the PixInsight namespace for its internal use. This namespace should not + * be used by modules. + * + * \sa ComputeProperty() + * \ingroup view_properties + */ + static bool IsReservedViewPropertyId( const IsoString& id ); + + /*! + * Returns a description of all data properties associated with this view. + * For each property, the returned array provides information on the unique + * identifier of a property and its data type. + * + * Returns an empty array if there are no properties in this view. + * + * \ingroup view_properties + */ + PropertyDescriptionArray PropertyDescriptions() const; + + /*! + * Returns an array with all readable (for the calling module) properties in + * this view. + * + * \ingroup view_properties + */ + PropertyArray Properties() const; + + /*! + * Returns an array with all readable (for the calling module) and storable + * properties in this view. + * + * Storable properties have the ViewPropertyAttribute::Storable attribute + * set and are intended to be persistent when writting view images to files. + * + * \sa SetStorableProperties() + * \ingroup view_properties + */ + PropertyArray StorableProperties() const; + + /*! + * Returns an array with all readable (for the calling module) and permanent + * properties in this view. + * + * Permanent properties are not stored in processing histories, but unlike + * volatile properties, they are preserved across undo/redo operations. + * + * \sa SetPermanentProperties() + * \ingroup view_properties + */ + PropertyArray PermanentProperties() const; + + /*! + * Returns an array with all readable (for the calling module), storable, + * permanent properties in this view. + * + * Storable properties have the ViewPropertyAttribute::Storable attribute + * set and are intended to be persistent when writting view images to files. + * + * Permanent properties are not stored in processing histories, but unlike + * volatile properties, they are preserved across undo/redo operations. + * + * \sa SetStorablePermanentProperties() + * \ingroup view_properties + */ + PropertyArray StorablePermanentProperties() const; + + /*! + * Sets the values of a set of properties in this view. + * + * \param properties The properties that will be defined. + * + * \param notify Whether to notify the platform on the property changes. + * This is true by default. + * + * \param attributes Optional attribute properties. If not specified, the + * current property attributes will be preserved. If not + * specified and the property is newly created, a default + * set of properties will be applied. + * + * For each item in the \a properties array, if the requested property is + * not a reserved property and does not exist in this view, a new one will + * be created with the specified identifier, value and attributes; see the + * Property class. + * + * If one or more properties exist but the calling module has no write + * access to them (see ViewPropertyAttribute::WriteProtected), an Error + * exception will be thrown. + * + * Reserved properties are simply ignored by this member function without + * raising exceptions. This allows for copying properties between views + * safely with a single-line call such as: + * + * \code view2.SetProperties( view1.Properties() ); \endcode + * + * \ingroup view_properties + */ + void SetProperties( const PropertyArray& properties, bool notify = true, + ViewPropertyAttributes attributes = ViewPropertyAttribute::NoChange ); + + /*! + * Sets the values of a set of storable properties in this view. + * + * Calling this function is equivalent to: + * + * \code + * SetProperties( properties, notify, + * ViewPropertyAttribute::Storable + * | ViewPropertyAttribute::NoChange ) + * \endcode + * + * This function simplifies defining view properties, where the Storable + * attribute is used very often to ensure that properties will be propagated + * to newly created and updated disk files. + * + * \sa StorableProperties() + * \ingroup view_properties + */ + void SetStorableProperties( const PropertyArray& properties, bool notify = true ) + { + SetProperties( properties, notify, + ViewPropertyAttribute::Storable + | ViewPropertyAttribute::NoChange ); + } + + /*! + * Sets the values of a set of storable and permanent properties in this + * view. + * + * Calling this function is equivalent to: + * + * \code + * SetProperties( properties, notify, + * ViewPropertyAttribute::Storable + * | ViewPropertyAttribute::Permanent + * | ViewPropertyAttribute::NoChange ) + * \endcode + * + * This function simplifies defining view properties, where the Storable and + * Permanent attributes are used very often to ensure that properties will + * be propagated to newly created and updated disk files, as well as + * preserved in views across process executions and undo/redo operations. + * + * \sa StorableProperties(), PermanentProperties() + * \ingroup view_properties + */ + void SetStorablePermanentProperties( const PropertyArray& properties, bool notify = true ) + { + SetProperties( properties, notify, + ViewPropertyAttribute::Storable + | ViewPropertyAttribute::Permanent + | ViewPropertyAttribute::NoChange ); + } + + /*! + * Returns the value of the specified \a property in this view. + * + * If the requested property has not been defined for this view, the + * returned Variant object will be invalid (that is, Variant::IsValid() will + * return false). + * + * If the property exists but the calling module has no read access to it + * (see ViewPropertyAttributes::ReadProtected), an Error exception will be + * thrown. + * + * \ingroup view_properties + */ + Variant PropertyValue( const IsoString& property ) const; + + Variant PropertyValue( const IsoString::ustring_base& property ) const + { + return PropertyValue( IsoString( property ) ); + } + + /*! + * Computes a reserved view property and returns its value. + * + * The PixInsight core application reserves a set of view property + * identifiers for standard use by all modules. These special properties + * can only be generated by calling this member function; they cannot be + * created or modified by other means (for example, by calling the + * SetPropertyValue() and SetPropertyAttributes() functions). This includes + * a number of statistical properties that are generated and computed on + * demand in a highly optimized way. + * + * The set of reserved view property identifiers includes at least the + * following list: + * + * Mean, Modulus, SumOfSquares, Median, Variance, StdDev, AvgDev, MAD, BWMV, + * PBMV, Sn, Qn, Minimum, MinimumPos, Maximum, MaximumPos, Histogram16, + * Histogram20. + * + * If the requested property is not recognized as a reserved view property, + * this member function returns an invalid %Variant object. + * + * \sa IsReservedViewPropertyId() + * \ingroup view_properties + */ + Variant ComputeProperty( const IsoString& property, bool notify = true ); + + Variant ComputeProperty( const IsoString::ustring_base& property, bool notify = true ) + { + return ComputeProperty( IsoString( property ), notify ); + } + + /*! + * Returns the value of a reserved view property if it is already available, + * or computes it otherwise and returns its newly calculated value. + * + * This member function is equivalent to the following sequence: + * + * \code + * if ( HasProperty( property ) ) + * return PropertyValue( property ); + * return ComputeProperty( property, notify ); + * \endcode + * + * See ComputeProperty() for information on reserved view properties. + * + * \ingroup view_properties + */ + template + Variant ComputeOrFetchProperty( const S& property, bool notify = true ) + { + IsoString propertyId( property ); + if ( HasProperty( propertyId ) ) + return PropertyValue( propertyId ); + return ComputeProperty( propertyId, notify ); + } + + /*! + * Sets the value and attributes of a property in this view. + * + * \param property Identifier of the view property. + * + * \param value A valid Variant object transporting the new property + * value. + * + * \param notify Whether to notify the platform on the property change. + * This is true by default. + * + * \param attributes Optional attribute properties. If not specified, the + * current property attributes will be preserved. If not + * specified and the property is newly created, a default + * set of properties will be applied. + * + * If the requested property does not exist in this view, a new one will be + * created with the specified identifier, value and attributes. + * + * If the property exists but the calling module has no write access to it + * (see ViewPropertyAttribute::WriteProtected), an Error exception will be + * thrown. + * + * \ingroup view_properties + */ + void SetPropertyValue( const IsoString& property, const Variant& value, bool notify = true, + ViewPropertyAttributes attributes = ViewPropertyAttribute::NoChange ); + + void SetPropertyValue( const IsoString::ustring_base& property, const Variant& value, bool notify = true, + ViewPropertyAttributes attributes = ViewPropertyAttribute::NoChange ) + { + SetPropertyValue( IsoString( property ), value, notify, attributes ); + } + + /*! + * Sets the value of a storable property in this view. + * + * This member function is equivalent to: + * + * \code + * SetPropertyValue( property, value, notify, + * ViewPropertyAttribute::Storable + * | ViewPropertyAttribute::NoChange ); + * \endcode + * + * This function simplifies defining view properties, where the Storable + * attribute is used very often to ensure that properties will be propagated + * to newly created and updated disk files. + * + * \ingroup view_properties + */ + void SetStorablePropertyValue( const IsoString& property, const Variant& value, bool notify = true ) + { + SetPropertyValue( property, value, notify, + ViewPropertyAttribute::Storable + | ViewPropertyAttribute::NoChange ); + } + + void SetStorablePropertyValue( const IsoString::ustring_base& property, const Variant& value, bool notify = true ) + { + SetStorablePropertyValue( IsoString( property ), value, notify ); + } + + /*! + * Sets the value of a storable property in this view. + * + * This member function is equivalent to: + * + * \code + * SetPropertyValue( property, value, notify, + * ViewPropertyAttribute::Storable + * | ViewPropertyAttribute::Permanent + * | ViewPropertyAttribute::NoChange ); + * \endcode + * + * This function simplifies defining view properties, where the Storable and + * Permanent attributes are used very often to ensure that properties will + * be propagated to newly created and updated disk files, as well as + * preserved in views across process executions and undo/redo operations. + * + * \ingroup view_properties + */ + void SetStorablePermanentPropertyValue( const IsoString& property, const Variant& value, bool notify = true ) + { + SetPropertyValue( property, value, notify, + ViewPropertyAttribute::Storable + | ViewPropertyAttribute::Permanent + | ViewPropertyAttribute::NoChange ); + } + + void SetStorablePermanentPropertyValue( const IsoString::ustring_base& property, const Variant& value, bool notify = true ) + { + SetStorablePropertyValue( IsoString( property ), value, notify ); + } + + /*! + * Returns the data type of an existing \a property in this view. + * + * If the requested \a property has not been defined for this view, this + * member function returns VariantType::Invalid. + * + * If the property exists but the calling module has no read access to it + * (see ViewPropertyAttributes::ReadProtected), an Error exception will be + * thrown. + * + * For a list of available view property types, see the VariantType + * namespace. + * + * \ingroup view_properties + */ + Variant::data_type PropertyType( const IsoString& property ) const; + + Variant::data_type PropertyType( const IsoString::ustring_base& property ) const + { + return PropertyType( IsoString( property ) ); + } + + /*! + * Returns the set of attributes currently associated with an existing + * \a property in this view. + * + * If the requested \a property has not been defined for this view, an Error + * exception is thrown. + * + * For a list of available view property attributes, see the + * ViewPropertyAttribute namespace. + * + * \ingroup view_properties + */ + ViewPropertyAttributes PropertyAttributes( const IsoString& property ) const; + + ViewPropertyAttributes PropertyAttributes( const IsoString::ustring_base& property ) const + { + return PropertyAttributes( IsoString( property ) ); + } + + /*! + * Sets new \a attributes for an existing \a property in this view. + * + * If the requested \a property is not currently defined for this view, or + * if the calling module has no write access to it (see + * ViewPropertyAttribute::WriteProtected), an Error exception will be + * thrown. + * + * Note that property attributes can be set for a newly created property + * with the View::SetPropertyValue() member function. For read-only + * properties, this is safer because the property never exists as a publicly + * writable object. + * + * \ingroup view_properties + */ + void SetPropertyAttributes( const IsoString& property, ViewPropertyAttributes attributes, bool notify = true ); + + void SetPropertyAttributes( const IsoString::ustring_base& property, ViewPropertyAttributes attributes, bool notify = true ) + { + SetPropertyAttributes( IsoString( property ), attributes, notify ); + } + + /*! + * Returns true iff the specified \a property exists in this view. + * + * \ingroup view_properties + */ + bool HasProperty( const IsoString& property ) const; + + bool HasProperty( const IsoString::ustring_base& property ) const + { + return HasProperty( IsoString( property ) ); + } + + /*! + * Deletes the specified \a property and its associated value in this view. + * + * If the requested \a property is not currently defined for this view, or + * if the calling module has no write access to it (see + * ViewPropertyAttribute::WriteProtected), an Error exception will be + * thrown. + * + * \ingroup view_properties + */ + void DeleteProperty( const IsoString& property, bool notify = true ); + + void DeleteProperty( const IsoString::ustring_base& property, bool notify = true ) + { + DeleteProperty( IsoString( property ), notify ); + } + + /*! + * Deletes the specified \a property and its associated value in this view, + * only if it is currently defined. If \a property is not defined, calling + * this member function has no effect. + * + * \ingroup view_properties + */ + void DeletePropertyIfExists( const IsoString& property, bool notify = true ) + { + if ( HasProperty( property ) ) + DeleteProperty( property, notify ); + } + + void DeletePropertyIfExists( const IsoString::ustring_base& property, bool notify = true ) + { + DeletePropertyIfExists( IsoString( property ), notify ); + } + + /*! + * Returns true iff the specified \a id string is a valid view identifier. + * + * A valid view identifier can include a preview separator (the sequence + * "->") to separate between a main view identifier and a preview + * identifier. + */ + template + static bool IsValidViewId( const S& id ) + { + size_type p = id.Find( "->" ); + if ( p == String::notFound ) + return id.IsValidIdentifier(); + return id.Left( p ).IsValidIdentifier() && id.Substring( p+2 ).IsValidIdentifier(); + } + + /*! + * Returns a view with the specified full identifier. If no view exists with + * the specified identifier, this function returns View::Null(). + */ + static View ViewById( const IsoString& fullId ); + + static View ViewById( const IsoString::ustring_base& fullId ) + { + return ViewById( IsoString( fullId ) ); + } + + /*! + * Returns a container with all the existing views. This includes all main + * views and previews. + */ + static Array AllViews( bool excludePreviews = false ); + + /*! + * Returns a container with the existing previews. Main views are excluded. + */ + static Array AllPreviews(); + +protected: + + View( void* h ) : UIObject( h ) + { + } + + View( const void* h ) : UIObject( h ) + { + } + + View( std::nullptr_t ) : UIObject( nullptr ) + { + } + + friend class ImageWindow; + friend class ProcessImplementation; // for LaunchOn() + friend class ProcessInterface; // for event broadcasting functions + friend class ProcessInstance; // for ExecuteOn() and related functions + friend class ViewList; + friend class ViewListEventDispatcher; + friend class ControlEventDispatcher; + friend class ProcessContextDispatcher; + friend class InterfaceDispatcher; + friend class InternalViewEnumerator; + friend class InternalPreviewEnumerator; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_View_h + +// ---------------------------------------------------------------------------- +// EOF pcl/View.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ViewList.h b/3rdparty/include/pcl/ViewList.h new file mode 100644 index 0000000..157936c --- /dev/null +++ b/3rdparty/include/pcl/ViewList.h @@ -0,0 +1,329 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ViewList.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ViewList_h +#define __PCL_ViewList_h + +/// \file pcl/ViewList.h + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ViewList + * \brief Client-side interface to a PixInsight %ViewList object. + * + * ### TODO: Write a detailed description for %ViewList + */ +class PCL_CLASS ViewList : public Control +{ +public: + + /*! + * Constructs a %ViewList as a child control of \a parent. + */ + ViewList( Control& parent = Control::Null() ); + + /*! + * Destroys a %ViewList control. + */ + virtual ~ViewList() + { + } + + /*! + * Returns true iff this %ViewList control includes main views (images). + * + * \sa IncludesPreviews(), Regenerate() + */ + bool IncludesMainViews() const; + + /*! + * Returns true iff this %ViewList control includes previews. + * + * \sa IncludesMainViews(), Regenerate() + */ + bool IncludesPreviews() const; + + /*! + * Returns true iff this %ViewList control includes the virtual real-time + * preview. + * + * See the documentation for Regenerate() for more information about the + * virtual real-time preview. + * + * \sa Regenerate() + */ + bool IncludesRealTimePreview() const; + + /*! + * Updates this %ViewList control, regenerating the list of items for + * existing main views exclusively. + * + * This is a convenience member function, equivalent to: + * Regenerate( true, false ) + * + * Calling this member function implicitly disables the inclusion of + * previews in the list of items of this %ViewList control. + * + * \sa GetPreviews(), GetAll(), Regenerate() + */ + void GetMainViews() + { + Regenerate( true, false ); + } + + /*! + * Updates this %ViewList control, regenerating the list of items for + * existing previews exclusively. + * + * This is a convenience member function, equivalent to: + * Regenerate( false, true ) + * + * Calling this member function implicitly disables the inclusion of main + * views in the list of items of this %ViewList control. + * + * \sa GetMainViews(), GetAll(), Regenerate() + */ + void GetPreviews() + { + Regenerate( false, true ); + } + + /*! + * Updates this %ViewList control, regenerating the list of items for + * all existing views, including all main views and previews. + * + * This is a convenience member function, equivalent to: + * Regenerate( true, true ) + * + * Calling this member function implicitly enables the inclusion of main + * views and previews in the list of items of this %ViewList control. + * + * \sa GetMainViews(), GetPreviews(), Regenerate() + */ + void GetAll() + { + Regenerate( true, true ); + } + + /*! + * Regenerates the list of view items in this %ViewList control. + * + * \param mainViews Whether to enable inclusion of main views (images) - true by default. + * \param previews Whether to enable inclusion of previews - true by default. + * \param realTimePreview Whether to include the virtual real-time preview - false by default. + * + * The virtual real-time preview is a high-level interface to the + * image currently represented in the Real-Time Preview window. This is a + * special view that is not attached to any existing image window, and hence + * has only limited functionality. For example, the standard + * HistogramTransformation and Statistics tools enable access to this + * virtual view to obtain the histogram and statistical data, respectively, + * of the image being represented on the Real-Time Preview window. + * + * In general, a module must not gain access to the virtual real-time + * preview unless it implements some interactive functionality that depends + * on the current state of the Real-Time Preview window. + * + * \sa View + */ + void Regenerate( bool mainViews = true, bool previews = true, bool realTimePreview = false ); + + /*! + * Returns the excluded view of this %ViewList control, or + * View::Null() if this %ViewList excludes no view. + * + * The excluded view is never included in the list of items of a %ViewList + * control, regardless of the current state of inclusion for main views and + * previews. This feature is useful when there is a view that shouldn't be + * referenced in a processing interface. For example, a dynamic interface + * can easily avoid references to its own dynamic target by excluding it + * from a %ViewList. + * + * By default, %ViewList controls exclude no views. + * + * \sa ExcludeView() + */ + View ExcludedView() const; + + /*! + * Sets the excluded view of this %ViewList control, or clears it + * (to exclude no view) if View::Null() is specified. + * + * \sa ExcludedView() + */ + void ExcludeView( const View& v ); + + /*! + * Returns the view that is currently selected in this %ViewList control, or + * View::Null() if there is no view selected. + * + * \sa SelectView() + */ + View CurrentView() const; + + /*! + * Selects the specified \a view in this %ViewList control. + * + * If View::Null() is specified, the %ViewList control selects a special + * item (usually, the first item) with the "No View Selected" text. This is + * equivalent to a "no selection" state. + * + * If the specified view is not included in this %ViewList, calling this + * member function has no effect. + * + * \sa CurrentView(), HasView() + */ + void SelectView( const View& view ); + + /*! + * Returns true iff the specified \a view has been included in the list of + * items of this %ViewList control. + */ + bool HasView( const View& view ); + + /*! + * Removes the specified \a view from the list of existing items of this + * %ViewList control. + */ + void RemoveView( const View& view ); + + // ------------------------------------------------------------------------- + // Event handlers + // + // void OnViewSelected( ViewList& sender, View& view ); + // void OnCurrentViewUpdated( ViewList& sender, View& view ); + + /*! + * \defgroup view_list_event_handlers ViewList Event Handlers + */ + + /*! + * Defines the prototype of a view event handler. + * + * A view event is generated when the user activates a view item on a + * %ViewList control, or when she changes the current view item in a + * %ViewList control. + * + * \param sender The control that sends a view event. + * + * \param view The view whose associated item has been selected or + * activated. + * + * \ingroup view_list_event_handlers + */ + typedef void (Control::*view_event_handler)( ViewList& sender, View& view ); + + /*! + * Sets the view selection event handler of this %ViewList control. + * + * \param handler The event handler. Must be a member function of the + * receiver object's class. + * + * \param receiver The control that will receive view selection events + * from this %ViewList. + * + * \ingroup view_list_event_handlers + */ + void OnViewSelected( view_event_handler handler, Control& receiver ); + + /*! + * Sets the current view updated event handler for this %ViewList + * control. + * + * \param handler The event handler. Must be a member function of the + * receiver object's class. + * + * \param receiver The control that will receive current view + * updated events from this %ViewList. + * + * \ingroup view_list_event_handlers + */ + void OnCurrentViewUpdated( view_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + view_event_handler onViewSelected = nullptr; + view_event_handler onCurrentViewUpdated = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class ViewListEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#endif // __PCL_ViewList_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ViewList.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ViewSelectionDialog.h b/3rdparty/include/pcl/ViewSelectionDialog.h new file mode 100644 index 0000000..6310fae --- /dev/null +++ b/3rdparty/include/pcl/ViewSelectionDialog.h @@ -0,0 +1,149 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ViewSelectionDialog.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ViewSelectionDialog_h +#define __PCL_ViewSelectionDialog_h + +/// \file pcl/ViewSelectionDialog.h + +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ViewSelectionDialog + * \brief A simple dialog box to select an existing view. + * + * %ViewSelectionDialog consists of a ViewList control populated with all + * existing views, and standard OK and Cancel push buttons. This class is a + * useful helper whenever a process needs access to a user-selected view. + * + * \sa MultiViewSelectionDialog, PreviewSelectionDialog, Dialog + */ +class PCL_CLASS ViewSelectionDialog : public Dialog +{ +public: + + /*! + * Constructs a %ViewSelectionDialog object. + * + * \param id If specified and a view exists with this identifier, the + * dialog will select the corresponding view upon execution. + * + * \param allowPreviews Whether to allow selection of previews, along + * with main views. For preview-only selections, see the + * PreviewSelectionDialog class. The default value is true. + */ + ViewSelectionDialog( const IsoString& id = IsoString(), bool allowPreviews = true ); + + ViewSelectionDialog( const IsoString::ustring_base& id, bool allowPreviews = true ) + : ViewSelectionDialog( IsoString( id ), allowPreviews ) + { + } + + /*! + * Destroys a %ViewSelectionDialog object. + */ + virtual ~ViewSelectionDialog() + { + } + + /*! + * Returns the identifier of the selected view. + */ + IsoString Id() const + { + return m_id; + } + + /*! + * Returns true if this dialog allows selection of previews along with main + * views; false if it can only select main views. This option can be + * controlled with a constructor parameter. + */ + bool PreviewsAllowed() const + { + return m_allowPreviews; + } + +private: + + IsoString m_id; + bool m_allowPreviews = true; + + VerticalSizer Global_Sizer; + ViewList Images_ViewList; + CheckBox IncludeMainViews_CheckBox; + CheckBox IncludePreviews_CheckBox; + HorizontalSizer Buttons_Sizer; + PushButton OK_PushButton; + PushButton Cancel_PushButton; + + void ViewSelected( ViewList& sender, View& view ); + void OptionClick( Button& sender, bool checked ); + void ButtonClick( Button& sender, bool checked ); + void ControlShow( Control& sender ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ViewSelectionDialog_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ViewSelectionDialog.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/WCSKeywords.h b/3rdparty/include/pcl/WCSKeywords.h new file mode 100644 index 0000000..e2d2ac4 --- /dev/null +++ b/3rdparty/include/pcl/WCSKeywords.h @@ -0,0 +1,172 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/WCSKeywords.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_WCSKeywords_h +#define __PCL_WCSKeywords_h + +/// \file pcl/WCSKeywords.h + +#include + +#include +#include +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +class LinearTransformation; + +/*! + * \class WCSKeywords + * \brief A structure for management of WCS FITS header keywords and associated + * image properties. + * + * \b References + * + * M. R. Calabretta, E. W. Greisen (2002) Representations of World + * Coordinates in FITS, Astronomy & Astrophysics, 395, 1061-1075, + * 1077-1122. + * + * \ingroup astrometry_support + */ +class PCL_CLASS WCSKeywords +{ +public: + + Optional objctra; //!< Right ascension coordinate of the center of the image in degrees. + Optional objctdec; //!< Declination coordinate of the center of the image in degrees. + IsoString radesys; //!< Reference system of celestial coordinates. + Optional equinox; //!< Equinox in years for the celestial coordinate system (not applicable if radesys = ICRS | GCRS). + Optional dateobs; //!< Observation start time as a Julian date, UTC timescale. + Optional dateend; //!< Observation end time as a Julian date, UTC timescale. + Optional longobs; //!< Geodetic longitude of the observation location in degrees. Reckoned positive east of the reference meridian. + Optional latobs; //!< Geodetic latitude of the observation location in degrees. Reckoned positive north of the equator. + Optional altobs; //!< Geodetic height of the observation location in meters. + Optional focallen; //!< Focal length in millimeters. + Optional xpixsz; //!< Pixel size in micrometers. + Optional crval1; //!< WCS coordinate at the reference pixel, X axis. + Optional crval2; //!< WCS coordinate at the reference pixel, Y axis. + Optional crpix1; //!< Image coordinate of the reference pixel on the X axis. + Optional crpix2; //!< Image coordinate of the reference pixel on the Y axis. + Optional cd1_1; //!< Rotation and scaling matrix: CDELT1 * cos(CROTA2) + Optional cd1_2; //!< Rotation and scaling matrix: -CDELT2 * sin(CROTA2) + Optional cd2_1; //!< Rotation and scaling matrix: CDELT1 * sin(CROTA2) + Optional cd2_2; //!< Rotation and scaling matrix: CDELT2 * cos(CROTA2) + Optional cdelt1; //!< Plate scale in degrees per pixel at the reference pixel, X axis. + Optional cdelt2; //!< Plate scale in degrees per pixel at the reference pixel, Y axis. + Optional crota1; //!< Rotation angle around the reference pixel in degrees. Same as CROTA2, unused. + Optional crota2; //!< Rotation angle around the reference pixel in degrees. + IsoString ctype1; //!< Coordinate type and projection, X axis. + IsoString ctype2; //!< Coordinate type and projection, Y axis. + Optional pv1_1; //!< Native longitude of the reference point in degrees. + Optional pv1_2; //!< Native latitude of the reference point in degrees. + Optional lonpole; //!< Native longitude of the pole of the coordinate system in degrees. + Optional latpole; //!< Native latitude of the pole of the coordinate system in degrees. + IsoString refSpline; //!< If nonempty, the astrometric solution uses thin plate splines instead of WCS polynomials. + + /*! + * Default constructor. Constructs an uninitialized/undefined %WCSKeywords + * object. + */ + WCSKeywords() = default; + + /*! + * Copy constructor. + */ + WCSKeywords( const WCSKeywords& ) = default; + + /*! + * Constructs a %WCSKeywords object by extracting data from the specified + * arrays of image \a properties and %FITS \a keywords. + * + * Metadata items available as image properties take precedence over + * equivalent %FITS keywords. + */ + WCSKeywords( const PropertyArray& properties, const FITSKeywordArray& keywords = FITSKeywordArray() ) + { + Read( properties, keywords ); + } + + /*! + * Extracts WCS metadata from the specified arrays of image \a properties + * and %FITS \a keywords. + * + * If some metadata items are not included in the \a properties and + * \a keywords arrays, the previously defined items, if any, will be + * preserved. + * + * Metadata items available as image properties take precedence over + * equivalent %FITS keywords. + */ + void Read( const PropertyArray& properties, const FITSKeywordArray& keywords = FITSKeywordArray() ); + + /*! + * + */ + bool ExtractWorldTransformation( LinearTransformation& transIW, int imageHeight ); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_WCSKeywords_h + +// ---------------------------------------------------------------------------- +// EOF pcl/WCSKeywords.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/WebView.h b/3rdparty/include/pcl/WebView.h new file mode 100644 index 0000000..cfe8dcc --- /dev/null +++ b/3rdparty/include/pcl/WebView.h @@ -0,0 +1,553 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/WebView.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_WebView_h +#define __PCL_WebView_h + +/// \file pcl/WebView.h + +#include + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +#include +#include +#include +#include + +#endif // !__PCL_BUILDING_PIXINSIGHT_APPLICATION + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#ifndef __PCL_BUILDING_PIXINSIGHT_APPLICATION + +// ---------------------------------------------------------------------------- + +/*! + * \class WebView + * \brief Client-side interface to a PixInsight %WebView control. + * + * %WebView is a specialized control for rendering text and HTML content on the + * PixInsight platform. The underlying implementation, which is based on Qt5's + * QWebEngineView class, has full HTML 5.1 support and an advandced, + * last-generation JavaScript engine. + * + * It is very important to point out that this class is \e not intended to + * implement a web browser, even one with barebones functionality. The purpose + * of %WebView is to render high-quality, interactive contents such as tables, + * spreadsheets and graphics, where the contained data are dynamically + * generated as HTML and JavaScript code. + */ +class PCL_CLASS WebView : public Control +{ +public: + + /*! + * Constructs a %WebView control. + * + * \param parent The parent control of this object. The default value is + * a null control. + */ + WebView( Control& parent = Control::Null() ); + + /*! + * Destroys a %WebView control. + */ + virtual ~WebView() + { + } + + /*! + * Sets the content of this %WebView. + * + * \param data The content as a sequence of bytes, stored as a + * dynamic array of unsigned 8-bit integers. + * + * \param mimeType A MIME type describing the type of the data. By + * default, that is, if an empty string is + * specified, the type will be detected based on + * heuristics. + * + * The content loading process is asynchronous. This member function will + * return immediately before the content has actually been loaded and + * rendered in this %WebView. After calling this function, a sequence of + * events will be generated: + * + * \li A load started event. Can be received by a handler set with + * OnLoadStarted(). + * + * \li A number of successive load progress events. Can be received by a + * handler set with OnLoadProgress(). + * + * \li A final load finished event. Can be received by a handler set with + * OnLoadFinished(). This event handler in particular is necessary if the + * caller depends on (or has to wait for) the content being rendered by this + * %WebView. + * + * \sa SetHTML(), SetPlainText(), LoadContent() + */ + void SetContent( const ByteArray& data, const IsoString& mimeType = IsoString() ); + + /*! + * Sets the content of this %WebView in HTML format, encoded as UTF-8. See + * SetContent() for important information on %WebView's asynchronous content + * rendering. + */ + void SetHTML( const IsoString& html ); + + /*! + * Sets the content of this %WebView in HTML format, encoded as UTF-16. See + * SetContent() for important information on %WebView's asynchronous content + * rendering. + */ + void SetHTML( const String& html ); + + /*! + * Sets the content of this %WebView as plain Unicode \a text encoded as + * UTF-8. See SetContent() for important information on %WebView's + * asynchronous content rendering. + */ + void SetPlainText( const IsoString& text ); + + /*! + * Sets the content of this %WebView as plain Unicode \a text encoded as + * UTF-16. See SetContent() for important information on %WebView's + * asynchronous content rendering. + */ + void SetPlainText( const String& text ); + + /*! + * Loads the content of this %WebView from a local or external resource. + * + * \param uri A valid Uniform Resource Identifier, as defined + * by RFC 3986 (Uniform Resource Identifier: Generic + * Syntax). + * + * See SetContent() for important information on %WebView's asynchronous + * content rendering, also applicable to this member function. + * + * \sa SetContent() + */ + void LoadContent( const String& uri ); + + /*! + * Requests retrieval of the current content of this %WebView as plain + * Unicode text encoded in UTF-16, with all HTML markup removed. + * + * This function is asynchronous. Once the requested content is available, + * it will be sent to the OnPlainTextAvailable() event handler, if defined + * for this object. + */ + void RequestPlainText() const; + + /*! + * Requests retrieval of the current content of this %WebView as HTML code + * encoded in UTF-16. + * + * This function is asynchronous. Once the requested content is available, + * it will be sent to the OnHTMLAvailable() event handler, if defined for + * this object. + */ + void RequestHTML() const; + + /*! + * Writes the current content of this %WebView as a PDF document. + * + * \param filePath Path to the output file. + * + * \param pageWidth Page width in millimeters. The default width is + * 210 mm, corresponding to the standard A4 size. + * + * \param pageHeight Page height in millimeters. The default height is + * 297 mm, corresponding to the standard A4 size. + * + * \param marginLeft Left margin in millimeters. The default left + * margin is 10 mm. + * + * \param marginTop Top margin in millimeters. The default top margin + * is 10 mm. + * + * \param marginRight Right margin in millimeters. The default right + * margin is 10 mm. + * + * \param marginBottom Bottom margin in millimeters. The default bottom + * margin is 10 mm. + * + * \param landscape If true, the document will be generated with + * landscape orientation. This means that the width + * and height dimensions will be reversed. If false, + * the normal portrait orientation will be applied. + * This parameter is false by default. + */ + void SaveAsPDF( const String& filePath, double pageWidth = 210, double pageHeight = 297, + double marginLeft = 10, double marginTop = 10, double marginRight = 10, double marginBottom = 10, + bool landscape = false ); + + /*! + * Returns true if there is a non-empty text selection in this %WebView. + */ + bool HasSelection() const; + + /*! + * Returns the currently selected text as plain text. Returns an empty + * string if there is no text selection. + */ + String SelectedText() const; + + /*! + * Returns the zoom factor of this %WebView rendition. The returned value is + * in the range [0.25,5.0]. + */ + double ZoomFactor() const; + + /*! + * Sets the zoom factor of this %WebView rendition. The specified \a zoom + * factor must be in the range [0.25,5.0]. + */ + void SetZoomFactor( double zoom ); + + /*! + * Returns the background color of the %WebView rendition encoded in 32-bit + * RGBA format. + */ + RGBA BackgroundColor() const; + + /*! + * Sets the background color of the %WebView rendition. The specified + * \a color must be encoded in 32-bit RGBA format. + */ + void SetBackgroundColor( RGBA color ); + + /*! + * Reloads the content of this %WebView. If no content has previously been + * loaded, calling this function has no effect. + */ + void Reload(); + + /*! + * Stops loading the content of this %WebView. If there is no ongoing + * content loading operation, calling this function has no effect. + */ + void Stop(); + + /*! + * Executes a script in this %WebView. + * + * \param sourceCode A string containing valid source code in the + * specified \a language. + * + * \param language The name of a supported scripting language. + * Currently only the JavaScript language is supported + * by this function. JavaScript is assumed if this + * string is either empty or equal to "JavaScript". + * + * This function is asynchronous: It will return immediately without waiting + * for the script to complete execution. Once the script has finished, its + * result value will be sent to the OnScriptResultAvailable() event handler, + * if defined for this object. The result value is the value of the last + * executed expression statement in the script that is not in a function + * definition. Note that for scripts whose value is not required, the + * OnScriptResultAvailable event handler is not necessary. + * + * The script will be executed by a web-oriented JavaScript engine with full + * support of the HTML 5.1 standard in current versions of PixInsight. Note + * that this engine is completely different from the core JavaScript Runtime + * (PJSR), so no PJSR resources are available. If you want to execute + * JavaScript code in PJSR, use MetaModule::EvaluateScript() instead of this + * member function. + * + * This function has no way to know if script execution failed, for example + * as a result of syntax errors, invalid code, or exceptions thrown from + * JavaScript code. A Variant will always be generated to transport the + * result, but it may not transport a valid object (see Variant::IsValid()) + * if the script failed. How to diagnose script execution is completely up + * to the caller implementation. + * + * \note This function can only be called from the root thread, since the + * underlying JavaScript engine in not reentrant in current versions of + * PixInsight. Calling this function from a running thread will throw an + * Error exception. + * + * \warning You should make sure that your code has been well tested before + * calling this function. The core PixInsight application will wait until + * the script terminates execution. If your code enters an infinite loop, it + * may lead to a crash of the PixInsight platform. Also bear in mind that + * scripts are extremely powerful and potentially dangerous if you don't + * know well what you are doing. What happens during execution of your + * scripts is your entire responsibility. + */ + void EvaluateScript( const String& sourceCode, const IsoString& language = IsoString() ); + + /*! + * \defgroup web_view_event_handlers WebView Event Handlers + */ + + /*! + * Defines the prototype of a web view event handler. + * + * A web view event is generated when a %WebView instance changes its state + * or contents, or the value of one of its properties, either + * programmatically or because of user interaction. + * + * \param sender The control that sends a web view event. + * + * \ingroup web_view_event_handlers + */ + typedef void (Control::*view_event_handler)( WebView& sender ); + + /*! + * Defines the prototype of a progress event handler. + * + * A progress event is generated while the %WebView object is loading + * contents, to inform on the amount of data already loaded. + * + * \param sender The control that sends a progress event. + * + * \param loadPercent The percentage of content loaded. Should be in the + * range [0,100]. + * + * \ingroup web_view_event_handlers + */ + typedef void (Control::*progress_event_handler)( WebView& sender, int loadPercent ); + + /*! + * Defines the prototype of a state event handler. + * + * A state event is generated when the value of a Boolean %WebView property + * has changed. + * + * \param sender The control that sends a state event. + * + * \param state The current value of the Boolean property. + * + * \ingroup web_view_event_handlers + */ + typedef void (Control::*state_event_handler)( WebView& sender, bool state ); + + /*! + * Defines the prototype of a content event handler. + * + * A content event is generated after a call to RequestPlainText() or + * RequestHTML(), when the requested content is available to the caller. + * + * \param sender The control that sends a content event. + * + * \param content The requested content (HTML or plain text) encoded in + * UTF-16. + * + * \ingroup web_view_event_handlers + */ + typedef void (Control::*content_event_handler)( WebView& sender, const String& content ); + + /*! + * Defines the prototype of a result event handler. + * + * A result event is generated after a call to EvaluateScript(), when the + * script has finished execution. + * + * \param sender The control that sends a result event. + * + * \param result The result value of the executed script. The result + * value is the value of the last executed expression + * statement in the script that is not in a function + * definition. + * + * \ingroup web_view_event_handlers + */ + typedef void (Control::*result_event_handler)( WebView& sender, const Variant& result ); + + /*! + * Sets the handler for load started events generated by this + * %WebView object. A load started event is generated when the %WebView + * starts loading new content, after a call to SetContent(). + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive load started events from + * this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnLoadStarted( view_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for progress events generated by this %WebView object. A + * progress event is generated while the %WebView is loading new content, + * after a call to SetContent(), to inform on the amount of data already + * loaded. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive progress events from this + * %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnLoadProgress( progress_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for load finished events generated by this + * %WebView object. A load finished event is generated when the %WebView + * finishes loading new content, after a call to SetContent(). + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. The handler will receive a + * Boolean value true if the loading process was completed + * successfully, false in the event of error. + * + * \param receiver The control that will receive load finished events from + * this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnLoadFinished( state_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for selection updated events generated by this + * %WebView object. A selection updated event is generated each time the + * text selection is changed in this %WebView as a result of a direct user + * interaction. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive selection updated events + * from this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnSelectionUpdated( view_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for plain text content available events + * generated by this %WebView object. These events are generated + * asynchronously after a call to RequestPlainText(), when the requested + * content is available to the caller. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive plain text content + * available events from this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnPlainTextAvailable( content_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for HTML content available events generated by + * this %WebView object. These events are generated asynchronously after a + * call to RequestHTML(), when the requested content is available to the + * caller. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive HTML content available + * events from this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnHTMLAvailable( content_event_handler handler, Control& receiver ); + + /*! + * Sets the handler for script result available events generated by + * this %WebView object. These events are generated asynchronously after a + * call to EvaluateScript(), when the script has finished execution and its + * result value is available to the caller. + * + * \param handler The event handler. Must be a member function of the + * \a receiver object's class. + * + * \param receiver The control that will receive script result available + * events from this %WebView. + * + * \ingroup web_view_event_handlers + */ + void OnScriptResultAvailable( result_event_handler handler, Control& receiver ); + +private: + + struct EventHandlers + { + view_event_handler onLoadStarted = nullptr; + progress_event_handler onLoadProgress = nullptr; + state_event_handler onLoadFinished = nullptr; + view_event_handler onSelectionUpdated = nullptr; + content_event_handler onPlainTextAvailable = nullptr; + content_event_handler onHTMLAvailable = nullptr; + result_event_handler onScriptResultAvailable = nullptr; + + EventHandlers() = default; + EventHandlers( const EventHandlers& ) = default; + EventHandlers& operator =( const EventHandlers& ) = default; + }; + + AutoPointer m_handlers; + + friend class WebViewEventDispatcher; +}; + +// ---------------------------------------------------------------------------- + +#endif // __PCL_BUILDING_PIXINSIGHT_APPLICATION + +} // pcl + +#endif // __PCL_WebView_h + +// ---------------------------------------------------------------------------- +// EOF pcl/WebView.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/Win32Exception.h b/3rdparty/include/pcl/Win32Exception.h new file mode 100644 index 0000000..8ff595c --- /dev/null +++ b/3rdparty/include/pcl/Win32Exception.h @@ -0,0 +1,317 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/Win32Exception.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_Win32Exception_h +#define __PCL_Win32Exception_h + +/// \file pcl/Win32Exception.h + +#if !defined( __PCL_WINDOWS ) || defined( __PCL_LINUX ) || defined( __PCL_FREEBSD ) || defined( __PCL_MACOSX ) +# error Win32Exception can only be used on MS Windows platforms. +#endif + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class Win32Exception + * \brief A Win32 structured exception handler that throws C++ exceptions. + * + * This class can only be used on Microsoft Windows platforms. On the rest of + * supported platforms, including this header file from compilable code raises + * a compiler error. + * + * For this handler to work properly, all code that may raise asynchronous + * (structured) exceptions must be compiled with the '-EHa' Visual C/C++ + * compiler option. Otherwise no asynchronous exception thrown in a try{} block + * will be caught by the corresponding catch{} block, and the program will + * terminate. + */ +class PCL_CLASS Win32Exception : public pcl::Exception +{ +public: + + /*! + * Represents a memory address associated with an exception. For example, + * the address that has been accessed to cause an access violation error. + */ + typedef const void* exception_address; + + /*! + * Represents a pointer to a data block that describes an exception. This is + * an opaque pointer to an EXCEPTION_RECORD structure. + */ + typedef const void* exception_data_pointer; + + /*! + * The type of an exception error code. + */ + typedef unsigned exception_code; + + /*! + * Constructs a new %Win32Exception object with the specified exception + * \a code and \a data, plus optional backtrace information \a details. + */ + Win32Exception( exception_code code, exception_data_pointer data, + const IsoString& details = IsoString() ) + : m_code( code ) + , m_data( data ) + , m_details( details ) + { + } + + /*! + * Copy constructor. + */ + Win32Exception( const Win32Exception& ) = default; + + /*! + * Returns the memory address associated with this exception. + */ + exception_address ExceptionAddress() const; + + /*! + * Returns the error code of this exception. + */ + exception_code ExceptionCode() const + { + return m_code; + } + + /*! + * Returns the backtrace information associated with this exception. + * + * The returned string will be empty if no backtrace data were available at + * the time this exception was generated. + */ + const IsoString& Details() const + { + return m_details; + } + + /*! + * Returns an error or warning message corresponding to this exception. + * For example, some typical messages are "access violation", "stack + * overflow" and "illegal instruction", returned by specific derived + * classes. + */ + String Message() const override + { + return "Undefined system exception"; + } + + /*! + * Returns a formatted error message with information on this exception. + */ + String FormatInfo() const override + { + String info = String().Format( "At address %p with exception code %X :\n", + ExceptionAddress(), ExceptionCode() ) + Message(); + if ( !m_details.IsEmpty() ) + { + info.Append( '\n' ); + info.Append( m_details ); + } + return info; + } + + /*! + * Returns the type of this exception, intended to be used as a caption for + * a message box. As reimplemented in this class, this member function + * returns the string "PCL Win32 System Exception". + */ + String Caption() const override + { + return "PCL Win32 System Exception"; + } + + /*! + * Writes a formatted representation of this exception on the platform + * console. A plain text version of the same textual representation will + * also be written on stdout; however, if there is no console currently + * attached to the process (which is the typical situation for GUI Windows + * applications), no console stream output will be generated. + * + * \note Asynchronous exceptions are never reported on interactive graphical + * interfaces, such as message boxes, irrespective of global platform + * settings or local settings defined through calls to EnableGUIOutput() and + * similar functions. + */ + void Show() const override; + + /*! + * Initializes the structured exception handler. This static member function + * must be called before the calling process can raise any system exception. + * + * \note A module should never call this member function. It is invoked when + * appropriate by the PixInsight core application and internal PCL routines. + */ + static void Initialize(); + +protected: + + exception_code m_code; + exception_data_pointer m_data; // points to an EXCEPTION_RECORD structure + IsoString m_details; // backtrace information +}; + +// ---------------------------------------------------------------------------- + +class PCL_CLASS Win32AccessViolationException : public Win32Exception +{ +public: + + Win32AccessViolationException( exception_code code, exception_data_pointer data, + const IsoString& details = IsoString() ) + : Win32Exception( code, data, details ) + { + } + + Win32AccessViolationException( const Win32AccessViolationException& ) = default; + + String Message() const override; +}; + +// ---------------------------------------------------------------------------- + +#define DECLARE_WIN32_EXCEPTION( className, message ) \ + class PCL_CLASS className : public pcl::Win32Exception \ + { \ + public: \ + className( exception_code code, exception_data_pointer data, \ + const IsoString& details = IsoString() ) : \ + pcl::Win32Exception( code, data, details ) \ + { \ + } \ + className( const className& ) = default; \ + String Message() const override \ + { \ + return message; \ + } \ + } + +// ---------------------------------------------------------------------------- + +DECLARE_WIN32_EXCEPTION( EWin32ArrayBoundsExceeded, + "Array bounds exceeded" ); + +DECLARE_WIN32_EXCEPTION( EWin32Breakpoint, + "A breakpoint was encountered" ); + +DECLARE_WIN32_EXCEPTION( EWin32DataMisalignment, + "Invalid read/write operation on misaligned data" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointDenormalOperand, + "Denormal operand in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointDivideByZero, + "Division by zero in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointInexactResult, + "Inexact result in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointInvalidOperation, + "Invalid floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointOverflow, + "Overflow in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointStackCheck, + "Stack limits exceeded in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32FloatingPointUnderflow, + "Underflow in floating-point operation" ); + +DECLARE_WIN32_EXCEPTION( EWin32IllegalInstruction, + "Illegal processor instruction" ); + +DECLARE_WIN32_EXCEPTION( EWin32PageError, + "Memory page not found" ); + +DECLARE_WIN32_EXCEPTION( EWin32DivideByZero, + "Integer division by zero" ); + +DECLARE_WIN32_EXCEPTION( EWin32Overflow, + "Integer overflow" ); + +DECLARE_WIN32_EXCEPTION( EWin32InvalidDisposition, + "Invalid exception disposition" ); + +DECLARE_WIN32_EXCEPTION( EWin32NonContinuableException, + "Noncontinuable exception " ); + +DECLARE_WIN32_EXCEPTION( EWin32PrivilegedInstruction, + "Privileged processor instruction" ); + +DECLARE_WIN32_EXCEPTION( EWin32SingleStep, + "Single-instruction step" ); + +DECLARE_WIN32_EXCEPTION( EWin32StackOverflow, + "Stack overflow" ); + +// ---------------------------------------------------------------------------- + +#undef DECLARE_WIN32_EXCEPTION + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_Win32Exception_h + +// ---------------------------------------------------------------------------- +// EOF pcl/Win32Exception.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/WordArray.h b/3rdparty/include/pcl/WordArray.h new file mode 100644 index 0000000..44c86a1 --- /dev/null +++ b/3rdparty/include/pcl/WordArray.h @@ -0,0 +1,121 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/WordArray.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_WordArray_h +#define __PCL_WordArray_h + +/// \file pcl/WordArray.h + +#include + +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup word_arrays Word Array Classes + */ + +/*! + * \class pcl::WordArray + * \brief Dynamic array of 16-bit unsigned integers. + * + * %WordArray is a template instantiation of Array for \c uint16. + * + * \ingroup word_arrays + * \ingroup dynamic_arrays + */ +typedef Array WordArray; + +/*! + * \class pcl::SortedWordArray + * \brief Dynamic sorted array of 16-bit unsigned integers. + * + * %SortedWordArray is a template instantiation of SortedArray for \c uint16. + * + * \ingroup word_arrays + * \ingroup dynamic_arrays + */ +typedef SortedArray SortedWordArray; + +/*! + * \class pcl::ShortArray + * \brief Dynamic array of 16-bit signed integers. + * + * %ShortArray is a template instantiation of Array for \c int16. + * + * \ingroup word_arrays + * \ingroup dynamic_arrays +*/ +typedef Array ShortArray; + +/*! + * \class pcl::SortedShortArray + * \brief Dynamic sorted array of 16-bit signed integers. + * + * %SortedShortArray is a template instantiation of SortedArray for \c int16. + * + * \ingroup word_arrays + * \ingroup dynamic_arrays + */ +typedef SortedArray SortedShortArray; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_WordArray_h + +// ---------------------------------------------------------------------------- +// EOF pcl/WordArray.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/WorldTransformation.h b/3rdparty/include/pcl/WorldTransformation.h new file mode 100644 index 0000000..b747ab5 --- /dev/null +++ b/3rdparty/include/pcl/WorldTransformation.h @@ -0,0 +1,681 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/WorldTransformation.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_WorldTransformation_h +#define __PCL_WorldTransformation_h + +/// \file pcl/WorldTransformation.h + +#include + +#include +#include +#include +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +#define __PCL_WCS_DEFAULT_SPLINE_ORDER 2 +#define __PCL_WCS_DEFAULT_SPLINE_SMOOTHNESS 0.025F +#define __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_ENABLED true +#define __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_TOLERANCE 0.25F // px +#define __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_REJECT_FRACTION 0.10F +#define __PCL_WCS_MAX_SPLINE_POINTS 2100 + +// ---------------------------------------------------------------------------- + +/*! + * \class WorldTransformation + * \brief Abstract base class of world coordinate transformations + * + * \ingroup astrometry_support + */ +class PCL_CLASS WorldTransformation +{ +public: + + /*! + * Default constructor. + */ + WorldTransformation() = default; + + /*! + * Copy constructor. + */ + WorldTransformation( const WorldTransformation& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~WorldTransformation() + { + } + + /*! + * Returns true iff this transformation is empty (uninitialized, invalid). + */ + virtual bool IsEmpty() const + { + return false; + } + + /*! + * Returns a dynamically allocated copy of this object. + */ + virtual WorldTransformation* Clone() const = 0; + + /*! + * Transforms from native spherical coordinates to image coordinates. + * + * The point \a p contains native spherical coordinates: \a p.x is the + * native longitude and \a p.y is the native latitude, both expressed in + * degrees. Returns image coordinates in pixels corresponding to \a p. + */ + virtual DPoint Direct( const DPoint& p ) const = 0; + + /*! + * Transforms from image coordinates to native spherical coordinates. + * + * The specified point \a p contains image coordinates in pixels. Returns a + * point \a q where \a q.x is the native longitude and \a q.y is the native + * latitude, both expressed in degrees, corresponding to \a p. + */ + virtual DPoint Inverse( const DPoint& p ) const = 0; + + /*! + * Returns an approximate linear transformation from Image to World + * coordinates. + */ + virtual const LinearTransformation& ApproximateLinearTransform() const = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class LinearWorldTransformation + * \brief WCS linear world coordinate transformation + * + * \ingroup astrometry_support + */ +class PCL_CLASS LinearWorldTransformation : public WorldTransformation +{ +public: + + /*! + * Constructor from a linear transformation. The specified transformation + * \a transIW must transform from image coordinates to native spherical + * coordinates. + */ + LinearWorldTransformation( const LinearTransformation& transIW ) + : m_transWI( transIW.Inverse() ) + , m_transIW( transIW ) + { + } + + /*! + * Copy constructor. + */ + LinearWorldTransformation( const LinearWorldTransformation& ) = default; + + /*! + * Move constructor. + */ + LinearWorldTransformation( LinearWorldTransformation&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~LinearWorldTransformation() + { + } + + /*! + * Returns false, since a linear WCS transformation cannot be empty. + */ + bool IsEmpty() const override + { + return false; + } + + /*! + */ + WorldTransformation* Clone() const override + { + return new LinearWorldTransformation( *this ); + } + + /*! + */ + DPoint Direct( const DPoint& p ) const override + { + return m_transWI.Transform( p ); + } + + /*! + */ + DPoint Inverse( const DPoint& p ) const override + { + return m_transIW.Transform( p ); + } + + /*! + * Returns a reference to the internal linear transformation (from image to + * native spherical coordinates). + */ + const LinearTransformation& ApproximateLinearTransform() const override + { + return m_transIW; + } + +private: + + LinearTransformation m_transWI; // world -> image + LinearTransformation m_transIW; // image -> world +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class SplineWorldTransformation + * \brief Surface spline world coordinate transformation + * + * %SplineWorldTransformation implements a world coordinate transform based on + * 2-D interpolating/approximating surface splines (also known as thin + * plates). These mathematical modeling devices allow for accurate + * representations of coordinate systems subject to arbitrary local + * distortions, which are impossible to achieve with linear transformations. + * + * The underlying implementation of this class uses the SurfaceSpline, + * PointSurfaceSpline, SurfaceSimplifier and PointGridInterpolation classes. + * + * \ingroup astrometry_support + */ +class PCL_CLASS SplineWorldTransformation : public WorldTransformation +{ +public: + + /*! + * Constructs a 2-D spline based world coordinate transformation. + * + * \param controlPointsW Array of world control points. Each point in this + * array must contain spherical coordinates in the + * native world coordinate system of the astrometric + * solution, expressed in degrees. For a given + * point p in this array, p.x is the native + * longitude coordinate and p.y is the latitude. + * + * \param controlPointsI Array of image control points. Each point in this + * array must contain the coordinates on the X and Y + * axes of the image plane corresponding to the same + * point in the \a controlPointsW array. In other + * words, there must be a one-to-one correspondence + * between world and image control points. + * + * \param smoothness When this parameter is greater than zero, + * approximating splines will be generated instead + * of interpolating splines. The higher this value, + * the closest will be the 2-D approximating surface + * to the reference plane of the image. + * Approximating surface splines are robust to + * outlier control points and hence recommended in + * virtually all cases. The value of this parameter + * should be relatively small if \a enableSimplifier + * is true, since the surface simplification + * algorithm already performs robust rejection of + * outliers. The default value of 0.025 is normally + * quite appropriate. + * + * \param weights When the \a smoothness parameter is greater than + * zero and this vector is not empty, it must define + * a positive weight greater than zero for each + * point defined by the \a controlPointsW and + * \a controlPointsI arrays. If \a smoothness is + * zero or negative, this parameter will be ignored. + * See the PointSurfaceSpline::Initialize() member + * function for detailed information on 2-D spline + * node weights. If \a enableSimplifier is true, + * control point weights are not used and hence the + * value of this parameter will be ignored. + * + * \param order Derivative order of continuity. The default value + * is 2, which is also the recommended value. Higher + * orders may improve adaptability to complex field + * distortions only in some special cases, but at + * the risk of leading to ill-conditioned linear + * systems, and hence to errors while building the + * surface splines. + * + * \param enableSimplifier If true, a surface simplification algorithm will + * be applied to the lists of control points for + * surface spline generation. The use of surface + * simplification greatly improves efficiency of + * surface splines by removing all redundant points + * and keeping only the control points required to + * define the coordinate transformations accurately. + * In addition, the applied surface simplification + * algorithm implements robust PCA fitting and + * outlier rejection techniques that improve the + * generated interpolation devices in terms of + * resilience to noise and invalid data in the + * underlying astrometric solution. This option is + * enabled by default. When this parameter is true, + * the \a weights parameter is ignored. + * + * \param simplifierTolerance Tolerance of the surface simplification + * algorithm in pixels. The default value is 0.25 + * pixels. + * + * \param simplifierRejectFraction Fraction of rejected control points for + * simplification of surface subregions. The default + * value is 0.10. + * + * Thanks to the implemented surface simplification algorithms, we can work + * with very large sets of control points to generate astrometric solutions + * able to model strong and complex arbitrary field distortions accurately + * and efficiently. Surface simplification concentrates control points just + * where they are necessary to represent distortions, leaving undistorted + * regions of the image covered by a minimal grid. + * + * Newly constructed instances are guaranteed to be valid (in the structural + * and numerical senses; note that this does not necessarily imply that the + * underlying astrometric solution is valid). In the event of invalid input + * data or spline initialization problems, this constructor will throw an + * Error exception. + * + * After surface spline initialization, an approximate linear transformation + * will also be calculated automatically. + */ + SplineWorldTransformation( const Array& controlPointsW, + const Array& controlPointsI, + float smoothness = __PCL_WCS_DEFAULT_SPLINE_SMOOTHNESS, + const FVector& weights = FVector(), + int order = __PCL_WCS_DEFAULT_SPLINE_ORDER, + bool enableSimplifier = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_ENABLED, + float simplifierTolerance = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_TOLERANCE, + float simplifierRejectFraction = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_REJECT_FRACTION ) + : m_controlPointsW( controlPointsW ) + , m_controlPointsI( controlPointsI ) + , m_order( order ) + , m_smoothness( smoothness ) + , m_weights( weights ) + , m_enableSimplifier( enableSimplifier ) + , m_simplifierTolerance( simplifierTolerance ) + , m_simplifierRejectFraction( simplifierRejectFraction ) + { + InitializeSplines(); + CalculateLinearApproximation(); + } + + /*! + * Constructs a %SplineWorldTransformation instance by deserializing the + * specified raw \a data. + * + * An approximate linear transformation will be calculated automatically. + */ + SplineWorldTransformation( const ByteArray& data ) + { + Deserialize( data ); + InitializeSplines(); + CalculateLinearApproximation(); + } + + /*! + * Constructs a %SplineWorldTransformation instance by deserializing the + * specified raw \a data, with a prescribed approximate linear + * transformation \a linearTransIW. + */ + SplineWorldTransformation( const ByteArray& data, const LinearTransformation& linearTransIW ) + { + Deserialize( data ); + InitializeSplines(); + m_linearIW = linearTransIW; + } + + /*! + * Copy constructor. + */ + SplineWorldTransformation( const SplineWorldTransformation& ) = default; + + /*! + * Move constructor. + */ + SplineWorldTransformation( SplineWorldTransformation&& ) = default; + + /*! + * Virtual destructor. + */ + virtual ~SplineWorldTransformation() + { + } + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + SplineWorldTransformation& operator =( const SplineWorldTransformation& ) = default; + + /*! + * Move assignment operator. Returns a reference to this object. + */ + SplineWorldTransformation& operator =( SplineWorldTransformation&& ) = default; + + /*! + * Returns true iff this object has no working data. + * + * With the restrictions imposed by class constructors, this can only happen + * if this object is an xvalue after move construction or assignment. + */ + bool IsEmpty() const override + { + return m_controlPointsW.IsEmpty() || m_controlPointsI.IsEmpty(); + } + + /*! + * Returns a dynamically allocated copy of this object. + */ + WorldTransformation* Clone() const override + { + return new SplineWorldTransformation( *this ); + } + + /*! + * Transforms from native spherical coordinates to image coordinates. + * + * The point \a p contains native spherical coordinates: \a p.x is the + * native longitude and \a p.y is the native latitude, both expressed in + * degrees. Returns image coordinates in pixels corresponding to \a p. + * + * If grid interpolations have been initialized for this object, and the + * specified point \a p is included in the reference rectangle used for grid + * initialization, they will be used transparently by this member function. + * Otherwise the surface splines will be evaluated directly, which can be + * much slower, depending on the number of control points defined by the + * astrometric solution. + * + * \sa Inverse(), InitializeGridInterpolations() + */ + DPoint Direct( const DPoint& p ) const override + { + if ( m_gridWI.IsValid() ) + if ( m_gridWI.ReferenceRect().IncludesFast( p ) ) + return m_gridWI( p ); + return m_splineWI( p ); + } + + /*! + * Transforms from image coordinates to native spherical coordinates. + * + * The specified point \a p contains image coordinates in pixels. Returns a + * point \a q where \a q.x is the native longitude and \a q.y is the native + * latitude, both expressed in degrees, corresponding to \a p. + * + * If grid interpolations have been initialized for this object, and the + * specified point \a p is included in the reference rectangle used for grid + * initialization, they will be used transparently by this member function. + * Otherwise the surface splines will be evaluated directly, which can be + * much slower, depending on the number of control points defined by the + * astrometric solution. + * + * \sa Direct(), InitializeGridInterpolations() + */ + DPoint Inverse( const DPoint& p ) const override + { + if ( m_gridIW.IsValid() ) + if ( m_gridIW.ReferenceRect().IncludesFast( p ) ) + return m_gridIW( p ); + return m_splineIW( p ); + } + + /*! + * Returns an approximate linear transformation from image to native + * spherical coordinates, computed from the internal point surface splines. + */ + const LinearTransformation& ApproximateLinearTransform() const override + { + return m_linearIW; + } + + /*! + * Initializes the internal grid interpolation devices for the specified + * reference rectangular region \a rect and grid distance \a delta in + * pixels. + * + * A grid distance of 24 pixels is applied by default. This is normally more + * than sufficient to yield accurate coordinate readouts, even for strongly + * distorted images. + * + * See GridInterpolation::Initialize() for detailed information on spline + * grid interpolation and its working parameters. + * + * \note This member function will show no console messages. If some + * feedback must be provided to the user during the potentially long + * operation, it must be given before calling this function. + */ + void InitializeGridInterpolations( const Rect& rect, int delta = 24 ) + { + m_gridWI.Initialize( rect, delta, m_splineWI, false/*verbose*/ ); + m_gridIW.Initialize( rect, delta, m_splineIW, false/*verbose*/ ); + } + + /*! + * Returns true if the internal grid interpolation devices have been + * initialized. See InitializeGridInterpolations() for information on grid + * interpolation. + */ + bool HasGridInterpolations() const + { + return m_gridWI.IsValid() && m_gridIW.IsValid(); + } + + /*! + * Serializes this %SplineWorldTransformation instance in raw binary format + * and stores the result in the specified \a data array. + */ + void Serialize( ByteArray& data ) const; + + /*! + * Returns the number of control points employed to generate the surface + * splines used for coordinate transformations. + * + * The value returned by this function is the length of the original list of + * control points specified upon object construction or deserialization; the + * actual sets of data points being used internally by surface splines are + * usually smaller because surface simplification is enabled by default. + * + * \sa NativeControlPoints(), ImageControlPoints(), GetSplineLengths() + */ + int NumberOfControlPoints() const + { + return int( m_controlPointsW.Length() ); + } + + /*! + * Returns a reference to the list of control points in native spherical + * coordinates. + * + * For each point \e p in the returned array, \e p.x is the native longitude + * and \e p.y is the native latitude, both expressed in degrees. + * + * For each point \a p in the returned array, there is a corresponding point + * \a q in the array of image control points returned by the + * \a ImageControlPoints() member function, whose \e q.x and \e q.y + * components are the image coordinates in pixels corresponding to \e p. + */ + const Array& NativeControlPoints() const + { + return m_controlPointsW; + } + + /*! + * Returns a reference to the list of control points in image coordinates. + * + * For each point \e p in the returned array, \e p.x and \e p.y are the + * components of a control point in image coordinates, expressed in pixels. + * + * For each point \a p in the returned array, there is a corresponding point + * \a q in the array of native control points returned by the + * \a NativeControlPoints() member function, whose \e q.x and \e q.y + * components are the spherical native coordinates in degrees corresponding + * to \e p. + */ + const Array& ImageControlPoints() const + { + return m_controlPointsI; + } + + /*! + * Provides the number of data points in the internal surface splines used + * for coordinate transformations. + * + * \param[out] xWI Number of spline points used for world-to-image + * coordinate transformations on the native longitude + * direction. + * + * \param[out] yWI Number of spline points used for world-to-image + * coordinate transformations on the native latitude + * direction. + * + * \param[out] xIW Number of spline points used for image-to-world + * coordinate transformations on the X-axis direction. + * + * \param[out] yIW Number of spline points used for image-to-world + * coordinate transformations on the Y-axis direction. + */ + void GetSplineLengths( int& xWI, int& yWI, int& xIW, int& yIW ) const + { + xWI = m_splineWI.SplineX().Length(); + yWI = m_splineWI.SplineY().Length(); + xIW = m_splineIW.SplineX().Length(); + yIW = m_splineIW.SplineY().Length(); + } + + /*! + * Returns true iff the lists of transformation control points were + * truncated before generation of surface splines. If surface simplification + * is enabled, truncation may happen, when necessary, after simplification. + * If no simplification is used, truncation may happen directly on the + * original lists of control points. + * + * A maximum of 2100 control points is imposed in the current implementation + * to prevent excessive execution times for surface spline generation, which + * grow approximately with O(n^3) complexity. + */ + bool TruncatedControlPoints() const + { + return m_truncated; + } + + /*! + * Returns true iff the surface simplification algorithm has been enabled + * for generation of surface splines. See the class constructor for more + * information. + */ + bool IsSimplifierEnabled() const + { + return m_enableSimplifier; + } + + /*! + * Returns the tolerance in pixels of the surface simplifier used for + * generation of surface splines. See the class constructor for more + * information. + */ + float SimplifierTolerance() const + { + return m_simplifierTolerance; + } + + /*! + * Returns the outlier rejection fraction of the surface simplifier used for + * generation of surface splines. See the class constructor for more + * information. + */ + float SimplifierRejectFraction() const + { + return m_simplifierRejectFraction; + } + +private: + + Array m_controlPointsW; + Array m_controlPointsI; + int m_order = __PCL_WCS_DEFAULT_SPLINE_ORDER; + float m_smoothness = __PCL_WCS_DEFAULT_SPLINE_SMOOTHNESS; + FVector m_weights; + bool m_enableSimplifier = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_ENABLED; + float m_simplifierTolerance = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_TOLERANCE; + float m_simplifierRejectFraction = __PCL_WCS_SURFACE_SIMPLIFIER_DEFAULT_REJECT_FRACTION; + bool m_truncated = false; + PointSurfaceSpline m_splineWI; + PointSurfaceSpline m_splineIW; + PointGridInterpolation m_gridWI; + PointGridInterpolation m_gridIW; + LinearTransformation m_linearIW; + + void Deserialize( const ByteArray& ); + void InitializeSplines(); + void CalculateLinearApproximation(); +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_WorldTransformation_h + +// ---------------------------------------------------------------------------- +// EOF pcl/WorldTransformation.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/XISF.h b/3rdparty/include/pcl/XISF.h new file mode 100644 index 0000000..7d22c8a --- /dev/null +++ b/3rdparty/include/pcl/XISF.h @@ -0,0 +1,1629 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/XISF.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_XISF_h +#define __PCL_XISF_h + +/// \file pcl/XISF.h + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup xisf_support XISF Support Classes + * + * This group of classes can be used to implement %XISF support in PixInsight + * modules as well as in external applications. They don't require a running + * PixInsight core application and don't have dependencies outside the standard + * PCL distribution on all supported platforms. + * + * All publicly declared classes in this group are thread-safe: they can be + * instantiated and their member functions can be called from different threads + * running concurrently. + * + * For introductory usage examples, see the utility command-line applications + * included in the PCL distribution. For an advanced example, see the source + * code of the %XISF format support PixInsight module. + * + * The latest %XISF specification document is available at: + * + * http://pixinsight.com/doc/docs/XISF-1.0-spec/XISF-1.0-spec.html + * + * For general information on %XISF, including the latest news on the format + * and its development: + * + * http://pixinsight.com/xisf/ + */ + +// ---------------------------------------------------------------------------- + +class XISFReaderEngine; +class XISFWriterEngine; + +class PCL_CLASS Compression; +class PCL_CLASS CryptographicHash; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::XISFChecksum + * \brief %XISF block checksum algorithms + * + * + * + * + * + * + * + *
XISFChecksum::Unknown Unknown or unsupported checksum algorithm.
XISFChecksum::None No checksums.
XISFChecksum::SHA1 SHA-1 checksums.
XISFChecksum::SHA256 SHA-256 checksums.
XISFChecksum::SHA512 SHA-512 checksums.
+ * + * \ingroup xisf_support + */ +namespace XISFChecksum +{ + enum value_type + { + Unknown = -1, + None = 0, + SHA1, + SHA256, + SHA512, + NumberOfSupportedAlgorithms + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::XISFCompression + * \brief %XISF block compression codecs + * + * + * + * + * + * + * + * + * + * + *
XISFCompression::Unknown Unknown or unsupported block compression algorithm.
XISFCompression::None No block compression.
XISFCompression::Zlib Zlib compression.
XISFCompression::LZ4 LZ4 compression.
XISFCompression::LZ4HC LZ4-HC compression.
XISFCompression::Zlib_Sh Zlib compression with byte shuffling.
XISFCompression::LZ4_Sh LZ4 compression with byte shuffling.
XISFCompression::LZ4HC_Sh Lz4-HC compression with byte shuffling.
+ * + * \ingroup xisf_support + */ +namespace XISFCompression +{ + enum value_type + { + Unknown = -1, + None = 0, + Zlib, + LZ4, + LZ4HC, + Zlib_Sh, + LZ4_Sh, + LZ4HC_Sh, + NumberOfSupportedCodecs + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::XISFByteOrder + * \brief %XISF block byte order + * + * + * + * + *
XISFByteOrder::LittleEndian Little-endian byte order.
XISFByteOrder::BigEndian Big-endian byte order.
+ * + * \ingroup xisf_support + */ +namespace XISFByteOrder +{ + enum value_type + { + LittleEndian, + BigEndian + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class XISF + * \brief Utility functions, data and constants for %XISF support + * \ingroup xisf_support + */ +class PCL_CLASS XISF +{ +public: + + /*! + * Represents a supported %XISF property type. + */ + typedef VariantType::value_type property_type; + + /*! + * Represents a supported color space. + */ + typedef ColorSpace::value_type color_space; + + /*! + * Represents a supported block checksum algorithm. + */ + typedef XISFChecksum::value_type block_checksum; + + /*! + * Represents a supported block compression codec. + */ + typedef XISFCompression::value_type block_compression; + + /*! + * Represents a block byte order (endianness). + */ + typedef XISFByteOrder::value_type block_endianness; + + /*! + * Default constructor. This constructor is disabled because %XISF is not an + * instantiable class. + */ + XISF() = delete; + + /*! + * Copy constructor. This constructor is disabled because %XISF is not an + * instantiable class. + */ + XISF( const XISF& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %XISF is not an + * instantiable class. + */ + XISF& operator =( const XISF& ) = delete; + + /*! + * Destructor. This destructor is disabled because %XISF is not an + * instantiable class. + */ + ~XISF() = delete; + + /* + * ### N.B.: As of version 1.8.5.1309: Clang on macOS does not know how to + * compile the following constexpr static members, giving buggy 'Undefined + * symbols for architecture x86_64' errors on some modules... + */ +#ifndef __clang__ + + /*! + * Default block size in bytes for optional alignment of %XISF data + * structures. + */ + constexpr static fsize_type DefaultBlockAlignSize = 4096; + + /*! + * Default maximum size in bytes of an inline %XISF block. + */ + constexpr static fsize_type DefaultMaxBlockInlineSize = 3072; // 3072*4/3 = 4096 (base64) + + /*! + * Maximum allowed width or height of an %XISF image thumbnail in pixels. + */ + constexpr static int MaxThumbnailSize = 1024; + + /*! + * Default block checksum algorithm. + */ + constexpr static block_checksum DefaultChecksum = XISFChecksum::None; + + /*! + * Default block compression codec. + */ + constexpr static block_compression DefaultCompression = XISFCompression::None; + + /*! + * Default compression level. This is zero by default, which means that the + * specific compression level used will be chosen as a good compromise for + * the selected compression codec. + */ + constexpr static int DefaultCompressionLevel = 0; + + /*! + * Maximum codec-independent compression level. + */ + constexpr static int MaxCompressionLevel = 100; + + /*! + * The default verbosity level: 0=quiet, 1=normal, 2=quite, >2=very. + */ + constexpr static int DefaultVerbosity = 1; + + /*! + * Whether to replace NaNs, infinities and negative zeros with lower bound + * values (usually zero) in floating point images. This applies only to + * input operations. + */ + constexpr static bool DefaultFixNonFinite = true; + + /*! + * The default lower bound of the output floating point pixel sample range. + */ + constexpr static double DefaultOutputLowerBound = 0.0; + + /*! + * The default upper bound of the output floating point pixel sample range. + */ + constexpr static double DefaultOutputUpperBound = 1.0; + + /*! + * Whether to serialize FITS keywords by default. Has to be true because + * some components of our standard tool set still depend heavily on FITS + * keywords. Should be false, and it will be, eventually. + */ + constexpr static bool DefaultStoreFITSKeywords = true; + + /*! + * Whether to ignore existing FITS keywords by default. Has to be false + * because some components of our standard tool set still depend heavily on + * FITS keywords. Should be true, and it will be, eventually. + */ + constexpr static bool DefaultIgnoreFITSKeywords = false; + + /*! + * Whether to import FITS keywords as %XISF properties by default. Can be + * useful for digestions of data stored in legacy formats, but is a bad idea + * on a regular basis. + */ + constexpr static bool DefaultImportFITSKeywords = false; + + /*! + * Whether to ignore all embedded data by default. + */ + constexpr static bool DefaultIgnoreEmbeddedData = false; + + /*! + * Whether to ignore embedded image properties by default. + */ + constexpr static bool DefaultIgnoreProperties = false; + + /*! + * Whether to generate %XISF standard metadata properties by default. + */ + constexpr static bool DefaultAutoMetadata = true; + + /*! + * Whether to silent warning conditions by default. + */ + constexpr static bool DefaultNoWarnings = false; + + /*! + * Whether to treat warnings as unrecoverable errors by default. + */ + constexpr static bool DefaultWarningsAreErrors = false; + + /*! + * The namespace prefix of all %XISF reserved properties. + */ + constexpr static const char* InternalNamespacePrefix = "XISF:"; + +#else + + static const fsize_type DefaultBlockAlignSize; + static const fsize_type DefaultMaxBlockInlineSize; + static const int MaxThumbnailSize; + static const block_checksum DefaultChecksum; + static const block_compression DefaultCompression; + static const int DefaultCompressionLevel; + static const int MaxCompressionLevel; + static const int DefaultVerbosity; + static const bool DefaultFixNonFinite; + static const double DefaultOutputLowerBound; + static const double DefaultOutputUpperBound; + static const bool DefaultStoreFITSKeywords; + static const bool DefaultIgnoreFITSKeywords; + static const bool DefaultImportFITSKeywords; + static const bool DefaultIgnoreEmbeddedData; + static const bool DefaultIgnoreProperties; + static const bool DefaultAutoMetadata; + static const bool DefaultNoWarnings; + static const bool DefaultWarningsAreErrors; + static const char* InternalNamespacePrefix; + +#endif // !__clang__ + + /*! + * Returns the identifier of a pixel sample data type. Used as %XML element + * attribute values in %XISF headers. + * + * %XISF 1.0 supports seven pixel sample formats: + * + * \li 32-bit IEEE 754 floating point real (float) + * \li 64-bit IEEE 754 floating point real (double) + * \li 32-bit IEEE 754 floating point complex (fcomplex) + * \li 64-bit IEEE 754 floating point complex (dcomplex) + * \li 8-bit unsigned integer real (uint8) + * \li 16-bit unsigned integer real (uint16) + * \li 32-bit unsigned integer real (uint32) + */ + static const char* SampleFormatId( int bitsPerSample, bool floatSample, bool complexSample ); + + /*! + * Returns the identifier of the pixel sample data type corresponding to the + * specified \a image. + */ + template + static const char* SampleFormatId( const GenericImage

& image ) + { + return SampleFormatId( P::BitsPerSample(), P::IsFloatSample(), P::IsComplexSample() ); + } + + /*! + * Provides the parameters (bit size, complex/float/integer format) of a + * pixel sample format, given its identifier. Used for deserialization from + * %XML file headers. + */ + static bool GetSampleFormatFromId( int& bitsPerSample, bool& floatSample, bool& complexSample, const String& id ); + + /*! + * Returns the identifier of a color space. Used as %XML element attribute + * values in %XISF headers. + * + * XISF 1.0 supports three color spaces: + * + * \li Grayscale + * \li RGB + * \li CIE L*a*b* + * + * For more information on color spaces, see RGBColorSystem. + */ + static const char* ColorSpaceId( color_space colorSpace ); + + /*! + * Returns the identifier of the color space corresponding to the specified + * \a image. + */ + static const char* ColorSpaceId( const AbstractImage& image ) + { + return ColorSpaceId( image.ColorSpace() ); + } + + /*! + * Returns a color space, given its identifier. Used for deserialization + * from %XML file headers. + */ + static color_space ColorSpaceFromId( const String& id ); + + /*! + * Returns the identifier of a property data \a type. Used as %XML element + * attribute values in %XISF headers. + * + * %XISF can store image properties in a variety of scalar, vector and + * matrix types. See the code below and pcl/Variant.h for details. + */ + static const char* PropertyTypeId( property_type type ); + + /*! + * Get a property data type, given its identifier. Used for deserialization + * from %XML file headers. + */ + static property_type PropertyTypeFromId( const String& id ); + + /*! + * Returns the identifier of a supported compression \a codec. Used as %XML + * element attribute values in %XISF headers. + */ + static const char* CompressionCodecId( block_compression codec ); + + /*! + * Returns a compression codec, given its identifier. Used for + * deserialization from %XML file headers. + */ + static block_compression CompressionCodecFromId( const String& id ); + + /*! + * Returns a pointer to a dynamically allocated Compression object. The + * returned object implements the specified compression \a codec. + * \a itemSize is the length in bytes of a data element, for byte shufflig. + */ + static Compression* NewCompression( block_compression codec, size_type itemSize = 1 ); + + /*! + * Returns the codec-specific compression level to be used for the specified + * compression \a codec and abstract compression \a level. + */ + static int CompressionLevelForMethod( block_compression codec, int level ); + + /*! + * Returns true iff the specified compression \a codec uses byte shuffling + * to preprocess uncompressed data. + */ + static bool CompressionUsesByteShuffle( block_compression codec ); + + /*! + * Given a compression \a codec, returns the equivalent codec without byte + * shuffling. + */ + static block_compression CompressionCodecNoShuffle( block_compression codec ); + + /*! + * Returns true iff a compression \a codec needs to know the size of each + * element in a compressed block (for example, for byte shuffling). + */ + static bool CompressionNeedsItemSize( block_compression codec ); + + /*! + * Returns the identifier of a supported checksum \a algorithm. Used as %XML + * element attribute values in %XISF headers. + */ + static const char* ChecksumAlgorithmId( block_checksum algorithm ); + + /*! + * Returns a checksum algorithm, given its identifier. Used for + * deserialization from %XML file headers. + */ + static block_checksum ChecksumAlgorithmFromId( const String& id ); + + /*! + * Returns the length in bytes of a cryptographic digest computed with the + * specified \a algorithm. + */ + static size_type ChecksumLength( block_checksum algorithm ); + + /*! + * Returns a pointer to a dynamically allocated CryptographicHash object. + * The returned object implements the specified hashing \a algorithm. + */ + static CryptographicHash* NewCryptographicHash( block_checksum algorithm ); + + /*! + * Returns true iff the specified string \a id is a valid XISF property + * identifier. + * + * A valid XISF property identifier is a sequence: + * + * t1[:t2[:...:tn]] + * + * where each \a ti satisfies the following conditions: + * + * \li It is not an empty string. + * + * \li Its first character is either an alphabetic character or an + * underscore character. + * + * \li Its second and successive characters, if they exist, are all of them + * either alphabetic characters, decimal digits, or underscores. + */ + static bool IsValidPropertyId( const IsoString& id ) + { + return Property::IsValidIdentifier( id ); + } + + static bool IsValidPropertyId( const IsoString::ustring_base& id ) + { + return IsValidPropertyId( IsoString( id ) ); + } + + /*! + * Returns true iff the specified string \a id is the identifier of a + * reserved %XISF property. + * + * Property identifiers starting with the XISF: namespace prefix are + * reserved by the %XISF format and cannot be defined by external client + * applications. + */ + static bool IsInternalPropertyId( const IsoString& id ) + { + return id.StartsWith( InternalNamespacePrefix ); + } + + static bool IsInternalPropertyId( const IsoString::ustring_base& id ) + { + return IsInternalPropertyId( IsoString( id ) ); + } + + /*! + * Returns a property identifier 'internalized' with the XISF: prefix. + */ + static IsoString InternalPropertyId( const IsoString& id ) + { + if ( !IsInternalPropertyId( id ) ) + return InternalNamespacePrefix + id; + return id; + } + + static IsoString InternalPropertyId( const IsoString::ustring_base& id ) + { + return InternalPropertyId( IsoString( id ) ); + } + + /*! + * Ensures that the internal pixel traits lookup tables have been properly + * allocated and initialized. This is a thread-safe function used internally + * by the XISFReader and XISFWriter classes to accelerate conversions among + * all supported pixel sample data types. This allows external applications + * to perform image I/O operations without a running PixInsight core + * application. + * + * \note This is an internal routine. You normally should not need to call + * it, unless you are hacking the current %XISF implementation. + */ + static void EnsurePTLUTInitialized(); +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XISFOptions + * \brief %XISF-specific file options + * + * This structure stores a collection of settings and options that control the + * way %XISF units are loaded and generated by this implementation. + * + * %XISFOptions, along with ImageOptions, allow client modules and applications + * to manipulate properties and images serialized in %XISF units with a high + * degree of flexibility, tailoring them to the needs of each application. + * + * \ingroup xisf_support + */ +class PCL_CLASS XISFOptions +{ +public: + + bool storeFITSKeywords : 1; //!< Include FITS header keywords in output %XISF files. + bool ignoreFITSKeywords : 1; //!< Do not load FITS keywords from input %XISF files. + bool importFITSKeywords : 1; //!< Import FITS keywords as %XISF properties. + bool ignoreEmbeddedData : 1; //!< Do not load existing embedded data (such as ICC profiles for example). + bool ignoreProperties : 1; //!< Do not load existing %XISF properties. + bool autoMetadata : 1; //!< Automatically generate a number of reserved %XISF properties. + bool noWarnings : 1; //!< Suppress all warning and diagnostics messages. + bool warningsAreErrors : 1; //!< Treat warnings as fatal errors. + XISF::block_checksum checksumAlgorithm : 4; //!< The algorithm used for block checksum calculations. + XISF::block_compression compressionCodec : 4; //!< The codec used for compression of %XISF blocks. + uint8 compressionLevel : 7; //!< Codec-independent compression level: 0 = auto, 1 = fast, 100 = maximum compression. + uint8 verbosity : 3; //!< Verbosity level: 0 = quiet, > 0 = write console state messages. + bool fixNonFinite : 1; //!< Replace NaNs, infinities and negative zeros with lower bound values in floating point images (reading only). + uint16 blockAlignmentSize; //!< Block alignment size in bytes (0 = 1 = unaligned). + uint16 maxInlineBlockSize; //!< Maximum size in bytes of an inline/embedded block. + double outputLowerBound; //!< Lower bound for output floating point pixel samples (=0.0 by default). + double outputUpperBound; //!< Upper bound for output floating point pixel samples (=1.0 by default). + + /*! + * Constructs a default set of %XISF format-specific options. + */ + XISFOptions() + { + Reset(); + } + + /*! + * Copy constructor. + */ + XISFOptions( const XISFOptions& ) = default; + + /*! + * Copy-assignment operator. Returns a reference to this object. + */ + XISFOptions& operator =( const XISFOptions& ) = default; + + /*! + * Resets this object to a default set of format-specific options. + */ + void Reset() + { + storeFITSKeywords = XISF::DefaultStoreFITSKeywords; + ignoreFITSKeywords = XISF::DefaultIgnoreFITSKeywords; + importFITSKeywords = XISF::DefaultImportFITSKeywords; + ignoreEmbeddedData = XISF::DefaultIgnoreEmbeddedData; + ignoreProperties = XISF::DefaultIgnoreProperties; + autoMetadata = XISF::DefaultAutoMetadata; + noWarnings = XISF::DefaultNoWarnings; + warningsAreErrors = XISF::DefaultWarningsAreErrors; + checksumAlgorithm = XISF::DefaultChecksum; + compressionCodec = XISF::DefaultCompression; + compressionLevel = XISF::DefaultCompressionLevel; + verbosity = XISF::DefaultVerbosity; + fixNonFinite = XISF::DefaultFixNonFinite; + blockAlignmentSize = XISF::DefaultBlockAlignSize; + maxInlineBlockSize = XISF::DefaultMaxBlockInlineSize; + outputLowerBound = XISF::DefaultOutputLowerBound; + outputUpperBound = XISF::DefaultOutputUpperBound; + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \struct XISFFileSignature + * \brief %XISF monolithic file signature + * + * All %XISF version 1.0 monolithic files begin with the following sequence: + * + * XISF0100<header-length><reserved> + * + * where 'XISF0100' is the 'magic marker' identifying the format, and + * <header-length> is the size in bytes of the XML file header encoded as + * a 32-bit unsigned integer with little-endian byte order. <reserved> is + * a 32-bit integer reserved for future use; it must be zero. After the file + * signature sequence comes the %XML header and all attached blocks. + * + * \ingroup xisf_support + */ +struct PCL_CLASS XISFFileSignature +{ + uint8 magic[ 8 ] = { 'X', 'I', 'S', 'F', '0', '1', '0', '0' }; + uint32 headerLength = 0; // length in bytes of the XML file header + uint32 reserved = 0; // reserved - must be zero + + /*! + * Default constructor. Yields an invalid %XISF signature that cannot be + * used without explicit initialization. + */ + XISFFileSignature() = default; + + /*! + * Copy constructor. + */ + XISFFileSignature( const XISFFileSignature& ) = default; + + /*! + * Copy assignment operator. Returns a reference to this object. + */ + XISFFileSignature& operator =( const XISFFileSignature& ) = default; + + /*! + * Constructs a monolithic %XISF file signature initialized for the + * specified header \a length. + */ + XISFFileSignature( uint32 length ) + : headerLength( length ) + { + } + + /*! + * Validates this monolithic %XISF file signature. Throws an Error exception + * if it is not valid. + */ + void Validate() const; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::XISFMessageType + * \brief %XISF log message types + * + * + * + * + * + * + *
XISFMessageType::Informative A regular informative message.
XISFMessageType::Note A note or remark message.
XISFMessageType::Warning A warning message.
XISFMessageType::RecoverableError A recoverable error message.
+ * + * \ingroup xisf_support + * \sa XISFLogHandler + */ +namespace XISFMessageType +{ + enum value_type + { + Informative, + Note, + Warning, + RecoverableError + }; +} + +// ---------------------------------------------------------------------------- + +/*! + * \class XISFLogHandler + * \brief %XISF stream message logger + * + * %XISFLogHandler is a simple handler object which logs messages generated + * by the XISFReader and XISFWriter classes during %XISF file transactions. + * These messages can be informative, warnings, and recoverable error messages. + * + * Note that unrecoverable errors are not logged and hence not sent to this + * class (or derived); they are always thrown as Exception instances, which the + * caller must catch and manage appropriately. + * + * \ingroup xisf_support + * \sa XISFReader, XISFWriter + */ +class PCL_CLASS XISFLogHandler +{ +public: + + /*! + * Represents a log message type. Supported values are enumerated in the + * XISFMessageType namespace. + */ + typedef XISFMessageType::value_type message_type; + + /*! + * Default constructor. + */ + XISFLogHandler() = default; + + /*! + * Virtual destructor. + */ + virtual ~XISFLogHandler() + { + } + + /*! + * Initializes this log handler object. This function will be called by + * internal XISFReader and XISFWriter engines at the beginning of an %XISF + * file transaction. + * + * \param filePath Full path to the %XISF file about to be loaded or + * generated. + * + * \param writing Will be true at the beginning of a file generation + * process; false at the beginning of a file loading + * process. + * + * The default implementation does nothing. This virtual function can be + * reimplemented in a derived class requiring special initialization at the + * beginning of a file loading or generation process. + */ + virtual void Init( const String& filePath, bool writing ) + { + } + + /*! + * Handles a log message. This function will be called by internal + * XISFReader and XISFWriter engines at different points during %XISF file + * transactions. + * + * \param text The log text message. + * + * \param type The type of this log message. See the XISFMessageType + * namespace for possible values. + * + * The default implementation does nothing. This virtual function should be + * reimplemented in a derived class. Typically, the received \a text + * messages are sent directly to the platform console; for example, the + * standard %XISF format support module does just that. Other options are + * writing messages to text files, or sending them to other processes. + */ + virtual void Log( const String& text, message_type type ) + { + } + + /*! + * Closes this log handler object. This function will be called by internal + * XISFReader and XISFWriter engines at the end of an %XISF file + * transaction. + * + * The default implementation does nothing. This virtual function can be + * reimplemented in a derived class requiring special cleanup or + * initialization at the end of a file loading or generation process. + */ + virtual void Close() + { + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XISFReader + * \brief %XISF input file stream + * + * %XISFReader allows you to read properties, images and metadata serialized in + * monolithic %XISF units stored as local files. This class can be used without + * a running PixInsight core application to implement %XISF support in external + * applications. + * + * \ingroup xisf_support + * \sa XISFWriter + */ +class PCL_CLASS XISFReader +{ +public: + + /*! + * Constructs an %XISFReader object. The stream is created in a default + * closed state. + */ + XISFReader(); + + /*! + * Destroys an %XISFReader object. If the stream is open, the destructor + * calls the Close() member function before destroying this object. + */ + virtual ~XISFReader() noexcept( false ); + + /* + * Copy constructor. This constructor is disabled because %XISF streams are + * unique objects. + */ + XISFReader( const XISFReader& ) = delete; + + /* + * Copy assignment. This operator is disabled because %XISF streams are + * unique objects. + */ + XISFReader& operator =( const XISFReader& ) = delete; + + /*! + * Define a set of format-specific \a options. + */ + void SetOptions( const pcl::XISFOptions& options ); + + /*! + * Returns the current set of format-specific options. + */ + pcl::XISFOptions Options() const + { + return m_options; + } + + /*! + * Tell the reader which format hints have been specified, for inclusion as + * a reserved metadata property. + */ + void SetHints( const IsoString& ); + + /*! + * Associates a log \a handler with this %XISF input stream. + * + * The specified \a handler object must be allocated dynamically by the + * caller. It will be owned by this %XISFReader instance, which will destroy + * and deallocate it when appropriate. To force destruction of the + * associated log handler (if any), call this function with a null pointer + * as argument. + */ + void SetLogHandler( XISFLogHandler* handler ); + + /*! + * Returns true iff this stream is currently open for file read operations. + * The stream is open only after a successful call to Open(). + */ + bool IsOpen() const; + + /*! + * Opens an existing file for reading at the specified file \a path. + */ + void Open( const String& path ); + + /*! + * If this stream is open, closes the disk file and clears all internal data + * structures. If this stream is closed, calling this member function has no + * effect. + */ + void Close(); + + /*! + * Returns the full path of the file being accessed through this %XISFReader + * object, or an empty string if no file has been opened. + */ + String FilePath() const; + + /*! + * Returns the number of images available in this %XISF input stream. + */ + int NumberOfImages() const; + + /*! + * Sets the current image \a index in this input stream. \a index must be + * in the range [0,NumberOfImages()-1]. + */ + void SelectImage( int index ); + + /*! + * Returns the index of the currently selected image, or -1 if either no + * file has been opened, or if the file does not contain any images. + */ + int SelectedImageIndex() const; + + /*! + * Returns geometry and color space parameters for the current image in this + * input stream. + */ + pcl::ImageInfo ImageInfo() const; + + /*! + * Returns format-independent options corresponding to the current image in + * this input stream. + */ + pcl::ImageOptions ImageOptions() const; + + /*! + * Defines a new set of format-independent options for the current image in + * this input stream. + * + * Only options that modify the reading behavior of the stream will be taken + * into account; the rest will be ignored, irrespective of their values. + */ + void SetImageOptions( const pcl::ImageOptions& options ); + + /*! + * Returns the identifier of the current image in this input stream. + * + * If no identifier is available for the current image, if no file has been + * opened, or if the current file contains no images, this function returns + * an empty string. + */ + IsoString ImageId() const; + + /*! + * Extracts a list of FITS header keywords from the current image in this + * input stream, and returns the extracted keywords as a dynamic array. + * + * If no FITS keywords are available for the current image, if no file has + * been opened, or if the current file contains no images, this function + * returns an empty array. + */ + FITSKeywordArray ReadFITSKeywords(); + + /*! + * Extracts an ICC profile from the current image in this input stream, and + * returns the extracted ICC profile structure. + * + * If no ICC profile is available for the current image, if no file has been + * opened, or if the current file contains no images, this function returns + * an empty ICCProfile structure. + */ + ICCProfile ReadICCProfile(); + + /*! + * Extracts a thumbnail image from the current image in this input stream, + * and returns the extracted thumbnail as an 8-bit unsigned integer image. + * + * If no thumbnail is available for the current image, if no file has been + * opened, or if the current file contains no images, this function returns + * an empty image. + */ + UInt8Image ReadThumbnail(); + + /*! + * Extracts RGB working space parameters from the current image in this + * input stream, and returns them as a RGBColorSystem object. + * + * If no RGB working space has been defined for the current image, if no + * file has been opened, or if the current file contains no images, this + * function returns a duplicate of the sRGB color space, since this is the + * default %XISF color space. + */ + RGBColorSystem ReadRGBWorkingSpace(); + + /*! + * Extracts display function parameters from the current image in this input + * stream, and returns them as a pcl::DisplayFunction object. + * + * If no display function has been defined for the current image, if no file + * has been opened, or if the current file contains no images, this function + * returns an identity display function. + */ + DisplayFunction ReadDisplayFunction(); + + /*! + * Extracts a color filter array (CFA) description from the current image in + * this input stream, and returns it as a pcl::ColorFilterArray object. + * + * If no CFA has been defined for the current image, if no file has been + * opened, or if the current file contains no images, this function returns + * an invalid ColorFilterArray instance. + */ + ColorFilterArray ReadColorFilterArray(); + + /*! + * Returns a list of property identifiers and data types describing the set + * of properties associated with the current image in this %XISF unit. The + * returned list can be empty if no image is available, or if the current + * image has no properties. + */ + PropertyDescriptionArray ImagePropertyDescriptions() const; + + /*! + * Extracts a \a property from the current image with the specified + * \a identifier, and returns its value as a Variant object. + * + * If no property with the specified \a identifier is available for the + * current image, if no file has been opened, or if the current file + * contains no images, this function returns an invalid %Variant object. + */ + Variant ReadImageProperty( const IsoString& identifier ); + + /*! + * Returns an array with all properties extracted from the current image. + * + * If no property is available for the current image, if no file has been + * opened, or if the current file contains no images, this function returns + * an empty array. + */ + PropertyArray ReadImageProperties(); + + /*! + * Returns a list of property identifiers and data types describing the set + * of properties associated with the %XISF unit. The returned list can be + * empty if no file has been opened, or if the %XISF unit has no properties. + */ + PropertyDescriptionArray PropertyDescriptions() const; + + /*! + * Extracts a \a property associated with the %XISF unit with the specified + * \a identifier, and returns its value as a Variant object. + * + * If no property with the specified \a identifier is available for this + * %XISF unit, or if no file has been opened, this function returns an + * invalid %Variant object. + */ + Variant ReadProperty( const IsoString& identifier ); + + /*! + * Returns an array with all properties associated with the %XISF unit. + * + * If no property is available for the %XISF unit, or if no file has been + * opened, this function returns an empty array. + */ + PropertyArray ReadProperties(); + + /*! + * Reads a 32-bit floating point image from this input stream. + */ + void ReadImage( FImage& image ); + + /*! + * Reads a 64-bit floating point image from this input stream. + */ + void ReadImage( DImage& image ); + + /*! + * Reads a 32-bit floating point complex image from this input stream. + */ + void ReadImage( ComplexImage& image ); + + /*! + * Reads a 64-bit floating point complex image from this input stream. + */ + void ReadImage( DComplexImage& image ); + + /*! + * Reads an 8-bit unsigned integer image from this input stream. + */ + void ReadImage( UInt8Image& image ); + + /*! + * Reads a 16-bit unsigned integer image from this input stream. + */ + void ReadImage( UInt16Image& image ); + + /*! + * Reads a 32-bit unsigned integer image from this input stream. + */ + void ReadImage( UInt32Image& image ); + + /*! + * Returns true iff this stream supports incremental read operations. + * + * Incremental reads are not supported for compressed images. The reader + * will be forced to load and uncompresses a compressed image transparently + * upon the first call to a ReadSamples() member function, and the entire + * pixel data of the image will be stored in a temporary memory buffer. + * Pixel samples returned by succesive calls to ReadSamples() will be copied + * from this temporary buffer. Note that this is just a convenience feature + * that provides none of the benefits of incremental stream I/O operations. + */ + bool ImplementsIncrementalRead() const; + + /*! + * Incremental random access read of 32-bit floating point pixel samples. + * + * \param[out] buffer Address of the destination pixel sample buffer. + * \param startRow First pixel row to read. + * \param rowCount Number of pixel rows to read. + * \param channel Channel index to read. + */ + void ReadSamples( FImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 64-bit floating point pixel samples. + * + * This is an overloaded member function for the DImage type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 32-bit complex pixel samples. + * + * This is an overloaded member function for the ComplexImage type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( ComplexImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 64-bit complex pixel samples. + * + * This is an overloaded member function for the DComplexImage type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( DComplexImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 8-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt8Image type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 16-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt16Image type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental random access read of 32-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt32Image type; see + * ReadSamples( Image::sample*, int, int, int ) for a full description. + */ + void ReadSamples( UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Extract and parse the %XML header document of an existing monolithic + * %XISF file at the specified \a path, and return it as a dynamically + * allocated instance of XMLDocument. + * + * Ownership of the returned object is transferred to the caller, who is + * responsible for destroying it when appropriate. + * + * This function will throw an Error exception if either the file is not a + * monolithic %XISF unit, or the header is not a well-formed %XML document. + * The header is not verified for validity or correctness as per the %XISF + * format specification; only well-formedness of the XML document is + * checked. + */ + static XMLDocument* ExtractHeader( const String& path, XMLParserOptions options = XMLParserOptions() ); + +private: + + AutoPointer m_engine; + AutoPointer m_logHandler; + XISFOptions m_options; + IsoString m_hints; + + void CheckOpenStream( const char* ) const; + void CheckClosedStream( const char* ) const; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XISFWriter + * \brief %XISF output file stream + * + * %XISFWriter allows you to write properties, images and metadata serialized + * in monolithic %XISF units stored as local files. This class can be used + * without a running PixInsight core application to implement %XISF support in + * external applications. + * + * \ingroup xisf_support + * \sa XISFReader + */ +class PCL_CLASS XISFWriter +{ +public: + + /*! + * Constructs an %XISFWriter object. The stream is created in a default + * closed state. + */ + XISFWriter(); + + /*! + * Destroys an %XISFWriter object. If the stream is open, the destructor + * calls the Close() member function before destroying the object. + */ + virtual ~XISFWriter() noexcept( false ); + + /* + * Copy constructor. This constructor is disabled because %XISF streams are + * unique objects. + */ + XISFWriter( const XISFWriter& ) = delete; + + /* + * Copy assignment. This operator is disabled because %XISF streams are + * unique objects. + */ + XISFWriter& operator =( const XISFWriter& ) = delete; + + /*! + * Define a set of format-specific \a options. + */ + void SetOptions( const pcl::XISFOptions& options ); + + /*! + * Returns the current set of format-specific options. + */ + pcl::XISFOptions Options() const + { + return m_options; + } + + /*! + * Tell the writer which format hints have been specified, for inclusion as + * a reserved metadata property. + */ + void SetHints( const IsoString& ); + + /*! + * Associates a log \a handler with this %XISF output stream. + * + * The specified \a handler object must be allocated dynamically by the + * caller. It will be owned by this %XISFReader instance, which will destroy + * and deallocate it when appropriate. To force destruction of the + * associated log handler (if any), call this function with a null pointer + * as argument. + */ + void SetLogHandler( XISFLogHandler* handler ); + + /*! + * Sets the value of the %XISF:CreatorApplication reserved metadata property + * to be included in newly created %XISF units. + * + * The %XISF:CreatorApplication property is mandatory. If this + * implementation is being used in an installed PixInsight module (such as + * the standard %XISF format support module for example), this property will + * be generated automatically by retrieving version information from the + * running PixInsight core application, and the value set with this function + * will be ignored. If this implementation is used in an external + * application, calling this function with the appropriate application name + * (including version information) is \e mandatory. See the %XISF + * specification for more information on reserved metadata properties. + */ + void SetCreatorApplication( const String& appName ); + + /*! + * Sets the value of the %XISF:CreatorModule reserved metadata property to + * be included in newly created %XISF units. + * + * The %XISF:CreatorModule property is optional. If this implementation is + * being used in an installed PixInsight module (such as the standard %XISF + * format support module for example), this property will be generated + * automatically by retrieving the name and version of the running module, + * and the value set with this function will be ignored. If this + * implementation is being used in an external application, the value set by + * calling this function will be used. If no CreatorModule is defined, the + * corresponding metadata property will not be generated. See the %XISF + * specification for more information on reserved metadata properties. + */ + void SetCreatorModule( const String& modName ); + + /*! + * Returns true iff this stream is currently open for file write operations. + * The stream is open only after a successful call to Create(). + */ + bool IsOpen() const; + + /*! + * Creates a new file for writing at the specified \a path, and prepares to + * write \a count images and their embedded data. + */ + void Create( const String& path, int count ); + + /*! + * If this stream is open, flushes all pending file write operations, closes + * the disk file, and clears all internal data structures. If this stream is + * closed, calling this member function has no effect. + */ + void Close(); + + /*! + * Returns the full path of the output file being accessed through this + * %XISFWriter object, or an empty string if no file has been created. + */ + String FilePath() const; + + /*! + * Defines a new set of format-independent options for the next image + * written by this output stream. + * + * Only options that modify the writing behavior of the stream will be taken + * into account; the rest will be ignored, irrespective of their values. + */ + void SetImageOptions( const ImageOptions& options ); + + /*! + * Sets the identifier of the current image (that is, of the next image that + * will be written) in this input stream. + */ + void SetImageId( const IsoString& id ); + + /*! + * Embeds a set of %FITS header \a keywords in the current image of this + * output stream. + */ + void WriteFITSKeywords( const FITSKeywordArray& keywords ); + + /*! + * Returns the list of %FITS header keywords embedded in the current image. + * This is necessary because the PixInsight core application has an option + * to reload the list of keywords actually embedded after writing a new + * image. Client applications without this requirement can safely ignore + * this member function. + */ + const FITSKeywordArray& FITSKeywords() const; + + /*! + * Embeds an ICC \a profile in the current image of this output stream. + */ + void WriteICCProfile( const ICCProfile& profile ); + + /*! + * Embeds an 8-bit \a thumbnail image in the current image of this output + * stream. + */ + void WriteThumbnail( const UInt8Image& thumbnail ); + + /*! + * Defines RGB working space parameters for the current image of this output + * stream. + */ + void WriteRGBWorkingSpace( const RGBColorSystem& rgbws ); + + /*! + * Defines display function parameters for the current image of this output + * stream. + */ + void WriteDisplayFunction( const DisplayFunction& df ); + + /*! + * Embeds a color filter array (CFA) description for the current image of + * this output stream. + */ + void WriteColorFilterArray( const ColorFilterArray& cfa ); + + /*! + * Associates a property with the specified \a identifier and \a value with + * the current image in this output stream. + */ + void WriteImageProperty( const IsoString& identifier, const Variant& value ); + + /*! + * Associates a set of \a properties with the current image in this output + * stream. + */ + void WriteImageProperties( const PropertyArray& properties ); + + /*! + * Removes a property with the specified \a identifier from the list of + * properties associated with the current image. If no property with the + * specified \a identifier has been defined for the current image, this + * member function takes no action. + */ + void RemoveImageProperty( const IsoString& identifier ); + + /*! + * Associates a property with the specified \a identifier and \a value with + * the %XISF unit being generated by this output stream. + */ + void WriteProperty( const IsoString& identifier, const Variant& value ); + + /*! + * Associates a set of \a properties with the %XISF unit being generated by + * this output stream. + */ + void WriteProperties( const PropertyArray& properties ); + + /*! + * Removes a property with the specified \a identifier from the list of + * properties associated with the %XISF unit. If no property with the + * specified \a identifier has been defined previously, this member function + * takes no action. + */ + void RemoveProperty( const IsoString& identifier ); + + /*! + * Writes a 32-bit floating point image to this output stream. + */ + void WriteImage( const Image& image ); + + /*! + * Writes a 64-bit floating point image to this output stream. + */ + void WriteImage( const DImage& image ); + + /*! + * Writes a 32-bit floating point complex image to this output stream. + */ + void WriteImage( const ComplexImage& image ); + + /*! + * Writes a 64-bit floating point complex image to this output stream. + */ + void WriteImage( const DComplexImage& image ); + + /*! + * Writes an 8-bit unsigned integer image to this output stream. + */ + void WriteImage( const UInt8Image& image ); + + /*! + * Writes a 16-bit unsigned integer image to this output stream. + */ + void WriteImage( const UInt16Image& image ); + + /*! + * Writes a 32-bit unsigned integer image to this output stream. + */ + void WriteImage( const UInt32Image& image ); + + /*! + * Writes the specified \a image to this output stream. + */ + void WriteImage( const ImageVariant& image ); + + /*! + * Creates a new image with the specified geometry and color space, and + * prepare for sequential/random write access. + * + * The data type and other image parameters are defined by the current set + * of format-independent options (see SetImageOptions()). + */ + void CreateImage( const ImageInfo& info ); + + /*! + * Incremental/random write of 32-bit floating point pixel samples. + * + * \param buffer Address of the source pixel sample buffer. + * \param startRow First pixel row to write. + * \param rowCount Number of pixel rows to write. + * \param channel Channel index to write. + */ + void WriteSamples( const FImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 64-bit floating point pixel samples. + * + * This is an overloaded member function for the DImage type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const DImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 32-bit complex pixel samples. + * + * This is an overloaded member function for the ComplexImage type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const ComplexImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 64-bit complex pixel samples. + * + * This is an overloaded member function for the DComplexImage type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const DComplexImage::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 8-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt8Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const UInt8Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 16-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt16Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const UInt16Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Incremental/random write of 32-bit unsigned integer pixel samples. + * + * This is an overloaded member function for the UInt32Image type; see + * WriteSamples( const Image::sample*, int, int, int ) for a full + * description. + */ + void WriteSamples( const UInt32Image::sample* buffer, int startRow, int rowCount, int channel ); + + /*! + * Complete the image created by a previous call to CreateImage() and + * generate it in the output stream. + */ + void CloseImage(); + +private: + + AutoPointer m_engine; + AutoPointer m_logHandler; + XISFOptions m_options; + IsoString m_hints; + String m_creatorApplication; + String m_creatorModule; + + void CheckOpenStream( const char* ) const; + void CheckClosedStream( const char* ) const; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_XISF_h + +// ---------------------------------------------------------------------------- +// EOF pcl/XISF.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/XML.h b/3rdparty/include/pcl/XML.h new file mode 100644 index 0000000..b353873 --- /dev/null +++ b/3rdparty/include/pcl/XML.h @@ -0,0 +1,3038 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/XML.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_XML_h +#define __PCL_XML_h + +/// \file pcl/XML.h + +#include + +#include +#include +#include + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \defgroup xml_parsing_and_generation XML Document Parsing and Generation + */ + +// ---------------------------------------------------------------------------- + +class PCL_CLASS XMLDocument; +class PCL_CLASS XMLElement; + +// ---------------------------------------------------------------------------- + +/*! + * \class XML + * \brief Utility functions and data for %XML document parsing and generation + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XML +{ +public: + + /*! + * Default constructor. This constructor is disabled because %XML is not an + * instantiable class. + */ + XML() = delete; + + /*! + * Copy constructor. This constructor is disabled because %XML is not an + * instantiable class. + */ + XML( const XML& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %XML is not an + * instantiable class. + */ + XML& operator =( const XML& ) = delete; + + /*! + * Destructor. This destructor is disabled because %XML is not an + * instantiable class. + */ + ~XML() = delete; + + /*! + * Returns true iff the specified character \a c is either a white space + * (\#x20) or a tabulator (#9) character. + */ + template + static bool IsWhiteSpaceChar( T c ) + { + return c == 0x20 || c == 9; + } + + /*! + * Returns true iff the specified character \a c is either a line feed + * (\#x0A) or a carriage return (#0D) control character. + */ + template + static bool IsLineBreakChar( T c ) + { + return c == 0x0A || c == 0x0D; + } + + /*! + * Returns true iff the specified character \a c is an %XML space character: + * + * https://www.w3.org/TR/xml11/#NT-S + */ + template + static bool IsSpaceChar( T c ) + { + return IsWhiteSpaceChar( c ) || IsLineBreakChar( c ); + } + + /*! + * Returns true iff the specified character \a c is an %XML NameStartChar: + * + * https://www.w3.org/TR/xml11/#NT-NameStartChar + */ + template + static bool IsNameStartChar( T c ) + { + return c >= T( 'a' ) && c <= T( 'z' ) + || c >= T( 'A' ) && c <= T( 'Z' ) + || c == T( '_' ) + || c == T( ':' ) + || c >= 0xC0 && c <= 0xD6 + || c >= 0xD8 && c <= 0xF6 + || c >= 0xF8 && c <= 0x2FF + || c >= 0x370 && c <= 0x37D + || c >= 0x37F && c <= 0x1FFF + || c >= 0x200C && c <= 0x200D + || c >= 0x2070 && c <= 0x218F + || c >= 0x2C00 && c <= 0x2FEF + || c >= 0x3001 && c <= 0xD7FF + || c >= 0xF900 && c <= 0xFDCF + || c >= 0xFDF0 && c <= 0xFFFD + || uint32( c ) >= 0x10000 && uint32( c ) <= 0xEFFFF; + } + + /*! + * Returns true iff the specified character \a c is an %XML NameChar: + * + * https://www.w3.org/TR/xml11/#NT-NameChar + */ + template + static bool IsNameChar( T c ) + { + return IsNameStartChar( c ) + || c >= T( '0' ) && c <= T( '9' ) + || c == T( '-' ) + || c == T( '.' ) + || c == 0xB7 + || c >= 0x0300 && c <= 0x036F + || c >= 0x203F && c <= 0x2040; + } + + /*! + * Returns true iff the specified character \a c is an %XML RestrictedChar: + * + * https://www.w3.org/TR/xml11/#NT-RestrictedChar + */ + template + static bool IsRestrictedChar( T c ) + { + return c >= 0x00 && c <= 0x08 + || c >= 0x0B && c <= 0x0C + || c >= 0x0E && c <= 0x1F + || c >= 0x7F && c <= 0x84 + || c >= 0x86 && c <= 0x9F; + } + + /*! + * Returns true iff the specified \a name is a valid %XML qualified element + * or attribute name: + * + * https://www.w3.org/TR/xml-names/#ns-qualnames + */ + static bool IsValidName( const String& name ) + { + if ( !name.IsEmpty() ) + if ( IsNameStartChar( *name ) ) + for ( String::const_iterator i = name.Begin(); ; ) + { + if ( ++i == name.End() ) + return true; + if ( !IsNameChar( *i ) ) + break; + } + return false; + } + + /*! + * Returns a copy of the text fragment defined by the range [i,j) of string + * iterators with all leading and trailing space characters removed. + */ + static String TrimmedSpaces( String::const_iterator i, String::const_iterator j ); + + /*! + * Returns a copy of the specified \a text with all leading and trailing + * space characters removed. + */ + static String TrimmedSpaces( const String& text ); + + /*! + * Returns a copy of the text fragment defined by the range [i,j) of string + * iterators with all sequences of one or more space characters replaced + * with single white space characters (\#x20). + */ + static String CollapsedSpaces( String::const_iterator i, String::const_iterator j ); + + /*! + * Returns a copy of the specified \a text with all sequences of one or more + * space characters replaced with single white space characters (\#x20). + */ + static String CollapsedSpaces( const String& text ); + + /*! + * Returns a copy of the text fragment defined by the range [i,j) of string + * iterators with all %XML references replaced by their corresponding UTF-16 + * characters. + * + * Both entity and character references are decoded by this function. For + * entity references, the entire set of %XML reference names is supported: + * + * http://www.w3.org/TR/xml-entity-names/ + * + * Character references are interpreted as defined in the %XML + * specification: + * + * https://www.w3.org/TR/xml11/#NT-CharRef + */ + static String DecodedText( String::const_iterator i, String::const_iterator j ); + + /*! + * Returns a copy of the specified \a text with all %XML references replaced + * by their corresponding UTF-16 characters. + * + * See DecodedText( String::const_iterator, String::const_iterator ) for a + * detailed description. + */ + static String DecodedText( const String& text ); + + /*! + * Returns a copy of the text fragment defined by the range [i,j) of string + * iterators with all occurences of '&', '<', '>' and '"' replaced with the + * entity references "amp", "lt", "gt" and "quot", respectively. If \a apos + * is true, single quotes will also be replaced with "apos" entities. + */ + static String EncodedText( String::const_iterator i, String::const_iterator j, bool apos = true ) + { + return EncodedText( String( i, j ), apos ); + } + + /*! + * Returns a copy of the specified \a text with all occurences of '&', '<', + * '>' and '"' replaced with the entity references "amp", "lt", "gt" and + * "quot", respectively. If \a apos is true, single quotes will also be + * replaced with "apos" entities. + */ + static String EncodedText( const String& text, bool apos = true ); + + /*! + * Returns the Unicode value (encoded as UTF-16) corresponding to an %XML + * reference defined by the range [i,j) of string iterators: + * + * https://www.w3.org/TR/xml11/#NT-Reference + * + * Both entity and character references are decoded by this function. For + * entity references, the entire set of %XML reference names is supported: + * + * http://www.w3.org/TR/xml-entity-names/ + * + * Character references are interpreted as defined in the %XML + * specification: + * + * https://www.w3.org/TR/xml11/#NT-CharRef + */ + static String ReferenceValue( String::const_iterator i, String::const_iterator j ); + + /*! + * Returns the Unicode value (encoded as UTF-16) corresponding to the + * specified %XML \a reference. + * + * See ReferenceValue( String::const_iterator, String::const_iterator ) for + * a detailed description. + */ + static String ReferenceValue( const String& reference ) + { + return ReferenceValue( reference.Begin(), reference.End() ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLComponent + * \brief Root base class of all %XML document components + * + * %XMLComponent supports the hierarchical structure of an %XML document by + * implementing the basic concept of parent element. + * + * \ingroup xml_parsing_and_generation + * \sa XMLNode + */ +class PCL_CLASS XMLComponent +{ +public: + + /*! + * Default constructor. Constructs a default %XMLComment object with no + * parent element. + */ + XMLComponent() = default; + + /*! + * Copy constructor. + */ + XMLComponent( const XMLComponent& ) = default; + + /*! + * Returns a pointer to the parent %XML element of this component, or + * \c nullptr if this object has no parent element. + */ + XMLElement* ParentElement() const + { + return m_parent; + } + + /*! + * Returns true iff this is a top-level component. Top-level document + * components have no parent elements. + */ + bool IsTopLevel() const + { + return m_parent == nullptr; + } + +private: + + XMLElement* m_parent = nullptr; + + friend class XMLElement; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \namespace pcl::XMLNodeType + * \brief %XML document node types + * + * + * + * + * + * + * + * + * + * + * + *
XMLNodeType::Undefined Undefined %XML node type.
XMLNodeType::ChildNode Signals a child %XML document node - for internal use only.
XMLNodeType::Unknown Represents an unsupported %XML node type.
XMLNodeType::Element An %XML element.
XMLNodeType::Text A text block inside an element's contents.
XMLNodeType::CDATA A CDATA section.
XMLNodeType::ProcessingInstructions A processing instructions (PI) section.
XMLNodeType::PI A synonym to ProcessingInstructions.
XMLNodeType::Comment A comment block.
+ * + * \ingroup xml_parsing_and_generation + */ +namespace XMLNodeType +{ + enum mask_type + { + Undefined = 0x00000000, + ChildNode = 0x80000000, + Unknown = 0x10000000, + Element = 0x00000001, + Text = 0x00000002, + CDATA = 0x00000004, + ProcessingInstructions = 0x00000008, + Comment = 0x00000010 + }; + + /*! + * Returns the name of the specified %XML node \a type ("element", "text", + * "comment", etc). + */ + String AsString( mask_type type ); +} + +/*! + * \class pcl::XMLNodeTypes + * \brief A collection of %XML node types + * \ingroup xml_parsing_and_generation + */ +typedef Flags XMLNodeTypes; + +// ---------------------------------------------------------------------------- + +/*! + * \struct XMLNodeLocation + * \brief Source code location of a parsed %XML document node + * \ingroup xml_parsing_and_generation + */ +struct XMLNodeLocation +{ + /*! + * Zero-based text line number where a parsed node has been identified in + * an %XML document, or -1 if text location information is not available. + */ + int64 line = 0; + + /*! + * Zero-based text column number, counted from the starting character of a + * text line, where a parsed node has been identified in an %XML document. + * This member is -1 if text location information is not available. + * + * Note that the value stored in this field is actually a character index, + * not necessarily a valid text column number. It is an actual column number + * only if the corresponding line of text does not contain tabulator + * characters (\#x9). If there are tabulators, there is usually no one-to-one + * correspondence between characters and represented text columns. + */ + int64 column = 0; + + /*! + * Default constructor. Initializes the line and column members to -1, + * signaling an undefined source code location. + */ + XMLNodeLocation() = default; + + /*! + * Constructs an %XMLNodeLocation object with the specified zero-based text + * line and column numbers. + */ + XMLNodeLocation( int line_, int column_ ) + : line( line_ ) + , column( column_ ) + { + } + + /*! + * Copy constructor. + */ + XMLNodeLocation( const XMLNodeLocation& ) = default; + + /*! + * Returns a string representation of this %XMLNodeLocation object in the + * form " (line=n offset=m)", where n and m are, respectively, the one-based + * line number and zero-based text character offset transported by this + * object. This representation is suitable to be included directly in + * warning or error messages generated by parsers. + * + * The line number token won't be generated if the text line number is + * undefined (< 0) in this object. Similarly, the offset token won't be + * generated if the column member is < 0. If no location information is + * available, this member function returns an empty string. + */ + String ToString() const; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLNode + * \brief Abstract base class of all %XML document node classes + * + * %XML document nodes can be elements, text, CDATA sections, processing + * instructions, comments, and unknown special elements. This class extends the + * XMLComponent root base class to implement %XML document node classification + * and serialization. + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLNode : public XMLComponent +{ +public: + + /*! + * Represents the type of an %XML document node. Supported/valid node types + * are defined in the XMLNodeType namespace. + */ + typedef XMLNodeType::mask_type node_type; + + /*! + * Default constructor. Constructs a default %XMLNode object of the + * specified \a type, with no parent element and undefined source code + * location. + */ + XMLNode( node_type type ) + : m_type( type ) + { + } + + /*! + * Copy constructor. + * + * The newly constructed node will be an \e orphan object, that is, it will + * have no parent element even if the source object \a x is a child node. + * This reflects the fact that document nodes are unique objects. + */ + XMLNode( const XMLNode& x ) + : m_type( x.NodeType() ) + , m_location( x.m_location ) + { + } + + /*! + * Virtual destructor. + */ + virtual ~XMLNode() + { + } + + /*! + * Returns true iff this is a child node of an existing %XML element. + */ + bool IsChildNode() const + { + return m_type.IsFlagSet( XMLNodeType::ChildNode ); + } + + /*! + * Returns the type of this %XML document node. + */ + node_type NodeType() const + { + return static_cast( XMLNodeTypes::flag_type( m_type & unsigned( ~XMLNodeType::ChildNode ) ) ); + } + + /*! + * Returns true iff this node is an %XML element. If this member function + * returns true, this node can be statically casted to XMLElement. + */ + bool IsElement() const + { + return NodeType() == XMLNodeType::Element; + } + + /*! + * Returns true iff this node represents an %XML text block. If this member + * function returns true, this node can be statically casted to XMLText. + */ + bool IsText() const + { + return NodeType() == XMLNodeType::Text; + } + + /*! + * Returns true iff this node represents an %XML comment. If this member + * function returns true, this node can be statically casted to XMLComment. + */ + bool IsComment() const + { + return NodeType() == XMLNodeType::Comment; + } + + /*! + * Returns a reference to the (immutable) source code location of this node. + */ + const XMLNodeLocation& Location() const + { + return m_location; + } + + /*! + * Serializes this document node as an %XML fragment encoded in UTF-8. + * + * \param text Reference to an 8-bit string to which the UTF-8 + * encoded serialization of this node must be appended. + * + * \param autoFormat True if line break characters (\#x0A) and + * indentation strings must be used to improve readability of + * the generated %XML code. False if no superfluous white space + * should be generated. + * + * \param indentChar A character used for indentation of generated text + * lines, when \a autoFormat is true. This parameter should be + * either a white space (' ' or \#x20) or a tabulator ('\\t' or + * \#x09) character. + * + * \param indentSize Number of \a indentChar characters used for each + * indentation level, when \a autoFormat is true. + * + * \param level Recursion level. A value greater than zero denotes + * that this function is being called from a parent %XML + * element. The recursion level determines the number of + * \a indentChar characters prepended to each text line + * for indentation, when \a autoFormat is true. + */ + virtual void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const = 0; + + /*! + * Returns true iff a new line character (\#x0A) can be inserted before + * serializing this node after the specified \a previous node. + */ + virtual bool NLAfter( const XMLNode& previous ) const; + +private: + + XMLNodeTypes m_type; + XMLNodeLocation m_location; + + friend class XMLDocument; + friend class XMLElement; +}; + +/*! + * \class pcl::XMLNodeList + * \brief Dynamic list of %XML node objects + * + * %XMLNodeList is used as the internal implementation of element child node + * lists and document node lists. In current PCL versions, %XMLNodeList is a + * template instantiation of ReferenceArray<> for the XMLNode class. + * + * \ingroup xml_parsing_and_generation + */ +typedef ReferenceArray XMLNodeList; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLParseError + * \brief %XML parsing error with automatic text location information + * generation + * + * The %XMLParseError is useful to generate warning and error messages during + * document parsing tasks, with automatic generation of text location + * information (when available) and a normalized representation of error + * messages. + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLParseError : public Error +{ +public: + + /*! + * Constructs an %XMLParseError object with a reference to an XMLNode + * instance. + * + * \param node Reference to the XMLNode object that has caused the + * exception. + * + * \param whileDoing Identifies the parsing action that was taking place. + * For example: "Parsing Metadata child Image element". + * + * \param whatHappened Describes the error that has been detected. For + * example: "Missing id attribute". + * + * This constructor inserts node location information, if available, and + * joins the strings appropriately to build an error message. + */ + XMLParseError( const XMLNode& node, const String& whileDoing, const String& whatHappened ) + : Error( whileDoing + node.Location().ToString() + ": " + whatHappened ) + { + } + + /*! + * Constructs an %XMLParseError object with a reference to an + * XMLNodeLocation instance. + * + * \param where Reference to an XMLNodeLocation object to retrieve + * text location information. + * + * \param whileDoing Identifies the parsing action that was taking place. + * For example: "Parsing Metadata child Image element". + * + * \param whatHappened Describes the error that has been detected. For + * example: "Missing id attribute". + * + * This constructor inserts node location information, if available, and + * joins the strings appropriately to build an error message. + */ + XMLParseError( const XMLNodeLocation& where, const String& whileDoing, const String& whatHappened ) + : Error( whileDoing + where.ToString() + ": " + whatHappened ) + { + } + + /*! + * Copy constructor. + */ + XMLParseError( const XMLParseError& ) = default; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLAttribute + * \brief %XML element attribute + * + * The %XMLAttribute class represents an element attribute, as defined by the + * Attribute construct: + * + * https://www.w3.org/TR/xml11/#NT-Attribute + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLAttribute : public XMLComponent +{ +public: + + /*! + * Constructs an empty %XML attribute. An empty attribute is ignored for + * inclusion in element attribute lists. + */ + XMLAttribute() = default; + + /*! + * Constructs a new %XMLAttribute object with the specified qualified + * \a name and \a value. + * + * The specified \a name should be a valid %XML qualified name, as defined + * by the W3C recommendation: + * + * https://www.w3.org/TR/xml-names/#ns-qualnames + * + * However, the \a name is not checked for validity by this constructor, for + * performance reasons. Attribute and element names are verified during the + * document parsing and generation tasks. + */ + XMLAttribute( const String& name, const String& value = String() ) + : m_name( name ) + , m_value( value ) + { + } + + /*! + * Copy constructor. + */ + XMLAttribute( const XMLAttribute& ) = default; + + /*! + * Returns a reference to the (immutable) qualified name of this attribute. + */ + const String& Name() const + { + return m_name; + } + + /*! + * Returns a reference to the (immutable) value of this element attribute. + */ + const String& Value() const + { + return m_value; + } + + /*! + * Sets a new value for this %XML element attribute. + */ + void SetValue( const String& text ) + { + m_value = text; + } + + /*! + * Returns an encoded version of the attribute value. All characters that + * cannot legally occur in an %XML attribute value are replaced by their + * corresponding entity references. + */ + String EncodedValue() const + { + return XML::EncodedText( m_value, false/*apos*/ ); + } + + /*! + * Equality operator. + * + * Two %XML element attributes are considered equal if their qualified names + * are identical. Note that this restricts valid attribute comparisons to a + * particular %XML document. + */ + bool operator ==( const XMLAttribute& x ) const + { + return m_name == x.m_name; + } + + /*! + * Less-than relational operator. + * + * To compare %XML element attributes, only their qualified names are taken + * into account. Note that this restricts valid attribute comparisons to a + * particular %XML document. + */ + bool operator <( const XMLAttribute& x ) const + { + return m_name < x.m_name; + } + +private: + + String m_name; + String m_value; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLAttributeList + * \brief Dynamic list of %XML element attributes + * + * %XMLAttributeList represents a sequence of %XML element attributes in a + * start-tag, as defined in the W3C recommendation: + * + * https://www.w3.org/TR/xml11/#sec-starttags + * + * %XMLAttributeList is internally implemented as a dynamic array of + * XMLAttribute objects. + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLAttributeList +{ +public: + + /*! + * Represents the dynamic container class used internally to implement an + * %XML element attribute list. + */ + typedef Array list_implementation; + + /*! + * Represents a mutable %XML element attribute list iterator. + */ + typedef list_implementation::iterator iterator; + + /*! + * Represents an immutable %XML element attribute list iterator. + */ + typedef list_implementation::const_iterator const_iterator; + + /*! + * Constructs a new %XMLAttributeList object by parsing the specified + * \a text string. + * + * The specified \a text must be a sequence of zero or more Attribute %XML + * definitions pertaining to a start-tag: + * + * https://www.w3.org/TR/xml11/#NT-STag + * + * See the Parse() member function for a more detailed description. + */ + XMLAttributeList( const String& text ) + { + Parse( text ); + } + + /*! + * Default constructor. Constructs an empty %XML attribute list. + */ + XMLAttributeList() = default; + + /*! + * Copy constructor. + */ + XMLAttributeList( const XMLAttributeList& ) = default; + + /*! + * Returns the number of element attributes in this list. + */ + int Length() const + { + return int( m_list.Length() ); + } + + /*! + * Returns true iff this attribute list is empty. + */ + bool IsEmpty() const + { + return m_list.IsEmpty(); + } + + /*! + * Returns a reference to the immutable element attribute at the specified + * zero-based index \a i. No bounds checking is performed: if the specified + * index is invalid this function invokes undefined behavior. + */ + const XMLAttribute& operator []( int i ) const + { + return m_list[i]; + } + + /*! + * Returns an immutable iterator located at the beginning of this element + * attribute list. + */ + const_iterator Begin() const + { + return m_list.Begin(); + } + + /*! + * Returns an immutable iterator located at the end of this element + * attribute list. + */ + const_iterator End() const + { + return m_list.End(); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Returns true iff this list contains an element attribute with the + * specified qualified \a name. + */ + bool HasAttribute( const String& name ) const + { + return m_list.Contains( name ); + } + + /*! + * Returns the value of the element attribute with the specified qualified + * \a name, or an empty string if this list does not contain such an element + * attribute. + */ + String AttributeValue( const String& name ) const + { + const_iterator a = m_list.Search( name ); + return (a != m_list.End()) ? a->Value() : String(); + } + + /*! + * Causes this list to contain an %XML element attribute with the specified + * qualified \a name and \a value. + * + * If an attribute with the same qualified \a name already exists in this + * list, then its value will be changed. Otherwise, a new attribute will be + * appended to this list. + * + * This member function ensures that no %XML element can have two or more + * attributes with the same qualified name. This constraint is part of the + * %XML specification: + * + * https://www.w3.org/TR/xml11/#sec-starttags + * https://www.w3.org/TR/xml-names/#scoping-defaulting + */ + void SetAttribute( const String& name, const String& value ) + { + if ( !name.IsEmpty() ) + { + iterator a = m_list.Search( name ); + if ( a == m_list.End() ) + m_list.Add( XMLAttribute( name, value ) ); + else + a->SetValue( value ); + } + } + + /*! + * Causes this list to contain the specified %XML element \a attribute. + * + * See SetAttribute( const String&, const String& ) for more information. + */ + void SetAttribute( const XMLAttribute& attribute ) + { + if ( !attribute.Name().IsEmpty() ) + { + iterator a = m_list.Search( attribute ); + if ( a == m_list.End() ) + m_list.Add( attribute ); + else + *a = attribute; + } + } + + /*! + * Insertion operator. Returns a reference to this object. + * + * This operator is equivalent to SetAttribute( const XMLAttribute& ). + */ + XMLAttributeList& operator <<( const XMLAttribute& attribute ) + { + SetAttribute( attribute ); + return *this; + } + + /*! + * Causes this list to contain the specified \a list of %XML element + * attributes. + * + * For each attribute in the specified \a list, if an attribute with the + * same qualified \a name already exists in this list, then its value will + * be changed. Otherwise, a new attribute will be appended to this list. + * + * This member function ensures that no %XML element can have two or more + * attributes with the same qualified name. This constraint is part of the + * %XML specification: + * + * https://www.w3.org/TR/xml11/#sec-starttags + * https://www.w3.org/TR/xml-names/#scoping-defaulting + */ + void SetAttributes( const XMLAttributeList& list ) + { + for ( auto a : list ) + SetAttribute( a ); + } + + /*! + * Insertion operator. Returns a reference to this object. + * + * This operator is equivalent to SetAttributes( const XMLAttributeList& ). + */ + XMLAttributeList& operator <<( const XMLAttributeList& list ) + { + SetAttributes( list ); + return *this; + } + + /*! + * Removes the element attribute with the specified qualified \a name, if it + * exists in this list. If no attribute with the specified \a name exists, + * this member function has no effect. + */ + void RemoveAttribute( const String& name ) + { + iterator a = m_list.Search( name ); + if ( a != m_list.End() ) + m_list.Remove( a ); + } + + /*! + * Removes all element attributes in this list, yielding an empty element + * attribute list. + */ + void Clear() + { + m_list.Clear(); + } + + /*! + * Sorts the element attributes in this list in ascending order by comparing + * their qualified names. + */ + void Sort() + { + m_list.Sort(); + } + + /*! + * Parses the specified \a text, encoded as UTF-16, to generate a new list + * of %XML element attributes. + * + * The specified \a text must be a sequence of zero or more Attribute %XML + * definitions pertaining to a start-tag, as described in the W3C + * recommendation: + * + * https://www.w3.org/TR/xml11/#NT-STag + * + * Attribute value normalization is applied to each parsed attribute: + * + * https://www.w3.org/TR/xml11/#AVNormalize + * + * In attribute values, all entity and character references are decoded. See + * the XML::DecodedText() static function for more information on reference + * decoding. Normalization also implies space trimming and compression: all + * leading and trailing space characters are removed, and all sequences of + * one or more space characters are replaced by single white space + * characters (\#x20). + */ + void Parse( const String& text ); + + /*! + * Performs the %XML serialization of this element attribute list and + * appends it to the specified \a text string, encoded in UTF-8. + * + * The generated serialization is a sequence of zero or more Attribute %XML + * definitions pertaining to a start-tag, as described in the W3C + * recommendation: + * + * https://www.w3.org/TR/xml11/#NT-STag + */ + void Serialize( IsoString& text ) const; + +private: + + list_implementation m_list; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLElement + * \brief %XML element + * + * The %XMLElement class represents an %XML document element: + * + * https://www.w3.org/TR/xml11/#dt-element + * + * Elements are the main data holders in the logical design of %XML, following + * a hierarchical tree structure. + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLElement : public XMLNode +{ +public: + + /*! + * Represents a mutable child node list iterator. + */ + typedef XMLNodeList::iterator iterator; + + /*! + * Represents an immutable child node list iterator. + */ + typedef XMLNodeList::const_iterator const_iterator; + + /*! + * A list of child %XML elements. Implemented as a template instantiation of + * ReferenceArray<> for the XMLElement class. + */ + typedef ReferenceArray child_element_list; + + /*! + * Default constructor. Constructs an uninitialized %XMLElement structure. + */ + XMLElement() + : XMLNode( XMLNodeType::Element ) + { + } + + /*! + * Constructs an empty %XMLElement object with the specified qualified + * \a name and \a attributes. + */ + XMLElement( const String& name, const XMLAttributeList& attributes = XMLAttributeList() ) + : XMLNode( XMLNodeType::Element ) + , m_name( name ) + , m_attributes( attributes ) + { + } + + /*! + * Constructs an empty %XMLElement object with the specified qualified + * \a name and \a attributes, as a child node of the specified \a parent + * element. + */ + XMLElement( XMLElement& parent, const String& name, const XMLAttributeList& attributes = XMLAttributeList() ) + : XMLNode( XMLNodeType::Element ) + , m_name( name ) + , m_attributes( attributes ) + { + parent.AddChildNode( this ); + } + + /*! + * Copy constructor. This constructor is disabled because %XMLElement + * represents unique objects. + */ + XMLElement( const XMLElement& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %XMLElement represents + * unique objects. + */ + XMLElement& operator =( const XMLElement& ) = delete; + + /*! + * Virtual destructor. If this element contains child nodes, all of them + * will be destroyed recursively. + */ + virtual ~XMLElement() + { + DestroyChildNodes(); + } + + /*! + * Returns true iff this is a root %XML element. A root %XML element has no + * parent element. + * + * Note that this member function can return true in two different + * situations: when the element has been generated during a document parsing + * process (in which case this is an actual document root element), and if + * this object has not been initialized yet (because it has been newly + * constructed and still has not been associated with an %XML document). + */ + bool IsRootElement() const + { + return ParentElement() == nullptr; + } + + /*! + * Returns a reference to the (immutable) qualified element name. + */ + const String& Name() const + { + return m_name; + } + + /*! + * Returns a copy of the list of %XML element attributes. + */ + XMLAttributeList Attributes() const + { + return m_attributes; + } + + /*! + * Returns true iff this element has one or more attributes defined. + */ + bool HasAttributes() const + { + return !m_attributes.IsEmpty(); + } + + /*! + * Returns true iff this element has an attribute with the specified + * qualified \a name. + */ + bool HasAttribute( const String& name ) const + { + return m_attributes.HasAttribute( name ); + } + + /*! + * Returns the value of the attribute with the specified qualified \a name + * in this element, or an empty string if this element has no such + * attribute. + */ + String AttributeValue( const String& name ) const + { + return m_attributes.AttributeValue( name ); + } + + /*! + * Causes this %XML element to contain an attribute with the specified + * qualified \a name and \a value. + * + * If an attribute with the same qualified \a name already exists in this + * element, then its value will be changed. Otherwise, a new attribute will + * be created in this element. + * + * This member function ensures that no %XML element can have two or more + * attributes with the same qualified name. This constraint is part of the + * %XML specification: + * + * https://www.w3.org/TR/xml11/#sec-starttags + * https://www.w3.org/TR/xml-names/#scoping-defaulting + */ + void SetAttribute( const String& name, const String& value ) + { + XMLAttribute a( name, value ); + a.m_parent = this; + m_attributes.SetAttribute( a ); + } + + /*! + * Causes this %XML element to contain the specified \a attribute. + * + * See SetAttribute( const String&, const String& ) for more information. + */ + void SetAttribute( const XMLAttribute& attribute ) + { + XMLAttribute a( attribute ); + a.m_parent = this; + m_attributes.SetAttribute( a ); + } + + /*! + * Insertion operator. Returns a reference to this object. + * + * This operator is equivalent to SetAttribute( const XMLAttribute& ). + */ + XMLElement& operator <<( const XMLAttribute& attribute ) + { + SetAttribute( attribute ); + return *this; + } + + /*! + * Causes this %XML element to contain the specified \a list of attributes. + * + * For each attribute in the specified \a list, if an attribute with the + * same qualified \a name already exists in this element, then its value + * will be changed. Otherwise, a new attribute will be created in this + * element. + * + * This member function ensures that no %XML element can have two or more + * attributes with the same qualified name. This constraint is part of the + * %XML specification: + * + * https://www.w3.org/TR/xml11/#sec-starttags + * https://www.w3.org/TR/xml-names/#scoping-defaulting + */ + void SetAttributes( const XMLAttributeList& list ) + { + for ( auto a : list ) + SetAttribute( a ); + } + + /*! + * Insertion operator. Returns a reference to this object. + * + * This operator is equivalent to SetAttributes( const XMLAttributeList& ). + */ + XMLElement& operator <<( const XMLAttributeList& list ) + { + SetAttributes( list ); + return *this; + } + + /*! + * Removes the attribute with the specified qualified \a name, if it exists + * in this element. If this element has no attribute with the specified + * \a name, this member function has no effect. + */ + void RemoveAttribute( const String& name ) + { + m_attributes.RemoveAttribute( name ); + } + + /*! + * Removes all existing attributes in this element. + */ + void ClearAttributes() + { + m_attributes.Clear(); + } + + /*! + * Sorts the existing attributes in this element in ascending order by + * comparing their qualified names. + */ + void SortAttributes() + { + m_attributes.Sort(); + } + + /*! + * Sorts the existing attributes in this element in ascending order. + * Ordering of elements is defined such that for any pair a, b of + * XMLAttribute objects in this element, the binary predicate p(a,b) is true + * iff a precedes b. + */ + template + void SortAttributes( BP p ) + { + m_attributes.Sort( p ); + } + + /*! + * Parses the specified \a text, encoded as UTF-16, to generate a new list + * of attributes in this %XML element. The previous list of attributes, if + * any, will be replaced by the newly generated list. + * + * The specified \a text must be a sequence of zero or more Attribute %XML + * definitions pertaining to a start-tag, as described in the W3C + * recommendation: + * + * https://www.w3.org/TR/xml11/#NT-STag + */ + void ParseAttributes( const String& text ) + { + XMLAttributeList list( text ); + ClearAttributes(); + SetAttributes( list ); + } + + /*! + * Performs the %XML serialization of the attribute list in this element and + * appends it to the specified \a text string, encoded in UTF-8. + * + * The generated serialization is a sequence of zero or more Attribute %XML + * definitions pertaining to a start-tag, as described in the W3C + * recommendation: + * + * https://www.w3.org/TR/xml11/#NT-STag + */ + void SerializeAttributes( IsoString& text ) const + { + m_attributes.Serialize( text ); + } + + /*! + * Returns the number of child nodes in this %XML element. + */ + int ChildCount() const + { + return int( m_childNodes.Length() ); + } + + /*! + * Returns true iff this is an empty %XML element. An empty element has no + * child nodes. + */ + bool IsEmpty() const + { + return m_childNodes.IsEmpty(); + } + + /*! + * Returns a reference to the immutable child node at the specified + * zero-based index \a i. No bounds checking is performed: if the specified + * index is invalid this function invokes undefined behavior. + */ + const XMLNode& operator []( int i ) const + { + return m_childNodes[i]; + } + + /*! + * Returns a reference to the immutable first child node in this element. No + * bounds checking is performed: if this element is empty, this function + * invokes undefined behavior. + */ + const XMLNode& First() const + { + return m_childNodes.First(); + } + + /*! + * Returns a reference to the immutable last child node in this element. No + * bounds checking is performed: if this element is empty, this function + * invokes undefined behavior. + */ + const XMLNode& Last() const + { + return m_childNodes.Last(); + } + + /*! + * Returns an immutable iterator located at the beginning of the list of + * child nodes of this %XML element. + */ + const_iterator Begin() const + { + return m_childNodes.Begin(); + } + + /*! + * Returns an immutable iterator located at the end of the list of child + * nodes of this %XML element. + */ + const_iterator End() const + { + return m_childNodes.End(); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + +#ifndef __PCL_NO_MUTABLE_XML_ELEMENT_ITERATORS + + /*! + * Returns a mutable iterator located at the beginning of the list of child + * nodes of this %XML element. + */ + iterator Begin() + { + return m_childNodes.Begin(); + } + + /*! + * Returns a mutable iterator located at the end of the list of child nodes + * of this %XML element. + */ + iterator End() + { + return m_childNodes.End(); + } + + /*! + * Returns an immutable iterator located at the beginning of the list of + * child nodes of this %XML element. + */ + const_iterator ConstBegin() const + { + return m_childNodes.ConstBegin(); + } + + /*! + * Returns an immutable iterator located at the end of the list of child + * nodes of this %XML element. + */ + const_iterator ConstEnd() const + { + return m_childNodes.ConstEnd(); + } + +# ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin(). + */ + iterator begin() + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End(). + */ + iterator end() + { + return End(); + } +# endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + +#endif // !__PCL_NO_MUTABLE_XML_ELEMENT_ITERATORS + + /*! + * Returns true iff this element contains one or more child %XML elements. + */ + bool HasElements() const + { + return m_childTypes.IsFlagSet( XMLNodeType::Element ); + } + + /*! + * Returns true iff this element contains one or more child text blocks. + */ + bool HasText() const + { + return m_childTypes.IsFlagSet( XMLNodeType::Text ); + } + + /*! + * Returns true iff this element contains one or more child CDATA sections. + */ + bool HasCDATA() const + { + return m_childTypes.IsFlagSet( XMLNodeType::CDATA ); + } + + /*! + * Returns true iff this element contains one or more child processing + * instructions. + */ + bool HasProcessingInstructions() const + { + return m_childTypes.IsFlagSet( XMLNodeType::ProcessingInstructions ); + } + + /*! + * Returns true iff this element contains one or more child comment + * sections. + */ + bool HasComments() const + { + return m_childTypes.IsFlagSet( XMLNodeType::Comment ); + } + + /*! + * Returns the text contents of this element, or an empty string if this + * element has no text child nodes. + * + * If this element has two or more text child nodes, the returned value is + * the concatenation of all child text nodes. + */ + String Text() const; + + /*! + * \internal + */ + void GetChildElements( child_element_list& list, bool recursive ) const + { + for ( const XMLNode& node : m_childNodes ) + if ( node.IsElement() ) + { + const XMLElement& element = static_cast( node ); + list << &element; + if ( recursive ) + element.GetChildElements( list, recursive ); + } + } + + /*! + * Returns a list with all child elements of this element. + * + * if \a recursive is \c true, this member function performs a recursive + * search across the entire tree structure rooted at this element. Otherwise + * only the direct descendant elements will be returned. + */ + child_element_list ChildElements( bool recursive = false ) const + { + child_element_list list; + GetChildElements( list, recursive ); + return list; + } + + /*! + * \internal + */ + void GetChildElementsByName( child_element_list& list, const String& name, bool recursive ) const + { + for ( const XMLNode& node : m_childNodes ) + if ( node.IsElement() ) + { + const XMLElement& element = static_cast( node ); + if ( element.Name() == name ) + { + list << &element; + if ( recursive ) + element.GetChildElementsByName( list, name, recursive ); + } + } + } + + /*! + * Returns a list with all child elements of this element with the specified + * \a name. + * + * if \a recursive is \c true, this member function performs a recursive + * search across the entire tree structure rooted at this element. Otherwise + * only the direct descendant elements will be returned. + */ + child_element_list ChildElementsByName( const String& name, bool recursive = false ) const + { + child_element_list list; + GetChildElementsByName( list, name, recursive ); + return list; + } + + /*! + * \internal + */ + void GetChildNodesByType( XMLNodeList& list, XMLNodeTypes types, bool recursive ) const + { + for ( const XMLNode& node : m_childNodes ) + if ( types.IsFlagSet( node.NodeType() ) ) + { + list << &node; + if ( recursive ) + if ( node.IsElement() ) + static_cast( node ).GetChildNodesByType( list, types, recursive ); + } + } + + /*! + * Returns a list with all child nodes of this element of the specified + * \a types. The \a types argument can be an ORed combination of XMLNodeType + * enumerated mask values. + * + * if \a recursive is \c true, this member function performs a recursive + * search across the entire tree structure rooted at this element. Otherwise + * only the direct descendant nodes will be returned. + */ + XMLNodeList ChildNodesByType( XMLNodeTypes types, bool recursive = false ) const + { + XMLNodeList list; + GetChildNodesByType( list, types, recursive ); + return list; + } + + /*! + * \internal + */ + template + void GetChildNodesThat( XMLNodeList& list, UP u, bool recursive ) const + { + for ( const XMLNode& node : m_childNodes ) + if ( u( node ) ) + { + list << &node; + if ( recursive ) + if ( node.IsElement() ) + static_cast( node ).GetChildNodesThat( list, u, recursive ); + } + } + + /*! + * Returns a list with all child nodes of this element that satisfy the + * specified unary predicate \a u. + * + * For each child node n in this element, n will be included in the returned + * list iff u( n ) returns true. + * + * if \a recursive is \c true, this member function performs a recursive + * search across the entire tree structure rooted at this element. Otherwise + * only the direct descendant nodes will be returned. + */ + template + XMLNodeList ChildNodesThat( UP u, bool recursive = false ) const + { + XMLNodeList list; + GetChildNodesThat( list, u, recursive ); + return list; + } + + /*! + * Appends a child \a node to this %XML element. + * + * The specified \a node will be owned by this element, which will destroy + * it automatically (and recursively) upon destruction. + */ + void AddChildNode( XMLNode* node ) + { + m_childNodes << node; + node->m_parent = this; + node->m_type.SetFlag( XMLNodeType::ChildNode ); + m_childTypes.SetFlag( node->NodeType() ); + } + + /*! + * Insertion operator: Appends a child \a node to this %XML element. Returns + * a reference to this object. + * + * This operator does the same as AddChildNode( node ). + */ + XMLElement& operator <<( XMLNode* node ) + { + AddChildNode( node ); + return *this; + } + + /*! + * Appends an ordered sequence of child \a nodes to this %XML element. + * + * After calling this function, all existing \a nodes in the specified list + * will be owned by this element, which will destroy them automatically (and + * recursively) upon destruction. + */ + void AddChildNodes( XMLNodeList& nodes ) + { + for ( XMLNode& node : nodes ) + AddChildNode( &node ); + } + + /*! + * Insertion operator: Appends an ordered sequence of child \a nodes to this + * %XML element. Returns a reference to this object. + * + * This operator does the same as AddChildNodes( nodes ). + */ + XMLElement& operator <<( XMLNodeList& nodes ) + { + AddChildNodes( nodes ); + return *this; + } + + /*! + * \internal + * Appends a new child \a node to this %XML element. + * + * The specified \a node will be owned by this element, which will destroy + * it automatically (and recursively) upon destruction. + */ + void AddChildNode( XMLNode* node, const XMLNodeLocation& location ) + { + node->m_location = location; + AddChildNode( node ); + } + + /*! + * Recursively destroys all existing child nodes in this %XML element, + * yielding an empty element. + */ + void DestroyChildNodes() + { + m_childNodes.Destroy(); + m_childTypes = XMLNodeType::Undefined; + } + + /*! + * Releases the child nodes of this %XML element. + * + * This function returns the (possibly empty) list of child nodes in this + * element and causes this object to forget them. The caller will be + * responsible for destroying and deallocating all of the returned nodes as + * appropriate. After calling this member function, this %XML element will + * be empty. + */ + XMLNodeList ReleaseChildNodes() + { + XMLNodeList nodes = m_childNodes; + m_childNodes.Clear(); + m_childTypes = XMLNodeType::Undefined; + return nodes; + } + + /*! + * Recursively serializes this %XML element and its contents. Appends the + * generated %XML source code to the specified 8-bit \a text string, encoded + * in UTF-8. + * + * See XMLNode::Serialize() for information on function parameters. + */ + void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const override; + +private: + + String m_name; + XMLAttributeList m_attributes; + XMLNodeList m_childNodes; + XMLNodeTypes m_childTypes = XMLNodeType::Undefined; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class pcl::XMLElementList + * \brief Dynamic list of %XML elements + * + * %XMLElementList is a template instantiation of ReferenceArray<> for the + * XMLElement class. It is used to transport ordered sequences of child element + * nodes. See for example XMLElement::ChildElements(). + * + * \ingroup xml_parsing_and_generation + */ +typedef XMLElement::child_element_list XMLElementList; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLText + * \brief %XML text block + * + * This %XMLText class represents a text entity in an %XML document: + * + * https://www.w3.org/TR/xml11/#dt-text + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLText : public XMLNode +{ +public: + + /*! + * Constructs a new %XMLText object. + * + * \param text The Unicode text block contents encoded as UTF-16. + * + * \param preserveSpaces If false, the text block will be transformed by + * trimming and collapsing spaces: All leading and trailing + * space characters will be removed, and all sequences of one + * or more space characters will be replaced by single white + * space characters (\#x20). If true, the specified \a text + * string will be stored intact. + * + * \param verbatim If true, the text block will be serialized unencoded, + * that is, exactly as is being specified, in the XML + * document. No codification of illegal characers such as + * quotes and '<' or '>' will be performed. This is useful to + * generate special code blocks that must be included + * literally, such as <style> or <script> tags in + * HTML and SVG documents. + * + * Besides text contents transformation, space preservation also has an + * impact in the way text blocks are serialized as %XML: New line characters + * (\#x0A) are never used to separate text blocks from their parent or + * sibling nodes when space preservation is enabled. + */ + XMLText( const String& text, bool preserveSpaces = true, bool verbatim = false ) + : XMLNode( XMLNodeType::Text ) + , m_text( preserveSpaces ? text : XML::CollapsedSpaces( XML::TrimmedSpaces( text ) ) ) + , m_preserveSpaces( preserveSpaces ) + , m_verbatim( verbatim ) + { + } + + /*! + * Copy constructor. + */ + XMLText( const XMLText& ) = default; + + /*! + * Returns a reference to the (immutable) text string contained by this %XML + * text block. The returned string is encoded in UTF-16. + */ + const String& Text() const + { + return m_text; + } + + /*! + * Returns true iff this text block preserves space characters for + * serialization. See the class constructor for more information. + */ + bool IsPreserveSpaces() const + { + return m_preserveSpaces; + } + + /*! + * Returns an encoded version of this text block. All characters that cannot + * legally occur in an %XML text block are replaced by their corresponding + * entity references. + */ + String EncodedText() const + { + return XML::EncodedText( m_text ); + } + + /*! + * Returns a space-transformed version of this text block. + * + * \param collapse Replace all sequences of one or more space characters + * with single white space characters (\#x20). + * + * \param trim Remove all leading and trailing space characters. + */ + String SpaceTransformedText( bool collapse, bool trim ) const + { + String text = m_text; + if ( trim ) + text = XML::TrimmedSpaces( text ); + if ( collapse ) + text = XML::CollapsedSpaces( text ); + return text; + } + + /*! + * Serializes this %XML text block with UTF-8 encoding. + * + * See XMLNode::Serialize() for information on function parameters. See also + * the class constructor for information on space preservation options in + * %XML text blocks. + */ + void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const override; + + /*! + * Returns true iff a new line character (\#x0A) can be inserted before + * serializing this node after the specified \a previous node. + * + * In the case of a text block, a new line character can only be inserted + * if the block does not preserve space characters. If space preservation is + * enabled, new line characters are forbidden at the beginning and end of + * the text block serialization. + */ + bool NLAfter( const XMLNode& previous ) const override + { + return !m_preserveSpaces; + } + +private: + + String m_text; // N.B.: This is plain, that is, decoded, text. + bool m_preserveSpaces = true; + bool m_verbatim = false; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLCDATA + * \brief %XML CDATA section + * + * The %XMLCDATA class represents a CDATA section in an %XML document: + * + * https://www.w3.org/TR/xml11/#sec-cdata-sect + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLCDATA : public XMLNode +{ +public: + + /*! + * Constructs a new %XMLCDATA object with the specified character \a data + * encoded in UTF-16. + * + * The specified \a data must not contain the sequence "]]>". Any occurrence + * of this forbidden sequence will be removed for serialization. + */ + XMLCDATA( const String& data = String() ) + : XMLNode( XMLNodeType::CDATA ) + , m_cdata( data ) + { + } + + /*! + * Copy constructor. + */ + XMLCDATA( const XMLCDATA& ) = default; + + /*! + * Returns a reference to the (immutable) character data string, encoded as + * UTF-16, contained by this CDATA section. + */ + const String& CData() const + { + return m_cdata; + } + + /*! + * Serializes this %XML CDATA section with UTF-8 encoding. + * + * See XMLNode::Serialize() for information on function parameters. + */ + void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const override; + +private: + + String m_cdata; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLProcessingInstructions + * \brief %XML processing instructions + * + * The %XMLProcessingInstructions class represents a processing instructions + * (PI) tag in an %XML document: + * + * https://www.w3.org/TR/xml11/#sec-pi + * + * \ingroup xml_parsing_and_generation + */ +class XMLProcessingInstructions : public XMLNode +{ +public: + + /*! + * Constructs a new %XMLProcessingInstructions object with the specified + * \a target name and \a instructions string, both encoded in UTF-16. + * + * The specified \a instructions string must not contain the sequence "?>". + * Any occurrence of this forbidden sequence will be removed for + * serialization. + */ + XMLProcessingInstructions( const String& target, const String& instructions ) + : XMLNode( XMLNodeType::ProcessingInstructions ) + , m_target( target ) + , m_instructions( instructions ) + { + } + + /*! + * Copy constructor. + */ + XMLProcessingInstructions( const XMLProcessingInstructions& ) = default; + + /*! + * Returns a reference to the (immutable) instructions target name. + */ + const String& Target() const + { + return m_target; + } + + /*! + * Returns a reference to the (immutable) instructions string. + */ + const String& Instructions() const + { + return m_instructions; + } + + /*! + * Serializes this %XML PI section with UTF-8 encoding. + * + * See XMLNode::Serialize() for information on function parameters. + */ + void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const override; + +private: + + String m_target; + String m_instructions; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLComment + * \brief %XML comment section + * + * The %XMLComment class represents a comment in an %XML document: + * + * https://www.w3.org/TR/xml11/#sec-comments + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLComment : public XMLNode +{ +public: + + /*! + * Constructs a new %XMLComment object with the specified \a comment string + * encoded in UTF-16. + * + * The specified \a comment must not contain the sequence "--" or end with + * a '-' character. Any occurrence of these forbidden sequences will be + * removed for serialization. + */ + XMLComment( const String& comment ) + : XMLNode( XMLNodeType::Comment ) + , m_comment( comment ) + { + } + + /*! + * Copy constructor. + */ + XMLComment( const XMLComment& ) = default; + + /*! + * Returns a reference to the (immutable) comment string. + */ + const String& Comment() const + { + return m_comment; + } + + /*! + * Serializes this %XML comment section with UTF-8 encoding. + * + * See XMLNode::Serialize() for information on function parameters. + */ + void Serialize( IsoString& text, bool autoFormat, char indentChar, unsigned indentSize, unsigned level ) const override; + +private: + + String m_comment; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLUnknownElement + * \brief Unsupported or invalid %XML element + * + * %XMLUnknownElement represents an invalid or unrecognized %XML element + * retrieved while parsing an %XML document. In the current PCL implementation, + * an %XMLUnknownElement object is generated if the parser finds an element + * whose start-tag begins with the " + * XMLParserOption::IgnoreComments Do not add comment nodes to the DOM. + * XMLParserOption::IgnoreUnknownElements Do not add unknown/invalid elements to the DOM. + * XMLParserOption::IgnoreStrayCharacters Be tolerant of non-space characters outside markup. + * XMLParserOption::NormalizeTextSpaces Trim and collapse spaces in all child text nodes. + * + * + * \ingroup xml_parsing_and_generation + */ +namespace XMLParserOption +{ + enum mask_type + { + IgnoreComments = 0x00000001, + IgnoreUnknownElements = 0x00000002, + IgnoreStrayCharacters = 0x00000004, + NormalizeTextSpaces = 0x00000008 + }; +} + +/*! + * \class pcl::XMLParserOptions + * \brief A collection of %XML document parsing options + * \ingroup xml_parsing_and_generation + */ +typedef Flags XMLParserOptions; + +// ---------------------------------------------------------------------------- + +/*! + * \class XMLDocument + * \brief %XML document parsing and generation + * + * %XMLDocument implements parsing and generation of well-formed %XML + * documents. + * + * The Parse() member function reads and interprets a Unicode text string to + * generate a read-only document object model (DOM) that represents the data + * entities defined by a well-formed %XML document. The DOM can be inspected + * with several member functions of the %XMLDocument class. All %XML nodes and + * elements in a document can be visited recursively with specialized accessor + * functions and iterators. See the Begin() and End() functions (and their + * STL-compatible equivalents, begin() and end()), as well as XML(), DocType(), + * RootElement(), and operator []( int ), among others. + * + * For generation of %XML documents, the Serialize() member function builds a + * new document as a Unicode string encoded in UTF-8. The document's root node + * and several nodes and critical components must be defined before document + * generation - see the SetXML(), SetDocType(), AddNode() and SetRootElement() + * member functions. + * + * For general information on %XML, the authoritative sources are the W3C + * recommendations: + * + * https://www.w3.org/TR/xml/ + * https://www.w3.org/TR/xml11/ + * https://www.w3.org/TR/xml-names/ + * + * The following example shows how an existing document can be parsed as a new + * %XMLDocument object, and then a new %XML document can be generated and + * written to a disk file, all in just three source code lines: + * + * \code + * XMLDocument xml; + * xml.Parse( File::ReadTextFile( "/path/to/file.xml" ).UTF8ToUTF16() ); + * File::WriteTextFile( "/tmp/test.xml", xml.Serialize() ); + * \endcode + * + * In this case the new document is generated without superfluous space + * characters. To enable automatic indentation of text lines, see the + * EnableAutoFormatting(), SetIndentSize() and EnableIndentTabs() member + * functions. + * + * The following example: + * + * \code + * XMLElement* e1 = new XMLElement( "Foo", XMLAttributeList() << XMLAttribute( "version", "1.0" ) ); + * + * XMLElement* e2 = new XMLElement( "Bar" ); + * *e2 << new XMLElement( "bar_child_1" ) + * << new XMLElement( "bar_child_2" ); + * + * XMLElement* e3 = new XMLElement( "FooBar" ); + * *e3 << new XMLText( "This is FooBar." ); + * + * *e1 << e2 << e3; + * + * XMLDocument xml; + * xml.SetXML( "1.0" ); + * xml.SetRootElement( e1 ); + * xml.EnableAutoFormatting(); + * xml.SerializeToFile( "/tmp/foobar.xml" ); + * \endcode + * + * generates this %XML file in /tmp/foobar.xml: + * + * \code + * + * + * + * + * + * + * This is FooBar. + * + * \endcode + * + * \ingroup xml_parsing_and_generation + */ +class PCL_CLASS XMLDocument +{ +public: + + /*! + * Represents a mutable child node list iterator. + */ + typedef XMLNodeList::iterator iterator; + + /*! + * Represents an immutable child node list iterator. + */ + typedef XMLNodeList::const_iterator const_iterator; + + /*! + * Represents an option to control the %XML parser behavior. Valid options + * are defined in the XMLParserOption namespace. + */ + typedef XMLParserOption::mask_type parser_option; + + /*! + * Default constructor. Constructs an empty %XML document. + * + * For serialization of XML documents, this constructor defines the + * following default settings: + * + * \li Auto-formatting disabled. + * \li Use space characters (\#x20) for indentation. + * \li Indentation size = 3 spaces. + */ + XMLDocument() = default; + + /*! + * Virtual destructor. Recursively destroys all %XML elements, declarations + * and auxiliary data associated with this object. + */ + virtual ~XMLDocument() + { + m_nodes.Destroy(); + m_root = nullptr; + RemoveElementFilter(); + } + + /*! + * Copy constructor. This constructor is disabled because %XMLDocument + * represents unique objects. + */ + XMLDocument( const XMLDocument& ) = delete; + + /*! + * Copy assignment. This operator is disabled because %XMLDocument + * represents unique objects. + */ + XMLDocument& operator =( const XMLDocument& ) = delete; + + /*! + * Returns a reference to the (immutable) %XML declaration object associated + * with this document. + */ + const XMLDeclaration& XML() const + { + return m_xml; + } + + /*! + * Defines an %XML declaration in this %XML document. + */ + void SetXML( const XMLDeclaration& xml ) + { + m_xml = xml; + } + + /*! + * Defines an %XML declaration in this %XML document with the specified + * \a version, \a encoding and \a standalone attributes. + */ + void SetXML( const String& version = "1.0", const String& encoding = "UTF-8", bool standalone = false ) + { + SetXML( XMLDeclaration( version, encoding, standalone ) ); + } + + /*! + * Returns a reference to the (immutable) %XML document type declaration + * object associated with this document. + */ + const XMLDocTypeDeclaration& DocType() const + { + return m_docType; + } + + /*! + * Associates a new %XML document type declaration object with this %XML + * document. + */ + void SetDocType( const XMLDocTypeDeclaration& docType ) + { + m_docType = docType; + } + + /*! + * Returns a pointer to the (immutable) root element of this %XML document. + * If there is no root element, for example when this is an uninitialized + * %XMLDocument instance, this function returns \c nullptr. + * + * \sa ReleaseRootElement(), SetRootElement() + */ + const XMLElement* RootElement() const + { + return m_root; + } + + /*! + * Releases the root element of this %XML document. + * + * This function returns the root element and causes this object to forget + * it. The caller will be responsible for destroying and deallocating the + * returned XMLElement instance as appropriate. This function performs an + * implicit call to Clear(), so the document will be empty after calling it. + * + * If there is no root element, for example when this is an uninitialized + * %XMLDocument instance, this function returns \c nullptr. + * + * \sa RootElement(), SetRootElement() + */ + XMLElement* ReleaseRootElement() + { + XMLElement* root = m_root; + m_nodes.RemovePointer( m_root ); + Clear(); + return root; + } + + /*! + * Returns the number of nodes in this %XML document, or zero if this is an + * empty or uninitialized %XMLDocument object. + */ + int NodeCount() const + { + return int( m_nodes.Length() ); + } + + /*! + * Returns true iff this is an empty %XML document. An empty document has no + * %XML nodes. + */ + bool IsEmpty() const + { + return m_nodes.IsEmpty(); + } + + /*! + * Returns a reference to the (immutable) document node at the specified + * zero-based index \a i. No bounds checking is performed: if the specified + * index is invalid, this function invokes undefined behavior. + */ + const XMLNode& operator []( int i ) const + { + return m_nodes[i]; + } + + /*! + * Returns an immutable iterator located at the beginning of the list of + * nodes of this %XML document. + */ + const_iterator Begin() const + { + return m_nodes.Begin(); + } + + /*! + * Returns an immutable iterator located at the end of the list of + * nodes of this %XML document. + */ + const_iterator End() const + { + return m_nodes.End(); + } + +#ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS + /*! + * STL-compatible iteration. Equivalent to Begin() const. + */ + const_iterator begin() const + { + return Begin(); + } + + /*! + * STL-compatible iteration. Equivalent to End() const. + */ + const_iterator end() const + { + return End(); + } +#endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS + + /*! + * Appends a new top-level %XML node to this document. + * + * If the specified \a node already belongs to an %XMLDocument object, or if + * a null pointer is specified, this member function will throw an Error + * exception. + * + * The specified \a node will be appended to the current list of document + * nodes. If there is a root element in this document, the new \a node will + * be appended after the root element. + * + * The \a node will be owned by this document object, which will destroy and + * deallocate it automatically when appropriate. + */ + void AddNode( XMLNode* node ); + + /*! + * Insertion operator. Returns a reference to this %XMLDocument object. + * + * This operator is equivalent to AddNode( XMLNode* ). + */ + XMLDocument& operator <<( XMLNode* node ) + { + AddNode( node ); + return *this; + } + + /*! + * Sets the root element of this %XML document. + * + * If the specified \a element already belongs to an %XMLDocument object, if + * a null pointer is specified, or if a root node has already been defined + * for this document, this member function will throw an Error exception. + * + * The specified \a element will be appended to the current list of document + * nodes. The \a element will be owned by this document object, which will + * destroy and deallocate it automatically when appropriate. + * + * \sa RootElement(), ReleaseRootElement() + */ + void SetRootElement( XMLElement* element ); + + /*! + * Destroys and deallocates all nodes and elements in this %XML document + * object, and initializes all internal structures to a default state, + * yielding an uninitialized object. + * + * If there is an element filter or a set of parser options defined for this + * object, they are preserved by this function. See RemoveElementFilter() to + * remove a filter set by a previous call to SetElementFilter(). See also + * ClearParserOptions() to reset parser options set by previous calls to + * SetParserOption(). + */ + void Clear(); + + /*! + * Sets a new element filter for this object. The specified object will be + * owned by this %XMLDocument instance, which will destroy and deallocate it + * when appropriate. + * + * See XMLElementFilter for a complete description of the element filtering + * functionality. See RemoveElementFilter() to remove the element filter + * set by this function. + */ + void SetElementFilter( XMLElementFilter* filter ) + { + delete m_filter, m_filter = filter; + } + + /*! + * Removes an element filter set by a previous call to SetElementFilter(). + * If no filter has been defined for this object, this function has no + * effect. + */ + void RemoveElementFilter() + { + SetElementFilter( nullptr ); + } + + /*! + * Enables or disables an %XML document parser option for this object. Valid + * options are defined in the XMLParserOption namespace. See + * ClearParserOptions() to reset all parser options to a default state. + */ + void SetParserOption( parser_option option, bool on = true ) + { + m_parserOptions.SetFlag( option, on ); + } + + /*! + * Sets the specified parser \a options. Valid options are defined in the + * XMLParserOption namespace. See ClearParserOptions() to reset all parser + * options to a default state. + */ + void SetParserOptions( XMLParserOptions options ) + { + m_parserOptions = options; + } + + /*! + * Resets all parser options defined for this object by a previous call to + * SetParserOption() or SetParserOptions(). + */ + void ClearParserOptions() + { + m_parserOptions.Clear(); + } + + /*! + * %XML document parser. Reads and interprets the specified Unicode \a text + * string, which must be encoded in UTF-16, as a well-formed %XML document. + * + * This member function generates a document object model (DOM) to represent + * the data entities defined by the source %XML document. The DOM can then + * be inspected with several member functions of the %XMLDocument class. All + * %XML nodes and elements can be visited recursively with specialized + * iterators. See the Begin() and End() functions (and their STL-compatible + * equivalents, begin() and end()), as well as XML(), DocType(), + * RootElement() and operator []( int ), among others. + */ + void Parse( const String& text ); + + /*! + * Returns true iff the auto-formatting feature is enabled for %XML + * serialization with this %XMLDocument object. + * + * When auto-formatting is enabled, ignorable line breaks (\#x0A) and white + * space characters (either spaces (\#x20) or tabulators (\#x09)) are used + * to separate %XML nodes and to indent text lines, respectively, improving + * readability of generated %XML code. When auto-formatting is disabled, no + * superfluous white space characters are generated. The only exception is + * XMLText child nodes with space preservation enabled, which always ignore + * all indentation and formatting settings in order to reproduce their text + * contents without modification. + * + * The auto-formatting feature is always disabled by default for newly + * constructed %XMLDocument objects. This is because the main purpose and + * utility of %XMLDocument is parsing and generation of %XML documents + * intended for automated data management, without direct user intervention. + * Auto-formatting is only useful for human readability of %XML source code. + */ + bool IsAutoFormatting() const + { + return m_autoFormatting; + } + + /*! + * Enables the auto-formatting feature for generation of %XML code. See + * IsAutoFormatting() for more information. + */ + void EnableAutoFormatting( bool enable = true ) + { + m_autoFormatting = enable; + } + + /*! + * Disables the auto-formatting feature for generation of %XML code. See + * IsAutoFormatting() for more information. + */ + void DisableAutoFormatting( bool disable = true ) + { + EnableAutoFormatting( !disable ); + } + + /*! + * Returns the number of space characters (\#x20) used for each indentation + * level of text lines, when the auto-formatting feature is enabled and + * space characters are used for indentation. + * + * When tabulator characters (\#x09) are used for indentation, this setting + * is ignored and a single tabulator is always used for each indentation + * level. See IsAutoFormatting() and SetIndentSize() for more information. + */ + int IndentSize() const + { + return m_indentSize; + } + + /*! + * Sets the number of indentation space characters. + * + * \param indentSize Number of space characters (\#x20) used for a level + * of indentation of text lines in generated %XML code, + * when the auto-formatting feature is enabled and + * space characters are used for indentation. The valid + * range of values is from zero (for no indentation) to + * 8 characters. + * + * When the indentation size is zero and auto-formatting is enabled, each + * document node is generated in a separate line without any indentation. + * XMLText child nodes with space preservation enabled will always ignore + * all indentation and formatting settings, in order to reproduce their text + * contents without modification. + * + * When tabulator characters (\#x09) are used for indentation, this setting + * is ignored and a single tabulator character is always used for each + * indentation level. + * + * The default indentation size is 3 for newly constructed %XMLDocument + * objects. + */ + void SetIndentSize( int indentSize ) + { + m_indentSize = Range( indentSize, 0, 8 ); + } + + /*! + * Returns true if tabulator characters (\#x09) are used for indentation of + * text lines, when the auto-formatting feature is enabled. Returns false if + * space characters (\#x20) are used for indentation. + * + * By default, text indentation is always performed using space characters + * by newly constructed %XMLDocument objects. + */ + bool IsIndentTabs() const + { + return m_indentTabs; + } + + /*! + * Enables the use of tabulator characters (\#x09) for indentation. See + * IsIndentTabs() for more information. + */ + void EnableIndentTabs( bool enable = true ) + { + m_indentTabs = enable; + } + + /*! + * Disables the use of tabulator characters (\#x09) for indentation. See + * IsIndentTabs() for more information. + */ + void DisableIndentTabs( bool disable = true ) + { + EnableIndentTabs( !disable ); + } + + /*! + * Serializes this %XML document. Returns the generated serialization as a + * Unicode string encoded in UTF-8. + * + * To serialize a well-formed %XML document, this object must be initialized + * first by defining a root element (see SetRootElement()) and other + * document nodes, as necessary (see SetXML(), SetDocType(), and AddNode()). + * + * For formatting and indentation settings, see IsAutoFormatting(), + * IndentSize() and IsIndentTabs(). + */ + IsoString Serialize() const; + + /*! + * Serializes this %XML document and writes the result to a file at the + * specified \a path with UTF-8 encoding. + * + * See Serialize() for more information. + * + * \warning If a file already exists at the specified path, its previous + * contents will be lost after calling this function. + */ + void SerializeToFile( const String& path ) const; + +private: + + XMLDeclaration m_xml; + XMLDocTypeDeclaration m_docType; + XMLNodeList m_nodes; + XMLElement* m_root = nullptr; + XMLElementFilter* m_filter = nullptr; + XMLParserOptions m_parserOptions; + XMLNodeLocation m_location; + bool m_autoFormatting = false; + bool m_indentTabs = false; + int m_indentSize = 3; +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_XML_h + +// ---------------------------------------------------------------------------- +// EOF pcl/XML.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/include/pcl/ZenithalProjections.h b/3rdparty/include/pcl/ZenithalProjections.h new file mode 100644 index 0000000..d2573ed --- /dev/null +++ b/3rdparty/include/pcl/ZenithalProjections.h @@ -0,0 +1,281 @@ +// ____ ______ __ +// / __ \ / ____// / +// / /_/ // / / / +// / ____// /___ / /___ PixInsight Class Library +// /_/ \____//_____/ PCL 2.4.23 +// ---------------------------------------------------------------------------- +// pcl/ZenithalProjections.h - Released 2022-03-12T18:59:29Z +// ---------------------------------------------------------------------------- +// This file is part of the PixInsight Class Library (PCL). +// PCL is a multiplatform C++ framework for development of PixInsight modules. +// +// Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. +// +// Redistribution and use in both source and binary forms, with or without +// modification, is permitted provided that the following conditions are met: +// +// 1. All redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. All redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names +// of their contributors, may be used to endorse or promote products derived +// from this software without specific prior written permission. For written +// permission, please contact info@pixinsight.com. +// +// 4. All products derived from this software, in any form whatsoever, must +// reproduce the following acknowledgment in the end-user documentation +// and/or other materials provided with the product: +// +// "This product is based on software from the PixInsight project, developed +// by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." +// +// Alternatively, if that is where third-party acknowledgments normally +// appear, this acknowledgment must be reproduced in the product itself. +// +// THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS +// INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, +// DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- + +#ifndef __PCL_ZenithalProjections_h +#define __PCL_ZenithalProjections_h + +/// \file pcl/ZenithalProjections.h + +#include + +#include + +/* + * Based on original work contributed by Andrés del Pozo. + */ + +namespace pcl +{ + +// ---------------------------------------------------------------------------- + +/*! + * \class ZenithalProjectionBase + * \brief Base class of zenithal projection systems + * + * \ingroup astrometry_support + */ +class PCL_CLASS ZenithalProjectionBase : public ProjectionBase +{ +protected: + + /*! + * Default constructor. + */ + ZenithalProjectionBase() + { + m_theta0 = 90; + } + + /*! + * Copy constructor. + */ + ZenithalProjectionBase( const ZenithalProjectionBase& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + virtual ProjectionBase* Clone() const override = 0; + + /*! + * Returns the WCS projection identifier for this projection system. + */ + virtual IsoString ProjCode() const override = 0; + + /*! + * Returns the readable name of this projection system. + */ + virtual IsoString Name() const override = 0; + +protected: + + /*! + * Transforms from world coordinates to native spherical coordinates. + */ + bool Project( DPoint& pW, const DPoint& pN ) const noexcept override + { + double rTheta = GetRTheta( pN ); + double sinTheta, cosTheta; + SinCos( Rad( pN.x ), sinTheta, cosTheta ); + pW.x = rTheta * sinTheta; + pW.y = -rTheta * cosTheta; + return true; + } + + /*! + * Transforms from native spherical coordinates to world coordinates. + */ + bool Unproject( DPoint& pN, const DPoint& pW ) const noexcept override + { + pN.x = Deg( ArcTan( pW.x, -pW.y ) ); + pN.y = GetTheta( Sqrt( pW.x*pW.x + pW.y*pW.y ) ); + return true; + } + + virtual double GetRTheta( const DPoint& np ) const = 0; + virtual double GetTheta( double rTheta ) const = 0; +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class ZenithalEqualAreaProjection + * \brief Zenithal equal-area projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS ZenithalEqualAreaProjection: public ZenithalProjectionBase +{ +public: + + /*! + * Default constructor. + */ + ZenithalEqualAreaProjection() = default; + + /*! + * Copy constructor. + */ + ZenithalEqualAreaProjection( const ZenithalEqualAreaProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new ZenithalEqualAreaProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "ZEA"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Zenithal Equal Area"; + } + + /*! + * + */ + bool CheckBrokenLine( const DPoint& cp1, const DPoint& cp2 ) const noexcept override + { + DPoint np1 = m_sph.CelestialToNative( cp1 ); + DPoint np2 = m_sph.CelestialToNative( cp2 ); + return Min( Mod( Abs( np1.x - np2.x - 360 ), 360.0 ), + Mod( Abs( np1.x - np2.x + 360 ), 360.0 ) ) < 180*Sin( Rad( 45 + (np1.y + np2.y)/2/2 ) ); + } + +private: + + double GetRTheta( const DPoint& np ) const override + { + return 2 * Deg( Sin( Rad( (90 - np.y)/2 ) ) ); + } + + double GetTheta( double rTheta ) const override + { + return 90 - 2*Deg( ArcSin( Rad( rTheta )/2 ) ); + } +}; + +// ---------------------------------------------------------------------------- + +/*! + * \class StereographicProjection + * \brief Stereographic projection system + * + * \ingroup astrometry_support + */ +class PCL_CLASS StereographicProjection: public ZenithalProjectionBase +{ +public: + + /*! + * Default constructor. + */ + StereographicProjection() = default; + + /*! + * Copy constructor. + */ + StereographicProjection( const StereographicProjection& ) = default; + + /*! + * Returns a dynamically allocated duplicate of this object. + */ + ProjectionBase* Clone() const override + { + return new StereographicProjection( *this ); + } + + /*! + * Returns the WCS projection identifier for this projection system. + */ + IsoString ProjCode() const override + { + return "STG"; + } + + /*! + * Returns the readable name of this projection system. + */ + IsoString Name() const override + { + return "Stereographic"; + } + + /*! + * + */ + bool CheckBrokenLine(const DPoint& cp1, const DPoint& cp2) const noexcept override + { + return true; + } + +private: + + double GetRTheta( const DPoint& np ) const override + { + return 2 * Deg( Tan( Rad( (90 - np.y)/2 ) ) ); + } + + double GetTheta( double rTheta ) const override + { + return 90 - 2*Deg( ArcTan( Rad( rTheta )/2 ) ); + } +}; + +// ---------------------------------------------------------------------------- + +} // pcl + +#endif // __PCL_ZenithalProjections_h + +// ---------------------------------------------------------------------------- +// EOF pcl/ZenithalProjections.h - Released 2022-03-12T18:59:29Z diff --git a/3rdparty/lib/Linux/libPCL.a b/3rdparty/lib/Linux/libPCL.a new file mode 100644 index 0000000000000000000000000000000000000000..04b5fb30c1dda8b3697dd2868d302f3583d9e278 GIT binary patch literal 35568008 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�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Μ>Fc6 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 z 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�O;!FW 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 kd77?U1{AkbxpDI7B#B8t)xJeSop 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

B);AX#PR-^Ss3!mvp#3 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%0D!{)KnDO|Dga;y0L}sceF1>Y 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≪t&0HSC^b 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

R+2lWs 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

= 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°uU+* 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

HlCC|IOlmF8FVueKUT? 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 z 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�lHL!pTi{g+Lg4$_|O0xvdkqQ6z( z(#|~RMwg}jJhmiU>c5Nt6T;?rIQoBuh2SXlZxeX2i97XY62f`zj<7KOLm+=>T(UZ! ztp01vboC11IzzOx3=JJtnmFO)qd8n@B7~c%5rwQ5IQwdXxXlv%P(wq9+fAHsE(?P0 z6!2r+0eoY#{AU8^F)CetP~b$* zW%I1S#}T0kuL}GW2I*)T30=+;_%Q+>FYq%2eyYHW1%8^q%LSe<@Rb7RF$rD1QsAEy z^!o&Uy1;)Y@G}G+HjSC`RUq&Q0zXUOD+NyXryQ;nIMH(%Y!!HfiE+GH;1dPjCGbfC ze?;KyyXf*?1)etUDri}^Dp9@6D!>vyeO$@0M0{<+Dp+2fsJ050wX|3T1QeJBU%a%& zwRYR4QtNEYBDB;B?tF@xtf;9m3-YRvmHIgAdPLSn(*nznNO@WZ`_U?| zQgB&5wX91m+4WVyN#_z|mR~Cq`4xhsaS0G9^l1zyolB5OrB5M}CQX2IW!PkU4Ol6y z#`7zs0kEYd)W7>x9FeTtL601<;r2Ijrgv3?^CnX;`eki zsFa1j(1ZZ{u=kbo7v&M5aQDsd8NEwMeo}n9c0ao)aly2 zmuu0x{mz?NSWkU-q@c*Fd+L|BkB(;myy=>zYKN_%*XnhxE?%ljRbAPx(knxslB5VT zE*YQ>{@EU|fK=X9g}0Xlrw>l*43Rn^VS)$7z))2{o6+aARWTIz)=8o)y6k$$nDZ?PZdB?u!~ zzqN1#tk76aYa*Bl8 zpW#h8jz0O*$s96tbL*2oMdILfkE8mOGca;`&8eQuek5Oo^|Y=|AZ1;;O>`81CP_D- zFImb?z9a)MfzE$luLCfVe?8A~cQ5uPjDf%7u_%yfW#^y80t@YB5VK=~^T zKhI_Dz&Wi|7$|?e2miT);NRlG|EWRn-){JMK5PfhX}*1+`v14#m-+wnAo%xr@Sisb zexA>j=@$=zpTGYp^ItLu{xN1ARr1dm1V68bko={C;OFPklD};b{4o#x+XunF$neYd zN6(`NT7Q;$@YD0xf%32P;NLh1{w5FpMT6j9>%mXYl?ST-dJleT(*xz-V)*%4#t!h( zvz3AJ^EYQ@`O$Obf%4zxk^a^}@bB`-{|$rS=jS0Z|Jw(_|1*#DKR*b5{sym1pPqXT z)PDOs(!XgC{LgyWpPpL|H2pt$@W%$hf6#+}!65kG_u#*F5d8eSO4|R@LGT}Ap7Til zHG|*}d+^iqQm6gt85m_%J_E(6#p`k?E`u?P4UI*NF!T7v#s|tz&zPu$+^smH4DicnRY1fzOSfK%S z;7HHc*dOvU(8qz1{sBk+ziQ5z9waIdtqhX@c;){t!%uyV3{L$E!0e^}T}J<z_2~JN3^t6@p~TK)T96?VPY7j{Ng?(RjT8^EmbI0kfC>xir{DSgQ}#4jk#Z zp;P~nNSD%g>R)5@=k^N{6^K>_+FR61|0cuVpZ>JI(@Xy?9{SUBOsD=A`sh#J*QC&& z{#W_v&(C?cXfgJGr~O-f^tWbemM+7&14nv(>eT;>KKd^*73Ubk&j+Xd_xR|~@9*@d z|Ghr?cX{Yvk_@{Pp)x%k8;M%(P{r)AN|);XMwOwA5{IP`$wn! z&ob#d>;Laf`f_atiE`Ti3LpIs8vdOoeLgt#uLZwX{m+kSjxNKv14p|5bLxMCkN%%G z9ilTmr~VK4=zo{t?@#~xeDpuyp?`^o{`5_K(#dK63x@(k=udyzYnAw&{amg z{yF85@xAQ7t6cLuYgl*SScad|{wJFBo%$CT!v6fvOvCTgzu55ir+*3f@#pS;%_23a zKQ#%b{+Ijc|G@zD|GJO<^j%O2{rUe}ee_>s7MaTai?Za@|0h2B*O>JCv;Uub^lvi! zTU0Jm|D5&b1t0zQ8U1$|)*U#`!OyAx2R`~AGU@l{KPSM?sQPcx;ls$`I_A_D?lLXp zfgdVZ#c3$U4HX(FH24l2EAeycU+t5A*rZQ9GC1|Q)F=I2CjF&`c?XU()^(;&-)mO> z!_e`e$)rDq0dpi;86NV{f4kuiOJc;G`rq%Pe>N310;j(N@rC#~_5Zt1`gfW1dHxNo zDmc@B$0z-;NBT7X=uCec{JdBF**C!S={;Mo`cveQKFwb_)1U2={y~%eX*%2Xe`o$@ z`lMg!k^Utf>0j%Uet3jVGHj=;BhK{K`lP?oBmE^1;mrScIekaNEH>%WoQVw1^zY#G z9sKJ}`nwGC4jilSbEf}}N#EIjJ!#VK&wtKCKdb7GBmMn`pTE;>)Nr+*IpA0I$HAX} zf#&GK_<+I={FdS8)PI#p->H9wx$&hr2N|60|0csv_ZBj&HT+{Gh&ZRua-Q{? z-xp^w&hq=EPyP>Fs5#b({MU-~*{=kk5b5H~|Lw2WNin z^GSdIMVccl(ys^PO#g2teP_PDX%=&z%L$t!+l}F~(a#g+wEqi+|5zq;@UxuD4Zm~z zXqiRhw11Qg&iu#0@74ZzV~Z^&V>=+E2|s84x0>{w_3x7>>Qu?+%fNawc8^c~+YG<6 zUNJu(U-rrWcEiu}D4d=%|1bLFe+#{YhamHxz_~O3L(or=F3$Y#2m?e|pbz$c)|-K; zhToY_YpkZ2&V=UZ)IS1#ulAEmoejcveNg_Be4$hS&ETi^FC5jxDmLjey%A&cGk(2K z`a4Ye+)j5uz&iYxkMSG9Pgu~=fMWfm4;B>;d`SND&`*7s^uOE>Kb4IP&hytlB>zlw z&{U_K^>3-M-)xyU;$g@6Hw?ei{&yLEXMN-HV=-R^znA~G+mwHyA>4uE2K<ck&+xelPtG82w|0aR-j=_%T1rJ=>)3wEsbq z{wTxG2d6zR_0d0joaW$kn4i<<^NW4-FT6}sNc}ehVt$tUSs(qwCVgB^3(U{pZ9e)J z4p9Fu`RKpaL;ueqQBI%rzsE=aN|V0nMp<3g`14Ob`ZopR(myc3^l$M=|By%eH+rQ1fKU4Qr+^qCrVsXi)}Mjr z!W}r?j34uJ{$KVmp-WS|B^@gAH(`DuljelNuTvKVr>2Sd=&V- z>R))7rr><;!0DIqV|k3vFzItYp}8!p%cOrQ1LjD&QsCok!>`fQ|CbDZ3ehp~ao>#kL18C;W%xPyG5mFn{Qz0JrqO@P`ZfAz8JzZ`{w*j8OuTS~jBr=anya5!9u9|s-R|EEr#tl*+)lO|17v8BVWi&o4GWbl_-s7`#^t`{=R zl|xdg7OM-z);SqxXAnxoOh>9`r{R~6ADQlx_z`{verMuWfZtj8Q9X^|N7v|{Z4!Qy z&G{4@r{YJZqi0QY@AoPEh_(nn8q1%J->30A55Hpk=o+=lTkxayLFc#P_Z9qZGv`$9 zU&n8UIsXfef5q=@bN()lhw%HGIj3*4kes8<@fdSF)*L@(j>nnf7#!)lkodFc`$Ba5 z1pd)G+7v(098bdWWD^gY<5(QWnfNI<=9xIX$9<}apN3<;iPLu`KWXBpo8uYg7{PHO zejNT1I_bSw$3@w(H5O?v9?#UV>As6XWh|===y^yx~TAg!rC5y zfY)Qmy|Lu8mn`YsPoNG;ey8S44((>xKGOA)1u;#rFqZs>N-8;2$bIA9F(6-3a;f4b zhVtYCv809-T}AR`b?oiU7&!_p{n+e?bs}m}6E<~-S1+$x)rz-ctCq*{Do*1%YkW)o zgfMMG5no;qRxitiYp|Ea+2Qfahg(8ltbZyqf1$=Bpa(`@ZG@Izk zlV{|`kTMElPi;ZyL?x_u(T!wt3cu-T74bt=d zse`>y)Z%Nw*qb=&0BKemdZQ~eDw@kxJgE(njApYjmh1_gyq-wOT5mCTmg1(W2+dN( zJ#qxR^;jTlh$B7xU(nyHy}C={SgI^!8>$4{dbd|}tbkEHisjP>OL{Z&$~&&fQw0;U z3#KGAsw|I-rXo3>>{*^H%d^X-=Zm3}tvMV2l-Oo->w;0G!qusJmHJvzM)oMQh12au zquYzy|MZa`>5cx4@{{iD=$$Qx|HJDNS2!TN+DD*;Vp8^IWARaWUOtI+Wad$0J3aE$ z-Q-%(tQO>Dhi?bFBeOBE-dWY%lFg_Q-5>m;w^xZa{g6Gth$SEFGmg&p^qkLN^qBDpe4;Iob$yog zg+SJ}EbD85%v-app9N|#QVeFjlW9GliNU$*t6>*<5bp@8Kj4wob*Yh6ab@p*BK5t# zNL~jcIX2ml>HCTIJ|caGp7W%GggE)+h4RN2AP0D05!s1s1J%VrBew>EAx^L3*fv zxW<`qc>0tl--LmZzg?Jov?R3qVNtKkJJxX{>D|8la0={L+=7;7&a=)Rkd1Wx@hGj( zZVUr;8{2-%;pj0Ox4-9Po{!4YS6Qj_FD|*LB>4n2!>3CYkS=A(U(PQ}?txv#@R+q@ zHQObYOyp%(bgV7XwHTd3c1g0kB>61*ld|NSWyx1cdY|d5o{!OOw&b#ssy&YCe$reIFvpkQ8{SSWR z`XBPu-|l~Pd-{v3JrU3`3Dq5S9W~xj*>OsD<|PZ=jY#`9>e@Z)`=n@S_v2cuLnbw# zYzTE2T=@&-mafZA8@c0lja?Onbr{F;89UKj2zx7(OBXOUvxnKOS=8?LC|?HqkbE-) z!Qf-)TXb`nooetj5P=Y2Z-uJVXvQCVXrx)-fd3 zu`)Y$&dOXfB#wp34k&HmakaZu^J1^}<8;kH$;;`EIvy+JXO6>1g)=v1SgVEOb@%P6 zJO{3S@xNAoZEuug`XtV9n#5^GX`6YRvpnVtrXJoj4$a^Et)KauYap822GfBq8%b}^^v@G3GwI@k%AdBs6ms^{B0 zAE^dQ(J`?Jn7{u;?8*1ar#~IK{)s;8&KwM~=62STsTUekuZC$b(w-S^+n*8J@Lq4P zWra4;duOra)3FVIwhm%?V8es^aWC7B*_E)mplx5CoS7ZVc(6R#K(^2SAo2(h*gm`a zX56N4pVM&$Pr{^6!_s_T)G8uC8WxY={|cRwjAYJp(kT`BDVWJb@Pw;zSlzS zKSZ1*q)qv0)w*v~wCiDV%Tcv1G;w7;H@ zinYCnrgr&(?(KloJS*(}W5oNi`0Aa zYUd%Y-=ev9uR-Q)g)Ya5q5q&bkw*W}nnSU+1L5xD;LKueFG2py1Kq=MLcJrV)Ov=g zVM=mOPaaKB=fftd{&9CoS9|s|%~6VgXBU}<9VhOAT0V{`<@qD=fHC8E%lc8qxF<$f z&t#yR-V@0B`v~i?K>V2z*1f^Wh`$S$X5Eu{5~9z7zaJK?c~I1`gfV`J~!gj>EmeY7IFjg zag1$vk(@(C=Xc0EcsRG7D{Hq8vR{fuUL#!+c}fp%&hS!;QDv0h5$)L{NpvCM;>c4K z9m`R!x(}bTvA4Ae4s>K5<}usxtS^>CCGGwW+=U|Zwj4dLAJ7w}a#VeEGUKUQaVOJr zTRF{|&@gd!=P~Cg-_X4dg;~2@Tbd>ygr$3M>a_ItfRUx|z|mMb)_FZyni^X+k8fl2 zz)K~d?h^16mhOIH8R*TU)S;eMYLcPlcdOUslG`A?;2_hMWkD^w(3S9O`y=fq(r><`0Hhn=?+v|9dh<>>6f0o-z8z!>qq$1iv`UdOrhW?B3vPT>NF`vab)b z_GX=j_|74>W#I5UIo}tD1;KQ1*fE$y#M**HJi4kWu}-hB!FZR(=;g^j8&#*^j2ad{ z#eoUA`{3d;iw9zzhE^|RV6z-Y5s=1``UaS}IcMw#nf?WRze2uV-Ol4iJpCp-mUaUh z>sXYpRZZ^g{WXL-roK@J$Bj64c!apq)y*18O~LJ{O1 zpS9K+pLL;CniaEJU`lO2V>)BGm(nfwE^bQ{QjvUzEmo0y*AS`247TO;n2#($J-o3T z1n387%*~c#OEUcnlsyDGr`guu(roM7G_&|Pn=-d=Q;tzuMII?jzE!5y!uVTM^$6Oc zQ9QTC!&8`ptZSCl6fY`EzJ$4&^ofw8)Z~SFoKkX`t`DRw+dF4WFiHFF&UaBo$HH(~ z$DI7KWc2omjwOX<7&OF^t-FLJqYuYAa0k(WXU7|#3bijlKhZIxtmCS4G2`9QT-0%X z@$|i+_D=zx{zRyK3XT&FCHKDjLa2Q2gf~l)dy@~p`)nw7e@WXv_J=wz!{yk<=R)n{ zsei+~Rji{N&!Fer65IGlsJ&8wR|32$yX5El;kPWIwMX#lio8<-WA&C?SkWxj!PaPscdPCS*Sku#(9ow7ZVeaqM(?KML(wi%#Hpg}!APqt zHNJJUaC*1}u@BqRZJ~|l!Wy*fr!)TSCG_ZyW~6BOi*f)K?7aNC^P?MIYrUpK?Mnx9 zCob2f#*>-kwJ9NlA-2D;pT5{3@C@Vm1#jsfc}s61mjA{*aHJP_+Re@w@)jgR~UbQUJ~e%JE@ zGj8Losp{0dM|N=K$S2Wj7n6#^nM>T{P(s|KXCI%5U1Bm8Sk`laQ+_(c`g}0+n?tPI zf>~c0V(kiIBz#{m^ZP@rJwe=de2dN$}9^;Ml++XIWv&-iUKX~QMV^x6Z{nZ8>o zPnyR^ZLjv@c^B!s4eH^Pa=FH~CRWq@;@ZZCtDSHmE z8(V~F^&u4k|M|KCzy%V@ivf0vQ2s;;`eVt%Nc))%Bb zwm0hw#88cHOw&fHcmNhwegTiVDw1zjBwv98Mm5HxuEF0-gi<#X>LHjCOwEaVL%sGO z`|BCj)qeh=zOf;$Zz$%)YZAsYRCFfHO1D%`^-sUA(AGBof#>7QJz9QQ$N5+daaDGj zt$AffSw}P0KYX&Hqc*!NS&=u=zDrnCq)b%S0Wg|8glCPgK2~=O#zUu;Gq#fb<YPNS@W%E*7;T|1{JDq|6AHSs@Kn$Wo%@4UBB~VSUBTp zceRYh7(0D6O*Dxc551a(7Q79-whzkMCoaGjg0k<-u#$e(o)u5%%3fB7kDRw)?ze@# z%MqG^c(5l#El|xs@Qt{>d*u6Q)!(W41`N|;9Uc$;aXWB!y4&cjTtJQQq@U}WHX1==n?Jlm`hM|3RnnS(OA7aeKz5rW(Cqthm<|+rIL;* zm`In(MGQ0Pt5N&VYUs{R-T7nKWzWZy^!^5S-S+Jo(_IZ0yq%V!;I0k7COkB5;$a$Y zOb+&bVFxbynAbI515*ym#X8pY8ROjcoL{}#IMaW6twI(|NZHe~e%bchqHTi37;ck% zeiwxKm}GdW#&PA!9)_`KsfR&Q6-;&H{}QVV)E;JK;$4HvdFC*z?xPz;*{mw-)|SJ$ ztXP>)kD1g9Q(QWxKf}v5YH~!cj__I;5o-S?cn0t&<2tI=;*BHqyh+WWiwE6phw?+4 z-&1ove(NL3@!XlFj? z{q|bV(Q2L~w0o4j4&r{SgSbeqgTO=(yW@5k2@|?U`gwjGtj5okmmuEPbLCGd+V!Ld z+~^90z4>Qg?XJ@GERCU z%X&Hk9l-M$t3A@ovU-)SUU<@WXn1JzEB&^|`*Oi2+aezEskS)W zZi~aa{|p+`he0+4*$$VXwEwy7&^KRpI~<kH-Hyvqs_n>se@U z<}L?Mp><{EXLn+%bAZqJ*m1DWpse>Z*v6|#JugEy6LfpGUksS9p1YvK`K;rnCbjw& zMYQ&)oF9JMqboI<2`+#ujPPq$aFwCaP1p=1BlD3At25&`H7dzHA!{A(HW%Y=6VtJI z{~qP=(b%8LM2&ZlQ*yN_`@epq?Elmew14D5boe+*qz z9jOiFKit#d)sk{U^qwl#qum&=p7U!;DWCQ)EK92EeU>NeH!`oULVajJh58f~DhxL= z5C1MzrHY~u4NjJ5u3BY)l0}IwLJ2QI3FDoEBU!TQD+_H8q)HZkGOb)Yz0376lWY6`VBFkE>qaIRKB_s8=uKyKk9x|xCE~m_)4{1at&T(~ps-AxFBrt?p zjvBJ|MaE(+y~n0&x7z{n+Cu)%M-HB+vshGWXLVL->Dl4@h09tS60PA#q+nt};hED~ z)#=0u1^_VzKk9pJSvX>QL@R*LLJ>y89}1XhS0Ur7c~-{S+>B3*9Gbly^^S&bCzxxa z%@JL)`gRYU(l>gnXin~?KuOM+wqRLKxGHDN`8l~IIoXPL5nV?(S|4m#8CO+SsFa4% z4T|*%PVWqykbDYwSgrK7X6EE>4a9QBYzofG30Dly8B?BpOAM_gsc zOGYRiA6HWK_n;JSol1A^@SN<}h)W-$86qP70h(6_TbImMfTTLY?Gc~2#-8&prqAeRDTRHx`& z3<|2AT$q!)*wl+A2km6gv>S}diORe)5X~90mC9jLW@%1-Th^?c!j(DsB{^Z#wHc~Z zlrBFrd?ynhLLPqm3`S+F>t`v|Pt>2dDp9H&WW()-ZVBQko0OaKPb+d|lP*I~`Bn5# zj%-4*{>NNf%-2+1n&~TRq-lI!vhvNfbXly|8oQ`a6_s9#`jC|{*Dg!bOUXJvC*10i zb$cJOy3DnU(qxsHJg#-gI_M*-0{kPD0WE8*kaa^~M$VXR!DvpnGc%f#zcs5Yr*PAd zvYeu}p|f%-0}F=d6qV!@mgMBm$O(f|*8&(J3>lXic`18Vwhi4hWNTJu=Cy#d91rO@GfUpByNH>X=mda^BlAugDn_)3s95E*K!~xsbQs z&>pT{U4uyL)eo808AFr_`n3V&YmuQn+24*$VrdtpvdO-}Jl&$7+L ztes+2|ESMNm2JH!Tk?&ChL-$>6+=%!ULW<4d|!o>gTApX0JpP7_lZ>RIUV|jr>c(7 z)w|x8=z3oqxU{c&zrduIs`tfd^`6pPYiN#Cnh*DrW**Xf)tP3s>K`vqmNNb0a?l+^ z9VG(oZ@~807Jz^145F29%|zL4%0jDe8xm+6u1d~s`LPkf$_xiqG9vI92NWAYHlXk0 zQ=kQNoQ|yAA%U zI8d$Cv3o63Peu+SCjBjE#h+8$mbEE!Yp^q*zAt%(x&C9&u>5V*Cw7v5GP(%c4H=7DKZb{#vD_#&o4e4VigEa9d_)R&?u- zvbLeYvW$Y_g#}h%&2Wql%hC6Q!TTG-dp_cdcjS;Q6lE_MZbt zi}!Zo}Xjh`b;NBdN1mgOuBe6FuF>y5lNmY1{Co7w|@@2%s-}t4yEGSu|ca1}}?IxE?>npHpe~12l%3Y_1=!{6s(UZ!*{Ed$cM2Ree;{1Ztrn#<9&W6-)V?VL}7t{o=zm7v;fkEv3}pmlNTM8tv?mYO+266XOS$23_* z6;z(z!GP1Cb*URvIL&0Fhi~IFAmpUWuSzF2XF;pl2d{DAzXcLdyT0j5>GGGm=m`i~ zwLbVt7oLF{6|hor(&g8==m`i~SNPzoTsVC*JYc2dq|2vT>JC9Q67a&CU0_VfPsvG_ zPa_?72wJUf5J=GLgUSkD=R<$B4}Pr=ew`1#!3U=iq&ozyjcyP~(4sp+cL-Y43fv)R zb+|zwL95dTzrhEmyO8v7g({bnob+<}LOQWI3tBh%;9qp%dzJi@oOJnLa?ukIRA1+J zUkX~cxD@Y{XxJ6!nK0JWo(99d(6_72(UY(eWg>3}&4 zTL0<7>03MjAtzn_oi2I;g4Xwa@E^Evns*OaDLK@iaR^#JSsz$y8M@2^aKR0ZXdkIg-4Y9l$><=ues<62wHFW;BUI{#Y%ok zPP+WRxabK8s@+rEmx9*2Zcx$x%?E$a2Y=rO|G z3cB#ymHd>PborSsdXgHn#HKkSnV>}<)=UqNDfuZm>GFrU=!rXMjqt&ba^bHi`6)T+ z@^f7D!!cJLuu}MRp>9yz9|;)xr0%EE@zi}2<7YrVURLK*`xr6!$81DLrYgKd?J*=T z(W~xwx8Gi8z}Jcm&gXojwS}1RapiZm!oSL7_VGf6@3hZ3a;Z zV*{ty>4pvdc^^6d;e&tA2mcxHae=e!bjwZb2_JmF!YA7FJaWo{L3RdcmoFXQHdR=t zaM~422e#X{5b-LP?*bnen8M_0?>IX7Iqwbeef^%;P}Xvr<|Yq;7<_l zb{p1nKJ*8C@b`W2qlSCyb29MJfmu59_-qs_<$TUZ?O{8^6rNIuw3| zjbCJ9cPPBc#kaLL?_OZ^QKe0eokGb_LXdBlK0Fae*%}toDV35kJeN$m{z>R-G;ZNE0cbnK8AN)FnKV#GHHnCfM z@EzqpPD+)V8d+I_sjouX|pN z6gEJN`QAsB7fC@)WBqc7zhL&HrkZ;5Zc5RdI{G|ze0g-W=k5FvYd|Zw%U(h(e?y7jSu5OuU^3&!uCh$?&<J=^Jh()G=YF@ly zdAxaU6MZ>+`l{-dE2BU+1{Uf$Apq$HP46ebqA0j{);Ow=Vkv$1(q zbs|!@y1KqKu2uC?bgIsl)-y7(oGf-xb#q;HLn2B>h)gc4YiX*lURS!Zx}hOnpC)iw z<@||NAS#*zbIifcz>cexvsW&woVjeZr-`6&W##M|FQsrPtvGyW`r#H<_Z6^u6@*;w zb9vtE`Gr+Vk;v3p@rHPFT@8IKtGZ!DeZ0KRyWo}TU`wlXvROqY;bTOp&k#lD)yy{^0`jJi5 zRDLbgzHGPPSrv0nXiT+JgnEpRS#iy$O zMe3p=o~Q}c)rkt9q$EvJ_#}l-nnv`Krqln)Ite9n@)YuoqOFxpfi4EpZ~CPn>YY7_ zL|kv>rCmjhP?bx&i1GwAyF#?L<^|2wb%~ZJoll#Odbhl~d3i~FePc~^qOmy|l|qc? zDxDHVg=XE{>Ee1?%d(yR6s7dEIq{Yj@|h}oX;mXqN}r62K?yiZJNJ{YpF-45ZX$d@ zYrTuebSPz1f>nzbTqI3tGZ!r^pS$dGG%rIYiOM3W6j@jypt6e#n&Y(vRaGn2uB~c{ zH@7r4RM*!f)>W-8L_*8!D_5_wsunh^scTqXH80-Mx+>19no=VnwnqHUX8QKPycc>) z0^Yybs;a7OLKl&!t*Tjhg+rRopHke&H+m~WPLHmwiL2ftGTDxn)>pT*q%ud&;jpU0 zWctohQEhWPUV&|jZKECud37xblGm^Xw$!aa*Om0*)EE(x*&URk_}o=embb@M!E4gh zg{I8xK`*YFs$xb_D7u=p)m1B6(TJ+5Yp!gqYmR$w@@%qc*GTHARy#=12%TF*tBs_q zs+PAjR-vy%GchS*l(H6EOv~h(EY7lPH{!> z{|yy&4H$yC*wU`Zl&nU$3lni*a6 zZ@HGybj98p4z;9T!|hn zxrPG$4y&F^-C-{SwG`C}`W;n0fkg43urKOM#-3hFL+S;!QyS~j817om^{uSFX>m<& z`WCyoV2&^ctGOq_iDlOSmql(wT`N1lZ1+Hj$Civ~71UHGToLpUpHu zE-7hUT+5SX9yK{NXy;7D{MIhuHufl*;bkyl>)qh(_Crz^y1he)q(PP)igL$Cqe=2{ zeQiVNRykLaW~AxN;fP&EeiM1j$d?v)v|!rJ5Gff?lOsJng(j3HN`)`Av#$u2)Gk@j zv|Qz+QcNka6-6iZ+9lgTbZvF5j>*`(O3#>r>@-7%*2T?@7s);kwUW5810b#85J);o za%H;dx#mJSO8UyNYv%HynR?}b;$KWAgX`*SJDhwafi4srRb4lq=KFF%K!xBK%k+$T zLY-hQ61XVE9!zr*v?+5NXtz>BA*s`rSWoWBiN~)8t}mq8XDsQ3f@_wYiKp`V&Tx(D z{fb1YtiE!H4lYQKFg=BXHg366E^0XZ5!W-A!iWjOVB+bui>5Tvmsk=NC_Fcb`X`xx z+8G8~5OozK(g1X>)vfK#gef&mc*JXBP6Q zsdnP*_7Z*Re=?jV?wClAof%)&NHucSOw+pR1U+o30hn`2Ninz5%WCG=EiEaTK>Iwk zHWxmt>lzj{a%UrQq+|?Y+k8ZlC5s}>0+Z;rx=Bp`DE*XvfQ9Lq$z*!H zPvg>;2|eS#pr6XA1pJqP9|1Vhqn%F@joL}KZA@bMe795OA8cV`=dS@j67X*Uel*~G zZ&l@#3eNJM2K*GjKg@O(ik)0u8|kO{8Uy(Afa?=dOpmxex8cg+nB&C$;iocH{=E!R za?4%scr%XWj^+DXI;Z73k%drl^`2&7BcJa=tKNBnyY`>w!S%kiEB`Y>&vv5xuLABX z_y0uuv0kJ7r-I)we$EF!pnvp9CD;E~fEoTd#g{5F#Zbt)P8;9gY`Z_KaCH4GM918SED?6!E#=upUSyZ za5rC{2ArSXQu@yVj`^Zh(M)3bn6K{wJ@)Trol2r*yQ*V zHv@h&;8>1jARqHP9dIniS%71H&jtBdj?I9-2KHPEa_CX2(Ed+5_y{`3=?f0NhlPWi z9bDrX#}5w?t@_7@t2`E$3H?aXpDDeLOI>;{KTf>Gc3AVlIJT>MF)<}qj<#b=kM$kL zZ;#M9mHP=6LW$+@*jWA3S9^A6A(UKu##z|p3+>T`NFu;ajaWj+V8mj(dQZ&=Q+#v`e&%e9&Hz0do-?Gdrk*AN9}+;MIZ;m)#QDQ{+!+S7^f+HT*MpxAILg0Fa96(inekuHPyJBj zkuw%>v}dvhKN)beXO-ZtJ+}jnO?n5-37)LwxO-C2kHxykt=U4Ua87O>%zT>B>o?%F>a=+XXKphx?gJoqxe(f)&T6ZW9|V!+Y<9uNLk zz;T?pTfc;Sl(Q$`gCYJ803799YsHv2yp8s?Uf&5gUSHz2mlOMw-#Q&^j%>{HF1v&0 zwkqc>InVU`c7@XGo9=G8R1ys*mV&0*xm0`b3joJ*>F~(E0dVx^4?J=n0vzpm z#)IR$7412KGen8=i|xiq9(=6_e_e3ipnUzNyX#M_?@W*O^Y>;rxp)cSD8B;gBfp)j z<$f#Rn6DQB$MWsZ22yhE+yihdms0>oz1IQ$8p%_89tRxdJPSD1m)`-7^@YDz!HG9W zztw{Wp8BiT$C!=Z3Q{}uof-E3?etSz$8Stu0Q85_F(=0PEhVKNW6)GP#|zH#yXmL& z#{tfLqT=O(vwXfbrTE!^qaPLm&TlCxeLdhfo@@mi{X9}|w(}wSsT>_wussh0KAHA8 zG5!kul)jQdN-PJ*jTal#(qo*QDLB*foLA+nbZ{MqWm1m+59Iu>mE#fMH!MeuH@6&T z3B6m6XMr3n$7O({e7+{eiREDVY8-O;a#?Hn{($y5DX!(4XJI1;<5ue_%g4AK?x8R8 z;D-Z_a`1Wx>P5dHeL2WMdTv`dv7P)@pXT>$!1?Vx#V;4!tuJ2%dX)cd!2d`(RL&0p z=eLs;|Eb`v{L>hq#CD>bvjImr3j}xN><;}4mb>;-F8x75&p6MO)XtAPxR&<>2iNjD z*}*jq<~X>P-vH9ZiSz4g|L>r4YR~^#yTR8OIdQpQz1Hhp>^E%xb^gdWw*PwH*)8`~ zM8}EgF;3>Yx|H%Ies7H{I8W`5%>+uu?%p$E`;TX<$I3MyXCtO zMWDy>Z3Fs6w6Ep6*1`KyzW)bu{@2R)!%$Dp2mfO|W&ERZOul~W8*gV)Px1QauB@jG zP`+zvpA)y|jQ6E{d5ov^{eP{V>b!~lhVAfVI_AXfDz>+My^r%1BPF#zy-0A@+e|<8 z|1A!#aAF+i#T>(&7{_t-QiEC?$N6Ifcgyh2@p1bAv zZJ@_;yi#zc=W8HZjy#6pq_~!2Cga;55ueKWZ)#Vuyha=Eq?Q-fFZA=VKz}LtCli0( z3H1N1{yaqd!*MFQaa}3;yPY)<*c&gW;}!UcWwpz1=?48p7r4P94y+&>&9?$?V0GoO94kYGX>{3 zM0>9A;P-%>pAe7QzYTDdulMm;KKfxa8&1i!f1C$D4seuzmf)`Z#en~U^r)S81CII4 zlIxQ!2k8d@j{V?XfFu2ZfaAFLP{2{n2Nj1mv-2sr<<7Qoa&i5#GP@7`uV1`l9P10- z*G3%U6Xi_v#M{Ll{6`RPcav@{-!}k9`2(QbF%C68UHglK-o+0G9OX|F+>JwBXWfmf z+kqbA@KwMuuHFC~dM*a+_vd+V9s_e?IXHj0(xA3I#Ca&oeST z*U>r6?~_bSiS1$hBtD?@QTf_==zn7Qeu2s_s(cy$sC;*<{^EEK>+dqIG?cg={gi&{ ze|;|0t?!RBF(tQN|JuSv4%Ta3Nye4W&uVgV>-$^_8#!O5eYJ<%C{8Sg@sHwR$Kqi; zJCl-IzL#4#1^*o27$-QM$9A5_9-LS{#sl|3oZNWOFDSe5aE>K6^k1WWjR#%9gXJ); z@z4+Gk0V|Gvd!VPd=I`C;KvjFR-rEh`~;9Q+Jj^L;_;Ho5%PeueX}0Gmhm$BS0GrP zY#Be1|2c^ve)c$uelpPOd4?(gS8)va&50yioR8#B+d;0(?E-#enPBo}r0=PXK#L0j~la z?bm12nH25s7GB<<{VxGtDEr%E|8%ei?LQjuQjqVne+tl}{XZ98-k|-D0bVHkEaDW9 zgZ_UI=yjJ#f29YsEtGw3ANZ$foa`_rQwM|S^Noyi8>H!zvctIceGIJuJXiL4^CiHw zEn=t(@cy#T8y>@RV)+^aeB90dC^4?r#Q3;}|50LmpxLwk-j#jEbqvfk z`RQ&7(w5sIPE0?lS`b8CG1KtpN& zwF14q+r?+D0ld(Xn*UvZj{y8>z()eE^I|?-1URo#%8Btq%%1&sIN%2ZJ|1wU*RqTQ zu62;vP6J%~M8=l^ei#FiE(e_HRsQvWAFjl-{VL!(_vF(L0{(HJ{{`SoukyPAF9!M^ zz)Jwv_e$7r8Vh`SA88aAXL^-?IN;j0F#UMIb*#ns*?=F#fFyhmh3Qp3zHg#!GP7I` zawdrk-aG=hUK3{gNx+$2>*Q;IAIpT2?7E0He)JheJ~dYwJNCozLd%;~fS&;PgMgn1 z_!huR0WX$DljWBIem3Bf0lyLODS$r$csbyC()hCc3c$w!eiGm_0G|qY6X2DAF9-Z& zz`FpC1O6!BOs{Rz%YaV@`qu&1Ye9T^oOB+XuPUHF9&n~t`EvoE0rWM1p9c5}z)uIf z9q^feZvuQ4;C}^tHsBKn*aNoz48Y3(p9}ahz~=ydIp9pM_2>q`&jR|J0M{`9pY8_y zOrY-poawa>%aP8Q?bl~%n2pzS$M|hTMqaN z1|+Qm{89yJ`+dMy(6KZZ!6SgL1o|fdUj=xc3|={3R{%Z~aHbdbU=-k21APhL*8n~b z@T&l?1Dxr_?ZFDbJAl3&@YR6d1^A}{zaMa>SO07T{92&@1K^(ld~m)!VE?QEd{4kX z3wSBup98!S@aq9z0r+)*w*$`fyUV$?fPWF_zYX{efOiA_1;Bd%XL^;d9RcU}D?mR$ zIta#Z1iTdRF9Ti)IMeST=jH+ab)c^Ud@bN>0sk7{ylx>Uwr4HzeoIR*hJi8q{Y&{eYhuk3S`DPWCYeUR!s;wv zl1vF-2{xb7_Mhd|CB~e$V1a!4xti>)uVsT!gdu8fWV7{@tOr78IF}`3Xmyz+TbVsU z<5z(+J^^N-9G{IMz|bTKa6T9su|`Q`zB6D;Qe!e|7s%<|PM}Ek6UWNJSlcPt1SQavgh@iHH`nn5h>z8Y|B{M|CnoHpGoJ*IKVN>=( z;jT-P8s19S$0bUV1))k+hfAL@CAm-Du_bwu?SLSZ=`&pJbyueH$}UMU$a0F=y+ zO|WMzpkxLJasRSFz=E9%@b0vwfE5( z>hk)hnd$YC!lVhV3_eLk)C|`X=}aAAImq&xm_+2WCEb!snNOw2)O5mn%}ILZG}Wn( z26#Nai(!7TO}0ZipIs46OVX7p zzkx}dz19SWGQG(TgU@zasH;!anHToz)uVhqy>*V5G#s z@IHm0u2IZK>~n4~#F)beg=oS&B8u|EU)C>LkImdF!~=Ob35OOv7AnVsCEBaX^SI-W#6 zFw;>B-=)b(I(8>7>B*yVlb$P)pOl_xdt+Kc8?(!}Hf8zwB`sFe_*JyRFRFffujswn!P z!fRRT0*t*F7D1fWt_Ys=4ue%6{pKK1Ix~>A59(=Y$qe)}RmKJ+i=-9qn_JtO##B$O zI(2ec6)mUOHov;EI{7*djZAeWSl3Y3T3yrJT(jKV^VM5g+db=t;ATQsJ+`n+Y!s+($?TN)c`>g!sUS1&CN#w=)DvZS_w z9%*T4Y^@zL^_1C1Q0uth0y#dfp>0f4b0aaeQrl-jzIJi-qUM?j}#dT(>^{xX=xkE%X1Z5B&3lZ-3ywrw{y>2%kJ=6tMp1 z`oOQxuA%;W`@p|W^dtX$ec*pk_|g8ZKJY&s!GC`r_+O6Tf1nTiZ$|L*dsiAay7k46 zzGsX1=l9N(Pq#jPUaNr<#xH-*Liu#-{Y~Z5t&jik2>y+I zuzy?xKfe#EdUfm5&$eDxYqB{4<0f_4E6n%BNc& z|6Jim{rn!E^6A#czc4~SzelQky7lqbN9gDGIF(PgKK^A9`uY7+<4W~C2|vake+NwU>ei?K z!3ci-{;cxp*2n+2@MHWw9%27}gfXeS9z=UKZ4`bz)~ySVpc9P6lt8wb@*hU@?4#}F zKb&}3e?NXe7*e+ws?X!=DeVvRcn0kleg$+Z@{ZPH*}DAG27rLRu6};@ zJxYIE^e+=e&i^Rdck};!!dQQ{WB+Y(?CN7$OwZB*V`CAd{d})}|1Qb@I^pO1bF8}g=QfG;yZN6i6@q1BVp>exCo|^SKSTH{k(l;f z``NB2`xnbg3TuR)>5im**Z$d}-?jfsqF>t|HG^%%#OpLO=GuRU@c$f%Y2USfIWb4s zzg6r<|8tDE_J3RSyY^o!j^E4C&$eRvlkmItuMz&6keK#e`@4xh%Ko)nu_$$!|MdL? zq8m^9uKoWO{jU8b@;<4nkI0kKp%mwgx%STx{+p7hQ|;&X#iQ(>cfDoo5`MOSBJI2O zpDg-a`*q#7boO87vA;k%G@f%|a^+p@vA^*1mTRLhv;D`?zH9#%J@)@n^rwseE|2}) z8QT9-kNsOC>^~vG{+B)We@))2O=tfeR8Kj6xNc$kj_|Y3FflDB-JT%)l3ja}{=Xvp zt3t%?khw`|67ie(OG4>eDDo227QwmvCeyxKev3W&n}qOIN1+=(3q1O}sW4^v{rn;~?wC@V{GsKI73pH$wku z5&G};=x-AJ+~;6&_5aADzbQihOcLb!|MwpK>qNh+&#mV#c=TT*`isSQu79&5^beta zIx7CVM8AG7Onu{{tENFPHeE%70yi|EeSGFZby0&d`4+dh~CM@Lx@Y{wC4y`tKNd&pTcG z-R80Xbm4c)+tstqWB){Xi5cT>VTApE^yqIA{pS)7CfAW)uN6fVp(eZI>i>pE|M0bz9`&~omS{{db7|bpCJf=${v%|C15=Z};fe55c6%|F=E*mqqCRRD^#1 z&Jx!NH~yQ35lAUr{ooii~f^B z&34DtzbElW`F~4<{;MPOpXt$GEFWq)CyoBu9{qVYS;n~VbNsbO=g#OVq&m-5Q)c-A_Uv5K4E>g!oMZ_Of z{&$G}HNwgM|4fAbt3ugmwej0c38?GD?D=}nLQUlaax{(Hk?f9cIu3zpw?1i9_k zIW$j+^4}ezKb`;P5`UEcnnXYP@A?S+cZq)2e`RvxA)Wt|ZDLchU7l zP8`4d-7439o~N))uKgp#@jT|iinI`=1{g*D`&&f>| z;O74%;*To7#ow}g`u$nXKTl~?zm6+EDf->~KRD9zpOLKIS)?%-~iKCk(A=(@jSfkIKl`M;SUH~+chP$qH0EVx7TbDxLF^*`Ux zi>m*@_bk^sVP^fe(7vnxK+*5!YeJD_l#NKSwuT3^Ge!8__&ZA&sd-6C;*PK!+lAlF z|6<|4Jc&E?I>9PW{?|$V(f{lVH~+u#=-(pxf9&Wd@}%^0kN!t)vt(UD&Hm?*aP{}6 zc>?>y_5ZgHv5bcbzi!ljdOSn;UH|=3_)k_s*}8hB5q}PyD|P6ux!nR?g0uacCD;Dv zJ^Bm9@H3_T6EP|GpP%;VkN-c*af4)-^)uw^pG6g%N!)y0JlgW}HA74yE`)v~{BHa{ zFZ^zKE5B}YX`IXZuK)im{FjHC?2coC_2mCJ z;ZNuPn>_hnC;3PJ|0E*+&wKQDiT+zc%k7Tq|EE3rANhf$?-G9Y|4(V(_5XXK-}V2( z!!4tPp-4&f|B*CKXJ5Mh?-YI+My2qp|K|$78~?Wme>(rqB>t%QzvhQlCHnt9g53OH z?$KX-gyl~c|Cf05uj62+gz@4|2`a{|4^#n980eM_Bhfqri(M`>#446z46ShU)9%qfoEvLO=>Mna*wz2A=y&s#Ck{Q-NJ;!t zzbTTxxAnj4zcIp}&VK`mKgxeyVn6!tnF#w&@aXRn{dcONvUUA8$)msfXO;o|_gsYj zYSHidZ|PB%Kb`+p3%{5vR?@epg`b+Yq@@1W?L)%v`u`5$Z%X1$jo&WfkMjRD_gKa} zQN;E4Hw3xy^PWe4;W*3R;^=q%|BgrhntLr{T=-f4i?r|RA59Z^HqrI}=S08G^F@rI z)qUR16MonK-xdBrNKE_Uj&S=0;dlLir|_rq|7VFm%KsZB|LFfekbXD+k9+hNkGF=) zG%C!6>;DZN{oOp+q10vm+v`Vvqqg^OkGBfH>;J(MEJeN&%2xSxJ9=MRey;!b7yfkqFCzXZ|K~km6{7!N zC&=~xnI8RXME{wN{jUFKd-NBqw~TS&=l17~2>qWD{jUH2Ec&T>BqjBmg5MK<*Z@@tgQ_?C*ZaT8R1o2SINBmx+G& z`f=9@mVcIJRJLlj!t2z21!TL&iFW4-2Y1X2zM=Lzbc-Lc0GAsl-u{!euKmCF=wB=P zpE2Bte{TG|;L*SKQOmPVSXuwOwD0QAqXvpibo13#Y8el+oAAG6Cp?}k{BE4wSZYbq z`R{n*k7|G7JXxZI{@X^!uKmkA`U}epdyvk5EgtU13CWGWY~qh9zj?o~OdExl z?dTVw|1i<-`tQCemT?s5=3U2}V6MmhO~Rkfe=|MyPyD4-jQ->IXWjC@+M~az-0~mh z80`A*3XlG#Us-R%`NUH^Tt!t$r{-wPi5yM%v|6%+nX07 zw1fN`c94I>LA~40zQN=kFWo`@UlKpLHRb-b`foQ>PW!GuUlV@U|HH-qZoIktuM)p0 zf2aJmNck6wevZH45#>LyFxvi6qJKyl`$r4EYyU*y*Z5O0uKh*CA7y{xla?bcjBNjY z5%$N4pWqb#&k+6T{J%)}UHj){XnzgyN7=tP!u|sz>|Z7N-SOKB(NEK(q~ylK?ZWTc zzcxerzfJs6_TLd<|A+|tU-am|OZ3y}q~wV+ZAEm$aDa+9%j2wT5MCc#w(O)>#GN#jCV#kY zrKjEFnl${S$|&1H=Xg~bepjD+d>ip|o`yMc)qc0WE5B~<6Mi@T@5nI!cN2e9{7-z^ z8l-W?0BRUH%|$DV}f&z~$eY_>KQmploM||29bn%Kqc;XDPq>FH$$jcw(*Se6B_yWNA>8 zb#NA=eBFw-N6D5id-E}0{+dWX4g)UAO8PO*OevW7w{i^84_=)r@rQdY=okG7;>BsnK^gEq?GwH|IUS`v84*mGt8T8{~ z{e&E!N!zpNcQ*az(XWPn^XbR5=g{w5`c>0!0sR)zuaG{zbNY-I4Wfk?mh;`#0JDyKLX2 z?OU?{wru%&)mGVmN49(o=wGt`u5ABJ+xKLDn`~Jj7clG1mMw+OLY-^J$y;`8y2IeGE+t?~A~w`|K!kQyF7KYM0;VJnNio-3;1fb5Dlu z5}P-OVvRor0m;T&Nmph2yLYqR*+$C-9&Q9%^7+XVYD=zvVAWHt74eQE_$Yqm>#c+0 z9TilAO*Jj)y4qG(!beoKcgHtW)w@qx>qWm|y@`qLw zXcO0N9n)Tsr_MNMef~i!n3TQsH|5SX+}sq9Wr^Y*JSY|fBM7;OIg-AMSw(sI*WbVD(bm2BNLg7jn}A!B>Iq1bT&?fKD?wW z|4!39t?Ft!Fy3h@s!*%0E4%WqJcru8s`jEH3AGIrE-YV7rj{cA%KHhZ>M)8Zdh%CY z&N?KId!**EjoN-PU}5~@)*KRGlyp;^kK#trv^(*Ryb?QjLkRO zcI!TFDh+4J+cch{#?c%|fL6BW6iF56IgO%u5!I)nqMwi*K}AVdSx0Np#L7-8l+8o6 zeO~#Oto&=9qx0qMU6lKQrTN!yC|$L!_0`JGON!LQ{8ewhw{2S{X7)Trg!u=R24Yaj z+eXd?QzWE?3d!sWkS%%1wCB{4v^{E7`z!HI)7@GhNG$anY;3Uo4`w5?-r2-%+0_&g zJ@5T{+cqPbqmEo14)Egb5B0iF?a0T6(3I%Lto?%E%Iw@La)ax#bFa+}zLuTy<=o(B z*$aZ;omlSMIl+rL`9Wa%YVr$zc*aSlKhTl&Wr>k>X|Wwe^ZD8BZ_SLi|I75`9sRe> z(8e&{@yR?Ib?acfbRxI7$-{5kUq;CieTl|to+YhL9Gf8k@mDDwV}cc;$)~q zVODl_**RtB>bR(n<3KYAyz)1#*Tma@Z{%0DKSX7azp9m5HL>8@wPZo$SYcH9Z02A2 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∓WJzmUyBQhY{6A>ESE7tepl)NtM6I+R=R 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%0D4}JV&B`l5_(>bRG;QpFP28X9PIU!5*hv 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

Dt% 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

^ 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

j^rbv5tH8+Pq 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ξvY^6f<0$i@cJ_H&t1V=0;lOae3N6xek|`lP`1K{ zi&G@!yypr2cf3gwPa` z#P-W;am4)ZID;k7{|d(IP0%wZ_}_Vw#Mm!%X8r{K`&-BV4mZihG5Oy|@XTQ;(H$C8 zuD*?l6G@W)Q%C4_V6Z##!aB$^VY`)Q8s;N@+iygO~q3G{OI_&R|+< zM*ZYmPn<9})P8azeI@jpO*EI8(u1%-L5Dh8{&zfooL43M?;+K>Civg6agt zIc`k7e{T{0`)S~FzvF)e|NA!4BKc>k|M)2WPWa#bx%l7l8XpP&yTNt%==p#~f&M@H z6#+cv9;{XvOVEV)0r}<-z{}XL3E+G2^kx0basIE#|320@5B~Si1phmJ0X4$U!3aM` zMtGdLc9;H$0?CMi>s=SECF4F{q-)I)ce6M_yA+EL1Wl52dQ;D6`1GkSPG9Q%Lf z@IF-MjN8sfy`Q*@P9On7LnW-Zi*x!Q+Tmyg6_xTd+ zjJS&H-(|jIM)AL&{6EJ3uEulQP+>b2`Ha-O;>*Fh zu2^nc$uav14mjwTN9$k6q)3EE4k1~V*9V#pN-{IG74&dc>{UDvp50QP87)c7a@iuF#k-Kfg6eP#2*) zAnLj#d$}e0L29qSD<(fkSQQjfy^8r9#Y+SVuJ!T z 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

OV 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 z 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�mVw+5Y0N6Q1D=f2turkQHwbg%g@*c1avT4S7T1 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

}|p&@z|>u6qtsCTG0hl z>gwyc#kae9>ig9;iG+J3xY7$R#YYs)MA==YHS45S^lPXZ1 zI6H{k613q;KdvK|?SLg9yH+^c=5yz}TvfI*3BMf$ghdk-s z?#>j|MBXDYgRZ{BmW9~5O84y7>+MFNOem52GUEqZ?i?_p*V>EOGFa1%eCdXyJkq@TpvD;w5_AlMxSFbo zl;i~DO@|E`b}g4Cjitpini1jvFR-kxh}1PjXnRpyU+TuxVbGTEalMy*=HOnEf&jWDz6nyb&XN6 zaeJY4HKI<4QHkge86RIIYPXZU(Be}M#|_^+21>MYjtzOg50oW5bAMB3b%k& z&JxY;gvm{f(dxR!aD+PuxrX2XkDC$9<>iF7>XYjh2ZQ73n0Ka$UEfu8jSHIut0gZu zwxljXTS;xP++)Th8&AjU$Rm9%b)M8LNUTPlRz}kP7+ORL*H=WEYG|8!oQ1k`7N50L z0>rUxd*}l9iq{F!+x7yWy$ckC8BR)*RX9n``0VOWN>0b-Bh;unCAnb#8*(^dWt|uV z*;_85!1LW_6i?hvE>sdfk1Nh7p17S^aXjubj+hEoRV{8v98}gWQ!$AkwwgjdoI6L+ zs`!y$!md)*FwL0F*t@FOaceOQ^UOL-4AQ%vwn-{2-k1_-G8t#BYie&JFtJ!#672Jl z#wVgsmO3U{AtW3#ClC?IjP9ig9!QOos-RgDSQ;m3FEgc|lM1s00^sffPm!zNM2=NF zDa#UwktLdxnE3lJJX@h*_o&@*6|ZVrvc@~ut?Tw!cNNT?(iCZ^j+SxnEq0iT>6REl z!K_-^V?t-d28Cw2{iNI8!MS``8XQ!KvaI#6641JuHwy!PXT(AvsmKn2Yz;|DzAG0M?X9SIM(Y)5@)^W=S4t|evSf;@~;6L z>2CoX={HN9^`igZ0(zA58Q>`AV9GluXFTKqj`ZrumrnYKfxg{<_qWuFesC7isCJ+j z@Sgbd4^ocP&c6VT`7-(QZJ3|r#GDPg)i70bdRDoOeZk zCE();SLJlG16TBSI&f7U>dj!Rm*uGP`@a+q$5Y<_e~yPkpxiMY5XX3+N3&_;fpJ|t zFs_RS##KCEe~tBM8qsj#_`&uzB2afbb~fPHZma_w+p!IRBmGv1vtI1KJ^^}^lP2Sz z>p9BdF+3;6k-ijgq;CTp>6ZhJ^y-PZPQB|4^y$JH%bzC@jfz_?YfhZs69GR$pqBmf z2v_CX3^+fXTH$|^ILpED%oYRvzkwddOaC$8Zvu|;u{}h4hLLTYoc>Ye!git`xGr;Y z`k@NspdZu|g;_r8eF@~ConL?)q*qS_XT9i$K@3oG;s*eZ^3@Xuo%U2ndZ!xADaWbT6jzS`J<53&>_LCNWWe7A9Q`@e zP+lVd$ND%y;!gj}0UZ4^ALO8a{s1`U>o0(#UQ@h%1@tHm?k$+UbJQZ*p zAD#p_*58HT2duwXPov=fD}WyTxd+j3;&Q}!74>E_E*G5tIS}Y^UWJc2u^cRy$r2ZG z=$wiN(|nz3hgl9^(OBe^=h!~v$ar8J+Y@?y zh)7QSD8Nw;)_0s=y+P7DOt2a3?{yN~5 z3{c{)SLt8bf2y1yX8dKqZ#3Z6d+9AXNI!&lIk6m!Lwa44NL*f6kJS1g(_@?$TjW9x z;?n^~`HLj(l-~+C#ski$Vf?HD`jzB!<)428z8dhLEEm@M3&3%{@gl$%80eP*{!5@& z^Z!oyTY(<+n&#!Q!2XLtzUoI<{?7qd^T3QFeT|gE<%Q$Ap8$^Iv~vx3JK!ki4-#j+ zST0emxPlI*_0>b$J-=5n}y}|7U0;vrBfa`F+H~ba{<2q{BSwos8_u& zljW=i`hNjE_6x5X@N}pz80R<-jD9Yc^sE=lMZMviaf~bV<{~HkT|~!;aenKgis#1# zYT=xBg{wE^I_deEg%jhrpXyozj_oS$v)TdlxXOBT<)Vl(3r2jqO*lyej_!Z#i7Xe3m{G1_5PCp+EIFBJ!c^wKk%0E)#?2bd} zU(puQzDn|(Lg_4wkOVbQ1eub@1%bf=YuSBggqGNqX5VHk}GkR^B(;xIXEwY za>_u?Z^2Gnze7LF0r}NHUj_K}faCQS)|bVg7v=v9aP;#vv3lB8?l>Jm+gnOo{1nUS$uW;l%Xk0{x*9cgp8E zB~DBqw?7;xE*DG2p28D~WTyDnUNZ zi*nwT-v+@vz+pgtAmBL9^CQ6j2=uch&g!vzA2;9=*+5E6kLz5s0e^+gDZl*~@Yeya z1svDEngQoIIwj{ydHuzDUk2RQpMFqs;s?rwb04|u?{>gZ{+@eKhA6Q=F~374?$nzF^r&~Dfj(rQ$MtlqziQtX z>&1OyzhNUOv7N=>w?7Ef!ZE*30gm(>+niVq(tjdQE6$5ZzG?@C(=jKf-cf*~oY{b* z-je}G`dDmN9CWT zfMYpc2spOGs-I$i;ymp}NzXXW>!yJHNZ$-NwkQ7t9OGHddprHp3H0cnj{!&j4`uR^l%CD1hm>%cT8UeqOK{=4G zD?!d*K<^&`NBi#v9On-o036$&?~^W0Y|na-|5Jgw@jpwP#bNuf4d}5Ry$U$mIgE61 zV!cRzFyKgEC~?+{?L!sNqa2P&PAnhg@ESBHr(T}ZQ#jIZ103bQ3OLe#X24Z@%X+cC zsCh`naon|9SmXBp(;y$q>nSMTMxs&i`L@LQ>tp&?c)A?_uwI-;9R~OvASVm(DByZdSY*iZcx>ie$fr|tsz*iRwe*H2mPLvQs{{jKUN>MxJgRX?)7#JSz(xdnyG z%N;?F^C!5!_YIJP>u5OcRo55XZk$N+)wu3IQZM7U-{vjAabL|>2D~51RfD+qt8PO;|Pn0-+p+8>-dK{nZ z1RSr&KLz|qklzpbYm~Dm;7E`A*(yPfnzvy!c>R7D$iZ=PA>gRD2ync94*`z$;C?wA zZ=59Qo%Wmpa?l=JN8SYa!uIEO!0)Aea^mvBaou6yXO0b3jvpHE`@tR@M|}wRI*>Dl z6;fhx_Yb^=>!dxQ_zIvA>e@a-0qH{~ds%{7rzjft?Qnj`8^_ z;3(%^1FoJM!}e?j`6tqEPK@6NIL0UD>%SGxn;~w|pPvGbahNCL#~IH*k~n{1JRbu% z%DDpMU_Ad3=rNw}1{~u`?aSiRSYAJexWah8OybUXz8dJ)KzVHi9Q8f}IO=`HfWHGc zmiuamEA;;@fTR4o0LOT~A8?H47XU{&od!Iac-{j3+12rU1Q!$~F5mT_*VI1W0db4| z>;xR+@Ov_@obj9s@rLnS1USn1Imp3yz8vT=o^J*m{3XCKo)<%0q5m%d9ObKZ7S1-t^YuWF@%$j*DCh46JehcY1pKqB zW{@rm)Q z+F@rr-w5%x2FmN-fTP|Q0Y|+%4ERTYV?1MgqW`hIMfs0G9AZ2_2{^{{PQX#l=LS5P zczz80V~XcvxKX9V#e?JLB?7hZWX8|MTu_u)&U(;`>&1wxed)~hcc6a<;u-y%1@VLN zd7{Lfajw>R`839Pn?cSaAP3`o8_;8%zXmwQ+dF_`Io<(rg>inb#GP^eFwn07|D-`Y zpxz9?QSaUcJPUA)^WRC_SuW23J(f#~oPgkLquv34WBd;R9OM58z){Y41D;I${|)^1 zzZU=J%Q$!X8Ry~A&+7V-{fzNnC*#c-|BE3GG5%Koj&f9-vmA_njB||t4?zyb;g^78 zIX(pOjPd`tA^x#FUjyYh7~&B14hJ0d<{0oXfMfitakaBtJ_33ym;DU!nFBb+|7gH5 z{zHJH{S^j$CY2K>b~m=$X9(2YZf^t}=RHPqMk%qJ_2B1M4ESn@TYmPeng{s1q1{e_ zc))nW{X94yQU>%Gw{rnUIqJS1XWZTi^cc6B0mu0HJK*Slb)CqkF>bFn#O*qW^EKel z=Kx2&uK|vFcN*}|0mr!gnT${N1D4BehPZteaMX+Q9vHW813kv=?uPipb{^#?({4Wj zelxY((i{=DC_j_(&xy+m?H?vk3rG920Y^E98t_Gc<2+9X;8-7T2OP&yYTlde#QM0x zQ19kK{aO$HQR}(PhT|wzzgRxDS9t#~)}!l~kP^$m`iSFvtd9>$dj3K=LuGuj9PCH3 zA#Slg<^qoOq7ZN_mwph3SRV&Uob}@TB#wX9fZvV*JRacb3aI zs4rM9(YX2(Z zIRF1R&?Aob9b>&SJ(uG+R!WKGqn%eUNXco>%@!HmDdp9T6KNSwc( zBV4U(;Qp)U0UrqM80tL^@PC7RT=zj7?_d58(Er6C2j{m@&Z|KG0?5f>2T_O0*>|ZcEFMT0l<-d4D1s|`%eTM*V#`2 z9R2fGz)|mJz)|nlfMfr10PG(|`hx-QfOtLv@OHq*1CH(C4<*j=GoI*Gy*?V~3qj8D zfTKN20mt}R2{`J#TH;Q<>wq5h-U~SDmDN<#U(~De!RJwL9sTCSIJUR@P#!rkz76ur zdj>c$eiz`!LVJSvKcOCB+h%o}Cs?mB-tGW9?*n@D zPa*gd?O!S#$N5G3FV7%=65|-3H%grCe31T?osD$NiRsbL=P*c#>0hRQMSmUm8T&h~ zYn)gP_IK<ICGvG-7Q^21Eznv#>{=)ul1K=+by^1s3=YV>D2XTV! z$t?!_O~A3g`vP#36X1+e;xEKU1CIUOGQg1@*QXH2=kOr@zCq4(h<~JCY`}kOz_I^A zIWHLK%Va&`;^Av96<0X^$NDlK>K)dXTEMZs><#@_T>JnY*Ukfu_K${s2kAqAKLv4k zBH&mbe-1dx`5oZcPHqPr>E8w%>8C)uf%cyO_!O}7T)?q?!25d8pEm*hks#+zz|o%j z0mpvrQNU5oD-!2;7!UPyC(svy-md^hz5Sq_#D4Zbi96*V3iK#{5!u0ss}1fCX%eV~ zuLpa6YrygONJ#%4&|e60_NHS_Z0E~#tlFz1B+mBW^?otnf2LzqkIE#@ati5R;dtG# z9q6wD`j>&8=TbPaoQLRN$=QzqN^B4IN3$i)UtiO|qCe9>ui9s)9DFVu%E^It74_B| z@S6k@a`xd$6U$!QN>U!dL#CB0M5I*_vt{H*rLFg@?pSN>Th+eya10bK3lV%!IE zQlZ^D5AXqiw*fw0;w&cx@RNZa+uNT4j_vJIz_ES6{R7yZ`~&FG&ZhxKJ6{AG?#+{VDd>--Y(!bwm4r`@#C!hrafquYLG#whx_#_5t_H z^|cRu?L%Mt@ZD@5b{N`+e*oUsKJ>K@eeJ_{vwe6Q+5w!O#C@B6?L%Mt(APeEH`|AI zp?#3cCSqOhJ;J}Rs>L?}vD#s+_aVMF;6EYyPbGa8;O~Q+Q3gC0@EIUS!o0-gdr|#> zZ^l2O54De6E`tmD5BQ`bG4!c{UOg+1S(H4c|InkH&wxG|IVStR06AEV`P?AK`l5=uxj)OI0%XJ5jkD zV32bV;7V2^IaxrD_GAN|jGXTQJ<1sYcrtPh26~jEp7o?;@OPqo9b%A!_F#R)_7L^f zuo9WDo-PDDOP*(FI^bA;4+K0H=tqH_Sg)@I`XZn|6zI|Z>wzBauLd0LUj%p-$p3HI zp91+p`zL{&Xn#52=!aB;oKm1iInw|~IsFWBDuEv5%mEzb3^2$E13k*A1svsIdyD=# z1?W-Eseq4!@!Wi%E$cP2J}TBX9?gTz|RI8?H_6=citbR6578E@GMEd(A|Ke{U{&p-vIPQ zAZIDyX#aA+(f+*+_U8gU+8+cQ8}K#*evSb@-+-qBexRYea-dwWybb|83*_7k_(;HS0vyZb z0l=|b)IIVnq6p;N2=pPqZvY(2McvE5q?ljzEQ^bp{f z--iLm{5}de=J#>Hi&!`%hPDEZ`F#>_%dhn zj{rOwJEs7>$<88>KNjfGesvEilcN0-fFAAt0pM96->d!if*h0mQoM-g(Lk^Cvg^V9 zK73EK+{!IPgrp#*m0Pd{G7oUM)mk7bZkb-qiSdbL;;f}pZW$KHC4ej6GNhg-z;Z@` z{f_~?yk$Wk{{mdzf*_DL03RTa`Agj|!1C2S0gR_hU5xL^fJ}n`m$!V0Gpem-dNtR_ zC)5~>aTObkmw=o>49GMc@WBeC@A-fa0lW_Ip@5$Q_+Egw1Fq&C`LvoFVLSH$dUdVJ zxQbyut*)UM-}0QhhP()Sv`4*>i+z|}jm`1GFv&jR|b zfR6zDX~44qSI-~j)87L;1@3Fe0lWb4g8^610cJUe0Iu$rWL(YV^64``&Y?iR9PrVA zuLJyWz}5S#S^gNnp9A_M09W^eGkq@L>9UeDuAUXZrw0L^2lOR?=L4?p?_fEqZQ;}E z{yWCiv$z@W06F6rkZB9xs;%Qw{{Z|4ikQCDbD3EFc)Un64 zPX&CGY^)hqZ9bn40bU05>b^pzKN|36pq~c#62Qv=Uk~_nz&8Ls1MpV>KL&91+#a^4 z0`Q@-vtj&Lzz+aiJ!6VbmjKTGSJzf#|G}&2lzUBbFC*X4dF9G}nz^4O#BH;CatG=F3w*r0=(60gf$ADi3copDV0cZLO z*+0Dk_41L-xO&DHpZ*H)Gk`uM2cvA~nSdV)_*sD81o+v2-wOCSfRC1g zT9$t<;32@z1N>OPmjd1l_%gtk0KOdXO8{R1_?3YF4DgMBpAY!MfVTtw2H+O}{vO~f z0ne0!c=p38!1o2b1Mt;=UkLbb0KW+ER{&oP_}hU09Ppfg^@HvC1>lDR{!754fUg1k zOu#P&{1U*KUiFbz0{$zY-v;=v0e=zjO8_64Y5idPe*<_B@ZSPn3;3mg{{-;0fZqZ5 zWq@x2{C9vq2RPGL$aAj(emT$&A7uSt`>z1}V8E{g{5rsY5BS}HUj_JsfL{&xz`@oJ z)_V=$djb9jz~=*gE#RvFzYg$=0lyyb?SS6^_`o6754Ptussg}9t3;~;A;VY5b$dNXZpkBxs8B70`w09{wUy? z!>k`{&trh^3;5%JmjnJcz~=-0cfjia-wOCz!2bdGI>4U*{7%6C3HV!pKMA;+tl@n9 z3-I0dwSF-E6yOs9|2NPDtL$vy2`i@4d?^<;f4Yx&oV-{3Lt9@fmZfWt2VPH(v z2{WeUH`mmUEsaE)BIBorTUx3Yg-aL5PV?DdZdn7tlbhlBlpTh>@nUtJR}Yg`r2RSmIaGyYO2C*HR0xH z6}h-R%sv!`=*eByxWx+f$%{2uTOjN#uCH&Zsg5>9%4W=}3KmXoYG|$xw~15a$+~Du zX=xYP@F>TfzvKlZ&bUW8$r& z_wxyb($jpRsNTt^OQMQ9(cTBg&x%$zE~t(yu$!a_lc;SvbynT!;nIdN&DD|Um|RV3 z9n6;zdtA7N+p&dRHCP6Ex7Qtn3p@%|^eUUlSFgO>(za+M+z_^_*re)~aQ@8JM((eA zR>2a>j&p)2m+`VoAiw5MuU=HTcuZYOq*`ARNkx1Cca6c^66(}N*F%klUAR5VS|Z7D z88eiGw)aaU)PuR6WxEY_hhyS;X`t^?FjXK=f)#z7U=ceLO2xRRuBkCtU>{DduWo5E z#c>jBacV?K!e}#CI4c~TId#(UO_5XU8W+uKrtx9v%xOHfDIi#kNM|i+iG~|W6I7(` z3Ur(1P}=mNTWEgq$#jWVT@w`pJYzss);0#mRaqA*4wj(y zqABR0G8vmdu)*Sj8BJs?U6wS28>8U`Mw2aLwbU**Sl6$KMInt#Kro+%E78`L=}nDw zH0nq!NlWY!DfO8gC$fh$E&)Mj-V=(_Q@e#aGMZSXH{#?%Q5%G&Scz{z#}&7<)GcbH z9$;2(Re}cJQFk0{UHPQBytE-U0b-42<7-2(prV?lC}xH0X^cwUVd+fnk;ch^>r4Wx z8yD4w%j!x?XV%RsFqqmqk~O)JcFc-KsLw2`VcYV{TAC))bcUP+V8}f{?{aQH4MDms zxl3cCY*}uvTk27)+e~-IqU}w)Xg54b>An%B$~0w4rI=2uujZib!qx&Ewc92qS>pCY zOYIiw_LHX5?ZSQ!GP-Mk-p^x;Ba!MQVyb1V=#=edqNTKZ^{)F8T{)AY8hT_%7u+tT z_9eY+H*j;M# z@+xX+Mq_eQgimqfGQFBQpEjCgC|z7Zw%D@{l~tvs71L(rSIrv7e`W{uK%~pOp2gqz zlDd}Wrj~GNg|R2^c^EpB^l}yojMve783>N26(t&!*Hzck%;AEmk*3p1 zXYP`07&W;vGtO$r#+5a;gd@??hKgx5R2iFibeX=2|mEJZ%)rU0hw?8m@{iX%0*G7V6x)OZ1sDAKXRyVqO%N8P6%L;V zyXmLkxNpx-PF=gePi_@G_tQ9zr$U{Z;+o9f2q&GY-u04RL(iQwzND#@HYn)46xZ_g zhL^Oude=<`6+QQp=Gt;swM{xzz3U~t23Oat>2@@n-a1u%MhuH{y`Zg|nUVu0?I=R5 zE#+2~@nuR+vy;4@WHO>PSCo(Ed62F|b=w^G7BJJ0PZNGxtK1U1Z(Oe|CAx<;db@k5 z3|Cclh00i?X{essTop{ItFPzF82fUbuJ7sMWmaC5ynNBmf!EdPhnwGyZcp{Nm-C(6 z1%|0D^jxzO3reQyXe7AnpodzWl)Ua5*279>EkwDim(J!Ms!Cj+d#cd;jwISWL5oz@ z4m#e8G+u7_D?4EZRc6`_2s`YoeM+UX>no-$ETw*Nab<#OJ59r`%Uw^^cQ;}*8B4B; zYTE^xu}D14(DSAz2^H~ed0s)qmzW6e>ODKdoD;XG*cF_$ zAn6|GYA)6Ch$<@YE1Ff!`>BuP_3ak1=VoSQ)vU4Bjsnw^oV;XnUL<{+7U%~u->wBQ z-y3ElHLf2&Gu%>BP5XOk`qP^H?8@2lCM(S}sH^2ls_?sQfvz#z)f$cM+pbm|D_buy zRZz}%P>1Ob)4GP%2B=!Rmpgx#SE?SV?|F^tq57E1xjLE0LWQNg8;9I%oQYa2_SCBo zsc5QejEefU(7OFgov`j}=Jh(p$5#n?`a!&=_H{Wc^xv>kUx@#E{?xT4&LK-K-AgV@ zde_Y$#TSxxR;2f%spqBitr_YX?zo2G$rO{;TulrlTj}+cw7Uf*CZu{^CcDI_-toWQ zv>p_IVWy?KC19RC>3Okyi>CHYVHphWL22pcX8sq8>f5rjcgjg;Z4U}bJGu0~SW4fT zp}kW~T623^PR@C*|Jic-HVo~>a&nrB<={}CiG7XtSMsRFN zU4*t$*rNCvMP^tl&BV~9+y!3cS`03^bmuZXsU=)r5oxNS$Gvr7tecu19%tX<(xaQ$ z3K!C2EXwOzqGUn>p~V7$xr#bG1Ty zWURA7SvQ#^jHnoiGcX~q1#s-7={5(;;2Xqz~ zggEr)1!@1?%hY)vU} zH2V3yqe`#(HtCu7zR1-`@lOPRWP-{H{}_SACoGtM{T}{&)Aluilf2{Cjxd zFCtn_=s$jsud-Wxo9r)_{8)eZovVsZeVh2_Y50%zz+W%4bC#rT+eVf|Pn>744d*HuY!~aJQ{Eun)_w&H7-UE*Q-`@lOTN?fAJ@9`i z`Q_{L#Q5b_5B!<3fYAQiJ@98~_=kJo&(-kX<$=FQ@?-w*_P}2$`LX@F#{>U-4gb9! z`0F+KKfnY385;ikJn*m5@bj2d!uGeR{;t*VKjMM^CJp~%9{BIp@c+#N|6>~de|X@3 zPQ(9%2mZG-{QvU6|D}fiDG&Su`?<#t|MtK?T*JT31OI3Z|8@`j6E*xVdEhVC@W1MT zf1ZZ_br1aY8vafX{AXzRcX;4mrQv_u1OHkL|GOUeZ<72tfA@h0{`Ha{+wTuO@Nd-U z|JVcn7LEQ-Jn%oM(f^qT{^vCMKli}@hDQGv9{6`^^ndAr|4WVjV?6Mu?Pj%K7(WpY z`~x-o?|a}Ms^Ndn1OIRh{|pcOIU4?-c;Fwc;s445e}Ux3`ggSl{vwV3Z#?jaH2Sai zz+b7+&vRn3TeZJUkG+dEoz2qkpgm{`CIt{%eQ_{!Gb_?e9qtU;&2mV}* z{(U^~7i#nm^T1!C(Z8<;{&J1}{XFo`(dggb1OI%DeqK{aHva21`Va8HAJynT&;$QD z8vR)w_|MnqAK`(2jYj|XJn*m8=+E)Mf1O7E!5;Y6Y4m^J1OMF`{fBtqe?X(3*W{9o zzpWbn`5wk^&uREC@xcFvhM(8OlePat4S$ITexJN>!S;KW2mXN?{u4d$57Y3U;DJ9! z!+)p;{#*_JX&(3|YWUCfz#r1^&-TDyso_7~1OI#t{}~?m>oxo@d*E-=@E`7>{w~w- zKj%UJY7PI39{AU4_@DQ{f1QSZl!kwQ8m1BKlfyl0&_7o>Oa*vD_825&&Oi|#&~W4Q?ukh7(qIA+W$*p*4ZDD_J<@t+kXQcJIjyP zG+DpX{)?r4HQtb71g$#eZ=O?Uey9CcBooTBJ|ms|A0_Gk6l!>N{`c)c$|!Xe|6h`Ro&VE$v6vFZ z|6l00)Bi_G{m%FqF7kGA#?|){_?9R^4WjDyz_Un)NTrJLA^#K} zxSRFINX|I`3Ksf{rYHkbn17~0H|6&LztEo%Zwl+Li0RaRyoj(WPc^O`?je6G%cnj= zcc%Q4J>)mBe7*i{MM9>0nrBk}0WZ#7$BIkVe}3$Ne--m5!~ebqem@=7g46N;5%(tk zQ!!4l;h(?<-;&{{aiS=HLjm)cf3iRk`!V(Z1Mu7GPd($G!mL#OuOMvVe^%i) z{9k$CZ%GmVXCC-lEcpLy!G9>m8AAUC{!{a0#*^v)Eao@c-)iQ6p7p0ZQ~#sEZ_|I- z25CR5nUVDW7lcjyU+ICr_W_cTJtbb`HF|@?MHVg4T)3?}|D;J4{NxKT1zYxv)`;9tb@&Hm%c zgCt&ZjnC<6^x>o`MQf1=HNz2FZyf1aaJ)uh9PmTh53`|?+4(w^?&vJ z0++78_aVX5-)A23i+JLgOn)DH$S-6@U4I`~F;LdH`}kWK9Zl# ztn1D!{~N(?t3OS2SQt*n|1s`O{XM4e8wT*%VS?Sk<2Yx)ao+R5pBt2H=NRdl_}}ut zzw>uelA70%{r&?%ncviZJ@cQN1piR*+w@;Tho#}> zF+bt|9QP*vDIWM=D-i4=Z5fikCjONk_*)<$-?}%THE+pYgz-TPX9N4F8iJ__tf|XISvRIF&;B6T>}SoNr2gBPlkA7yzc=+?!tzb~zkh&aOoqSKgZ~#P^55dY{}l5l z>wlhQep7#2ng2&p4W9aY8vHi>t)iDj;PmlxjzxbTd*GjQv=o^P|IzsP21zpU*E9dg zGMVTv#KpNIz;DC9onBUf%jeis{s9aADi8V1ET4yAoJwN<@qOku?PvM1l7*)MQGSUk zdh2}UA%7L~-yDl7LT3Iy1HUc*?VSJB%uo66Y03X6tdkHX6MykQ$(YRk?`M9q{K}X= z8UA~~Z^OTmUKWDW@gHEp|A`0wZ7Jd(jdd21Wa4jO{z(#sz(PN!{$23f@Rx0uj6von z{nPuyX8UtJ%Qy9Za*-67tp2>@fxnvhPmLm%0Tci4J@8NYvjjec`3e6a7W_T1PC_wF z{WYtf5~f7Q@Z^YSnz-9f&b(|GULhY z_av-SktEZ8s+m8T{SE=Y&3-1nF7Z#%^nauU|D_)Cn^^v7%&$DN{OdgAuVeXK48nft z{Eu1xpJw@{{l3QXReU91=1Sc;&H)(U63x_Kdy4pbfZwLS9Txn@Sn#_n-^4%kc!@C? z{)h+uYUW=X%c=;O`oGQte?A=+gIg_r<^1P33;s7e@MjH{jCdU9WU4Vz89I2Pnfebh z|5}5=#6JxDHvKm{!g&r zFGL4HF-`nKPn7tR+0QKIH}zl5{G~<*VCw%u@Z0pih4BYvHbniUv9Q7eHsK!gz#kqe zpZDc>%H!nJt&@#)PNJFk*D(L3(U>w|;?DxV4gZe6N=dr?4+F`>KaJ&^`X4Y%%1bu> zd(i`b8S`&Wg8w-W{7r94{7TQ%f1YB&e?)J){d74=3QpGl+{FB*{)5cV)i9b1Q~x)B z-=_c7jDI_G68>@v{trFy|C1*^=pN#n)JlwWKGvCumVo~h8He84)18U`Z1CIg*SAPX zMa)e2>HN8AKUcDR?rx%@`j^Qdh6iy@rYbShgY6#p%gQ8MI?hMv&cy#m5BzHwe>G(e zj_{AN;6EJed4_LlgerwK^>5|ng5D0GL`{f2U3Dw|IV`H|7;KZ^H@G_V?;41{VDvv^}yf6{I^CqWxz0J z=W!4GC5+$Cf~frH{RbsqmER!%NKwr4>t8M9d9@!3*44~!mR||;C(Hjk%x{+8MCMPH z|2M&JE59=O*ae)P|8p$)uL#=n-?YGuzqu;F{zo48*L@-J@1)GZQTuzb1^<}CrT$F(*G!XqFG?@^D^rc$ zI=^Lpv;C;9m2o~d7)<<+gP$O(eQuTVnr|fIO6Dj0be7SqKi_!Zue?yElx+NeIw}Z> zF!4`e{woi@ZZ7w$;xj)p_Fg7fA=zf z_oyTpQ1X@kQ|33zzggio6mFLPkHK#%{}TFG3tW%|k^NqZu+oPb{~U;YI*MZIZ_7Nv z?!dg`oWiY$E1BQK-_HEW>ff#4x8a}2fb{xzg$4i19{As#FA*jyzy3$r>z}hg@+Yf* zeZX(S-_8?Xz5ZQo!G9skPtgBDDL+~L`>hB5;3CPNto}Xjfqx1YXgwD=+0V5W{0C#7 zlA@US2QHEFmA%P38CQkLzs`gIMCMOceqS=bX@Awse@Bw~bI~z&{O?^MQC8?+5oUEn zsUI=FDZl7S8O0p`oAtL9{5Jb(p^yE*70F~o`?uVp|6#{UOs4#5mOl^gC+W_VeF=lDx9P7WH&K6gTJUGX za7FnU`Om#s;(yryX6i2s{5JcmXZgDR?y|_glI5HFd-u-N^yeIJx4*KLl0TXLzESvP z^ysg@XQKY@w&0(lhC=8+w@n>@^$^uSthgo?qK<*{+j|)`AKv(>V0WfSFZxSyb@wgv8`Z=qTPNua8TcQv;NQjaP5gH~F7YR;Kew0I>rXrLCoBIZ@Y~A2i9YrPrx6%f0Q1Eon+7dD(2tP zEj|I${!RqHE&uB{|7DqypX~2xOa32a`DXrSY?XZ6jYL5x+=_7g$r8Vr|J-ddhH58N ze8sQ)pEJMNe-<*onO|9|DmBM>0Q@5VF_H-FER->em`?epS0c^!YrrY2e}lh_bqN-+Bh zw<2F#X3u}mHW|ajtN4|FOgWdoQ2<5EUznu-IuiW0{I5DrCg`V!a8&-khfp*BTUfrC z|B3&Qe0NJP`pd~h?-ved{80)AK9#FUtzb@^cNasx4*5- zpG(8U*X#Im%o2%`ul|W zP5WzR{$%?50Q@%n6;{X$>H2%ef`4>~%g@Mv3(HTYKNtK$zQJF{@^$^ukubCT-e>t{ z|KabQn*LUvX1BjJ%%4nuw}RiMKi5svU#kWG=Ssej|E(-Pnf}_9e1m@q%h&bSW|4o( z>2~|u**7))l~vjGx2m7yPo}?N;J4{-MpdHz=tz-S{y+4P-^}tcJ&to`|G&~hem%=? zVs7gH=}3zyfB(^rLqlX=oD|&jm-$!m)nj$9{Qbah%YW|Z#QgumBEJv#Ns?**xh%hj z63o7t|1#z`&j}YYzZqZQR>=-i_zn9jWc)=Ok@QD<(TZQSD;Id+FJt)!D?uLkS9su` z!u(2(N=C_7_hAqG6B)nD5effJ3;riO@Ykn^|2+@B12<_20<+X8G;(us@T3Irs^a zd44Sa4A~&LET8HxZRsn1W&aO(;LoL(9pMgSe&yw=0Q-ORz+cGxN{(Vv^40x|9{8tN z@Y9yI;#cW@VdzV<@aQM<(YU6Jj-rB{=;ScG2@%~_Xoeter8zk)0U>|9{5*U@Y9x}i9hUtzdA+yYdrAJND==-9{9Id@YDbQG4a3ZfxkXQ{JT8x zuVjALC_g1%k-zf5zmxGV;fQ4aw56u_mHiw(*4}@$uzVFy$usTe4CXi6&z&jiKLmc8 z{m-igShykwjK~_y>XC zrvD`t`~xlc7qfg*|4l4E+4{r%9{ATVzggdv{*?aj@xb5A`1Sf*Y{CDs2mWT3pKSc_ ztq1)w_$?{Jo{}>PXQ^r9UT(kJ)_x~;O zzvm&}W%)toSDu;wb3Eh+$4mJNKjlAUk$08jI z{5lW$?J3Hi>mh%qMgDmf`A>Vu&!vxj!8LLDDNo^7_fL4pFXIni&ydN8^FNa;@;~*E zzl!Cfdy8|X{Es~3ujUU|w=*}{|745&qVw(Lzca=B9}Rw6`L85p!|Cr&PPNFd@sPj# zSgE)&kxJ~x%>Va1o!KbGb1uQJGfHOn{cKbM~?f2s$63-hads^nGv zl|RRWe<$;+c#5C$N>2Ip%x{h#9s1ZEoXKzAUk-ko{&K0Zz$yG>KeH_Q`x(nG60u`H zewKekj3h$b9Edq15q`z|Ml@$2^P6zABflc${$d z05tzqlD`G#Q*|e)F-i{vZTu5SAlygDpYBZlkt4?yR}8F~H*etF{9DacP2jM@&;h({On8QDZ z{|JZIz<(5%?mi9l`Pz+4@VnuiZur3Vj`R)sQ^%p_<>QK*L*aiuL3tnVHhkcBH&ba2uZW zPbxou!}NiH!8?`L*ZxL@W)R@ z)2RyoU8L91k+y%2Y{xkZPp<6u^EBtjX$Xn@H%frvE^cI$-(A*R*R8$7AGn=z)n&u< zz+n~0cX6{Dnd=uih|l-Q?H!el8@UpU9d-K&QPTq-HwSuD=DHD1SSlu5=~v2_v>|X< zy~riB@(;zGDYzB-Nv#wCuye9u{$z}ci4gDp8}OHpb7cvPcf;Qb`?8fp9vKVih6*1> zBec_06}b>fwG_)K?d2UA1)<0l1)^XA(Sj)t^r$FMMN<_%ob(wAR}@6crtOZvVb17f z@6@e`a?64dHl@s|b#@22G(Y`!z@sx%smS`$sr-;p|3~LX6bYMhO@|w)FF{Mt(X8>nGd=GGk%sdO54 zrUh=g7KKPnR-SBhHdl&9m76aAd9cXxN#);D?Nle*Wzi@vd%bSC8-7!y9|~_o83dNr zq0TUZ6{~>2T6YVRXEU(u1`IwriE2z^-LdJR#tA{U;p$T0<09a8&W>4dmn?k>uaj2q2=v||pTT&u#Ob5(fY8wErIlmOh5CN+GTbkkDFh6>;mKa>p<&`lNSYZDm|`>C-}?@XH~Y-B2vM)9FFO zySpsr)_UW&1gFgL%4cBd^N_xWc^xAX7x+(atU5N`EnUAj>x;@@dR>{@cnOMb7i!7D zKvzL|DHmmjEK}LN4XJLp-920sT_%-WB^4c^5$(;k_uXwfP?G}J{}EE$#)`nM;xA;i zDQbP~pB)`?T;(>rjjDFhj@BlSl-?glcz1fg6VFA(jn>=1(icQt994Z?RNvNhBpCu+ z67Udi1e2)e0cGD>b#Gma%tZlRgd2{(tE?_A{-(t{-G&{()&tR)xef0j{gFFbyWxgf zbBsURx{7WvyrHc?4d#UXsj&k+ZEI0+_7md@M2w508cqx`7SId+V{>Sss5iYK-S5S0 z=hZX}IX0wcev|F|F1_~EZ09N8V1&O!ljb~;(FeipG$#2lgJOK1(eLwY=O>w<{3&xH z2+djj@%wF7PyD{#r4GNXehS~;6$94xY)o(p2Mi5X&0T!#tlCAjvx4Q-q2Tm|b86~l z&Ycsioj-r>e55TLWupA-@(I*+QNQ&K1`CDL+(^dZg?R2_T$S%evdGVE??5j!t01>3 zGTUDjsm&cd;Db=ZKc8BB68eMD;lGa#zZcrpA-bk9Fga>;ss`)`HJ;tq-L?~rX5iWu zGz+IURvcbd{G2o-e_NN(=1nLk3`$1(dC*mr_KDj#FUaK^Sc|rz2io5>w_!aDynW$^ zRgGfIR~7E>hA;MuZeC3Qe49teDF*jiZiI%4aT9`pEXED{=xP2m_h^~dz%u$j^%#H@ zs~EbWW!?_BvJ6`_@ZQSks%NrfEp6X`0@% zH8o8Wd(t#53b3Z##%oE_RN4G$eCyH#NChpm>wVnBi#}u}ZbTZgY2Da%rfOsJ73DArw0*8_ z`>FQX4Zk6^)ObZft_(#R|Ty+Mud+g*KN zYVX?1ajw(hO#Fk?p*%!_d@zCNgyBpS!RskU^sz6Ad@`uMl>9MWz(*M86e%kNrW z(0^9cE~uM7_tI!%@o%#RWe+J09*U6pSl@w>WOS-!9XoU#ZXY`&44(dtx$ji|X_bBN z=l|bm`&0v@{ijs^WqT$6aifNR{m8i!`E~bxe*g8oU?=ihz1Q;lAJ^ZdWZx72&+`9o ztmB<1|0&-+|CRbur08I!d|tDWyJ@zaw7^n2fRVz|*J3PAMt54UuOikbeL5mkY%T> zr#NR3Slc7IU$!3mWfSCn8P0jgr2?;gkh(qH@1ZqRweL`i@b2~>_;wyVtr+GQ8--b-*YuZS7 zK0OoEm(ojK$aGfvh9dkLZ6vh#`Xl(mjGp*?II{8P16rDuZrT6)QQna(QTP=w#6n%VB_kKn@@J@LCM1M${m z_C|1d7OH2QBgpk93(~?Ko5bpD+GgPq&HKrQxK!|eHIJWHGwTFV)hmrhaknB~@rl?l z9Lf8I$$8=u_)ohTHDbijVBz=+7S5?#7%VOxIA~zeu|pP$+d%`E0L&-?hnjR!?Wi-x z(|O%yqETUy!+O4OX_uYlq%Fx!J2fC@f^a>)cJCCpLSVwm5AMi1}o0Nil+oO z1E{?E zH@gaQ)M4)o7?Z$*vb`xCX{{hRjTytc7v4y6uFER#UeeHIRQDVL#m0n|dW%v9WeZY7fa2H+Ot$VOsfrXg}n_LbfCN~e4;DgAF8-0yL zrgT^H^K;d6;7lc5+Q%p7m9DBZolUodE1Ork6Zv^((``zU?wUPJcSn+R)pr>?i?>V^ zmbZSV@bk{5yD~|->-I3+_9W@5?_*DZ&4{SN&S2#+`@PC$zb^N4UiL79pLaIhRY}rq z-otcvCP_CR?GCxl;;m*rFFnlL!*o|CNq5U0rmOxRkQd${<}-Vuhl$K*OScFKF5&07 zsFyK2L;HRs^{Llo__m-4=LVhHNaFb!^Bm>Hvo*#O0uS|DIn=?z(K{l^9CbMv&L=o? zm*{*Bz1foJeBwcfkp(Mc;hGWkx#qnCN`s4IvwyMs$hJC*B~k z(N9Vwg5txwQ8wpu$`Z&hMGP}y=}?_e&gTqQ!8qUNRK(q@8=o^$1*85jgwnNi;?sAd z@$`VtIZeNfhJB706-DnUa51iQCzeip`uJd{#rd3S3zhVCRsy{dlyoPSPJH^~659PE=GLvQGEJS65j9rLL%)rNea=PEunG(n>BrKEPk)w*7U%oaOBHcc%9qY9 zA5IqO$I{Vb_?+nR*0_{>PF>u+y74)SR50paBhrth6QBN)XgodOb1u_wqhX(OMKr7e z^u|hh^v!KK)>F@X&Q&TH=lh)cxO;WubFNjvsQ;-*KbB5B{-x1)dcfygr{6}yzUWLc zN^52Un$a$ zr4yh29SQM?;1h3vCO+~x-%lip_;-8If0#i3gTND`tFc8-F~=B^5IB+#b{dN_f8p`hQCK%Xt>wM+K^h*U@{KP%GQ;;&^ zXms;{p!38*d-{=}XK54}^ob;R(5gK>7W97UvGL^o{A{G4_m0MVo^sLPw=46NBXvODiFV4dTe~F5L^Iy-}IkF z1*(z60*~}B^GIi({fGqmUs133Pmhgn3pmCHh;Pg9 zSD^2o9vk2ye5I#s@FJ>oy8{TV^8PN2Uj z=(Lg`ol0lFu9SXkoT=!;1pNXPJ(}P11bs#V{c=H{6QwIjD+N6^j#Bg&1pTsv_)a&% zQ=dQ|B<9qi|}t3N z{cMrW1JQI;%U}#!mmm9ZCZ8)dgGvQu_|yfpC(73uDrZ)oF?RA0 zeybrgy|Qv(&D>ejQjI??h4|BxrZ~+bMybSz6GbV*^knfy8pq-VHZGDE-XVOpv$A@T zSB|2`J`u;%eD&#LkDuIWMr3Ty7*W>Mr+ent6R42qrGe5ow&~TUr)FI7Y}4Y|VkI}K zYRvHRs>zcVEWBWHXmWx{7oRX@Ufs;uGcT*1R#iLa!nzrWR^tq;8c{?)#q@JL{hUBQ zL+GcJeu~ADV)3Y0JS!Fti^bDH;^`pqbdY#DNIV@Ro*pk#9i(bc;?`@$36+b~Q@Mew zQ;LrtRXeA4{>+-Ob@OM=xiC}*?G+b|m@#!e)H<_nK_%S}8Cy4X&a|oXr> zEtx*Qwzg_+&BX#K0o`M5Y3a>eP)F&_Sv(uR(`HpKfwAW<)H27gxV9F-aMtT;)X8I(|GxcEy*?R5Szs>Ud# z_=Hilb?Whmxzl8oV!p)Ut#oGB&aRnvse@*&ZfecNlWS&NJbC)mnX?quM3xc739wS_ z>>;IQ$<)bHWm8f+xmHziNE;WD%1^L-7qcR<P3$aEts1^$EtM|yX$(sTaq3) zQ||o}L5>?Ms-HR{7Ol$~VZs^3MO2NKOub;{qT)daFPJ&GhI;eKb(hYoojh~S^tsfS zaVrq(`~^{_pV$;>9MLi%nk>IqBE>}`@$U50x)4bbBO+snF?j5Zxr?`oGfXx?QOq0<&EHTl0lw8R1B8 zq+4bGdyB4CTFr8CrC3pa^?G+U(<#2*ZhX&!uI$H5|7wr)X`h>%S-u65oKSxUX>=XW za1Z)v8eO;ZrA#NedVbZ4Ez$LM?;S0E7~yESq{#1?cIA`)YC#A2aBlo2e z+n=QzpTz6=x>2L+`h3VE{dF2$Z+~(L2%MQ;`qm0LlB=gbUW>2euhrt~IOloLmuPf7 z{r;1AQSBdp8PorOl=gR&M)#!RUD?}<%KeXGb;;+@{ z`gmZAM!ykZHBNYq>6Bk;D^xn4GoAELvQ&I}X`7r`F8rzLg!YYIf>iPKa-s7XHu}XH zT`!ji)6H^GXSRv1m&;=w>1@>KI-Zw3=x=Cr9nZ0(063DX*SnD(^i>}851CG$o_>y2 zUvxWE^_}AD_y=h9QK!rO_{8$6)Y7N1gev#@HM*X!H#EAArwb_n&McQ+8eK1!Gc>v` z_ZE%bg!B}i7c{z_&MO*SuP=Yq=z4v5U!&{scY4spiyoXWJsmYJBDPyKoNDie%H>>* zelWu1DED1jmeR}KjXiYz<=yQq|e_wr1tnai2qUa!2> zNRGz6`uOuKL6zfGef&u}BuDXS?9>_itkL4{)2FmgU7y1={iI@_G}lo2->1(+eV(f6 zCl!6xYVr5!Gf|%-H2tKa&*@tHefmt)=O|4-spymT5ck#h`0=OSex9!BCl!6p(Bkj2 z&qVtiqv=NztEc0o34jfJm|eW%9p-WOpesyWp6s2KJH46;_Kx&mg%M)(tj%>XVRb4 z(xJU?RW2PGT~A-xn`tKlxExLVgFWacX>>h({+G@Pb~uCMlU&_Sp3vyJ{?j!3(c^d3 z=(_zJpwadCeKfjmhev31J)JC4G91DBDXwp1^Vty~BAiJ-K#~Q0HNrbNeo&)7fUrtu zfCpV~Z%Lmj9ggl$ah|PiG@s}{!b)M4Td&cB947iD8of}X&(r8d8hwpMSLeGZo%=L;8Hb7fs7BZE-=@)Z z{Isv6oQ_|eEum*Yj<6^Af5E)u>G)L}Mf5WIfiv+-s-!PbH}HcTCcC9eIhsR}Bieis zl0V}(Omwayf!>aW{K|g^Dt_!p6F#-eDw|*(e-`#?nGdxzLiGlt2TiiE!Waf zHbeAP8odV**gc@p_g6&tTQqu4jlNBz_tNM^1O$$}JQ0#V^uGnkk*C@yy06#h%7%#^ z*68Y8Iij!A=m!#k-Fl5q@l}~^*XW0+$nf9N=&`qvQC@6h^jMA6iR~bbPVrUxMH)Rw z5!sb$^uCG+e}+asOru|-(J8)4f4N34(Bj{$(GS=-cE;Zt-^qVw#k%|oeE{$HS z(YI*y<23pRCCy9{!xksa)tkJh>^kEwP&l;WLtMuD7dYKlV-g_rUa?3?X z{uFZKOLW!d)01M2PVrUxu12q*i0sbP=#`2Hzh0w{(CA@}PVrUxt2DZ+#eYDfhcxm9{%VarR*V0rMpu0_J^qVEAFsuKSEEnR=(#M2^bj|m9Jt`p*>zJda0cQv zE$Potp}N{7b?B+OFB%QpI-6mEdTUQb4;^vm~SJc{FYA=^V#E9 zB!wX*6oq;tQob$eS)4|+`E#jaQkAir^a$exN~+(*150dbN~k_2ueXgQ8f+qOJkprq z#NID7-olem@q%|uRSW0Lnt5^UtV>mXQ%FT;XDy|~Wownw!7$HCSsE zimUD3RcLn!?Y0)}o-uhgchBGHd`GL(cg=UQ8s&*Q#Y(k%{*>~~RclXjy8GG{hb^TF zW^$y2pR3uP;NN{si$jxAWivUv@N2J?cdCuh_;y>H;^HN*JaN&zFvq_kZZs0|TQ*`` zkYZ<>Jh|QGFctRX8BZmZ&g%nJcW>%LCAWwAh_QbceZ*4fygvAoMSIaYlC(R!|1Lvn zEm6`mI*Lt(@Ul*)^7dVjlys4sWfgBHvLn^!m2QZX`#) zQ=xr{#9O#Ec5H%)4*<=tTR3mvZM}!OwC;Pcu_+8^oaPB z7A?sk(Y^gelier#UB14;Da-YWJzYc5v>?6`v%5sU6WFL}8XtI(ixOh(1;q>tMj7yj zTjYWpt#&E1X5PeA615~|O(*5(@!vzUBIED!BrNeH0H6=t%^JA7Z_D9xiL+=1wK8pHY{4Vq7vQPY%bb@~(^Qpa0;=i~P{B;)oS)Jf-VtyU} z>`w5nvhdI81pgWf|J+XSH(U7c>jeK+3;+F{;BR4m-F~P{QnjBQ7XAl1!QXD-|7j=q zcUt)AJW;Cn#laH9*Ym%+6a4-(2|(wkb4aPmSLZj>84apG4|Rh75Q}^|zm%%{0_NA{ z-_{9!b?#K>r|(RpDqsDtKb?O?C-_|pemdV{%BQmy6qUD25t2^*PeFCBd`?!~I(-o$ z8XsGT(o^L>5*%bBd&++dcm;mi$kf~v2CAQ_p~tE{R8gxDu<_S3|MMy$`zAl_6_ZZO z4EZZ5VK}NY9Hnc+KZW`4Q4!fU@&5vJ z8~!rhyl!SblB1u$QTSg6-G*PC+cf1-T-{MUCt8+~{~#O0J$ht>&GfRtY{Reql~FVE z6aFABQ~!nF$6tc}*Ry<69>vw&napqESLb`4(jy~mrdI`i8~*0AB;$7GC;a_!nfMp7 zeA9k@M2W(w_Cwyuys9wy4|?EV!~Dtc-{*mUB_CSQ@gD(sCjMtU@Xz6MEXnY7@h&PW9S13Ct{p;te6#Zz}Es{uRKi8xv{|NAl@;Br!x5z&laZLSP z>>Gr}JW_{2zMA&*cs!nf~ej2ifw!&LW@AjhXW4|NRL4!`EFI%fDGC zB5aob^Gd$Kzm?^$W_~LFVqB*D-e@OCzFGgavHWEAyNLM{+7ISe|38FbB;cp>i$Z?} z{v~_}s2R`65&prrO#F17(S|>5KjM<#vXLSAOL28a-zy{9Af1Tt66Wt~(3O0Z&KJyY z=6@CQtN(kVk}=Eg6Y$&eUviG*Sc2!|DE}q6lzdfxj{q}aG0X2KJa9N0&vd77E7}Fj zZ|46S=BM$M?i9cB?_qu}?r78lddlFuC`AU0Vs`EZKmMFDBi@?xB|(kDDgSg1(ae8~ zhx{g%Pv2;*OB)ME>Ci$n}GUfL`J0v5--r2=>3=!+ZTeULicr`8a6mHi|AL47CYGN}|C>GJ`zOo%>-w*-$p4n* zn|Ad+%TK2Np->!^NrL|KqLY{*FWjP)c@Tc@|#$G zGX3A_A%Ef&nSWjXr&;7b&GHlUpG1E$b;tRL`4jZd6NhB_KMdzXsVtC8oa@c}$@JeF z{5Jisnj(|a^?wFPrvB+1txbLt%TK2N(>>&`o+{<*`meUgU%>Jc^q)k3GIhuKG4q@H z_a7)@^ivVpSNT`=|Bgrgk7E90`hU|S|LvTAUH{{NLCIHkaRdl9{jXyA$@JeB{I>Gn zd4bHZ%lW4Ee}YB+xh&t*|JN*E;pAilRuv}y`^<0ZKc5+s>HjaxZ`%J*=1->oSHW+~ ze_4%0sq3F~iRi+qeD&#S*Z&%hkWBvvf!`+IohIeDERXb0LjqI&SuEewe>ZxW2TtLX zcM_`#lYa~IoBA(ge*Ik=im&7=``_e|f0y}_>3_XP{+l@ey8fqV@>RaR_K@Gq@{{TR za}W6|Ybm!*^glC`{;5i+{44oEytGETF!kTNH;8a5p1e!c|5?m$>c52flj;9D<~Qws zBJ(HH|25#Z*hUv!}qsq251CI59E z^0%^lYO{4`>VK|>{1Q?&oUVV`KQi@yC(AeWe*|xwCDZ>V<~Q|!3iIM)r`CD0jGX0u_(%Z({ig z`lrQSxMcc&h4~Zo&-}^s-v{%2tNxiknf?y~zfJ#JIsdx;mmoi8{-=A$-^%in>3^z+ z{OuPB^~Kr$Wfu9g&O!N4(0?DvpG^PnF@J*onSXzoO!QaTz4DLgZr6V`^C#2)k>I!K zKX|besq6nLkWBs0_mJPr@{{R*wuk(}SyH~sIj8=&9+xTqL6&do{{Zedlj;8><~Q{} zkolA8e{jIA|1#!JrvKx>Z`1!g&cCkzrI!3(<{^I#%TK2Ng&y*k%!V*HUH{kN-qimu zSiY(MtRQhGZ-2gEepCN_f`Z-QVVu0dud;jPpOkCYe+ly^)Bh0g+w|Ye`PcP-1LT|e zzt%(k8kV0-|5tj*-!ccn;B@`ph zdj7u;l9~TMuzWNBuN6xEb6Ae@%>1Wgot$W9IhPHP9HokpeG~t;3cnF=-a<)eVmg)I z4{@3J&w+e&feGg~>RG;u&&fpj6@47|ZS_}t912Xz{z?A-;8J{wUJHJr`3(D8oVCC{{M9VKnIn?^eum4`-&PO#MMp`-Wb%LKA%DhV$=@tJvHtRNgiZM! z9`cv4d=;OQiSn!auRY`!E|D>molySQ;8N)+`q2kS`!7-nvR}{gk1*(}{Z;;8<~O1_ z_cOmqSA2?I0e&puC(Qp=Gk;J;WMAP|+&X82-`4(?vHl8~f%Nw) zT#8@mPqZBhjOOncByYBGg^Gz&-#-BVm$<0xDE@=Es4RZX_YcAUEv_f|p4y0~a6QfU55sT9wVv;v zfxiLQv$!_m+JuYJ-HdAsuIF$)kL!21i2eeu-{X1_*B@|g#YOaOxL(5bM_hlx^)fD^ zzk=&kT-$N|8P{vLi2gdRzurrJDK4UahU;@&U*P%@*G^nS{|eXFxW2*lPh8*P zBKj^|9ULY?8eO=j!uH|Hz|{*^99|QkbTm$+3IQVqdxtQ+3%eR&cHQ>@6UvP7B2d}D*l`a_&FOFedmwv&%@98xF+%a6!=qdUBLIX@TcRtknb;s zKMU7vzE|fl7vX*})0VJ*DSY~lF#ep&*}nq*l^ni`{j1^EbNCweuVuf1{iW!!(sMsfFI%TjqEqVU%}y<*l&V=Gly?s|5o_7ark!j?|^?NhgY(H7yR#Y_y_FY z4gZH6{t^5C1Ai5V?_vMP@bBgDPuRZ?{{0;ODf_G8KfvJ!*?$QB&p7-r`#*>O2#43O z|0w)laQHFye+mCr9A3-*PKLOb*lhzYB-`@aa3<6sH?}`d_vb&Vj!lhr7cMa5xu!4-W4SzbA)#!KbdDcn^So zAcyne)AyH&-W&eG96kj8p&af5|1ey-`!vw!YwCNIqx<6K7{&HH_7r-x@c*lyKUD_w z)EUDOo~KF>(C^EP`@Q|#OwYJ?=|CX5lyDaYMR)87Z}~WmG2RV->o$DgM@$-DIBvtU z2!H%kA;Oc&&llXp5DGu5$Rb`<`0v8+=t#@yfsuEfzt}mnNJyaQ`{eJ_KUvd0``cIl zM5Cbn>}!Ai@7v$~UXjLMHJ$q{XJWKs~#_^?R@R}KvvR_3^o(fMe`BWLDB zE-7&%<@td}{up@V(}oRcZp}+>%@=NCudVL-_cC1HCAosXbW*|9&z}bt)iKCImF1b5 zJSFVXT)V&~w{h^7s&CniyjcH&4Eo(=&2^#n4u9bGXO_OS@YL~cWG-kQ)}8D|uFQ3p zb<`bH73ne>kp@?VH;b(BgN6O6Q_Dv_CW(3)IIIHe0)fNoDQA;5Oc(cpq3sp)bQx3p zpvU)b|0(iIqxnBBn*U>wO(>$HE>mV2dCjGaiM%3nODUULekqI9l*Kq_&+orXo*K!F zDub$BD(W+$S*@U~g7#tEaI>gO&7v-hFY4(76Z5Z^_cl_-JWF~1N8quI-;^a*MAb92 zDsrKJ^s;yAibIhr3Perl%{5`DQjdDFuu#+kRrl05P}mEP1G!!ZTWTZy_-W)`=I)_>1xh z<>Sl8jUS5{1bUEIPg5DWFzALW3jCF&7ZwCo(Cl+`&1a$Y@A=w>G({HXxRDX)0In$T zmj@pC?6gR)A~#Z*Ti)<&TBu=@Uvxc#*9i4Uep*ooMds$akx8x_KBgezYuK4~)#H)N z{gDwF;VTOApQa`p@_GrTP7?5Mx<$V8w8x2kH6CIsz+BM7TU$ znNc1_Q(3dcZ9IwAc`kg$hZP1A-&;>f?jEL$AYhy8>vFf@Ycq&JKXhe`Ow#G4IGAkIM+>k-VIm# z-G*krTiU+xLpQPjwe^d@(p*ZhW^9IAbGqM+WI^0E;tEB^Lx20brJEMzHMtSV*zgQy zZl~=;0`os;@5m0^-n_JVA=*XgY}xB|rEcVM(E{|9EkI!DZOEoFU49r?b~T8?dfo7w zA{*0@envr6c(yA`V4~YPY*$Bzz>PwLI+qep45SkWa@k9PWoJQKt=0IE?W-twv@a#+ zp*ECHD*s;jWbS-re#yA~(KY+ekm`=q zk^N^S+JC#W{|s32D_-`0I!x<1w*LqQq+?MzPtSn3=SA_ae=EaHTQ91>`b7szyZSUR z7t0sTxo*QVxq%+T+uhPF^V^~op z3A;dK|Mz4pPGbL-^&{249~T{e9InP6htMcP8;Ocx=R7 zv#5p-+-WHP!wX?5)FE(h=ND!5G<7cS=86L9g~VgD)s^{?iT>y`rJ_Jip)miFT~n-Q z@)Ogt*8?{lh=zt4M2c16Y1CVw_o1{&vK%t(E{!LkFXAhVR0hGBLF0@_WkD$g8~@~U zoC?&+jLPD7+WJN937xS&6glv;aIY2tyR4)f`4p-we!Z9M>cr$7z}ju6?Sk?d|OC8@G-bohhTBcv)TU^?L?8KD}CTzG&Z^jH_u zV*`vVt#!q>s-G9xDTlr6K09Rk{Yb&q9OcpYBhfDQJU@fcTFU-H;H!vStl-&eX63RE zubvfev*Vz27;SG=?iPG%_=Oe_COH}t)PqBDb8&6~<%mSo^s4aRTCaifD#A0M=5IAM zqmWxKgPy|^VaMNS4`9cekR4%_!X&l!CfFX+5o!-glcve2J^G4(K!JI&$&6}_){N%b zqoa-a2ucLB4{0c=Cqi*crnyJU)^Xu14DB#VmrD)C5YLEOPElh~HY8+_a(*oS*QE8q z)~`D{1aR5sZD=dvKz#4gctt^w^M^UG4Dr}Dt`OQ@R_SC>pzYzfWZKrtryJYk)0@zH zi3psaRG~`YHWfg}o%TRl&yeFx&bu?m`9WIdZ*s6nocC3>voWpvvpLRZX#?>4oAgZl zZb;9&HV327gAm^8>xJ;W8ARWh(I3AJnG}v><~^G2G-n=+@XD-S2)~p?^w+ZTR^>QN zU5Nfk7ovRCCGUxBXN{jy>+n13l8!kk&0- zzc@Cp>tu(RFPiD4qI_fhp=$Zij$9IJ$3<7m{UPm9C-#R!ciSJHsM^KwYwr5DGeSOU zFCz=l9gakI_@d0{7UV7+nvRUL^on%yO7)7r?nJM+FjP~;y&?w5x=Jy?fL&Yk8EYgv z+c6$0G#1w{YWkcX)2Hkg7wt*Ec(mvjJ@Rxg>v=EdtG}4lAYZBXkF#TjOl2Lj} zS@G>*2RSdUgH-yaZi1EwqTPgg0K>ufLsl)4^-c!VeCBcr!5`SQ613EVzDxl1$e-YIyI&19gWU=>N=q#U1 z=q&3gQ=OhK=Iom<{-4YjNw53ni;l63uy4L7Mz~n#`0to6UY`1Vu{xFc;!%2cD7Rul zSPJvE{$6#5w5H~7U7~K~Ty0}pS2bzNv(D|}ri1QoW|b^+sjkxsM z)~ToWF^<|F9E((=$Dy_D7ipRHJ$J^;VJOV7mbAJeIi zTkbmuVf2p(qklyB<&6ILy)~11i|dk2i>(@!srSfcD$$Y1DhD`C}*h$Di!w{&Cn|=pX-@ zq<`$}d=l;XzWL<;`FzsSYwnv*qFPeFxoaMteJHyZfIOSs3((%+4wTfXt-p?S!{6Y1%@P*}UHoyIkTc|w8)FmFr9PPV zC`TBZkYzjt;qvnzoMX;rm7Pu?WAcep)|zS6qqNvHD$CFS%8&N zA0>o!Kn%YkWwa?-5NNy%9d!kE77B_#Z0pba?6eG0U#IY_R<+V-Ec<*O?S za4xKa_IIu}_a&>sa)W|aq+J@X_r)SrQ{p}v4M#7-BP9Es{}0=^^5Qb&Ve9E!7$3RX0#LNCtd537&xMVnW1cV7`S^6$0pfg3{QhbC{Mf#F z+33iX!hDCoeB+OY(W{H znv36je``DXn&K~7E2Qzu@`^VpR~_av8Y}F}25u@aObWa1DV`^wec7b;M2+7>7v~8Y z|0ybG9KIUata#&l=jyq-xhrfvch{bXO$c$$bho?n+$y)Vwm^TP{; zn4!^0hb7RhStKq!*uX2}B_aWB>$sZQ*on0Js~xSO-CxjB-a;;;L|n@jGHBK<6fVbX+s--65XQ;sW6hNEN zcBGjRC9^6!R_Ej{n)fYan7 zdW(<3Ych!b=Zp;eevol2e%EFa<*CfPhJdp(Q^d?7%8slD)4uHP{J@`!o8S0P#P7ph ziLJRSMGbeONH=%O`*pzC(v8?2$R^68*?B*Ouxz3{k<$y|Kj!p8oKJG->8JZ)6!c{G zojzTmbY>|L|>J_2DKOum4s^IH>iIZ-Jp&g zNVAUxAs`p0wHCy7_EOtVjSh@x#8Q&Vfh`PS+FFzDPiyClM9MsdStZ6t7mM+c8rOWF zjgJbe!taYR!a1!<9v_9mZ-myrn^EPP?H^4;9h|JievBhddbL1%A$rY39CgdsP6q-i z(bEnt2=u@R35T~>_2Tr_1ws-ESF&GqA9q~~)rixs+e)15zKPz{c56mwfET0PIOXnk z|9`Y2&vA(}J)$k$-I*Rb#)XmRhvIBB=RZ=J5n1S0N9J>JdR@*SLg7sw$L2Apzya13 z_d_|b3qK8yzAwYM<>8ST7|!_1!;93oD5&*6Fw;yQ za7uYRclFh(wK1?AB<6()u$BN8h>phZ_Vi5rwxs8M9H0dvgt0(`aB~LHUl+ga8Al-e z%S@vDHZ$)r8b2M3@ZYkC(w6mf8b&{l`EzmeivMK%{-J9Iep|ZsLevMkQKUz^<+UQ| zZY1EjY@%$-&U-cBEYBgz`#HT3ZrHCE;@q#S_(Ng5sFDY>rULLtPIPBtrEB0$UKDN$~ADM@D zxvH@j`ElTp&uMiA$DQ$(mz(wv*Edfdwk*B4;OajKV~$!~VA)&L`!zg^uIb~L@yXXx zn@rJl%PJyMa^wh%D;b7gh14|CU`)>EcQXwO+;lEUL)9;=h%5-U^^4+1hk)$4IL=p< z_8y=J$>j~3(jp@Y%1bu|8tKzCZe(n}TQfYTGW=OZ;1N11D3-CnIy`@L%{!s>@A#_H zS_nz58bv%o(CCaTUID`o`Yw?&j}op&2P|>}7S;1^w!Rg>o$XCWiDrAe7%RwQ^Jj}` zE{<1Kkfiwey*M|ox~tTV{#Ic*14E^6TX&#M)8HM#W#I|$5R4Hq%T0uKXly-TZ{oWj z_{zhhjPv}X#JwH_VopRKd* zMm!hFle5F<;`qk4{kW%;kF||twm&g{{5}0*zNs29cg*L>Vozu zu;kYkxp812VAjPerN z5AFHGF@9~3rneuVxb|aMlJ?_ZTl=Ant*-nRwI3Tr`*EjeKk$q81HWiLR&+u8aWKNq zW)S6tjJ&72ILkAM(vsN=;rgszh|`|c3n@I2(0;g)E;MxQrrsW@>qZ~bkn^?i#m#Qy zxF=wvPJ7_dJZg0Ux8cJbbtkrW&|F(Ky8DSHZ+hV4=0Fcj<|0@bfl-H#m0qR4xcPcP znzVt&!(S=3*q1H}5mSEY0_~;$0Nl+XUOt~Pp}1Kfp!e71l2Z6ncQY1zOi-7)5h)W= zvT3sJhJ{=upQMj>H&^@#>7m96LAT-SQv=u4W17FN4EZX5GKgOg%j$C6v}U*TnZ-M+ z8fUbqQ5emzLTMZE-g*9MjTJ?^ieCaHcX~KC6v-%1Ruxz}5r`<`p-4^vz9{2w%bng7 zSlbiv@Y)1kouHTP&dha7x6W^ks@IzTvy$h(ZeX;S<1o-SSP4T^0JkHZ)KuF8YJ4I_ zj+OcDfSqpm8F$;)q0*NF*V300y=`YSR;b1_&LUNhXH_qPYRUs^M+O^O(%fsXSC49T zT`7oe_+|H+cb#?&cdprpDTK4MIj}4!9>@_eR&4xk+Qv|L4(YydSMhVShBH0vZ@nF@ zVAJTxF$Go~o`P4-DzSVfD{yyVx@6qtS`DU`2CHN(RyC;gY0~ukuwh#C>C3>{%DC)a4O%Gta!6)36wB^(deHFhE|sokZmlWn9h**X^<;ff8BDJ$a~m%~(d|MlIT+|FC@Z3k*n;QBv8irZKb*j4<6tTsihugNVenlCiGjjDFhj@BlS zusLw$e8r+=lm%{>UAz-EhML<=E-X0va<%n@%-m7NhDG z`gOw_Fb1axYDG@PQ4J^hiv$`+Ao;{I>cj ze1BJTC+*qA;AAI2%Kme(YUvgpg)bc)M}5rz)zfvQMNU!2REA}5*QEN7NgI%n4B26* zw8`K5>Er9;PH4`e+W8A=gA|T;B(MDJaQpPYoad*90&}*OPe8D_eEjsl1?&0iF-zR= zNoc@-RllWOOflMq)*FcRY~pAX!!-c5VPEqx_$OLN~X%SV-hsWzyjn>AFak82KmwP6;=&$mNiFwfu;14h}hPciU6(oo)$TzU7)E*`-X9B#xOw! zrEbtbBWgwg{QS!Bl{oe=2?aB&U<%e`F$^1x_swYxG!95gpLYWzu!j6jC|vk?p!n^s)u3Jv11#j3$`jc zwnq6jQ_F&6NCg|P;Im;q*3r)k+TaiJX+Khr$z$HuF0l8bW~63R_HTGA}W<&Gj5`5B@0mqWDuxe zhb6W~aZM|&`<2m5;P_}uCYV7>&Wta|}CKpcK)OGFH8w$ zMAjrsY4L}xzeG5if*f82wTjwm@FYSNk1EuEm7;CSO8k;N=C{QZW1@LGij(4!>2&ie7= zvKZGkSymp?pd$6w8KdA*-Nl#V1RB9?ro*h3x9xVGib%ZwOMF>oiOX_4UuIPD<_o8W|o;3rK~J&tfcj?HZXas!sE5CuTQJ)RqLc5~=R43hgQw1vfem~@A%&DMLRX?ioL;b(_ z>}D!IH0U3f3wes4_RvbD^q85RQggKyV~C1U1C=6vv`$0to4euqG705K4SNNz(s(jw zS#jgXEsN;lVY{@NKubg%Tjkw}hy753(r=81eLbBD*VBI9>xqWNT-TEw56XM%xmS=& zDqW4oC&WQ67uTwC@U%$0yswv~_It|1&EndyuK(qHdvBH7me&cVE?y3I!?@!#mu@#F zjiT<@20`{MiAX6TS=0(+MZPfFbc((wCnd;CE5@>~`X~ zQDiK}ai{Zp^`F$*H=RKv_|$l{{DLaIkh$KPj+0%>6i{^HP2*(ikWa-%)RHiMwujxo z$_jyc^lDtgsvc8T6j3jLT8B-dZftppI>pXF5x*nDviWR`qsc9f#^$QxM(Y8(ut{Tc zW2ikPn_DfLZ}E-4&GS6lrafMuv+2Y0U8-0dp8OPa$9eLM*_3tirn0zcT24v9?C-Z1 zPimI;h7`GYM&VXb_0Z({;>OR_FadYBO2mlj!(VRSuKKeXm;H&(xI;aA` z4{iNg$XSD9Ftnx2x13Jji*~BUrGt5_!&_(oJ%l$|(d)<>Cu#htcwBwIgeN@HU4 zQwcr6%}*+?i>w3rc(!E(-5jV(N97Akh`R=HaEKgo5;GPBlA(|e@_+}Jx(R>EM9V1p zDiQewAyg3GjP`A&VtsA2{k5^k@1ogT`bMru?Quij$Q`Ne?~X+tOznPKEV4Sa9U&W2 zQ|bTwc8Agb_u8e=|CV;`B9ZIb^OtwD&!+!xi{qB|z36yBhd%WGxei_F#Wfwq)8WcA zdQ|XD+MaZ{WVgptXm|DQ`_lghcF+EyPvrW}qv-hdF6{g1F6}RmMb^+PlUU>*UD^}! z&o0@|^^Lrn&N3foF!GO#?D?_ChRoym+pdiK*fo1i-^eH3M$qx?-KqPwv^&GkchCNF z-^f?pbLn_v4@O#gWWUola&yl-I&SR6$ZvaPukRaK-m542!&%uMl6)2;Z|%v* z`+H`8-Y0TN?~Zi*UGJNsw0nFXy75}EPy1W@Mi%YMQTQlEz|y|-4>!)Gg7F27KhUqJ zN@#4UoxO@-#;-;;zG)S)*(+mw{nL~g zwa!^by8kRGIAewQ-sA88;&>O$s%#tYY8&t3vdp6qZR1_xJGER#w2gPQjd$_m?08e# zco)o1XdCZp8}H(IDsAIkZR1@$CfhdNCGH#o4R5xMceRaowQ^jpZM>^(ysK@zt8KiC zpRVo7@h+OuwJKqT7tQSw?*?mp-CDiqsGNkcw<$DrD&BN74>r)$u6%21*W`?8v~t2Q zdbqnfpWkjngR${`8C~-;=gtu`!>$~iOGiBWt8w&@F_*2a&nTFCV)x?4SNP}2Z+0Pg z13y@lcGWbm<(vBO{DNPs-!^+$O5-S;zBP#+J<_}|F@I~;#ko9(>jY~Kmzcg4Z(Jpw zN{W_RJoVY7)3~x|D0uQb8bXlsw>r^CrkJ{MA|3FYi2uy|tvdJotxNe~rFs6=k^FUQ z=5GyZ#r&;HUGukIOKa8qt*>c-nkU1kc~r;H`TxfJt@52Zf2$nkZ#~1qcs$jM=Wp?} z%GNxF+zI1ZbC!$3+s=O6PYZ$#Yq?y^8JI=1tfJ$ZueH*iuf>l}{+s7(wNN0e^aYr& zHJOC}|IOEWdneA<`f_K_*ZPhs4(qA3ocZ$eov*cYXU^B^tkTW*B^h(Z)2W(g^Z#(Z z)*k=;^R*Hu;4b1yJ#p!+kh5Z(IYw(eQ?_==e7$}CkIdJq{F%?!y5?s-U+ca9)%jW{ zCd}8$-39Zt_?Q1XJ`XB!zE-(ybLY+1>TTQHk$GhwQsZw;(`x)i&Dv5cbu@L~+nS#h zpY)ozMdR+OHAU;|geh7dC!eBqFZV)uiqk)*!{iuFW!W=`5NWJe#gQC3DcoA-=_rb5L#kZ*ydL)@P*CCs&6yYLB0@Mtf4Ai zG%fjlDhfr*@nRrB&L5LyC&7KoU><7_v$0lFq5U?c{jxrhpHi~7#3G+Yd%O^fT$->$ETZ|FKi{8?nfTyN{ydFFUjEtGl%S zXDl+mOZN|Bk!QNJC**}L*{{YT_ocJU;~9)RlaWpH#1>{A$KQ5kteK_S;@NBF_?%7yY zsVf*?n6Y@RVNMoZ#AP%ui)Lbt@y^7Wc$(ilEG`-ar?ibniF<494={rMtgvl7%K!I- zZR1f%eoxpo9>r@fP)FeZ&hH1?#-n_HKiD=N<@^qFM}9xpHXgOhem~eY9#y)cZ9EEo zFCBg=v;7OSw(%(Xz4;EruWdYvezr!7i--CBVB2_9+jvylcoh9Qux&i*zj{2X@vpc5 zR>%obG*n58&IF$zbsw#QRoJ+NegUawNEIyK(x)(G3r)EiId=-J>?EdR6|Dbvym4l} zctJ$L?3F3BctxDYl4zadVb&-+EJxW6N15oIOc(7|c-co8*RG_wSnNkl!HPFdp>@J( z=^=WN#^O=Aw7$?BT0ku_ckGb(r001J5D9su@9#=7id)t@7h@x;@VmK zrZc&A7B99Z)>rvopLcaG1v6pYEM9Lj$-Ju(t(|w(trhdG2Bk4MXTsD)^uXU)H!FSf z0rvV!f!5C&;F`wuYcl`8G5_lHojU)D-jQstpY^kufAugws+ZRyR~hu;#FjcS{b~+h zSlanlPbZy!HHZqT|9V-S$**?3tglJ^XR}_`MtlBM$Qs7}9n)A?x91!0JP=ykO0AFi zGxnovbt}dab?AaDA*lc(1dc@A_CPt?MnJwDS5`|1zwP^`TfFD{;QnFiP;w zns4>`e`dbbd*SCXIlpszSJXGSuG232z2E`ic{+2~c=4oNygt^)J2KyDGdJ)FYvJwm z^|6K$KWC!LzVx(9{G6gCo2JM(*LtAeIquLn+bIb%uO6fVWLsegukf@Ud!?)`RDgDz=X$DQ9G-J+n>)gjA9L}GW9hyxZOo*99@li#Ke@XoZvkn| z!NN>>|IwI?hrTJMRmqocIx6F`Q4}DTTx!AWA5${sd_gm(3YsQtKd!0s$804|ztm|O z^18JyBXyBpbl!7J>wC5=Bk|&g<~LwYfx2q0&s9lC!3gEVRW-XwP1qFN=V+=48T5s?BTE z46R4h!D4mL%Q~Pn->i9AYIQ8>)&e(Q!BU(5B3vjZ}CE2K~W`!W{-Uy z&3=e3yf;#MKE5BlbeC>&u8a=--F~!KeEaXSBd)IVg|8HuaM*nZ;rQ=_0&tJaN{vi5)a|b@Yr$aCL-`t@O{ol^h z$?oeoo(|{jmP(%P+-*-f-n83`DYSch_w0??ysj4=-``~r{r{*-`xV)dtzEh=&5qni zui5Pzxivj|^?s4r87$M3$;geF*|V}Ev$`I~$K8ZXx9rRNMlRoD1R;-irdwMbQaIfsovLhRN^{3;tS&XdD%6@jg$R&F+ za!GHY)jRu7`$g{S-I0*n_qr)cyQlZ5q6n_tm+l|m-M4*Xc4SQ-5r)2_Xes{e_Viuz ze)OH%IEQdPSy{p`+QhtNG_X@+oKGeT75~hSmSh%Y`M88DK9l2|^mRS$H?ta_&;eUSp z{kHMLw(&#x`%ULwC(sj$w(&#RjSTVzlD6@~owd$>+xQ{Bhpuh>a0lkcwT&P0t%p57 zu5J8q$L7bijUS4)U(yOHF<#)^cc$Eb>-gc3*7zY!6O1qaRJ{sU4j*on!-w>?b$XjJ z4IOrV-JWj{pG$8c_`n%IT;4W**fxIHHh$PPe%LmCXpbMx5;OZE4P94>5zds=_V}s! zn-yw+)wLfxxMtF{;UlW6>dU8ARn``|zV@72^7LNNyphM2*H!w;yA25ayrCnf)>clc zx7`+v9annzi0bJz(<)~cO)jL(trzq>fc=Ucw?DjOL~$tvVbI9Js913?D#tkaf zBt!CZ>2sQcrO?v%^-pOG<)7qts((t4K1qWApuu+fPpT}RW{#oW1~PTW!?71UrpfFX zxKX_HAq$Z{qm5*IAbolQsH{15#|zRoImkumlfFPUG_-8U;x~A7B~?aKCygnuubn#6 zePtyps}{e*63Ul+o3WKtpJI_DJ{1@r3ci+xPkaK|u!EsF@Qsg&n6%{|pX9|V(f`R* ziC5Q#&YwJ$zZ(4@{PTv|`D~A3vqGvb@4rlhJ$zd&6S})wz{Eo&6Ej({`Qx zio#vXpX~2U{!aS?_0i-YX~0;!k9Fsa;b!HJ$-jRZ*_O&{_p$DrG2D{)50r;&YuEYz z52b%l^7_@UsO@n2{rvk>1-sV2|E0Fe{qMr`ZC}@ z%*>R%I(JN)M-vQLXK(o(>+;4}t~iQB=ocYkV{D{6M!AU^Y?=m}rNM5{U<)i7YFIdIKX^T-TctdQ628(Mj{;iW+w?>1_(O~m6*!>!8nFf19VtZKb z?R-r6RY|eP<&J;gZ}w7oeK4KmNZB#8=kgI5m7aNZG@hPydFtr&SaGNHtfKVHW7E?L z>Bom0mtnHApnR~6DXd3ZP#YI&Y}{{|2yA1S#>Uo=HrmOH0n?)LIA~hp8XGfZJ_NOK zwZ_KNA#JSF*iaq&pgg*Z0uYH{JVwem2emO#W8=z@Hg3__csZnvW{r(Z8KWR+=|^QL zM^6w>D>sO_xox}$P zozl}r)8!`Yt_&!fL-Jdt>}d&h%gFA@!ftw+b-icF*d&wVH04XVE0n$IisvaFp3?%# za(yx1Et^p1M915ePVw#$mR}Q6ew&oPR`E`>UuxSgvh4Shc^5>!m~2jz@>~ZAS7iU% z=;-vUYf_I*k2SSBHof1~?F-U#FYi#0K5TZ!k?A$5gQA_%hY?he-j76%P0u=3l$|lV zv%Q7k?H!@FSGYUp+cs&hLYw}JRh2HvR}TI3k2gQrDI`-OWyjFoN%u%ix<^{+o|Te% zNP9|nktgAWyHhS}0#d-`o_#$neN~0|x@M(BFC|yx-gW(r7S~@tTBd=wjXS|!4%wM0?fsUH1;28xE~8_qUN6}F462R^ zub|HYDc2Xu!Zp#N^sFYXN3L!+GQHpBT#wA|5S`sAy19-Ba9@-w3Fgtf3wUI8 zVFKZJOyNY(wmK8zae^HWS9>suud@xiY2zX4zk|uv0?FeHHZ0n&x?8QX_YGK|)d^ ze=^{A8t}Ue_@52<-3EN20l&w9-)q3{GvN0d@COX|g9dz&0e{4RKW4xe8}KCte5nCf zBNvHZr$(Ml1msz2WSIef-hi((;HwPyY6HI3fWKtGUpC;c8t`=ne7ymG-GKkqfWK+L zHyH4D4EVbS{O<<*eFNTXz&|kH9~tnE4fv-9yv2ZjX27=?@XrnS7Y6)G1OBxE|HgoS zYrxegUgFoOk?#`$d6pXamjVCLfd6E`BXU$G@$1w`)PT1$;Oz}~M+2T_z&jc6-3@pb z1DV;3Ew9NCQ5~fR8rdMF#vh172*v#~APv4ETu#e4GIvZ@^DB;1dn_sRsOX1Ae9f z|D^#hGvH?#@JR-|(tw|Bz^54Sa}4;o27I~!uQK53DU|zqJkKM~x0BI`gR6U(N}*cf zkv~V`;vNmmSBqmgFbz15waPm>KqHZd#F-qxgm0`KAPtnbw(rEb98`nvtQt=a6amg_ ze@7y6;05p-1TF^@0ADR|d2-c=NxJ|6rifyX@f*#aNn!S5IN!5*C7Hyw!_ z;=%tR@PQt@wjpTs24w8 z;LbRS%CCzI_`?E!(6+B?sP%+z(2NeW#@YX zejqjN+0jpJd1YsUz(2EbWoNble^}sKYr?TC@goKPr7f@QOcl5@ zo}=tsZ@`}sxHHb9?0hP4XFNyQ=}KLe?5Gz%QsB-wkFrxKaA!Q{9Le}b!YS)L+am`2 zBLkj7U8U@(GcKg;=Mk>6Kh}WH5_X(%B%T|>+x>+1js7Hhn|vPQf3&@2u=Ae5PABTR zWk;QHCuRRI!uv+IdF+=PY=**S{v zzR`9bJ7*i@uNSy8eszWP`>e2|WB8wXVWohe~Ll= zdVxFRUCIuxTbCVm#Vq2)wR-o&plb*8K+Wsfxu%nPo9Iq+f2fB-|4iV{ zxY==*nMhB%b@nZ$Y6E_Yz@2e3o-4sy3*mjEpV;Y*2{aPfhYtEiH+k@* z2-n4Jk^!F~?4;TCXMV)m{z$ma&YK2&ivjQ4mw9&Z*dI!`&i>hiXGgtppvyPXE$WOD zs_XhOA@7V6s<@?Ov)|8BNKI@pxgRRZEPmUqS>dF}^qR}Elf-JRu8^W;F%si={YQ)?!k{FT<5ou@NQ9OobwEe zPGr51FSGqBo_+Rb`(N33Ov;}q@NYbLy}-MB_}nh=ZXWzq!n31Zzk46RJe_e=#j}F& z?5H!2%5z9~dy??J(QiF`HVZt<n&i1&;FsBWJBjBU z#PXNgxRReic;9G)jmt1c<_dg24MHuWg)Y zi*26)%;!QIr|yv0jw4*@N=WSLg#1Oeyt1=E;1}Dtvh#|-FSqerX)NVn_IrhmD_=te z-e}|0tcz{Dz^}4#Wxr0~SKGL9g1%9WEle*Z>7x-N^uK3&|@VjkX z@p)h13vFE4?~%)X@3nEN7Q~h>@cV3B$)79m2W*_GDY4xs@CR*N$v-FXMK-SZe<|>X zZ9G%j*)NazJZj^L|EU6h%*K`dYX!d8#ufji0)N8BmHfv7f6~Sk{|s`}H@eiumHcpl zKW*d6eucoFv2i7Tt-znNaV5W0;LB`W$$u>H=WU#t6|tocWGq{w)GuW#h{J3j$wb<4XQ>fv>f3CEsfZ^L)w1m3+RyU$${2KULtb+PJFU zZW8!kY+T8&5cqlm@d?Kk6qlCPHJnviR9bqPSc74>5a5NEhL5i; zud16|T|2#S>eLckq=l9bDmk9kK@w=*;Bock^$m4ns;j2bq9uiAO^pmJ9+Auc@*>ix zZefv;Lknk^zpp4v_};KEg};o^4lK~)N*XWlWH4+{qP11RD~Y9?Li-7l9?xPy{$4!m z=On1;mTj@uLhzNe7tcV+q)ScUiXUN=!h6ECRRVh=C9S7CZ7IcdE6{~eS|3@h?Ql#? ziS=HcM$Vp+V9F|cDI(2MQ@j*WLL}6(MH*SUO7yatC62<#x;gliN2Hrnbh4i9I9hM3 z>g=L=s%r9bM@%WNrMh)$eO)1+A5QgWRYiGiMZvUb)sxD(4oxs}n58^oC{?Rf zF`ybrbPO<&j$t1qJ!69s<$HKfN-2~ltKSkfMU+dSybv{GhL}STB!9fUBj2=mReaOp z?NIr8@v5K~Ps>XY%@x;H#k7(c(^b0wy$VB^RGGAt4eRnzAn|+OGOJ3GUMXQQyKsiB z(&lTn6?}uJcr#wl1VZi2MO4w`qO(AutP97VEHXt_#DywnhfOFt;jD9LVaViFW= zrvQO#COPtyfwh&B2bPweJ#%JhO=WFebyfMasr46>&d80FPN+J6YE?z)NtJaC(<>Dx zU1tIM##rQaDR+9&encHfh-T78H=$z+M1m^;r{GE<=s9T$LC;YNLC;YNN-v=l1*Mmu z6qH_qQV4oZnnKWXltR#Rlz<-8vrxMw+&2NQ0MbAxfOHTh&V6JMCXRFvCXTc(6UtyG zg1$@=q&x5;6+QAeiacw57Fc*M#Y*%k1U<~~A2IV3L0fC|MZu`8ZL zmN=^$v;a(4+U~6+qb$r~iBc3yV>xM|8<}h8NvdY%=1qsDk1)M*`lOl*k|y2I<+00l=m!MY zcT=@tSR+G5me-dLn_OF2SzJBoTrNpGmSm@6CzzdDS8o^4)~6Nv3hH6VAS%d{BGjv+ z3QiGL-{pz#0I02QHnf-vlan)<2J%jMfUimS^j>I$b%pK9lZ^`L>6bBRh~*ttEli;8qHl%9;$ z){BQ^Lo910wNtBWX-FzBcSiZNhRV|V3u@>t!R2zuDfDd3xvg+L13GL%O$Fau__4CD zSeup0P+o2k&3KqfLu9|IEIf%H?Z^UH=#0i{;y5BNd{!DqX}#q_Rq>{|8BSLCmJ2fF zTQ01M*_gXnu_i5F*!ge*?g<|~_40(zKgA+^+&&HxFIR(3itDkaWy(CUCF!$6dQPgp zO3hCqRor~Df-XPn3iN8gt#u%g#LLacp3{$YGQ}aA;M$upM2Bv9lRu6Ok}E;%m^xP8 zED?EZew^zKh@sXbJM;%tn>H?iL_%bV{yH(Z_GXDs;=^4i<{$>SMY3|ndt+lPFG+L8 z^P~oHCTZ6XyK^CQ?E4A(y72L0x-`-rKd-<%Q=FSkSn-3%AU1 zAM%M;kAKlqZAggZCe4cwc1Bx|_S`+;Nz`}98(dUZ9bjgVx6dxf?Oc-vo`I(?c}b2R zXT{KdHK`~QMLO{0v3a>XpfR)jtf@2d@(!otY2|fwqOVsvwQ6#;P?h%VA!D?c2wIXs z-i=CqBa2Z$;Y6l`h;`l6BxI9YrK;I#PJ&Rdg=ONL2Efo-Q5$Oa<)nj9Ix2|X7X(7! zb$2e1Sb=vqT*eOOoM+T1D2K2>Er0SjwJOh)7Be%SWgewc5nPYI)L=&|kxd zI7PuL;;~}RyTmX%MtwEHM1`Cr_z4yjN6V8QNOFQ0^p)G%}p*=cu5l8O3TwG$;XQk6W7Ra;bA^$Z|*y8F_m zzo4tJ&nqpRFtFeW`acvP`Q~EqzXjA$;f=MhU-0T=RlEp+p zY0+s1pc*yhLoi_<%ZW5(1Wc9_g_BwKge;k5kFbyBL>fMp6NN3yNv~i}`LP^?(+TD$ zVcb*}7C%3UIsyE6%36T*cyxmKN#qvHPlC=^oL8ThH)2|KRb`xh@iC3ZpgYMQ=kf2| zSJUU;+pX=t74In1%L@s-MxV~|JVWj|4zJTk#bGyzyX9%Q976JYi9V`3v zvvIMx9Du-?Hw8}?Y`LxPI+jV5cp{-uB;?P!qTJ=L)dt{Y|9#%NSJFfmk$Euy3 z0QkQFpA7hqfTNx5fTNuVt$LvBo9tja9wm9z-^d5QsbJ?k1AYqN*snnQ9d@z(-N61( z;Dh`}0B+*hc_-P)06Sf!U+$-2oR0@S$nz2deiq;+{@o0IG5$NtFV^#zuH%3wrmGxq zi7T_2+j05I7^1=A*YCdWmC%#|U zlggp0f2II`UIkU*w*tNw;F|&88}R+;m^ZeM_&UHbZfYe#_x(#bXB2IWqkI+M80WhI z=ha#j|HlAF`KJNL`>FAOV||Wsl&j|E;*4VTc=+f2{wH z5xMKl-(tWqU1bIw?PI&Jv+QI4FbDE?tmMPV#&k^to_M`nY>>ajAb%9(FWR{WaJ(+m z%3|*8=x-p8*JBRk*Zz>MIe??zZvaQXDXCTh+h9}Zt&8in|CPax z^i$LsffiF5ccf775` zA)g+ABcHt`?zS@q6#KCd>&-(!$3hU*UPs1-TcKIY>p zkVpPOu3v0_Z!lcH?F`pfSHRKl5WulqO#&R#^#E)U;IFk9HOVj{N^(z_CA!{Y>k9gjT(Q*L7#Z^@7(UUU%yK8XOKx*8s4C?fXyzel*}{ z|2)9aexm`u65@dJv`n6#-sTwOZ#T%RH{iPMEQjk9^H;6x z%<{7oIpApLLBO#b{@s9MKN-_|4=0p1cY0q29PM|4 z{6#(&0FL%A2OQINFW_jW8ja$A6IMxFn0*>~a=4cPKgfXh2K%caU3kBb{fZN;FpK*IY)4L&IP<~sIm;k_t3m!$sAtg5 z&gxebKs|%~ipK#*zXPCt!16W>aEx08;Am$t;8;FCH{cILeS&^p0v!Er0UYfgWT-dp z037W<1UTBqaV<>O5r*q=G~j5b9B}kI190T8-WSHnL;Mbq$NJ|UiF0;h`FscD(eI~# zBhSwbcKUR*3NG_OJ2L@Cp7RX&ZGdC_^C!Tu{`m>;)#O{%KONw@#`<9oz)^l5z_Fim zpaDM=aI}9E;AsDN1AdwTKhBUYdi{aeIL_Gr`8D9!e|Q*hydQj3;_minBgkWUW?#Iq zU$lQ2;CXbc;;-HW!}4fHy+O)dPWnJSgK;|=aJ2IX;8@12-GKWiF5fJ3iv4!XZgbb|D^#x2XM5no}aqyH%WQMF+_&F5H5T zw0Zadj(+Q zyhA%f0Y~{p!1<^Ya79|0WgJOeo9*Gh?V ze#Ifb)cqGH8||FYkpSA<_;Y|G&zAv5o}U1Y_D_ZT6vUqe9PPgZINJXfaI|x_oM`3d zzZ!6~{|4Y_|Hw}II6MnD+Ib0ZwDSSr$aC`Uj(xOK2RPcf3UIX3L0*8IUbM3Z;ArO{ zz|qd10Y^KJ0*-bz0FHKYy6DrD2RPc92{_t$*?`B=9s4L>Z@_;iaW4N?(nnp__X6Gs z_+qeg1k?j70WSjl8?b}zS5NsvCU?H<2RO#zS->&=uSlHvV|)6B0dEEz`FsZUvEQC6 zUtY-e@ppnpNu2rP?*xkgNB-jg{{_V7Ou&x6~w0r7k~=Z*2>AYEk)(#AN(`B;Hk{narfFE5|SHGq!={6E=_p8$T_ z+HvdmH9zNeyae*AtsS@WtF0ZEQ&W0 zECU?d@uMZq{gd%f58nv*1i(K6J9t0-9pKoHok_a9F(1Td1CIB1S4o`toD6;!FhCpI z!TWK1eu4Mn-QhkO>y6O{{3Qdv0dVXur7;oOc!&0T0FLsf0*?3NIA06nvzOt1dqaJltO+&r1PE`%Qpje%%1~<2=Vt^#j#>3{E!MIk+Q7&08L>1sr+a0yy$q z3^>~FZ@7=X25_|h2f)$(D!|eH;c$PA`0oHm`*#A4_R|gb(boWucK!f3+Ia+UFIP!TGaI}N-u_sdfsmc%j9tz`(?e*zU-(q`x2H+oYWlI~^ z!@Ih@J`?=5wbxdE?C0EG{}S@6t-ZGLtF673<<`*7wzbz*eA?P;D-Qpk+v`%QKmFS4 zUx?P%8Ye#s>f7G|j_Z@$4|oTVe?{W%`zfB&!kfE&F9sa@tGFHr;_rey-rs#7aqcfo zqGMSt&}3HO)^k6OzhB1t@p_QQe(Bu?d;lkiHr}E9Fu<`NH3e{#ZvY(Sp9CE5$JOtM z`D={Nui^e0?c?taQGRDVAIEvfX#Zow{rDERAFqJ?>e-Q_>AmlsW57QJ9Mk&^;H$}= zD*x$*`{hdv_$Pp){jUK>`#s@48sl(<0sj|o&{qN;~ zqn+ykM?3cdj_EzX&@K-K9PJzjINDhSIP!TNaI_OO+!v1p9POMAING@baOCr?0Y47z zb5Z^_1HKM$oaedCfFBF@t&LEgkAwSAynjCfaJ+xN8tmZx@`E6c@p%exjL*q%pNR76 z`7+nTc>g|4%DeHIfFqwv!9Lzs-VE}1UwjwH<9+cXfFu8>0mu9IRes^-QxxmK_26C4d7`1Z3Dg$aO8>O z1CyoGD~qRwEJY=is_< zw@Ew9KML}%fPK8)|C9ZkslcbLpJVm&f6o1!b0ELk`Z-p9we@qXIQ)O>=X}@J&k-5_ zbMEJ~qx!0?pA(6g`Z?!9dctjuZ4UKf9cwi$=4a=&o|g_ z0D0w~q4NM&?in)KQFBOGHi#WldVdwt?}Z?bet!)(@;CXt$RKY@?<|l0C}|YTfotdDGoOoy6z--EG*~Rvk?tp!) zXRyDd>LE7$l&VB%kM+YEz|qccfDhVv6y(v)D!|bW_M_0wGa!$4UIZNNTw>t!ILMXU6Rv7I31#q-;y@3xucTgMh=>a&}xe;*Wvj^a4rx)O82m3Q<=LJQE z_Go7v;ArO$U?1)9ID^{IPIti3&aHr>olL;dPEWwm&L06sJDmVWJADC1J8G>AP6OKE zbyw7ecCrCSJAVQk?YyCk&>rpl74VomW)q75?+5tPU_Te|T)>9`{xH}|UB$K-Kqcpe0PgYdiuS;A82kp| z`2ffx&#!I1Fpv081DhN8gpP=JzL?g zSAySOAin`{RaW`y?*M-jQc#F9p)R1n|89KNawO0G|c; zzJROulJM7k0KXOFV}P#&yf5Gz0M7<|BjEc1o+d96{yGQny#e1J@cjWl0C4r*1h#V^ z;A)*l#`^)T){$deJqzQn=Yjo$K>kj^2LS#6;0FV)-nYW`4*`4=$PWbkOTZ5WJWEy< zY$q4+g8|P2T&>f^@`C_B1LOw-j_b>*x{JTQ0OW^)`~tua16;k&h5a55_%k4{>RA5z zBfy7){5HVVoHYJAMOKb%U#$_xct608VnA-=0aw3eKHw(-UIh3! zz|}g~Y=1o9H-r2Hz?%U-8SoasPXS!5htKvW0^UP5(u|)9_%Ogv1H1t6(*eH|aMhRK zuO9&XOpwo%odEXxOThO8ycF;Y0WSmmGQi6L-vszsfPV@2B*4eZ&Ij|U0Q^kAD*;~y z_+-G>0)95&nX(hZ_NM^8C*V^7F9ZA>z^4L!F5p)JJ`M2S0zMt^t$8#}mW(zL_IPpPdeugDuzSXI|hTREX>>Uj;7g)tPwre*Kg^18~RvExb) zA5lHMW?JP;;#)XwP-${H2GxqztCCl3pqzx6eFjhGWLH81r?LVSDVb8SwsKl|LMhT_ ze=cXgSJXFYDklv3o{~m!Fo^oPQaR_VpI8um#SNKe<+iUjINPzbh1B*I6JM&3P;Xf= zXnQhna^diks?WD7BCFEymYU>B!qeH4CY4ssoK#s;UrIILv`SUQ=?W(}48d|l^|bIT z9i{LrUAmsI3_2{Ksw}FSQCVA8X=O@Lg@0Is>nG(N(oE=NIAIV?$`0u7P%<1E`ZAL= z3;_yxaQ)UNBY{TilHr7*6}dtF9sM0jhRcknP~4H0wt}%&KR9D2sUaCVimhYp()TjCaf~BJro~29I%hLBk8GKShm0!OVsuL=4wokL_;L(*;m9S%kM`ejK{pMjLaxuh&xI@Pv+*lqHQ zw!U+#vk=fZc4k`VTxY@S+|#MiaW>|0AngE7bzFlx)oFX2CasLZBs#RAa8z`OF@+*2 z6`dgumE?m!z6DR0{{cFF9yQ|XQ8OjlOIfGwO{r>i$5Cgq>g=L=8pF-Y9WkZ6c6@F5 z)cU$YK0kb1eR)+yd2L0(v}x6o%BimwxJTGJvmTmbh2re;?nV|)> zwdEHSO>bSIf@zzamdw~8uYT&a)%?sR*(fFjZ|c+%B7sjaN{$~lxKyBdgDIEm8|ubX zS54&{K5HsJ9m*S+ryG{{6xGRvq0O7K(OZ^VW!{q$!^I;fewZ_yN_SP=Ps>_pao4BV~_C zeecJZdlfq;7UAuChzGe&MA0x(_LxlCCabG^a>?=T>M3OL*vW1@$uLD`$C>ZAWe?e; z!BEAdA~EKitvfU3;oW$WVT#O-Gv9H`4%xc;^4j`_nt`RGi%&SVpt!WOuHmfGqEb0= z!sN+a+>fVO1%}pGwmeg*buKOEZVUmc%^yEbOwXW!-m3a?nom(%D5XW8fJl-kbq&TB zX~f(%sEy1U$!%nE8wp}A8+k)VPOYUeJ)4eaXfLVlVCtcKQn4=F0iRNx=EK+>tk(9M zhm53d+OWyBm6gR)>*|Se=xUAb z5Lx#n0&OzPMsQt*JhdlzX>ocX{#HB%)qV;uAH7qzBH87t>kYGl+paGsD#be?Wnjh4 zz;jnXvf)x@DY)(Wri>!!7sTK;T;2x_w)4w*l%tyv=EESQ9Ty8Iw+;)QhL$wGPNF?Z zX8VQ`O=k(m)|7HA^fR;7&9^%S*7gu=V`;~ zA%HyyoxI@sss{08&s7QUD?!!Q7Y>hy^yO9!;wyoiImbLPBwq=tZeLED3(ZgPJPV{A z)Mo-wa~e%P6VwCwbZ10JpKkS_J`;$B_nDyX@|mAsGa#4Ez`*SP8?x zeLWb%pOk^yN=OC?>|4zssTF?EHjT$@A|R@?n_nMj(PV7a4Wnxv!W6H_}K8WW~;IJJf6@(R!+kQI$iHKE0F z6HnsR-N1%Z4d~UW6W}5Wo?essj(88AZmoBB>tqaD(vljWw_s(tpOvKTl%4xYt?Zl> zB@L@}5sy5DendEVU}@>uGiR38(C?e7tIDTMt-qjjMs8%_r0VI@E34?|tyR_al>3MW*bp!sS8h=e2`gjm6N`dRs zCi#*vOoRMcM)N7nG1Vw(vNHO9}c0f)=bEhcG&+_A@s|n9_r5xpp2){cA$#FVN^;8$y4PMxQwa&HrT@{ojVrU#HQ(E`)xwM*sQ{`dg*GS`&%O z-wh%3(^4!0sDEP!{g_7orV#pST`KhdyAb*%8vpY{=ugq;-yA}JmPY^gA@t{K^#2e- zU#+8s@w+92{u+({TSMqKYxHjmp}$R||HlyenY^$AZF1QRQUCuy=RvRky*2tjh0yOO z_4j5HwDI+~fc8QCkJRYj9zwrNqkl&T{R=hve+r>LU!#9#2>r)2`geuUUnli5NryL% ze-@Rgpz&|k=<~XTLG`z4^m(1rp!({)gvg)Q^$e8$H-!E&jsATh^w(+h?+>BhtkHiUg#K2I{(~X(RYAe>_fQD^Oj*$I{--8H z`Bm#5V*APO^$J>kb2R?>{bE7&)jEslpVt@-s;}N7kLl<4l?Bz$mxAb@-{TWhzgP;Q z|Cu55$7}ra`+tJ^FVpxxEQJ0Pjed0qeYL(Nrk~%Z7nJ`@jsGDb^k-@Gt3v2ssnO^6 z%LU~>PYPoB;rFBj)xSmKpWjy(RR2zme}2D8Q2j+3|NNf2p!!QR{`tKuLG@Q^{PR6k zQ2m!R{`q|_LG?Fi{PX+vg6cPG{PTNYg6eP4_@5I({~L{eem`GO|B?38*wBX8FTeLM zsD7H%$MSzg2>tFF|GbuTQ2%>t{PTNng6gaFZ87~yMs z&+qFA>c2$e|C$i`6E*&?4WVD5@joww{xpq$ey?HB^v~4zzb=HnTJIRkKfj+SsQ;@q z{%;7Oe}g9d{9dD={ugNc-xNZBp~gSI4=Jes$29(VOf0DW(;EN$KF6T?Yc&4(eUm}; z*J=Fodz^ym|4rkc*US&9|B=Q&zyB$y{#K2De!pc<{cRfm{NAXb`t9Vp)L8#62%+Cu z>f`mt@0$whKTG4E-=`T=Kc?}|@2Lu^f3U_szi%_B{t%6Se*aWZ{d|r8g(39g8vp!W zsi6MV`stYe_lD3vL*t*{7Zue16ixc?520V9@z3vp3hMttjsFKj=+Dvke<+0hJdJ;T zrVy0>e2ss8Z&OhHJ2n3KeW5}1@7MU}_b~<4U!w8LjMho ze|~>bQ2*+E0eJl_38BA95c+p&^fN-}FVg7m7DE4Njeh44`fD`$@eulNX!J*h z&{yv}!TP5pg#H$d{}V#!Z`0_X5<cfuzB%TC0CB=?ebxdA%Y~Bl*kQSOwefDOSLV2K`x5UtUH^+@sI$gwgq*7tlY? zNz&;r2&n&@L4Q#|{T74%vVi(~5P2Q{bpiFcPovXs4yey#!aDt}0rj6Z=ttyxm;B1l zzYO~7eNle;L#W*9_{ReJuQllBN`3kI9Li;DQ_rK-`E=6fIw9Y6{Y*TGSvl|B=J_}L z{9A_Aejhi#=TOH#KcIh}XQcCAqw&8;ooqCX#78J@INo0f1c-} zi~lB#|D_uL9~t~F2W# z$+_cqfx&-`^zRqHdV~KM4|dRo@ms6$e~+)}nCVsDK{8viJ0-zH7` z`2Nv-{Vp;1SMTfei{GOL|5-fPKpVzygU0{Y(!V=?N6Uc=zw&nsB}jMult_KQ@^=L3 z>*6<0^2hS`u7>}`2LCnEzhC@*W$?dD6TiP}{4bUM-SK-SVEj5zJEx1^x`6RZA$?u^ zhVft(Z5Y31Iw!hf%aZ$J4F0zUjNcIk|5K!YEPo%6Pq+U%>E9i{qq|rH{mS1G1Aq1Y zSHJT2sDXd8CVn4l`1AXPb@^8#`TLc>Ee8LY6RrHi_!9)EPr2W{5MMf?)W_uFn+HZ z_^%5XzqJPb8#M9zM#Ddq>N#EhZ4DT|pA7!fPP6h4J??ai@Q-!T%EJzl@b=R+J( zFZb^Fmy*7&{G{>2R@$)sPuK9j(ZIi#thoK+|CWJ&OzQjbf6c&umWF><4gWL>h%Wwj z2jqX8)OW{!Q9%BMq_2zrHVyyo8vYj=_#fWg%5Z945;jgNZqFI`mq>lT_%Ai^ui=ON zv|;(_rQ!djf&W_p`46FbhCR9Czg6mAD_A)H$X&vADCz6sze)0+C#AXm@2%lqDgC?a zpNo4~ihl9udRE7Op49i_e}{qp%u==*i6H-dH2gOh`1k1;{L{)T{==-DXn$iG{-;R)?)Y!bvb+vP=X5O1+2~y+{(D*?e*700_~(~<`Sbb# zsy>wTA|IIe^TZ6={P^cmJ;R>d+qJ zNM9HKVLaK0wq^8ukTc>M-<`Qdt+CEf8qb3dUbp4nSR)_=>YgZ$3KKgW`(^5K7- zf&aG2UjBz__`hP{f6+mf{|6na;>gXvJJpkndCLC)OVN*i2I=eKzl0}i(Y68NKS;xW zl=Sb8|804ee?R_>2L2_3Ed6VJ;y=g0e_oZB|4E9jyhflCPo~#_py=Bz_8x8z3ODvg!7s35VVJN_G` zf4}zYE~)P>|68SgU!VGC0qN_?&sNDF+pp0Y{>u#fyPj?({Ct^ywX>q4&LWX52LAJ; z{&9||IC97TQv?4+{9}FEa>akE{y9#=e_!e+vZOoy?@0eDzoZ!zMvc-0Tf&UR_Sl=soDemF_y407=l@f~_EA`#+wxVjqjD?5v*4JNU zQh!gnKf%py?@-d$r9YDwOQ22t4uY?r6E*3-Li%^--v!exuW}gBI-&oHzXCQZ{tA%$ z<|^x;!iBr}f1>!ix4 zzd`zU$8YK^%fDazwkiIWxcz_KCDx%|{JvKFZB6T-<_2&4_>qd6|5&=uU`hA&mw%~c zXSFNCT&IyD($~drf%LC_2gK!%W8wCHhxG4`U&re$|9 zyZJ{+U+}jjtb^DsY&Eg`@sNm{|7prUr4P4t(!XE)CMf?d{SxUP<5#Bf|Dg2mj^FR@ zve@{=Z;yTT@r>>HEbmo%D6_TgN{Zrwy-PzNK@=Z?f|5N`IO3|FKW~SFZfK^dom# z{_~|nE`OC8|I4L+cl-*Uw9;Q^nXyjjzw0z|NFROtmMyhZ-mo>T19$oBNBX+><==04 zS}66IKmY#C9lu{o|L)}9@RX(K*Z+A(@plG&Z%F@s@gLh)Uw)dU z{%|W9_J4QzDI$Fx|8R07eav;Z>>@H5ET~KF7d+gXABVf*k(~HT+i?_(#@TihlfmH1N-r`hNVk8TiMZAhNU}e_lUM zrC-@Sd_N0w=YL%KSMpYB9DQ|u^$zNPxP$sf=OpLPWfM2|`E@&}{~76Xq}}yLnT%g9 zI;Z29>wLiemcBdw^Q3;JOWvIy2arCeDWA$GZc}9bEB{=6dHp!0ukwGI^zY`sK>DZd zeZuDEGvB~}nbcQ)lo91$onLR@KVMURuhQ^eY2e=+F#hci(8oXXHH)D;y>9*y($~em zSrdO=KTheZxQvqi-SLk}|9_=hqDUGhesV{P@3O;J;48|7H#U zXg_`Y^QC{k@>3x7-SMxH`tJ0)<9`(C>*AmFB$1^J%MafYD}5E0S<=7z`kf{H`<0&+ zQs2#gNx=9&Yv3Q3{Nq+Oisv`Heq5S7SNuCr2ZdAW=D$w*_bWe#Nqsl}tpWMxk-jee z^ECYL(D0vZ;2)DWUVi20E(8A(sqa^Q78v+%(3GFMH2gm@@Gq18{mRdQ^qiLS&mI5y zQeWk>%yv8f)p<7Q>*Albl&vP#{|hzz&yoJ!2`nvef*YJN(!#^(lyW^iP z{ri>wD-8T=q`qJIztq6LS@OsFlh?0v$A6W9|19a>ul(-}`>FeU3`4s1B zV)=he!@pSicgMe3`u8jUa}4~`-n0suU-`M%z<;8KKX*yp@qgODKPLVAmH)2|{Nn-n ze{SHvK*OJll$-xShv?g{GU?wh{%1*jcl~)~K>lZvzOMXi((r#q!~gdN{tE)~f6c&u zO+fyy82INtO=Ml=f0>4VC#qmr(o_DWf4V(O*kTE1bl)oV-SJO*%Mu*sl2`e!;3G+2 z7yp@(f0-2I`Mi(^e+_ThH&;YWR6ul!tW;6Go(|78vTr3U_G z(m!?Y61G^vStRm}f&aXK{J${p-=^XJ7Y+Y`)If7ix#Qm)kpC2^@4kLB-?kF!7yn75 zuPZ+jpJi5w<>xgG|2qu)%cOt5`2Wqoe_lZTZyES6(eVGPhJVjIL;M5sFOmA5_`ee@ z{>PKPF8*21dE>u9!~ZG+|1#;H!jrJY63!x#mkj*p1?0cVz<;KO|GOIgovDM#DfN{9 zfc(cueNX(~wG!%A{^O*ti~j}<|MxWfuQBj1lm7kU{}%)Qc>(#qXy8ALI}5axiT_sp zzfr?KbFd-)0r{UO^*!7xPi~oEL|Bp2Me`oL?m;Pfi{c7j#zg%bVzfJm& zOGWO#e4_FHp~3%@fd1bz_|IQ%JgC*X92jjsG7s{%08cFAV7aJcIwt zmEQROTjPJ3!T*|o{+}}VpQ!Qwlg5AQ;rjS*3h4hQgZ~8@{}F0~)b*PsujfL8|Frik zftZw2JEgDA^GRQq|C==axsRswmH#UZ{`&>=Kil9x_XThMx6}B4$>2XO{pYKM%Dv*R z;8h0yGo}B9Qjpt!o+GRDRr)(n2Zxz@+TVcwQ%GMI{}>N8(1!lgH2w<={?`Qbf0V)h z8jb%>8vhp>{HMJy=tuIco&8_MPXXr}{MW4ZroXes{}TrP@qqpxG5F6~yKDSEYVaR#wmjr3M{@7>|DeJD5{>_!8voxL{9oB@In0-S)z0nz z8-xF{m%QoE()d5-2t)oiTORY3W4U+xKZ5ji`JcvvZL}?vdR+hY*7(27;6H7nrI;`E z)z0mImcjobjsLwh{$Dcqk4yh^H#~0B4SM>R{Jimta*V1R6JpV22ucOcP^85zc-$C*}E4+CN2~r{(!Gw0~9}KS%pz^jR*?pQrr_`mB`aFVKD! zeOAl!HMCz#pBLr%OSFHPKCj60S84wj`mB@Z@6w)!8TeL%^M$*7-0U~g=QH|jrq34o z@OK;O^8tN6q|c}H*+icf`tW!EpwH*@`GP)M>GLIhzM>C*_al9NqR)1D&V??OKJDnk z-?yiK9q7|ho_C}D9`xxh&wJ3mCw+R!^DNr$DUbJ|{l4_+BhUAz{Q>kjP@bPb`!nhD zOL<;N`^oeodz1?|Z1Vd|pYN0E&mEmL zyE(-&%=YMf{U(W6_B$@^N|_a(n_sfM8JyFh`ku>c((fr<$-d|NUgP(deVcLPGKU|A zfc-z4Mnw2Ri`3LlsjV!pD4pI=Upce1qOz{Ow)%p|{&oHO$0nCkD^f8qR#;nGT^pNJ zT~T>NZ2yW*tc9CMPg8q_Cd3L4_&DCw zgLho&#U&q!H-7PKKAoH?IBnm~U#KlUdsQqx`=?`OjLKNtkz(BVeEgE1w$qhAqer}P zYkdF6*6rKl?VB?qkvXq5L|4pPl24kXkYB%lMxT*%n6fNBeAW5e;!ZzRw(GAFjWT}~z)uO6AxE>}p6%*hmCjn5_Z ziueG_SVNcM#^(4XE7y@s!5J%r1Rbgk@+UrfOIqvlXZFgp6_hP$ySJkS59k9M+bxS!8R*!y>0MZg_sqYxRZkxrZ$QZ+??a^Xl$Mp`-uy^d;5+4OP>sC!Nc|Q=2G1 zvyX|??~(V~63$@C)Kk(jZdg8NZA0pc$@4^Z&pqafQ$*1cfxK*4!)}~$bcy9t9i^^+ zhO~8nxat%9UH0wFJ_X|^jEm3h7;pSnJmvh%?IoFX(1<8JVKKBw;$9_&o2K14+J^@q`qy?1&UFNBVALPG^#)%EDDow5JT{r>!3fCWu;( z;yrr{RV+|TafS_lvo1Z}|EqZ8KjV$B$JhU>;i#gy?Q*zU;t(<0b`;B{e73zL&Q8;u z%Bh;1W^t|+oN477WodEKw48QAo{em$t+?@XQf0G^XUMMzBC8UmhK>x67ly6SH}qt~ z@uu#3#f6~dVtca)gv>gzB`0LYGi2Pl>j9G|gQk+w< zn_EKd*!uW@cv^h@_w|Rx8`s3Y+d%$~rK8Q6PJKk}N=kjt$+Is!_NPM|zKRcD9$)=D z8;fU*e11h-8s@sQ9hC<40zq~yH``yF{Jj_-P(uEGs4tHWGXd zibws#o+r=#eqh6v#P46L--o_GnZEywzdy8LOMLkAHmlLk%Y1NAs})7f?w^SC&#j?4 zdR@H#*7*8u^(V(0m&d<*JKog!I8XYIp!64r^f$E|Mc&Tuw)s%mzQ$)Si^hkqtLrm) z_OO8sUs}eXKBq=}^DEpgyZBW0rn050rd8k|e*fp%AJxxsw>N2Y32jelmnrH7D}kzf zP__@*x;-u9MrukM4w?|3dnmV;{o`|glg7n*H)>F2??494>P*d}+@8gj&g2HXoz+lU zmaYH)3HzKsPUj%8S8z=6-2Iu!n9Dw@?_9){hpSt_U-T}bnu3BuR}l3Ns2ve~0?`gQ z{Q+tM0`&)!zDT)f2b{hDGzQ($sYV->Lw9f4zfXx=mqJIpu@FFOJJsFqr zh(k!`dGE$&|G2$=K)h)}-}vkwj>))uIT;b%-KS!7L|A@(mwBSU`#kk`nGcb*{|3Ib@${e?VMM z+thLbRhm=}xDs?Hrf2g_+~2U|H(%wGe|wxjSJ5fwT$LL6OG-7}Q%5U=KUe-yXEibZ z{%@B@Zs`)!6RbS)$X3Ym7;l=kSCmQ()k23-p@~^#@)a`V%EGSBeOS_R*)+1>PkFD2 zvN^diQ5L}x6mcKiRGfWX-adk?1~qq ztQ7fFoU&(!|pJtf+UR;tXV zv9PHJ)6i%N|L9k4qCRMg_kT3r6X>p@@kh}kNUW@m*t(s1-WQ8fW_8s0o`$lWiYV3Q zRB#%tA%w<4x-+qc4b*)F70hpxZhNZ~C-j8451!F85-IGgvR>@PRZ9JR>R)wIWxl@C zipgrcLEhh52I&eE;~+iLY2jZgRd+Os^>OX70f`vYT+E(@o$3ePS{OdI=eq zbN%eCjWaI0NZ?kl1bPdyt8k{c%7riPC_rW6-2W8KJ<7U`Z+VV}0ja)ie7@k@!dNup zviIpczJ3!2>x#qp4lL!1qQ>83uIh+}tnop+!;~?nN>nHL);OVTpIS~8;4C6bx*Mr~ za^j}VcT$lU$>*}aGL&SN#z)az{d9!4>*i&hZWEathYd<=$JW>?7az`6vf#;-gERaoV_UO zs;Hx`W)TmF#;}TUmqU8utXYFZ5;Xxi0uh0*vw-*F&VZB2=qAy`Bqq_E=2Vl2MiT{A z4v!eX^VO($Gma=;NIcm8_xn^;AG6D$G4DU`=jVQO=&r7=u6pXZpQoyD<=GBWqWj8! z8c%QhLgR!~{vmV}L`(c0Q5YC<64VV}wq->;bBJ62w$t95e(Aq(2MpkuEg6R8G?&+I<`7hf0vWJ8N+njHziW^d!i}& znKpN!_vO~dn+nsa)Ai4`z)A6hp|AX_Zu?3#Vd?tk=e^2?U?f8*qrv=>;x%FmJzWgkmF&UvB)0&%Zo+F?~bFoc6DhJ_4P_hl1Rxb$xlY z>2Lch;6HCUxidgsz_0daB2MlCysl73!@TrOc`Ed=67^qkauJkZvYqTPq|5qOTJJAY zZ%GZM<98)tkl8&|ya_HN>(jqm0F?GbTqo7O3NFWG zP+U4&UrJ$$n~E3X=7G$2o zZ00=>m_3*a>~DZjN!J2*0Y5iC5b$%`muvW~BK*ceY-sPo$xVe;*yCF=qf!Nc6hR%x zgdt6Zi-F5sE&FOd7{KFH{i}rA#R_hk%P6r2$XKN}02%3|Fu(jtaer*@8Vu`Hz#c zQFYM&ph~Z)xc+qlZ1~Ou-$e8ATG1sqm&Tr_^oFNJDhM+Tc?UYNlRcQUpMS$e zOfAbmHXud8KF$~xsX{+6=9O;Y>mdJAA-7-83<9nRM{>qJpe6@(Hh1+#P%gX7$v%x% z7?coRjxQ=%zj^-ewXC1l8=t34gU_vavKIKy;iU?Bzh_VKK66k&)-z~t=r|znjg+h> z7l=INDk&-5>2T{;JK3}GK#lW~&tdYN?5T#}sT3eUBT9j&3U#(A+pQR?z z8?YWZ60r9Ev_A81>CbKJFWOV8r|8BZPKtQ|tagj2WKJA1s{= z;0tsvItq%X9YNWnrlx$4XHRK-GA|OVsGlD41%lo1W2I^qoOGcPT(z+}J!BbT5HN_G zETc4rAO8y1g$UX4M8l4u?18!70J32qR(HXXthM9 z3~24S8))!&P{qm6=>HKp2x)84-T}2<`%w4|{&9X8-%}8U976yzT{twPz#|tyfRj2N zhCt>}<8hiwPNGZ%WeY;1V3W#~ORkkJPOa@Hkvt#?(6_6(p^&NV*S@VQvmm#nb#yoa z>EwP$S=xSA9f2VM!3H%pnJ|wJIoV#Q2LvhqkoKLn7U`~P!py&lIAA~VSRD_=MhAPH zF`K(iZ75%X`skMQNT}&m_6Pyd9K`M%Ku_SxURSf95Lse0XjBkwtsz~20wv$j*(!Oc zHZU9_>r=;dlG0==Ao_Sgl)Vr>xtSIVCiL zhD3RH;lIu;6RgXq_(z}$N8Q5iZsGGVHrCF2!5C4cooIlD-Hh`n{C3rO070 zY@_{eidzpvqxj9m>hQZPmaweL;s@apuf_XPJZoGu97K=@)}$Y8t`6ZLD7H!k9ualT zKkN>suaU+$dVem(+`AU|b=!DS()AJym~ zYe@O)-eDNKy|ZiHfK>i@>S5*ID&Vwljm|#~3;~w;#iKE6cq|W~V!OG=o!qa{f0S+R zYO*xL$fG2kKc+UFf2;gQJn{yN&z7$PD+2$yha*|H&8>f<<+lip&Z`p5ZkStKm~`8_ z;L2HqMx3P+lCZ4YMZi&{Hcdo~?=*MOi{i>DevhskcO9_lB?RN0C6iGJc5Fnr%vf@n z(kEGDG^Nr^xdYD9Dn^K0Mp0@+>1_@87(UyOAws+Lk0=Ka`r7^?+#IKGEPt}sw-qQ@YQZ^EUgSWx+qaK;C9?w&F}fNby=!)}&LDj7QaAi9Fe z^e_a5-u55RXjy0W%0{frCsdDR_?oLw=@54r|>(X<{zAky5wM2R;lO>_+Q>kA+q zh#aC%0VE$mdx>ycY?1v_>WXw=PPNfkJg#6A!6UY>2(BJ2j9lw_75d<4=vaDgc7s|{ z9j@#aE>ONAQ3(4{Asm>1R}~brqvl@bq9AdIq5ChV?(Y z+&;Ca?X~YeBgQ(IH199azE%o>1Jz+1INFFEDD8#O6$nyw1{CZDs6JXN-W#ILz0{#X-slEZ-e? zZtP)&S4#frz@Tyc0pHkpCwmIIoGO0dAQhZ#Cb*Z5O(Km}$Mc=VX+j-|PK%zVut^tx zEkXTdPLA;j%$Fz9{4te20ZHQZxBdC8srF4Zr7ny@>Z@!@HI4>4wA~@fCu>m1Jc3{B zjx#YcZt0}S!hi(~b5kZhY3Pp+UD&%+=Cp_3v7pLc&tn!UQm%e}DQGL(v&xN}TcD0e6YgcIaBck6kKc-)W z4+^>epP}EQfUCPizh{0_^vf^)KSIBT5g7Rjy$=bxh%PsQIWdBf9`bIw7~dyV|LFWt zaABwNTipCZZvFoAV{U$b9fH2(1UUC=QpM&-njz)2^IB7|vg#joF8vlbd{c~ZjIq^? zNC$&Ds8e+VawMH!EkeAhPzCPV1VcJkkN5CN=hDsSV35^1*(x>(c3aUD?N)dFKT>(SOpY`>3o-RRS+P; zmpg>M^N)SDc%f~jVizUSLsn2+q$4T}qs{aNz{U8#>DKoB-+Z64B@I*5c*oF((r-m1 zG=OJ6mMR|8D-HYAMbk*uD~{}?XW;PKG~O<`Y|xXxD8W0@pOg6_UWzSLs$S_B5!7uM zk<1gmna*#cRcNNP)LUvmUvL?ID>iQw*`z$}Kf-q)O7>zRTiPhP_=c}Q~EfZnpnxgmgJ-2=|GobqY@35L3s;V^Su<_1e4T7K5{F41$I-d>OC&JhAEdsPcb_g^Kr!XC50Zuk_|a!Exfo@*hzIxJs%)`4@m= z@1xGblF~>OJ|6f}Y0gYOP0U1zxYmsIM!aZIZAJa5p|`o5Sx775(T7aZBR1)=k3>!FMu(G#&^!4Khu zZ~{4d+Gua%@Zd_%-JQXThOc9Guzc$%P&?ii)f0FHU&0aDWvxTpMK35P$71E=*jWCV z{;po9g|C%6z&}Kj!~>`5I1D| zR&bri&`&IpIjPb)+5nmY{`=0+HdHimnozt<@ma>q%HI~E;))9G(S-8@X%L#!XdX5+ zxP>#37@@qG;@E_Tq|k!lv}kuG?vQW!qC2!D;bgh!S-*ZVgv>F}hEGbA0d%F`I7+2QhBQ9FNa$=|B7)6YmYF4r~SYJf+m316?k>Q3CY;Id2~yU2wMal zsc~xKv$RaHK$M61tkkN|oj+qdn4d?Q<-?Kw55%lXqfz``6}9pE<7h2@*G7@CvWS}W z4`VRPuaEK3vRH4GkWXhOMrAU&f*2(9D;YBH)5+cw2Lw6RW7!M1AScw#zaYTrwpPZ; zvG?SF;vI)CQ~U@+UcVKFSr;5=sr-Yax+b&*ffs0p84Z8Z*#>TSos5&?d@5PSL>Z8Q zZoO-R(2+nam50|E|GiDOsg$^kY9sisX&gAPOL$Fx5Jz9t5$Fyo>BG?`8Pv9>(N+JIP(zq9Z z62Af!=?xf&>EhwglAf49F2yl=DpH{rX?YAhJW!A(KtW=#h&s}FDWn8a8|Y7>L{p~} z51*aR~XHN7!^5dj)BxdV1`s_<#CLbo_MF3)%CpPV-}Hvb&JP* zU0N=E4KrZmhtX4JuuSwDZTlXZM%qZ)$kk$By?o)CS>+_h-VmPn*#wpf1Zw1SboE1G_5;ThhH=H@~7?x~e1?%$2bZ5@m>COzS zx}3BQ>sLlqI|H!*uzeX=-@jTPO6QkB+uO|aF02bo)g#9EB|yko8iSJP7DqvCTIDR3 zbpuOBN2cddP#hJPLdI*HrK92YLP2p9>@n2bPZi>A6ck4xV-1Bw4AhLH5aSuuM+%ux zg+d#JeNfm>3ZGPkRVc(7(oqAX@NQMu3xxwvh>oMpKdZt73ZWN_+D!_7q6&MXa5oep zhY2;mp$hw;a1aXjl)_e3*cXL+qOe8^C#k}ICEl%!Vcoj+&&>j6|jtgQ4!RRJfHs%RSinBMcCUraR$N|ytqNKtCBcKi_84)Do z>ecb))z?`6@;mvKJwNWu(F?n0SdGiO8Tc!dyfT{0K|On;LlTx%nU3z?(?(GXN4@c$sm zbz-r4YnZ%+sPpBEppHU7)Nw+GZ-V<7H^?zZmiZ(VXBwUOT(S1pQO+&#xhjytXi099 zlieHtinZcgaX&i_G&{+;W#nAi1I=TLtr2C)oXZE(Ps)#+(Y`X$H0720S+#?l%Ln1J ztmvkvye0K6zA9aqf@sW?L~7l8-W26Ki4-n0P$xGTNNT3v$sUh8roFn7P4CI49vcA; zN(+}r3w?ETo$U!l5{v*$XX*2Rf!0TRY$wo}c&IZk02Hb-TgZJRKIb6;M@bkEgvqhP zw*ZPqI=L07NVGBYrz<(PG(;O^>yk!pi^I^wkyrrNy`r?n32E&;7RxYlQ=rJ8@zU4O zF8*!5uy#q8PubUpfcHAUk8{W!*xztmo6NX&QGnKL;}d}1#qP6H#keU)1thE zH4K~`5G}rBW(=9g^06`Gb%xMcr0cgaq3Bm(BqEo>G zfQ{9!%*;Xc7-5OdTa9-Tq5y8`*Qg{dV5y2ErHNRW3sI-rCBjLt7dCxa%1XWQ4tt=d zaW~!ugj#25BajlB`{B9ut&@aqKtCl1YqUAfx09d9SubOXlez$rG4;)H*JHj)uc})RaO;=?CbE(6-TEHt;3ncu!F;BRwaAFa z+-Ee{3_QuS@d1w!I@!(WwY-R4)?vX+6z{d(C;d0Fru12Sv9UO|3rJj7{&6EU_bDsg z;$W*0%imk~DYc3Wz}+Tf&XuDqb+VIs{xrwNakZ{fyoCwx0$`8SocJF|OPaW4+mXca&`C1IN?KzPq6~+m8jS`q{YtXTSarJ62ae8x=3_&yolFzru#__4x3B z86`cw&8)ZLS}pAdNf&xG6=p!Mb7608O4pa1#oq#2=y1APleNOR^cs|<>NjCmlLqJ8 ztK9n1{Da&(O>@pI&D*B8zmr^0g#}!X%$ou~u=BkYy&uN9!pt~#$VO(yA(bCljtd(L zTo&P6{!O%Jqzz>V2u{+_^tvpnnTCsH#?ysqNZZS++6cR8u@ueh!(pN=%L_66ZIxK zNB9s;8)um`t@=}JL4WR_e>%J}87GA-K1IcFiUSzy{^hR2w_aOtCHk3hbo0gmmO^9- zNy%_^KI+2s8opj92utFk=4*{x8sKFAshhta8Gq$JV7dqGjfArAMY#9*@93ah2F;AZ zp>ok4OO(3oYiB`ECEwEdI$ucTALgPyq-VWNbYTK~Hth?rCTFawQj2 z`R8QAC74AX*qH8%W{rD<=1{X|4wWxecmVFKpj|pI%vH9#ya}HYJi?p~seujo1(5Nq zf&YwJS4A+T*F^fh8MPja#PR!R1WO@)938k(c|H3dpypeB&l6qUFu^*M+p$OW zF~% z661Ak%v*UthlV$1mEmKChQkweXuyaJ(g8hqK!hmMu@hw#T-Bzc05NzCfbO>k06GBx zJ!cRilpPUV{U{RuXT-WLf`kDw&HgYEg=%&MiiD*4<99r+`Y}8|T6ik9;}!-?1-%_o z2Z)pYCEV5s2C~8(dMc3e9Ve^Sjl+}kFj>IcPr_k2w>&`XkM=SQ3a&TD9#j*N`uz$P z-(^mn|2eR@)Q~3yi7!akzdnDyMoWr-?nq1qB3L}J2Q03JJ@Vo4I88i`>>?iT?*L8D z2ljSE_UM4$l!&}C63<4hyMu_lBkphbLl5|?;GOOc?-bV9r1Hy}hBm@l+?qL`*$Mf# z(y$iaevHmx!dmf9=v)!5dk|Q^j*N*+liU7o7t{f*W;2Om3Fj*au~kjTk`Gh9lVheu zCG~ftg5Gj^#mZ|GzxA45*0MYO`H9VqgeqLXl=R3iS(Yh+#gqprzTO13HssONkSEgh z8|OdMgr9pf0x-VfBY<8^D^5X!02hOeVfB)(k1v!?*cpolhuOzW-I7QgyV4dSIY{j5 zqI+N`+YtY$)__s6*_YY|fNI{%ukatO(@7G&#HT;gonXd+U{<+95%q#PhW+DSm#OR5 z%njDM?;m$squxL69qtd8Q`>X7*t5>9-|RZ$sMf(*yWmuMyMVsE1brouaxX16E9WUZ zyRE0FnKjXDPhZo6he!5Fe-ex+Ar)4nUebO}lqED8N{X!D|NB&fZnBi4-;Bhsj#^i9 zf!hm_f#39jPe>=#=RHlyz}$aklz=kSfi6gFd7)hLE0|aG1j+m${%ABRU!5A^7LE)} z6Qf34heEyvUB>5Y>x8LcYrVM3%>~-nH0jLAa(DkQU&DtUNey`_)eieP%jEcU{X5QL zo&qI3P3PZXijQ(4!rE1kr8aB$TR5@UaaUvEg0_mN3J~0>0y2%LUC@I8`NUF+7#o`bi z$#O4m(f!he+FELZNqN%*(RFv|IjN@FlJ9JtAYJBy^FT9yXP;Uq@#{`X!(k2*HK*OTTR)5Ki@oDx zHi|dLc1OV<;sf8etu`BmPKV9nU)lrnDy4ZZ`1eJF`zWcH-KLM<&~L~h8c|8V0;nD> zq87BUIyK}~MVQRHPuFjC7LUb+yi`e;LE}iN&)Vy%Y$?w^l9$PiL4_d9!6Cv#WGLWO zgzg?7%)>~^SU3VRjm|ypW3uE7qJ9MdDR&*)W znv?rJzS1^nFAR^o_SoOl^nseFH|}_lNYX>H8OW5Tx%7X1GDp+R63KC>E4CZXcLRQ$UU9 z?eQ##k#zY;WWT@K*49YhHMaF~H2#Qfbwv?lx-n*>cvWoR&qhxf+^-iRtN zsz{PwIb>EV@Js7w1_+pQ`Sbiy$jl&Y|93Jos)_M%m?r2(*kNu4_&58hrk%+dW(#&E zXyBndki6m)R;8qdB9kS*(#c+hcSwyYzIOQwxHVoL5G&=a@p7p+96epS6&GZzv+Am+ zcU0tAn0z`Yw^)OR?Lsp1E5+9YArYp3uy4wJM(3H*&$&q#O_&t-g!qfj0e7x=9#xsL z_$wKY+1iFFi?ZF8bPajXnQxbKN^S+@40rqS+D{iwh5#82pV}I32)yoJsrtXq`)m_( zJ&`T_4+TcOV$dW+(j^y2Ybw1-0xsn=tJ;d^e;buZ~XriF=2A}wl5+WjSq;3$8oz|5y5pcJ(Iv5 zTCd-!oS0oHCr;=|PIQFi!*WkPJcQm+KHRVq`S62su~I&i7t;^dqg)vEf#d>LkRt!o zEnF@JuL(lTy>I!*q8(Iq6Lm`o@w-640@9yJgeZ9hsYQqlcb$02Lb-4(=ZZ2>8>Mi~I9FVZ8zrHkoWT(QQw+$}J||dM0uCd=+n?=0WvOePK-g z_19C*VRzyD3_xE5vYccR+#-UJ%z}K7AM)DI?#JFUEEUiOv)BuS`k(YkK+-(`<>Wq# zH=@$JfodKwepH%weLzK`}$Wm%TmFXY$`|vHAh5!qhLXlHJd*wmW zuRQwT@DH?K{;|m`QfOQnjE+mQ%J%6Vk^i9OAl@(R4I-UquLWU7oV#pmZG_jCMr;3R z;7v4OmfSKo>%aT^ua#^oiu`ggYVBilwDs(!l*k`dAP zr{tU2e~Ei`Aa0DH8>@Cttdm`O?j9`wF!C8uO)BV6{B*r5|8OA%#@f>~TcfrMq)s zNwFDm^+%k=vbn(0@yM4(L9rS6(kR?b>WxRfGzyB%$d^Xp`{eRV$H!2JeCcN7OQTTM z<}V$Od}$OEn~^V#LRp)?bUgB#*itib#< zVSf-V0Ok&A+FrYF-j`_V?d>H(1hxqjYY+}XU;KsEg#I?u%a z*~se<8dj%b&lAgV)-@H7FH+^+(W!U29zC_&GL-q#cDk=s|_y%O4!gijD)86SV zqbh|zHO5HE3On{}>WG1=^j~rRm+<`lUCl4-@zo0If%)a0ot5_Z7XWpyf1duO=hwS0 z4P`aXFYWW?3)DVVpqw73mp%hMy?XbP(yPE@#i@Hbd+W$*c%^1xs;`KQz9R;Y6fQSL z_QB<)++XTS{&Yr<#XY>m$UNk!goLN?*VD8pH#z=@J>i@%9)p`q9rZbNgdr>AZwK|| zxx9n}52wzYH*HF0&b;%Ilc!9X*3y!kCSSa>2DKDamC6EtmzN5`Cr#i>Xo^gO8ECUsaZ zi|H2I#>I9^0C62Z6Bw6*2*{p#8WWAMiZpYf?#1x+ew#s`+zF;pHe?!g(TKDrEs^;* zC!9;)0p%4`8YoM$4E@`WWup_^5UL^1wb#f-g5W>Cxw@s#^!DS9bh5u?&qgQOp1TCkaq(-* zN?K0#O#lyXMJ#y>s{*nA9D*r0<`etS;h%JV^kDqcoX740g>3EB_yA+THPF>CQ`y?f zSOD@?%L59{gQhQ9F$-$L_*x`fV(A!8^@AdCDD<7)_gpsq(1P2q{pkZx@`?6mHn8Lq zSeL0v>U2q6!Hu^+eIn`%X@6!J>kKIXR)@83IC0T4%et)hdauooK8#&lDA8zPE`l+E zuOAuw`Y`?VVcyq=>u(MBzWzyF@=5RON9(U2&95I5`uZ^h1xGIA2U4v3{D|P^kJFz& z&inlF`eVm?pC749MtYw=L4W=Pe*QC|&ws`+8g^q1x)BKKuE%`BCB7D=UPdYH2+a5) z;6`_1noCbY!NAS7F5dK_T6KUR<1?u66cDQP8&P!H(1ut3D$6hKUj8o2Ki|FleU=~E zy?h(X-+^(g{SqVseD}^Smfzp4{3$8_X}9uMrF_0$4zf>@bl*hIJ6Hn9L9v8)6}+0Y0*yCfJ{o+lu`0(t%Ps2C(-0G&iF> z5YGZ@L&EXv{#21SVrg9r`2>R(>udn0sz635GOT=*bd;&INNAFwt&dYsmv{mTGwr=c~z;~AQ>y2yZtB37n zV>^^XY$V*f_L3;lI#)%k3+=Ze)}jdSzZ2OVznhuT**tHK=n|99o-;2qZ7Sw!NBYR< z$+KtA$s}7clQYTb&}A%9K4{=8rsHV_khKyE0$E}yowv5nGuYKps9yCK1*+R^%p{FS z#F`!@soryA<|(HLHM%PlYRd#82P+kdrz+kv&6QW_IWOOAE}kQ>@W=bc(>>|#rDnZs=()XK`Ta2Ud4`9}lP5YBGJii1J2wYL)6fuVJRoPyXPZ2Wu= z7KRblR2vRkPVW&z*l|}L z_;&UHP~nuhze~&l-jD-%sv|*K!$-6%MWsy2S7;Eyb_BG*HCY|&qT!O+rXFgiu4mkY zSiE7gn#H4?aKC+vwaATs(5m6_N;H^08w*!GCF2ktuW|~_r~Q}B_BhJvVtBc4F~bTn z&LagH`jl1M0RZX(LPbE}N*}?XHH6S#U-LDcsO+)ois~^8VAEsWw*IK%ge%M1tX)~& zYdbG^vs&?@h%dA*{VbJz|3>M>!1c3%>!)zdY4-p4Nysxbe@dDuOBv^Er3+uhz6OC1 zOdSN7TWD*;>)1)4b-b(@Wm_64UZmrRNTdb~QL^v=W+yWHanK=kc+~nyxQ~LVRSq~-EWsk{MEPgZID~>-lZVW~#kj%tinw)zy)=vAMD$khCDZqOSM?m{yq1AR~E*T!@Z*eN68Iju2@p zPKAPS^;Nk;Du|K(-25v+`a364UhL7|zQ6pa>2KOOT8qOrhGFRj83KMSpZ1uukt-a< zM<(6G5BWi)o8iX)tJ2L3-F*CG=?1w4Ia8{XZi?P0$Yf8h3D|5+$u@ES3dJqh5yd$< z*&mG?29oL;{|c11+TV|4`a@N1e;=D~UU}Ep$a8|2W2m~o+efJ3$EyR)~Qn=~?KH zrdrWHC2j_6^@0>or;tAFDPCa(%u{WZrsR>B2ANR^0}7;Qw^V$!>Il}L%xt5QX~j3e z+0?YI)o5}NPbUs2#8jJ8d4w)xi!|wMSnD;!XFg%Nr8-Rv4EQ2Y*=+n{h}U$s5(rA> zU^g#xpuAe$b&FLAZ~;wUm4(hC=?hx_Rp?$}3rL$vm3=iZW-OS7TC3)3hclr&Q{Kn) z(bUdA;g3pXqAnZn+e?ZisNF6D}x=CJ!@ zxUp(|nR@~krY*XQoe#KA0{p?VPi6m2A^zM+0HdhK(m_JV_)qq#!Tt?1q4dtLx-yEB zDq)|tMd5`7PdLSjJsh<@VXui>$J#%MTc_E$ZME-@TZ<$1cjDGf5&KVZtn0MbM5!!a z9<}n(sh0ItwC35E_5GNACl6J!UyfN%#`xyvr?rqdOqf0SY{WG)b6~S7zhIK(U=jY4 zc~Vt54GDDodB*R|7O{JiGiN8~O`AORh&i)ootHd!&eUn1Kj$N|7d7)h7M7Y-k4lY~ z(96-u9>kRsTa)GiMhZ!WdCr=QPD_cUV~eqX+8oL~U<=z+nZ< zUhx@-V_=ueUga;B9!gg#*c29_!Q$Qln+jUo!lrip(?Q-FfSvl7fuZL_*09v9ru>Mx z=x%|B8!(*T)Hl{a`A4SY8hue3qd8lTE{n=m!!8Tmgv>+v9@FyO=3AVw8uC$Yaf|SGhA>?V4ksE7;%23idaBd;AZ%KS)n)f!ZfLurwD}@)h#G{U7!C zAM#_4u-}Wq5Bf$Fe$eNm6@F0c?gP~hyO%GDp25B4_eQEPlsY62zZkP`wyj(otnZg` z`0F?jBe2Y~0A$d1R`U5f(#lwGKSkXFj(P1vG zFc+8qCqz_0ozx0-h59J6<|E>D9Lc}Q-?-jA$ln4gUF%$5ox{@nOAf5yPc7Z}(+B2z zncs=B=J}ts3imB3t>Aa1FNfILKRmVuc60=}(L^$%OUR3U#J~deKTg?8%L1G{%+h_7n_BgB%3_%2e$n;+q%_0 z)3Q#Q)!H&cv9;;EOirJSDD6}eeN|;18`Dpfn~T1bq=JjGDIxnz1`J&+N6DNv zy^U!#1Zt$Z|3Z(Zj~5d)mRtG$pqh4mk zSx>X6hGBZ-+3bPYB^&q5W;3hhhu9bdgEu%H%l?*-LTPx&pBJ!Ky?FCZG`H54?QyjQ zK3CKHs?tb>X}U+HX{z%n7WN(6;_ze;RuZdhWO>v*xrYB`oBN^NY8iM-t>-k|U|8*_-$6QUz-GeyZ*)fJpLU zkZ@NvnzT*Ibm-FX2kF<;H+uHuGfPDLK?$mylHCd4y-fA?`WPfp_|Vm@AytK?-Ma20 z^d^2s{#X@j3RLgtT`|~-EV_!&ZA~~k;t&Yf)*~oj1N(wbhJZ~Pzb_oT$d!FYf&%2xXr--l^3fAXxE@XgFiPCIvQ<~(Jf%$|I1(1|^DnrFL&$R<#36=H(J3~xP%?kK!t zDyJ8&dfUvE;AS8LR2fyQiFdn8pZKklQX|dXNx=NM%g;ZsB-6I?4M2b!zM0 zr%qh}wAOJpN%&<hue)rlfdDzGZy44f=RLD>fZLRxVL^GBY2#jgn}00u z&de|e>IEW1blW2vw=gM@K7JAwgzz0b_~#|NLOC~u-$;PS)5So6UV3d2nkJO&$|W-{ z>x6I^Tp~pO`-1*M>#@B&_VPp04IplRo;lSBC8Z;RHEAdqX+?h?u@1Gbido0l*_ict z8@Da?W0K*0d&K%lY7$P)6B+$ciV;7!j6mDY| zB8N$>jHo#E$ZVXUP{$J^iZ4>udjjVQ%$YC-W=KKJ{}d+?dgq5}STRc^^O}6r?PzSO zUZ+v5e3|l;^hC2u_?+}sDb(eZ6}AIi4qgZjfYQQul?zyWGexyuDJ>OMsZL>sL0u_d z_Ty`4OVjD)0A2@Qkey)}uJbwv?Zei`2 zIyQ?_BtW8PA8FHDhOgHlGnI1yfMWV&F^HPlLTo#WKu)8Mp=3>A9@c-%!xBO4OAf)a z*)5!p0&JPkT?jF+B_xGDODR;bvg6PS*H2|)u3je=SkG~PMZWxRr1KiyVgW%`?M~r! zI8;4#g_!k& zsC_#QK#kfzLHa?I4|i_8d|=&6Bl7>c(i6~Q3=UT)WTx0By^uZQxkt)(68xd|6xx^n zrsid(!E53q|9Zl2WP}Eiy#EdT=ngLb+rE;N`BEW9C7S(EiFMr-CfFGvh3Rmv-5-B7XdU*b^cJzNtJKA;n0RP82 zf1M0^wIUpbBjtU`uZ%l~Bw)e2(M!a@!Icj#%3vIx!MXTf#*Bz|G?@l8JSJ24* z-3X)sRA}g9y-|(#O>>t>ZSfiVQ zVeJBf0gDobt?%wp{H;<)2(ibWxMnC?rL1xz`$If3#2Gd%^3V z31G_)$bRk=R;V(b3nx1O54j~vBcwHwnvjFWtHIboqLGpq%Zs^lHzEb2Weaa8Por!2 zB#Gtze1a_(M%Okvx8SU^>G{!zv*<_^9Vtb}qUcx_jX==|DQZAbgUmBsr4rXWo7dBl6dOPj4S_SnG+Z#=Arbwtj))# zS42w>p;4`8$xLx8paD`X1%JvUv}C;eO=&Tj#{9~oxOAjDFhc7FA61DufltUx?pr~{cdf?@! zdZ5X@f>-_OB`z(Ku7lI`8GzO2*017oMBMJyf3FLyVfJq$2xl8K1$f6g}N(1h|+bGO} zYt`em`Y^Q*B&`mqkXFeGX=VJnMqaIzSpgOeI2i7)n;G|gLkp~$-S)cJ`jm~M4bPw@ zai0C72u|8Sg&wdeGxJsx&{Fm_2?G8 z)2?3dWv*!zHW5s9f> zKHT}R$AJBdUcMUt1eATXnF>T2p+SK=g7p+w0FGfG9~3sQkRn)thf--aw9R!T#n+v~ma*O}Y)sSGzTp6~8K&A2fy<1s z)e0)DVWo4_^;%wk?R973^4Fc}{_KT%5w{ap@XM&b77fY0X;6C4?%|!&YLl-!XNr4{ z-J9p2KXVmNz^j-M>3WOTrHLy{E7H2_9L_-kJdn&B_Cgtz8OnT9S@+g0023jLTxYh7 zqLtmmGt*O!Cd2N^DCAo>+5OeKIchaXwLhpg0@7cXbhH|SN!Qk3Faie6K7ud3&d#!< zNbnsCWyITHf`0m)lPxy$YA|?DdaZC4oXRpqG-1yIzNV1KU*Iqts~d=CCdwt7L!d{7 zyvp|(KZ1&P=>@(-W-;3|R(HDwN7!fIBM=R;SJ>7!;`aTvbw}L(i|lz9757~Th2T8>^ZY$PD#$1Is2UClsU6A(`IMF_S_UyL{?j< z=1%33T8R_VQ5n+I1>_BsOVIbYY>X7g!vR2Ck8$c0gYZ0D70$sO$|aAhRLG~Nd?sf2 zhhbt=wnZi1X>aAkvLG+pX>ScGskvl|gjoaStqx*(i1y{B^KTdsnaqi90<}a{L^oIV zGQge=`!l$EH+La(+xykx2kGx-kxz)})v-#UDwW@Y<0`-)0X*`oM1X44wk#O4iUIlL z6qf@~lDBm^R8_Za-`U|@CNq2Wsxk2-z9wV{eM#*PXPkQQ;|aAxGgsBSlin$Ap)#m6 zltjlt_(XRMh;9T*0z_9SSML$Mk#wl(?w9iEN^&!&)cn>p{YD$agaUX8!EhWv z!v?Q?j*w4ag{eK|ob0)PrE}>x{E~Up@I!tdg@>T`1$mgXhCyI*m(hi&j>Fi2-#j;C zvwH%cIEx3;g2e~HjWqP|L3sZbChmx!f?$W(jQk40EzgE;p_O7%6+pwGclD-)S-#Rz z)pmZ@QJLXfK{tXaG2nB;MMi*>eU6A$aR3pvE*!zF3)N>pC5CcC(D1Ycs3v5q9I;m8 z@FEHsdM9Mie|`=Clwp`gDlwq^No>-Glk9mWj%u6hKDWp_EoyWe53a-c-gEcwKEkdB+^O}VbtCIi6IB`9IX>&o|e_9gj~l7pp5z>*FhA+YcW9)9US$v^+d!%NvN zOwZhpq?V@3fFj{<-Q8m$B&6YfUmggR`B?k_2=rX(Q zWnUe!4jy>E)nwmn+XF~l0`qY( zkC?tQYe&$KZa}kPcBIS!)7Fz98P2@cO@KxXoZmW+K1tJg9;>T0PM^e{Qr$7ssP2Hh zbwah?cC=toIP;rF19-%Nuhfw%I7=HMBjFc13c!YgUuyX9D6kuavl8jZv+3dq9BjD- z_<}T|`c5Z{{ll=3V`y>gQw`1?4~;y_S#kzS8rt3;iJd&vRfBT{m#d@fKqog8SKQOK zS~wM;Pc{ZU%+F&FWvJU2!o`cR^EnR_7s>pSQx%+iTulR(sIl2-krn&J&#z1%$D5M4GDR7bwjoOR~Ubrn~VV} zDV#u`IlQSj?Z8y~dnY=Jq54|4HlQMI8=Nd8vBf;I$TI8zvS4evIBA2gEMha}$X(ck zy(S&m$bFK*GDuK$+;t?EM;nG)WajWVx4P1gjK8Qj_Q}5h%P+ve?8}|@PV&$EHb6}u z>|A<6DmGZfvA-C3u(RZ+xOM-6qmV7=P2hBV>GEzbT`w=Sp$58PxJ@~y>;=dKoGS&E zrx6L=ES&`wVe}j@eYbEXP&<#!du1wXZtKOCuzeM#vVpDYSJjcx5IGIE9fv-l+p8_^ zaEL9=tTf6!jt8>;iV4blb5r_?fJI~~CiS_ksrHv^N}rZO ziF@74`E7p&b9?s2@*M^qf!+iANKDqqNzUchumc60h}9FhStHNCEe!r0#v6R$_4eVCnM4W zAQ)5jeSNH1_Od>-H~-wnx*_t@$n|}!hbbR!j@h{UTkLBceXKjE&}&95WD=1P#3&Lur*3hpG{AB1|r3rt9K!@I}k%iqXjs`y@+zQ z_ECIRE4jmjG=)@+s(24%qjTxc@yl(6p%G&&4xn}ezJ^H)emPxGgW}_b zY%Enc3nvnurP}!uKib&UWa-bop}AzUTT~q;4o~E}&1{-JDYdWQL=8Diln)`=jI?sw zP?e(^!QM@*0OO@4=z29E|LEV(c}Gv;)Gf)C?qqI!Xcz=q}epG zFw~WjgI+NI+xYcLX%yf-z`IKCdgErjW@)!HnJ=1nTe$vdq529lN_&UvLuXa(a6yTD z-&ObZ=KGgn(xiwdC0zsg!(jk}(&SKx!28@p@uq+gN1cbYlklgoiGU@i=1=ycc5cZ;YrPR2 z@I+s0Q*6LHeXR%L_V4>zPsFRP>T4CMSm!%c2fg3NT3fZ(YkjP1d+oNaul0Pd-LC6v zU6rs==g!_S)VZ(s!IpJHpQG^+%F9M@dq47{{k7EN;HLGDliUaKbSu@J8XPcAl9 zi(gk51f%*tHyDpExU4fmaEIZTy1*ivwij`vk?=C@fTXv?8MAh{vYUzcbuL4-Dfy`%h*F@G!O|)kqBOjKJ87o*z zMbqt2(;r<+YJ$)Wz3@_dwMs4EDVm~GYH9hcimGNV%lDdkn|M*aNq%J)ug250eHsqS zF?Rp*jBbnGCL;3c7CPDp_4;?59CaZse9Iy1DM=+rG{sp{u1-GMvf6QSOYx}fACdf{ zB;A_!HIXfyjx**_fsa_Df_#wgTUO)H3hD=2R!5!O6}XT(oJsM+t+M8A>BN&J@eO8b zo3%A8n9xk2AFfZoUGpmIY*m_%*Q&%P=DtwjN_uVrV6^8VphQACFm*LBTR*Qg30&OV zEw2@JDY9jFcnT_yt@d?%fH&yys&gE zZgt*A{?Ya|QBKC#M@uK5I1JuZ*5oann6a<(eZW(>Q8}5=qr%P!nLh1C9a@s(y_gqS z+1>(a??Bz28=PLZ=jnAT62aT8B)fFL@>TVdB^SwDzG@8R0cy{?So><8|!_Pwb6gE&t0vr+zflp79Rio?v~ z*0nK~{5575;yAC=S0aGKeL0m$Nhg5@! zrBIOIV-ugs99W>2>Jm42+Sq7$hY@aP;OK?Zid*B?5V|zao zvA)KimYVw_*5#l#>*~lSabIFqFZyW&hA(j;R4P9Z2#1=b6p-k8Jp`mB>_6^J2`-@r zs1@pv`0=GOB>EFlvHV?)s-_=!V5*fC0M+%7W!Y=_c}|V`W4T^ds&+ICSm~_Ocod~VC?bb08{3(uwitke4Z$!>}G>a z;M4C9-vZyGd<&;XN=7Pbg%7HDUq5!Ti@k>M0e^+(cK7q=xIOOLdbZlne+>#1f9>?~ zi`u*jj+9rKyaJ7HKQ;F?(htdR>i`5s9Ky4#PO#eGD!^{8r71?LaV`*P^tg?8VH`t1 z#=ZL-Y#{~dn=$Lmfmg?HMxcFN47*V5r!w98BDd``_O%h~R2$N1j$Lhyp3^#O>g-Qs zl3L;Pm)#waoUB%)PM*b-g!7Wq7S3$Rv?LeI%*>G3XbYDgRV>b{Y$c@WRzBRd^mDTq z2uJ21dS<9dXEXJP_d-Mz@0wK2vepl^3f2%t1t(xJbp}J5Jv_#w>=!?tjIdAfMfAU zt;9kk1Z@Nv>~^F~bYl3}W3;}|H&&8}8Ble>)>kcC^_Oh>!;P9?*My%2H z6zj`JqDP-=8cTMhHIIsajY1=x#}BbhZTk71tAd~tU{xjqNQS9INLMfjKPHg?j8E@> z?4`2$?BAQ70BU_lfF;_7TIZPQXZna8I%lL-$7|Uq8mWdYi5i)>jgcgtu-tuq4`Nw> zvoxywiKNVIw|QO9c~n#&2wna?{g?jyeR=!yq+~k9_wLv;rP;nVYF%vU6PV)!=&JEAVvogn)#VeE z{Nj!UB?`T3>UAtf3HH_paOiZdYa>9OvA67K8oi`e!r!82Ya%-z@KW0A=sU zy#gfjTOtR_M|kYZ$sq_#M}Zq~6sYeHxyQxP)o@VDD(Q#ab=wdZb@OXnXB3GJ2|;z~ zLR}hB_#}f>UrpD)vS8NcF8Dl9G)!>NOd04AFK9f#_lKchPWA+lhcVQg+)=nA?I^S; zCH1Xlk=$=w+3gCt(6p}B_yc@KyHQ`-r0Y!{VlHT!~zu8ewnGj&+_CrWCCA>4biRBnwrO?K5reBId|@^@mRrM zZ2QA?ULQSw^~K*MiaqKzUzXwJt`}hSIX+s4gZ4f@G?W6}P`RE_Qd~_Zr zKQKqWj0=c1%||c8hE_H2MUWZ=KKf+D#$^Q`75EAC+Fz~?(S1UvipX$03Tf@5x?T-O zgLHzpgFoM&|5b0>`SV)9qp^|v^f~j+mEA^R4FT^B-!r~Dj}$aX7&vMdI)Y*viE)J? z7LJo!aY}bvez6$B-uyunL5>$p}q>mfa0kPYLDw?Yp-X2m1m(&dltYaeV!q40E`j3@-~husenQ? zB48(S?&>PI9@pcsJXukGkS@pmg<$KR`hn4VdZ&EDm@uMhkg1|N0unu2Es_lh?v}e! z#zSc$2P6yAdz`HLG(d3vaQA^w%Snd_hm6n8gYj?WUc;xY1@4_%&^4vktSx@9aX|k8todfoS-ZW}AY&JB>-YlCEJ;+Uo z?0X~DDz45t(mJgBW?a4_M6Vy7J2^9>J5R183g3Z;X=^N~MU?_1Pmd+UwBa5MZ0XPv zh*l`JPUZxdZ4@Jo`#YvsP5+uuH1U-#LtCb!9@p_E&XARMn^Y)^cn>3y8AmuV1*283?1lY*DYK!Da5`L`rJ%;ECkNvh?dk!IZuaZm52_)J4#RUv zPZ`Fq8IW`EhKHZy3OSEOf(w#))@?=7W6OBB37UqykZRx7rSc)u^_!i=ufw~o!T!2r z^(dXjhv;Ywx*_q|;xUt$czAMg(6Lgz+>i28b&_W{IVlB1E)VJtlI+ zptQiaM^E&J=>&!;sWPEqdTsldg}41}XBh23dw`EvcBl@wknjJ&1Es*2H!@I|*`e*Q zR>F~bBM)7a?gNU`I~rFrUkRXBq72ZIN;i|aV_A8Cts7aA=IoBfs`AEat}4gp@Gn=D zujO)bw|+I8u*=6J?#~Q1Yl~Zdz!_C^S-xE9p#)nszl;UuW1L$O(;M6Wh4tmXLkVv8 z;q8f;&rcs)|38_uEHS^Hz2p*e`Ws}4`Pk$4akAgU9c2LADQnpdmruKS+)IO*uXv5M z{z=;fX1)2^)+Okylf3~$_5IKOdUHI)dUJ`kmXGxO3w~d7H}TVAW~^@ASbkWI3t(7q zh8eh%-4~6E#d9T?xmz6H42ED5`qKF+lYATqn-!lX{KIC2h8x$J-;2hy{X>hPG)|&< zZRn5HSg2~>@V=5zW>U-F4~&n1Z9Pmt6k2MI<3TcLwzN^&2B=p!*<-+RFyP(HLi4d$ zqz`-bOhWrHtT-?I0hM*X3KujBR+VazpyPiJ`$;MWP};zpnhxAgRP~;fL>}Np!)3@39h5D;Kq~Kj6=z<1K4$W(Fe;UpW_h*ev|Y%-J(D z6-Be=Ou@m7@|VKO$a%9T&obM4aKHcAEeKR_)z)<6+O#Mw{OoBnCeNRVZPTXWC;&MY z1qVEx#9W-?#?EeOoj2{2X$vOIp856GY2L;mbwf;+jhB#RA_-nT$OkzDUdz{yrZFQK z4NWKk+ATrEJoY^-hFbYT`R@vsI?Mm?^%gIc2)iVk*b9%7Z{UB<+tfDrCvUEM-SMjU8qzw~_ZBoBwh!`;DJ54N1B(Et>VNGR0XP94lBkL2)&_VIQ*SC%`@K5EdvX5tu)cGk~$0DFd zhZQYKb1Id#&d)l}zuNdWv|zMItr6ivbhu>(4PVd1Vh^#GXYX#UXE%atNw68SH736i zqC32j#8P>tS9X?0qYvVrL9)1+KW z#`53C4tl*0PQf@FC4aXY@cWOdeJ$(WUdQ2KM(2E)#UGqy};qE z+}9mP=qiS2FtF#CyJtKrr14sV#i+!cL4C*xV|l=0P`)NTpW$;9kXrz!kD6LgB|K92 zQ8)xvA>|CdCTZcpo&FT7WBD2S8$J!T=Y9v(0Msy6rPn##$?XoybFHhsa}$XVH!K;0 zIv&E`cU3m1@kVKExeA3tp{cL9Kwa_A-JlEazx*^u4`Lc}B)HI2=zVm&V=N?b7c=$$ z-)WA4{12|x9g!}4H4*ZileizQ|Y2Ql^+ z_Y;_=kMg$y}g8twD@jml}6Z|KSTKtwdYH#>UTHPSF~*?#HiXv#IZW* zKvM=-pD|R_M~t1YllKMMX5);N;7=W)V3o8oM&YeIUit#j(4KbeT^$7DR?Ym<<)$7|l)hlCJ-;38gU|YB2 zSXMcq@Fg2L+R!?#v+dtjAxGQ(W|einebz4N99*^YL39oo2L>BBVebQ=A;0#aI1LeJ zSLXje&yh4iedv+==X>}u&m_Fk-D)OY6jk4B|llvgZ_bp9M;FqSu?fv&+F-jB!MR5F;GiF{ zf;0Ah4@@Cq|E>zj2=;fXtd-oq8^@t+#&OP3`#IaX2m7?(M6IZOU);KazSbLK_T#p- zJZ7)At(Rl=-L{pD+qc`+b#XguTdU((W)R>gI>2N+lmRP7lE!*IxJn)wog_h^X%Vii z7>rrg8cAd$psT>ORFmRXL@;lVMaN8ou+d=zNzcX-R6e0P`rA73Q9%Uys}L9c6nlZ! zjq{PFfqWn=V0vy?ArrJJZF2>aEfm@rnb4EOgTOM6P5%|rVo@nGs&3RMT>hiEkVSNq zb2n->9I`;rZ^$5x?!KL*3k0@m%-;E78qRVyo;LlASyiDoDQKAPnM#309o#L~bW;wU zP%8svjH(Ca2fDvreum%=`~~Q3JL$pjhVUFNO>>2DuxY2(CJ@@g!CWTN=jVB=sirHC zf0XWU83mVRD8C6-aBP*TL=mrMx-b>XyW9%u1-83$bGFg^e zz{b`@t$#-BAH{LXkqs>ZTg#!OGm6y~9kH5U#;rfc?BB($$74JU^j|SP)KbSpiadXT zw?;vk#EASFl{SP&UVZhHgAmFM>%n0xhBhW&HK-ao9|ax+PhScsuBv&NCb}w+mgwPX zg46PmtV%E=3{$v4-lzB-?@wiFN}48g!wPMZiNrY6u5$nRGodsl4JveM`!fHozyTmK z`l3p50Cw%$?KC^zU+7kxXLqHv0^G3^OBCbZ(Rp_7MsS{;a5yudp3btv{)v@m*(Gq6 zo$@R8c%I$;=s=i9tgrl><};<=pobpfD;JiB z$UuC9yg+(HWz|^Qj*3UA_13@V4H74N-rY5E`UiK=ViAW2-Lk?r&Wl3EB2jXQouLcm}$0Z-ICK%iS)Dhfqa%SHd*Ym46 zxg#+X>Ij==k3*XEC<-p!<7G_oYFPt6`Go zlkY?&iMP^dB7s;gc5}}hBFlrFEBXT+w!cJ}!%un*m?gr2l~;x=0{^OmeiR01o>RJ6 zVn=QKdT||I`Vv0`{Ab3<$(l)b{uXx5*3YH z0LgiAu2#gkCM3#zr*}wvi?Q!k$BC;OBuCyVrqKpCth_yR(n=y$F9dMiThVMQgCF z+pW=ok0O{BWBHF_2W{$OZRXCNtKui3_%VA>uCMi)-TzyCt)Eq$fGW>c_5T-gcY1vh zIX}JaTl!ebdhh;pAL~j6(|+5>#wEU2-xnHfE&e~lMk+A&R*vzcv}ztbbxq8=DPp&Y zE9_{*@a(sluVX)s6RD!8VU$fnA^10y|EEB!++Sp!nZe4Mlur$MA{ApLC8<9GTG=3} z{99^=0eTW=gk%#ks?cL_2GD+kT#%tiizsnTNrSK$k3W#FAa$Zsvlblvu@lxZ%xesy z0{p508H>2MZ6My1RVS+RCU4qLeSm7S^VA2~#8-15yuh@@%U7c7o_yrq+(o24a7S9E ztk${puVM8KPG;VR`=Fg!TZbJKoGV_(J5AU?v8k{C=jDv!j>@U}mClkVdYP(!a{lm> zi}54NgS0)ADx8k}NdG_f-UL32>gpe#Jd>~m0|XbeY9DD-tZ4JFhH8~S0tp0+EH14Y zLI@CnBxXUhwxS?40*cjIty=erOL1%6suf#YYSkCFYO7YPYeXw;U8~mrIp^Lp^PQRJ zhM>Ovx4+l>`6SOg-#PQW=bn4+xy#&VhPEM|!>1`)R4jWvr?lU#JD%R3gxfa}1GDs} z2XIz)Or#m@Gm}}AbVK`z2{+L| z9UoCb{kwGwY2RbDefL}b6cv(-Jhrn=Vl~Im0{AH3mp#Xypm)28jdukEy#|BHC!cJ9b7F^CC9%N{gIOE7Cqv4tTBh$`qA6d zE3ki(v-8D0yjyY#f7!!(FlX?+J?Nc?xpe%uoSm=fLG9b8|F@=c>Hn`&x%3#4R1+OO z&2eUF?!ZTSc@*aKYm@>%CFXgt!snR^-DqYvqd_tNYdDUWn z5Hn*wJ!rkQCHT=y^kD;CU)S2y-co1YfSR7uRNtCzq+dVEQwlt9d~G9tlk954$G4lO z7nps2<4F~r)Wqal>uDokV_O65E1XNyo^*R_L*u;kY~FV$l-~Z$4f`G6($Ge*mmcEn z6THP`b06u^O@*(%OMZz_)p1wRrDOx^%cezWW6_qOLlVAxi1im58tD9B^UZvsBto(I ziAY$b$FAn|JMC1;NN?_gD%uVM_T{vS66PhmL3}15Ph3l8}s4r@$+k8vp^D=SA zBc;|^sj0Tky{QDY_qR{n`Xhhc{C1YP=w~d1@GX=77qGF`s?qfbP=U>jt(ctp*UFARP!?0{jk?a6G$=D??%RA8 z7q5b1zo~rdq(&*;IYXDqna#h>q6wXkYEseRN0$k(9hf%Nc{L4SP3{i}v;6D)BtYq2 z@(i9JhPUO9qE%^%-098_NXY*FB=Wp8{teql^cyz%p**!b+5ld)`pTlQ@`YSinhlIr zmKU8*r+BaCT}FtW|{7n3{s$;vFc&JYl(bfdG(FpN&| zk6h9+7PCM9HS;N%7|4TSX>2IJB%}^j-QX!_*s2DPr&v8+{%0kY@@G_u$Eo)(U3OoNp(PWr zqGcU#1dU#wt!{qP*m16qZ22^0pVG@MLVjd*k@5T0*NXs;*^iJ~h(9NI`6lTs+UU8u z^!~u01LH@>S_SRXV`=zL&!D9?8a_StD!SCJmqLKycCkBG_)4m9TDh=Au|rgyLxj&v z=89hGX`3O1*U%RR`I9VtK7DW^<=A6RH{XoM1WMX+qPWZ)Z1LHl?32u_9;BRg-DPwq zpUCNL0eRw6^kdM>@9v}(8v_4qyEqNjSPS)4FHVr}SVBsz$!lURF-?Dyr4~US$VA zeBpE!sqC0C2k^z$n2{b+j`)|&^1mD46)si}U;>5a|$+-@k8DLy|vnQHb< z&O|cRa#yXqUNqqc8q3+x*V$w=`Qo=g^8}lY#CZKf<5e!ZpC0<~kM^@zg(lllWXwl+3i$Nz8go|M{MP3`?Q}`Mr}kj{r#*JKx6r$#N5Rhvy^nhA z@W}x0k)AB`ZcjdYWv{%BLT^K_>3<*SU(`GQxkCT$-g*Bl^dIV-x4F=NuXkR@K>x>m zMw~y;|4Dux$y}a4_>n^YvHZbwd|ls-Irk0p&nXy9U*0dEhgNRxS4zP8{sS)?=>5Gv zYkS{-JUV`AKyPB8x3zwcmfOSh>4g{NJT%cPJ4_+Xf@KF?cd*xQ zb=|?-J~crkxmAW@Mz3z~l}St@DIin#X}GtE$u#r(DpubmBch6qi)4Ugn6zK8CnF$V zNNZEt6I6A)q8)y?#pW$KTh;NdT&F=fkXjXVCKT4fRg<(xcP@~zz5D8iG-G~X60KI6 zzE3v~2XAoUCAju^p{)L3Ots;VYVyvyrefl$3U^K;rEGjQ`E9<$+AmT>xw{rJ%P$^z z9c7j&+8T=KUt9%p&6Q9;D%@I7)~fRu%0~|53D2KvH9&rxcu`TY=F|DGT?nAn*UFBk zH`C9b)UxtQZ_bwL#GF;l$P=d6t!ABbtZp>U#GI;(_o`a_;O_)Fws<(hPT&CHSj~bC|=OAUSxgZbdsZuG}MZ@ zu6T&ezQIWfEDzjy8wTDyk`BD5%DR$XPH!;2vgky*UaeZb{AIIppkabD(20~}V4hY% zJa(3KspQSN8$l7G#fd*LZg&h&i8j$UzLbWfrePUvSI^;BD$_#>XuK6v0S~^|-Kg|` zA}jF`{m^%Z*g zF`+PGHsewnUtdZTyu7mqiDg^fnMLPud8gXsLx!Ej%RAIigH;`#(~C4O@9br7uw6!d zIWO<*DA!d!Fkujj*k9~Up!pX~ZvzHmrQt6jy1qjP+}xJ%vB<(XuI*;2ZK`OqBoek)?HSBOn_R8m^7X{QK2u?rMD!Us zwhTe*qnhV+KmK)2Y~4>oQpL&M&$8eGq)>YzK1@5_=#<-MQM zl16S(zva9n11lQml0Gs|)Nve@nKR-C_i(w>;d+LKD_+lFkzhRotFb%l8B@l*&+8cn z7I|$)Dktj;4P^QG*cRZ<%IN8N3- zJe`YZ6$92ABI^sUe-Nz8>R5L36=DuMtZ_`s!+AT6#OSV2R3(o5k%Tqajx9byc4xlFrQ!h-9Dt)@pTan89V1TzW zmG^d`cWEl`r9#@Vp7&89y$7q7@E82N-xqovxwK61W-bdpmY2R`fcIWr{u=|mi+bdp zS4i&)&bz$Od#Xp?eFMCUdh+q@JqxcI=snc4;IRSTpL^!LH_-b*ue^1I-c`NwPTk)7 zqa6RM7fW8-JMWZ2dTrLEX9xOc_Q}6{pnpT3yoU$+zv`3s`~d&8K6yVF=&#AoyR*=L zFh7rEHs%jLZ=nBaei0o%+xO9&)rJ0+f^qbP)-dRp)-Y}w=)K#2A5!$^1M=uNwmR_X zh3DqvoSL&!-nqTJz4KP~^2+llwAJ!&bdJk=B*#0896kI{hvJlhj~5U$n!7F+l7uV?7`yK_Q)lXU-js@ zrHA*s9=p)-&wJ*b+RMAUXWpis-m^XT=B5)_RpEBVk7Q{-h$EVbH$h*dF*mkXcr&g2 zM|Tfz{*5-(_S<<`mR^wia@)E}dEG2M*72|@6s>4K&-07N(NZk!RxvjXHuK!t1~>bf zkmZTIx!a5cSy^xt#7<*P?CU&`1`9g>u#=C9j(26VRz=5wMKr3}6{Z<9K-4>hVc$yk zFoc+p3bquFDaLlWY3n|gqF}v)QSpK3D`VKW!KN)902K51LJsUel5U;p{M>x<(k$=1 zl9!K@9%hbi7-4E!6$J9f5rFV^`|MY!qzva!ebTuXC<*G58 zj^|h9raLdAQ$~NYE=D6gc9NmLev24=^RjX&cuH6*B?uxdc4a%vY8zuJb%=}>LLeqal#usKUEWMdM_?Zh; z2o39L=)gO$qn6kHk1H)*wQ@c!$e4~(0Jdqbs+IIa?VRUI@26+E^N?%^8Sb-G4m~`! zt!P)dKR9K~E3I|(egt~wp?qKZ(RQ@)i*9pPjd`Wt@^!@D@7ANer62Waf93vistewH zM?V~te%*Hds~1r(`byhwbZPsI^giXB1N*eEty;Y(MQHma!FoQo^Ob$+$8z+BM=Fcd z@p>L*FOU@r8cy&_wwE6*-?|)vbn=@dIb4{AX>Kk7-_ z$aW#*lhoi_dU}`mJ{@1{)32qT^Y^C13v%mzPw$}59ehtu@A158SNHV(+9QuHTGKO+ zj)}VWS1ATxm_yHWrt<1ILI-GUn6zz9riLPMDtVfb61jkW{lw@v=lU&woFwn} zX@W)T8Z@@1xNBZmr_ZN0yWA;qwAb;vbp=maj@-(mWwSM>>0g3zz1{CY_a0|;{)iVg z!=|H#0*Dk^0{um`^cOt3KV<_q4p>s6eY=&*Hso+|PJ4$!4t+19tB00T&$>KK9a*@4 zxN3DBMb9_;E#HG+Hg3PuI{1oP$5R;XciQ*pm_#U)zS-}zX8O|kq2a4owwYgcK(Cgh z@0%|R=NrpNqnyoaO}91w_0HpLxn@aY=2fF$x)8KYx83yGlcG&KN{gJ=X$=Cd0TI+ zT=o_hxczlJA{dA$nh zm^blmH;QUkd+Q*|QrtD8RYl?wbP**JPfHK0GHdLmGwnA1C-ntVC6Rba&jYFI7(s&@ za(=#C3=;SvHOu}QNqg~W`E3wH(w{Nrj-)H;{hu}f(685dEJz>WYXnW#$V2A>*+7{X z90o;{y%wx!dy}+N-YOCPCV4Vr@X(TZv4@th|4G3pRLkW$-fPS7Sg(KQbaB$9QbKZ6 zW9QA+@O7%f<{y~&#O>3bH(|d!-b1yz$LeeQ9iH6NE?y){Ywo2PS1%~!47lTXPHc#D%&U-X%)o_EuAuj(s0 zUXf+Sj#s4WW!=#9DwXtL0<*Bik7oQk?S9#ZUb<$^B|fbW6cx3%X7PbTVm`2de4toE zB)lK6OF!V(oCM=Xwfg3(aQ$cVvM&4}+rEFU5XIRKb|ybKFK4F@Q{IN09nSW>57`ec zO$|KF_ufk7(f`lq2Vd6zom7>!Px0aaZSJfpiax}Jerhc55#nB;m`NlT`clGQWKgHQ0NXav3p~SE7rg+@FO`hf z0%$^N76sB8545P2E9o5^E5}ivLob2eXG_JH`&tKA?DINLujqyz4}A`x@og)O!wM^M zy6i26P~fH!Z2J-p3-b8Yu)CPSSooXV_GStd(WkA_el*Ur*XHxqSc6NyVMcu2xAVe#A!)<~?0m`j5{(ba;ZY>&j`up#$_Ej$i&s zB_)5)_x-)#AscFou6`^R4l|mwbTL)2E@r-YGf~*fY;~NmSJYojufBP0q<>k_MgKzM zmtf|veG2w3e5@l@a*MrfUvrc1{XA#DRX%N&JKzG}yC_8y`Sq!Rcl+LIdP0ivpdDqY z)Wnaa@@rkMeZc)R?WZ|g_&8nnncs@{g#V@vZ?0Q7atc3DzC1+3BXhpIrKPDQ>v@$F zxy*>_mL}TP)ml2csim!cP8U~*{0QFfHFE3Zlu0O`om9@3FkdCTS1P-V>iXs9|GO6W z_?o{xK4o_G!2=|neeg_4R~>9h+-zEm*Z&~%{YLv)&F9zO_tSBuf)9FktT_+=CypQg z&Ge9&v)dcn+S8fL{=@b!-fwifd>yur1xP%X{&>^z-zI735quJ# zqf|+M!h1+T{}YI`gub88Cn!Bce{yaDb4)H6w8AedNT;UsDHv2LRFm^h4310l<=Q9Z z%5A@v%Q}c0h0}cgH>aTg;e85vmFG|8q6#E|Cq^}UQnF6i^xgmD*C#{o)g`vtgBPw3I?s>vaZN2Ef}&audHBf zYI>i7A;d|!kwwXj6Y|**LnZ?>jvRpV+GP3CbnKNE^k0_xwv>T=;A4BPFQ22tZK0RN zX40{g%i?K^FOA_PS#YkmYK!wtrERG<)|u_ZX$Sg~YpL*TydwI()}Et%?B?9z?1Odp z7xbFS2jYt?x3L>?tmg+-?pEa!|Ef^`DhqsSV*cXbnCj|4k{@A%$j`_Z!ZPZ$%W_k{ z4z4KAPb~<(OrpBsyxZ*cpC#`b_1a|K;%%u%g6vB3Q!T-l$&`0B<-NsTKNYUGzDCyv zzE)fvbG5Sk)K6ki1;-lZEE6Np*x(D|OcN))nN(8H&d7%;=8(IS*B@2Ti~Z#;E0dvP zIi&VlMP5FOzCUBnnM&)M_j8r%RsPfZ3*NEbobQEILZPQ^b?&T7&Dz34&v8SL_cD+iTHf+*2vF?Mc?r*646qc_HZS`ZgfMi(rDtpaRy(Z=lO~ECT@)xS5Np=SP zoo=t)JyJK)uTURAF(vHfD)Lif1E%u)(%`r%a!me7ytJ)D(zlZBK-#;sgNX&zsZ(Mu zUY;-Gpfq=Ul={=3@vG`(c`I^P`Kwc28DV4Xd3t%4IZsY`Cj0Sf_TyE##J__5cp3Te z*i=OyabL+pIj!y}Z?e?uEB3M^4B6kSbH0_S1D<86<7G55NrIpmm#w#Q-vv2}ljI=1s`959L5?@CD<8#w zwH?NraU5^TINp?+cr(^-$sTVeO1vrQL!^|_^e21;VO>w_W(l{{5&n`+kf~yEctZXV%KwPI^pDcF`5%o?SEOiM zz_F`1H4c4+W6Vhuw>UjOe_AIt9-B75DsbrWELui?H`;5aYkQM%OV|d&(Z)oH+LP=c z`FjCXMLx%c4=m3Mz=LB>+do#Pz8{MV)a&m`*O%CGW{V5ebYAVizk=1W*|<>7ae<7t zLdLXY6&}+D@qk85l>|)!Xd>y#d0wB$b8HYHxb7de=bwW-6LlZ)@f5Y+taVIdzASh} zK82X9Rqu_U{HyE)Zx!UfI#nKw<0lp@O{F&XfzkS;eD;G?b~5I3pbP7htg?*aXYm|! zg_-V@kuBH{Znt?|LdRlXin}-uq3ce@>&UFsQSj8k@KAUcopmC(2z0jdEXjW&MeR56 zLK*;Y{gzmr3n`9j{s~)$?QCMf`W(MK&tX;KOVgj)VImz1CtZX=WeMRo+I$1Qt#nf0tqeaeRmvVK7mgRIc{0Oc7UP30*X`ZN>p3ekuUmPYlgx`I(`m9x z(EzrN>2F2nm<>6eR;Uc*l{KDTZ@h~dq7L6BwwPf|r*^)8 zv8~y^B76T`k)I|$+J`LZ5c+TOi_RA~&t2`p*4xRxRPwBdj~SZ%ld|VoCV4Kje6Bpl zQl4w9%w3u%Sqbe(-molhV!@h}Urkv>Rzr9iAhvwca&YyVvaLz!pq2A@=L^WAgm-XL za^-P^J%5{)gZv!(g0LKi#>>G=I5J1P$a1^`95%*gtMds3v;2wK?LSWJ|EA>&?LP~{ ztHkyG+e@*$Z-AfS`hXo56sHbJSl{oFiec1Q%_6!vmh&k`+pxAMPSKPuR->u!#Gr}! zG$mC0CtBQF|J`U?LeTdzvZpwYIO7ryB@SHZIOTpP^~#aCqhGL>WcglJ5kM7_6v zOl~qta91jEqRMjZrsbq7FtGEyW66%3X;M#aZ>#L}Q}lW&$637QY1ah8F}kb?P%H3L zomsooN~!PXEZ--@ZQFs570!8jR-dD{Aq=>MT1wvzY)d{33rlR< zGApx%j>B@s>N9HFA7#zb_P6I+zKq78EcJQ2mGL5en=Mb z{S*f$SvR7I<6y8!|ZBY>I zGsXX{%ommCx!uU~b}REO)oW|zY<6@Nc0ApSC)kuWC|@@Jw=%AHmc_PLWVP)C)8JAWl~~Pq#8d)E3#|w#3l!+*eE~n3dX;HA`A7NmD-0SiYdYi`llC zWInbs^ddpGZ6!~!?bL#eIsW|Y1?46$_vxzX_n4esqCY8XDP4sf2H~9d5-WFDq`YC@ z82Xafcw)ir>B@pF>D1pGg-#Ra!2(^1VJSlwO7UD_w;3TTG`nS{YA$KVdJ<>d5D{+kOFlDI)8#`~ee6Bb) zmhybg%6yn(b)s_Ny&37pCl*k-Ds8!fl`*jmhsyL|`bX&|`qOghqU#94#@h2kArEUi z+Lo|_)-T8M?Qq<)Aof~fuS*BKW9?lf6CcjE=f|W%-4pf-{kE)NX^!t__a7+>=kuoJ z+(mVzi_m|#JpI2$|0r#*GNCU7<+&QmWABqy*z3}Ct+7*B9>$uB=pUt0{zsgvQgj=X zZV;Q@Fs96_EC=4J>!Qq)xaQ_(FSFb)NK;muEa!)Gto4Uw=C(?|R+ThitFg(BYsuDE zXOB%mTRp;Zo~(9^*_!h`$;w=m%vaVoVtv45j>V3cDE&{GI5#S1kZ&{=b6b4J%B-T} zT>A5zZPCW!=2ToFD|9$jqD=NYAf>w$#tWga!cgrSu-{3l$Tn*Lp2WYnhMN6 z%P5}>R^~j&GZE)#%+L3rtLY9-e7?d?o2F~~?oIzFbv0ipwlcwdg>I)TOYwYVVlZE+ zAdVxf+{Jm;4zbuP>)aKr(*zD(Z&Ndls}-y(U1_-<34EI37Tg@?w)CKtIa2F}^2696 z`$;ffQh)oW?6D(gOS=wXYnXYJ@v&%s%lVGAGTZeD%Xt>h6|=A9&?Z3NU)(cmh0A!V zh&a!+oUdtFO6e-Bbduq`@3L|Qk-X`CO!mBK{ObF?vX5VbxYd6jBBrz(71)${VR9Foa?fqI>~T7% zWAE!+TF(pDgx5#sID>5qrv-j@T3LyUmguli?^$ zJjFxlAEj^6pQ*cO8F{JysQp+1UiN9eX8lj<5YOK}&32OBbe|2TJ={k+@NYZt?>O+I z9Qe@={1^vb5c_EIBzPBJDKStz3{63KIy+!aX zJoLS$@CzLIUNd|P4}GsC`~pY5*9zalL*Hu;zrd029S`5aLtl0+hTrwb_r9x#kxxI^ zsUCsJ55FG;>^I+A>cCHR;L9BNatD5z17G35f8fARciLak2&xs9QacS{Kr!7Ay0ph@V!64xA4&S_^w1W@zZrvfb*K7 zCg1y$9tNLpihRf)&G*?r4i9|qdHfn2``({}V?6M^P53o9_PrN_V?6L>^&Sy(OfOML zf`s_qs}B4%2j1zx-*Dh>I`Fp~_}dPAiv$0=1OJBuf7gNYo#ANWr&^`FkS7hN{ovPl z0MeoF{WA*KZ@%|&0-q-Q9|U+hIAWep;9Gb|zhDl(z!6Qi!CTFV(}X|7za5e1ceW;z z@8vphdbLKD zp0D<0bvepoaPEDQ$@g}0;Da1EuW(1x*F?_{$B~Ec@ovmy^1a<0_*Wfx+JW=4!J_GG z(I>=tAF(FiD@w@UEb<}$L=~n_-`g`G&!>HFZwJnIS(C~4_;KmUN~BbuHOeL@~P zEfyi)+bhdfdK2?=?_U*W(fCGhR? zxPC((UVqc%dy^CLe9ouGvZ@Sz`raW4oL|Y90-h-Up$U1z&%Y{(re@&@ao(4!$@gX^ zsV3iBm5?|5XF70xvPCpa5dM%S%KyWJyx~9Bf%98qqiLS-hdfb! ze#J{N`SjYhB+B)2Q3Ag}_(LAvpQ_2H$NK6qe)`^J4*ZG)PS5=%`-ePyZ&#D={VXBR z=X`Ii1HU$bKPvno5AQqG#E&1+WBjCb5(j=$0`C<5kSEH2OG2LW@x5O<@Y@o24;rtf z=y~+2-`I%$cLcbeH~hbH;CCl*{@roP3wijStR|n{5}?QU>C>Yk@w*=LgPimjKYj1F z4*Wg`{(uALyDHK2P0>H(xe_Gkt%L9_yw3L?b>JHlc&+e8967rmj?>*(fpHARE z6#kHB14z)i2Yf^Q|Kz}*OW=13f5=k;62A8Wd_(>h9r#NL{8ix(d7}1tB_VI@^O^(i zOyK+*ae5MIfQKuLZ0F4Z9%|3{TMqo~1YRNhAWh$Q%9t;lSTb;Fk%1$n#Q! z|NVr#;s4Nqf0V$V7ygiEHAv991bhoKrgaGio&(X{$oHljS1I7RC!`@erxNl;e|{QB zGWlMQ1U^joL!PN{nIAkY2S7UXy*>#Zmhip43H;l_uTR}EdnuL8_X-m7hNr&+FHGQP z3xCMNdnPsc-az=KDC@a{1LxN~B$FRJEh&1=_jXCh|55Y_dGJmEturL#nbG%n^(>b1 zx!yxO+Aj7;$bVhrL;h$S7@Uyj+-Uv5f$x>Tj}-op2k%(;-jIa6;s3e=ADY0=5dM%S z%>*|2-u?-BKIMDG4t!Vw|GDsoJmCrv^NdKy8~#xaT%QVM6{L?Bgg@j-ho^|2cXuX} z?;YsC4|3pR6L_z_>?a}5hmei$jZet)Y2Pb%;1d)0Sm6(OPKLOEkY_sIJ1l|M3r~piK1ofq4yurVdz;70w z5WiS66`rFL@=uC<$j^HrHTm8#33)!}d$SVwN5T{0Zzze#&rZniTEO)Z@`p9V{B;R= zlW%W){?}yandwf?YnSAdD4!k3QzbX77&!a%+ zduJr%`82J2IPfzQ_*hy1Oaad!5q^3gT9)K{XFKq768I&;AMy+XKHobxAq;7 zegc0)_(Ps3{{;zo!+)Uzzc_*S9l-Vpd7}J3O~@PmOC9*-3H&JG4|$^eS0v;O|5XnB z>IA+{_(Ps=F@a6A4wI07PUJ(J_pxd6y|ABEj6Z$om!o(XXQFr*mlW?)$Vc`1HTdjj z@f`!i9BeQ6u`$&1b{2eb0^eQmrxWGk@e0KqkH}2X2>0PWgggpO7CQ_|5#j&q&(I;t`O(>}K&e|JMY+UEW29*X(0)#Q69d zf^Wzf9y>A8;xX7ez~b@tRVw)Jb9ReeFj4S_66Kv@AV+p)Q@INQ; zdcmJh;0pwQIe{N1_!|lQc)_&uFf`6RI z_cFnICgT5E!M97`H&{F#Z*R5u{;`bjws=_#-yry|sd)YVUhuCZ@_pRO$7sAi3chzj zev{z)CGgh-AD+PfYVmk`e^>AW67nAlJ}!a#+p~tH3A~TR<0l3PUKxkIL4sGLBpWF7 zS1k^Z9PTCff&|Zgf-g?^)d-7U8Y4Qu;>|I9oW*0XS1I`MiF~UqPRk0BbhyQ7_#R2e z2>$)ljS-YaJ{FI+i-i`C>)C4Y7>#$L;IxPsOXmqri%hY!R`7T)=y^{HPJ_XCk`3zd z-iw~=CU`n7?X4Dkj|6^;;DZzRlY;M+z+V+S-ursqM}o(r1HFGh28_cKJbMd1I)RrE zJ~(wmfJ^s8-wqZ0$OPUjc(}_?<=ZZ?ARW8w9TlwU#|QX)d-Q~Z=XH@kA&}RjTpDm?(`Prr_eeb$=wD&4ED`*U0H@+hn(pAKao}x) z7p6|KSJQac9<6rB-zf6o?~k6e@(&5VG~h|wqrW(KHjDhJfxO21{xqN~Of3uWnf7Re z;HL%nQhRia;6F&KYB z^0(Tfy9mE5byHA}>bL!9fOA>u=K-#MJDc#qsUHVCx|8E3!G99q%KwSr7l*hV$yM&o zJeLMIze9o3DTHUULx;#;VT9AwWO zA;6pM(X@1SJ&z=OaO$=|UU!yUBe;5jd4B*4eJuFhd?;zE{hUNy?BLWr_M7LOXphbj z{5Juv<$A_}?>3lu?hE9n+oSP>?~%Gcs9$Z@GX#Gqz>l!<#}b~6XN}+w2K;Z>qnm{1 z;eaP?@%sqRR=@m=lEJAY&vsv9{PzL>QhRia;Ex9Q?$&>%pmn4^BNB@LXt*)(QUS0RN^vTJOLg7yQM9{A&*UW5NqlF9-4( zL3Y}c^?5D8bzOI;;A(aAdv+E&Nbt7;`8siOtO3fbp!fKV^c>zA%9&IALFx4l(bw|smg7*vXnf7RB z8cGgM6$ZHOyg5$r9Rgf;{+&a3Hb1;q(yl)n%29~9uavv#=P;{&|N9?cRw z+`rAwS?07_@F{`(+tv|`&GU9yq2~!7oLZ95 zr`Nt*FW(Drwd^p#!~M5MTZtnD5BJTkHO2K>2+yYfG6#N!13yRj&kXc=(DL8lkiS*r z!+o%ut^7-Zhx=ExCH%@^w+}=<+>g4&@)QisUalP+_*V%pOu@cWTau9u`2$4$hM>If z+kB@xQyhx{y<)0$FFct3GTyOFB3D4#~{}TB}1ASEf>-%MwFDAS&rLC5pi(#*v?vVes z$cOtR)qhTL$e%9q;l9Ubto}DSDM-fi_Y{0|MOXM`)A%BC&_YdUxIftD7?vVe0@WH8pfjn(ukhD)R=Q}9C ze{S)~glDt!p(0-t$g9P_C-~O`e5mEQ(7|)L$QK9lW9-rY2tF#nx3@h15L~6~bL^-D zgJ|GQ{cIqw)r9=LA4*WR>{x;(Q zyW!^lA3NlG56fPz-5mHg2ro>9`&jsSV4P|M5BHPsbGtY#6Fl4p!q3&>bO+&kq@D>h z?PXx^DZ;ba`85art^>~-&U%LXL-?6moDL8?+}FX+yyA3*;NgA@ekK*Cmjw^^QT)jI z&vql2KivOtvBf6}9`0LE{D*>v`wbqk@-GM;?i0|R_q|5){N;v(eU27`&>@I6vD z2l#eIeQ&+sw*`y&6#Kwf!zjmj>+-eLa?$?uW6J>c2NW>O{iuL8W# z;_$v;4^8n8qkorTwuYT+C zE28(WYi{;xzCCp^zx+BgdU{)Jnd$5gg9O>b*yXq=ZBR@&TL-#BMNQ_G^-w({!9btmp$*VNeB*4)z699|&rxXuhK zU((i6Th~_B(y+L`eA?ux(`!ZhG z+rkBGYjsxesLICH`j)oxMRkivjqF|*8ZxV|nYXVW-qO%kFK#xhCQ_idc5SR(arafL zB)^?Ltfstt@gny3;+o2~88tJC3CN~!)tK=M>uVd?Zc&Q`wdfLvC~YckBx%_=ub$dm zePb(mdz5kd@MuBhnqe8+LdQ2PYF=31RzJOc?%XbG&tx^qUgpRvsob#P_KK;si|R`o z=XCqRjB3aiMoW~;C8K(kHMG>%QAj&st5*!KZmH*ZHlrz-K~|G#0PM~M)&WOl50)9N zK7<0 zy`ylKR5!IYaJNyuI7`Nv>Gf@az>=iEi0Sq93(A*J_$c9{DNS?gGsTN*7q-`%4k)-H z%y5MCy;(9FHLbptyX9=za1U2ry*SIMks9Q(o}93-y>))Jl8qd{u&K2^+Zj@0QB#*4 zxv7(pMy}h9aKw}ZE7k}PKx}1KwsLU~XLR$bq+sG*gkZLF81dWUhyaQ3;n}VNrc6 zMM`H5Sxr>Jm(oCLf!o1@0+dW>U$`*Y^&}M<&DzhLRvG0?%4J4S*MD5QG_YheZ6JlS z>OA5Q3cykBi1kW1du~5lu^R>dhE^IpL?TZ_%c{)ivZnDZ^|fvF4(AL5)z%~<#MbXa z(yeJ?E*M_XM8PZQtFpBG%*Za)&Em?LG1E_IB`2Oyzo@xu>d_PH+e#PHfU!usjW zwebjAeZuq+S;h>~Rz{AipVttpG_{DCGDr!BjVNzyZEvZcT7SH8jZh;V>DpeZynN&$ zY8Fe#_!AHNJXgzHWm_^*D>8Tc+G5w+icU7Va<2rvSb-bxQj8G zIcK-xkP?`af)o&|d6rO8-O@C#rM|T_Ix#kva`*VzE*-<_@w_?~6(jMr%UN==$YZA0 z)i!3~te!Btx~_V0`Sg)BpNn2vMY6cnlNa-xFI+Sb+hm4|I8X7DmqYC}?;&&RhYTLFi06=pA=&3|ImA>&G`YHC{BXV+BL*cBUNosq3I4UIJD zY?xC)i#;^#_4cnCU(Ek9{BIcl8_xem@V}A#ZxsIlSP@8(nn99ivHy4v$?Nf&yF}#kbPgO)YKpbIL}RFV=G-r*P*V zLCm6`v*l%xl~ttVnr3-9%ElLWwq@z5E1qsI5+RAS(2?aWEln-sM@9#&H11O4$l#Y} z)^QmXFbqf>T!J9vhOixh5jicnDy7J(l#C5bCZnfN1=i9ElT=+eXfS6bTbWK|JxzZf-S`dxeFH(@qD4t(fQNtCPAw+~nnc;Sq zbVh^-nJjDGp=o$w^Dv0N)j=^5ErLcvs!HNqri*jMa&FGT>cxxndfTG-OxfZ4x75$w zzous1k|i~?wBFj(Nb0nmP_vlVie?-p;~yhm?lrf~Zy|fu$Y{J~PJL@zOVbHnYulXq zmKLw3W^Oax0ce|BQ#XHs<`nj>w1h7=1`Z1syQ(w8YibtP)-0rHSxsB*JfdiAtF2qW z1T}MM;-M^7U$B5hY`MjrW6GD*)ypz|W<+o}o)*Ge!8ozC@X=h92b;?*5(XFRGdDQ$0SV$DX)Y~-6X zRN`n|wF|8FlqM1kDf!+?IZdu=>Xy{j)SA0J^)>ZsO}fasL0k`3dq$;rNS0GVM-J0; zyrpLAMQBawBrfo3#)uhBlggm3MvbpsNGq?j=uao*+_Z*ia~c{Ng8M=yXqh%!J-Ln6 z)gvXO(~Wb6m(yzUVy})Dt>!e4o5CDoj4W3sZ$3qYNWaE8$>oZOOokS4oQu{`Nuld% zIXx=g#Vs-w+}b#l=TRif5un?bKtQqd?hX{2rRkX6vcMZ}JKNIPN^=}es|MgMv8KJv zbX#xTpOMlwaMMmcua;8iAdtsxxNY&LYXg1;u0XG?xg>S=vhHIReW(%_)i2_u-Qy^s4&Cd2|cZsp_`*YPTx6+mxe9X?=eluXWO5jjO=jW}~&U z`q~zESnD=XSB}?x67V|H*_!#tu;>8Tv=tpJiinI2%;*s=WK^00VB<5{$V5tp1~R#c zWk@tOw?HJI4v^8)>S@S9H?gt~=L4~L{;Fc!XS;2*L|bqKr*0EwYXM?Fv#cB26GHmy zxbbszHY4k3EKYt{p2@V$ub)bHf_RUEo4ebEaT14q5sXYnQ`6_At?V^uXSO)}5ZA*{ z8Pqa1hY*arcc!?qk>+eP1ERaB!DuOzH*+b`)aDKd_%!B*a6CT;NoH$%Y}7}EJ2QGK z+iO%h?$O)QJBmtyZRSj*VSV|uMPE=rF0p&eXk*#uXY8Vfi!~a(y`=UrHKo&uI+#wx zE!S;t--_9+2D)b?oEo2~I)xMH(Ou4*O<1*j!8Ryfw4r89(ySc+Ca!nVTi=uK{*;f=5-pZDusIc8m z>DW!AvRdz19LQ8fV)st`N;`;wRX)o(ei$zODVR}Ee9F4h_*z+hF>VldHus{8<;-Me z&X`a#qlx}g#gZanEI^6OC=n?ki8hj0NGnEd-n>O^v_?Q>vda;sB?kkM?8_)_jf~B@ z+B&4>6G`{3Ar=b_0UL&BNu<7|rLn1oR%>c`50N*wt)52Y+*;{GQ*@mo6WvVY&26O} zLroDKwzi!ps)^l66k!N95qWcIKSg5`Y1Go*NZPSo!_GOlmF&^rs@Aa-vv`R&_juky z8M#z%jeB$F@=f&UIlHUKn=30dk#n{;wIe<;c`(|OZ`k7-Al@x!-J0aJ$bO|rUYV{p zCwVQ4;)_VxcP9~dBkd)Nau>VyCwaAXeDfnJ-Ngf7p$XH(hGU}9C&f3k02 z(lQOp&|b!xwx*f1e%(@6+ge{mEw(WerRdh)CS|noY}7Qm>DsiYd{Oj%_!t8>oG5{z zi=FA>>Yr_QlsC7DZhELbLNu({-ngLF-_^~FU>8T${Z!tf1ql}$Sr%+z%Che%qC_UX z<%#RBzA+ezi>6!K^b}>xzTYV#GpyL`i5g#9Hy`&~MT9cl+7CqmytZxe+-OslwwY~9 zl*hFYw^uheMcGyLdF}KYjhfoJ7aL|M*NJA$Dn1d~mZ@^`UZI1u+q1|dIB zHB-zEzod3{!{SV4G#&HJP}yBhyMAadK3`^ef}t`EvhcEDMA6#N#g$oZ{3)rJJM3<4 zR)T`Y;di4-u-F1J5zGvz!-k$IHnSf2d4Y5kGU5&eMogbiixt_<(5?cVv6x@g*`HZ@ z{PRhEJHyAHn$*+&=#GClH1W51n1_GGuk!SBy#T)z z@Ua$W{u1Ds3OMR{ip81#HsHAgQuz;?rW(dS^r@oT}(X#bl5NBh%b zGbF`%P62#2_&@qBwnu$(AoF0p`rMQ_|2WVGBz6Yd7{=j05!eC`oJww3|MM zFCI@yt$ZAx0yy%|vv`~z`!BTf5Rjh(^;-n^F@XO8aMXVk)ED|^JK)H#<6hPi`40#F z2FP~~;K<|Z*VO*ZUk^OH0T1GP0*?N65#XrjEr6q*M?iUzU*8BE*GJ#*8^`Yh9xU%J zR2EJw{~ah7=f#OX`qQ8GQ*9uR_3}F4sONitWBndxpL4_cBF~R39?$nmhkTj|D83UAggE+<+Xtzp`uL1csz+F6uZ)fGXT*uKroi7Xqyan)yz|T*AQauj=9OFYz;AsaQwLd|T zdKm-qXlE@i%Oid$$fNxmEzbUc?eQAG7lZ!4102hR^9wAOJ|UL*vE982JSe{x;Ikm# z*??nvan&RG3Gy84;OS}G3)>Cj-VV@?&>x-$o<*SNTYxVCoXgLNKhbXLM~tH##<4IZ z#?hZI6V%|?-Zub#Eady5#R>Ah3%EWxmie(==#yF*KLO$h0=A4)Z z%ew(^jANSt$MW{(3@I@WmRH}z$~f}u2l5AiKKkT3K7AzpX?x`BImPvK)ysKCT;!4e z2EftZ)c(wmeo_PFMZdyv4*K~uR-W}gn*LP(a>y5XW&)1u9y)(v9$fcWWaSyhbq{_1 zG2@l=PxD=B<+)tA?r|32lR^H+fTN#d+{3tv^9U>#%43{#$s>+_#Xi7^^+*3dO;Ce( zCtvK}Q6AU3Fz)I466cFJmJ99hzrm0Fl=hokznHJ~*Q_U&i+zt%97p}T!|&q3`32^S z`k>tw7Z6IQGBiI&hsA#Cb5D zV87fS;s)ZifMeXic!KuSH(qghk!O2Wgc9Re-n||8Hyn5e;200@103~v5pdLhI?M}N zNGFXy`n*-XjB%}R{bc>WtoLL){co&yZfn`Gw z?(c%0JA$40>9ty4Er8>=_Z*8e4~~0vJjVLtxb7z4K|A0&4BGR5KpyMyS;+TP%0u-y7tof<3w79#9^1P?b@2)N<)OC0^cN0T1Sj>k`PH20NfX==_)YQP0Cc9{n80 zV~96^JlZoK^lXB1>AD=}i#%zNNBrv!d>G)EZz#* z@{a(H@~;Ap@}B^X^1HABtR1l5yaRBo-**AWa@}vAPtT_pLcKp>aW)^18MNI!3-ZYS ziUWV!f#>xgQc9dJ>N62=EZ5P1uLM1h103zM6mYcXS%4$|lYpZ>Bke>tuIG&o{BgiB zZv5HeY)>9*sXgC_;b}U@>Ae`PaUo?NsIENP&I@9=#+UOAo!A-M1@=2=H|$@~Zg`&# z?T`0ckw^PY))UuP_02VGPwY?oLVUpS)jYtl-?Y^w<-+(`0OiHFhx_QzZ_^-;xUQ41 zp2)Kw$WI49#QTrvSGvx|JZQINz=L+nf$}2HR{_U<4f`qN(f0&$zF3cVpAr32$3I+O z+()Z_Hrsp^SNonE!_~f@r(Uog)1(8Zxc#xen*sL6`4QS}p`j5TwEuFz(Qao0jy%r* zj&^(5;%pz@1F3e~62sMQ|4#d$fBq-f=L&~?82@+K2gi+AzgX|+C%9h){p1c?zwDpL zgZov`Pc*)LNuS3#(kOEvku}C7+4tD{L z`Q8sWwy(!6&L6kXpY~h2Zm;-YI>+g)nEX%!dmqN|F&5AB&4Kc$pACrNY6s1q%Zq;U z-{QA;e-Pv39BYqwJ)Q_S*5f&VV?Cn(qd(jPev9}6fFu9&fFnQpKk}geqn~GNy>q#c z=McbAp2z&0;_@p1NB=+1fnN$Z`t$V`=a1XyPyOol7_NS}A%?5}JrTnPv(l7ah~eu0 zn`5~8KbMmef8zREUqKCyac?c)-yu%b{}&eLZ0@4EQ~X|#=UAcmUjfJY;Mq{`IM32I zb+Vqg-uSjdzQC53<%Q1=Adhx9%i>(#dx8I_fd2;YD=g0C#eDI8;%`Cz6_8&8c60Ub{a6u7 z{ILOeb_bmAb*lZpX7RW_`vZ>a%%cED|CstndK!-r$|?sN^OXJR<#&*|kDuIrLpV)%hZ z+}q85^7ZGCjOtSXIQILe0gmzZNXySWX#Yz9N1l5CUkUj>1vuLC6$joM<^>pUF3|er(ssgX^wX-g@#qPI3Qn?bkZr%CkAJyuSk;Y%h-ij`6&= zv%!B(*w}X5i0v;V-$Mf9_^g%mU0*?0uaJ{`1 z^sfPVw9h;T-e_^QGtV`&yt*%u@oND89`N8k*i!*t1@b)C;Kb#{ejNK9)bo!bo$S9} z1bi~^qkkg*-#{MyVF1+yC)Nk^-5GF{FBNGce--4bc8l|1KaS(N9|6zLfahMoQU5J~ z<31?VAKUdvt3Odk_Wv9N<>Ivwt>3@1ASKqHW4PkYHqONHw;j0tK8WQ}|F_`2C(fJt z+6Ke&Sgs<#alSkPaEz0O0FM361h519n3n51R-TK^`1SP1XR;qMyp;CE5X z^Lvt2{sHzpmkZ-bKHwN13N6k&4+9VOQ^j;P(NJ zapQTwv0SeJj`>ak9OFZs18=f8+vmIVPyO&TkjM6Zode&?`a9Pbwo|;{jX2(K#df#a z^0Piq)1Ug&Eiqj6thD*6yxRTC_F~ozzHBeX4*zNG#nmpf--)-QDbT)L?d4fVdtqGL z%aPDt7~hum@(5k4Jg)ww2-@kRAiuxGxm-VlICC(_{}0F?>5xATa2(%iJZFCF7cib< z{QN2KAbyp_Ii6sDr~N$R*k9z4t?a=i&S z>i-Xm$Mydw;HZC!bl?=%AIFEtkKL`saCoqy2RqiS35vy~@hR?SDPsX#ZaTf5d+PM}8hFa^if^ zZchM?c6$eK2!pcmv>9f;`5zalroq z9VloK|xGE;E{&YbMSDx;S6CNj9sr;95&-ABiZ?4~n-}j_vfzxM%G4W!$s= z1Mw%~KY(Mr`frJQIRC=9Hw)Uu%@Fr+o`vyn1IS}MEVnpOcrVeP#wDD`F|O^iEhew= z@QxU+Jl%<{s6zQuVwfbsBTz%d@`{EOu= z9=-`&(aj`}YEo~Ju&~rl-Kbg^WePxWspa^x#qv`fIQmsBa6rFsqL^~-xO zIC1@AJ^l`Gw5R_5H(p;)L%vvFF8~kL*ZY7Ye~O7Iu|A0R0UYiBb-+>HHUB+U*bP6f z!|OPW^Ib=rYPYkkJZJM=z<&ZfzXbd}z;Ru@Ka>~aWEJplrelp4m&b6`Cm-yL^6LMr zC*y}%xqQpRmGU~VAcgX8_kM%_R}M6vue}I^bxZw=K^3{)vvYydQ!*+9%C|l;Y(b z0yviU8y4peY^SpAI*@!K488DUy!!G!nweie1on9j?D^$=G-IDJ5VtYTQ~-`~ zrW$aJ4@UrwJm&(A{YA_4E18FJ z_2bK9@@H7Tzb=OB`q&?0xbkTg?gDwVgN_s9<>kHloZ|k&dkHwj%ljhW$lvL}|K`APzJ@$GtccAQ<6dvT zG4AaFIP&b{z%zg&{}{lL|3tvCeowJDf3QuozWBEQoY-zyzZU|I^>qc{sQz9h9ewA-_+5bOIuhfq{_A}@r}1$mXU%(Gt{n}8=&*eow{7+c7dH=J{aGofIP;ZnSdkD(SRcl{;myqP62t0pQ`}J{_!HfvEHw+ zI5(e{=~&wfu3KXN_$2V4pFamU>dC&xiTN?!z5zJK+rI-3#@lV}zXsWO!0i$B!Qa&) z{wDg0`h3j!$2O#Z?ixi?Rgx?|GNYKC*bJ+DaZV4DBxIMqaChTLJ$y z;Oi~U#Xugs|APJ9IFRQtxvn1`6~p&uLQ1Ea4{0wfulneHb{1p&c-u~Hjmazj(=lB6 zyVKvjLfo3~e{z3^{($v}e$`;@!0iI#>PdiOd&hYq#!ubPz&zOAFR?saFRy~#t^s~* z?>LXc_WKOTW4T@cer&%up27C}SKz_+`w8G^pFHbFarD_AmXle*9iHpBO|F_ zoecPTz;S;Fwj-RUe@fRX&$*U|?a#Q5V|oGp8#>w7ejjN+xx5P?-%`Nu0o=u-`!M4? zwGN(9fDZ%y=?=U<;OL*bTAV06eg=!$VQ-K}|HSg5zkLhju^!8SAN_4I;OK9tKlhmbbW4qIJHkL=8mq8xwhV2^T(!W3+?WXOT%gbvBs%Jks=EV78T+-itGmdt~ z-)UmGbU#wu&XX;F+|GEP9qqgT^g;es2mW2a(Vk}kjy&l9>!7}7vJoh8d4C4@d_m24 z^}B!{XK|LlAMjrSj{9)#0vzL5vBinP>q$Cm`_Xk{#kIb=69;%Kt@8hkabPp(|79F7 z^U#;Uf4-UzXNdWkM0E=`}aQrj^m0K9e5|;$b;hnwC6uT9>)oN$hMrg|3Z7}dKcT_ zuVDYLfIN;9N&!dv>;5|CNBii$g1G-2Zh7MNuK|9ve%WSIIht7JM%mQ{5yg^IIeI#XJbE*ca1kV=Bxf?tUM*Q zKjOa@G{m+1V=TYQs~`Wj$0d!sY=3M=M_W5Ej_qg>;Mk6I+`{(x1K9cdAdl_nO2Dxl zT@N_==PedzevD&x0*-O)H^77K=rO>NU+a_0i|yz|kjMD51#p!A0C0?Np7kH*N1i|^*zRfp$M}rvB-kI}J~Zr)jt3s>kI>H8kEng({l&$=gZkj_MiIw#m~~K( zSYI0fe;4?#0$j&Gtj_|#dG8-5{&<}J)Xqm)JT8yV%dG|;eUC$2egxd-!h8<`9R2Nl z(1*wHs*lUB3RrncoG;pE2SE*v{$MDcaG&QffG-9+Uk^NYfZhHC_?>`%0{E{0*WXjK-T1d!>bH77 zk?Z9hkRMOSoEU!>@MgeKAN~Cu%cDN`fIRB6!Qyd!cyA%6xIV0#;;2tP3sPbpY`=po z&L7x*_XYVU=veJ=FyM~?j=vXM064b=PMj~ccm6FfC&sb854Sjfe2vPY?U45{a8leB zQ`Q_1*LMDgn7sPczq22CkCarq{lCrm*j&ag8p7|}vW1M^faEz1K zuHOeczYOviCvp7{<7Ap%||D>bfrL$?`f*nr8D=T*u$8_^=)De?ZqN{~(KVJ)(bp736u3oW`FL zkjMJfaRuvhGW}Ej3BdD5z;RrG{&tvyAN$QF;F$~Z*sdD^M?Dt~`9}l(BhX*xam@1_z}JHOe87JNIR92l?fgf;&jI{pz>fud7wbQq?-_uX z1AZ0YbHLwtFOcSYD&Ri?{0!iU*b{KH+fM+;dc4)a&uhG#SbyXnNIG+h+p`kzQYhC( z2fh=`@9@1CqX5S^a46snz>m-2NBnq@$M~?ps4wG$eW{FU=l31>GRwooV0mpnXT@-B zZ|BEwokv|6!?j)A7{hh`-`ncLb{+=h9RN7i<1P+-FyPo;h60W}uJ|(!+&^)?gYErB;KBC(2M6A1aZ=H{4g91G+6A`j?^&GX zd2K}fY9-+OtOms|bl_J2jy&2}NFuhm7TY(4VS2^%= z9r%fWp9Ow(9pJcLaj(U>-f?|H=QWIv1)i5c9`Vh9^Bi3L2gf0}9&)seGi-wPS=>klEGEV4MuWBfS*4x$M9Jezb1yOp1+LY+CJ}%;TlICiQyVY{uskgw)wsh!?iuX7sJz5 zUf;XKe$IB#IGAtGv)ypLg8NoZERXkpcN5h3;pI>-IPSuAh7ll-^{e;$m><^}##wpB zuK|7>UrhoW*OQUI7V^dUR|DV}Z!x|h6f{redX9Or$=e+$T?o$m!4*MA-Z9PRw9 z#o0dpq&oQqpdvWi}iI7;8q(@?@hp~tgbcSgQ7-76K9;G1_eb-7=v|4B!LqNnlcF1fdq(v0*N7L zaHvtCf)S01iZjmGI$-O7*C{w4)}d%^i><9_wPKy(RM9&8YkhmIbKb1%eFmWaz4!m` zemMEQ^Pcst_3pKYZ-2u%yaxEifUgDoKEU&!UU;6R-+Lm{4%hdz-*O(_0zcP)A6zFq z132d4MZj@>_XW&p!b_3h*xh$A0x4;Aqdfx$w3Q{Aj%y zNBiB`mNIINIZVVVvLeI8GrutOxY^E&IO}^o#`mIKTZ2aMV*HIQz%>c?#e- zztw}Eqap6ufTMq1AK5%y1NJ!Y4FnvoyN&|w{8AxdzvE+#LMi_`>^= zyw+8FJ-_Gih~sO2@Pp$^uNSgCjxU{0I1e~K943Ak$MIDrIQzlzh1c=W|5&g`d_3Ss zL7sKKWdC^FZwlBq1CIXZ0gnFhIEePQf;}D|2LX=9M_pfWe)w9Yw#zTT{ywM|#>M02 z17MH+^ACcvf9#)nosjc`$4z|x0gs#by(Byi>T^o$2mAA-)W^6mj`nyyi1_(Z|^*(bzx{lvPt@D|%Qv~JunvhHlJ z$7S||{byUTXPsT>kJhU%_~CO9#fJiZ2jF_Wjs0VPXa@VggZUvr*Oe>2#l{)+^+`Y#0>^<#fP{kH`C z<8v1{uRav8$KxIL|Ca*xe*%0sRYLp8TY#e<{Js_DVQcAEoHz8N&U@jJla9|_JnxbPO+OUFIq*uEPwuWm{jRR6}B zSI=SbR9GkW2OM`@A?{_7wX?@@{R-gNPqd$N`fxq)Nx*&`;Ml%hr9ZGAeuho+p!2ih zn)kiH&-OUPrR+m<#sUzPkX9?YlSNIG^BoE7}hPdz@Fx0mu6SRe)pu#|qAQ z;6AVUsR4Vu{(k}BI1m57dA^DB*dw5)7W6*_IOhL(z%ifN-)uYn6YSAX3E;Sn)$3H8 zPwcmNT*LK=J{QVyalQH^_`eV8^^V}||7^f<9s5tfS4jV7|2V$zc{W_H{v%+I^D6p@ z7MSFl{o}Z}TKuriv9z!KxEljh6xZ>i&+RC#iv8cY=P7`NVZT=Cc6&U_SZYIv3kN`P!)u$LD5oKAaG+KNWDaZvY(g ziR*+a$lDwzC(?O6;7b9={QMW-qrm=Cz;RutzhlOEXaW1ZKqs#2@OJ~y&k(S`4*cl< zZ$eOv*Cg5>@ctd@zZv`>uGgh)d+GT&<2awcC4M;W7NF;Qz;Qn3zRHFDd<6Ep0Dd3f z2LZkc@Jhh%0Q?fbPXqj#O{1{U{QMg2YJP4Lob}*%j|39NIQEn23{c?>`kx!XuL|Iy z=YO6Td#*+f=zj_PEC&1oz){Z^faCG2lEqVD|0hrz>AbTJ^24|u4}JtajBDPuhUaP+ z*W=BO2G{e50}Zb8<3NM!dFD|D*LgOR>jqmwe)f!N>)H$F!~eT(;C_c8+v^55K|cBa zXw&|1C*U~WYI|}w!g)s9lkwr;NBf1f$Kz%h*lYh~dyLx-dhodUwcz9;hW%s{>cd>v z5B3v1pJE)3oA|sC)@yI^!~XHOxj*1|-0TB!@wkc4pX2kcI?vnuRD&PPr#?qy?XLuT z)UWG9*3ZxIX!{;Q@3}C}*E$r(>uHFWM%KF^823)FF9rW=1NL~F9Siomvv4ZB!9466!21A>dWH(l^}^#0KdaA$ag2-qPYU*D zJYHjdZU8@+pWguf58BuKIDlUTcscmdbpnSU1o$t-p7CYW7OLj~ zz#j(u3GiPGeqI6`>-#3)n4gaTNBb_Ecq+WX{Okxgw%5ske+qhZox}CQ`py=6#vZ>n^NUJNUtQ?`yz61OHuMox}fkgVt+v!I}0s;M)TJ1>k!Cj_ru+F05}6#Km?j z1{~{K2L7?W#{rJ(%v+@4NMdX}wWH4a3mKrIxSrqM8NlC_ey;YKpDzRW1klfMb^STR z;LkZ3v9k=$&+2ix(BP*Feu=^R3ckqTErMsVUVVpbwO*n1YHuei8rQfE=?^&0Z~uws z$#ET3EpfSB_?cVPe;Vk)byNe`zXJAnJqNGG*e=?CZMz%= z_Si1EK4E)omr-Dkd7dOV+rL5kng@JN0PXJpKbU{~e|azu4}yQp^J9Qxp7A+k%ribu zj`>*)dX_>v>N<+^kNNo&;=W7!T3`OI4Hve@`sQBijanb*n0M6f0bxE75q~p)zZ<~$ znv&{AKYXt0!@mO@^@sjH@xjhbl(+kctNlT*Z*xBRJGP4B^F?@k)cXb;zLxru@^wB} zT*tqDuSaq9&*wy36xZ>P$#I9T-Kn3@ai_q!kNo5O&_{5tFZTZ_A z9*=AP4%qJi^9&x>aQ?@<6@xwItt5aC6Wr$W7{D=~$AKTrC--44TwjbkJ%G;&;O7F4 z<8dzFIG^bA)iy33cTi90xbqPBNBbuLM?KF0j(YMqkyKa@_A5Q_W*m<@2Z25ItGhj`h6;{O~g^s-Nq~h4X;* z#qaN+e*Aw+QGXlwNBz$Oj{1KGaZx{iw}lJq!S?+J;Ml%j0gigU58(LwCuon~Gs3tB zzIhpWf<=2FkA46gknljF{t z;6HTS`R_X484Y>E{#*?>j^BE~u|Jx9>?zzz_I@?1swa&BZ9Mk?Eg;! zj{RScQ{2z7|NlYk8Atzr1swb5dw^sA{2p-3TUV+(7uNX~$OC>K0rR#q*yHguUvSom zc`E|@zk&bZ0s98PG0$fKj(Ip=aGU3OfMcFp!4Ky7X23B&dR^D%=K-+C{O~nKE^Lqa zc^d37KfeciTyK0Fu-}XwQ{g=0dShR}F>eO~j(O`F!0|a2?6)Oi&l}8V9QgpC51?p9whj^UDCoxO%*^ac>UT-xa{`2ORZ00yyf~0*)7GkH6c4_IrUn z>fb+rm$`IC`Mi%b=y9PMaQ;7A6~7kn&~c}Z`ksyxJnk^A&p}QTKU{6b_55g-!8L9s z$DKcrAGHr1cM8Bij;~D4cW``#&Ua21|J+Y-eCctPaU5S)f<3m^^#S}=!8va@zVv<> z<2b$^06#ds@OXjq6+b({h5hg|A(~G-UffC_DvsCFuwGwAUOJCcJrA<_^?I7szZGfV z!g)jecs&jCRsi;h_YUCw1NdQpyX<4 z$Nc|FaL(HwXS3d;!AHn}5z;RsQe0UJ}Z=_slyUa1T zj!(T$!g|;~F8R%5-g^)HhvvQiuJty~lh|H0kWXy)set2n!FIv%g4dC7yetAgI9_fR zob&t-$eYfeJT7p&;B_9H-&TWvtk+xMAIA%}FOC;I9&%h9FPlsIGmieZ4dA-2W_!#h zK7WY$#PNdT;v~_}e%hd)UjaDw^XY`78dT?r;0OER zseog@!aQNz*<#QBv0pU6Qk{C?ttTd0(yQf_KaTzI35@9d7B5pKR#FX4B#c;C-l78 zU%>uIu-EyVpbpQK;W`$dD;o@XMxEt=<8wiH9RuTD4fds=XD=2)h4X{+t=^ZkIL{Sa z7@r1yjs+Zb^0^Newnv?M-pwCBO@DO0J|FDyya}%lk0l%JKmP=KzQ(Kg=YsQw$AaSD z0*=R#962xMk8wW93!E<(0FL#-|NjW{P!_O15%4t>Ty;(o-0GhOIO^Bm$F}+xfd6vv ze*^g8HMYiG0yvLl#qS6FVZa{+|MxL*kHH?>cOAsVJamQUrm%hS`vsVXoy4Bq zVIFz|j`LMNz;RvLD(yy9it*g|6L~+D0V;~?I%#qMKMeXm`}xYzW0e8?NT@H{Yo76U zn;Fj&Klr=NjQ0@yB;%)_;8P8LA91+MGPtfA&NuifXC7N%@LR;swFbxYTc&cm;BjBa z8RJJ$4z<3!urU?J#{s^7ggPA8EqeWpn*rzHfnbmRO9039MjUXo?daNks&e5~ifeoARy@#g`@{QL`W9H+a&aRJAvKEKU0{!K;oUj*Ze zaqVY^8(jNSg~4}a(NxA5T>F!bKdu+{=N=Ku)ff8}o)2Qb8W6BQJb;%6@M8nGo~FV;y~Xi)o43KwW8nWez}o=lwVB4%^FeMG z%>Qd(kNDaEuJg3@^L@Zx&->W^-=JrQ!1&r%aO=N+03QN4o_8M&{&s)1i|s!f>;9?E z=hpvJh>P3;wZQ`n@WvAOF7?JnrCmCCyi$rvd&7*yHu9KLU>J{#U_S z54PjKz#i+>gA+!DH~cKU>cQ{dVLMI{d-jj#1y_Qfo59chV81=!Pl7$R`-@=D&s3|P zKLNf2_|fmL@yFjB5}h}Qym@69P76^_ftGSxp!aDqCV9~~R8 zp91!$L4Ug=VE+u*cR2qF*uMkz=>Kc59}4<+lphXa{kX2)18}@dPb?v@AeHv;%afMdIFkwX=w!g<4X$rar8lb&FY z?NSQ%IDTgW{yOCC7Qk_Sz7O!eV7~%z%)_4p_`87Pd9mJ)=K8i!zvVfOi=NjguJ;ML zkqsBce~|Y(8eG@+$I7@(ruVTgcT_4HBIF<9Wvs zfZq-Nhk_qm-&O&R`p1Hwoxslout)vcA2|=G|17Xa{pW*!)ISe!)ZYqzQ2#xEqkp|0 z%6g6h{mTRPF944A+TYm^`u{uF<9hxZz|p>oj05Xu%K)y|ZLIyC0ec;1RMigG+4TFi z*3XdvKf?m}PXqYL0UXZ@Fc18!EElWiT)^>sim#n=;dx=jC(f$UoNBw%eh4t?O`MD45vEM!k zIQH8WfMeX31!w=*Z}s{N6EKkrEKxNzJJx&CuwnAu=grgfN3Vn7?+job?f^e{p7k-{c>QEc=!bY6 zY)|M{R}fd{CH()aG463-kL}n9IMz%5UwB*J8^Ip^hWSz_GrifTRDP0gl(rCIF81Qw3-J*zV_nJ?i-t;CS8aRlu>` z{{sH;y4hxM9qDFh_kG|zcYDC`|J%iWg8%O}<{zKm*a7@Zfw<^L|6g5}doI}P^A(I^ z-fjUui2pKxzW{hC_>aj675hj0M8Ipn{!GCM>Tq4t_$J3R0TNB8z%wY7wUUD_{a6|Y{2pQ+xdW_{ng+f=hZs_e+}Z^2RN>u z9|r$;UG7P+$NsP)VE>nZ{eRc>v@>$30jY35#OrB42ORTo9pI;7-U9eTfb$w#=g&K% zsBS&L=Qvl${D{xtFg{f5^m%4-5o3HGvFEi17sa=b_oEE1aUX|%&VHK2Zn@}GKYtSZ zWrOQ|xHk;0=bvj0uIG(k8eGp4zBl+nSDo0Fa6N~0ZcQ&P+Z+6MqH`~Ue<1b;8eGq} z2O3<@1BV&BLi~&}xSl_ZH@IGpIL+XCz2HoP>-B;Q4X)p}xx(PbiJn^wzFhEo4X)?^ zj~aZP*snCWp3ncu;Ci0$4};f>*r3e$9Df~z#gB6;d24)KYds@72e=_U?AYA=Lo@B5BfPa zfa|<#^?w5X%gC4N83pTS%zriD*uMB21s@5$s3Dvz~XW|4YQr*T#=tcixnRQ&D>zR~m;u#&NW5WZiil z(0POHah&D{?Dc*T+hhLmx;^&8BLjXa0LOVupQq+};W!-%_BdYf`$X7JR)9T@(^mv% z|2R(dz7W?7$EiLCXz`1w?YJ**}h>UjdHe=r;jB&jxT_n{nZ|Sl`zG$98!G zaLk)N2f`nto}Hn;VLSdsaE^=P3(p^M9JR0^750A()kVhZ0^oSw^eW)k?z>WMxmZ0z0mpV9EjY(TKf0b`KWLB7 z!D2s|4SueteeEZ64X*8XxxulWRR8~kcHe=;P_gZ<-*>Tjp6SdxjqAGs$9C6sj&1js z#h!6&_dfuR?WNZ_t)62f&$b;;g#4qQ83B8qW4W*&Z1?lQ4?mNv?XJ%=vwp_4-Sz&L z;{Vs~9mo6s#&+jprLWx?_q99Yw%xfu;5@86?r%76ukSq1esDes&GWjBV?8*}XS;5B zl=xgYE{^w4Bh<|&IM06#IF9!p0mpHQ_q*}9!#U)_adFc)^_J>?_3nu_IttL+U{~WEz*hSp}EdY%=}E{A>n(dIfO3KEr;F1V3UP<7(V5by1AB4DojybUu>HjS;T* z=&k)$0eiid$M))v{clb7wlE&@(+%u5#LqSXKYEUXno{LqTkxZtRQCGa5Vpm9>Tdut zj`ia2cWcq}Yxds{aP))v(a(8ckACI=o-cve{}F)q1iS~}g@A7lc_;?_Hn1-Ndc z{rr4|7SzwrV`xGBMS$mv0qg%I;HZBH;F;*xXD!)v3ICzO{zLltxd<(&pP!@9g8DB4 zJYNjhzkX+mA=JMR>@(4yN&e#ycYp9-1^5AgV|#4}?TGa~AMCNd7Xprcasz&z0ekfG zEa3T|vnSw~w_bo_-tGmw82mf{cnRPS0*-mpdm3ztd3zM>$AO>60Ivp|*J)a&0Dd6g z^?)A)coX2g0dEHUV8G`A{uJP?fcF7h;HdwH=Iy~?pDzT40FLzs9GX3*`D9yOTWC2^ zb{Lmi;t`^GU|f%_{K1^)Qx{W@)eJ2HJV*9oqO@XfWWqW?;Mu@H_^jOagp+1!;@VY3~R)UJuy` z@Y}(Uu1WY~To>uuhw(LF-<<&|dS8*Nx~qb;-9zfmo816E4Dj6nF9&=N!1cZWf4nE) zI%hJjYk&UuUGSr8_=qN*l0VLm0QX0a1&r?lxIT}>_`ZPm20!}&J^=6n!1Z^8*iR3@ zM}YnQfa~`;*uE#=wP3GnLjG8vYhrs{lQMpbvDY?!5ODpiOSXRk@ZJna(dPi!zg~0Y zkKO}&J?CY-s|<3sKZF4(+W=muAZ<$k*K;WTxB_s!XTo?h;Ce5Bas3@0j;nJKu;kmemmfLt&j100Y8iZDJucj z@5Jy&uL6FA8q@Y&!1bCpfBZ4vB@9T3%OuPCOBJN;PXRv)@Hv2&0lon6p@8f2MeKhF z;D0stJ1zX9+OfZqZ5F@UcI{8+%> z2D}RJF9H84;NJs267T{!m~nka0e&#xqX8cW_!z)z06z}!g@BI*{6@gX0sax-KLh+L zz)t|Yw;Xg?|M7qi0G#c0j8y`DGT4s+yc%%)-quNgB0=^dP zCjtH$;I)8vh37X;0el<4Cj*`j_!Pi<0X`M*69GRJ@LIr61H2jVX@JiMd^+H_13m-r zdjYQl{3XEa0sjNwrvv^a;Ce5EKmH!@MzAlFMHu&=2Ea!E&h~oDm;(5jV1GK`O@J>0 z{0zXC1J3s9|4qR49y`)vqOD*)dK@GAi?1N304v%U7A#{s_3wb+#A+^1K_2A-w1d!;MW5_A8@umSU$TQ@Wo(%FW|QT z{t@6e1O64@Y`>3umbabTVg0uY#+zLMzXR}bfZqmq4d86A{?7q?3E0mC{BFRX1^h0+ zUk04*_m$7q0)7wJe+KxyfERA>-f(??1^8gV*?uqiY&76Y!Tuz`9{_wI;P(T5Bj9YW z{vQPVL9l-U@P`2Jx`TVe`hNrXHh{DJNcpTM;LE_i2=GS%Zvy-gz|RMq?T5=}Hvs-P z*xv#8lYp-Q{4u~k0G#ay>1R8-9j@;Dk&0f4jp?($g`;O$_4Jm8-Jz8LUN0lyn?wpabn0{$h~zYO?SfbY1Qd&By_0DMot z*2mCw0{|)$Nl5nmU+pGV4z@v-e z!s!Kgmo7<1Qvm-l3CB(cobA>BC4g@Vey#$%E8q_Tz8T<80KPfkZvvhJ_b0cU$T&511pJRkhu2>3pLzYF-@fPV}) z+sm>rma{iUclSpMznPCE$ku{wm;X zUqwE+e3Tz;-2ExA{|fK{fS2r(wC@La1>kJo457!FQzO5d=S_#2b}FM z5dUui{u8i&5AeeP&)e4#c^n-9_^yEKcf#0mG~kDW{Yikcy$st}BjEbm?d<1Vz{|kT zvw)WZ{xaZfuj73!;KRWFGr;43_uh}AyM8zn@Bx6cy}XT80zMq<#{gal_#D9XyAK?1 z0pM(}`MDkNW5Lh8fa|?Z_OlLfea4vaE(QG8)r;->ySK4D03QYZdjPJ_qBCVQ;QD{@ zFn$u?Y_Iwo0oU&uvi%~!$3fg%06!k^j{qMF_*a0lz1AzQ2S;)B)n}^t{jPwY1b!v~ zegfdr0cZQu*a?++fLDY4<$zBF{7t~e1O6W1Y=5$IAB*kpb~d36KXWs9q_q;F9rO3z#j#i?dzTF*z17L1N*-MJ|FO&y&RG2dlBG8 zfU|v#_^$-~60jcw_yWKe1KtAo-GH;bovPs z3&Fku@T&k{2>6wN-v~I{pCI{J2KXYdUk>=SfOk76ss9?lcLJR4b=^`3_zhq`81Neb zZwCB&z~=+b_A-6NZU=lZ*xw8IEr5Rn_|1TS1vuNQ|GeJG`rZ!qy8?a(;Nt+l4e%Pk z*Bmw?{`_TK}3FW`qAoUHG!051oe?Im5YYQXOY z`&gfuv!^%KOrULJgWFEgy~f(6##o<8HH|f~J`-lnjP+rl&-kAmGrV8@#AyS{8ye~w z292nlIkRSRZTT7INuSQBmK>UrKj_hSba$Sz9y7@28kP9osOq zv4a*?8c8YYe{6m2jG=W6>|pAQ$>k%5A2VwFz)_72{3a+ikaW&JXPKwvem^7`nyb2P|nv42ZHPlU{#weXo*U(rysjM$& zsiAgSO`_SnW`&Vi9k((!E!zwjF^gKdj6UH`QPii%<0oko>oa-c#PPLF6Km@m$5RiQ zR@>Q6GQClSiUy5pq*~N8Oe&o=t!`pXV_n1GqiE-}QB%*VEuY?}zNVqEPa#F^AZu{N z%sSUxMSV-_sWB%}{-)P7mRAj*cvhc@bu(r*);HAE_bCjk&e%n`#!*_+)VOo%qiPQ> zkCHUCZbni6#O{!3H8W>&8~A)?Kp;?f7 z_eKlwACf*jJY#Jf=@cNX^hQo`;eRUS>*xJHAv%j>uZL(~rqhi@TD{JgIjf;|%#5k0 z&x#hH>pQADd+L7ix(2F$lb14h)$o={8YL2mI)EAIbH+P#4`YTi5d&;LaC=^Q0l3A-w(EaC-h z<{@udVfA|9Ze_T$JRH} z%5L!Vnwh7KZ=79UTV76QuSr3&()n-F5la7mlblXz*^r?)cvNj;W$lc~bRFYAG+;VL zNGm?OW7~Spvl|p-<5gi`>CBl^C-Vu-sD8fFG~2Kl%N{UfT5U~3HcQX-aJ}*Jklm3c zW2u3|j5|Y)F3b(-+wt5k<-s}~uTwtgOmJFl#f($xY?$zoDFvmI`}OV}ou~fL47U+O zY&`iLCzOpYy`%f2YWcWmWbq;#1RUbp3S{U4@&% z=dN^JaZ<;Q?va=&F(fxreo{JKzersC8bk*qUJ+Qmp|DYw(y}`RbrBK?#!9C<0U;{f6aiHvbq`YlYs-$ zMX*!P^~h9uT4EaMY57U%k~4cC$>vg8l&Zw|m^7@R?#%L$)Bi)O)nKrVTBU&%GiKH{ zG?q`FI34ftcxGjrxQrJ+(FMq2xfMlc!&&5OLt>;&Q^wA{C)%Nox!!5=MoCt}JMxkT z{p6k2Bn4*)pJk{D(bVN5Bwc&e4A6T$6I0ylF-9ph7~5p{z*x?_MR~H_kb%76kvdgI zTF`UzHM~eq#R&ySjCi_qvN4Cb_^qJJG1UC!!lli?ZBqZ;NJh9pV4b_!dcAYPNDpmcJ--dXNH zx?$?{R4c;`_nZ`K6BxBn(Ez#wGlL$9@!y5@U%$wh8A@)(4$`RaTO@Z>Q{UK4dcjFN zLvqSGWauL)z~2Z1r5b@&@JuW&gK2pw#TTWer_tTFpXla?1WHrf%1`>~&;XgzQ`TZV zMEDy)`;za82Y&^MQc+ThPRUFL^9$8xE1TL-JCPnonw{bKL0VpF$!Y27boZ-jsO2Z2 zM%Q&tajJnB7$sW178O?=JE~$_^t2y6vNXD`YDi^tLA$6gV|ojNk}_}-9YB+V&-QX!4MT@Mm+B2q3 zG|ywwq0`fAY;&b|;%SjgNTH->!c7iVuiRp;GWXPu3!D^dg;b1`LQ@gVTo6^PxTtL$@Qj*ivufR=Bbinpou5#R((`=nk+FOVo2YZL5&K8q zBFMZCiM^>qCx8Ct@R%hvB`Pv-WbI78VFf)VAv|Q1@<dK3+C6$xAoaW&!*(s>fgh}z)` zWq4pu%t&e6gwm3hmNG$U*`E6LAJM776N^WGhEg%oC&teX%gUTHp@ zF{${N+NQ>e#@gw=v)N4Nuk@Zm_05Etveub6@QmFeTAnsm)iz9@O3#+k*GD^^649a= z9>1pV)lI7{ZKNl}CeW8-J3M`zoDLJ0y!-=XSyzJ zHfPeEk6^d`KEKGy*+$Bu}P``nxZv zv8c{BjHXg=N_437gDWFvp_*n$PFe8`eR%Q^{T4*WCh0KUM-P1R)e_G{pFT0`=RK6E z_4SrAb?fUi+1v4yt8bzE;S26o;or1KDJU}+$?)DIEZt6>I+MO>+~K-=D6awIlqv(9 zjyb;vOBh_ z(gR>da#Be^VAg!v62I(<2>uCG^A$Y6zqlm`VSgb+gN%AeZPf& zlV?}1GJovaLnN|5DgoamxXXF+tqpo+gmk@#Mz960=!)U$Mw@=S-0dedq%b{J~yY#pS|Ctsz@ zBuAvC^Ma$8?$|P)z0LdA^pPf+?Yi4+|Q#Eu#)x@eZ%0~?tzY!9(af77J*~X2PE`8B5rt>hY z8h!?SF*HfW*>`YCPU^~~q$b08o4Tl9#O5CX=qxz83YNidEoA8=Wo@$bm8N>3v_>^c z_mgbCUqy0bJdp8By{1gS#*^%A@C|d%-)v5%Jd+NbSx!=YV|pW`yrXPyUW)qiA;CWm zLUm5fN!iM&smT=2Y@}Z@o>kvx{IJSnk1DMkKYr${3F9lqW9Ewn%p5;;20fFR_+@9& z%U}N;U&B8j8vXjV{_N@ce|?dEX0!N|hT7Unx=2o=gMQLG zrRF9~4A(w$pVEuZ*!YX)3HP0ll&*}O&r5nfTNq~IH(pY*Q(Ey)nNQ=iyRPqkB0b+YuUWB{38^G@l{B*!{60<)=1=5J89bpFZsr?yocp=^sA?Hr{VN|Zoqro&XQK^v&_P267aqd#vmqz?el$Hq z_4giz+z^>Kvr#YMCVHsrNo8YcIdMvIqDlV1eWza9kuZL8Q`30*b`VQU*+M~WWlfY@F!-$ulMjLWx;Ru@b}1q z-|FE{&Vs+#!=I7`f2oImY8L!95C60*_^X7E<9}Kf{5L)Er)Ru73x1{W@%WXW1)uvm7v%4g1%Hl*zi$@& z#lpw-yEqH}QV+i+3x1o2e@PbnRUZCjS@73*_^ny++l7zg|B5X5-+AIM%!1!-Q`dj6 z{jSP_zlVo^Qx^Q*9zOReJ#Wx$==|X@4}ZTb_?5!P{NI)Zf1HPZdlvjj9{w-0;MWTu z$A3W<{7Zz7?azH$^RC-a{%;UIoKS@16rKKB1}vfwZD@XyYIe}hN=x-9rhJpBG1 z{_eC);!~Z?-Et}M_d($&0NIh#q6EAT?J-7OyF9D$y1x~)8+qh<(vMuO8Bx#c(?igdw{=2h}$NZ zZpZTfMttt7yf($MbQ=eB7m%;NPNaRE&lKN`aB>mri)7mWMB?`|INNg3Enk!8{most z=rjIPC=<%a1mbqA{{4yP)4x*mFA+ZLKZW+Ke!eEn@i#H?FOc{$jKxb*w*q`kF4C`n zY+HrTF|k=QP^4 z`P-8w-YC8^7wcGTmBg<|Aa2LT?@oMQ`z@3Bt-|N{(`nzvA0Y8<`|T=*x_(p{nm2ua zazKBf@PDg@vbFk;59p8Qx`Zqd9_z2CeXDxR5xU-3G^*7D=j}lJr4s+Y($xRWK>SvT-wN?tJn{4BIM4aF z^*S}z5%&_lZfyUl626_kTZMnL5@l=KZ#eOz{22lHJ2(LIcPaU>`MW^%8~&dqzS^q{ ztN*!x{`L&@w*~Z9dGufI(f@To|Dlqobovh^gJ}Gi`d116VXe4qZT<%k-$%|BCG$ zaTnq1#>j~+6~68NYlNRJ|Gy%>FaNQfoPNwdUn`*MMn#W{o6tJJr~m35oL##7*9zb2 zUn=~EO@(d#tBLQ^zeMz7{%<5nR{tXb{in#pn=b#m(K>@ATK&z!KPHX-orv$#-@J3@ z{4e(CA1Co`|9M3c&)3(m7&)=K0{Yv9pHBa+0sTF9>8$@Y5@PfJUO@j5(!tW{?@tF< zU;e9wpKkqp2=RUSU**w%r$>LQ#JBl>L*l19{(m3P-!A+jY&_bx{eN9Re-l6KM@8Jk zc>cVb-rM{Sr*#tN&+6Z2S7ygz>Gc0n__qHS3cst9;hfQ5tN#w-`|{r^`m2S>`tPBA ztA7hxr}*^umyWZy@O5MR|19BK{nf&+SE6jK{(9p3^tX%txbRs2{j_iO|1O|^mBde% z|3hh=5cPkf^G)IRGPte(0OCjbja@N6>`A3M`WuV-&#!6U>VGj1KTmF)^Z6+jo4*x- z_=_a|IuXqI<7Y~3{A0)=n>e+}NayFf{mDrv+Oze4NBFk=+lBv-Az1x?CBWDIt^BYi zl_k+%m%m47-|8=>bw;G$RN#(%9Z{N5yg1v$8``;9_*Q?L@YBtI*Ad^Rzj%+%`uSYI z>R%VoKX^ZaQifFMlQcup$-A z-_!Ko=I^0^{+bN+Z?~hr{p*E4DpHaBWA%3N8HsP> zndu;QRzUw6;r}x!J=(MWW(D*w6a9RDiwo;tNn5M`mVo}>_K0Y)ecUGT*Xn;Gpub)C z%?YO4vHD*R=x^hPRjI@sEzQw|4QQf z`cDo&EK8-;$%yp7Li<+#hXMUJ9pH$&312rxPV87(XER2ZQ96`m!nb;zs-)@B#Etj=p5{ROl@fo7RG8!c-V^^`iEqNhwmHxVKT`DT z#^&!I0sWQ2w|XuA?STHmeVii9-yc2td(sJ_ul=ee{=Fuk)w3V*eeG8*@mrhsiL$l&Z&3Y)-!A&wgva{-Li@J={a*DO{)ZBu zmKPn0)xR?xprZU6e(YdJJG2A4^ZCbi#P^N=rTaRE*#3VbUsit~iErnxLnXe=m(@Qu zpuZ|Z{UZbV*Ld{5?a|*5(0{SSPdESGr20*s7Yo0|;5HxEs(x$74;xd73(o!LUD~(# ze@gX>oo){5zCHde&QO0p;`{plGLL><%UJzY0sWs!e6`m)SpBmD`eTPU#zZB`*5zDAJe|-p=OK9)dBqzB|a^0Iuxt_*?|6L;h)`s-Fg0bDxkkf^tTG1 z`%gRVTm5eb^#5DpryIYyv_RoH+4Vi=mVexbylxT!dhOhvC2UFDv7V(L*x8?<%vI6;@f&%+0O+UY~tDW|7}43 zOTy1Ld>iMvfc_YN*_sOGZymk2`Rhg(2z>3=F7ealZwuo4+Al8gF@N8B;+IH#Tdz@r zSbZ#(E`M`Xzj4qi{PPTM+rL@$8@qMV-eb5N!LOMSS1!tGnp0mdLDsGmri^ z0{Wjh%n|AIu0t_$Vr6uLnlU?nt`@%4Ytwur@qO*zB>J)a`C5Q&|1$&e+a>;6MzGb> z5Qx7-;ui~_^S6~J{tXh}*6VjixU?PJA$u-Y2)!22znh%+S-m#S%K`ms_`y&rn7?g2 z`eSs1fU9WRuTbKTk@`o@=#SO&??C)K`2sA?Ke?Xx`4ZpOYi@~)NZqqTF>+!*RsF`n z(h^70?=hn0V>jf6o(sr}<0xo0@uA{bv#1r+-QxM=X@c zJpQ_S^xvWJ#ZEWPL*3rZ3dq*RU!3ose-=snxbQgsZl3tN?j!j#arPeOfOPB6n}l!k zS1A1H6cdZpe=YHS`CB9Uas2H`zU=(@w8XdVf1^}Pr;VRi;fUKSLHyYK9YB0v{CJ^@zgpJc9DiR= z{819$SxXSw?E6!<|BECP?XgxYEyB0$zf}0?j$gkZzOViB`O8LBu>E^@^uHnTZTnv~ z%Bk$`Hi^GhfAN0){4Wu{T*gZ9ovOs!SU=+X^1n{>H;F0dzo$q4*@5_LB>sg)uxF(b@5zzlP z;nT+*ijA|347!pJP?1C#Gh;g+x*QA#4kS7WuzVAAK{6AkHok68+3vr(#IW&krVqcp#Nmyr_0|z z0{VOY#3`zl=-mFL9{s%!@V8&9#y5g({th6%ul?ppeC&TiJn_d%e4D=qPjtf5T)zzfSVc?HBjN z-=(L2{wuF`aqaadahDKvg77y_AZ}-IwcDo4-*LqEu{Igo(X1(bZp;QSJ@>wfWnc4ls=MO<1^{zLVT`GlMH% zw?l<*^It4{TVJcQl=!~)6~edu z=LX@Yn?K8l@9RG~LtXusxG>TDRqd(&If3}?68}q+SDXJc1M!zi{3bbm@%WwKiGPd4 zH(_G$);r-7M89q{Z~FdEs^2)MI^9_ulIHmNn(8v#pKi9-p-MVcL z=wFkeetu5L*M3zV{dFGwdmQYaf1)pollHxher7;`{o~V$mg%aP^>*Mns?+CX^{55i7e+cOBeSxE-%ipSi{#B!#BFta2 zM}Ho55Y}XdS*-9v7yl$9*ye9*;``cf-53`i^LK$K{^1he=5N6q7e8J8=s#kJ^xN_G zqVOx6o5WwOj&5%gzODa`a~(ydkp$oByeUxs*jQ(&zoWFY2Fmxt;nDMX~OTOhO$+@ZjTne z&3}{d)8)UM_}=~}^~e14z2F?tp~s)I0`XT}>*OI`gx zOq2g%f%ql0o%6rY6aPGkZ}Wf9WtrvwN#WC`Lpe|Qq5D^yb1v@--{${8;s4ACGjC(> z5Z{;o?x#4*eEyIMkN-uU`selYw}0Lhj%U|@w*PNUd|&+HQ(b(V|F84JKS<)+dL4YF zi$C3M5`Q&s3XBxK&Hr`6m&X9rJnHNGM*W-_;I9_`ehH@A(fLF9w+P?1-*>_3`C|MVmj?P=Z=&h76%eq1hmTAp?&%GYiG0KZN61s&MQ`Cs`b3*WZiyTZ5E4{SY; zC%&)!;tkFc+mC+>MEg&7(KRm+KmP_XP@(eHw%>(;_}!aad>nsEJn?Ur__kj8H@bl7 z+V3Ud+wpg~@OKs6y3y+B_KN_2sqpiaC|k{+^7p0*miKM@trC8^_S=p4zV^$X-MRhl zr9c{A+i!Rve(V+}_-muzw%^b|{Pv%BZom6I@uy0B+kRh5{B-SirSNV0O}W(xA87QG zgsABD@j(4=5`IaV`R|cH{nyEZ+c6P?_#FQ+PyB@v zUt}ht4V4Qwg$cy%m~_P2RKIc1Ec{`HZ~M<I8p_t{|2Ck%`^8RB6X;*=(Z4e-usEmo`th(|IwJQiEH?jxg>U=+aN$=V znf8^h+dARf{=ZQ8x2vJ}F=>vSN_=1cZXDUoKod;{O3LKUzYf`Ua@;!#Gh(l*_w33x)i&d+We0be!k&r{ngK50e+M4>EjMX zdAdDE__qC)3O`-@ok@IO`z^ZEWdz&rB?_wgyNjyF1M#cxcLr@8)OVi09tp%>b9v|X zd&Lv~6NzuzFMp{EoUZ+P(+x(>rER|^;pZFuT7S*|$pQW%;qPVm%G2#t!nf`Bu<)N% zL-Awl*-Ct0`z^l0S>pY}-;*!ZukH6zAb#_&UBJUl{5(^i=L7M(U+v=O3!ldy-;1;H zzmoX2UQhhS1(L^z5>btu*dg>iE5>a8c6-oK^!!U5*f<9g-vIVYfRZfw&!;zg5Dw{l8WC`G&9U zr+#vN;vYXtg`ckfmkZyv-z&mTH-D87-`9T4*SU<~{Ke0*tA6eO7X;!rFLM>w{A(I) z|35bnf8~uXewz@v{oeM(e?a2f_8a%8Bc_|bJ`%odzq^IMs|uH`wwrDbp$9a0-{${m z;ma^ec(FPUB)%{I^Y}kYqk_+myyvNZLm+*#9t%vd#X^;Ve|i+K>X@kUHn$zar}=x@wY$1)!$hsE1T2i_CwdN z)UrwVHva>Kzq=aBR;#1iXM}J2|48Bg-SDl>CyDRNf4kIwr3B*of99$GwnzHgzht=! z{AUx;=6_4#`{FOV-4XHl^@S(?aEWii#CChu#i!||Ly_tvu!X|6`5z~Id;X#QPyPHZ zQ2$$nzd#KoqSg7^K>d5(tMq^Lk!|;oJOuC;Vd)mTpJnB+wG#`|`K+erMSxmYhGnMxgDd^Y=M{_*E}E;y7~y z)8_BYK>Yfp5+BaryL#f^A@QAcqFS*fuSxtQ6zz2}@Bb`(+kc}UDa~q>_YwI zALSpvU4QQaUFSB5zgFk&#P{XD@IhyZ<2Q#OoBvaY&suEzFP8Xu<^!Amnn3(154rgG z{m-pD@o$p&&N@-e*wQ!LesdCv_B3w_zaxB`|H3~zi*afwTjlF^@DP9f=LtV1m?zvNM8ssE25_y29_W%J(}h`;JhCwRQ+KsNs^f%vUYxcGSd%=5&5L*hH@WU>xf z>$3N+B^LMJm=eY$--aGEy z0SMB*krVs1>Nj@9!oSbpCQR&J)o<+DMgJ5D$olyw*{%Myf%xqbpYJ(gvHAOZApW?g zol=b7-4j2r+~vesCnMeXuG^>EyB&&=6Dt$G9e=BYPak(ET7UI(Zh*hjdyZDzft_qW zTkc5?>l0;^Y2rIZ}Yd?TE~CD=y$4;U@h@|`CB9Uas9Nf zNB=Ja@mEQFUUOox`MV=1YDXY+rb@cB1O zuvnej65p5qB`-NkynouqQ~%L{_^Up4Q3soVHvh*4;>UjHh|Q4yLQnjQB)$m~+p^uo zKMpHT`z9T+6~edqA20lF0lxbAAyEHm!p}E+tMi*c{hL=g%WC0s|L32?$dUIte-ES+ zeAZ&yzg6Pzs6vI8CtKYV5#QJTYa~9dzxgK}Z2W48@6@W-SnT%C+_GhHuU){Q<^XK_{~3Y!`ER)RZ4kfQ6aOxW@2sVgv{~_; z+rKFZMSCV4vA2Y8^FQf(N8CTaS3mn!`rEHn_$M2_=1=*j3g5QhC&Ir$4aJYGXD#u4 z?YHJlXITyTJKB@KUkBp1{^$bUkf#0a4a6^5#zOiBZ=>j~K{M)e}{nG;RV_Q0?DqCK0x7X$jg6Mlc`KkCNDSrO2m^NF*>{EhbL z-;^$JvL@UA3%7Af?fA9%`ymj2^%pKa=I=O9{DURFv({S1Vy{U2borYS(0|0XPCx(u z)L3ksiNyEyzveHUCFbvVkN%qi@te1E@$LAr`MWj{zv^2TAM?jw>9ON?g~WH($(ruD zy^G(FgrYr%Ccz&A`dfw1eIAQ>8~Zk(f1T*h=j2l1@pCf0tp5JT`uktIEIj||=!w5J ze}@p?*M8l9bV^qXljB!=;-4V#opmBi?9V&7OwC9_(VorUl>zXleqkm-}e)BFa{?$gm&EGSD`0-8Lz-bab=a0WqWZUmkiEs0_b9WcN(8Ra-JD|$n z{#C-K)7uWk>fe|6zV>eu{c&Nl{wW^)M@xLG{~C$ktwVID6`|R}x9gWB!ap93Xq!r^0yE1eevTzaq&w;Fvq{d z6aN+9l9G5`cj?LfK0sZTQZ|4;o=ktL6d51gwtrDO0U*^%@pDqyk@>j?| z)<@+kBiQ!8Lx}IoU-u(ie7t|mUum%Yf1<><^?Gik3w*HX*Nu@AyDgyqbK$4U-%SDi z%|~|5-$IZ6&jRra`NsyS+-L;b{CyONpI6d3fBcmKo4+FJU>w5c@8!`haJu|mAbdN1 zz7>AD{GCgDU;8(ecFy0m9{q0z;uns|EPrnX;^!RIIe*uC;`gN!3~&DA!N+v@TPXZa z`4fJ+{9Q(TU;gTcbj}|?Qf}M-t3doh{;@|Y_WZ~8zxF`AP~P^;=kZzBx2h9y&H(1 zH`K*nDSVE9hbMmb6a4ube1aqPOGI`%Mow&;@NNF;g+JKvt^QHO_vLT(u+IH&iAVpn z#NU=;IO}Avr4nEJtA3*Ib-OSSe~LUf(_M(1zh8Rd-$8u#wJCjuWm%f|YWwX5@<*Py zVe#+YK>nsDrH;>Si^aYlw}Jen#OFR~pP$qGZ-c>UU)x>bSA=idZ>6-K?XQ;q0`a5% zYudkA`cI(*;{Nj+PyhKSpntW*Pp5w?x*uMg;tXQ=<` zfc}ySH=|+xANS~gGN8X&;@j(=w*CJS&|fcnTVKonV?h5r(U1NADUbej0sYN^_*T!Z zWoLKi~8pApTlU`#qP2$Hj zkZf)IiGlcqN4x&lCOn?MR(RsK1mfqMxx_`e9mZ}-Gs>50EA5Wh;|k4sbk-vr_> z9q#Ji4)y=7C;pm1{3Q}UKTZ6<1mZ8Q>^%PYkvwfb?SI{>{r!KX#9x#q{uadd_5ZaJ zAD{nu#S{M!iEros>XTjj6Qx73?^^@>3Bq??k}mA~FNx1NaoI}RO%cB4OFyyi2i5rb z&B8BHqHOcc`=&H}8_&LfBn`jB#Iy0gBz_mNv3XVfHlBUI`vk|g$GLe@|G0^-eBB-_ ze7pWwm0|vS65rSV79HbSRQoy4Kdb4baTPx~5Px-s@sAJ0U+RhfXHWc#CB7c#G+k>X z{{9NcmfMPpZm$%+Lz90uAFmckjQ1>h8}a!T9ZBm@a)h7X0Zryl;m0Jt<@XeRy}1CP z`B(nK#E;rf0oksU{MAbWxc%Oum-4m!xIQ*EyI3SQPV(saKrZi)Q4bHFZ_n7V&-P3H z=rXm*AbyuDHh+A7%f~OC<>Cz<;zDw+gPX0M&dr2}wB@Dz$V&`@Fc^B3~kKaWczE8^UN63~Q>xka-^>4bb1n_C0dNrFp*x9=*9l% zuobJOR}H;t>2(UdCew>Qn?f(XZ+WV`KaIB2=rvv5^D`NB^s1Nlr_;89UNh-+7QN1< z*E#fJUybydMXxjH)l9GR>2(3U__H(V)kLq^^g5SbKd0Au^y1Iv&}**j|AMv`$^N~x zy^mh^%ln6D`!Ky8k@w4J`zXEsOWr?5+sEnkguH)>wr%uUF7KbA?X&cHPTsGe?ep|n zDewP5+xO|UR^ER?+fV7m>k8KS8NEKI*BA2sOWJ-#uYbw=uW7rEUf;<3Z)y8)dVMGF zzo+dF^!icW^J7c==+6%HV*h*7pL}}lBk%eDu-uPce0!Px#rXLa{*J`K^8N_f9!c90 z*)NstQMBd%!;1dJ`1TlY%Vo>AtN1HE=!qfjOi=i9g!uh3_95WjYiYlkBP`3OKhM-RPHCvEnKXX-tj5}= z@snz2Ha67Fj`f(?vseBpHB+b6PU@3i-q29jkUz0*QthGnJtigY07v;+5IxWmzwo1+ z_=V5s#pe%e=b;sw+tyeRZ#kTIOXs&0wZ#`~!~5|CJMrd8&RS#_zwp_dXMX&#OU~9^ zsT0!+3iuxrpa1>(`JeyklO^Qyq$sBp$nQTse~Wm_u$(x_E^7ZVC-OL-m#-#Ok=?BcYX zOTdqfnN#_mj?Vl?sz)pN(mO>~^n-0gTec3r1(eh+T&iuq*)iN5pU z)wGV_1I48Yw(B_2oTby%2h)G#(j{j*nrjbA%*$@R3LlR=^{FBOG|5KCoBs**p}K5P zeG30))~DkdaMp}zbrb0%F&Zxy9vN%gq3E?}olBF?*qq#j%jdi>Ytv^=X^jr2Ek|B7 zHd^{cooH^`tSzG@UGCl`G%@M=k0I|GP*%F!&-8dkN9*|cAFZPI@%f_*3gh!D3yLeL z50+HYUVKhlyt8||f zKgfBRwGA%_&VP0l+0Zf|vgnvcmqq$mitGQ;c%({>qV)Cbtcez(^Sc%lwNdyS=26Z^ z7f{k^nUXvAIsz(MMi*4aTaL<$A9PeseEGUfdC}0)wSbq8J0=?{B5_Og>L@#R?xwUB zV(Aw?+w+7D>z8=TVFeus`ZCAy5m&5WsibK$$6~2sI6sYaeTq3oDXwo zzPRv{E={A#=C@H*wkpY8_(O3Ukh6Hp5NfXa zy!hby9B!x5+=b7E+KSFIu#4r+<;x3Y&{poeu5&v*pGo#Uyv4OsWlKS#ol0983yLci zP;dEgGj6Bhww)>#&~iM=6*tr&nKsnsWQf!(8mROl>iQo%XPamyHPO3W7Eu$$Nm5}X zi4J+u*0ovGUSp&2ReD_Mn9|W>sM)@tW*Zlue-4ja82@qZ&OFx23JRmaR?I%4!B#AT zjlVHm*|J}Btc==aMOncvgiNU(K__P;T4v=`&i|oueq%xYi1}Ys_WD;P1?d@I{==s6 zx&O+&l$$;}Mpm>;qeE)1?xt3){NH2d~PV!xxLnav$kB?3A*> zT}vC^&%Ll$l%AnoSZbFM3x1Xp@AXW4{@+;9WizNrn$Mvs%T+(){Vs#%j zeY?BVoq!O*r9kVh6;Xjh04Z*WO1|s5&oXBwlZCYZ?|Z-R|IY81$(eJW^Q`xN-_QM& zR;jnGjsvKEg{hJW=G;P^30)G<)P|Qa_qdhz4~F9^w_`FQd`!Bjp{0TsFI3*%?I3-G3z}IyZG}koqq5HzW=S+<@X? z${;)mO2uhv-`DBYlHcv3Qcke-0xfYQ-_Q~hSc_>OF-TnGtx$XP#H2TNz@y&s6P7|3 zjx=d?`vft4XzddyUcnSH!7u+U*(C$TO(|1t-N1rC+qBrFw%!eF6X7KrzqQua)cCss z;AZz-s)?3(Q+gqM#j<~nst1)m$A;ey1q{<@spcQoW0G*zcr%3xZ6x z6i&=+GLFE^*z!@fe5J;ZPUCftc2eUbjLYhGPjXfl{_PTy)cA_e9pvq~wQr)}D(6+9 zL4C$g$X7?>b(sz~e!8!LaAysL+_lo9K3RaEcwpo2JY~3iBCi79ALjv7UhwAQ@(pk0 zp9_>uFCYHV=fn4{`L_WAh_V$lajas!mf?(mCGFapXm8K7#JaF$)|B^bfug+;JyMh> z{dR>~Qp|-~O0Y#sw5JUp^5S8?Kq1Bi8N1E;!>)r}bbUD3`io4_2MPwHpV;oPTJo$6 z!KWI652TJW7YCvtNJpbT(h@Jo2=v4{E$P)_t05G58(a4*9-$?tDv{|QYRU5;zpT+9 z1wh*Xt-Ahr)&af(zFRIDmD+kW%tS!Su`Z?y_~H5}PjXeXb|5i-QR1@4Z5c`1>twQR zTPfOBTknvfS5;NeKLFeVZ3t4u6h^5ZLw}maE;P#SRoM)V0K+(Oa-CoA)~U z(JVDkK5)Mp@U>x8J+SSR2ejB4C?fls-=U8yw)GI|TqiyDY}P%Sw9tWQ5nk}@M`21d zWhTK3%JfBAKZ*|3lQ(3z2R@du$b?4{dyQX!N;&OY<83y_3smc7ypT=Fcl7Cv7;gm9 zaR0|!nlawe!yRu#aRv+sB8kU<-Czb{VJ#k>8@~jZ1Kczu=K1vLFA}5u0t{N)Hg6U{ z0Eiuk7;Hm?Mb8@&i}C(TLJ_)uKcL$X^){Lnh>|vl_3|tC1*Tn|f?m!TI1EX*2EqA1 zK~etX8PZvZBS^}>=T{PW`S`vw59qo&4|Hy4UJahz>&5RsdWYQTS62BZE6PD1e*Y*R zU;mjuQ-le(YgQ1=tiTX73^;}8`PuxDQb%^$0i=9?sc z$(#te1T^#jXqFmhJOH_Yo;*ny0^Xaur5e>=fec|cNCUFEWb>zvcDd<#J-h=iz4J+@&1(6>F1f79MF>akb zm3BRJ zaJq2fny2-|YQ1fzSEpTu%yg)q2ano{MPU=xW#{X0zy ztywrji|z72^3xNW(!)DgxUhl4+c0{Iwi&}~pv$qkoc;A}!nizYO?jCXYlE0^kmFmU z#kN7rC^gs2^R(u9UJq@O@hK3p3Ls@T12oYVT=xX(Q`C1I^amTp4Lcsf3JNfJaReqf zeG@TeF+v3Jpo-5i{1d{Ss(k{qsG7cDXvme59w{&feWkkRCp7t z)fkVK41_)VwFGD;rQy)i&3lYZT@sPpVpsR)bG%9u@#{W=-YJR8&PtZ&|9gIqi%HA;J3TD!q&t=4YsEE!X$M@s_E zqodfQ*7lY;s4<&d^sGyJHb}JYK^269(W{L^aycG6q7D zrhpiI1OMma|MxwOJgsZ!0|S&;UirNPl;`sD@%<_-GyC#T;4Uwu4(NLd)V-CS_5sR1 z-z6w~fWk&g!JVEb1}JwGQtR99AE78W7Oli(dodpFDLxhD{y-;nTL~!b-%3u$+dn7; z692vwzuQVfcsDlS2vHc19{|DRZ2w8hqWqJT>->Y1dp-Gsa10|V+UW5ktm0!&KE5Gw zh)!W~GZV@(O+%nD^UTMHRvBv*G%XB5f91=~-=T~x-F*jcYl(4H;PD!O7SU1{WSFJn zRX3u9!|>Jk&w;2GGuO~i0Mrwl@pLW4AT>Ze!qfoMH-1;}876KmscK0b{2e53qc;6% zt?i&!3vErH(ZJiIIsoaT1<_ubYY*%)(9N>a$r$M&?*YvNRQvTQn&H zL3tV;o2Zwdm)4Y^z-(H0t6-wiQ1LvDcrhaDw4|>poUGN87Y3-}=&6O`dxN3=f~slg zG0c_g!^t2tws2xb)ihz-k7JR|_o_i2DrkfchYqOmeDppN+MzDLA03XQ76m#6n|z2w z1g0=Go&>n)vAwX3y$31!DCm6$bTE^BoqVtPWf2rY+ZQg1BzAP1pN{9zVRzFLN0SbX zaWv2`MsPQRTgT{P8V6~SN#gnh(_llouOlEX68d-n%tSQ7X`!9b{{qwH?aobjFn>q7 zpP)1p@B`=q{Rq?8E@p4Bp1278#C$bWEjDKmO`qiS29r3WYB3%1BgEV)UCD^t61|qI zBkPKnUGZ&vc{X1@vYVI9{>1<|9&+Olz)x*`0rWu>;ts$0oB(^PfUZk)OalAh9VN)S zYyv`GWf`~}m`SVw)o^D($4Bss(~B2+8T|+6UjqPZ2TX2jepjdL2~Z4&wnwXMdM}^{ z3auy3Eab00l z17=nMn*rW>&0lGOsU#}XFr94jM?9Yinj1%gZKm<>FzvIEJVY!Mf;C;(udY?3zUf!l`*%_1N}(9sWqF+0UzR!n9{d%!}?>N7)Ioz&`#4 zrIQYeFBc9n`r-W@!--!Bn94K|ARV*KkrGxcr??#@Y@Y^bF-Lp&S$al2qA7|2{pDw9N!_+h)@9smIn~ zy>~AhjEc|+AxOW0MFVbuceq-$qzA5As?isFMx@V)pfOQU&4fpCi6F`-#ul!d9e;eV zPK__Y-Bl8QjCp4KF{Ipm8fGzQ{E}r&IV-lhB7J`)?ps6(UeEg=Z|&&Gu>^a^?ipiHvlPshW3&gpN}VA)ZO! z?eQIk9P+QrAN#>t`yhYtYz7j`?&XhrQKEbK;|4sX{K3JRAdp-BfQ1;dgfezCZJz~@ zxBndi$W>_E#NA8*B#Q2f0P;8VO#~3rPw&Vduk}g(P?!IJ??VQeYvPAX{6Mx#XRn^(gNw?Oxu|Lx1m4-of*0ON6dnd5WI zJM&%g&MZgXxmc&V1HosEmJCUNpvW&4*dtz01Q-ZKf(~ldeG4c4>V60Ejw5eD1fqO& za#}tzLqWQckzTg!4gZ3ibeG8-P5#=uyfg=VF3sQnUzC@g1u(efrN{8wEie5{ev7=M z#!~oU%SqL9NXosFpk}^3|dheUPJ0 zf*h5WpO$gi-SX3Y7)dws(}gC8G+d`k2 zRPM?vylWs_Q(k<(EZ-2daDA_DJiZ?(fT*>vU^p%}6#DV~8AL7qD82&UTS}_&{dq~{ ztpk;JOTUflLuKIOcc`q)5w$SgR=hJ*b-+S86up?iVQAkN9|N&7XbnpxB#2(avBC{ELs`BMXt7^2;LF97oEE$ zqzGC9oSlWuNG9A@TPcvbscG7q<7Zh%{⪙(o&63at^@UP=c2qsbjI&fx76RG=0`Q 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 z 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

`|A^~$3%WH^=-{F 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

xfkY^oeL};Q2KEVUxg;ntG`u{x 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


uh|IHI0-9nVJZ^}49SufUGi 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%0A|y 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
Z$I0fqrEf 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 z

);NW=}`C`Yx)^=S!iZ$Htyt3Hwpt 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�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≤lo`!A$-0ow&Q!cZq*@Pn?&)X%Mo4N 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 ~np?eGS18Yw^-f{)h6+(4bb~^BuM?%aR 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

Ld^!k{n*Zm; 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

_6e2PlZ_wLc{T99bmFq9# zFixqr*tfr$5N?0<_QF$M`>R>umTN({<@zA@^>b~w{?v2#@l$`c#J>J~8m>Qk!Cj~9 z2Uq`%9)3RDa{aLI`04m^6?*HduCt;y4)*ib*Q3}sK6T%s8=pE)?ABM`c(HH{G%0%9 z`C>hMS-Ab@>wSMq+ICX%wO>6Du0Myv&G#s{^>`XwJ6H7Z-}P|UJLdZ=dh6>YxaE2~ z{lETr|6TiYp|@O1z_qhs53lR!ZvBn~zxfe&Gxzuu?KQuv{H4MjN1`9El+$q}{IH^T z90^~zaL1AGiwhsy#*x>uPRUt@+RqQyDZ_P&*XeMb(zb`^%k`c9$M_7_DQ$dw&zSxB z|4-|btVIT`Q^E(WQ^E$VQ^E(WQ^E(WQ^LpAb;_ChRQZ>^u`o%hz~AG>jQYvWr|^v-+h zeWGyJ1ydJ&?6@wN6K?)eangZ7c%RbJO4u2Z6~&(pe22|u#f zah(#rXyL9?!Y?a)Y+I+Sm>@JM?ZrCq1}c>UJv zBiwQ1xT4Q>=QwgIb{t2B&$F~~UZ$si^PHsp>YC{7pSOYAuh#pj-(@d+*(kvj1El z0ccX!AJ4MUEtbjy>G|0+*_QVIOccxXZT+Vcf1R)&zCyhg`eI0Npidk zujgo8PlbP^*!MoZ=LbfQSZn?9{J^zv&kx)H_xwQJze;wVAGi&@=La0`mTY2J$C0sl zyvyE8^>aAhwe#)ac-O{ZINr5!7>;*s9Nx_1-5;BNa?p4eK4`oPA2i;D4;t^n2aR{( zW9xXga2W?PpE;cI?t?wNe*ao`Ug!JPMq%gc*l`}{dB2=xs^ix+=$+Tq@jCfBf4-~e zGrqfCdk8yM;m;q?JAba{;=1LUu<T>rlYcV2o%55F9)ovY!lr>=*q_xU6FU(wr6>iwqF<1WpQ+TO+wXj1CSc2d`a z`L*q2R`kYgp2G8CJ6Q;BJ8_+8J8_@Ta=Csq&THe3e1jhDIX%|}NA&2uZ>9cZ^tO}l z!S%oId)BT)um8S>P3}5Te#3%|YCalIBk=>AvuKZ@Rd+x42~v|X>czH_}c zI?gvK?zvvOc7(Rv^_uHD*K4a5ed_&!CWiI8-WEH4&v-qjmwf%c@&nP!4~J{V{Yk%{ zeaaH2_;WG-%mF_FzB1f)xF+21^*#{pzH5D7Me;ol`)8py-wWZ6*SEp-CujbXVqbrr zEIjf2OY`>{|Ci9)54^3k$Jnudo~H18IF8SV{wm5f2YUNw&nN4D?LYJ1?4R9#vwyb# zw13_de=OGyaLZNC59HVSIjZRMp+85#_2;XFCvN)ldiU9Wjvf7f5N?0ZB3{oAkL>hFi^=d*D2iE&cm{8ZCt{(}0D zpH{fzd-P`(?)V=5<-#4`!|ORG_hZAKEc!c>X_MlQIAY$ zUHi+yKY~AXyoi2=rd-v}&!e{;UI15rIb6NZEvkR9M?Xzz7x5?8X7wj^krciqe$EB= z`g$MS_P+&u6n1un+mF@v0?pIpyB7ZJSM({y+VI#+3SXz;wf!88efyuxsghDI|A^s6+x36KWZ0yx|5L*CfBM4nq5toNj}d>k{=C2Ny9SXNx$6#MSzYW))bK&}PG4}Q6 zQMmrRb^NBFP0Fur=aa!57p8=3=bdoJ{ddFF&jU9O3l*ODJMJ%q-uhhuy>Z(Nz4f~d zdgHkh+<5Me9pm{$xN$oUZro0V>(960j{BFuwSOgC`?tZ3^KaqWd8vobG(lQJ+aC0D zF1UU!0oVTWaQ$2tuAke&wey)Cekt7cb7kS({_48IyZzN|aQmyfv2VT4KH;nJ86ysG z{a+q#9M*)}Z*LB_-`=i=?+$ldI~=b4vwQf(aO>qdxaE4Jhquvb$A#=|PC+}%?-Kv; zx?XaA7`{Lmhw8Xj^-q`n%lTpShZXMpFns=!??lbtlVZpD;bd^C12-Zvs6O8jz4iWe{M5et$=Xlf zn-n|R_kESxzq07_p?&99+W#u^4ei(ULD&Cj0-BT$=eNti?FUvWyxR|C?wS-oop)^r zw;ynxU_Y=g`RY#{uk&mDspECmpNq&>f3AS*&voRhKaarm$LmjjrY+Y;*Pr(m-i^;( zaQ#`Z@MNz)ABJ1M8^dispM$GE46goraP^nM)n5%C#eDctxca}q?T05~y!d-_P1Wmn zNyZEN&(-0^e;w>NkKG)-^PD<9re2)q?2F#<`XKB(&p86_Jm*;KSdVAIE!PEb%k?Ad z>!;(a{@jILe;&ZT{yYk|yidX%m&awC(*LR8j%(BQ@P*;pSq$#HcPY5~&3gFGaN}9W z_td-d;eFBDP7W%(+fGhFZ`{6t-g>F?gxIlOzK`JN0PqaNXw>j!ZC`7vDk zx4 z=x1yGUh{PxI2YV`;CyiBfeXT&2i9{DDVOuW#nC$toV|5tq`cWHuH(p|g{M8|ozIom z@AV7c0sd$7wufinwg;aJuzufF{On#wGxqRR;9tj|`W~d%`54^iw!Q^F8arFVFM)pp z?)i$H;Pt*<@;wXgx%zG4lc%DZ6#Xdp2jS}L{k8l$XESQOcppuF_Qa0mIt^}o&WBsS zooa_7ByKz1MJI48BxN-Xi+_?GvcKx{!z3s~TYudjVz4mW|8|UA`wettK zc3y<*kNdIOnV$8FcIx^r=JaO)^x9bhu6}j6`kj0Di9I}RCn@!tGdnXWYndl}27UU{+8_4K6V5^Z zTILCPb~P#foQ3`Wjd{Y0OG27 zs$7@x$M(5G;c?e-VRg9UujgkhukZ1&o$pM(_HTQ_jdOfUia(BPC&2adRJeYA8~gg1 zzBDOu(4QyZ_P2lS;m^bE|NXud?az@6o0Jdd3G>3$e-LhbmM=WhbpA*8>dp}n`4SMao2X49E2iMPK;M!lchp*AYH-PI;6RwezcJe~g zug*kV@{7v4u0S!-PC`KW};`!(Jdn;ZRxO-z!K z?|cof_P2w-5B}L6z8_pWClucGr+zO?@?8&q#tmpvS3i5<`ADB%%ey9g4frPTk2kzD zpK*Rrc>e9Y>u&h38-0y~-*@&YcpXQ&e%{__l48z$ofrQKJN4Ylh`#wz^S!D#+~q5m z>nl8Gx2k?k_^05ju&?g?YKOvOC(jC1JG-La2|xFTZ_@Zy_1V2FNG+U?VYCypPZzNVY< zRX?3qe+cfr;?D4`vGW|vlgUhOYec-Q|m&})BFxb{DRopYP4YCJ#R!;k6V z-{|4j7M}LAJN5oV51+M6L{cvMlfB^fC-=hb&*y(f8@Jd|e{kVlf6nXSi@ftyJ6`V( z!o6PRpY~P#M$KPqJXh}FAMN3L^zZ`;kN=~H=l9{(?-lSP(fAb6-kHWp~p23do zYTW7C^2Q(YogBUz`7T^|x7{v_Ui%+`Ykz&X{mj;I$JyNq@8-K7dh@I!j|SK!(|8SZ||X>j%5hg&a~7M}L( ze#bUJJ#UIy3B?Qr$KgR6h0htKk!!S%I4;obgo z8}#LIW$sxV&-IqyrCi|~lzMd^EPRu~>$;)p-(Kvv4;K9;rN1uI z$ye-OSo9~xK$G&}K3IJ(YqFv8t`@cC%hH9y6^ z^UvE0k3Y7nXp+Khx8pUwC530tzs9GY>lpE;`B8adl@#uL{(-{tVf$Z>{ag2owqt+E z{i08x_xklbu>IHp=2^Noq8 z_4q)slXzN>Pr$9mx3f=`Gaj|R=I+^#+KPQA>+$8nlkZuy^V!*7GHxru-JiJtZanWS zJmvik@q7_(JSTGBsnN%;q>r#qH5cXGNj>d$uW|u)+wBM0U-}m1T^nwBPhua*a$U{7 z(>E#C<8aGW_oL#E?PTk+@04=dPCm(glhjz5EILUcb|@4`aQ|2)AAiXCFrY-RH4h zPD8K%=fL&<7v@X5ovjSCX%8PG&Ktrl?>_AFoJKo56K;9WgInI|*ypjlGqPV~dFwt> z{ItAFV#o4sg&o`5#poSJo`<_X_U^L3lzioz!;Q}Y>_>T>o((rX7r~9sd)enPKC}1i z3%wt`@mU^je747q@wpql<$3|V{p#%Ohghx!;g;)U_Ejv`8R)I|3(#Ax%i)&mA?#SL z_1Ooo9zWB=e_VLCKVPNHL%aN9_!doDspI37@O9w#!qu~MV zd3V>(x-RST^;sY3|L$=8Il70R#QJCy{mHrL_5V7!{yzZMpQ*|^CH~t^-dlLLf0!R` zJ6Wv9&Wh-5Z|lIdvnkyEwBBPH>n%{DGTq$|GjYS&k1*YUl;B?d~>+#`fUr3Kkk3-iT*0u;pfr2A9VtH z_kT`B?|#&`;OYkx)N@=Zp6NRJ^fy?A(A}I}i5g|Jy$biXHcXqra+*TV?t9iv2^1 ze&e^a9>vbh_2{Qqp@Y@G*| z>D7qd@oToWSR;DJucZo4`?Mck0lnkb>Tt)eb+Kc+-5UPori|6ko#3|5J>Xua`@@gH z&M3Hcj)!aKYjE}7gByn*z-|9!IXDu}yj!D|Yk{Iq`#HApv$o4svE%x8s&U(2M89QY zr|M^bZv|f%o_wEgzh2W}XOH(%cqJ1_CvK8`f0F+Ik8f%|*->dpU6ie5V# z!HxgN;G@WQ3H;ByT&n-O6n(M}-!PdqX`c?S?di}Cuk9mskyP!}cJ`qbkNAH`TD&l=fS5-Ae)qO>HjQn+e5uy7QOj;ZrO5;#*XE>6>hnH1=s%Lh38|E=0|N0 zZ*9tw6o0foCEW3JCb<3foQ21}>&mpHq}acz`FqWG3H0{c>!P<@o1nMfcAT=`uH#Yi zwcq|E_AOVv?xMF`2a~UUo($KYGvNAjHu>sL+EP;T)t@Wj&O>g7tFL2g?5O`8dikH= zju$V(jemWgWb8X$yd$7VUH^Sv$$XbWFJBR^KY8a;wXfdikBmcoPC5V0b+peJssA$e zt@jfPPkVM9eI|O_bA3)ZdfSQ585z$Tv2XjS&m+f*4dkt(W)1Etl_s)SuV;Jkckyub-dl;rqb#^GvvLxCpNOpZ4&kI!03JW#ZJA?9ZhfDX;T4pMO+;GI4broPc^!zjY6P46dEO!5!~r={aw( zLb<;m|1-AM@oPfv%j?gUJ^W#~{yYuWpAT{W-MFn&csI^JfouPrWuev8pAJ`lE?j>$ zD-E}6=c|Qx>-Sqd`suijZ@#m`&G&S;`g7sxC*wST`sv~77vwyEab6a^^}82*RMWO= zd-x|@`xA11-}T));p#W&;X4(cIKPc{cuCa|x%eyVy zad3CI{(k}Pcr>bqp8(hX_u$(30o?KNQn>!y2-nUXJ^UWH_Wugk&h(s1k*vSd=Iirc&L?;6(eDkn9UfMA+M)BwW6*njoq*nUdntO`+m+~T&)30i z&$nX7_WT&!cs>O;ZZE?1XZ*5}m+Qs$IW^ok&jvT&rF-~FaQ)c=uAP10_P2+_9WNTU zM^fr5-`%zy<;*WCug?uS--~|bqA$bXEBf~rUM`DQ_=~0ga=sTkUnu&`%f3YNy}8V( z;>T8S=X*Zi?R;-X^v?G_0e8N)8{GNcT*mRM`#;=_vO}wXHTZiTej)pJHxeeXyM7%xLpr74o|{&X#P{p_aAWM zFfR4t{?+H;*86dA_usw)KcDihSL!Ptdo(|)Kc6T(<;r*cRQ@}-e*OurpMH;({3Z0- zc_;N~+!lvtkEr^ycMrb|emVL)Tb-2bccNU+qPLw-kN`9(AD3e1J#gc^C|vzV;Oe)B ztKSXoy!sgU=kezxxN$xUZk&Bzocu@VweyR@6St|FA2t4uq4#=x8|zBPHQ&?Xd|=k1 zkA3Ic^}YDX<|@kj0rbuX>U$xgw_No-EwS%>U~}v^AE@X5W5@ZxE|kmo)ccmvTVB6+ z!}5NGeD%M+C%o(Dh3NJ3NBEQSdgs0Oz|}tp*Z!a3>Ys<(PR3)u#d-4E3h!PQ z)1bFqy$`+h_&9 zIF@%Y>e2dL0Y2w{C|}F_TJoLuKa{WS`L*P`z<(%T+w*J5cM#NuGl|B4Xc+Ol^{d4e{;S(nCO-jDAz_%ZvEuRj4bm94LCpEm*{$C2$&S`#0@hV@m?^>^)@U+l*%?OYDm&JFnU9{llp@wD@DkDUq1 z`XK&jXOY6Y{`kGI`m<_}ozM2zso#GW``S4Mz5E31d%gJmceY!<|4uu<$G-jWgzRI; z{a!5l;g!(a4{rdsA3hoGb^5)+6My@kAE38C84b5wH)6;5{0hDC`5jz4e}e00eIIY? z%l_o=J^A{*Z{|A{`y2Kr?}FQ(Y}DkJlzhETH{yDi59cTCgA@Nh%}-9Fe|s~}Pu6d) zfjX~vE%Oug&QJDiE~aW{I6rBxm!nI6l74uM_6B!8a5;Q9KWY1C$C2Uuq-jV^`u}Nu zVt?ZN#QtPBKWY1u;ryhH!<%9MWat0l{A7OiL&jLo!krKQH}_96SFiJm*D^m*@BHL* z!}-boxPLN6dt)B*zcD|VKMSuWF}{}hiF)TJ`w!~8 zdB_;;4Q_iI&QFH(lmDyxJN75ePwY>I^ONEH!blq%JAcTPu~+|{pM^{Qa=!qxU{+&VDC#_4Qmz@;#{eQSE%G z=)=wTtJu;1Gtuk+1#sVZhQV%;oW-q6ngVL0B(Ce3~qbwJO8i>?alTxcT=xPsbAaw@gwwK z`CRmG`!zOezp*HMUib=d+{Pg*P+di>gTqUOYZr0{aGCQ zmg~cC{rMzZ`=9UO55kWiZa!~*82;z%bW+M?dz%YxJJ}dM3j1|jh@J1kk1qOr9eERTKtSq*M^*Ma-ogy$!%_g&C?U3>v<`$^kKN*wI3 zj)bevGv-O%xYctG;l?fhH!1P)InDa)PxQ72pF=m!Pmr(i`5X3){|j*A|JG#Kqs9b}mIP zzpsZs3^(7$;bYVb+;aJTHuH5JqWu|}Cs?ip;o4cNhmQoO`H^>;ww`ot`!SO5&4mTs0QWh&Ti`!Ke;eHA z?CyluYc1$*xX;-Q$IW&>;oliIH*D&CIBt&F{}0E_wp|U!%{C6hakGuX8*$v+py}TR zjho?v#?A0S<7W7vaWj0-xEVgSj+-AX<7ws*uA`@8eK$ihUe|HK=L%gv*5~45=flm9 zs^1zr&a3PD+2(2VYoXt@=$nv@lXqfQJA1>|X?UH-9Eg4A!(W4EjZp1e0N4LZ;m+U6 z>sLqSIkPo(YQEbw{w2lF&%pN?q3yiPczzphe0~f!K35msjn9pRcjI#h-1yvsed99` z<<(E0i`P&04fJ!}VyElpCWUwX+!n5%AIBg4JPEF!KZWb(J#hVesPL|z^?MMye*U%S z!}ard?Cau1)yNnJlTMxV0R>o?yym=ya5!jFf40q*7` zhE2+c{lIF4$NtXP*%!Tb4u@;!k{&xx_i)#b*)y-@_5Ei0b97lJcKxjH8A~?WdAdhG zU)hiC+NsYucJ2Ix{afwV_gr=D_?|2MpO5G7wDXZ3zI_kBrHA`H=Gyo9JKO)pJeOzv zehhB?egUqX(Qxhj46dC=;M#cy@8|J)TmbI%xM<v8GAQ!ieRtH8Y;>wAz=@AezJ zldt}K5w1VS7T)#eB=XgtGvWI4J?!hxjd1;W0Iole6yEjc@xr_D`8!;H{GNLKS#**n zU`gT@5z@>0e8N%09^a) z_3+K$+Bp=iofCWb&Lh!p#|7tUhZLTA@%s7!-1g)5H>qEqabNvuaP>FC)%VR4Hc10) zQv6h3?<05pf2v2nXBh{hKeG8z+toqvqu{xBlN58#V^2eGy`R&=FYDpiyH1Kf+PR~L z-_yhWejn}psYn0U9`5&XXyn;v=Uw7#qz8l{yRS z!7bM*aLe^A?Ca-`;reqmTz`C@s{Xt{zV?$-Fu%1woDS}|KLgxy%@5bk>OFj2xb{B^ z*Umvb{Ht*NIj4tT4%hxq;reqET>C$VdtdubxO&$S*8Af{pZ4kfYu~?Wdwv z@ALY8RPXcFec&FNed;_p5NrbsgMw zneTzOzkRgmyYsgv3QzSoe|rw@{LOie{p6I4v-TU)_wbo}_`E&*13ml@xN-O)+&Elb zcsCB$7T%4+t#ISud%cXqJf(k1Ga5y|`boI;cre_!9o556?BR9XkN;aWKWhKud(O>w zD*AcHo!Q{VZQjCT-}z_V-%EKNuif8syxs)+j*nYm-|>0}xa0M%*fIWn1pt4(Q>h!S(0j9{wY^_V4fEkHGcwPjK^n3hsRPZ*cV! zvQKC`oV@U~L+8WOqxbrn3BB!hN%Xe2523d`uLie0uY(=i^T*-F^V4wS_Bpuz90a$0 z9uL?4*WlW}7HUBH>-W?a^RMvl7CX+vWB;Jizc>#Mulw(NF&}mwzAxN)c>O-O`0qUY zVD!$z4}&`oKN9Xde4zxPNvTKYSKl0=|H|hocA~d^zTW3AK8qdeaX+~2Hu)uW^R4yL z&Ub`D1`KMtO~`Z_NkR`uir1(jnCYr zyt%$MXntAa{2}7tb@3(mm(icv!*4A-_K!pV3;fi6zB4^3AJbCre$S)&`dm!($7BEO z=Km&zTdpVJ>R&3nF)_yVvT{I^@?m>h4{rTtO_$Wo_iXsGlZ2Y+Fup@g4o{?{kiaZpQ3C3c=TQ`XJY?{&3~%xu)a?_b}oU} z_hyIZnbxYGfpzF*@cMml(fZb7-Z@`+U2jI8XTd5z3H|l(y5Af94e)2t z-w22USmfiH*sOX2FTgfEN!Hn{q` z;LD(Y46go3cuY&#|i=jUYuKs-Z2hfj(tG^z;2>QF>>K}kFg#IbG`oF^$ zKtEAAsNHQ3Z->7R{Y-G}&k3Iw{o-)-%fjbIzcyU`M)1wh?+91FD|}Y;2f)>jg6C{% zZEq*S)t?5R8T|!t^_ReBM1KQZ{mi2|Cf&MVK`lI2Kqdy(4{yXqV(O(Kz ze#y1$)8O?+-s3`^Ui5p8$Um`)9$`pAXO3xmsVN;p(r4e+hr?hO2)7 z{txUw1y}!f_}|e_R5sMQ*ZbSye?vbLT>EpvbB3^%cX7D-W#NB8zcyU`M)2*4&yH~Q zyTY>uul^hWS3e4#XZfrCM7a9X;7?%x0=W81;E$uf0j~b%@NMzuLAd%y;j5v44zB)X z_@D7-iYW*857WZ`gnll#_7{Nv5&d#-^{c@DfPQ1R`Yqv)qTda!eoy$r=nsRdKN_Ah zw6#5)4p;vj_;1l)3Riz6{C@Pe!PVadzZd;uaP?2Ze}jIUsRq~Ygz$}NKhwdrKO_83 z>@NsczZiUd?5_$}zZN`ao@@NKf~(&FemnZT;Oh5>{{sCnaP=p^uR(tnT>bg*?CDki zN5j?sqKCh0>R0P)_2#eD&fJAJrpLIC@I|=$hd1@u`89g?IhQOO`mwK_AHvly`i|Dm zu0L1w@HyW3s$Tnxz}@HE0B*ilz_oKTTsuz`p7G9jzKCA?8%{ge&qE6D+BqJ*cAkan z=K|9Ww!aiy|M!BsUpfk|{o~=nf6IFd{D)jGPr@&Ozx`c< z?d;jZUxe%br0;&!j{Z*v*Z&3J`hP+XpP}5)N;@~-dEw@}INW^Kf}8K1J^TYR3@+D) z;M(5~uKnxa`gsRjJ5LmzcD@w#HU4{F^~Zhw*$VH@Cl^I;yPavK)=u7lo(1 zqwwcG^xNV8A3D4=r*Zz);d8WZj5F>mulf@^`xgGT4!^tb={vmMzns0ptNn#K{H0=N z=?+i%l2+^RdLMLy4zKT7*t)}K8Mn3b$qrwn#pCSV;g1%6NQam0vT?rL;q`v%*E_u4 zH$A(<4=?sF?(iC)t2(^iPc657M)qO8(gf%E_Vpnzmu1|)@G^Xj@P(Ro@?6o+RPrCM z`TQz&=I-GO!so+I!Q&*nJH}Wih3B1PWm)mcd$ht&sFlnA3IAG;{$%vkUi2rztEvCV z&ezfZJ9bX%v2zAofBNE3zf-ts^Z7sd|4r=wJN|#G$IiFm)u;c-pYNd8pPb9;rvJ&# z**$h%uRq`W57{}l$IdD6TE73OT<4=VKBvO9)7MVE|2p+Qc%Ax-U#I?(9{rCSUdvf- z!;ZA)%g~o;;|TvDe6A9R#PcHf;_x%!uO)6j>CyM~GgqLm<%mB&f}3xjozdw39XnV5 zhwRj6UE}+|fA%AY@v2!{6wZ!=*^p@-O+PURFWarlZke%CJr=7lj<96&A&p!Q~ zuT%f49(`Xwa5sAUfxF=L1HXj77XN?Kqwl*;??rF>IUR04=D4Ol=aXx)T#LhJDuVPU zAB0=p?=z2D5dHo5V}E!xc9uh5&u#_j|9RNa|My}?|L1^f=Yk$PIX_&JcIJm`=fWO4 zTcX#_N8sAIw8ze3=(V#1Ts!vj#%Fc(+W9biu2S&scws$mfqrrHbHbN{F96q1`#1gk z9qmUye-GErl|6C$82M`Flkl1F^E247yxOvu84^s3n3gnae?D(o1C9nkCl zC*U(-e=qFlzxMTiZ}iJyXHD$u|Hg3rzXm({zY}`>-wm$+`(j7`wXgsCq1XR)v9JG| z!}b5C*wO#3(d+*%aQ#03JNmDE{XY=B{?}(M$7z!OZ$`fQe?4~ee_QnWzbjn-55|uE zYhV8lL9hSoV_*L_h3o%~*wOz-xZd@@KD(OuXy@i0JAdf0^GCRLe%52BzLP)s>d)gn zc7EPt=SlS1sqgUVmg^TicAoCB^H;d#x}(R=D%6YqtP0nT^O>3AY?CrxJc#|dM(DqC z+m-sod-Tio@Kt;G+C6;Z9==r%-?4}9*2DMe;Rp2a!+Q8JJ^aKTetHi-tA}6E!!PaO zqkH%bJ^Z#Fes>Rlu!ld^!=LKm&-L(;hS~hC+dd}>7{I6K;dNiOYiFh&eSN;Et6#83 zzjzN{u7|JM!|Qt$@@ucJjeGQ4_3#~g_(UU7Yvbv9XC}D$s=tT+VG8trr@xvG{v2F8 zzs8RF9t)ofJNmO=4__Rf=VfYIuKXq8*ctn)!t)$TO>4vR{76k3!Lil9ho35uWy z>I%0=DHcUg1VvPP#q|~bKH@v5>pyemJ=r&N-r1Q+>in`fXP=#Cp67jM&YZL7Yw`HQ z?>BL$Fe=aQA91HjguB0~$3Lq=IKMx|ovIPe?>BL$8ib#N*7sV3mms_j;R_I6k8nKx zG$I_2W6cQ1th?j!^lrN!Y85f9SEO@aOZ>@OA7yZGQtxeR~)|-;fV;Z zMtBm!e@A&vM))5HPeJ&0g!>WxC&JSa{y&6gBK$9eXCvH)dy-h2y0N=hvw4iQ{DmcR;}F75G{O{(u7CrodI_AA^eW+aM?0V>188CJrIk zm*$`XL+R-}Uct-a>gS;HaEq#ggc0su8^EDu2!~rU9mL%a;q@m#89rMJ%N&PW6&)ms zaJa?LK{g{CZYgsRce~H)aj%u&A8dC%74gC?CJvIw83y#C3iw@p^>T$2N;2&&6 zI9%fAly|pByq+Wn5&ynM<>68|@c}Q$CO(5p+no1%BOESCbMO>|yVv;e55^%JF5Pm< z2N4dJVmbIcgdgG{;$J1glM%ig;e!!ghwwuY?(Tc@j}Jq*JHByz2*S6bdWIt09hdmW z?zJ=gV|UxZ@gq0@lRKVpJjDgsoL|$zCyu+d5&j~=0|?)W@Kl6L;5jBvi4a`9yd=i4b4uSGcDPPzD6 zg!Ao`i$@X8w^J^@8R5wYZ$mgA=iTz#5q>Db6Jh6r$9ovUhajA9r`&qd5ze<$F7E!0 z39pB5r(8TAmFL?j7mpyEZ#P{WKi7h9H(h)+D$lpSF5ZCf84P!)^$4Hof^6Q3a9%zP zpM8n&6Hs~gdCokp6A`{Y@APcqc+goA|I!hD62d1SJO|+=2%nAcg$O?d;dKZ<72)?I z{4|8S&rjw)Pe=GRRDKS^6JY0(mp>EX0}-Bw@No#wM|c*(3lKgJ;d2qb0O5rQuR-`c zgyY{;2_bwFDnB3L?;`vxgm)mk2;se8XPW1s7~$@73psu^!bhR<=ODZY;Ux$^7vT#K zUW4#bgx`$tGK6nNxZ9Wc$J-EoE-K##z6@~x

{u@Ct;dAv}Wc@d#gtaQqyPMF?Ml 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ΝiY>_u?iEC%D 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

GJaqU4HJT%g^g{`LVhW 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ⅅ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�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:sq7e9HfRBzGpX7gmGR8HvzvV(vpPdNNy4` z_e54F;l^&a0v=?y&jCIDYF=dU zXDhhrohkgA6+AUBGWho@cxqmx?uWtu7YaU&qEs;We^T(&yvX3^!A0&LNzH$%g>DSs zLG{aTtoM&xCRnL`ac2TPI>K3{4yK3S9Rhzz!D|h=M>{h71MncZAB5l^fDSl1Qm2V= zFopMZ~wtVzQ6liYR%Uz>!RGX55DlTThmrd#2! zPlAR@Za6ZdB8ep2*z*X$gZOamE(m^!;?tJoWAt38;5R1WhW|Aod~R0w8YCa{}cj$KLmcnu;6le@{u$C+(K_e$!7=S&TU?_sA5^gsp^AJ^~WPUT+F<5+7i%% z5C1WPn_F5uvAN))xygUh;Du8sHZ?DuU$HEC#ZXKdTXAJQ{)MCjNYmmg7u6LPEvsGB zT&Mo6gMUgh9v3FnHoD-`06rW4u#^T*a#x$ZD!J+%jilU+|8@GesKGySQvdK&%$)j% zC-q-X>i?hQZ=P_WSmP*Y@hP?$&7V9`JN+2QhGagVv9F%09@*Fsch}KAZ?d}xvNw?(Jm zL6qV^I~0$d+Az0yQC$WS=*#tgSjk^3kz8K$S5S0Zv8cv zKtyTPz9&?ueXse)RpXM`N&KsuRLSYg9KL)+wvN z7%8*$*>x)Yz&4@o8CJauj;^#YO{}YIS>iTPZ*x}E*34_hzh%|b&bg`?|4kMAJ*l*@ zWJ83YLS?nz>6GYUZncArkSH-wJ%qYKzDAtabSJH^AIKzp{0l-OvQG zl&>zChCejo8*CNz1gBi)q=rTK+l-o%}SAD=6p#hlw->W@G};bXz@E5sN+BlwU)YcM}?evCo~%_DTEB#A?vS zOQVUwOJj$JMXB-GTr2LygOAPd;9{2&x?{f1pK`7SQhX}jh%_h3e^V2>%zj$oEv{QU zr*UP{fElkGOe%J@P))g3|1VvgZ21q@$7<7?EeDCwy#yOyG%S}M!#}c1qfXW_M1FKL z5tb~~qhu121j=BDHm?2zTy-^toiy=j_O*~bzCXhJKH*%IFnlU4_~jPdtPHyNww|+qZ}c?xcf_x?_#BNq1NEGZXyl$uAOhjk z&A`nH9pMu#cq#G>gFU{FvEZc^euKrIzTNP-&ce6L^%)CZZsFf-!R>N=!QyY%?>8;{S>R*ZvD)

qQISE?1`oudwjDEVx}Rer3Vn)>jr4M=<&u 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%0DZEYN(-5KN%NhRL{vDW*9F8cSu3% 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

Wpt|BxA7F8hQoW~H2n6%qj-0F;;DEsDe^v- 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 z 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�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 z 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 z z^6!Jc0{OMpbP8OO9_rr!{8h;J0H-|nuU>=vposjw;IBiz9Gv>6f-i;qEO5%#gTDd! zMc|Y_5&TWaUjqIm@O!~`0sjs7VDP2j`+|Q0z90Bzejm)Ck}~k!!AFA+2OkH1Fu2x4 zHa;H#PCpzK;fujJzCG``hCjxOcOlR5^Zf{4&2JDm6N|>-9^f4R_w_u?w;b|}BU2-M zIym(&0%v(I^*qe?2asoZ?~L#Vz^VWF2>;mgFy9T1Uj} zJi;FVe+%vEorwPR{6<)4|JI&|_VcOf|2$(a#;0XX&i9Gv~= z6L89J?>9(8KlBFYynVdq@(;^f2YL3pV<6A=a6*Ki3r_t#)^i!Uq9Y80{L0sl&=SW2l9)+DSsmPyO6&Sobs1}{}u8Nf>Zui;JPr zmqGpsaLWG?{9lk?Z3DH=w(WCW@P9*oD{$)X3H|}(`+-w_PjKx4nm?z5Q~n6>k05^( zIOUH8{}}Q&fm8l=@J}HBAUNfJ1+KGXX8(KOl>Y#H707qnFx&r|fUgSq9l)u7SMV=D zelKv!4+CEf@{_Y+zXY7}PlK-w z`K92Le+PUW$d~vHRo6s{#)mb**M)p{aO&R{Tzd#+e;;tl4+Phl5R)GTPWkcR>qGu9 zaLUgF*BMCDKOda($AE7L`Ln<&e*ySLkiQ7A-@!y^6!A_td#k`WRvXrT@!p;$ae>){%yf~ zK)w$+^de7yD9l-l;*4nPt zhMfn1-vC|<&UMW~@S^opgkJzoJr97h9ex154(!=%^H%${2X6iu2u}T@!D;8$B77P+ z^_&JyJ0Ah3{Og{F{bd>CY0oDS-pwBbaYZdUC)N|3>$v{lTn~B}){ts~aa}EE1sO({XyxDX4hxPJAgufNhv+b5?y9)JRU z{v7fw@1qg^dvKO_8-D{h^#88l^#3Su+A|rP@<)U7KK{v`tGqvV|F{12oq+pgTFDgw z@0q%>zX|vmUjDg&@9y~<0spS&{|NXEp0Bc1`VTAbJ)W-@ z@LzkrMZgDozGJ}cer+M(lf3-i0k`|dqXYhqm!BMPyYKF|36p)Bhn%d{*AD)=u-%q| zvwiLt;roNLeIDm|*gk&%&VKp|xX#9yo%S4YXs6x37N?!N;C?H40i1RY_gr?;o+~1J zU1jJ}8+*W+ukHnyJb3|}_UIjJN})ZA!P$Q`hs=`ac_Herfjspr@Lbu@&f_BdG;r$w zenkI0;2dW*R6$(|%RA6>*+c!4Ay50OAy4}oB78nL_4oAmG4(a|_W`H$o#oO*U~*DJ|C2SNYA32l3hs0w@+R~Kf_eDE)WpA5b$_?6&{ z3-;av*`u-0^gjxD>i<3XZqWaN=hE|n>w~7}Ey(wR{NEtY_h77p{!4$_c^K*cf%{|n z?Y#uzyF-5u=-C6jA2`cp&kL)5S*`=Ty!6vfd)_>>htJ#6o(AMgdyWIAJ$#>AZ`glE zME>>&UkuK2J?y#cf6@Kh{K@B}SYN+~JpJ%j=x2Q`gFNf&6L9)xO&Q{n{7?UM1E+t6 zfwP^Dituu9_D7D})H63CzYv`LkW&vzlud^IOmQh8afTfwPEXT_ByPp*3hN+Gv% zt>VmAdz(t)tS{}kDT%XO+FMWx^{Z_dr~bj#h)AmN=Wu9@UYO>W%Frk1vT^O7i%U z`XP@m>HGBZ_>%hJzZqX1cTF%WzKCbV7xAq4BAyjr#Ixdy_=*r;rgpLT@;m3ZJig@X z7uO7uc}2c{N&Ue2dA@#0<49Lnzx>v<)2#R+o)urjv*L?*R(ui9iZ9|TLVTIh#p26T z&Tn~q$>WP_26=qZMuqo79$(V-zSjAT|3Q+FXCD8MLa9Mh-bwY@vQhFz9Phz30*9{Jn#IL z$Co_5xMq;Ymps07`S|iD*G{wIi+EOi5zmS*;#u)UJS)D4uL$wwt6eOORq|3 z%6Tq*J~+=0f12lCUUfRnp8R}r(!D;(pMOdH@cUKL2B%>+fBvOyf6UJ(r|smwc|Q3S z*A}zli+EOi5zmS*;#u)UJS)D4ch&gP%h{&1n*09%_gsvP=e-k}K6f+FaeMx!416r& z(G<_6XC^q~3**$;kY}8_7MyYFZg8F((K9ki%9qb+zL(IH(;hx&z0}EAdAIcAmGm%Q zdvCTlp9kC(;~Ssf8~{B$PrEndIUY`eJpFSpMSYO(sHqP>%49@m{MueXa&hut>fK$(X;FNz5oc;6} zaO!yhoO)gbXSx0fPCa^Om-&JGD-pgQIP)C~&ia}R&T`EFXTEjd)PD>(%f;Urp`M!| zPd+E&htvycyM5jL$FI@u^_?yg*V!y3KEElhXXce`{5JWQy&gWlDf!bq=kuH58+tu_ zzLL*xE_O0X665om4<j>%L^P4u#i}U%-PZPh!IAu2euZZzW?+P&c z^Z1p{C-eA~`XP^BsUPzAmHMG8#IHBqc$F2u#Ixd;cvk!p&x&8-S@BDJWsF}3tl;tM zFRotl_*J~F%;Q%czqr20<5$;-Uw?MvRaX2G&x&8-S@BCeD}IS*#V_%dF@Ej8g2%7F zx_ZguS02AyGf4LF^8Lfq4|)7b{lNXbuCV@k*R|8E_$8hdzr?fRmv~nE63>cX;wy6e zn&IMcX;#u)a zJS%>QXT>k^t{T6_JKL0WADQPj?0ldLQ6-FD^Caw&_(;Srp3~rY2|e4TB>lX9`f@^3 z&ikj!z7QF5&+`EGyXVT6=K+2KJv=YL_e--}&qJQ&dIR~=PQFK)_N*a8Tng=3 z-}CT%!uH^_XJ>Gp-`EYD@_JT6N&3kT24}gZd9Dwh-kv+>4(!G&-ywS^7N0r zk6K@|zOIBG*4K65EZ0lmZ2zxE_&eZ?N9#q-5AeJM<@vh_?5B2*UjC;&JdZ~``ygMI zYdkphaJ@r*ZbbfKaOQh0IP2>N;4Ihu;LP`7aO!^soaK50oO;%f!(0me_897m@~L#% zzy9g|V>`&{JN>8ljh^%ThPc|IlC3{XexTor?&Vj+^Bas`Tz`#l zWwP;qN>b{yUKlSJ*Vul#!ui90JDbh^eEpTLzZk!I`2MO7#xLvl8h_ZH^Ye#k`+33p zP5$9HpPxTW{qt$gAO6evG;94Op0)lG&su+pXRW`)v({hYU3L9caJDI_y>b0DG@)sH zXZ)Jzx#ao#Uv-e@?++dYemUaZX%T)NIQ87+x$@=je`yV+q;4}D`gg?og7K8+(y6}& z>kitvAi}=|PCe%#U)uRjgl~=h{ub;X;<-Mk-`b=6z~8-^1$o+EAK^!WQ~&Lrhx!+T zAL{;Xai6~b{RKGZv3~&Py!7wjTzBs)!(Gw`?HmKn_E6=yiuaNG zzm@A~$WzZL;7j0#v%zWq#o$~IUg^2=<@)_*$TOba0eQyLMq1>%o_x zhwH(Ag0oy-Slt=!lD=lS*7IEDqMi18ZQ``&%aEr%rO;1%Mu5|v1Hid{F9)amoCrS# zoaH*fbJ@@J``M6ZeO(B7`r%f{v%c6 zFL0J?oi$xUb4mS+dUlEMzoFhKpD1yE)NVg?|1X1_zBB%q=Ul%_{K z`Hy}h&*E1;|4G*i`TQsKLr3O6C2o#t?I)lAq<+iiKdB$``A_PHeEyUAVMUz(eBxq% z*8E32YyKmiHUAOMn*WGr&40wZ>inl8&!2Mtr_7Z_N%N?om~X6z_bfR?^uhJ}K+m-<<9aZ^f06p_1^9>S-2DDU>Yq<@|6)})US-|C5YM`QA#VG{ zT)&HF-McX;#u)aJS%>QuZ;0)?-e|Lb#wKS$FJh^Kl%P) zI$q`Luhb8D{OUUKOYe@(ieKVc@k=}_eu-zrFY&DSCB8Douf10A__cwnmpp#u@k{r) zbU!O!f9311uKfP+_1$=t6~Dx@;+J?<{1VTKU*cKuOMGRFUwf|L@oQsOFM0gR<5wQP zKKUg7{fl&+)s^GdMsB>yieKVc@k=}_eu-zrFY&DSCB8Doudl4&@#~AOUh?>r$FDqo zGr#|p z`XRsnmHHvS|CRcoE1W;v+>KXR@k=}_eu-zrFY&DSC7u<(#8<}nrDtJm{9h5zAAZTz zi`k#YuRMO`_rLP{UtM|qr7m_l7**=P(KKe4hi~6U+B8PJrlSOvMcN#_HcbRD}IS*#V_%!_$8hdzr?fRm-xyUzxu7< z@k_BOk6-!v%jPYdZ{+vC^7~(1Eq?WM<5gDt63>cX;#u)a{AKrlCBFYzJS%>QuZ;1l z?+PBjc6RlW$FDqosUPRhf5{8^{jaXPf4Gwyud?Eocvk!p&x&8-S@BCeD}ITujPa{< z1&?1}cJ-3SuRMO)xSg-R^7z%2QXT>k^toS9qGRCjM3Ld|9 zclDCTuRMO`@hd;SVdFqoj$gaE@hU5RiD$(x@vQhIo)y2uv*MTd${4@;tl;shkE<7J zxB2;v{QP{r{>s;1T{(XBcH>o6{1VTKU*cKuOFS!niD$(x@s%-t^dNt}zZ#wdH zzxH(FRaX2G&x&8-S@BCeD}IS*#V_%dF@Ej3g2%6YUA^S-D_?)*>#uzMW#d3sj$iw@ z@hU5RiD$(x@vQhIo)y2uv*MTd${4@Cyn@HC{an3RyUo{M`T8qgf9311t{lIHy74M2 zeu-zrFY&DSC7u<(#Ixd;cvp>I<(hoDr1uXD_(JP=en>(~N?eF4nc@C)^Z#AzKP5j1 z@(Vqe{DqLe47``)7B9XJelFw}doKOwLH<$jnc%;VaQ$YDlJtBB^1A1xB+mB@s*aSz zcR{%(g7f`>)4}YfvY5&a;{($FBMM;_axB2Z|$o~}j-v_6iYe<1hDi_~# zxSr?wcmevmL!RULwvgxh8}%DHN})gZg*@NiI0BsSZyX0be1GFaaF**ZaF$E&?o-kS z?OX&-drkzWJ!g8Za?zgKz-iAL;A{_n1?PJOKLV%xYOd`mDPQW}H^PU5_eQ%N4Ng4= zg41smp3AHk(H;(mJln%JAWuJ^40-mivmj6ZUjR=3Uj{w&{|~|Gw+F!K=U;%+p5K78 zzrO@d{cnO(|3ASg|1mh_H&(^Eqz~r16FBwk0Zu)A!CAklQtScs);m z_wh{V8E`9$(6ivBkbeQZFZe6q{lJ%k_Xi*5x!lV5I~nqfzjMKNc4f7=a4PgLzB~xd zc=QH1e9<#&O47seWFX`@o|HqL{dX$lIi4H} z&hcah^l&_x2hMUG2hMVx0sXY|YH-@~eQ?@yJM`0@AAz&HKLh8u@gz9ye+``d@vR77 z)AyUOe!GD)zH9`}eEUSW%?G5P{^Wdsap$Yh!*+6@=lY=k8z4`=&4WDaWg$50Emq+;Z;2h6?22MSHi13%dspm~_wv&&+secVW7Ri3m{XgH!OAq~jG&ucpJUIP)DLCbC0jK;O5&lSozZ&6x z250^L1Dx$-?a27N5jgd12F`Nr49;>5i*Uv-$}@g3-y@-i^?NKh%XJ<&^fh*B`oj1kUmuKXl0VLK#x-%<|72VfKgH{3ToeC_*VEPF zT4~~)blhNE8|=BvW?W;u+tGb#ai%n76pmwD53*cehdj$QGh*k_ z;IzlqeX^7GoCf_IS1$l(zrGBd{rV1Y_Q(6c*{_#?v%FmQF|Pd~BL888bKXk7aetU` zt-BoKQrI41`@;huPyg)gxjyLs;o$WD80ew@xlW{i?7ofcq@Nq1hw{gQQ~sm~za+wc z7~v0qvwnX8&UW$~IPGEFq@Fh+&vJbLPCc7P#{az{ocqkocRb`-zf-|kuFl5IZ$S^s zbq+YobxVY+%__+qV_jc(9Q}cOlJ^(mn&fTYfpJazRj-F}O}xT$#x?N`y#AFbuI=E; zWO1iT&U8urj&bVK#I>(FznT6#uBGQp^0=1zA&+aRAM&`C`r&^$u4!(Z71zYG;+l9? zToccVYvNgPO}wkdwY`&Ql*S{j*G7A;aLn~uHF!_NwRzCPxONvf*K2h+K_9rFJ`P(qabAGP1xsvp7em(*D za(-R~&T=(?vs~YVe%g5!IPJ0ZS7;B{U$o~&XJD9*28msaJ{ByWR$}8Pzrhad4I^$Keo=&*Yv-QAL48ehd~eh zUk%Rk%7;p_lYTxPobu;`Q~u%zm(5C{{$EA-@4#8Ve*|Ycc?X>Kybn%2AA+-7>qXWt z$}7wMaS=WRocUIQvwmy9S*~w_vs~W>r~Y%nS+1+WsfXuw$kWoMBIauZh=s&h?u3GOvg0HStEzxn2|B-s|aV>$Uy7gVdfG*T#7+vl-V82UnRa?i}U0 z^e|360M5Af8aU-Y@?7~&b$&Db-Mn9=pY35YaE@aZzodt8trz5Zf33IYlIJ)!67p>4 z+9OqxJjb!g;2g)eugGz%4*FRx-gjfUj)#8Qc`-Qcxe}cAFn-aVJ7EvY`(tqS>)(R2 z-*Nwt{rWGEXLa$9+hkE`5&iZ`~obBY_ z;MB7!#&hbib9|v6x?}cO=Rpy9#xLeu3whRWGdRn2JUHz+9h~|v1!sN5_8T9C zJoP7);{M33Q(WKS{7>H*Z}NU;T$B7f&l%Umzu-CJn)uP~|4NK&;(B+L(#jOqwsU2& zxbu0$wXZq9nf^SkrTZ;;Tuc3s$Fxif8RZif8RZirfAO*K6Wg`;g*Ybsw@<+8mPhz{$x#YR;w1KlhN&SWU z5}SE0dG0%H4bFY19ifN&P6NPMF1vrHd|57?K~f6swEJ|SJ%>Y{_EQ^6^3WY$rTF$$WW!l6oG49+vBQaO#Pjlk5?RcdBb8`G@)1GgIR1?|eRvOd%ifiIoaZNlc zu8C*GHSw&tCf-%!+Aa$2E-8F(jW~61LffuWs=zsKnGeo+$jRWGZ(Iq^b=;3Vmpyt% zhsCu=Ay55$-xufSFF+61Yi~gh=jS|!$@SVg&IYA${}0uhvzM6k3H|E^3tA@VGq|+XMj`w_6XgQ17z+8>oG`xH3GlRrTZ$CKFeYac?M z?Re=A83+X>?o^`8KF>Nyphez*jj zdhUtv=OX-7aOV3iIO}&AILozmBwobcH?lqCSuPu6L;sgUp5;xP?Ec6s&GC5tSl=0c z-?tma9m#*-IpdDF&Hos8#6Ol&ml$`%f8h0W<+!6Wx)w+Jr^QIxXDxUYIP2ZsLlw5? zMUZDbo(<0Wx)Gf5?&qGXzG|H>&CVwvPyH`~b9`G0J&bpJ{}so#e?y+*+s3{=RbKjG z3(sXI$G0Bf9N&6D568E?z*(-*;4GKL7v)PkH8)TS?Xh)@IPIAa{j}#aaN2V=IOEaz z;FRb6Ch|uh&vHHPx$I;-`UB)yUy@M@{lK`u`bq@7JnPHWHKBiOeyVz>e`4|F04Z>( z&3F~z_FS0cIo@(z!~Vi}L3zdtj>BBnP|uaHhkC99XMM%uh8*QD(vzh9I3;lFvm<{NIj%8D=IS@A_Y zE53+l#TW6c_#(a{#FzCEU+g_dnx}EyIy>#g$^4D$)^CGzeQ_>0*P*t5DE-_Yd)Uis z{G8+bX7R=DvxM`;m!Y5gEpI{(_s9MLdG5E^{g-gu-qhKk6#C&yo=cwVh3&z)UidQf zaJ|6$EcBbj5#`HrO@@BP7p;+%LVN6-wm9vv=bNOT_M8DbY0tUf+#kCTobo@8@Lz(n zT)**Lc53g->it>Bv%X%2JpEw%++lsKD#b2^{#hHG{@KX$&_A1jv%F)$+0G|KIPbG? zzi56$ei1n3PXcFujNLc68uHY0131fdFF4Ef`w0Iy!ehTP!uuv1XSTpT70V^tlvFRY z$M$x_SuVc6o#o>BYU=q$ME~GOxnzryzScd>)6rhZ?Y&)GzerwZu#~tzCVrLI!}W`} zopa^>nD`Pe-<9{r)^laGe%%$~i|!GaJ$Zad=VN(%N&S$=m(&k=d`bP#72?Z0H(q7M z7xAq4BAyjr#IxdycvgH7UlHQV>4-1WJzPf|56*I(1I}_?0{yh}HgMYWLvY&j0QA$IUx2f`w(gMq ztals##cBV0(8GGy+(t?A)g0HsrZ3YXqnKG2ryS-DlU=Tz{Pn zdA6$yJ=X{8i|2>w=er@#di)7E>+vDa!*=xoIQ_g7oc`?W`7W+g=r`W4XTGvoDQqXP z`|tc+4C=ApUzQ%)KOOohUlZY6zfjN75qZ7`kMdlfGT)@I?vLE9Jp?_guOz#bjDN** zu6HEAkLO(Pi0j<}N?h-VpXdIs#PyE&@m^0?Uhk+6+Bnbm|L7e^#z&>aOZ?XiZs(%q zSN5Z0AHgM|Uej4@M4|$er2{`q<6XBai#(Dm3FZ1Q^9z$XpyfYse_D3Zp6@_E?cutH_HbRp_0H|kL-}VS{8ez4%ii-QJGtI@ zAM&iPk3E+>{jiyUOR8Vim+iajYx>82=R%zR*$sN=p8`0`8(Y_KKalO8zeBq&6xiJgn)IRVOVhjj$=RU1$W>&u??5NEl{AW!{c z!KwdHaF(kcoO(`+@JSIrB*wcx`dYE*dbC%4XS|=kp6eaS5AvMr9r2%dJzVdI+x(L8 zNc=4?-<8)pC%dxRINXtVbPD7b$(b&N?c~21k4|(xHv98c9;#u)XJS!fFuL$vIbHtYe)9{kS7p_NaeWWmbiYu3m|KEl@ z=M`sybAEfi=hDOV$Q6+1{PudtbAG!R@|@q=dP@2^zkLjPIKSojI?iujhklmpJ#d!G z)?dn(c5do?r4-u3bK110r95ocG6BzkE*)*Aa6gdKQ9H&#~b2!+GGe zljknTW9zBspojVL90lu_=O|dNRU+$`wZW->OK_G;HY9oJ=+3Fc+ANo$k z6Swy+aUCT7cQ4O%koZxaa~&jZ=eoEK62I2V-{cKazI-nM*GGIW!5xsdvxP!@Ujg4s z!1oo{T2=Ck^~WXU%l8uOlhBmwUF#M{#(-Z7en^B*2dADBJXd|`H!Dp)e5n7pi2k#|Y5&FGoag)uobtZ{ z=lJuI=dwq8jOL%eLZ0Kv$KZ^EtIP2&Ne|~m8+xt}#=*@Y&-un4kf)vfAZIUf3H&o$sI@6F(h3qJv8JbDP6ap5s=>UjyA zdfo)5o_E0Mx02OW>uux9n&6c04$geHj_^W+9~9w7f-~PUBK&-C+H+5YF9xT7eh$uj ze+ka{=i}g%e-@nW@MX`{zc|nQ3*_0q{sDQm+iq(l)s@T#*xokrT>9Cbw*+T<-X40` zp7#Q$KZk?UZ)3n|&m?fR+iGy?pAAm^mw|IUyak;8UkpzD&qa9Z&2-#5&5fTAqCWJU z{3(96=bSHzf5&sqm&8x-obx5|1ARZ_d`bKzFaNAJNcnQU^a42NORs=)zO)pa^QE`J zIbV7gobx5VxAr7wl*N~QA-fXJWhM}PKuB+qth^D)V@AAR8E#o3R(;L4&TJ?uxe?iOdcwu3y&wX5f$okPKC z&nR%(Qx5&K=U{M_w+fv7bUrxy(IRm6Q#+3wme=m*i*x+E6nf~N#Sw1vSm~kPp78SW z8^={!UrV0t;Wfy!J=ngnHkeVmmd1xou$;)6VY=bIP3RJaJCcfGgJTfAx}MAkF#8{-?8F)ocdSAJeGVNaOV3(aMthE z;4GKwPD%Ae{R6!pj~+~D%46|}ai`A9 ztG*a_PKF-&(&A3+xqxe+hvUpm(8IXH=i@le`~>nGXSmuGsT*+ag|2zm3UZ{qp^{EEmt=kf)_e$6Gy%YWuy? ztE6Ix+kA*|N8H{Q!?+`^|0^->h;{RvaYy_<&pF;&8KsBuh;fJUh;fJUh;fJUh;e7J zGI2@eW!&kV(3I<09*ZMYp36_H-~Z26IL9%r6B*a?_ob)j2e=O6 zxT-a~QrPd#24~z+9c9V?D8d;>SYM1Ij5~jT9>yKXD5*U&zW)pIY`2M^muK9ucp*KE zJ9fTXexQH24q`iu#f5Syc1e0TE*%KYaj&!Y4Nrg`jhA$gJNrcVAaLrjdXt^ZSI@R9h5SzFdCC3T;@~^r)Nk{Y&=0mhqjJ%Ho=Yd+ zO@c0ke&F~hxYFYPW?SS zmsu~v{|mwIa$nlK@Db=?{eB2}?Gc&$evx{#eNN@edN~a86;C00>7NIM1b@^>_+6+vj!QY=?Jvu8;qN{?+|`8*%oRjltPpPWD{( zu-@&yr1%N$kNNpk=+W6HEAQXHseeb@=c0TmIORuru6)0Zd}|?3Jqy68=NfRz-v&r= zk4C=RM)*kZg^)iGT=z1}{+Zy5z>fic3jC*@J5&gqkxvsn%dbqB<2At)(4V>k=5Bh26Z^3EL@4;!$i_lMdy04p5W73{!&o1Cx z4-NpQ{6656A0OdU!8s2+1f2RS!MQIn1Dx`6!0FGUJXbs6{=5h@{5;EZwP(&BE`j_!$lnG||NIP`<$5*3Q}3knf4$@JV6-QFCws&Pd+x(&3*Xyw z@BS9v({t{JNY5R9{NjFy_yW`8{;i~ZxgWA2IQK(%-;nzu-63yl1nJ!hockf%H{gCq z4_)Mv?BP14KA|b+y!}qk)$h1ocmwjB&-aEsoEPm4&iU2Y2%ij2J##$|?YR>2T#s=7 zmiDhE2e>3XTvx8^xjwkA><7;E#lGNNSMoUyt}AQ2yz=F`Qhh;5oa;(EAEK{WU;lzU z*Oj&}p|5ASKh}=bca+4nCu8#^zVDIqq9Y(LfA&kRcJI3aXFFL8&i3$Y&s8q2@3s+e zNgtfw?h4Lv<_gbcKmGp<_zCVyEAL0p!*$R)k@a1FaLVroPJ5<$E_=AXI|}mDW9w6y zMLl;$T>jsvGe z`1#<}|8hkCyWq6557vELAB~UjdEg73ldQj-1kUx*1>lPye+&3i;Lm#=`u{D+)BhiU zvs|lVJ$N_tZ{@l4U+%_6v%fFo+28jB=Q?NzmaLU(#)1PxZS3BW)XA$JtPELe8{eKzc*-oy7 zJnQ9VaMsJ6(8GFp9Gw1q8k~N69-Q{P4$gV|GH~iI!Md3GxxYa_Zx4Cu85-fXFQGU> zJ7+7T{m)c>0Zcg0VV{BW5Y=O>{(=?mkfp8Mgag%9xD z=1nHQmFHaVNdIkK0oOa?jb6UQ{oC^8dS^9ou6Nb~=X%G^G07gTcerlidWY*Ku6K4% z&1o~wjNNy$Vklp|i^=>lJfdfQgg+4B_FS*pGuI<_KTe$UrSaZB;%qBB525~zAy55VfA^pQ)=P<~#ypzBgN9?__ zs;^gE87@@0R~99t>0=X9S>$d`drk3F|5dA7q+0hjc_ z`TR8Bzm&b6(JzybOZ#|veAzx% z@#PX{`y7GtvK{Jdwo;g{=2XU+FQ1zrx99J|dU+RmSTD=K*?*IXp|^+i!gE~o{~#6A zrO^M=JrB#JIlNNHUybm;fwR1}|EaI(e>-m@PXCX?I8Xn77o6?nI&kLuP=xqzX3S?UyAzTxXs^3Aopq#{d!i;;)RV{`kwkXl`$@fkA?hp2~9cuFb-U2 zkWByA!Kr_`=c<e-3Ea-V$Ry29=lM@^ z#u4hV=dzV=Im$~rpN0NMz5SA>f1dU{^ux>G^n;B*lBXZu^YWn|)^Ii`iL;$=0lq)% z=Y66Hj$8Za@8y**%fv4#e*9ZIQ7;x6(L~xe(>z;?@tq14)`AF!| z8Bw$I#DH(->{2>6;5L3;7I14Ph4iwd9>+Tw(_iVi>>LmOd;^^8uLa;-f1L`>{hUj{ zxu0_DOM$*H5_>Upq3*}wi<)tKfu8X(!T>haSc7QzB z#eCla*TsFIhwI{z;4If9aF**(4^WTzZx$Hi*{LlSx#R4VCv%cQ;JghISmswxDuTB4KECnv1P|y#JOJMI*591iRj^cgZlp*k+*e<@@4(5 zs)D*C&ib|WNNB(HFLBoUK(9w1>~~)SXTM{7XL%olJ><)vhxN5K`WO3=#RA#Mb~Ov_ zjr!++)1N1Rv%Y={PCd_qQ_nvmd}|r#Qt0QM!C7CtAHn+C7xK*4?mOsf*4Ji{cA`2` z3hiNkoZw_^yyAW=>wT|OO%nH6@3o#wKmB%fgtI@g-j_l@>wN>1i}gMVocY?h)3CfV zAkTW&T2(2u-}WU!Jx@WN^}_eekgtjM&w96cyY#c(IX|bKouP;IJ`(+i^(Yx7eXt%E zg0mj)@I3Ux+Y#Qww<~@9u=``}$L40@tViu(DoOuL_oc1h&jM#Xeh-{}xC@;1xT+Mp z6xz@ISnAmc^5kP9d@4BWaT+-5u^ycI?Y^GAW6s9fm6?ep36@9+4dDf{x8^1dD|}v?L0@oCFxdBVssezW@~;;eVOUn$P^WAQQM%|72y&-tFqPPPZeP3HR=^e|t$UmWIZ`-fq^ z>qYu6$0gdsI7`m`u1eSDt-XyX!h3)--ysqHbzaco~w*=>X zrJX!i{puZP7N1H3-ZRavWS@YSdcJ?aM|wUb!lwn?;%;4pe>31V&p09AHlCjoa63<6 z&wW^VZGLcLAaC~H72!XP@W&$D>{Wen{?OTZ(XQUFp`O0roNw$2&U|_Pjl3!%&-o17 z)$tMe)4^#E?|U-et07PRg9!gogxh^m`Gqq8kdqnuxBm84<&ReRLp-b{V`9xTIf_2{0IlH_N&f7>{4GPr(&%sBVAi}Xl=OQD{lz$t$*IOkV)fzO0JkAlwv|0j42 z_=b`BL+{A^VF={e-bO|^=TU6W4Ui{4Et2oWkY~PEM)(iFseeg?|Jif7iShA6$TQzB zV4gs}0XXxm^j!K`U-Q6OUq1q;JvN__9*#e6MdX)(Q+_MNed^x@obr6163cZsB^_{almapw2nWZDL+V$&0{tT__c`^cU~aiHV@b%;L@k`m4NS=;*t>o zul9UGz|EdR18(vA@POOAXKui6_xisb@H)@W2>8!D|8Br-K6GusZGL0#Wio%-eCsEH z{HtF7Q2!};-8-;)wDYv$2ZR3-^4c3T`Byww`>#g)dKdh+kmq|x*{yCDBG?Ef+3d2Z@KaGsk|+g6hO zJU8_mILq}WILq}O^wZ9DR8W`nL3{M>bR~Vz9y>1@+OwUP7iW2Q0q41+J;7=J7;v5! z;yjS@nv*LjU!J40eSUGup8(lKR=4_)m__GlHa)AvHNS{)H4wBF{v~kAbKR|b4VJIHk1Nb~7w>Oz>fwD5=4;QBhVtKm9?J8)5cTWqrBbM8 zvFGyVT-eX}HP3O2`x{EoCF$Y&b9zVkRPcq+!{4bn23&b5N&g~n?yInVFHEFUdHUfR zaQfkYt$y_^hLZfr`)g}@KkH*}*H5k8ei@wo%bpX_*L=Sj?-$Q@daRxB{bqIGTH`3m z9?DQ+|7J$`6e2{XCcb?APNU&whO{IQ1U`J@o(ekf)t@fm6@(;FNzGobvB` z9{S(ze}(?pBeJhz?EjZ^PcY7{>>RCn8e?R1pKtFvHoaK5Fdf2Y)J=pRy+toV}J@13l&JV%4F0lJw zVSDENFXp?ApBTv=&b#dXmpJEdS7D!r?fenwVS9KIoc>uI`zMs&7@YDuW1ocM%oxa1 z&q3hSb38cZ&jF|W&%r7GTX4$15#j6meFpiH@nsgzcL zE`@e(0#5ldaO$4`PWhP;-spMQ9~VNN{qac0hg=>KORPdi@&r=AVg&-TMs;FRCl z^U(k0kY~P!f>Y0_;FP}zobo>fr~KpKlz%qDH`<`Jyo@7zMfgncg|5&x{vQR-_;NZp zfNyc?a^0FCT)lysP^KYS^we_FV0p?P^e(5bcJ2nw_|n(&FyA4N zXTIaW8DFM=GrsugK(hXAaBGTD0GeKlYCPr^~{I-r_uAxPU?yI;V9@) z*_7Jz!$Qc@{<+|(miGO>C?X&8|F5u8T zETYHuMmnnJ%7~t;!A)0t?c|zH%G2V|6AacKU0$npIF}6;MBu$m3nl)$rAP44&K8H$UoPC)1Rw=_ksMa zu%G>LF!&J2{~tK*KNXzzABTKt|JmTwb9zM2iIAtBv%sn6%!r;#AWuEt1E-$vMD*MS zdFrue;^Z>w;W$J8*l*oRo_c-={k`<1OR8V$VLjSeJIM{wAD1L=@3_!^578f&#P5ZE z+R1T@cFu=9?OXs(J(ooMc0c5)XEAsW8R?Sjtc4zym-<=WddLrv5|^asKIk8n(3C#_ zPWvx~9{S-($kYC#z^Ui*h@SHyPdyia_kf+NgZBcz4f>hyRp7MW?!`z2^R+#E@gDl) zlKgf%^f2F5VGr}=xZOiaT#}wUpoj9;gVW9`=%<}_k5qc8=jMnWyJszV>ZyQy4}Iy9 z?6i9&`frx^PRO$z+OwsSAEZAnNzdJoA0p_I_?0NvsD!5cQt)zcyXPWwAoyC4KMeeO z@LAwjfj59(4L%=yZSY0lH-Mi6z7F_V;5UL_2)-`(<=`iSUk`pN_^sgG!0!QX1YZok z9{3~Rr-Ls6UmyG#@D0FU0JnRlLQBEztd7vT;5wIOX&Lw?;7P-A->Lna1a9w97vB_o zLjjlc@kQ|N;6DQI0lpb{FYwL5`+#=`xA$P^YdeD^JBC1hOUT>v`1<+?@N&q13H(6t zt-uch-x_=t_%`4T;M;=F2k!yC2z)#6lfbtJKMTAk_=Vs*fL{*2Blz{;JAvN{zBBke z;Jv^XgYN?V2>6%5mw@jI{tWnT;4gsh4!#t85Ab)v?JR-X$ujUhkT3E7*4G7a8w15l z!L1L9_XW4MD&7y=>RR0HeY<~_m=DDVK;CQ<9|%6k|6APt?fzLZ1bi^$M}dC@yc~Q_ z@B_j30zV9VZ}3^*`+zrq?+ZR3+-#Qpi@=9M{v`1Iz|R6727V#x1HhjF9|QgZ_*n3z;N!sG1s@N-47?n?#Lp$vuD%Ms z7Wf444Z$aZcL$#YZs!K2e=>M4$WH<913nde5cq-ML%W6&ZnEGJ|;>aTZZ^g%a-kAC)pEss{ z=xXyu&g)|HKtC-?=6lCuen@_Dgr6AUw?ugC{`fr+`Dy5PJ-k6ez%9S$EJigppA^@b z8%umYl|Q1JeAVCuByVS3gpLFEM>`X8A-K(@g>C}(M-CIR7~CK6OUM)8>-vA|V=1^l zI+u_S!TnLPglwn*$tBtEk6b1H&G*~eSsi^b2=W^ylIfo@;P%X`zBvqhW61M;^_zg( zK9cOQXLIzmy?K_4Q8RtNBhPzB71t@Lu40hEYlKcBV`JJp}yA0zORw zw|B+pD_j3c&u(5;A9iL*e0T7(pl1(oJ2N2p-rzRoi1z`16nYBaFM!)Sg!J`$;P&jb z_*#C@k^X)HK5Yfw-=O>K13mzJIQT&D1HlJ@*MbiQUj%NynW(SN1Gi_*#jgk7OTef5 z!1p%jK9_*+1O5uQJ^QAwmw^v~d^bEdF%-N9_#3bAjD!PFLb~WJ2O}vr-3yFp#CL1mmHJG5p7#pn@ zv|dtgMQb%GMYLX`fS}bjT5PG6np#vMqVbN3@;-BBX7lWvXZDS0niiNPZ2HZ$Y` z`F%*9av*=h?7APxMC*{(B@J;^S|aT@NGqQAqv=B$wYClH~(^_=l@d`A1Osok;#DlJ7zCRwN(o=Wkg3 ztb9<^KLN=fL*?s{{Bb02Lh>h&yba0MA^FQl{zoM5LUJ}m5^t?OgLxsQ=XzBB03?4B z$up3A1CnPU`BO+f2g#pC@=7HC6Oz{>`7=nq2FagA^4}u)b4cEXCm{JhkbE_gZ%6VQko+wqe;djFh2-xc`3@w{JcPet`urQobCJ9Q$?K8)KS7TMH%y;zkh}oNzeDn7B;SYR zw;}ltNWKrr_ak}g;rtEbmA|FVBqd1ROY~hPzZA*)Ao(*$E`QsUmEVly{ZM)T5$sdG z{+5R1ha>p_Bwv8!1Ce|&lFQ#jVD)Z5a`_BiCVv6ROTa@4@UAL zBp-t0rARJ+GO9?ekP zZ{v_Wg5>fV2P=0jl8;B_??dumAo(AVd;*g1Me@^-JSD(bxIRH7FAUgX+i!VDJ`2ew zA$bdu=Og)pNIn_K2OZO0zx)kiCOHJj!>D{AlAnR(vyfa~17h{uf#g$B`TLRlEF}L3 z$s7Q~7VfthNM3;C^4VgnTs@M{M&+B3d=8RtL-KQxduF2FW)edFIG&{aN{-s6Q9UH>2_~B!3CXFGun%NWK@z zUqBTC6d2}$}dOqzaaT0B!3mjUqf z)7&Xl#g!$c^Q$LSlr!>)#nsWQ?1J*@nyTom^3qFd5-POS%F3D=jTJ|#D&~V?+1Znd z%O_S8RibgM{;G;Hx4OrQdc&Yi)xzTW(Q&h*RnFbTym(D@)TXo@##^M@HjR=A=)!36lBfxK zEaskCkpSi?LN;5ZqO?2~UQkeQG0Fp8bb{RD~b znPq#ZuwwothCmo-VM0Btyv!Ur#)i(AIk}*`7`n1q!;F<+m}QuwN`Y^eGe1 znb8yYXd6ChYEP`@dQY0#Bcmm8Pn728O*3HN(lnDML1bs!y>@DG^(CgAHj9CJqN@$; ziFdOZV^3V0%YZXVDwdWTC6`PF3zaTd5Y^x`P92qLI~C@J<<*tN?3`t}sdIBMIGGA` zM$I0D@od(Ww4svQ!6vmZQLl_v#fN*k7yP$7|n^%ZK2%pPMm z7R9@DDDjcYMT(B>Bpyx3t;OW@HOtqEGS<65^u=^<)bRP+m<|i^jL3_{<2J1uvNx z`Z#->fjpQa92lu2+wcO8>U%h@VKLM0k+W{y)yJdBtUhPRz>Tu!OmRtKL~-II4R} z;0_rpA@SkL9TTUKt>OyFhO-AdZJkxg)?KQ-14ncH;7m#`su5UC3uI-p{xBmNW2;A= zruT&v#S5tNoM6H>BGGzNmVd_i&50-hLMb)-n{zsLkJ#U|~ao0Hv9&}VYQ8~6vo3OI}6tQ=10qvlwyZO z1-nKeTWiczSkhjW57g|EM%KtIBCNX0SR-|g!(}|^H_jkfj7D}z%=wzjNY19h>&tQx0vp7F`8HmjyvjhgbZ(o3Rc z%Vk`}CusKRqSh&+S^H*X=EKNm`wx~sN5VNlY-FZB)P91hyY-eyi?1t}&gV-$;e~EV zPE+2s;su5k%kl{o>qef@aA|~HsnCrPI^3wd%F43k@rkH9wCG^D2{1lnI(oDgthvyb zU?>|;L}sxsce-RByNsiPETyf$rOEq%ro3y#5Hv;=%ks{Om6b=g)RDMOsTpI`FxWL2O^Op0T_-7F`UdI=Ys`m$;28B%GK? z>gGhMw0ot=8(guQyF8&%P4^g=S5^ua9_;BOR;rdfDXC{X^ zX`EBKtgQTK_57+*`&=d|mj|pT!clRT_Qan~v?tP>#M?M}!mOzxf!-cj?0a&O=LLS> zjxME+f)k`zP4(0YxI04Ll0(IueO^Qr*6EZqtq7eo8Cju8T2mHP*r8L_sJwY_a!@=! zW>4m{4x3q0o;7wZKM7PIS-ODbo+0XY)xyQF#42@#lc?-;uO{hcjS=^D!0kRB?$=1X ztAL7@{|O$aJLN_9+JZOJpB{-N&s&cjsbtj*;CAjW- zh{x)ayN0aZ*+p1)mMcoh6;3SW&@ujTQneCGIVy1ug!0xjxFy0v>Fg{xNhw}1zZh=* zvab`1`}pij5b_edhkCL`$;`l(*s9rmfKHS=>)@Aq!t>bz+$gy81B=*IaJh=zN5w?r zR?_+O$qP}eDq+ntD>uGQ3fCVhi(~UkqE*@Y zHUCJGwNdlBMDzSul|(gETiJcX*hVF6^p$9?szhYqd9lo`4l}ddYD>83nsQ9{H7t3Z z$HbZ>Xd^q4)Z=b}^OBm82}$5)HYBOY-H7-#K6(F(kqvsZnF;!O+%2Fkp&A*Hv;s3b zl2+wv$|w)lqfIO`s?W$!qnh3AcE6TyWVS(dW>y}qtfyB{J;;Qj}DAoh~kliWtp zU6GNY-gI*{F)Q(QmB^CFnFb?P610&qN$PR8K;8f(Z`?7pAsODxiexo;x1)QoHERpW zPT_lI2UU}IJLHXBJ#7yP-!nU?n%wQcx5b&-pu?K!udBsfcjZPwTYYvfAiEpTYtqVc zt;Eb4*XrEOO1yK@v{CeEGeh+CxLZKpifS8TpSgK%8!z>kS>>fhL;Di)$B(d2Q_qjE zPgA3-efoQ(4TI5JMMf5StJ2lPEb2CLL+f1YFfz=wHg}uwUHPWA=&)us=xTA*9eoeM zP;(8^NN-IYu3Bd$e(%Ci^CV~^?UU5wZb8CVPD~BZg3a{TR^w6qggj?3^xM1?xCiP} z)wrvVzno<1d>z(Id0j2;x~pHxGSxpB-pqz%HM!g2_-2}^AxSGRvm|L%?xsjbbT6S9 zo?O|Ny1MV?$DS}VB$+1eb`alF#Hx5$i^y`R!ps_%%G?d&?FwHQrP72KbCOnIW=ztm z+)Z(QebuySlGk8nO!B(it%*CMr(Gs#1!lG+t;*dL<@?O0t&#+8W=4{V+>J>1Hn*t> zTCkY`+G^a@=U=*)Ut>4bUyn93Kwpnn3wpZB$eAg0Pb{G7@oIs5d_m9JfI|1g0;(Rb z7W8ze;B7#mdtw1qk5>z*6-h6H9k+l&_rwCK9uF2IJRSt5QSkk@$P&Y~#l&Zf5S19( zGr;_>*ZOOJ-!vU9iA@{*32UNH6sm z+2~0#@Ajc5_t^HaM+O-ir>&%CmT9YVH_P!jBXgr%sxULjr7~B8^bda$(P+|M-YYXQ z(tEY8=4O#k(TbaD5}V#?GBVVocJ5XtB!!6m46+{C=%pSr3%%6nZlCkXZE^DqvWt5y zX12N4=WbbofA|yaY|{+Pa;d`1CYQ<#4dM^@`%wlttN0NHIV*EFXpH)hLzA0soR3J1 zqs`3FYvFEz^U;oRCA>_4lfcbvNK%oj5xVCHm{{Ukhmkq1wYl1)KK<6j7A@Au25l|w zx;q~BYoxs%ZKl7z9(N0zk2sDjF_{n~!<$)=tR`1Gv=4bUvc^L#MmBk<&(*T5TLQZr|JzJ=)9)eLWs5K)+pJdQOCY_W)xJwI?)) zeF%o`tPG+>C`MTcR&zTf`)b=zmr~Q>Rh;8`q8-i1vZYZ!>__;0Ngn z@0lmNC-s{7q9+X4A0oUWOMX;zy1|{Hn8|)9hyO-T@-Mb$IZ7&L`;Kod!-$;-Pn^l0`dPubQ9Pg-<$u)un1?s!@6ZjM8okxzYLHu>{*@kpuoN4e#Z#E*g}pQ%67WRXbOXv6C!5Z*mM&Ahwm-1W*lc#uS$+}I#X~Lf2 zIWrf3{P2`$#o}nJYPr{^K{!!F$Iv~$!3m}{rh8Ntd}Fj4o}Lxe>TH0cv^Icu>n(>; zDzV6i$k?aNGe*sgTs&j6!RcKxxK@8tJrV|CZx17~pT+8uxr}RademDLM$dlKdhP!V z7o?>4bI<+<7`t6q&7LJ+Q#o?(l)|$n<`vGJTU|46Zg{SYRYzXt(>@!|ve?{WcCH6A z2zl-~bB6uws9g4Yj_?ae(JFW_r(N29LNpvfQFx&5%rH?*sUvGlKK$C<{8+rIaE$!` zlfE_`z_nic*OpA`2Z@)(KW4v-KqfJ@pjywENyRmb zN@DRRyCzj9iz=fvYE6woMj!gB|HH(xnhYATV-V(wIw{Y)TK5@S+zFx z7YvfuN0nA<^ftRm&f~ofmEG%a6C~$1sl}l|;*-{0h@6F$`Vt-?Nv5lK2?dE4wUTRr z*2!2wwVt2g7gdt;|3n0;-j2C$axKW>YMqJ83CSyTmQ`x&{^4N#Ts27<_G=hrZ0^k` zF5QDBF|vsw+QCn$OZ`0rdgAK>qK60-M5J|9e-+|PlCB6xB6LGgsm=}KJ#D$wWRif? zy5a$${+fd(T6t*1vxvSrB~7RW)mHk6dbLW^ZJx7#>B}bV+~-NB!7AXG`E#pd zRRv25va(_&QMQK99uzB2S*FYuzkB6SL#(M6j9JWnV@a0(X-j8~D#t$$7SHhWtKm1; z)wvCC#r$*Nw0vRrdA&L%PH?maLd;XWz^M7M2b?ZX(#m!J)Pkc^H~=$Zx$}w_%(Z`g zD7m-hE?Ty1F8s)6bwxQW2FI4qT>?K*G{0i;VtAsnHL|=S79BZd+N_gdiDv#K;{BrX znvs>_mqA74(UQ3ftKcVY4EPozufKMavM;PG!1pa3R z_@M;;NCSL;z#nCR&mizWH^65S_@fQ*IRrjnfDaP*V+`;i0zb?EA0hC^8sO&;_;dq& z5rH3WfG;8N#~I)&3H!vJ4P;7>5XuO{#(8sM7={7DA*H3WWy0ltO6pKO3% zOW;Qu;9Cj&DF*lr1U}OM-$vlG4DeeCe6|6;oxqPWz;7q;qYdyK1b&PGeiwlsYk=<} z@Z${ddkK7w0p5bLY{TP!t^uB%YpD3~26#4CRq?+tz_YoIia*r=&&Em>KfwUca;=I# z%>d8(s)|3|0MFW5#Rm=WtgMR9Gr)%k{6qtMguqWSz|SG@`3CqR0$*T&FCp-g4e*r& zeu@Ep8G&bQBG+ByUbp^IOW?x>_|*jd3Kfj`p#zlOjU8sJ+9{8R({S^_`K0N+aB z&oaPoAn>eD$#$1}UHi8Y__Gc0TM7Jh1AIGypJ9OCPT*%6;5!KXECc*50zcaT-$mfh zF~IL7@N*3CR&QtiKi2@CM&Qpg!21dO`3Cr*1pWd8d_drj-x{B z0zVYtKQzG46!<|1e~E$qMTGvl4ft0O_>TvpBUf=2?cTcu`yBVE%!S8hl&C?{@6Kz#L2x5KUx&e`>&AMDX8b zz+Xw=?=isF68L)!@XZANJ_CFUf&ZNWzLmhUIfW3%_qz6PBk&Iz;M)oOLk9Q`fyeRt znL+&QBk-Ra;D@I2z)wf<|AhhmRDs9+=T8Rq7ZUtm8t_*NJoevL2Keg;{MQEfwS@g_ zO+hqEe6NeY4Fvuh1N>G3|E&RjJ7NE)2JQC+foF3vulD=<^1#FG_lW_11cCq903Rao zdkpXk2>eF|_*w%0r2+m90{?{peglF3+yK9gz<*;g+0sdhEKfnOLmB9Bm!0#mRY)!{& z`&$E?@zc)$epk1)Uw9q5d|!wvAG2|Qa<^xFOr0)LnRzKp;hYJgu&;14mt-$&p-G?;(1 z5%>=b@NX0N_YLrS3H*Bo_#tB94$q%<8sIYt{C^Gbg#`Xx1AGaA|BnH_p1`wfB3|Ra zg}}dKfPaR-|Jwk+oxl$>i2pAL{ILdj{{hbYv%^6D5d{8U2KbP`wJ)i!@;4s}1nA1b>YIel@|r z!~lO2!N1G^e+R+8+yK9p;J?fO-%9ZR(g6Pq!OyN~dd(l32>#0r@a+Wu6$be21pk!= z_?-m*0|x!)BLd%Ifd7KPUuvNLJ_289fbZku`49L1`wjFTMBwi>zz-qtwFdehDeyS| ztTe!95d2pe;4=ySlMV2v68!ZB_t6N@Lz3!pF{9pV}M^k@UJ$&ml6C82KZ$J z|Fs7AT7tjP0Dm39f1LsTCW61o0N+CJUvGe4OYr~70KbmlZ#KX`L-5~VfZs~+-)Mku zC-{GDfPb6dzsUfX}0;Bo%H-2gw7;Qx&Q zK0xr_VSpb&@ZV{GA5HMzWq=P7{C6ARLj-?|0e&XIe~$tF0)qcu1AGa=f4>2~lHh;9 z0KbCZ|D6H8p5R|=fNv)FA2h(PA^0CMz~4vkKWu=1nBf0|0e%C)|A+y;jo^RO0RJk1 zFE^M!Zzu2%8{l^m_^S-?T?GDW1N=S${~H5*ns}%N&i}0j_#p&-y#YQz;FlQSM-cdD z4e&Vxeu6>#f&d{#pVbGQeLa@Ob|7mVy2^ z5&UBe_*)44XaoGi1b&nOeglEeGQe*l@Yx3Vb^@PifPb677ZL6EGgxMUWo1j;?#35g z;Quaxj|;>BD~q>d;0=?3Y6+WH{PBQdG1gQ32*BF068ay6g>Wp=dR%%Y98q|` z0E*kV;^kF*l?ERWcySx57T>JFXL`hM)Zl{xe?**_AE^3&qrn$>Gfp_!&FE#jPkNC$l_!f`)@6g~|1>UXw`$6176;@v*e%n0a*>`#=e7i?{ zjRxQ05zoHUK=F5Z#Q#%+w+`kZ>M z8hndK{3{xKt4DkvxX+EUzs)25G!4GpBYv3%-{BGemFA&NC_gW{>;@e}X74cPc;2a}QQ=lA^sruInJfz2jP1XNIC`ajEDfGwwzlPBNObvgF;Gden?)2Ye4S$Q^ zUncOZ{Tm4Wd4gYU|2=|VwO94uwF0mD&pMnF!|7$hrq;I#@Ra|C2AuupIzs=AfM!@58vTO;KV8AA`tQ`}pDFZTEAY(!zasQc0UoA{>i-)BKl2UVq~20? zqQJv4V#3xU@W&-co$)gq%Gv%`%54|=Z?* zF>ILsCW8N$f?xIDM}i+t?-MrFe~${hBYwq&yWt6Fr~e+(=$|9>4+%VL|62+D-_Ynk zT=2WKe_traY*O{l6nHoPr$9No{T2V$68^uP&_7S`tNt$({BHhl5_nbrB7t}F|7s{l z>EBBD|4u^xt%6_Gf0f{O^ZyXIfKU1VT7kb_i66zymJjfh{(FV~%TWBZ5c-!1epUaW z?8XAv-2DHlM*mEKcgufUpd6)tCHt}{Y&ib!CG_tS{Hp#}34XWv$8ZR6%KyzC^$!4^ z(tiV?{{w{nVZpEJ|E@>8+(=FjCC{Vn!oTi9TDvNx809whW%FZo3| zxnq7|TLIt2|Ev6uN&a{VelS$<Yp zSM47TcsqWSa?1$*M+yE#l3z&-L6Ea8%y;qsD*rsmui)1T{$_z>?a%JDko`%<#g&3z zjo${r@0LH-3cQ-XTLgY?TyuV)>VGekqxxS?I*;EXr2jfX|5pXSs{ek$@1}ps&*}W( z2RYl^^xvn^e+{AklZ5`m1;46)h2VG7|2&QUwE|zx&4~Y3{XYxJQU2d6^j|BGEPkFQ z^j{(PRsBB}{GuDh`Jsx0?NNbOJynwWoS^lur?<7d0TGyR_>^nYEW|80W* z7=>TezYmmSGFAUJfxlY;sQ%xt(SO--T>l(_XZp9nvD$ybf?xIj++(=naCs+TQ`E8U z*63d;@NCY6H&y@J0Z+wG>+xLwh`=-bH^Q;1{|g%Z4>*>y!sYFRO;N}CLZg2`;91VV zo2vgO8vU&kxc((b|Cb2;4-N44SN*>&owK_6KP>QS{B#NYD_D6rR`t&ZJmvqA6S@Al z|GrG<9~1nl{!fdEH!LqDY>GRrR)JUbZx?ts{eKU5N`L=JPW@jc^#7aSSM|SLocOxw z-|rZ@|F#OeoBq83PwBsb(EqQ5{yBnQ)&H{Nx!c|Jzf7Zlv%tIQU!&2#XoS=MZxH%F zs?qsnNeu;NA4^(&(SYzHAK}j{i3a{R1$;2C-xPW&8;?+;a2(1p=?ee?;Kj z^gjpiRQ$9O`m^6;O5v()+tW?|4rz>T=1*?_btKi7C$d&^zRb*--`B@J2n45qtSn@ z(7#Op+4%b(LjQki^uJ*Q2daEfMZ(rAo%VmLz(1Ez+BtrGuhGARec1vwJb&9s=zpx> zSN&gpGADNP|16FE%>wVHe+2M-fJ(jo6J%djfeq{b0ipk5jsDX{+HlwPn_D#c7YY1J zyqfrbwLNdp=s%QwSq8Q)fn@Q+et$#FKTm4(KkgI`bUT0P)aV}+c=nqqcvJP?snI`; zec1>$*)B|f_WK#C{sUm10%Ax0zb(s#yZV2E27kXte1*WP<42pov)_Edn`-~XfCtm! zcFM9L_GK^FDg~a||0!XAvqt|TM)R87=C99c@W%^0(+zLT*LeFH(zV??{^x>WwubJ%4{s9@Z{Wp2Uvw1G_pK5=rz`L%$0G_hHax%An zt?(Obe+&9@ns_hmUn%(2`2G15UeIm*ED~szeA({ z%Yy$HftNexYrGAGc{b($E`gtc3&XM6{|*K`rT=!J|1yDR{%1Z)6Yr(}vjxBE|4AWU z&~5y?P@{iD;8zPixl{F@qtQRYzHAKJS^;GG_b2pUs?mSD;D_6z5;oQU_elK{O2NEA z;D;%4RsTDs{z|#MLVxLJrvD&9|8@<3Aj~Ti%fRv4RsKI~`2At-Kg@q1!9NtvQ|$PQ zGw_3;;6Fx@tNaH8-i|+|T!!G!6mn+2pWvS+`QbCXRSNzaun>+_{;=d%@N)z|j-P`F z{yPM}8viM0aALRk|4!7g$YQNh5o{{=16|@SxTl+sL^;hsE)41Ze z{f{8@?+533OeeMd^UmV>yS4v(ffvI(2f_bo0)LcZu%f1Q5#TBR`_JO~v)_zk8}t8B zg#N$R@K;7S?p$R6Ronjo4gZ?6Ie)uIK#c!rg8x0iuiEu;8Rs9b*sr{`GT}Ux$yERO z#l%CM|Ec<)1bE7SB^6wMod1Rq`qxN)#ejg|KSohZ<*$_d3cgnGw{bP>_Dd)D*?Bs% z-w}T??!Tpc7yqyN?@57I?;qPB@PRmzA4t61r;ZfEzEQ_}2@5)&DJ*d-MNe8h)#m^JD*yCip+o z*gtfoH~;U^@CVt$QengKHnd))Tl`mR z_>0)XUSY%jA5ZZAQDgtIRh-`~{#!NtE$m^bur>2)?EHT!!T*JZzgh6R`Tr9Qei@QDx&3bb|5n2vU=M4B4f}sG!G9V|9H{)C zb3NyG^M5YjsrD~gRg#`alxWS+D|C$>)znlLL20Z2ew!57EpGNSPX!u(NznlN(YxpB~JNY97|BHfO z^?&WJx&3bbe^$faA^5TXrxX0X(X{{f-r~*w0{~C?KXAX({+R^-MH+tpt(@P@|L1D> zTM7Qz1pkwQU-f^7;CJ)?;~M@Tdsr-N*#C0~{vR~<&-o3v-!1;X(eT&)-syjKEh>#y z8^8Zx3S8%)`d_8sck};5z*Ft-f7r=?0l|N};8*=0yn`$H46jCL?Ogx5S;OBV_*>BV z*F^;X-!=B{yW5-pU)S&lA9vbcMDPz8OZ$IF3+LY!x11j^U*pXOc*_6n1phpO{{q3U z`oF7%v$*;H91VZb6Wo66{{;m9?Hc}#sAG3e(Ncx{}&ScZ)x~934S;Kzp3GG zCiqJT{`7IY{Z;?B-0#i*M+2T}|G?8u|6fe-&lCLW{PThbz4`w_4S(D7PXCt?{P$@1 zV}jq!|95KmBVyqR&wttTm(~3Dk>FSTA9=`||3A?1cL;tQ|Lj`6%70=G-TwzY;?4iV z0Z+Am?MqJoR}uUdYxvUzznlM~8h-y4Cx49KUnlrg|67lG^Z%n7{uaTH{m-7?tor|B zjs4F&?#=(58vfvGPWzV;{3qtp?Y~X%yZL`O;Hma+C-^TT_$vj!>i^a!xc!H)%F*UW z$L#PD4S&&Jxc%7wD+vB4H1=PD_HmCouAo%xc_&Wr@oBu!8@HZ3u zwFLi^@pS%g+rSNX8-FJPo@)QVn@;~e8{_ha{9RknR|Jk)HHUFF?_*MU} z-Q>;xXK47_{_C{=T7v&p4S$>9-Kp6 z5d7Hx*Ax7woJ!~4y{~%n|A~O7+Q021r~S79~S(o|J&a1=KtSm_*(=&_W$h!|Hm5pSNz?Z|2sAO!Ec@R-$C$a!+nO- z`om3v-_8Fg1DL9k(C*zlGp`T4Vo+e|hu&A2s|| z3iC?h`u{xy|5qCRe8KPL|4%ji%>@5_1ple0)8lX8ZEn9?{uu{&s{I4Kxc%7w4-ot@ z!LN?LZ@`zfbVH`F|1MDSp4t$=^!w zuM_;L|7+jl*0{z0qZ4q1izdA@73@}j&<_CNbr9w_|^Dt{@h#qcWU@M1V4`dO$7gl zNp$}&{MwuUj|V)}{vppXlV@O7O22{Hp(hd%gMpF%5r< z;K%-dh2Z~EWB7wDc#_^JP{C$Jq z->>1{B>3I@|E-3@P`ZN{NIw2VjJn^|9rqROV#!dG z`Q7F}t2F#=6F5Ki|8|1^H4T4E@VohctA;;vnv?%6g8zugwErW0z4`wTz*GM35d7Hx zZxj6I3Vzl9g9do>|4a>kZNAg~e-r$-YxvUzznlMW*6{laoctXG|9gU8%|F&aZ~pJl z@V5wl?EiNO{^9UFJI18?|Cs~5`9A=7s{Mm!I_=*{@GsKvZxj4({-3AeZzuTQC-|Qb z{Hp(3ect^4h=#wYklT;_zl-4iOk;o9!QTA8N5gMTcl!TBf`3$qZvT40@8HP0M+?)ST13cCK9fBXn{}%-R6@p*QKd&C?&Hu|a{IzqP_J2k2 z|4GBYQ}Da_f4zp^U*zQ9OYrxCF9=hd1Hr#Z@T>l>9OfHIt5IB)*{PQ!04cKW{;!GD^DKVR^>`9Bx%RQop*{Cx=is|CO6|G@Fy{J&De zA1HVFzc0c6qQ?HWPxR*hXEpq7)lUDX5&Tvm-Tq$)emDPrr{Rypocsd_{*d5T{oj6) zH~&upJk|akf*;5KAcDVMWB+xhc=P|28vfeLoc13`@V}_xzfbVH`TtoBzyFs`em}uK zU@D#eYcsw1KNawl|62q<_WwZy|75|h=KoVid-H#uhCjH{Y5x#{zh1*XQ}Da_|4I#i zJHdY_!T+k@SK~i(47dM9Zic-U!TzcD|7_9l7hT1HMSVGx-TyO`;P*|_^#5FM{vQB% z#-y%)w5{g+c>UoBf`6ule~|d%`bS*-_Yc>2E1V8padnC2W|E9+NXC`^`f4hdi z@)oE4#}WKTMQHzT6Z~%e9}0NN|JJQe{tSY@Lh!5pZ_VfSKj-5Ai#7bsf*y6|DS32w-fv$3I54v)8lVZ*qi_J08h1l$z9xj z?0@!1Of~+m5&Y`-8<^_N|5s`F1NS-opH1+;qT$aG{BHi=tl@7Z_(v1`hfSyb@1Mr) zZwCzC{P+zV9|U;H|H1p6{vS*5&lCKr|2xk1=Kl*d{CgjA`ag%@e^kT2SMa;}{~-fby0#}oX0XVCs{pU&+Uw=u`PuKGU(@Ra|DKJ4`WsRaKt!LR!N;o08&AJ*`>O;D1%{tNyRNfZOkuf3|4&w+epjfA&Z` zHUIl((f$t>dGr53z*GLOecow5d!(7lKU>2;NASD(|7;Dvzs<>CNbo-(_*MUB7IXXW z0Sw;M{PSB4e~aM9{+~whf1t5{+X8R?e^wAVB>3I@KOFE>`|l$7 zrxW~31;6V5wx~D%S84c{ZQ=G~|IZ}&H)!l%Q0mS9PiXivUvv6@Ho^a$hJS_Nck};O z8vZtde-6PPI)@&ABNub~-JU-%3Gh_=NB+X?52Ewm^9cTW!LN?LTNiut|CJj4=D#`p ze*wY&qK3ai@NdGMAC7sg-NI)z{DEyw{)-6y0dr{ox0ZAJ=K={0j*FzY2ae z|8xodD_s2liiSVqUtCk{|Ahqq;B)ExTe-xW{|5n{F{$le+rjypg{#>5QwhO8OT)if z@NeyQwSB~E?G{Ef{Qmzq`7b8;?-l&2|07Ge{cic^E)9Q+;K%u=jNsp)v45+0aQx72 zQ%U=`Yxq0fciLZ0@E?92-Tobdf0GOU5Wq7gwf!qUaPn6Y{Bs4r>i^bXdh`Ez8h&dR z=g0o9BKUu!u|I?T*g0%&{=Y@TAKc@#KSuEXQ^Ow={F`hoy8rQ7yWelq@V68EESA;z z?=k1o`QKm5?XLw4-qiemB;c7&YWo*`%r(XSUq>qlAH~&AU;Scn4+J7Cv|FwocQ}Da_|1%AL zE5Uy~!9V6AI{#ZYa{JxpKbe51+CP}a?Z^42ncy!G{A&JRcC$DC&)4wR9^mx?L=KuRO z{F#Sv`?3G;AozD`>|b%0H~+t*;cq#@>HoV3{y-7k{x=DJH~;?(@KpO}{>;hWLhvsX z{Hp(p#19Xj0~oxi@m~yhioZ?pd%XGoE)DNcJdOW< z&+TV(M!c#1|6apiauT;6=buLi{)vKL^?&-KoZrp=697-O|MpC$|62+EdJX@ng5NFw zT&dwN$#U{PPVl!2el`F2TeE94gVU!zX=B)9INqPpyBTz_%{&zHwu2$|3&M#{ch`@O&b2n9Bx0Je?Cp{zbg3E z`0seqoBy|H_**A9{r?QXpSFN*|Gk3WE&h80p0$a({t`UR$^RU|9~S)CN;|i0;Pxx& z-ySPjQU0lAEfILN{n`cI51e>Y^Vg*s{o959t9x-Y8$Vtk^uJl~JKFD0T*H}|9FC>l zQoLECfAASz624xLu&MgDY4o3y$Nirv&`keLg#H7gbo*Z`_~m>>DxvB>PvBMmw+Q^V z2S_B}tNLFEcu>s|KdXiQIRel0XO9$>`p9u%okssVUg4U`a#9P%g||mF{B6@x?PATM zFynuj;7?mf`){4#PgfkK^7jTjld1hDa+Z^ytp%y}FBJT$|2zK7i8}^jYn}H`7i;)C z1b@50GyB;iO;!G9H1@as!<+w~)bO{S@3jA~1pkmlwEwqDei#4y08jZpc!87ub%KA1 z;8*?MwVe~Y_1{Z1{Oy7t_usz}{10mEAOBCzFWXB-f#MEpk4FE9z>8%d33uFoze}UP zbs_g(njmEH^LIl3fhBbN{pT$X%!@Pg16BVq0KfL5GWI?f4dG=`Z?68x%NCGT?kM=AWO|1OvMD;2Z| z{O=Tis{b;nzk)BC&-Kp{c&7hOLjT`L{T2L_og6sPMgLbc`Zo*w!OXd6Q}y4h(SOYX zu74)z%r>U~2Za6~YxKW&7uP?;;qm{9JFTBz%;QJRAG-x!jbDkE`xyeS#@}(ByhMGR znI9-_wx$7|xhSZV+q%dZf4d3$S8MoN1^>MYq3ZuS4gZD`&L0r%$NbM8DXYf+qk>&pDg&*^RJ38z3G3R2LGhM!`BNF zHePGD=thnG{;zn+3tjAQ(%8RdiHIL$KYOID+W*#T^k4if=XX2*d|!iqLEz8qHq|~- z?LTHQ-TwaXc*!Og`;P=X)&3cmar@hl{rd^~CklSG{qNlG&Hf4v{!@W>v;TJ*`-2wm z5YM^Te~-rgU6*tF@%*hf)TOq6S~;D+e(1yb$Gf!OWdg5`Upc89f2D#~y17*Yc)R_S za{gMbKc0W|CG>wv!`~+O-;f52`qligPQxEs$@%y8<3N@_*duXebuzDiDEL*oZak1n z)+u(W@js$M#J^H*vXA3GRpctq@qnlN7i{4A){6RlwdT~Ia0;>N?H2huH za{gVyVa$IA5d1BIU$v{(&$#3-iS&;3ubonVrGj>W7mqQE*P`nGj?`blZ~rydzlHDY z@xxE(e@rFafBXSnp^Ou$0928%9SL|Q3o87}ZsWwwqBQg0K?Hx1hCf5_Z%Sa}Tv&9z zhCl6gC;t$F|3Sg;Sicbb*DH4UF*zLHr{P~C`1gtq!|Z2|9M2ZCSC-&Y*ViTf*j zYX2L1DLwu)3;cPC!pd7K3-F+pqy3ui;QnhH#1&xrA5Q3hi{MxF|7aA~ABNY2jd9_v zR}~$9b4Gi^FBf<G7JOIg zui*Cz{WC>DrayZmvBXRL`&ZNL9})aNlSE>#>N7^*RsAakUh>FlB)@#033yP;5&szv z@%9gif=vJ6g#N`E{hK}N-=xvM)uaBaHTqW)`ezXOKc&&X-J|~RY4q>%sDFn>{|$ux zClUG&j?wYsAIk$$ZGSa>#tXa}KN$kAmRI9v4B$a6NBmg7=kbH%e1^64ZNxEH~dJve<>aR(*FlwayVA~KT_b;_FL;Q{!airvnirwyTY4qO8Az^m~;$D{rQfCsf4 z@n1{mKbg?KN~3?J;6L0&|2s7LH+$6oR*n8!3H`%_{x50tZ}q5umq!0~kNWS{=NDz|A^o}R60uRRe%0dqkoA<{kLiK-$3X;i_qV? zjEeWz*F(Fi_o7v5?aQejQ?pG{aZciU!&1~tH6hp_LKZlT&dB2 z=p(%ULie^ecK&rfq5mBk{r$P##;?s9{WAn!jW<>QHjVzxLVw(UFCz5+SfhVX@Q;*^ z68nJi{^Vcs_*3JjQe(fWe+J+|EywuPCiIu>$NXPR=wBxI)%AxK!7uHXYODJHL8E`W zNB!4o^iO-#ng16M`hTp^zf17D<^Mxh(Ed*wPsg9?|G|K#{2w9oXODE2c-enX6a1?G z1A<>H-%0n!@ltTUM*mEY`p?$rzlPBNVnY9A8vP@J-);Q5L!*C*z`OO|TQ&N32>oUJ zviM(2=-;N%zgF<8*U!}WKk{-qe%d|ie;D9FEl22wZ|Ji zu}1$Ep??VJzl6~Lh%4y%L#5znYs+|3`Evzc&HuF?^&bs*P|FcNy9oW46Z&7M;a?;8 z16X-DR`s8w;m>@`nZMb+fD$j;nsNuIx z2cvdE9CLl?4C4HT(gO{QuPO*Ao2fk=9aw>HmY_0y(=TrN&>-BmaSb zhiV=1x0T?pBlst4_=`O9=V|!;PdNR*ir`!0!5G;c;;I021 z3wWs35r1iablT7E<&pZ!_>XD$=Lmi|{sM))NxXbtQA_hj1phKoklD{3=`Hb+|F?jr z`rm4g{C8;hw-Wp}5d0f8{2K&+hR|Q`r2g{#bAX3x9sUol=l+-eWA^`=;Qt8ll>HqZ z+y4U%f2H6Lfo^PL{5KQ)Ggi|4)@eNc*fTfqrrJLZ@KCM8{tbe^MBKl^_}L@1C0@4w zl^XuldEWRh)9?pg;QmiT{I?PO4+?&D{^&2@{3+OYI9A^ua22;nag#Mv;HAB?8uk4I z4L%_7K?xN5fb#wl7re@+zP|_X%%+2sdL_Tg=NIMV{*MCh7(YGQ-wJptelq^d+fT*` zi=P&v{dQ^iLmv76tKkn4{Pz(2N7vE)C*qO+2*6YJ&ms8PBf(|+Nxz(<;h*D?f4YXh zlHh-U;9sTTFY?G=tKnZw@UJEK*K7DoJn}!L;cp@M*(1qS|NmFRU+Izm-x~f61V4Ku zxXSOV=kX`U8QG1O3I5}xK1Zxi@XmMqElD*hLM?*ktN6N_2x!he3@0G2=4Bh4jV_8(@C%FU`uTgs(#&gB)a z18fS2R6M)Ctv4@{@V|)tSTStH(-Opv@q^vpMBzI=<@xXI`sDaivc`ss-G>2w z%>R!aJ=*>xYwVaY*|w-?z?B7slY6D4#OYJ4(;WIS_Q;9d9tzs(1g%R`DpQ#6egQAG zKNVgR;B^|jPKQ?zUU~3hpG|^SKD-LxRS2)C@M3OZpG}6>6nKT;6^7Rt@M3FD?6b4r z6@k~;@R|cJ))eQ#i+y%Jye@#(h2s51u%8RBB6ux;R}@|g;l;`p!)qSA=EG|dyh`8& zUpulttAzcf@PgaG?DxxH50_NfWfA*5EU#LyL}tMUu_-VyKLhy4fe+9lq1!TwWt zeJ0+21N(2`^__UX5BA@~>j&|EKkS*}tg)CcdcnWm;ahxyq1+bqij;Dxy2=-xd ze1_Pc3Hw5EJXP%3&s&@&jw51!HteU1;~B7@DUN5sezrJ12ljKs@wu=+PaK~Q`wPVJ zg|NR!9M6S)kvJ|E`$e!Xf!F80pMM)_oShbG*c)m%tZRR-jo>7-vCj(|r=*3N?7kdo z=r?s$TkM3|D+gPlEmP81$=J_AbswdL8?C~IE&C&Bp}I|J8yEVH=AC}y{{1Ow?54eJ zzKUk^@w#S(8or16LXB6Zg;wp44XM4H)mgyn>>FzA$0}?1j1 zc){GoHL>WjxeKDzv8syY*6`|#69Nm1OUt4QMg|J1sw%1i^D7oa#|MTl5R+$yhfU?L z+u{#3OzC2wX@Ozsp~ea9Ft4F4t1Z-I-}w@1I)sUy18>cYlFeo$=c zs-4VRNU|`Zr<)p~jP$l(qE0P$R??|2j%m z+ci8Df&7@lh7OrB!VM$RnK|I$jSELg|304qRfsONd5b*+gti3J?25MpZQsIsX1-M$ z3iO8ha6L@haKk3nc=39q-@&?r1`mX64WC>-?2#1fo)kD@2pKIbw?XEFv@)P;f12-R zW>r6y8o|G_AiY2@vwe_g_k^zf1uTs12smID(`=#dlQ!Sr0)MDcBw_9t=x5RyEcR&vao5pmb z0%wlK#Qam zHhf-~``J?e?jd&m3e{~)3FW>O>zkjGKD6f3thVP_Hit}RPoL}z?yEl?@{D^H_thW9 z%88j@sG%%97|#8-ua2EYgc|L>1^ZxHxZ#~?O(Qa=p71pchDTd9W#PL0`+fD{{?Ol= zrW_Nh+k3k2>Miijw|-Wj?%kBog#B>lu;lP?!%N|n?^|8__lH-$)Zw$N`Zs*_heEkL zdlm<{ps)VtFirFw9kiyVd{vm+wRCT|?&Cn`r)f-B3wl_glgj(o0h=zD?dHLS|t+7eI?|Z_)@4bBd@V9gGB1~rucrvzK9F03Al`KW5Lj= zjWvEy+*i*QF$;6Q^wn(v&89Y8k+yp)Ou% zH9MxlRIV`hdtY4>v#H^N^gy`b4d*YN&+dah!P@&Im@w7t-RrAA5p)PO zMKVHl-$MVWhj$Re1%bMbl+em=Sr74DeGSA!sNwa{%KxxlQrPsE-AmehtJn|V@cBw% z!`HU0p@tWrHJ~N_8p_=qI}F+fT7;c9+U--fB@M(iABG_s!%gSFn=fNW@_f+?~}YYB?eiKJnGF)d6U{lyKv6*?5KNIim64NHkuaY`nq- z`^+!gkQa|hLA>-D?hiXILyb%~$dJ%=VZH`Rf~JKcD#BX|>}e(J?P(_L(^x#Q@&JNj z;fAT;$XWivluzMsXlFXa--aL*$+IW;&|r|5>L5zkc}+@NDEGysdqZ`*0-?H&y^z#8 zOW-5O3D6_LC;Zh;3NNvSgroq`9BM2{D@=hCY)BZLfBSC#ey;b_Rp5>%S>y><_zFQ| z4s*#;JVG6UKm;MKQF7st0K&a1NQ zFbBPq{#+^g^PB~tllVyITQ!Yk%DPP@=ffl~@4~!`^5&xRgAnK$bOepv<1g)@o}It9 z-B8aO8~oPhtM3Qe%De&oPRJX=-&?o`ci2#{%dp>1Z7lasJ*hm+w~9UUC>{cp5YRyw zzNe<`K1{|fOa=zq{q+UthHcOdU#j^~0A%vd#*57`pV+-*Ib;jePr4!#uewG5Gxo_3T zz5DlfPKSToe^5P_fBrSd$H(P%5^MYhfa1&z^$$1!Fr#Pr7<% z4m1XH52(GX^I{kX?SAw-&@iDNq0mU|N0+mqyr~9eIq&c7Ok;B`=GS*w!zQ#3%PHNt zqUJc3C*=8ZcfPP!Y zDkaUbwxx`|{xIvY-hJTzQ@#6rc&PQy-o4@fr}qCfeU69YH&c&>{~P*3UTf<+91a`$ zO<-d7(-u4W4ZG?v>%O!*Qb6+cfPDCW^&nPF-GMOjyyi<~1%1Q50+2rp$G>6^e^`GI zqquj-Veo(R5I<1AGlVJd=%GXG1=c>t9|4UP-~M->FNyW8+2V|yo%q1Q5}f!nd>*3K zl$N`njl^cjGZA|sXw|=JRk{Jv}c1}v}~;QJx#E8cA~JKth+6|oNU zE)0?v@9Jy@k-g3cet!~Z|4TaT=(wY5F_|Kys<%c zKljP_j?XWk{8BKEmA4hT7~Y8TKLle5$ixZ5ZuQ}?@G=9wg|jB*2+R6o%CNr-wEmF- zW8ubLsoxE>{@g42kAc>6y+^|_d%U0Zbf2HY;dUrs?diixeA#E%mjkW)QbDpUbq)yH z`W_4azwdi6{Qp02Sud0|It*(v~R~0Xg#-df@$HQT?JSOBB zCyWn-%a>GK5?v5j2p21h1LZYkWdRixsF-(g6dq6UJUfF7H@wG(nkIW)0-_yUB_u%0 z3a~RjSfp;qPfug3Ix_w8%T^(Y&Xy^OOW9ONX+WyEj&t4YTaJjXz;I z5z-u6(}4vLHcl~wy>j{BXqi6!$JvvPK}V#{w2t#%Xq{yz zlWsbGJp5-C&A0QL|?ri8UhIu{I*xMeO#j+`+BVYYfpl;(VtM1zr-}QUom`bO< z`bJ0t?%Mh4=R-L=8BSgGm9L&XZnb;BZG!+*v*Id{ky)_}K3Lcsj{%euSt5;}AFu?U zFt53t4IZB7HTJxyaTbhk-?9~?*S`tpzUI5?@61?j9r5wa9waJk6Xig+2iP40-3%x~ z4s_$;1Ca+stZRomXt~Y@p>=vTp4%-_khKRIC6?LUAnb`{c8<%7XVMrfx8{SoC@&Ii zpq~cCCh!339cm200_|w%(Ua45A1d3+w|;PZKJ)_2hh{7DA^kXaF|f z69EY>vIN3OS5PTjVU&n*R5MiBXu(3UU{aV+au|+*> zOLpM_SY9Qj02@Fi<2J;`|KEYY?xO<%l*|y;G)h14)vtuJ?PggYJ00k(uoqUu{9qou zc{&I^5~3v-%ZSe>-U#Qmv-!b?fzG?ZC1JKm(iGVR@zMDXynmVvg`IE0ksSYzWCyyd z^hxIivW5@X!R{wuKw6z*&lL`XFPaX!ZxH+dBqY%rdQIFh$ZCdEW8KHDx@_yc2;RTk z2LwC%q{88QeX8Dv|EUMT@z<#!{vkCT4u97d5UqWWhr>_%9t{7V?+55t(uTs}duhXd zGswE8KZD%XAIjAZI2I0{9l*-{Y0xl`@QqCr3M-bLTozptEeqsD!hwY~Ii#TZ@O)Pk$k-!5210{Zmi)C|tMixuvJV z`Q_Ax52iM}AAWtmeX7fDQe!7E?BZ3^Imd)v-wP*UzN7rR%= zxMk-%?21j|`cgvpb)F5Mi}I8TzWOV`4<2&ad90m$_3WfD+%z+N9$yDs1#i{a!TBI# zrxi0`A6oe?%eRG153zhp3`)B%U1)l}2@)35C6;dMA*TCmQSv-{juG@Q4hDi*Zxl8z zU>B+FH37KNP*VxXZBRN~`LBnjW|uJhoex2ew~Nu9`x-n4Aon{o?8&jXO+%iv?!F`3 z7-N^YFHbwOX~^mJ?6h+^G}gjq?&*zCJM#2yc&mDvU9)1IegO8u)1juT?2(O4$L07P zVmFZRNqfTl_cCvvKNA z&>#s_*eU*gkjAxJ18;0wd7|CC`)rwUhf2xO>|pno^6fBrz87lfz5~K9{KXeESe|J5 zCHLWOSYqmaC(l?QkIxuq#Owxpg8$G`1+M+)qAu#>rW`}YP=SASR>of3`3Pv>SXuZ%KB z66bmBBYt`Zr+wwcWjs%h56mjRq`YEjd7x6B5(Z*+CF0y}CpR*Fjs^>ULL$!XAT2hs zbGrh5YR6CF#66PnQ#s(K*!{ctGOB&fxxhZ>JnD$lcT=q6e7{Mtrh$tWr^2rdElY)~7`LQMf_5!k z7A~(YT~rdY2VMJ?Vn)dI7deQpHd8CjzWRHacCO2?u`6M)l`~T|t+dBmJBOf!!@9j0 zzH7csdQKIFbv%}mo-YDk(O)3BG)0O+4RCe_*ZJj81lKLX1O(^I*_cYI!|N z6jU;fWw_hzTgA?E4axPkG0U>vSlAGOdttg)lw%W_uJRm8+|9lFVEg<`a~=ivfASRy znXk3;@1CxYmV(#h`N4&7oNQV>!7f`1tp)R#y(iS1%}%GD&SY<43dWWP+kMyUVi~t- zN`@RamS%MJ@5bq4qH`mR2=+#ANLeWO<@NZ;y}^M0z;(tA7{ zzYDWAtE>01aQKHl2gCm#`arqX)Fa?CsIPKxKfp8Ml(nAhC<<5H?W+84MJ`r`oK zH6Ob6M?16Qz6etsyDtui_r(F7?}1+C>rl8K&V$zeKid!4oSd{P-VX;P^uzHz?}tBm z|6_A>+5e(&oUH#9boV3Ze*2b7fI}ON4%M8y~cXon<>LKrdr>!Q`%R0rGoU0UOBI(T5Ecbhhz4; za8^g}W8v`5J_p19Kco(Z{~xD9hqHALC9Xch9KdDuSd)8u`D&8vDEEK zgVBEJgg9~rTRzW(Tc1OXwHYkCuzPR2*UwL3QyO+IyT7A*eaJq2h@bP;41}*0h*I%I z_SAvwceEiL!;I&BnDO}UNU_d>cqmWZkzy@R{Zoo{Ys%#RTU+`6mG<4=oCz%gQ(CyS zJ+Y04#9J@EPO$rJJJmw_r4DTH(vbK(r7&8)C{|Kfy0|n}ZT(bz?tgziaPRQ$CD4h> zGX`m-J9XGcJifwkH-4z$OR*lO%_6?~%K;S62cFM;>UIsP+uLjDq&N~XNyEn?nG`m> zyT6%z4OX5)DJkP<6mmgJeg_TCNo@UhzaEdi!R+VgAq+lM&C=q3clQ_9`5wPcZ{AxD@U1!#0y++i zPx%s8xrW0zA$t@>AIn$&A*i*a1m5(6H?OfbzkoMs@TLXcz+r#Ow+fD|4eUBn;(Wrl z>Ln(VGeS7;f%2(V>|EIO1=!;Z)))Tm-Xi83@If#5e92*O&>KoLvJ&jvVE6s@x(Qr+ z83G@rST$E{07I%+oFa%hg{||d_0v}b8wGZF!PLn_|9S}7rYRp6p z;viv7ToXv3Tbe}{#T6n1LBldh2XF_IplyueHaaspBktokj=n16F39FC?z`en6I5Jh z92dUloT|F_^zFV`ka^#k|L6Vv(z*A!=bk!Mb?VfqeF2(13crt<( zdI+qa2-war-{@|SfD;@xay4YUw3OY5BwD}+me8De28&lucM*99Z zCjMFE`JW=C8124`G7=L_Y2>>e_h^$-@7={caKHWS@jZ}0o$MEjw#4@E>&XfIoXH7Q z;N%*V?cnrGGtZ0~@!{tA7^4`E2_9c!_F`-|Ec)XiuF$9#!@d_dQ)F8oldKUewfD`a z8)m?w{hKrgGFa*XsMpWLIIKnTQ5MG_`!+y(AUB9HOxrV-x%nu>goji zb)=;d2}lb#KR_fOEJK#zu`JYhBt;B%CG2}MT>2W#3uw)^M}ukj%!hjKM66KQWKSxl ziBnByfeq zFk2R@cIHo+d7__Us)(+i%ydy$h{WrF)d(cbJm1Orj@HSwOxc+D6XiG0Up;P9;xaru zn2#tX9)gJXQGZelsnX^z z(hgBjPJ>ljxTU60Em}(Kj2cMm9(NPdJ-RAQ6eIDsOav2~P)0Oq z>*lnox#J{dx4*48>-jbqh(WH#9;kHXWLyW@|V67z#B`CJ#!Dy*K>0 zQ>gJu{@!k-H2l~-)JU7{p|Wj>6&7t+=EfDJ zPqbaoEZeSyoPD`^FYBydA+&>INZI8P!*~%17KvkSl3f#on(jg!-%f3iXaP+pn_7u4 z*}W;Vwk^wpejpn!fMl44vJ?F)Cm|y7?kZQ1WLBcDrsr5tOIyS&v;uiiegRFY@-rFo zo#~*V9(1(uhxLQ$sO>EI{T=+!R3L_TF=3hFM?Q)NU0l+U<_J1c6~%2jsFdHv;Zn@f z(jAga*EN|=DECEU|wjRNr8kiphSt*HW;1~b% zidQD@-&GV<&Nrs-#j>e4LXB4=YngxIV%+hv{q#14 zI<_!n6GNk>x17Qp`$2%JWpd%VV>!opjc!j4u`izdc_GB zYFtj~XeZuUJf&=k5+@RSQ*skVW8xk%rQGTm&Qm6H6BhvC1?-RE z#zdDlf)LTwUhsOAcGRx2bG-FZJ8NS(y8Yyux0%bm8_B^=p*WM)_he*#m1{ki5ybt& zK@^^~!GdkMn2V7ANv?Him&`YFt*g5PasM*4w%+bi@LaBSLFOh{xeeL$&1=~WzSX(b zzq)t9!$Ujmf#2_Uy2Xco2zhRw;2S<`e;W3##Nx9RzCsLY`GV*=y3ilQhR3)1gKPZO z1p#pWb0GM1hILOM_}2{U1p>Yb1i#L}gwfoWGpt)Punq9*uV4)sBD-|S=HU?++4 zZ7Fa#YaDuWMqzUVXzxk@3ieiDWs->_!imR6D zK$6W2+l9ti*5WZe+h+eMcwLFF=o`D113=*slYB_b>CXWv%aVR)6s|mAk}GC80_I5GKsH@%f-)L{kYii~#te!Dq7S=mW$54Zwf5;tns)jdfo&J+OUS)r| z)vq?zwfC2T)0^V%rrUE0bE?|wY>f3VPHXE>?Pqk-?P6C^Zxz+>&+fDY2mKksT|5Y_ zqf~bh`o@QahJ%ylzuLq5n_8!p+=f{{WJaC z`aYD5#>b8IXaDwkI9tlUwc9H$|F884e(&XXh8q72E3@Tu#oyd3?+zub=H^8nb5^;5XoQ%>i`8V?j=Sgn7ub0L;Zez~iikvI#?lKj`x z2r&NZi3l^T|H?iq83og80>3lddk-ASgTE$U!IfFoEwsYo4qx!1EbBfW(5=4VxP92a zFMgW?1b@cA-v-WDoMklzPX@BM%Wv?T)`z9oI2YR^dz(AnINdcvDT2+P8^3|xnYl?c z&%sQ4*$MaQ{JxH@*_(LDy^{5H1N z17(N|KEec+1bsyM_X74cq4_JD^Ucb=IttJCZa98+?z&8n3&||ZYYH`vgG!oVq#Fe9(%d9I zMwv>QkCe#(^6@>)2|8+1;#?IkWj<&#Tl7Sl=}CWPT8@XR8Zd2W9x%=?-u4dND|#Pp zy=LB^pT^)( z7B-eS6%|Y-Xj(E)y*1mqFbliPy-d@K-sp-@f9zWD_iRirx)7Qn`)(APYB=ImmVct5T)BCls18?^$(==>%LxF1NGz|q)9?9?K)(~|vZ&#=C zV~BMpOEoo8vhW$Uiu!3=YzRC~ZA?D{W*5#-zaT@m%8?UHwPn2cT zwQSo~%p9ej;AG$7I`Ct!dz@n*NRm+F{zPj_L+AM=`@f;3I|EDO17k>%Iy$}qXWicM z6fbdtw1?BPACtLX?*X6tiwr;1gWBxAEr7g#t_Jp+u-=fna2{fo+MiX=(3;%%qj%+oPdO-eaTY5m_AxO#K1|Jez)>7p)v#aWys;Z94jGBOJ z_5m^@pvLx@u}wqAnqXe)ita4;(CRj4Xw}{GB$!$WkUdD(rubjjf023(v2k6Db_v5+ve5=ny`s~K5`*TjVGjQAmv4$=%6nEOY!71+dlX0TJ z)1^?TX)x6Tv`5^fOs96$7M&PIpA)~qd$b3lIE)D{dB3yM9TAA$z4p2kLrs2!*jbfu z>e+2v&tk7XZnEzOUbe}`d0o^Z)Aq^u!yTz-F=0xdA`vajqZ4JC4g+H|u?U-(QC?C0 zCXVD(K)tqIlMa8)t)j)?29E*BsmFg!Y(^qbcRigA%)6fc6r9?vr~9DDFH5emK1Vdv zcTw2Yw5kz15hlBxBeLjhEPYItG1-Zil%9l}^}HulLH|oxEuQjpBPcNbi|F5qySC2l zq4`Np{oEVzuru4ce*Tg^N~)hX8aDYzuEbZ!1eQjb%k=d#%%fdz%R1cD+ar6S=`*Wf zTUTqDZy%fz?aOQKhJ_aeS9Pr7|{pQHxY=#^cg%wo2O^7H?R^9YR^7> zs?Kr%W1uKFR%csnPND^mbnH~5^mF%lSA33+I`8U!1V{((?Sy~ku(G{?L9LR{yE1dl z;Ct$+b?u#Zg@Da@SB_txrw)9=dAm%zCC&k-W8qBX(fNJnf5%#Pwr;jGtbx^5b-M8# z%BONRb3e85BhU+$=e(!=I{Ou`OpRh};dU8@X;5ud9{C)sKe2@BNH9JJOC*tw=5rj) zL_H`~KR(%TDj|BlV=SEwrM;{6%?rmDqFlw5 zh9<>nvX?K+S60A`uVF>bIz~h_W?Ut=+oLPFbjzP2I80EpQB-DjS{SEPPEkSX`D#fz z()w!h;|A?NwLYqxC$SDk@ol}?P<+}(l-4>?Qofp3l#)F;{gqPR6aj2nCNpAuvg5?q zah$YpiF2TA9`Q(=tlzO0N<^)%^Y7=87F{kA!$6Xfvk98EZ+zdR6thWNUo`KHZ)~T( zRsz;r3Qky2>_@z0%LRBt$C4I>X)Yo*UQHTDT~xf1L&Sz#p{9>u$ZRK%w`ir|No;yf z=fnP!`C#D(8(IpEDzPba(^!B2?c0>(qV-9Ng^=7V@kJ# z8otE0#EIJ+RACga#0+{`t)pi6p~~44B)ZCJnh1;6$y85Jd(rrj>oKsf9r=cB@+%4# ziGl9Vkw4s=2`^bgiY6)(Zoep>L=8n?%U!H#=JT3N{}!FQIt^o1NQ%7Hz3Kc>)Z^6d zsEF4Lz&S)~F*;OJm>+7Kh@Mwcw`nA{t)e`5Zn4s`wz8(u4D>u&p8Od`(9!CeW|{Lb zPAHtx9N;ZKZ%6dQ&1cfNuXAt{E1VWywJ{L(VUJ*BfyzTUclA~ZM1T7@)|G^tkIxDR zPN4by0o}d03Kb7k&&@dA7m0))I-C?Ubs-I8Dc|<8(*|+`33OE+N;EK|kk4ldV|so{ z14)@rkN9V`AOEHdEXznvwOsdCoLuNEnNl8Kt73ZbT$m+C$xwjWSL$eU9VW!qWyMZG zN1ZOr3#{tp!2dzE9lsc>MG5k|H=W!ucy1+`A^H}vckJaceNOj&qjo-qkz&~w&x9)W3 zshblXTU5G2Bodm72s;|4DXr&6@LAvDWZ)yAd6938w~yX82YCi zC9QvJX=NWBln0A+FX?qyP)=DAAm9>;^yJEhS#JK8}?&g4}JTd^o=uC^oNdV-aoyz-Iw#Tw2cE?c!{f#P788Vtu2{ z`yzQTNc&-|dxUL#97bQRHTy8sbU!9mcT!z(3@CM+(73fZSp5csD-TTX4edocSDu&d zQcE_Abap7IB~97j9v|$CfXs&FQ|DacKym=s#XWHpVk^h9I%nNyJJ$VDWVhS8|JvBA zcFNa(gMFvvcmLt`{o`&wtHh}je7DoS--bqal6@!3)p7fN_qW{t+Q|YFZBAp~q1Z|f z{~xsPSjRr2uxtm~clImVx9{mrjSj=Y{tRy-#lE-gPq^(n?Gun<-%H58m$hTxul$PL}Hgb)A#{G^Y9R^hcKe0gW$+)J_k+?!Bjue7gsKJvzv7{%U6WsNSIX zB4@o=nAX@%T=9}H> zgTHNBeYG$XZoi;CfBXN$ADGWY)U@|brXnudd$f8n(yZHigYe+E+vFLPx!QZF;}3Rw zZzViM+1|SW&$i!vDZPZ>9ZuigtLapGuShAw_O zz^cQ}ZO2m8y-|wo{sQihnvY!?P?tpGYPd471%}!51H!hUUpOyOxP>s(toYZs7?L_o zkxP-R*sftxVSdB=zVKmc0q+#b_V~Jp+O#jSWF2pLh@&Qtzzb);kF;%+#4!*+#h(Y} z7Q(WrfjLYI5Cc4>hdXgJ2n7ABh+&)bD^wCxa8nI42R>_u{$>ye{+VC2L;o?(byM_V z9G4hvnU8s^Uvm2K`0t4vpL5aLc11^ZVJ@&JnYp%p}P_mx!b{O@X4juV!G${3V*lqP0mQO92PRbtDEt2@Fkk6}reHxY% z`kY+9hVA+l-DaOte>ZiRa+5k;{dy(aip8*$Gz%~*@l>mwF6idTO625Sa;f(m zD}GP?d$ZDe7}UYHoh6UwIy3)pbDb%4dJ^B)5T4eDuB33n)#SgB71S&v^u=x1K1oKPrurf$nTL}_IL>T251vcwpoc$kclO_5(cTw5)}gh z={oNr`91s`R;Ucz7>9`!QDkVcBEEs|xjU7RDE@Tl>7f{35OzHA32Lk2 zHxoRM!o=-GU=K34U04#n9f~j%NSn>D($YYiS(8Nf$uleDEQ|KPYkne?^2B4O3?Y2|Jyqe z^+!7utSYfy%Q+bLmxXd4EU~T+W&W+idN4%PFZTf9wLS53(auDD#m;kXD6y{WwJ+`; z?p1JAiFMyD6wVjBaN6$> z!+!Mc&VD5S=lxbtqTMra4?u~5Mflx3Xas(dVPpDWhX-uvfE8?&G->C!0oY;37ku82 zi9o^s@nbvhQtSxf5B@g8S`rBUD`5R85d17)tqcTj%CMda1pkzQZI1|fHv?bt#YMyH zp|=Y`YACQdlm0(RTO4z)H|XYU=0A#Tsy88c9A&3LO<@hKjxaS{ItANpqC3aiQIj;oAL3S!f=@ z^X7@F{IcjpJvAmIwwn*cnZ&L}`6h)3>ULD?30cV%T~G|6a_$ z%lY>YoMHH(rycH|1oBsKOMFmZuUo;r(v{jT2?)s zLMo4+MtvWDIo!M(jj+bQiZ&0&!P~XDWBRTe*K+9KF{MA%9f6Nazm0@Oy@Oc+=S~PW z56_FVjPphNV%6E>q4VxQBaG+PHQ^>2I0H?nGjhvm@hC=LBh8boaNszM^JBRN!o|Tq zupch7kal)*<2p`fmAmYaVIUW~l$61&F=+a%X!Zh~JVE;`6~DkkL}MWzTB_gC!d|q} zc&0&UMOl7)-31u+ahA%4mYznhF zou&yhuVUQ}ZHym|AC(vCQJzKdPtXp9)K4c>9G+$SN=|ba*wAroiurtVp7ZQS5_5ME zO%Dh)zK%z3ckA_kdcHHn!+cHFLl!g~FGmKD*tEFlC>s6(M5AA{-lOTS5EB`=u!y=( zO#KoY&O0|@4@S;Mo|0wKgS%O1IxiOAL|P8*6Yh)S7m&XJ%v$ul!{N5xP2+IQ^=aqk zhZ-kzsQHj)RS2Kj!QsbMm}r_KZi`e8Zej?`J^KG!GWxJ+gKw2I$6NBV$T4%x&TJc_hN zI_DY9pia?TQjh1tzExa}$B%@13}^K~;~=&dXTaZ8287P1>Mt5!Pw~?nRS8Pmk2a35 zM`DI^ZXyJ4+qBEk4z0vvTWyDZ@&5iYiUoQ5-FY0|_XJ8ZtpiWwC-z1Xk^njZb^cOR zk-<8hc`MAs1eL`yZ^LeeuU{Ok9O1+6!VY zqz5Vl`4BWgQ|HO1p@QHQbL?8E1k%&`U^oxWfkE9He`WYP34iDNFr(&5|6Kf#+x(}% z65mT*t@|<-Sk`kv+Usp)CS2%MS+o^F^2K2_JyD;zTBWPd$bXl;{1SO9?Bx^xUVDimLfcwnmxjb(RVW)-v3|b2q#az^?{4{DvX@6f7?-_# z3h_*DFYn?vJIY?}&i3*a@T3ZBk+hXmdJ=R<3H+HP`?$BtiVEuIgngWh$F}Sv?b6tm zeWdk*9kY)o*_2-PahSA^uOQ$y?BgxcKK?$*J|5N)`#7v?zGV%7T^x(Qh3I2wBGcGJ zrtuP(#(TP=O97_wQ8taYXJTf}a$_1({7I}jIbsYZ??sxY=0^Ljj|fWH|m~ zB>oK!mJFBfwE)wL_bPABB%kqc%=ClLc(n2vae&gnP$4cArLTp~yAq{xOkiQwnD|2Y zja^VNB`vp@xh$Q%i(yM^Zp@-HnYOeZ<#r2sVox_%CCB@U#MgJk_p&z&OM&I@k=)A&TJ@PRV0q-sCZ zxC-Am?QPlzW`o`bCjP3b$>Y6LOPb{8+C1W0XS=)4DtC7k#R?tLqhP8%-iQVoxc9gX!v@ZW2<9q4rw5IDJF!#OE&Yo@dy}kefjG(;_R2`~D0(Ooai%Rp zR#RW}_)UrZReY#*gmJu*NXuB=I=T+&3)NXDw-1_~rae?YiTy-s2MM*18u5y503~Te zq8BBTu*VSYU6?N255&dkfqck7+Y-gDv-6M2llBW+FSMP)v&mYT&9G=kcm6bSB*M_% zA?84*^$mxTZ`gYu%NmYJt@Cidn)Wq$%6InlU2)*}^H9z^Ge+Vkc!p&?-32H1S@(D4 zHYP;F#rBWR+iutbcb{fZqX1%;rSHR(ATP64p$iy&boJe#;oOCQJ}zwLPP8bAdJ{bE zMB_0=G=e{~^Vj}Fg{H&P`)N^_NlQ^+Q2gO|Cc2=^c5k%z-OjvhEPKcC&gqVWrhc>2 z6+ZN2s6=C02sLVQxcQu1-F=3mhQsT-P!z-HL8Fn4UW?D6F1?YeOAnoEncJ``0IR(6 zL3ASbm?-~yHQf7*@${*>QqHN$=QC92R@LNJ*VfLfJs8gms%mD>$e&+3Z+dlIUH+`9 zxif02Q5R5HQ7jG9tz)wq4U6#AYBbr`hvtXf*{8-c(l1P7c};&F^<75e)jEQ*&r(Nl zO#CO)TgeHFK`?x98b0_owwvsIjdcyToSDZohB+lHDzVnz(+#iihs&ub)Y!EiA6kf# zVra3@pKetfM)&-dPvS*B=0wq=Bn88YV3TF*M{(Y;*L|gWy|Izrgtnm6W{(4mPz*}{n@2)C2vy6q0o9+^bKv>5RKPEIHYOmH?ba}6(f36*cmt; zp>H^T8hS>s8p0_PlTr4P`oefT*YtnGP0WobogEXO$yvHfIVo+#rL;*J(0Uc8iB5l3 zV|BmIzPE1>H@=607wT{-~AHsZ+YZ~WFeUq9S`;oBWAoBe3j z-s#W6Ek5eiC)nz8eKout?T{m`c{wkY^T0ozJ2E)v`!cCFSvzsB@|MQWjA)PV^Z}y57)JDVU&@R-5RH z^>vaqoiIsTQVeov1=p;wVta+v;GL#6;lcH88UrDt@j|nuKf2GdC;%fimOo+L1psFf zZ>Vtzo+&C6&t9qVtcOP+4JOX8;y^Z%F2Rw28^M0`p@rukgZ};XDlNe4@vuq&Bnwq1 zXiXvW;TCcO>y{0&vXmep9&wIlJ-g3-Mfg_6yY3mhTGDrMiCV=e0%+9S5fAN(@Iy38N^2?x&jk4HyrAoy{H^-KnK6a`^cHd0{{ zr3CxjW+2n7Lo_kLdt;Bw;nPkgKQR6i`O;V++nlj)5eUL@%)G|VGDzk!^F1{RX$E+1 zghm=7>`G%DEEbte!cXaw;n47P;pRM=F-}uLOL)cV^=Oqxo99s9LSCeK4wipy3N`)+ zmBn^ds(T%8Xjxf4pCuK4n_UcDWX%Y?QdUgM98ZqVD*AbxtAV~1g=I8I-ix}X$CD;3 zKCAFpE7bHLf~A5o%l0fnO>e{3!Z$sa+6lsn2iS&FRl4nIfg@LXCYO>6n(8 zE0J~)8Y2E!=|sb)`Pho9{x#aqgGSnxa=%fsxbe4bVPDe)4KlB8J&3}?dP$s-OfBhH zPdSbrYFZBM#RB4dcuS!Mp5ueIXt){awITL6jiy5sJ<6}Swr;@w+-evevzp-Db8}cZy)Edm%fGb5|y2zc9l{ptX$8h^u^oyO}rmVOEn(eiS0q{!}vR<;^B!Fpv9~D zO}vi_?ZkEuqKAG>lgQdFw=;T!PJCqaW8u;lYx}pVbBf9R#e5EOe0$0kMX2dADhimq zfqjV=l&U!$82O1kON9!VqbGJCVQE`+K$u2>2V=iW-&pt*wHxgvB$4&%By;@dtib;) z$`UFIMJQqD(yPu52WZknWnN+#xBO9GaGCA#~r+hcAB(m8o}WuUr7-_)<9*rjhdzj zm(+es1Z+7)_uvbpD7Jqk`v)5~ZX|6_s57Y-Q()wG+0o-BGPOG?_ydxg8+%YIhq5XJ zQPAJTZjl)jJ&}-T``%PpX zN4)%@e8h#^pXB*a=bEz9-zhto52ebE$`hIqMMZ{^U9)a|f_pAGJ9Jg498An@LY>OF zu^6)19Xg3WU@9fqhlZ6!=)+U`az3#CWktz>35~W)$Mzc^ZcI?euHF0gFHHO7_)yhu zoCkRi|6p3LeJpE8*H1#$u>t(d&A`t^zTNTrk#A4Sy3T(fZf_6J@82>G#qTx2n|%0p zRpvbW-k6nz-)pmj_`NB+;LVWL-2HgmFUf%!xH^ZJA&iVXG772vL6vjn$4<9-Tdn5vg=YsA%o-9^TsHP(u`x8eu72F)V<4gNSx;nGDrl0jjl>i;nt)!G9syS(P zAeCH2j3-0DbLn)0%f(fNt^HPMq}wvisCl(1{74(XI%8bJaoYdPyPM5a+FFrY*C4vg zYfO9#^GZ<1nkz4MXe{k*l*h!sHV$=yj+h{kAPtI|RsfYYiM{kYylCC5Q>t|>i^zoN zT#Ga#OUrUOU!rlGnequLcUA~ni%i6IrAYc?L(m4LIy4=DUcm1PleTO1DdTWhX_7UN z2+N3&y!#T`!v?;4($+CRXb;UIqAVdw^m7vN03sfMO{M8U^>5mmgI+%NEk-HDQ5~LQ zA7y*ylSw`k5iiws>=<=K#y^k7f7D5AjI{1ly<3knfH5eUru8|aD$ko6vyqr-#w5&(r1bMv^lVT6?72})0W(MvH? z7~>WVThLSyjjt)D^3*-PcK4U=vklRLFO2$A-!Gj~dEM1`;(-X9lk{zb<`2%ozB04y zk`}7iq+&*Cifw&f;x@i%*+W3xhi1a160M!cb(Pd#{9*e3V(4yie{pr1{$kaAKn5dH z`a}Eu#ntF9o{lEON3mU0fANPg-U$0fiX-L{|LChWFoX*j&E&U%f-;U&Y_8#KukQLQ9Dt{OGm-YS{C!!Pai! z&<(GK8W?R*B#k6XXhm+zk$+nJUGD{(8a5AD{I7!+yuuB5r@OihH+eU=o2-W;w5?RS zp4bWIWbt=XLygmL!^}Asm3BE@2X?;!_Aa*X`G$W`F%Ro;2#Ry|Ga1%`J@9jdZ?9Du z)+4?H-p@ckcJP%9>swzx+%NahtF)a6PAPcwnv~KU<^_kX?;O{c66NB${v1W%Z z$h4OGf}i=V$9%z?GpuKQx$g(8fB1qw_^br&WO!>JcrBfYo4X{#dK+`={a6^$>o1ws z`x(L8vaD}1g3GhuTm-Mq!o;uOC0W)F!Qj#?>w+$!M>DOrx)8m(QvHar^))s5F`6sx z)Z^*udF5{?!s$G#+@Y6MyKp)XWNLWE@8|?4<9wv$Hz~=-aJ-l{{1uO&JL9~}uFIc0 zFP2}Gl5)zgaiu4mr~UKi%@ppAUBk{-Hbl5OY5j=#9r7b!N0Tb^|7C{)Lp{cl%gTL$ zuE1d$TQ@uPwy0#N9)$JLRrq``QT6vMtRk>0H`M3TFk{npMzq_e9V+$*H3S1TjcVN~ zVO0ORKA%SVuPfgvx<-PXlkNbj=qW@+Rq}YMpU3OUJm01tFFXY99V6N>(S|jxs{F`? zhEsiouwh?DpOmHe3V_doSKxRRhoYmv@hm)@g#k1Rhlb1TUYj)aF4e_GIvY9p z8Fbp(3arvy6%Hi+EJ}Q}REOxMrAhoLcH%21v2&SVs?}OF?dcw3Bc2?LVU)O7ziWM8 zCqwIp>N8jqU82cnO?DM+=X1Qx8P2EfVvRNrE^K|waC@3=T5r)jTmQ%44>7)le|ZH_ zYl81TpkD-SM&(-<6F_B)(x}Kz%Odt}?LfoL85kTP|HO!4kh~NmKM7&8Bt%cpFb<1y zE&sktzlkmIo%n{j#`$J%L&lRO)b_oJ(*e51BQTfS?EjkN5-&2YX@^|mNc@#>^Rnxp zFlcUJ4kWLKC`E^s?p6#{Y~_)M=8|nM{1>{yZy;hWSD4pN$xTj!)Qg*Te^V86a-fwn z9BJMai-_8CkQa0%FSH4vQYRRB$qR-H54pGQUv&G)u{|9hd5iXu-(Z(i_sgpigXLdJ z5PpUJe0%)+XFJfZLJzqNkPfDJ$E=tXDfL!4)NpwZ>v6bcjmy~zZ+TbzT;kj7yr6Zz z?||eergkA7gV{{h7G^KCmZ#!QdfZpWs$Z1j)r*wxfcZx>`@u zM3A_@_f^?AOD4FoyS2t2{CjunRe$h~?$%HK;H}-QI|9Myy5lgf;1k`gmW<%b-K_^R zg4cJq)@Ow7$hPidPx-B2@X~DS%V4lM+xmT%U{khrbC=My+15K<$dBIECHQGKt2s0G z>#o*4nS{KY8T@TG>%Gj}W!?U_{v(>NtH z(Rp#~vOA$_yb@NK9MoyKq>%R^gl4x7PWgZa&2YckGRs%Qzrhh z@YfZ8*f7z;et{Mi3s~5{(&CX`{2x1L{`8t5V`#cfB_2~Q^}dp(Vy1m>K47|GM_1L( zu9_QblhS;l{_}Um#pU&}dE@8Jo{NtC$k>Tf2M%(#r^naMUVydUm3Ub^WMT|+K&xtJ zR8-f{P(Wm2@zhFO$($wsp>B3*Y3U0k&(QMmk&*Rtr^jZ`o7;Ze(}ioW^zj>}<>_>E z4BKD+|GQFP)QAxW=NC;r83$+7=NA|EAJ~7uuZPw1Z$*mXWtp)qfDLo2YR!I`35~|R-vXX z$A1dPnw^t7CMSz|mC-XUGAsNpnv=WKUxT+QtZDd97v^@0_x^GsAl{4dM;FP#-;c}5 zjcVT4@Egn8*SurilbAPs`;dMgG4Jv1>3Exu=hyT*tW8pUD@m@CyX9m>vJK4-n&uos zGm&U!gQkLM4g{W01`gMa_+$A-=Hy=FAD5H2G%z_Q|D zi9Ss9qa;1;)LjA^+W(xcC-LX-A5HWXIr;uE2%ww;7@d8FeP5o8$hpoJ=$6?nr=&b*KzU9PXh4f^klmxR z13PEnO(f+_Www=%u%_t3SZ-tjvxdy2T`mf?WLzA$gm&n$&eAk($vp#fH)^_lP_eSy z$d`-#k(|61lKY~JikzaQLCDz9#oy2^r>I=W8O{!j_qnk0Z2z$?D4abQ;n2Q4bdAQJ z38#h9=b`|3E=4#4>bm9RmzzX@8gjX%ZBght3x9lzB+R%d&_c;g={`fhuW48Qz?p7g z5rGTbSb28fR5vyXvP2Qq1|3!gj3eJ7ty1zBX{GacRL(U2wzN4sJlmo)$tNR=>sPl`Vp}(Kom2Z*sl9 zdEEJi@}>gcY}DVZ#JvgUBA8#;7vyO}#;BYD{v}F&WoM$-T>)@7Z=Fhtnh(hqGCC7PrIqI{kiq65k4KAC>%V>j@2X+@ z(#iWz{r;gg_-bWW=~AKi4j{)C*DMddKnw-KiS91ofen&t(Rdy}@>Ua?(4J=Q>V zTwsva65EpI6#VLs(a9nqpHP zrcs^e=sV(J>b!eb=M+_}%gG=0Gz{i5sGgtA$r?+w;nLtm87+Z}{pBv@hw0&Xp+kwU z14UZ39WVdy(&mq@^P^O#a6N-RPA8WhE&@JZ(;N%K$ux*pN|;XlRFN}2Q09Z5u^NuX zI`|+@qjG-+@q8BXd@d(zLe6-p>J@3lLse#xZfwzE$6+8n^U(?W$efkFz-)h7mWVOx zM*Nj&M-018={T=UD(@8M8Jgxqlb2_;7ia&4-cg>^ktmaUt?EA=cAg2FeJ4kc9N%eF zPMQCfZtTxV4{Ee3dquj_g4Wloye)GSjN*vDsHVYchmNFgMb5ON(kAYRZ2xI^fvVZ% zbt2WNF1SaB^MVOyLUMXm+J5W^@?*)zf%9H6+CzuPy|5PJuRC?l;CjUHZQFN(Zu+Y{ zA`tMWHvkpc{zvc$3{Yy+tV0p@Lt2JeB#5i-#8)$ttIpHd8&wsw@j{pRVx^vy$2?X~O(R+Ay^aZ)qpY10hRpE`D%bXv#C^0k;7wP(W_7 z+n{I!=7CPF%#gl+8GD74W+!M~U%_`Vd6C}MjZ*EcJAMAmX(LdPoezGuYkt(R%=~ih zOtLj(<2GoT`9l8mVR9R96t(fjrq@++eL1fRd*BAwAOxzyO>WCkxM59mamT`C+Zst9 zu5DYd(L7HwJ|7ISR1!+#m737N3EnEM$$Cl2J5AGI zgVHuHhy)&AV5Btl3RsxfmF5bt6-a#%urRch<_cIxq(P}KtlR@1;el6r;3GZoum>LT zz(;%Fl#8iXz#5wh0tr~-Jn*ADaO!zWy#id5q{Antf@LdT3IwfVCtQ1QM_sQt+L8 zB)`MwEI|>l8pV@yi_tmfLEHtb3&fLiixuk5gSZP=E#k?!4Oo<_$=BhK(`OCCue!)@ zGFQO5)ZE(tBOEV>f2;k5(&2LP1?i!Gj<+kmy)c@TF2>jv?pZm(hf4xeQHH>J=M5U_6X!2g_rzrg$*KGY{= zu7LFybDQ)(VEr}e**pZSznNS6e^>Y%*ud9*roJh2VSL!!CjAdscPBlYhk$jjxwZe7 zF@J}T8BZXBfVIM=lQ#kDKKW?h2doF}dwCPE9+r>xeZYFuzLz)H(?mY<{Q{QL;ZJ=~ z<_cJ=&27^EfVDR1**pZS_2$<8e>3xU_}pf{p>%jcJUO=k>nZ0!+y%IoKmfRXmH9h- zlKDTEOst;**7F|tiz#>)q=(;f_$2dxDTSVZfc1(8{+b8=h6nyu3VsO7pOFs z^gm#IpY&`V0@e@aHtB!B`YGwzJYaH*xlQ^XuzW%a=T*S+d*B%!coz>m(*y77foFT* zFZ96oOTnpM*>5>~sQ8MdXkJgdXsB;)%+jZ^zZUVRxqM?!qxpYiik@Ij1Ul!BKq-kgFT#`t9^_;AL5n}Vw` z)f-dru}m*(OGPq?@jFxKk7N9PtIYLg8siVRP)zmI^zIilevd6Jt!b_owTwUJLea;` z_~R+~IgCG>f;Te$Y6^ZK;~P`(WsGl5!GFtmA_c!jQeW>w4NvLIQW_*92yQg8R#*19^-)h_iTR&)grR#-1lYpWW`Lh@oPLKXB!Z<2P z*L6JO!pQ3P^B9M5a$Tz!=bxlEFEV6mE$7u2jCXYaeOJn)-BR##7|%|@FK4`a3jPV> zJEh<~ILMwU_>qjewGBrUFy1SLek1S#{~EGA7Rr^(02oY@8hRUqSckJ z|I;LgbbOBWz^8fObAcE5M{2Il9Ln>6@8drvCEP1L`25v_&nm_vHvfI~-OG$S{lkXh z6A%15#>d%w=IXoAP_=#h$EL`64e$bgD*b1`d-_f4ViLOM(;ce0kAG?kpT5A;(T`$$ zvMrCP$*O@D_@~(TMf&dVj2~~~PwKn3fG_tSYKLn|_<7qC<`f{PS(x^gI@U z`EvhZcDkATI+O8I8#np&Ebw%EcI}Z~&OJTw{=f_Ti&EsN^T6+8{7jpk=2z17j0gXh zJm?d^d-|8CkMTQN-|Yeei>Res{ekb}A8w~Zo~Ag$gMPFJPUCO|{zjX>^3O0ozyr@h zRZ-x-z^11;l5`COo=(n@9{8!i_wgTZ%WulX`5yf50^ZYqi3$wA=jyu`na^08k4cBE z%;$2Op5{o>)g4t@f#2zWrg@Nb?F+o8{~Gmx-bq z@rU%?dyL<0<21LAuAaM)JS)@#erawVT~mSg^gI2TG`Ehf3mIRl9`H-^-{@Mw_*3cu zzXspP`13YS^T_DRMZ=}Q|B`yZFSWbqng+b5-|2rd^Kut6z0;pYbE@dN-vj@W`Fx;= z@JsDjx^~-*!u?o1;Fsnw(N*JtuL9oF|EVIvFU>om>no<;svhubJc+?jfC7IiUJtyd z|67~h^hCS|xqAAY_CC!spzAv3p!haQxHh`A)zK{68on{L;J{x=!$*pU(77 ze-zD^q3aRG{kA^OQm~b?JMnk=o&KWnlNfjUmyXi-AA$GuJN-r1YmO^{r<4B`5Bh&H z?(_>8K6!Bbd-_xH62?vHsyQGe(y_qPg*(RsKhFcd(gVMh@KiV7y4QpLF%SF|4}25w zo_?p_hUSLQ^(*M(a(|VbU*_gq;OXM~JK*W~yu`TEZ$ooH=<0$FrJnv&yo7P5ALc0? z@X5fJ`wuZiS$Jn@`e-yZ((Jc7ii%dV>rax4_+&Q1*Im*V(w-bSzdriv!VjlR#9(c+I zKK-Z9pKnb)ZtQ4UAXz+URQ25I+S$`5#%gEJJtZ=omLU#`)Xf_)tEzTVZPn~p9WUh@ zW>zMa*I-Zbsu&hcRt_1C9nDXpRgFW+Yip}cr@K;os#sM{9LQ@I=S-M1b^6J3`p>Sb zt?EDE|19AC*zstF6MD+J$>Krdt7@y~#?1P~1?qzl6OWlRBHVxQkm5GJ9X#pu`PG&B z3p-^~f+!tdi`^XSXys+Qw8bS8r_Y8s*!*$&*mtMn?C7eR z`VOR8@t}#*YiG}ojhHuQ4icmTNmpD^UB{nvETxB$N-wOQK^k8*9jk8Z+7Dx3WJdc$ zU_863uDS#4ic8Iz&m?k9HAS=|pADQOPKXu)amh~6zYzl~Cybsrz)=TJvhkyBRXa|v z8+NZV9!$HARW7I;!Ur0laEv;-!=&vI77v;W<|vP9LsTkx=|$B-*!oRW1BaP&c5DVF zap%<*53|7$RW&syS4}^y5|JHmN7o}DPCA%3dwKJO(aFXxNrYn0r1$(x8RL}iii?$1 z;(WFDBh-n5h&0t0b^V`9LiT@Dh zJeX-g8~V;25Pjzf64zC?;s7V{^){TVfTTYO@aP6ImN9!Mrbl}|8Y2uj;@lada|#p36< zB9(?`YMLNSX0JoDDbxBa6t{G)j*N@*VQM)qE-|*oG31{9Q%9M$%YcoC(vM+daFSRR zYH(X$Q#7$d3O^7GDvs%2TRpS?)TyT|S~PV&>cx3Dyli&t^r;KTjhl4z&)EUOnDp%` zjm1AVb_1BfjGFNa<`~7%#ag}5aWlJzBp=i>qq;6uJMVO>E;a)Pxmi=E&YTa|IW}|Z z^jW7FZnjCFbhOjTptcSgV91D?>Z)2NRtB#SF|{!zA}78US_L8z@m)&(Z`T$i6-g1< zF+A;L*fH#6Vx^W$R|HaOT1S|aSM4ws`LTl{qB(N0F0EWNy?Q>m|HXst+YvQYb?^_3 zwz(~5hfVZga^Op5)>c*g)gUy->; z`hw|=EY!v%FY0Hg5f>0@${C);JCJ9paWHK=9U6tM>;Doet!jfX?XTEKF?E@k*CXc5 zP!5;ziBb%T9i=qE>)46ly=;o^XL2$rm78N+Y*B}esN(uV*c0t5roKqEb+Xfn^v+Ag z()L%i^+Ecss`kD}?WJn#i?kh7^Z|D#xKy;m#j|vx>13;9_t7g!Tpe9)3F_|SYKu0x zd#f$VbUj;MvG0sg?qC9NCz%P)X*G#1V$bH5sLea~p|+eJS>p7_rHYlR`kiacr4{+- zGHp9L9^Hl=iJNzuvV-yPX3&nzu0Bg6?9Zt%hDPSrRoBL7w?rOvSTKj`paD}O(^A=R^z`!c!OrJw+>#Acrf@|@x$#dyY*x6`dpHV$y6slYF-P^6x9gsSe zb41t6{2Fo@c1%sJ%38|Sl_=ZZEzQd55CGX_CtXUT%XC&73e#&bf}9=OpH3}bc+Z{O z=DRc$gG+=XTWR! z411U2oM82!0;#REpptDRF7 zi;#w}ZRN7#5DcC;3pJYa#*U5aOSP9XO?04XE}QXZ=7Z|#S1EWY5#yq1QlH@u=Wp;O z>9+zme9SyRqW?nB{|fhXQMg~?&+s{jKwO01g+GH2B@h?k|ARk+m*Ji+;{O%?3_g}X zTy4qu4c;3$F-?&#qNmwuhL4O_N9gxaY}yR>KOucgyeU0@z@K>@rsXGG>cgoTZ!0|| zA54eli}-BApW#1B!6|xmhQ{6ev7CV~x146Kj+?)kr{|Xcj~@IddEj2*j@R^V{!2ah z9N~fI3qCZP(CAx#fd>VCxCcH`;F8Y*jZ=EkYFNYn5rNC{yH4OVi_y?a{ijv3CLc>Q zJ*9&T*UWpQaA~!b;WJIp%XppQf!7IK@;5V&-TbfB^ltt6Z}QcE7$117cT2NS{-fZ!y?^eIv*qW z?h>QM7JX^0LaLf5?jl1O>F6gD45f6N_z@?l^J@~72 z+DcAYUXJX-;-~myrwLrrt98z)e&f}e-W}h2J@~8<^fJCrdEl=KT*kLdS77dNPt>?O zoofWW47bh$KUd%~T(d{DoBsnMTv<+^6}Z%syR%gKyXAjb<8J<&1-+F23lIE9flK-O z=nBTozrVnx{LKQF`f#tfg;d7x2FQUZ7^;;Ki>MdFSNH`cbm}mH4Te56Lh2ceeg5^x!j4 z;4<9d9{7<0m+~}fobpk|_YQ$ez5P(&dx?C^#ywr`_>vAAT*_&7JRy3Cn{{n&J{6h| z$tmSo?ty0$16*!Cy#+4A?dyRT3tXn#T#dWsSt)Rto_l)Kv*Sd)EcwqC^pel%f?mqs z=z(7(aLNBK9{leUxGayk6j5C6_zu%JMO*TpEa;{D)q-BiKi>miByh?9S04Vr0D(*S z6CU^%0+)W~PNII7e0C8y?K))a&z=I8d~~(I=|;PI7<$={L90>?j%99qQM75dBZC)c zoYGmg2M^Xb(Mx&C1wEBb!^hY+;!_}S)4xG{ekJf(nva|Re1R7V`b7el=`c#*(*7Ge zP4W!DpOLdr(-SW9eMi~7nVLVvOWG6DPvQ=DgOEq+?M4rLlfb3?6-X<(+~J-ja9Lhf zdf*3=fNA)gQN%kmfzxTHTy;L@HPD{#r@V#-8Zls@<1&y?R41mYrG+N;MIRXFVyWc<1}G)~z- zzJcLGeeZM;p92KFS$XTumxxDsnWAx`m-%9LLUH4#33{0?%^v)(7Pw5$yFK`<6}Xh= zWe@yqflGOQO@iZc>-k6z{5lW(Q;pL<$-ldY9Wee3(M$RJit;Y;Vu4Hkm4d%)@7yeK zS$^LZxGZ;>qWns{m%wGdj1{;H_cDRYdg^I`OFpj%T$Y!21TM?VW`Rrke|q42K%~xJ z$)_WJ1@+CEa@1MBLXP)IIm^J4F3NZ5SD5;paOqc={%VSz^eaxlGhKvBzi2w6ia*&9 zBmZ2D6TS3{P8WDTlo3O}MBq~X3p7r0((Vj~UiN#_E{z7iO7M~L-z;#+{|dj zlKe6s*9v;c=NW-ZJ}(Pg@;N}`6ffETJVD^p=V{_)#sx?ospn?BJn^Bi9+Q8gaZi`Q z4WGRf%(yJqTE9Eph*16>= z5%fv&3taLsJC~81GTiety&Hd6@cBEwG3mKY;F7;-x4P58tKB-7B81BwFLU0fI~|VK z^ltvM1TO8~0|J-v^$Ghd>AMPC>g}!qm-KrHT$YRd1TOjfU+LlXDw$L2-)B8=vttV- zpUhvgQzYS1-=v=-ajBn@&u9;QJHrFNSLoY)2;1l(4j|{tEhp_$PnTOyjDEW1FVysI z+_YZ^Pm*8LyZKKMxYQFf{zCLp4?pps|6Jfwe|`|StT9Uh*;hRBk>) znY&7VS&y6~a9NMc7r3Nft#RTn>k--hir}5mk7EQM!YlOiB`&-(lI8I@j;)HXEWeiv zT+-jCags-t-wHubzMrXQC%SNxUo_@O7o{iB8$IZVfA}Ei4WD1iuPTqS{+0EYtbb+w z_3tjfPau!za_j9&3Qn;DZwXxL?e_wgcEFT7(jRHhDeiPpxY7=o6O4#n+VcYiy)0jY zG*0x=pE+3I(w`YF_((f2PT*4hqXi%7&r}I|DSwT?r5%e2T*`l@;4k&zJb_DnxKQws z^8ZfYlK+hYm-gp&fy;b+P~ei!I)O_*&k9`f8G!tti}FR^ zUpLchcFfIxo!}$oe^%gy!Y;ica49E+MHlgx`TGr{ zs=Pdmdy~JGuqQHqsg9RGmviWqm^Os~WxXjvg8o^(di>CxG)9pne zzf8CH1uo@J2tJP>Y?JR_3wkO4_kv#fbvsi6;Bw2qyT<7s>5Sno>yZM1oAFKJBjqpg z;9n+inZIFy%Y2+BaGB0>+*9%~=MIoOlFtQ#k4#T<-YdO+6n`eZzZdi}J(p{o{>k*b zU(icAR|uvO4Y`M(#qv;zTAk4yQxX`DWj`rJd{ zQlEPZK2rW7flK}a1TOQjMBp+X#|vEYnIdq>XPUqzAFuwpnTRJ{6kq8N-^!@MkHx*w zlcxnvHo3cg9wy3NhA1x)flI&QSP#5P;F8b98Yev;f_o#+m4aT%|APm8KrAE+8dE$az)|*!gdKuq8dEkE$xa9wc;4kIbEa;{DMsMBnA1w4i$~j8lvVJ*Q z;4<9bX`F(W;jZz(w|L-Y{+pZ6p(HpiH$KAyzsLi>#{+-M1NUja)E#bL5By{g{Az*A ze7srUQXf`$;ExDg@_An46b+d#qlBL<@mmBg^Ie?}s?u5Vf8T@t9~!6hk@BnaH5DI; zcgv()Oy%ES<0QZI|1TD}l>d2wOZh(#xYXMtvN%|--(~w<&J&}tgSfT}M=NsHH^Ply zV*0@-zJ#0lX}OF3bRxhd{T!lymr={QOz1!1#$JuqavJ_4HT^Lze7eS`yKv**&vW5T zn*K}|-dD%>d>3x|iI%zW3Qe!s+39n(j;}68j86g4Lpq+Cjg4>8xTzoLbD}rpKUW7} z@G{M~mkY1ac%BQtTH}3O_!^DpyYQ_VFLdF3bh#>W;bDy*=)%v^ct_fyEAg$#_y4qZ zsL_8)7FmwW_#NTW-F`H^%W!WNxa41~anci6zZ-c7 zmv+pQ55lEgx!n?3Hv0n*y_Ek<&EJhT2wcj4laNQ& z7pny>!`&cosaFS5gmBS6SucFYsLIC^aBuXpMAMU;gpbs8=G;SrU#jsjE_yRhq9gWU z6?m9%f3Xj0-0Bzmpwi(N`=HX{Kfyjs6XjIe2g1|Y2g1|Y2f{mJA07k!FZLmMen@BS zLkZH5F0$LQelht*xU8p)U*yJ5A||-pe9lpDN_{H(&&fA1`M5>X6Cde6$a!4Sf1o}k zy4>^^X`HGbNxwqS%lNJlxQy>h9=P;3Bp)*mpTd>?%!wo*E;nxW9U@%TCulPaW(yx%?_%k4@$@eTu09+(L z;YR;@xNu`1_H^OKo{S|XxQLJ37lnKkx(Jv1tJE->ipK;l`JAtD3SOqqRu6nXp@%Ym zGf5C!#7Cy*FpazAj|g1Kf2;>yC2%SKJsNk*UncTP#%rkuZrZPIKKm1Zi-M8inswjq z_?q!wqL=Y9>%rZ)?C+BN8+5pC{>ua|_46+pcguOdz@O%D zm|jbLSSN5P=d%Kr?Y@rq&#MuJDPRAM{_`#2wo7g~<#>>^tEN3p^iuxQ1Rsgl z30%s*OyeY{EWdXPT!y<+;IdrrO$>0+KUqJ@b~n{^M*sV1dXk@TQ$NaiHH4dbu*^ko z>dhw5(B)1ySuUjfcPR3ddh=cne3iguy1k-t5=-)@GE0{mH|u-}m+98Z)QVo>rXST! zZ~99Km-fW;ixPeqWH9MmDELb|W9)#Nf2jw3Sm1JecAUm3{ny~nglpy%6Ms2ATdnB{ zm*cZ@1TO8K^jqZk?3tRL!jktw}cuSK6y85w5fY zPifq(pRWsCmeYg>{)ND$9_9#rli?mIaA_xx(zsjxYX!Zux3>yh@-g#6h!6Fpn|%LN z@RxFih!7X0vn(%t1TOXe5RKD6$!ACTjb8Hu<+@#&o`(y&C*>cbagtN!<0KDU+HD!H zb%MVPSGFT0{XUeCxZLSktZ}zIa=cZ_Df>Ake=}c^*vWdKvwrF4LQYvPvcoHJRxwYC%F_MTyFUb1TN(tA#f@G zc!5j$bA|j8??`)LE#xx#^PkpU=*YZKSzpiKR95LM>vz-Mr}UTpfT=g#xNKjPA#F|i z$o7Q{*Q?&VUdSW!O1iv0vG(?OPNnVyt)bP*pZPo=2 zC;8Xo&!pQzK`+zoJb}w}yHMa#&PxS4p5o6OpmCy?_4^@$UgqO)4}6@!Wj>zj!GEE^ zr9S^%;8Gs5Pd>>h>E99bG98W;^Ux%IdRF>$xLV`xbojHNm+5e)2mY|YWjeg!!T%G1 z%Xk%ZRdTxJIY{7=exk-nPh_}N0+;gFdf;aWT=HqrILRZ^bE^kFw3{Qpq`%(-Z`BT> zTmEjkW5t~gduW{KWxNVJ@Ph;{<8`D5|6>F$)A=faOZ~i2;FA6kfy;C#-6?(g9GjzX zcRDQ6xH}!G7tP(fy;Dwz=QvKfqw?kjDO+}Ir7VN2nk%$_tUsLUWW->%0Jcv zKU&~Y{&O`>=_BpxQb8~6^J{`$+UE}hF8S=7>*Pz3NQV&um-3vfad&>z33?gdGd%F~ z1upsjR`8d4^@<1mSAt&VSD=RzFDXwq4}4dFOL_Wx;Nvy!PKRniFT<_zz!wQzhWlF& z{BDiA!(A=tWw=jz;I9Z=hWnWZo~su+y2IU9<8FI(pa)(ea2f7c!C&V46CU{YJ3IL+ z`RuMcUfgo_)3{sCfgbn~0+;;9dGJ3$;L<)^C2*;qHws+RKcjKCJ$X~$GJm&t;9m<| z%AdK5N;gU$na;C3@JBSBB9EY#@oE+HQqFHZ@Sg-O<;>sJkyG~jT_JEO{~Ccyd7c-z zOy{o!F6n){IpIqBLV-*AVu4HgNdlMjRRWjvmkV6dUng)$zgpmueuKaz{XYdR>AUF( z?xYWret^Iw{cwRx`so6f^z#KS=`Yr}Td(dE^pek7K`-^{X%GB0flIwA>88tl}k%!>6AIKFoz1IV1lcdv6|J zMRop8g2wF)?gCh8e^%|y3{IG zKP_Es(N?8eF`xq4)&f?=t;L-ft5mDvQuw`}bDrnkC+E&&0s8rV{`j3&CTHe7&vu^k zoMq0;opErHGtI##akDtUE$!e-qh^iQZBx{HtPwy;4{9=@dmU1NZnTo z7rzp|lg`=4hj-1#J|)86!zOZ`ArQ&!XY~7dbUTvuXSaXm%TpsquUqnT*yw!_dc+>C zc0;e%Er%LwtetevNbDTTIO)~vuBR&cfvR0gJEQXI-&vobkSIm>#jdiaEne<5b>F#8GD>bd9L~7wPqK{?;o6_H zHcN@*Xn&qy(ByT$8pcVEzRtZ};lIYdl8~ciNaQy?pSgu`SFe6PR?i=vRP?%Be+t20RJbnJCycxH?9cND!Y87P zQeW~M8sWNJPbqqB=RhJvqDMGDvcxjF=YN8wt|2MX8y1I0WgI<4hP|3mK3 z{&|dukqFm*-fYlh{AGn}IVB-+a%~9ySqNSeQeR6LckRDd(QE%pT+wM=u1A#|jjva@ zE| zI+b?O5>oHCDO~&W7a{ol3fF#ql5x_j{dQtVoO~XFOZ-rEYWX*E{gQm`e|ZlE;o3jX zD0=PZZ6UaR--V8cJXMccZz1C(PW#Od!KW!)mrH)fO7?3z?@@X+9`>Ee2S@;t>xV}a zuH)oFtI3fK3Mf39#{ zUS9q*{iL3^%ly{$8{ghB{?zj>UbZxHo`x=IUt!Px0u8S3}+r{@o@ZTwXvZ`O1w~&18&*v4rw*L)<>v=5SJ~DpO*IA>Op8TV) z%PvxKbbnH<=yg3_r*J(#{C$X=wF;+eG^xjLtA0uQ?K=wBariT(m-<+da~0E5xd@kf ziaGc-%zvYUKhF4_4lecg|Hr4jAm3Z@sjshfe2(FIaO3kl#;INC`24n_*YPRqOe9Cg z=gJT{s};T{@%d9_55-PUd=efMpM(d+C*eWyNjPnk$S;&AzW^~TdSxBL?N4}FG->?O z{qr;>XPS|2EDz`g0V0wW8PdU#ajvL7w++tV zi$iNf``EZ?uE)3mlD<+@VICtUiSYaLwTLE1Z&>jNc6=97eb$`2xsaNRHE6CD!a zx?TL#pcbcZrih)tV4Td-60#^0geQYf7#hX?L!i`HEhzdp{k5|3l%_ zhlt;fA;CywkM`U13fKL{XA0N$AE~Z`G+xBGYyTvLYrkEna9yq^Lh$DqC;JDWj8ZQ? z0Z61*m$!v+x4gF~dad{83fFS<^N`wa$D|vzNqQGD?&`fx(QCbTDthhzL4B=!lB4lc z6|Vh1mvQog_H(Vmb$l*YxVGoZ5WJsy9#Z@N0EKJ+lriqs%iSULzf<(uo);Cp?oZ@B zfh3>Ss3jggRB{NH{vvFCejsQlksMn46*<}1r$qiQRq;03pcbcZwFv#i3O`!mm5h^o zeZ9Fz(d+BACWY(k=<7pp>N6>ke0_aNWv4{AzCQh_L9PAz`t*K<>+9=PjFX(Fu}OKK zQ1tq~#xsgum-h`tuglx6=(YVc2cYEIFZWrfUbOublaz>Fx8E_06TObl(-ggKFPA8K zeckj{I%KqSI7{Q(Ns^m5;u=(T??V0y~_icS1eq2%cH_-#eMQPE$n z=qI5pBIhRxpP=xK3fJxWKML3FTE5dtr**v?rp77lhhYlW?fUo-T;2~r{?YWOhS2NZ z7ifC@`vM&gdi_(!!$nHIj)xkBYxxU8@T(QB>-~oc*Zz4(;hO%>3fJ_nC|uj~b_o8@ z5M19E&~i*5!}qTLj|N7G>Rpeg-!iDh^?E|F!fCE3aagVJi&PvgV4U<`tngNa>-oT) zN{;UL9#Ocq=dBPqbS*%M^y>AE4`Bl(DzBD5OtlN$@5yxp$Gz70e6c@l9-?k2~)wT=yr`W+{;zJ?_Z-f$(g^g2YKK z#|7ahE1Z5?M~SL`6E>mOzw6ZF6zx+Y`pwvcUakj8z8q3dfX zk9WkT>ua1E2X%eP{ZrTfC5m4AQ{GcV^0j}?ReH65W+*w@Kh+A?{;5}T=-!t2r$N!{ zdGZoPugiOvqSxj9nWESB-=}bG|AR`7wqL%FKz`Hq|4GTAu}|!OLCMkfzozK5{hug$ zZNI#q(Di>B8G=N(wqHM2qwPPM>0SFrDg0#gEn@%4N`3;Rfuk`9T(chcUett{o)qdWkaBZi&=Y&q{ zaq8>o0FVgR_M8}ke=`IxR=AdbzQVOVD?;!;hTwlyxVH245d7m1Je}8_-0~h6f{!rX zv2m{F;e`s<^Il)!J(-6uWqPuwuZri}lpH|E1{8Qn2zWo(+Q6jy^D!tj% zpphukde32;==J<+ro#0+oaQQ&==4vqN&8*IdIgvMZkdBiKmH2`m+|k}5L{nJkY1rr zCxu9&_Y-^Q4RG*-senj&UQKdjo?7qFN0|P54!(`?>m2+#BOPNI=R~Ia^Sw1c|G)N} z$sbgC^?ZAc!u5RnWrgd0;~j_KRUbnB?6|UPCJxfoC%KI~H(!PGC+6CcfVWaebgI{A|?@2bWK=UR4J|e<=WRJ!VQuslj-@)|R3ZJFq=>AsYd5XS|lEX0Fit~Oc z2P!B0QvAzgEQ52x9Gd?~(sF3NBuUE|tnh3m zASg}Y!xb*q@&x56yk5~ue?rjl3NKLfmn&S`U!`zu|7XlgnYMq2!nGV(E27g{&VLlW zmXoUVYB|R#T+7)<;aW~a;n}Qf(jHK=Fg~-qwRm6c`4KO%Up3WZA_PS7%i^DRw-==rDkicYLl^!<6CG8x}V?*N7WnfD2oIS)Z} ztxbvWL1xeXle!~Z#&kL(^EJW;6Tm5h>w<6@gXq-03fFZ)b6rYAzpvS||4vl6%)#gk z-TS6Q^!uAV`;VTDp+xurX3zd>Q22ogk11TnL^`eSyB)0P_47p%dvyAJCFc-D|B1p6 zRk++2BRdaM_~8T~Q8vWv*?+PwN4TsB)0tvLe}pA9|MfiiNQLWpa<;j;}x#oznZUbStlX+BNZOy&Vukfgv89NC7fx?Mi?3Z;0lJiX> zC_Ik?kNh)T;o}s3 zzQP+6ey+k}3Mcw2`P{tyjJ1O3Mcy0`P_1a zM-}}q6kf0JA%pAz*|R|5!xX+y;k63CT;W$Joapc8`N~ZSml!9upD6shN=_zE3dx?U z6n==pzo+o&3SXq~a)lGU%taO{yg|`7D}1rS-%|KB3je3V8x?*EPhQFXCWRL(yjkIG z3cpt2GT9|LOBCKeVh;#ks_?N2k14!R;nyjAy27tlc)7w`6~02@EegM1;Y2TUg+D8N znWBGQ;XhFL5T3+SxxTOPVG1XDkzb(jn-qPC!f#c0t-^n(@GBHf^dtD(^$P#7qQ6<; zcPRW-h2O65w-rwG@jh-}OGM?pOVRgN_;Q6$Rrs9>zewRkFLNpVp1OM!{bEIbufqSV z@SiIDd4&^wA)ni>@SiLC&lSEx;RXBI11j&&6keimqL(@4EQSA4(R;b`ub3AtzXW-- z&gOGuFIu@U>gCQVkCuD6m&~8<S$$M$r)2-j47+DsQ^PU_VZ7i5-qQuRbDr%sIsb(2&UxE zC@wB88cDJ)t*Dq$xv-+LHaY`VRaKJOJruc@%*)&R<{6Q7HRNe2=ZTZ+;q4-vp^C}R z%@1&If+pNwnkLBsW6mkBn_FHT?b_v?sltVH>6o|>TUIwx*vu}gUehF5krZkpPvBT9 zE3Ye`NAXowH}~@LXysmvy*<#8T!7K8yYXsLvbwTvZpD;n-Q4O+ODbrvJE3HL&GS zT``(p=CT2ONHSY^sPtMX&14h)ID3-mA$GslDDH{Z_lA~4rJ1>S(zt{eFlxAL#dhx6 zsmdg_yX6fpQ}QU{>O~#LXVW3!HEQY=wdlVSv+G_lbShF0qL8)qEcW8Wy@N%$-lO zDfhB9Bw9Li^rBumGxo~L{IOFi=Ar|fJ9}=$88y*zTYEhVp)lTFSRN+Aso;RF^Tdgj z(bCH5OQUm2=gy!BCIn0w=fFd04b!x{DSXexMic{SEZ z&Yrbren=M93qJ%g_tp)k80Y@b<&^{~vr zti36Du!L?qyWT8#>|TGj`x?5fypbhXGupk%GORtT9475WWdsSQp&)RL+DZUea37G7TEv}|1o}HanRho``Pu;&))O1@l z`QwsJ?^I9Sj`3Xy=!Nhq*(^|BK9AO}@@AA&Or0?` z4=dKe^S_|^cW=g{9;p3q6tj3=8uNH}Gzj&TmD^C(#TSbfLdt<3KsGU*h?mZ2ijJH=sNsn}3Bn-b}TU>$C zqV)y0vptiT=oL+SON--7G_N&Fu7n-4TaXNphDj)@cR$aye8}*(7&Cvun~` znPi2>X9dBMN7*~I-OQl7r~a{Rq@A0WRg@*B zjxVpOx}?0~GPKsq%Yt0KyMn?hWOwEDs2!k{#-GeGeUG|#n`j{2RJ`1S=|)oM5>RlR zbt|<;!O{aMVU7=JoL#vLCiTQu=zaFg*`We<$HxJ}dhXgl=3aU2`=B> zF*eiPp5EEXcbS6B?!ChK(ek=zeQoZHiKSqnHSHA+$GB#Spm@ z&#}*T?(V9#5?g~lSJ%f~K0yipm}X@jH^m-$D+J8c z5{E>(FyS?Kk-O%NlQ_Kc@Mo9Yn#kebJ5L&RseSLMaBWYTxpZwuAbFBZ_kqA}WCoGD zGTkRFR+uy1ELbB$w{4M0z@|ibB+O6J16zlf)yDI!qntjw~H?-H;{~ zC;Y;u_a5U8FzKO~AO|}|NV01$xjA{_L&iwd@Q(o85vDiY)rl1|=11#_FE7r|kIt#2 z%Lck%lIXnof&Zii!88Bj6X($*@iXQ;x*9M=X>_NM ztei7rHa)?PE1kNU`daBn`riuR|9da^ zKNDr8r1`hvSjsJVSoyO9_+Re@e_jCp8@=E!2;hIS7yR=63tfJCPm7dW z^04yH4A4*S%@IDy!}x0h_~~68!Y6qce?tKONxk4-7Qp{jFZ{PWfdB1Y@UINuf2SAx zZ2|lffQjEE5A)x~0DgKetnf)5#=kXy|MXt)Z)bk~Ik4$}=)Iq!SMo6Z@}5H-zoot4 zm+uW|etLhM=#@N7{}B2?Ba$9}(tE+56Tp9PFZhoQ;HUShiQSTi**_|PzoHlX@;(_| zetLhK=#@N7zkC-;^V56egirD?{?Y*Z>Ai2lCwUnEROZ+5NAEKeKFP!QX9nn}_s9vK zglCw!8J@!uPuzqS|r@?ImYpWe48dL<9jzbZgKy|+#HBoE_%GQj`z zo<8A|JdFR(0s85^Yr-da82^?4{_W@wg-`M@{Zp;QWj?qMuw%;a@Xus} z3Wbn!nU4rO2|H951rGnMV@Yb_{e{$bo`Pek&n$D+^KL;-l=59jhP}I4zr?TLR;nD? zcXkrymVYJl>vwMvmutVov}^xLwm*+mk^S^uF4z9iz)8Przy2N%i!d3{>O}A7BW$Dw zvHvf&{{#mYe#w8!{BHU4xPhGQ@Vn*zCHRBtZ!4F71@lw+$7A0uKfSLPe@W%PhV^q6 zw}NPOqIou9uKmlHQPvNH$F;u$%t7`q9cMM^`kMeDuKn~LZlZMS@7JuqyZEE;dDYJezn1m8@pDHH?f)>u z{*}!Cj5Z4UuKn+Y*q?cd_5TWG{{;c|ABs37O4t4?xu6FzzhqXb9O2u|%%Zk{Htvi|L^*vBgFo(-?EjP1Kl&+ARKG^oyKTQvNuF-FYY5=8GKMsb=qY zQhtZdd=wp+yyu_Fe>EL5o%BmPLiE=jWeF!Sy=1QcKMv8KK{tDl@|cnIFUG#B|LbU9 zMCq36(W5M**vVp&{6CNRlg3Zxuj(d#=72vae#Wx>D^&b61=zn{>~{)KI^0^U-}Ooe zl~t$X&_D=t<7X@Lb1~v9;y;md8S}g4&m3V{`e1&elUskY!5>uqtz}ljLRJ2y5G4Ag zUVhB_-S%@puGOmF%}t2dZO?k%iy`H|jQRPsr$Qd*7daXG1pBXn`3vKmc1P?N{%Rf#3Mgp_@L{YRF^;ihqg)(J%gshUi~;ycI}oRwuXqYC`nSImhZ> z$jqdl-v8_Bzk~I=Uu=xt~Y-;Li|=Kng! zpNMhG|D}}QDZo}PzuZTo^3(f?-SQ7*{cil;&I_04iDJ&k%Z^MB~z zPBnS!#eRow`vq2$Za?(?XV?CI5sn{+f96;Vv^lsNKdImkYQN^=?%-X<{1iWTVBgh0 ziuJqY${uGKzs~%Ux&EsQvHx`D|4_CFk=zu+Xp?)}1M z@&B&>9thFDe5Tc}{daeO{tsBcTdsE2-<|*RVGwC@+u!~tTayooTW)u(RhEa41;K0>^e?BIO-So)7XJ_OPH9z$exDvzL0ZAo z6u&>mzN`Ne*6)_o712k!J{r^+u-%kiRw^k+OT+RHh|9{W?^vs7& zuANtcKgj>vx%}Gyzk(pQ{7;4G&!(GYNPo0h{J-n}wh;XpY`FISeURen{}1bT%k?Vj z@6P{)aBz_SvkI)qXT~kJJEC9QdM)$2{-4AAZwVpGaqV0T{viLa0ukv$NZ%KcXVvf#C_e={jLApa_t;%2}_w?GRGY6 zbmn*GFJ(oRV~FEe*ZyMg8~-^5Y@vsJkhU>S_CJJU*Z!Y~{SJTC>4v@2w}uFD?f;7T zM_Tgu|5eQI_Wz<^KH!YPmS zO2*Ae4!yTS^bh}@Eq}JnO!*%V(0@24=tSb`|2^w}Kd#B{u(&vSKJ&ZrvwXTGIW$h$ znP24G&irouKf?UKbogC6Zw7x*{rgv24KjX^|DS*?sZOc?mqYZ|o@W)Gx)ge}0Aa zSa<#(d9d}V>;D^={|IqB=i+zCFK2$&|G#Gb?)?89@CW&S>5^ps|23fekA&!-Im;S+ zR5$VeV2J+hORfHm>{yEbO#%A1vwqkAi|1JV4wz7VA{a|giwejqPsbcAfqKdXLdHQdUI zsQj-(mRtUnA^KNdZWSNfP5b>-i2kyht>P_dRu1WZGeG|g^gzb&_04f5Sv z@?Qr;ihgvvCjBf#|MJE5d<^Gxa_jHz5dAZkTm3#)0O|iH1iAYE&idVQjkwclb?eni zO;~gc8aQF@_?Nfb($F*KI=S`_1%FWdt$4sPu3%=ee>?VF`>R>MYiH}-mJ!SIoswgY zw}$!M_`99?F+J;)gkN&+2rhpoDtsTD`TaPdC2;-xrIg>{FZ-Qk)Z@>;LF1PH)DZpN zJyu|rqu=%aN#GBP-|UAhV+Qk+|33}TU(5R4a%J6X^(ZoV)f<%?@tA8<~G~H};)2Ux5A1tlzc&EY>gO6$7ZOI=#sJZvQ=#`NwHu?29~+ zv(MMK{0`mi%uju;PO16;`x)Rj<#+HcTz-Cx!OXu029$q%i2h{{S%E(lLs`D-|8Irp zAKqpewf=nq^k2sM-ExgwWfe|#%H^2j-5X+m1M_$1zq>;0U$`dO{>%XTw}k2cL(ly8 zT!{V+Ym@cw7odM9>v#P(^wFOAFE7W&pBuk5%pcZ&TkAZplKI{F>o1vqkyC%Joio87 z6u((dS`GU8@t}b6-yWhr?~hjTb&f(ees2!Zzn%4OPqT8U|Dd^yv|pJ&uVMX;8t;+S zmhVKT{I*mH@beJ+w=+McXPuI(=iedrZ{1)u`OHoB9~NN$q+!ARPv+y6k)BW0$@Sj^ z@b>{hfhNNK@TaYQ?Z3kV^naiAyX8vb8^2YKTq`vJ{)745_^oArT65D$>QCg1I664~ z3pZFUx4gn9`9kJ*7c$y=lzv*54}Tr+1F%B;^H(IXKG&A;vPx4op->ts_4xEdf6K*+Q1b@cUZ>$bTcSiTzT4Lx%^q zzvVAlz8f5cZv7n&{viF^{%-Y8XMWQEjR5`Uvwla7m;18SPjgP4oI~%P5c~69v0OVe zGxl9QcZS$s@VeEc=MT97_P-vc|5dB_PmaN^|6UEzzw8amIEVSke|gw4xI9vS`;G{X z|1V#&gl90lWGqe&y|bC$2{W(k@0P@!Kf3l$27gff?|9Q{TE?2l{u2W1e*pZ0LBqpb z+^%J;U&<>dn#=FT#d6kviYVqh+d19@ev+By2-w<< z{UYY*ukRWE_x6zg`90)6{u^D}PqCqsd)%~#{I7zaYTCVi692pFUsC^K(-+L|*57un zKR4c8{!hSf;@_$N(Ie#*{c@ZS z{vi7|vi-iY|Fi)6r-s-+ob^XU5$CS{Xo&q|nZG;#*M!)g^)^LC=ifgR2iSj8i2XBJ zzkB_cZKNjteH3E<${yPP&k+0l0Q+ezRs1LQT6SD;{Is$DLlUN%J=dRCGQS%?TYG4K zJ@|v-XJLT-lLG9&H^lz!J+%MX5c@N?+JcLp#0}yr|MME@Mt-^PU0|4s|g|7M8(9a}A9HuFp7mjCY|`iH-pT>f(d z^bbBhxc;+V@0tGo;18<*+5r9ZlLWC}+Qotp{bO0b)L&Tn>q7LeV*PE*NdBjv6uA0- z7NWm_^=FG>&V^s#yF>IZ+y-SxVn6ApdvU@q<=+{ie|Zn}e;%U0EkOT_0R6d`AOKF9 zzqGM_I;WF+d?Wa&Oz!-71M^FHMTUF4HiUmG^A`vs=h@Ej_HOuHeeUtG`5ga_T+#2+ zyT`|X-^9PepV4kTCG|}8Ux`il1uqi)&iri~mtW{bynB4A=y&+D1N2`Spud*&!;PKN zcGi#OkxmIBOp^Qx=I=y=gM;315qm6rayAD3emHQ<_p+EjTL?LK%YQfPclpOMf9-yq z1-SfofIq1I#lM8EA| zlI(fE$u?R1pGD(`-oDrk;=gr=rF;P8)5+yOKL5mVqq7q!FR`0#_wE1DqehuC`D4fC zTl$#;t}ZT}keZSbSD)g2E55#@b;@tq2rDor3cPdhHXO3$U~J?|nkV8>9Pcn}L$J}g z9Bf$L^e6`DnC?YVPHXa%)7*ygZ*u-E&QImM0C^$rpT_xk++$2U1qrGBIO(w# z{lrY7iXP-QzMoOj;+4kM?<&ji8=uU0B64Jb_r$JUDH$gr8Yfazcpk}z#0=39GonT` z;5Rc6Wg;nhShA?ukt3T7zmYc#@I}bmSM-2}t4L*t-dO805!ZWBfD0 zO-_vQME)u~r*K+H?0Hj&!l@;(e@`5d zr*mB%?YE$4v;1$^f<~HuNJVRWGV_9q3NI|YsPJM$ViAy*V{`J`0_yo&yHn2{*Gc<@ zMc*Xg?3<%^uZON$g3}SZUvnJ)!oWl14o2P*l)-bi1u7Lw}Rz zJ(`lfF3o!}CH;{!@6D7!*uN$f9z|>KlR1n^%X%b$$oY~?d`yi81U1vnL6P5<2biFVG=By$;!E-4Im7+fC)|1wBH4b+cQgH1pPcQxV948k>;qeONfmV*5%RhC zPUo(meGwdmrn&d)tFcpk)pb)}X9v|6+&y^UC8(G5)u~=fO178x>C;OqUQB$Jj(faxEFG0%L?sLoUes3v% zR9RikrFE6_=NI97w>6iV&pwBKcd08aRz7_O$cQ_wyv~|h+!fRR=DCUE$DfoveA*@T z)zSLw{QTUJxp~KpsW*osM=$_;`e38po~jBT%Axso8)0eKDA9b8Qp%NOrDuC73p4xu zm<|s+Y*4?9Wf&7^gg~cf(pmUVyx#W)XHFiRVa^rMF;XEmb8fCZM{+Nu6G#*`=3MFE z%xhDtz-jd^qLWBxV>9Qc(D^IP`2)-uvddVNBKDA6+9(y#zv97}jj2-x49@TeR)CYv zokBQL(D@wT@?6gkuy6F1lit)bAf#~Mh3kxd;vItWQ`(H&&`lVec|+=HgR@%GP9L0o zeV?Mi!>>&*9GutKcjDlJ)UO5%&MO=|yl`+fC{7!kdD`HN2?M=s@Xum7^gM@=Gq|9! z@3raI_i0Ttw`fNJU&=J`?^Hn7^{It}v#w2p#Kt}o2j?vqFgP1Pp@=qRZDT&FV=Fta zvCp+>*Q1`zrNdS}PtX5I863H(l@L5$2__$AkpQG1xr8lex$Zqi!=(NZSs(9TyA%}P zP4lFdFd|yYpSDlHC4s^ZiG6KK1j4!vlli@DQ6!*oR zOwx-^#5btLsk{4W<4!`7OHniuI=cGaWc;hCNuLSr-StL7PO=fj@lqzAE6P_+*duRJ zNyVFcBxtW$lxHlORaJKRytrin9Yi89~RVJz_Z*pa{+=BThpk-9xqOXro@_WqDw69u9@62su#p7&~1_9^KEY_-R_hVX3U${sqgjh zU3vO??2L*zm(7@6KDWx7F|B&R-0E2~&aRwaKd&-g=;W|;g*$S?gP;f9d0cHk(4Jjh zeJO%Aw9sP^*i$PPMmrZ>B#yRgBcsl&t*o{I9u}))W;Y`Sg#H&k5g!s4z4l~>DeRk*G%Ov_Dj{lBlm z$6{aXp_rlM(#sVc;Z$~^CmSdcuH|U|=r}Ag)HY6Zx#T+9_0J`WUi&S~Ki4un*+VfS zcK$I0-=c6@4H5c(Fi!SlW0Q6?CdHm0T-z_dp&-4wUg&u!N^ZGkhv0Pz*YbbJxGP`Q z7YWz(PTwq}MEDqNQZD|vUcx0lo^|k}aE=nmr9`=o2k{f(Iv&m^VkE-p zDp&MI2}B~C+Opuw2t*>BRx1R*jX)&Ab^oxOKqT_B?jL?`P)o1-hxLrR^|)2h>w5f9 z(d#(;Gz3poe$(}6*Vn8)T0Z^mg%XuZ*W*bF*YzmB*&_S*!zTVAeoB=0q+X<7C3@}u zvq%UM;o8qt22J+!_Z6FGy%4?j=XVvo zj+4Qv9uESI_!-MSCXxSXb>>SuJno8E*u_M0g=Kkt6-Bi&NPt z5l;IehcHTHuB_DtS%+w5iVmoiOZsYNQ574_Uu1hE*XpIjMzo=U$dm1b+XT&3ct75!tbzB5K7;oui}60;{du3VRlHC50N$r;3-1#? zkoPIu!TW^Em_kqrISh&LeaxQym#uJVgLH;|4@!yXB?jntj>2iYlk^>h6TQ^&^$M3d zBA%NSp12F*c~2^w`e#Y}lVf8K(aSmhDU!ht7GmW8RC2NuK7gQ~!`V|B89h@=Ltj`O!L?&yl?-E{(lhEQ6MNxtGkJ@8#B2R+Z-xnkyHc$=5Mv zl`!|xii#PP3o9yXqcb41ss7{XL_n)%7ZJ**P{M_S9;c$!UMM@_S&FW$EgMFmBh+n}=I{UT$?wv@#dZ zRUT(by2i>)4^2EnK8Sr95<74FRiPoueEd6J^6ntE;eKitmPE& z!4S@;Ag6t~R+2o7|3c=IYYO70r-Fn}@-Ti`N0DnM;-_^G;gdX!U)Ieue_=297lD?N z=BM=v(JOhF{wBlSnLn=={MQHY7xaSvrU3radcl7O^UJj*`JdJ!q}-B+m45~EYyZ)@ zi10}s#=nyJwSHRn5I)Jn`2QH7pVnD~Px3JSCj<2Rz2M&%z@Oa<{#OI|kLm^gwg7%w zFOhOfei$&igw|^s#QJag7m)aJJAQ_2B22HX(8-?i)7m4&$nNsf`c9Dj2E@6uu<0cI zkzmJShkQ{W0Owi!2qU#wN)-PGV3T;3wT5$mk$zr2z@ANK5r`!5YmY3g>{EU{Hep~LeVgs8chu(Y4@5aAW=-F{fyW`qVuhU0tbZ#N4vG9nYsIerQenLD9}%ha0585%|E?2@i$nBnq9Fgh z#r&?lPBnR@;1BZOtw&iEd8~=-KNg#7|Ggplr9sH^)GQ{c|EA~7gY<7;{jv^E`su!j ztG}J~yX88)pVioDEgO*Qzf<9-Apgx`{_gyD68MAc&-Dqr|i2erFFVBlx zY02Xs{e(D3|4i0DmJ3Y&J0U>-i>%-E-;HeOA)=Ub*MG;M;|ucNO6Hg6ghY(%&*9(? zvj5f`%dw0Z$^OyUT>mWrKi!|<=E~Igu{#qAy_}F^$*&2~KYW1&p<#^j3@}G)0*%SS@b;D0}qmz65!5;EYfbkSR?)*h=4(fYdWQQ9+ z)y(huKZ|cJy7X>+%mrZL&uIV!T>p7oc&h&bY{D<~|0CA#+F!u>i zCZzJ8j!pPQe?Hc)sQz64kL8=_LeFC2{BnFO=z{#eh4qUb(qD>Az8&Satl~L zixJq^N(W>!rP<7Hj}re04@$x(=Pm~w4V6yw_2w{twh(eI_6vLi>v#E=GQaPfaQS1P zGyW5SoNwoX%e%kHe{?M_{Ng{;_8eY1+{hE>?S1XZsmN$b?($QZxnm!3wCzv-J#Q+< zp*>3YU5@v~P7wdh5tiaE_Jh#7{y#o{^vHbkRwnz;zNty?TSVU7H15O`MvgV7d;adG z?A(Ob0%J&lcSuTB3ZWCQQ9hA#pYsyVPv@MTYdHhknb^v(QC-lrE%8#_kbkFPqxFn) zu}#ND=gz}+KDG<6U5M=>Y!_prb2G5b#8!^&5^NRN2%m+m65DKSmtvcPjqthHzK!iN zY*pCiVXMYQ=W4LkV*3uZdTf_tTY!zu)nS{DEsAX+wkxn*iH*+Db7_mPU4^X)TQjz6 zvC+BjVY?bz1GdH3uEExbjm|B>wiH_o+jZDluw9Rh&b4B@0o(Vn{RrDF*lxu}=aymn z0k#{l{Sezt*lxx~=YERq9&GpW@&6$I8MdGE@e1U>!1hZ%rZvjPu&w6f$C0;TTf@hH z=KL?5Kg;=FIp4_nCeAl={v7hZ@&5CizkvKj-rvIcOUPg5eOU*hb;s8j`#b0VK)#jt zU+4S{v3Xe!GZB4$TS5XI`z=ezrT(}H8PR_9nyVtu zTQ_lL3Q^Jdb*bhP%SJ05C%?OFuzq)0{lF(?=gPZtRyV+Sybq1)%e;MPm=P2IXY|{5 zHaYJu8?4`5R)28kx0c1<#bxA^_4G!afY+M!+TLu4`fu7x^7p2_1^;DxNq#r>Cf;Lb zY8ecPME)Vpe41lZm&{@!N-p0k6A~+B9_Xk}AATY0$oXJnz7aeDCl) zqeR6Ir2fCrA5=b{-tUJO$n`e`Xlkp+y8%sM(nrHbmY<#WvVh#ML3^I$mazI{M2FRh_LyZh5Y$hnu?E zr@|XL_TXK<`Cd~>Cwp~t;N6At2Dgb>c=K2`yH~MV0b*=I}YQ`$p1Iv zP2n_-sKTiBR3jPQ2oB zyi+{i?Zod{Dt`AMY)fLVN(8T_LYM;?-laACf_8A(*YOepd-4GY)2y_m>4@%K6y5lT z=*E9U_X-o;_>btm%S1Q+|1Gr-sJ}4(??_9>{@rPi@r6XWah3UJ;$3EtX2rqjoWrg< zlEyDROHYhnsy?3OGNC5Bn6IZ*dEdl*{j>?zM&i*|v2+}N^ZE;ZYzJOGzt$i3QQhcB z(?+oPu?4;#JGTt^^vEqswg8GOp@lcUv4PH~_^qp`f8ibvi##9sv45>IgeiVx!ZVS5 zCqlrP)BO>f=w0O>`H`=$SyW>o-zHaANwnbC4$D+Q~XUI`u+b3;Y7CHNC$1(6?b+#EZ4*9C;AYN zF=1jE<Dd}5hDZXHUx zuHkX=4m>t-dUUKmVk6n*x13oDkwdWWv zfYc2rpY_8wzyAgjy21G2LH5JCxF5E{47S3X}Kn0MWOLa(|13U4)E z{Qg$h?#HI)6!@{y9KRIrxi2fl-t?xn=t+?gML9DgBT92>BO`9gX#izp#2q=yOnz_9 za+Ci$XQj!1pVMaYKju(Obb3enaC{@6wJC?Dapnc`>x*(SGeJZz)z9)?tD_<_#V7ne_;IW`gzNG`EGqbRz>glH~*&QWR}K0hzCN;BAmf@FZ^#z z%qWRH6=~W8<4RhF6Lx)|`IxX98{NmKewGU!`QW$w?LUtos%i=Gnkw>n*0-zsz&R_hd zw;kQU;wQFZ?W?IR(mWF?68-gL zyyJf|K3XvO zPtCg`&D6WlhXsbK4-1TiVWqLH{^BRM;%xl$0tx+z`YMU7>;78^lUgr4F10xSpMLWz zk>;i3XKv+G-jbB3CdaBNy0UiWZ?@&lENP+F?Awo6M4Fxg%jDRo9BXyUnfO`>9ZbmR zIKcWZ^3cAsW0`(qTdLo$s39xff9RXU>0kFE7LeNi&*`N%c&l^*)sN|scEzkYnY8Y26S&zOv2Btq#+ zgk~a?uE9}KDE$LqU?|~chX*@C?m!Wv$g$HgEoK)*F$ImtN+vWHzDrCc^)SzZi8#!+f)OE_z+16 ze~4tT30w)-OrKs03;*B~B&GIiB=V(>_BRspC$*Lym+FsOvtaP2_x+yltsCLoJmaouFv>62|z8-!aX#^;&AK5JdA*nk|f5 z8(DHR7)n};GIkcD!;Fp3oLv<2+A9)v1eGy5vebTZ1pNl}E=ivpA$%}es_9QVP9S}{ zo%P_GBf8Z@FPI!VHm7}myoO}0t-|~>Q*?t|) z6QkdH{HK2p`R+;4(2d0@yO21;;Zw+;JYwMz%Y~yutu;k)s z_qY>#$Kz7o!gJ~CLs%T6m9ep%r%irKUo$bnmtjgV%4CWJw>I%I}YVJWpzT3ix}GC2iD~ z$DV_`BG(X&v{TFpG1~4b#RM@c@qr$iykZ<4oS0G2$9HK0nOz#&DfLgYARJ?!;A8sW zXGEGFL`B)qp;L~C6*!r{c{P+n-Mfa&96SQxYC+sw$b&CuggSmH<4(-(qp4)$lVd?h zYIe!gtZ+ua^-lW)P_W-9D1+<&b$DX8rarU~6R$7G&kB}*|L)4a2vscddpQmk=YL9} z8Xc7g)7#M!Out^ZIvW*7V@vcvIHw5*IE>G4YPSZ&rk}EfW~RlMiDPDp52dvnkb~&* zQ#L1}BOY7L3ut@@clbiYc@G>;(}Uy4w)h}6%<%;!nY&~@v)G%>||A38)rn`o=x)V$LG&X@409vzG;j>d~;gCtV>uJtgxr(`necZ{Gz6a(jzm z<>|YrevGcNHhu1o+YxD8NpaQ)0R8eIh(qJcU7+s8`=h#>lJ=l zoShnJrsXP{N-vf6(#!VP{sQboqipX(s%6Qboo3O}uhaarZd?1+6my%}Bh3SFuKg(J z<;fUbj?mMGOfT~{%*SZp&1ip_g4;}1PupgZ4M3b0A8Bg*-1tXXY}*>B$QWX^Qg?moT-7{_HF z)4bV(abGMiTwHa=FzP zdl$EJR&q!8*c=LlRwsW+S7*@^9hau4%7Qep~1Zuigydl5MNWj{qEk|qdGAtpP$G7lB z#%3}StEa^cMJ@FWMX?7L;<%V6EUV#Y%wFCt+?3=6Ifa{=@nTYMT-sW>5|@d8AkL2q zv2bcu)>fC5mBr@`?3q&jQe;5+EzkDt+k3$y7jjs2_R$|%@B3?ZqQz|YW6#pwi0wtO zorSTs!q2u8Mf|oA&%`!;_EN-urg+4TqSzNjBR)5dvdX8gNKACPHyD@J1=M|ALfu!( zc+6NngllI?{qr)ezt+FiKiR+wGO#)_7Cw?&Eks`?^fF(9m^f<@tRJx>NT{5d4tB(D zY0Gy>zbT8ITE(_Upt^P1(lt9$i&A!sYbMIl$mBO-#Y+oY24QV!%2>bE)V$x?ya*=? z$Gs4{nRfihYl>;ai7^V|-`lk&iTI5!1h-%z|3 z#Xd#pjO#XW`96CowgC=9G2z+LmIo=m;rfqo2jZj1d8U>y@<@B4wzITl@=_yHBHzRi z8V+e#jY^ho;2jy61A-n4#58CIUbsX@b-z{{%`90@zbf;*juY*;p~tNrtXr1G>Q};3 z<8fc*JnkyYx&_K%o=!F;G;V*w?3Up6O>E5w>FNA6pJ$igzC}swrNR*#sA(0&+R(b_ z$%@am%%Q1gQKY0Te=~n$bULbk<@vbGh&25Hqex;#`70ciwp6YRnzq!RFuD1yNYhe~ zl<=Z%RL$0;qiw$w1aN|#?_!mvPfnaXVvMJn!Hf|r{=C*!8p9|+OKuq2;*-#9h%w}L zPCZ;`{um3S^Q zVKtSS%Q_SpeuOvnL7Badti=5z_kIl=ME7gVEj`o1_|wXK(|0wBOcNg-%1Sn>3vcth zx?0(xpR&XoCEBXfQ0YEMnQ5v_MEgF~?g2E1FC$AE7Ui7hMVjeHEE0!)i~BY1Q%Ym6 z`>l2vo7$YMe7Iqb8o-YsKQunMFtJV}-kHQc>FT<2wh_`m9yZsZk9I@?Yb*;=GBU zt_M|pb*Km1FkI8sNhA%su_mA$UbUbeGo;I0z(<4%i?6|1yw-!Gu23Fz(vtq4oNDR%y$a$+*E=(sFTT z>4+!%O<$I_o^oi(xPM%Z#`_;!;FZMw=8rq#@-#noL}5!`^xaoa!VUYZlGbxm=q4^7oCc`<5_Qk54 zjjyAQuh`apu;s)3c^m4@Pe)JoThBr;(PK0Bpa_Xz!WtohsfwP3bAqYJ8h%WvFDvA3=Laf9)l0gh4J8Mw2xhH9S(WJ`@`rpZd%*4Inwkdc6%^QYyCeH6s zQ$q_m&^kapZ$xwCmZ>>IXm*9Wf0&$M!i57L`(E?rh5P!gr8z?gEo=OuuOB&MO=(45 z5f!Q!9oF|#(9x9OqJUwxVgzNwjOst{O;eFK4*%5;lDevnUz(@%Wgz z7LNeqV%{(X)&vg@J@9Jt0jStsns#Pu^tjZL)^oU}oSY%IvEq;EL5qg-w)mK-cO1z6i#)V{{CTP;@H`dI&)Y|tW?T^H zf=JU&c)ka2Xrf=>$Ahc0IrI`YV@~_i=-v|Z%a&qXP_6O5F_~_sM4CEi$`*UZkNwI2 z>}7OBWgUYP^SNiKV|=*ie2jgs;YM-_?wcQ9|8_}h@lFh)|A{R54KX7C^H8t5{BbWu zu05QB7vgZSnMZ+$=WJg_&t%4>v3{gzU1+#Z_}V$viK<) zlxbBqiW8xcf@0I1&av(7whD?uLVjfTbsZfn_3S>+)T1lU_$69Z&e+pihHR(Hn&G8b zlJRL>pn&f37hveZ!=AXx+_a-~oVoSmPmY}S+2od7bJ{%V^dHm@PDYlDfHTbnkm00G z$izVNE4ccLKZ0pmee=E)iMZ^*Z+NP3fe6|Hge~G0{gh#9!6n8waBZ;(HzA*jG?$=f zFs4ywwSCt>``}?y9bnVsOjj}n*9P&n*F1u*6sSmnJ<7?ub*1(^Mo*0AbUpSA-E8aP z{_QVuUdGcdtk}JW^2T6jG``QpPFGKv4aRw=le-Ijk{il%fCYx~nRKG@?f8n3>iF7I z;b7A)gB%=bdY78LeI^eMi{hz!gi#FgDBzcv+&J=aqT|7^eGMALGJ41-u+}0?KSPD@ z=7Wq;sykz^2_)){aJ92mCis5Ke5|KXFp`}ZQp+&MESuCi^*Foo)P7aGy%O2j;6hiB zedx3#GW10=T9SRtk{>-FUy3K%M?-p|?HRk^bo(3+=_?Ske806%+3Br==J?|_L>gD2 zewR7p38w!4Y`+U9O2=)l>r2Ud*ivx=iosMcVp~xndrsnxy+%sI_Yi4{0br`*niaf_atc6o6f>M%z0+( zB0QFgex%F{ATv<~C9M-tT)M_vjHAdy)3O`iNb$dEpF^EU1hI7`_7T*Q#p_JJy*bjH zixY95$8fXKJU)esHX7u|;_+!9^pJ|}aaw9KRCHueZzIovKK~gvPx>reSIu)P2z%?i zeP~>z9w^OpaN$p!&{GM)UjC|wUZ$7(NYk9uitA|OWwYvMI@}*n(`_x|+0z3!ayyo* zh$8U>ihWeg$Mn-YfkGeUG>=Z(X{~iRd6ynOfwOU`jRi)m@wOKA!-Hhxd^AnWuzXzA zO=>;hR9yZ|H@xk~%aaBA3F`%Lzg!Q?^VJo=dh2p5r6ekMCqt3uq=?7; zAH&>ZII*xwv6;xqRH<&XFM z##e`W|Dty!tlKXgB+u?QG&aP0cz+__y8mgfAL>1LKp*^XJdn<|960pGA>L08%7F4e z9dzbjp!VQC`2Xp_=|FZKJoLRoy@w9H1&wuld38l)m3Pwdb1Q19=O15T4s&a(FGV+C z7J(5Le(a7M3R9^zKXzfx%+gqgIhHwR%VXwO?6KyppcF9HOh1jH>G%=JKW&c=Fm26| zVjhQcrR*S?R*L%rcSvb~4l4yWE3(X9$37;g;&XPn8Hu@i@-MJkPQlZOA-}+8G4^&v z$LrEcI_~2Wc03oj{R6bNPMX_ab&)tN{T4uOwm!BMrlEADv0vvjVAq-&T*|v~=}IGP zw%>x%SVx%0?tgDsOIpsrBf1x7nCtp^)L0*pXXvpUP}u32`?Zm4z5$BTad>WiLqX)m zb*1Cl@zDL_!Vr153=iFZVIR=j2FpVC&yk%|w7qGM)X`4{NAuV0&C>?5DdVn=7RZiw9@trj3oBDqy*33!%2}PzXJ}Z z!F7>qzQDd*N1}bsG*OFd7j&tga!umLsZOxoj-@~!Kg%@z!{0ksc>MYMzmUV(R6jTz zK1wG!rFdv%9D0KVS&^npl!I3ix8J}F{kNZ>PM*H)})?!>| z*)gFcGT})RS;f=m&-F)ai7cf>OSU_8Esk5`pmroTj&7 zrr2$M(8o_Y4DS4V1N|DvKHos&c{jcI-PAC6RysR!Ji;3{L-6~d>3G!6KCg;lr3i}A z2Ve&QhIMh&|MbQ$GB7I6EQy?f=Mx)urbfR14w&gSpt%7c11}n-4AOLAlQ2i76rIOw z>T2D#dne@53P_e8!y_B@5@v!g|7m(y=>s7bI&)4Q zrZopVjN8XhspRgYqSG16(t;l-8u@mnWB0LMVGolT$dtHaP(@M&p}BrE1w`>jQ>=Qf zKs*W<`%u4@fQ^gN1!7;nWjf+wdPWpol&sn(92&>Ep0~0@JMU5VNB)TM2S4Cm0e27k2HM`iz+=>!s6fIQiF*v5-q}Vfw`~RmHgFM#n?^xsrGugYx`-HWH;si zf9!n;coaq2e`h9vKrj=)BP!~EQBW~vID_kvKmrp95V^z^4MQ@4NJwHb3E+t)ATdN) zS6y9o7g=51bq`$cV>O5%u6~NTUh9Ro5nb_IbXETETV2)jo0_gG?yz6>l!%E7y zm{u%-{iv`r6QeQM2FNs^s5an(0e0=mzh1E~2(AbYr6>92a< zAc|Lk{mAigUi;$>JgW&+)^kryyMAfX%flktBG9#%@2a6VM|cm8)wPpg%8XXNpn*KC zR^3fVcS~Vc(|zeTLErpU_w;k=KGN^ggZxjvj-}80vU~YibYIGE`KPCAUs{P#>EYJd zP=5J&Y69MOtK8|NL9S1C+kWu>9`sU$$F6_8m4^mjJlMXZfDE<={9^RGmUG=1{Z`Tf zLfq*0UrZ8R(u=-Sme0?=Ug5jc^X1Eyn%*a)0#DsszIdOE6!YwYHVN^l$}a1>Y4eMy z1VwG>HWwE=ALXwqc3mF2h>qvD81XxC_7>6szDxPP9mIrRu-k>y-a<-+l*+mEr+FB{ zuX4@FQgpPFbU@c-T6x^sL;3oxMn8et((cOpfugNl$@L@HZjX-Lo5W_$?_O-f+e8K4 zE>G@qt9W{q!2IYWqEkElV+UznXNxC5R2m+oKL(-2;Zn-wXTKE>CU$YU=zY9=%h!4@ zNwCXUN01uLZ>Z5cg>o!fvZz>6qq%xt0=Wzg;Ow+tZVq-_%#$m60>Set`Tr25w2De| zqsU;V47I(fUd)rltFy#Q+uQixUHBQr=FhqE+U?N26z?uyej#Y>eBp9&g5+UmDE{$l$JNbQbdx94#l%&vacwQ$G5?hPywro7Q|TBVD)B(yr=P zXnzg;SHp*0x7ziYI-Y$Zhf^-7eUswFLT%%uc;B>R%7DPv)b!Ir`mzCCw~8jN0QODd z@Vsk2-6og&R*fXpUF~F)vzY8_{SDcq+CzO|Ilt>$Dj0(JK|j&)>%hL&_vsS_X`i<{}&;=xdD zWlgxDv3UBd^1#?x5xNXDR2GG6!jW)8$*fW3#T4RYo8^xyst(oEE!unWw*69^!31HL zNaxte{N3~J$l?;=?w@fJnH8n0yh{>iOQ`S(os3F|gDE%H# z*AqkCl&xs~Y5a*88t2LX1OCqg|6Lx)pJZ!3y}&+?k>?fiyz68er{k1KlaBX~n6t2{ zHqzt|1ae2^<{dk}NnDOPN&-Yios9U7Vj8ndpTqyR(a9K1kwn;6o>R`9X{9XBN;!By z-}H4fR_0O45P6SzIWU$dV)Wf0d1kE01rv|n2=5Pc{2eR~v^pUI^RBd`;(O5?W$Y@6 zrOUIjBjwz(QekD^>-o;X%2rN8j-=%-k<-V)Prnm5LV@iOcxh(VYEM=F%=GCQvoh1g zcg`0u0R^3Rxea&AdxNCWdGG3hm(zJZ`I*CD`y{@(%ioIPFpYk~-pQF+Ydyit?A6{W znf}uLnb{?oSraqUi)jU%Wpuj8$dgziGI(IWK+@N`>O7rv773lD8LZ!qv;L7pe}m+0 zbLCwUW3QiRo|5#l6urog8p@Ag#&pULrrFg44eRB38izIXi}%xcF?yN4C<*!;qK`;= zE{oA};~{6HPtBN4$5S#ynY$qYI@bS~r0Z1jV)E5{#SVQi!{R*5 zkrlc(dALCGy60iYQ8k0|+)ujJNqSQra-F+N(k!NQsQl^hlw@YF^%iFOSEm+bj%Z0M z%FOewO6i|DqA1f}n3+9Ml(JJYnEy-3|FfR>JD9%&_@`yC|HcTVrt)!4Oq#eJrOO7b zAH_K^Hbi1MvOID-vsTL8L~$7v?PO5W@;}&E#oWet>Zp{=CzpwG@|Yy%4-1HBNYHRe zD$JO_l}bL%QR(-wq&u7d5v6i+xo2W#c89k()4!JewmPjaGq0u3l+1M=Z^Y9-Gp{gn z1o@O`YzIzNI{8mtIdrG9limi!@}`xAa}zXKh+X>gC=mJk}V(|1N2sr?a3DKAW^p zpUGEvFHh}Ao4mG9OJDB`p8nJyP08>+o06L)%H9B4>E>`V{RH2DK3OE(v$ju1+U2QN zc*_XSlQgsGENIAwap|G5=cH$2iuZOeC5X~UzQhDgW?%a0$NzW7VHN#^%*>4`n5dP6 z-zI5ZA_Ajc^kbQ))}Ym!LdDv}p5hG8X1YPfYlc!YAii}uQg*K6XbXYShG^PLGuNk> zbg@VwlOHE=NTmv3lqu3x#N}g3=8hEaxPGqo3z>eB^>-kNxLk7IU zfL9vuDg(aQfL9yvB?i34fOD@MAH3pAv2OS|@gN~y@%7mFTVC-sSvR~X9u#tx8E`cs zj=k*_U#N}6_{uB3SnGyg5DyCa3k~>61AegqZ!zGl27I*vztn*9NGU#e#n*M+@U`(E zAztzI-S}Hx@iksId|f;!5Ivym%E4~06f6HrK8xIQl>kPPtsi4v(Ew@LG4M zXw2Db-5GPOF1*&=D(alMr}Kau^pw}S*P+9R*Sa4sow(O}(21)E=ZFX7@Hj~Yul10M z#+<$4YtS)}xbRw!#Dj!*txX1evjN{?z#ospw-W-N6SjC{{zCU7;&isDxZT&)&GasEpW`T}(nkTH8c zJs=K$QPA%bhwl+M4T`mJfS6~}<6SKrEpXk-mNix212t;;KD@x`3uan4PvCY>qPX>9S<5g9Dv&n#A9$sOx1FwH^;I}x3dboDjLD9Dg{5u6(ei`HWU%ZzstImMG zO1PWeW2k5j^OQOA=gHW40*{V+m7RYhe5i-tXSai2p0mjz!#wfyiv%7W4=efi2>f)( zZLcBnMH(f1s3+C&gI`k2B7B%9o_>SCqvK&E|1*I{$Gxf~Wl|M#^V?wtd<@~kJn?c) z6?jNmXRkZ*MXf>31%kfPp;z`?YryXmc$Gu1O3c#&uXb=X0)B^Zw{&@_0K4JG8Sv8x zALfadUnB77IJ`|-a53RSJzqQav4v zN5}0-&Idw{<;W?Ja=tOp51^)enCD_iMeEu!c9_6h9ekUNjVFAlC*6^+?3^y>FLmfu zxvDeZ>jZw8L$Aui9RlxgaFy>{4EQSoU+2*Cx+jOP2p{Sh;MiFpP%1mrMGf=B(~lJR z&m|SD-AOq?fnVd`Du3q_KFD*OgH!bpp`Gw72aQJV7xdBbxmw$N-9Z1fppTB*H%Ug&obZ_81Nemc&7n>(|}vlwY%AK0O7+t8yx$2jg&(<;Wv4n zwJ+#M-Jb}5G03@J(EpdDijH^&kWx4Kvju*OL(l8H9O?*nv$M&7|Az3JJlkz%Ix0KA z5cpFLF2!4uXvjjh;=*jghk0&uaOH>V4EP&_5Ayucq31PY4g+ZD<0e1PfKN8y(+v0= z!UuWow3X43#|<2AH_$(8z<)5{;|IIjUu(c0H{f3z@HCp>x%p?b0k1OP%MAE62K;sd z{-OathK8hrJonqqr6aGQbC^xIoBc}+c#8r5lL6mqz`ru!Y5Tj|Glg(B`|AlG=84Wj zd5xaKHi1Xyo4jt$;Rl2Kv;*Ar9!f3zAkP+?nU1_x&SAKLezF0dZ@_LbFh1^$YID?9HO_^S>+RmReXusyFixJvJ7 zgsZr7lOh)g`ZpZt6d8L`;BPv(;ysWiwnIH{Ik>Fu)-eKq+rgEcClaoBotqRX6ZG#o z5Dk+=2nqZ>2Ul_$1pa}8D?2*{{-J{_U73fnogX>4vePf{oer+#j}rJN4o=;W2qgml zr-Li{1p?pY;5jn3M&O@0xT4=E@Gl&knimnC6!@18uIS$g%oYpStck96u`@nH^ppDV{l%_K}X86=|rhT~wS~QCCxG zVhP|z#qr_tvQTv`@e{k+p=t{YjGGd!4L4L*%nVo1?$kv!;gag&Bt%adRovXIAw&>k z^{mn5OP9vjA=#&t&X`zOT3+7Rw6MIS+~A3xrCGV9lLCAg&4)337$>kiaTK>Ei0CMB z9PN1UN7%|+G`6_eC@=Y~yWNXRdM9m+IDMmZ%+1(c(Rj<*kd2_dI~b9Gw(m8jIK~jd zhFrv@vk(eQP@BPdk2O_?iJ`_Y5~z}mm~KeSz0tDl+ZC#$f;VZ8E@`Zrv^dl-yCGB^ zvG;9{SNpaLYijB$LXoNQUc#S+oV$bH_$ z3!UoVMqSq!*4m^f{f|){sd2K3PRnfwSLK$MFIv95yq@;r*VTqm0Z zsXIPQW*>j~Pb+K6nwL6B{xOmeh~|3W$B>uTjl5p8Q0!r|7n2uQY;<1ovWmL%T`$CS z>$>Dy;~rd>w7_m$m$a-z&Kc{5I!n0{?Qe;!vwKYxz=5*Xm zp?ps5vg+E(@|oerrln!0kZBzq>dTi3Rq8)hE0@mMc9 zs&FICFRrb$2Y3!$)DSQ{3fd;i#?OHrugeZSCJm}Z)QLd8-r2_X`siG(Gl(SwiPDf5 zbJe>@h9P3CtQgL2?Q_zFy`wC3(ow2YbBYi2qgZ2P+oCbs<9tVrB7)Q^2ntk;F|mmO z<&IF-f)-PC+{zEy?k)i=Qsn@pIv6BIcXq5d^t;g%XhkE&HvOKPS%B$E@_8Or9if3v z%#=iBr%FX&4AGrNtwr6kZm8Xa&!ibtxOk~E0#Fji&8e>pMPLBu#ymGvLt{LLS0@Qj zE$0E)B=Prxb`u;OUMWpuW-YE;7HuvR9LS?2O{=cuabt0HbzF+Y?a*@5?Qw;bXE!xQ zX4i?4cP)*JMMEPRuc!(d{n0CrJdt!UU=$fJxq5lH(x78Zu(}c*v^QgOY-#pF&X}T5 zB$Qv(5Du5t(Xf`B#=|@1yTFelxwR66=XvAs9Egu3>2?Qd~B*;#{)2c9~PQ zCeS3up7e~L8zm|Wj4m&44wcuCP34i$B2!8ep5Mef(C)sqWcEg$?Y8p9NT^~-dBx%- z=&Uv8ADf;TkiIsBbpW7_lDIY%L8ht*BqYr=@kx zVI@dc8`CEyy&A+)W2^f3qUy%_n$U_es?aqvLy_vbXpML6KzQ8-*Pa|h-MXVu-2T%1 zySA}D)IcrDM9Sku4RuYmmC^RjRm&)vE^`yfzA2=E6V3BNjXZpEW|gDM!nKnE#b;NM zG5Hjq6LTI*7^cZCEwebUBt# zm!d|Do!CHAa5hXV9f+%V)4J8geVgF3wb>FuUlb4;oiSg2QA22%XtS#+C>1vKnCVS5 zHPM`n@=UI-sd0EjUuqH`7{&5ALt^RGA||DG?BtrzqQ(-6O%NGZQ@yBm!qQOV5<5fa z{rE&idQ`%krdf4Kn*9pq!Z<6h{A?xHu2JOum{CDod5x(8V+u3WpzV&>73b4-piq}sT~E79PRhe9ILDg(Xz`G-hl)G78T zkV=ic@HUO=kg})PE#&_S6*JRe0gYLb#q`8#T%>3 zD{4ZGjiR+Ludc1C17_E5Ufj18x)xrkxVwANtd^Ds;)|sc<8ntT{}I+>F|9wAxL6+t z#*@EY9BfE~Y-p4EgBB;R<5sA9Db2P`GJ}ia5mo!3Ohng*WDWvgN_5gInqX9XqI)Mz zCR)zyqZJ5Nom64fmVQ)8)nS=hZPg@ZGJxsmk_q=uMQKs_ zI}FlwHKex)@M{2H2srxxY{1cPV*y9{Sq2>KypCv;owS`x1kPWyf271Yf6@MYz)>&O zM@(0}fu7q64lEz@eU(6M9MfA0IMQP|xt?fLy7rUwoGxsaO!WxcD@@l6(2MwgmtM@r z^<VB9DIQpRp z?8NfJZ950OeE!yk<8Vwbrt2}FM?bUyj`ZjU?5BnS{nZp#SY+38KOZ?GSbUcJG|_N=F$qAxMfmr0!IZv}e(+$9Ib zv3U;eMW+4J#a%iE0xfBtusxBVgCvHXvbIG;8^xl-kg%Pp3} z=|I08=+BV2PG1E$mcvHC(Vp`F$MSg>_!H@|d}4cr{XVu=Cy~t@^!BI9hU4mKvg7%g z203Yf-%D{-A4>qgA8?*~a$q|VKV6{lIL;rDUiC*ThsPL7Zw|=$E8yb*e;9D|+arKu zzt#zOCB-?g-c9sVdTSV@z<4M96t3ROW&BaVxee#QINEufK<)PMF^VfWIA7ZW_-R1D z74WkRxEkkhaYXqz{zUm5QV!dBA^ns+_eflq!!kKAj`sXrpz-)?fTKNMOPuvSK|iH; zEYz330bVU}*83#j=K=l{;Oz$d=YXS}FD0(qQ_2b{FphrvE#PSXy9PY$6=HHjJCenVQKhF|c?e+?BY(G(cvh8O-DWB7Y_74X98H%g&qxyZ_4~GN&(?EX=;OIAe zo`Up0G0>ym(9Z3WUN5(A1CD4W{~ZhX!*ox{IT3IiClmwT3G@|!ZvuP?;7ET5;Ew|Rc8T)|{qqUXWBvUO=+XaP zX#WxS0gm$X4EQvOv)@qfe4t196$ZQxaMZgRhCz&JSKGXN_xi8o(}=X^zIM+1*Z3S=ohe``VG_Q-T_RQ39)&8EP;l~gUhqE75UFSmK=CmjGWTaoztbCC>CO(@)923h-9|e-QA0 z0M2t64lL(Y`YAcw$8pf}<#iht^ys%w0cRQ|=Lf*w06b0hk1QYaWgzsMDE~mfJ3-D* z0p9_*{lBMny3igqFXQy0J(n2lxg6x9J%0qe6ZAd}_*;O#4mi?#*Z~ySo=*BHza447 zF9ZB-puYz2YXHAd;(X$=F@Sy??gDyzexbfQ!uDW#cLP1jPl5gs)0+i&C&^OjnrOh= zB+hEEUR(q8Z-X55y%4q&%kv{ZkL7tQ$j5f(IiSb%b^$&1v-~Al4s7RB^i%2T%Z5>ApFh`d z)o=Y;!_~f%+ckU|8$sb-4G-C{wOPZPCH{-80vzda zyzw5$$9d)ZfFCdAaC$e;Px(Zosbx9Oc|2an_6V{VTvf zpt$mz>K~c@L%U9vP=2-3!v`;e6VciS2|>{sinZ0AnE-voN}+jk%z^EZP9P~dc7z6>(phXRiB z3k>+_66X`@T@3W7x6Xi{2RQ1zT;hDfcH>UKQEw;UNdFGtNWTkkq*wD|_8Z!x)`yu5 z<%~}wfP(Jli3a=>z)}7ZiR<#01CDk+4LH`9cLB%#beF{0PHyx2vC$O1({R;4rT4M# zD|*#`?5p8no6PcSxazk?YPjlG@-@6p$|=%tRWHgk{3JMkp9<{&;>Q5aX;Jda z07tzciL)B4zl#lc6X58#^&lVZ=``T^>@W(t-<|{<{ebIWI6gTC{DbLI<%Msfon=C6 zeEnTuz;XQn<@`a?v$?2uoS~eY1Nf)Jqw?iiiR*U$7I4g$dkpx)fTNwyN?iAIF8B@0 z^Ys$f?fE0%XwP2__!hv?o@@958YfFpgo#C1Eb103!AodLfCaJ2JjiSr5d zehc)wARiZ{(FFy*jrseL#C1EpvVCKEOz$9Q_t5?W4fqj&qy3W%@>RRada-`h8{}MO zkn>BRM>}sZ;C}=h?R>%@|3$#j&f$jj+o=-Q{d^|iXy;M`-UK+>x!!<3EO9*_p9Xr= z`-%a73vkq%l1>>#f#rWfKh%8fTKNG{oVDR3^@92G2rN*Ccv>AwgUbHsZ#l}1#pz}9N;MD zeTnOS*bO-PAw9!R7t$$m9A_Q}IHqen;MiXm z0{#riQhu8XIIbtmG2mwcj`Dv7INGxwaFlbSwww zzpErY<2e8Qv&3~dY82W^;;`4zX^{V}B zY$xLO_u_2-d_(t?f7Ejmre6#8TxO83zW=WKVG{9jV4Quf(sc@h6gXf0LO-QfJr`qo z&O1fV&oVeL{gd=l_-`1b!1z=2Q}|sBQqb{-Y&cHNixOwO*uEVE>HUE2DfvZ!e+>8> zz|sCQ0sjK%)pIL7UG{hO;_bgq%F)wx6X56{HU8JrB^*F@F#aXj^C}CbpxdMNhv<60 z2YU2>nryIiIh7LE?fDzvxDV$uz;Pdrdj7(4I8Rl+yv_gxK0Qi5h4)Eg)W*5ZQFtcc zTm}@rzr@-81%Mw3I6luB3vxCA{fU61{9=$30{S_Cqx?#c^H-q12uRA%LUaV-5INz)^2d;=0~t2K)h#vk?5V1L%28UgfV>j;mSz*MMih zc)J4d0|Cc;nE`ku(4PkK{|Wd)!2bn!9pJkGZwC3;KCcG)wLt$zpkD#_y+F@>obtma z!2b>SHjwij;REQ$;Wfb9>004xp2Gh8o_LH?*%zONSxcfa{*89M;8=0U;2RkK8Z6umIwa+BnPI) z@;TCgH-a2&2Yv?hTS%7j+f6|K6yUcR@Vfv<`Oh2h&m_+FquvzL{L6sv3pnZ>ZNN{J zxUM$@^q5{XKV|SL<&TrNo-Zv1oWCc@f$4F4ekb5)XD8rD z{|?|tzYB1r9}M$Kr1t}k^kov){aFk2DCa_;e~Qwk@^O^`SMzRN{+&RNety=V_bs4D zy&oFzF9ApSRhgVC@#T=eGpTSaZ+`?F{qU**{{e6;=aYO<`6#ChaLkuRz>$6>;7I=) ziR*rT1n5!D(?E~@e8qsj1vvWi-v)f2EIYk={W`>e9|1VZe_7&OkMOxw#z1#}W&@7? z`3d0Yhalic-wZhBJo?VFVoF(9;4rGN$&@|AILe%fad|u^+?H)u=o)3Pt^sS*)9BaVp-kPYf^$< z{pSFatNTp94$!5D{)cO@O0b z)t2*Z)H?|5LA^f%IjHwa!2L4b8@>A)^sWT?sP|&P(f$Jra$12N<*Wi6O>X$E`*;75U-d4L}ccs}6A0FHJJ0UYhT0raAszXse7^8eFz^0$#yKs(nc zkj`jl8{n8;Y&ZOphDHA;>@NWMBf;vy@=D@gIA`;i{ildEZ$T*)q0ek@9JeKCba^w_WT&po5<8lfv zaMe~YuEyScL$$q(tGda!dalQ~oB}dzO#{7h3Mg>(yp`$Y6hYu&pqEnwfv*I7KY`eX zs{mJX0lsr1;0FNxV}PqN%(q_#{6L_83-E&gPiMm^@abR?vkwCS9|Cw0;D-P{4e&z& zj{trc;1>Yy2mD&VhXQ^R;KKla2yiubOFUsb2QM`0R1t5<9^zafZqW0#{zx};JJW51^97*zW{h1;OVjvVLJnW z4+MM^;A+1v(~kxm-fFE81Qj`-vIb{z;6LOAMn=zp8)uKfFBR|0NFUQ z{XYTR5BLdyj{*Edz}0hJmU9x|r9gi&;5C330Nw<6A>da5J`r$yo;wNf9Y9|MIQ}n9 zG2pn*e+u9OWhcSuQhg2Io(K43pbr7g^k>U^=L0?!=vM(=3iw@sp91(_0cZNf@*e(= z%?zM_3+T%LA1OOIPS-KE13nknK(_nq0gqY#$!%P*G!j~9<Fru=^w? zz#6Ac+R|;BktR++_e#5!n*eLPI`{%p58jBQj1wkXyzb@15E(^un@}afy~yDBrl?yv z@sx4)xPAqy`vi8wlA!qRjdmM6+UblFuSSI38yrg&Cqyq+-3xQ4?pbK}Y1TgU)l+i2 z73L&YQ1xh;=@aZO<5JB^=5)TVo*23MqPnrI)7{HD9Ht)AV)!Dvi*0-H^~N5`$6ia0 zOQqY#!;KDfC5{u>>u=5`m-vLgUulbtn%PuaQ@tcyv%;CMXhqNP30RkmPLR`FZQ}x7WcjD zc>8{YRom`O_>mOoUeLuRzjBzI*}apmSuKThs~KoCZhH-+TjnT<#`~juzPh`T7MCAM zuPJiEG^?GDVt1n%Xf$qIs_52hI-xG7yK!pwf_viZK~qw~4a9S&^W&zNHp->Fu&G?z zA2W5&Em2KfMW}{bN-1A2C2CzEsSnY|7lxkH^se$66Ao3>NE5AzI!TYl_NwOSS{$E4 z{V>w#6~Ii`Q-MyHlS`{z`YReE`Fba2`>5zN%Id1z^72K?mzURv8yf3sLp9Zr73Ix& zR&GVz(xu^AdSF~z7YXN1nLg)O8Y@;Tk=KiAn{w+L>WC>qLp;$#h8LGtHH4OiX;HkP zuBjd#V(&$?l{O#YzAYuHKt|+aaEtfyM+lSKLY%XSKj^~Wlmx%pdw}|RziOiT)w6%( zUzP;_0;1)B{LAS&QT>Yrw`HllVC=te68x<${8dTtuXo{Jlm!1nl0RFX*?vw_qUry; z3x9PI{2xnx^dIkyNmReu_lW#UlHgZ+c9Fj(3H}1Pj|BObCc&@vNg{u368y_u^w%Z9 zul84>er|FS_5Vf}{pTdX|CHp&P4U^aM922Vic`BpWly4l>Y=5|6NDzc%uA47yj>(;GgZnzb6U)1upy-B*CxV(?I{VB*DMj zMgOfy@VC0~uTO%1oeTe^N${)pPB8s9C&7Q4i~ie_;8)*;Lj4<(;O}(N|Cc2A)q6Ck z|9lsIeus*xRm{6}bZNaT^>Z8p(_$D(7mVrTiSiF8UT&j$%Rf@;?<3o5x)foD6ewRS zQLr&bR}mWcxlI%4 z*XZ&jKfW`^B)We7A6Pg3GRd#{A0=Mr=l?em{F?t4NPc{0$xVM1F*9j_#_!)~Ys{01 zdF(fh;>sSiuCht$SKq&r{k-OkL6`TK z!G8apHrH*Ene(65|8@VpYq0+fsecG6r?{T~>}NOom7+F{U$>wCzt}DRw@Le7mi%mg z4aIf)kCFOy|F=oPp_+c(e*WKMH~TkA{#hEoZvRY!{p;_t8L|BE`oC^J|Bo{3*X{TA zv-#Ed-M)(V|Fs7Dvm}2{_W#^qfA-zBMzp_yAl?4Q4fa#zE5%Niu6xNiR>;&-#Z z>>iu3Q}VO@oEJncLbg0Fllpc0uay&rp6tI@^6U0*l>ApoJ?f;}{}+S(S@+r;osyC5 zKab+N{Vy2oFUqhPb$z=3Qz@Sq)9qg%`FpZ|kHP-!F7{vOV*ephzwZAp6SSYdE97Q> zmaO=lwi}$I?vIJY?^b@+-Dk7xlAP@Siz%-Ae}TdN?NUGf#|n#LTQOW_uwVV(?=~c+ zxNiR{gZ(S-w;9!QWVXMRAl-ic|7^BN_y2wS*!(@&|B}J}9g@GN{`Wb9{c9eu_1|Wn z#Q616itG0OV6cCBrp?$>|2vNADW_jA|Mil;P3l)C-TwjNcPl@65851^l9By?8O3$` z&y@Og|9>O(50(7t#I|C%+F-xmXH)gmfARl=yV<`>+K>HL2Z_|}|Fgk<^?$}a^}qix z*suQgSUty6Y1aM!g2Dd957`{`G{5G+{$EFD-Tv&mHPGavq^Sbrz*wrtlQseu;0I*&9Fw} z*X_T^VE^(>HsfuQpZ$Lg#dZ6CWw8G?slTWG_X%acW@o45r{*Ch==MLR?2ngF%13)So9AS^xDE*Y%Gw=(i5A88<1# z@~rDWmiR^a)94nv=)aL@bp2;Y{j!)kQZ`BbieBAdUtze~VE=Z>{|h9hxNiSCgZPJ*ekS?VN!R~`(y#MxwmEK-jI4hH#dZBdsGnq?==C?{ zK%0@o#{}Jf=ShCO{mGL2hbx6rif(^1@w>G@*^k)_*YZsYZ2v8ER^pWZZZOzCdZ=I% zV^%w6A9eemHrT&W^7rU}gZ&$~+4^pi%GrL7>-HZ={Vdz0`@e9Q&DfLwn5Qoo+AgN_kwV$Yi$vybd+49Czog|SfxQhcrCr|EG_Q2gqAwdB|Rf0g9F zIfk3^S-W0G{I33g#wJ`W6><9SAV^RD9)tdZkv9MH(tk>=?*DHM`a8GV9CA#mC-Tx;V^!rEK{IfN~NL@_GCw@2mSufjU>bqpDpQlv1{u-%YPgi7u z&EFoQ4g4nYKPdZk0rF1^Ut;4R==R^L?AQ3`y6|CN$|gCdl2v}9V7iQldK<#*W(Y9AY? zpNABB`mZzS&nmO|Q?&uK?tlJHhnxOgJ8k~ml7aPaanb*Z)UT&&-%6YRcrE?frFAsf z$Cy@4t+KGqFRPJ#K}X&GBZ%M4{tv&iS=LETwtpMNb^om%;xIQ_c)9~$_TercBFC4M*iUv{zoMHl-6QorthtIF0u z$%_fP{qqd=XG?zNCnZF;f0n_1{|`0?`u`Pz6u**tk-`1~seh_cEYE)J`c;Gd>my)# z``;wpy8WLR?6(%#hHAqPhhHUQz=7`NKTGnH_?V#dE3hx|yV<|ZrTn~2Op0I0Jx1!+ z%l`XN`;hc}S-F{|tlu zyQF>^p2Y;+pBEYIPhV`aseD#Klzw%6uEGB8F82SEm=wQ~`x}G(eyKl4DUxTucKx!! z{$PUkKX0%u|BQ6&_U}Uv$lS`$0;!*x=a``Tf2`!!%g^!z?aw2AxAL>V z#r`i{>|bcmzfS5`^+zQ_rC(j2Y0!V0)W2L3vj4tz(Z9x^zcWGoEe8Gm6wZ~{{ad?T z^xtF9zbirgcNp|v>!SZ#7yWM=^!uyXddu>QWAvc=|8;}@ERUW3pk!tL^OQ*OtNK?m z#J&G3NKk(f@w=73c`o|7OVsuM*`R-c)L$U&S0}}U-(ZE$g^MiuU;~+|M>l1#jpIw>Cttwh+xDPluzvo2Yz>#A)UV;Vfxw`)302| zN6Y%(C-9!eG;8dreA@)oZ$FrGkLg4$avLmclI$xWS z{`&l!U9Zi^`rMaQl(UO3C{~)YE6T+5g|kcAz6`d#I49WleX!;6V6f%m5tYIA)Fas0 z!M38D>_F#-EHcpfxo==-NnK_bbn3?8$u5Z#m>YVhPS zEX)%;w&c=|%A66lMWr1zIeuZKxNp0nwC$gzZ664Ntk+6&$Q=VIQREKWF0BC34HrLik~S9X%C^2k+%XKp4x_1mA?uQm@I z?EIsg`)XFO?ceN|n4B9CZ12n7$s$MXDVx{Y899=&VBeTr8brttM4E;LIytAP5U89A zu=+DNt9*y8WQ&3w=LJdTnxY(^u-|tN#mM|(iw@J$cRnIe&eBY>a-Nf=w!MMQlD6+2 z;JP`7OimB-j&3SLzB_1Tn^Jq#qpiypn)0G8`7N%hW#nU+K@sq<_LD!2DbGLwoge9uIh~R-?b;* zcQvP~@8&AsVMUZ~c5z+0@Ih?4Pu#VKDoy(Z#JDH2k5EOVvpVwjI+}oUWX4 zrjsw^mCqG-n&4K}pV`H!C9?-)c};0JP9&!b>FY|{ z7m-me$vSCQ;hxl-lJ@g+M8fP+!wDLuJkmoE}*-%3^9pFwp5#TT0>VFi zx9ePToe(d}Z+qX^LffAUtzDl)xjoJ$f5-K%*m5oYrib#H&JQ$dqxnf~+W%<#3g^li zP$)XC@8(be{KB=3TaiE;Hz%fnTlH$w`J8XUWk0zfi`w&It7UhJ?}|&PIpro}KfBUD zUMw0l*>t3H+g*5O;aRGkNU~iNjpC|TBWr?fZwmP(ZCfZ0e60~GI?{s6*OLXVb)R~n zo|?h{x7IT{BFB14I_CO=E#IE(TfLH+wfhRFoD}}mPe%d^A_Iacoxur@F56w& zv3N&m+o!g3sO2n4*;3lJH2ai}qP!mh&js6xv#Q#%O4?I%R8#G1oktdN!b{o*$2a!nz%nf{g? zDZz`s-Lr>!?bQxR?NUG>R zKJm5QNpU41rVFu6>-xE%T}dvtw4!wnImmZUaZGYABCMqCg%UftCDG*a{{xh?y!V4k zaqC+9J)2WtnbPTN{TpfTWm;zl;llo@9i_*5f)h3^>+^N7-xDbacAP_5_XE`u{zs-F zPD`Q4J4!O=-P@!!*tRQpgvh!y&beaFI<`i%H_v_)eD*`CNxn;;CoRE_BHs^zukC7+ z*Y%I@_Uy68HNlp*sj8j*Vb?l>l;7{Acz1sP1>F}F*QvL@)~7^TELDAjRDHYdW6h)> z$O>+!3&AAnxlfgEsP0|MC~=NKXVZnG|DhlfL%(&|?qJJ@{;mV4F$=c5Px2>!*wvpd zl-Q)3UlyK{%4*++~^h%kmmHJmj5YCMpJD6?pn?6oNeS=QYt z!=BEtUP_@M%Vtm7zcZ{SJ>i!!tcSg0DE=>M(yRwk52fhKJf`_1l_|bT9rjg*b#oda ze@~l7Kxd!B>G*x0!E}7JZ-kCr=^X!UzceaL88i_tZfK}$AOUP-A$8)S2j^+kchtYc zkG_4a*AsC9&DJt%{GFDI+9}Z${Yvmg8=98g{e72yMCH!hKb26ue}qSpP6Hk6D9Z}A z&B>;7|G*Ozqeddwzw14sp>maE`$txCE6UbgzK}B3wTVfno2sB>B&pn-E>2b8xvI9Z z{@C+Gj<T#Ij-PPk_LA#R84Yusghzz4H=KgfPdiEo3hJwE0XM@k~77fXE-=+T)4at=LsvTL@ zzpJm1P(&_vEel2sN=xmHKjHdA#h8%*VYHdV)^RG+9y zzK~}9R|?ge7gC08PP4w{iupHB8llg5^69S^uJs;I@qci|+~GZ(qBo`vrsE&e2Ga4L zX~Q`6)c)5t)89T<`cIoQ%fB=n3Gt^6j`z>0tqfOH*M=+olV;8>EDiXps>3yv3Db{q zr?051YpATQ4MoC@$NM9TNn4)(B>#lGN@~$v{Gq^L+v|2^;|YeWc4~aoE4FB!@toP7 z1edhYq_3?eCtXYrI>h`w*ukrD7Pg)gr}??T9L`?4yYoGvfLC~=xk}Ebq)+lvzHzUd zN>ztum0}*bYY(ZC33D}IFYG3>#QZGAeQYlzXy@xT@Tp3nO1SDGRQf(3(>Y!^2U=$_ zcWC)|o<4aEK2GW5#Kx>1^s3zsQvPHa8t!?%OIJ|!FgM&hl6YhR*&$s(>ogr@3uMDR zub7rOxaBTtE11{CD+Eb4o!q-9>-MtYKAMt|q;_+<0(u)O|gI{lKLIeZ8+e4mJC^ zlRO*s^L?71v%t?h|6BRsO6u^f2(4{qweTNoe=gRm{G4HQRY(h<1+)+(Zr|qI&ZpZv z8|K@2>h`tH?GY;R&DuO{jAWJ^&6=;Yd$Sk7xJn#Ej?$662|J;1ELKJcHGG+ z5cOEBE%7>2M65HNpOZ&M)#L=}7|EGO$MbU*$F4T{R*mNDXnAa&Jyn(KoJp1ftnXKx z&*KA_ueR)_*60}OczfF#Im5_#T~Cl~p4ZrQtWZ1^Am6Zyd|5}ZpQFqDg0Kw-JWBc%9NuOmdQxplRO+eMsg53SSrS}&!G*tNQtu~pY1LA;W^C+Hucd0lt(zZP>uL0@Y2#}g#3 zmlNU!TA8rh1EYNMOYasIE}_I$t((SvSw_+B#>J;a{UYdJ{ib{R2kE|=&$jG7-M4Bp zxxjbN9RCA(?AquEI=q`4+%bi^S(+fx3RY3ujCoy`5Vx~lOXKj*LS4Uk>3qn0ZHRgf72?l()7{JOZdvSYCMhcZKNweQPJM;u!jb5 z;u(TH9NG-=Elxa^CW<=*P9)f7OP~S%jVb%l^QW40%UaEY`8!e$x?+&^9uM(9Nf~zi zAnP4Z8UZ^!`7ML2d%P!5{9oQ-cMh_?P9>IS($a1nWWAJ@zh#iMp-(==-|RE&p+VNV zzJH_c;q`vQ{x#6Lsy~T+r2j#5^XvZf^tm;22nl&0b1)s>&CDkF8sA_#{xXZ`UgX1? zfo#LZfy_b{j?bcJz?Y=#b4!Y~J|%5yinWQY+nJK~Td(!6l!2Fet(!aqJmA^qYmfD^ zC+&5Q^_fQuqQ!Xew8FW()J*HlEgxr>wx2wW9y^t^muHn8wYjuo%t0j+-e{go&vr}N zzA9<^dvL;`&E8zY0P)gNhR%5vS|%9rSvFTDBbS6O1K@K@Urict0|4s zyvx$3wJpmk+}elR_iVKkSy;ZgYMomX78z06ej*iAdT6sJl0owIM|Xt#R`sWbJlZ>y zv_0PQ)4AZ|sW~jSgqqRFSTcI3z3@ApL^(@AzSc&%RL?7%^&?u}35sdK3HF28k~T7{ zeczm5%A+N1r)8I>>>?y-%IxY1;+5 zJ7}I9T=iV!w33d=WZ7<7Y}=3gN9&|B{4H;#1W)9pw&wk~?9<~`u|)c)SR#EQlJh_T zi6ou^YX6DHsb9gA=O|Zred;5!|D{rXFcxgv*G>c5UrO^FTFl;Rj|WP8wNF!us(dw@ zI91e9Pf6!|o5pMPCsXI+q;8f<-9a*SoVBHGk4JM?RHf4Pu>v>(9VghsmeTeMtgce(1|9!Vu)xSgKBbD~h^ zmvl_0qVo+Eo%Q4`Dmu&jE$`D3JGJRlcB+GI+k*BIZO1w;It8s?H_aC7vu!WM6bmd7 zFWMzSlyj#jG}msdh3$*R>=@uy&n7I_&109=7Zeg9VY3YUWE#-#FeMaNtnOnn=&9>L|XM zo4zMgF4)kI7F?dC!nrYZG9A*+wXCQ5bkX(w{fMBn?O#HYn%V1f>YnbCog&1vpVUT* z>2})>)R1ahVCbP^N!z=;_&{aygFR*05A-1c_RbQXjHRbc2elQ)ao{Bp*5A8zeW77zobeS1td7lJuNe_yRG6^T{0g<@2uPJG? zhM6i7MrkZ6p7i6St3D=ODUdF{lR&!uL{73t__P~pTKZNo$xeCw`r8P9ZCcjWmQIS$ zHP3-)++Xb9+QQSl6ndm@Pxc7Q-rB;GwG2rT4Ab*RtIyZ9l;v zf1xeEFSoip!HRjrHYK`2L-g$2dpeKU9;I5Y+K1Bi2e~x54GVm&&ybrb2|cJ_*`;kl zjiX|uP*Frxsr^CDdpG%!NxhSO8_9P13m%%ZUPFj-L(FqRd$8KoEUZ~cso^1xuk~_j z@VcX~jkc?T{%1YVpM&(&!%h(P$elAW2H9JYy0VEtG#Ik6g;8*Hj7-aq3FFi-pLxLH zmNk8!_WssV+UR^;O6Hz^)*pD|=c6e@zvyRO=Ap+Dw|n;apr5tPLp{-Fp3GPKS*>0o z_@#H~GySZOyw^}hZSQjw5&yjJU^;H>dj#R1_8m+|QjmJ^5%zlLN|D!A)4;9Nuv1NY zT%0&+zO$KcLl7Sf9V?!46$2a>6?6gqBIMcOib!=`?Zi-HxLb}m5&xrs&42YB`uvXE z_fiXNGyk-$>#9LxzrFmMlkIEnXDD10lZeiR1>$;Tm3_{?LS1*-c(c5otInN+mV9=U zwNhR)(UeJ(j`xq4v#_Z)(&P^Wa!2Ln9Xq~BT#h zM4*Y92r1{zv{II5r5rqywp8J-c$ST8RH2thvD|gp-DNntW-$o%MUWGgOwcK zC!8Z`+v&`@t;v~LYdupkvsZhkW)^tP?w^@mn3**(GrcfF$e%6goo`7IeTQdaX7*a| zluZBX)Tx+Un6<=QD{^Lk*xL>W%^rErx4Fi`wJ#pS1?2DN$!+< z{Mr&2(aElFr@HRnq-!Qr=J+WeIuY^UFOYnb{rQiJAVjsYRJ1R;Lwa=C$0kQZTvMDj?cQ z$#ZHyBqgear8Ng02pbPByh-jcRDb*;Cq}O=Z^=T;?w4^mn9A%p9?n)4#e;VP<|y-y$kbq5hfqgphWkaJ(@o!|S0WxZEkq z@H|X6isD#`$;eW&p;T7N1E{igZ$lB=a7yL^Z`k9iYI263qx!adxgjTpAvDy-kVQk#=ylR)%uJkMe)IF9TE=`;%zz(mz>hHCM;h=E z2K*=kevAR*pT5r4xQ_fKOsjaR%`;YQDITEqvh#cy832d{V& z!wo+^9wfvo-qeV{<)wE~+=ACCaDz$CL<3%Az$eGy++TS>4%cTDyw(&IjX8U*l9+3C z;k8at(U`MW)W#S{TzIYNao|isJRqk4D7@ATxU!>{(a8fizZ1jZWpS(!M?AbPaqfFD zye%#&5fbqaB(BqcEOG9WFnlI1DlJ+JhzVay+#iEl*1yHIJ%Eh4CGw%rS`Y)$e zgDrl~kJek9@r1h1-=DOs3d^qmdCnGirFb6+Z}Im6sfQ4KIpR4ISK}3R?`VPdRhQ2B z1cB?`p`~SkQ^%u)Cj{PKLoMqK!iRaH?V%bw{Y&7{_E3$Vay(4$cjUCo*aE_bdcqE_ zEaPu>>UqmVn+^CP1O9iyhk2syDvz}|9O!kIKh%Kx4fqj+5A#IZ;a}O}t%U~q-wFC? zJN!3E|1{w@dH4-4JILIm)?*y(!*wJ?-zca`w>cjG*{fLs^X272oc(fnk@g#?L=(lgDTIL3w(}(Ersu($WRZz>1YSBXOW_x5$@)P zgUC;A_;G{}^~_gd)L$}NrwIH^2UomdgPe8){s#lTRmcxH^6O>nEyDc{3X#|qgxrey zdaL}WuB!`yKuK+NWO75@QrZkyJag*wS>=HMMW=>WETfHkjm5bYb+iePxTlV;uc*-% zC&o<)M+BpZZ%XNmiG`)*<&8}X%S*~lMvPNN%nVnR)m7Ie zMo$UXh8wCYWKC77gg7GLp-ji zx`7s-if6K+qofl=o^Te-oH}b%xm9#pZbP^#x4eAO^5y0A;f6-eq3Xzr^5#6pI`T~Y zVs>DtW@cR^#JLz4KPg-jZj4liYG&6>C#X3rOI(~Di%Lu+RI#MIV)2sls!(-JRIau> z78pBeakyg1#D=;h;o4H#zG@OVYfQP-SY2CD*Jy?KU@Fq%X?H9oiR5(S0f*Twm3Go* z*Ey**ndI0op?G;kSd{d@7$-WZCe+wyE|CeBq%lRby*IzAAsjBPt5{OZN<~%HN_cPN zRX0XhUhT4_bgZl?Yo_y@+GW+XmE|+TjZI6#N|~%+qeOCM&y86SwK+A)Ks4c!H!q5~ zl&whtYBDIev>Jx=CRL+t!(IKBjGP3sqL(6NZtS&{Mc{nB9Za~C6m{dW#D#z*su3I| z8o|a$Lru6=6&iIf;MPD+3W=Hp#Yb;Kdg=qIHL6%1Di7IBe7HQUYAflVT@qWE1!ZJ$ zL)|jT#T74xW3TfkFn&&LHTBxmj#i%=uAD-;if1leYAp>ft*BqYr=@kxqUyPJ2j)JT zk~77wn|ikQvP8=E#vnA|Vh~?#X3vWC`cJ7%3FL7$Ee|cMZVrs1cw=>W1vjDPkrnmf z^6J{EI&Q0Eennec0ovm9(GAeM-ip;37*G1+71{%*sJ=kn7! zS1A;JFyKi469Zl-an^ez{gj+4pf3Piz1pwSUt^%ZRpL7RLqN|qD826jJ`wPbB+hb< z0Nj&e-(Y+=;H@?+=7U9m{}OQYn_uEAXEObiJ^a5f92lQMKZUCqn~pOt2VG9H4GVjM z6jyT8e37Bb~Qj==L3%RpDJ;dKaGA$?*fVI_AfHvjew*4DU!)6>hIP#>?mbp5ma(vDXW2 zIan{$$_>-=DwLAXWtfAW?`j2$>3Q`<(VxY{6m(qWuP$FbNY>?d*kXiU^gr5(vC zM?Vx8aMdp9er}cYx*s+Gj`jCx18zTGinr4b^%3pNGvN7vV}4CF)YEef_}w69B-yO| z{3+llzaKk>g6;=Xedp&(9QcIk8VNYcpK6fL@8)q}y;x5E1UUNt1Hh5~Q^2wOd$6^;HXzU`RDYa-qAphatZ)PIjTIf9HduIW^{ip1Uabp zY`{@Y1n@H{uFB7a5@)yKc=$@d`DwPI$8i_;^$Nd9(zBiX)Jx$T0bc<41AwFbj{=VN z{{wKe|1F8L{m0Tz>HQe!`KgY=zmT||UNzp+^HDwTWP0=izn#H>arDD5iR*qC2{_t6 z4&-{oDXJ`uSqO7f{-i->w84<@^$Gq~8EI${$BEIk4Zb zJyGSKacqB7`PcCUM8`pwbE6H%wR;Z&j_uF;2K*Rlzb=0Q;Am%w0muBp^j3m@(4L@nac$abD@^IS&xp&4-W&mO>e?4juStrrd~CqO@i^Sk{V80Wc$!jAwP>GJ{S zzCh8pNSseN-+U2pOz$x;9>Z~63E)WIAaS8SrX}v%696a-c`O7a8z&z$cR| z<+s}? z&DZd)HknnZ;b+QzXqtwz?>MyECn0|p#g+XyZp3x1-vK@1cL0uZ9+SA9Utk`wBE3 z9|Ab)%>f+cj5Oe53^+dn;=uNx{22nZ@esw8{rG$YaUB06j^l8|-%YUIp}&Xk~rrJ z>b(N!QSUDe_y)jH@1q9%Rf+3*cLF`?{n~*4066MBoCQvv8^==m6=!XS>BR!5k zk$#%0k z!(a_p^}mmOTa>FX#p$15MDQ8#{Q>9vqW@YE!4G&9#g&|+3^=ZH@;FDyk>nOv`@_`* zoEcwCzbuK#VS=Dv1a#^?(^mtoqKwzjPtlL5cm0WOE|0(lDXbQ$N<3xM|nJe3nlf$ixp zV)kJlz%u|Z09>^(d>hwu_5pf+iJk+?&lEBHa1P+A4dFZd_X8Z5K1;;x!$W|pu{__| z0{9@H$ML{mz&`={eE}c93MueuKM}JJ{Kq#O_@vr2zK#HX00S~y0C=_n>8#$9Zt zhvbb^=ywiR#C*}<|mR8b)}>y=YNYQm1Cx)ljYOCT}HY+p{?x}FF#&tCMbwtuqp=BZ5KYd~B*n&=sdgLNJCThJ(#RU>xDj;P6WQ`Po0GZe4CKskWwiNw{VOC#6?1QCRO~xV6+jnmKz> zYfQVdjpbx-Dw0u|dv+ze9~^RB_1JpT)Xi>k*A(xC3G_w~?RBotE&p*}Dif~a{q*Ib zhKA4zF-&pFwpI`lZaQGgx_B*v$37;Z$+XD^xj*&}dugsgY%dKKZv%Aah~9X&N1=OV ztkZgGFC5qvLp11Ad~zG=C~vhlK?sx$zU0+w4!zGPik_>K1c_tcq;i!fU+B=@d12+Y zeHD!nepxblr5bz3E`G7GCbzqn{^%vqrAx!LG|;cDi-dFOzmtv?ukXq0MYT=2^$m6O zreK7smq>JYad}lkh+YuOUDQz5gp+ujS0ouffhMmwk5udhGNR_ry!OLu7izAq&i{|S zFM*GuNc--|ArUYW5G4xgfYAjHNLWDPnLq+PGH6s#ycT0fB#I;(CVgo35x0zqx8xudRM`%8s`tj3RCDhqWN^{$3K;r5hOpYlW0Dj`te5sg-6iK_CKx*{22kq0Lf2nTIvVbbn3@nH>eY2S2Uf zYP)qxYi~p<*JN>MUCjKHm%)Sw;3Q$ZeCCpNmj74apf<9j{D**-^zXv!iO8xjmkpI` zsdPg3rw)~6l_2BAzmWOKJ{e5@@iA8DNsPQ{KRrk4W&a==>=ByPe`oLW5adn!U-z-Uh4q{I zO#4&O&b<7;k@=ru{W>w_{p@4^X10HWuz#qB{ryHn*=e)vI#joqB1Yb1!gsXwOm8~itg9md7XPwkiH z-=_XIS-7-fKbK=ovj5-mv41n$-wgj!Apg_-pK1S3KK2*#X6kHW7Qwv!a&VmyMr})mN0^_R zv3pAM>+}TXH~Y_K=GX5P(*n%)7Xd$tkTm`;=7%J%;C4ynKN`_2e>Lkj>#vn3E_BZ! zgSJ~^H~W--5N{UG*MyvE{aVguU4Db^e&(0&&m|sHH5dE#Qm@R zrhygOenY?l-dxu2fz$M+{ZDKA4gM?6a5x4rPWID~VA_8G`bo0MY(K~4IQ;Ti6hch< zZ)AR$kr1w6{(=NFx&G;SZ!iBZ`HjQa%=~0ObqS{ZZ~N$PW&Qg7cPu8U|9{O#fAtiH zL-s!r5B+^%kn*2a!0AUc*+Hmu68FF9zf$Hm{a133!y=#IA;hfzGr;fVzuYp1e}R*z z{_}X`P5&(eK+mJ_WyaK&wSe_&dVNA4>-0%vy!1D-etn%%{m~_@`856<0K!s@_IpzY z`n5guy!y`YU$m3_>vxj>knZi-yLJH}8LR{b`%NWqz~%79ZqL z=z7-lCjS@USMA5B{|(%JY-XhPa~h)N*K+s3Ls?$-H?w~EOcIGQub-os-?V=N^PBWq zKgpsn3jAL7ho(B`bDcz8e`g}E`L+G$`sm-x`gQqPjLWZ&%YF2hu>NKyB>z#DX6kS9 z(Vu&;!&uGyI???4_zEBWS>+Cey#Fo*r1^FEA7=gLI?F=Vul=X>>H5&=av%Oy<}c8U zoNE0#eVO^q`p-JVVbFA1jCtG&ey{q^u5dVXIm!Rz63wsiKu@Rrn&r%9{Re8roa*sI zr`?&~AhV8UeiPSx8s8iI7y^^#Wd+P1(uAC9`!zg_^&6M3br$pM--Bp+lmAfgEB|Q% zPIK9R`u8f+fuD=0`Cb13Gj)@QYIf*N-RTJ5f=3*MX!4``P8$0FSsAq0iSQK>h+z7! z7tWbuCy~#obeP7Vd@`8)L-R(C91)6#+;}$RV9c)WNb}@d@-kEk9`c}Y|fV1Bv@d|Z#T0dYPbUyk$& z#26p{9%&=um3-WU^eV)w`FH`+YY?yH<3Aw14)J{pXRig(-uybAzjY-6`Za_x{C9wIbDNvE$7#9`V7*4 zasF9OpF{dQ=Ub7!!1?t^U*!BtNMGjsD@b4E{Od^HK$Jm!T&wY9d<1fv9qYSwdkPsV z0-bliHg|jmJ|MmI&EvE1g}9=et#p7~Bxh@!iRix!R;4^bjUw1b##pH9sck%HOS4R7Z#4ms0e0_&#;^J&;ULIo^?{T9ix(r$%etF4+{3O zGmt48g@5PS!CoZ<&zy{Z7flQHnv4(PWsM01d!02Z*lQY2S5FT1nltTmX$uJ_d;fpe z{}lPYjlALbqod64Rh_0K^~ zq&XjpMJ|#<--^eF2vw{3B6w;GVk8F@e9CTQKt-@mORyI{1F1etNX;=Ln1*{&L<&@2 z^o3zZ11p8h_?OZlE}bY@l&mB=+n7uAVWD=BcoI$aTP*2Em= z3$u<{VSFbPpB)9Bmh)y$s#TnaE7retCSA0t$ikD8mwgdDp?Q1BG_K!X#Th7R7JXw< zRc0?#Bz<^-L%jU|Isf9T)J|c4K+DOUitmD|4`9-lOR4cjnx@j1Q9s;XG8v!DJg{+M zPM>-2;v3|jl7ymysDGoi*^S_j zUluqYVbNLfOJ32d_K1Grj6OLIJ*4)bhML?1K@GZ`L1^u*^vUX#I4mM7Pet3E+#(EB zh6@oD!J(>e30_N=Z!TO_cqX;#UH3#K#!~Q4`3K&4X_D=_W)PQ$oUV$Bs|K}|9XFdU zzI~_(yrsmW5UnuoUBqQy27kw+;Ns0h#=qz5__Rhv{R;1N_`_^kso|+1?n=Y zGL#Pz%YD?=?YJl#FHs-7-A%c>BKTP|x(fZhTRY}BCRXfz@Agc5sdp}UfxPmC=1y1K z+WIrqkPfqZ_DIDCO+ZYOe!_0?$N8-{i6H%>Nm-Oj9zF<2fJ;q^X+X?C)!)y(-|nN|5d)TTB3%XC z@;hj;+0?|vlTjf?w^a=*0y{%5qelO}4vQF|M= z6F&P-w>RpH^!1q~+uLqNd)sZt+FM+{)86nwd)3}{bK2W(s=cWp(O|I^-1E0*o8a3_5B-`3uG8ttv;FWcUFI_<5eXm2IcOQYq7 zjwyB8TMd2qXUF@tZPd4o;rUEsx5P~8bkA!?>d;jWb6sm zw8)8|`rA_qPj>D>ew=g?=9AfWV+y7$Teo92^i32a!MC{GQ=LLMwh|?&-P>_YHr=2V zo>};t!YP zvcpZY1NPuGb}Wjejr^@O!zVO+6KvQ&1x=Ukj8o@iL}GKY3RiWrFb^QeZY1bqJN9p7 zOxrBXSjfUL;igjt*md6@6P*7JxPwc_gz7d1?0MgB-;SgC4Z!T!3--KC)>bggYuOki z0JnGb&A|rxcqQc9jTiIHxg8smLHBVPc3_zuJ1IL7*k;!qnFEe7Sy;6U*8di2m8taH zqhr^R&T>rK$vEZAPd(>wxI0#NC3eFbG$n@~b4vb3uz}v{DrY^*JDzphtJ89*GQ)M- zw?_|+d*cL%dZd8dUH5%KuzpW+M4;KuUp5;>+8nZDu-c=;k&zY=y~PPkzEC;ErMTz&~VI zivt(pe{)J2{@!G=;?p7O%)%y|}U5K=&Nj8!65R zHy)Cst*=`d3fKLFF8pv#)RPWt%6ZPKp>uX19>+`+| z2Ua;V)xh$KaBv0&oinrbjbue(Y@{$)_yyVuqL0BJ;rx~858;n3_f{;JKqh(Ie+TQ& zMp4jT6{E{{))o>vEO&7s;w&zN;ZxmVwXMR%&;4N}e{;>RzbOu-)E;WTu-Sg$;|Wc* zKchzuUj8zOB7tvD)~FODOGiB#m-3goiozy2aNi# zzT|Zt?waPQ;qHaaTdt-0LOtmgQxb16v`ZFTIw4fINe`Q|`q;77M4zvX?rXHF%!&nG z?I~~Vu}u>P{p{8WZtT&bRGloNYOjcOZ(D?#RqaQ0MW=0Ut5N{gDLxI>-+;XKazbb7 z^f_&_6zyDUMt0pM)LkJwxw-9r>VxY(*cNU&b938Ujy$KUgZwGz<}hw>_xN2wbWgR8 zr0j2T#zQrvJwkUVZDkNeT~RxWSBFkT?=^kqmTuOk0Zgc_qt(i1Q_3vsp;T;yFHY-e zS)ZhBKuugGyEzhCh)JKC@i`j@*fsdlcNOo_j(d*i=?P1C4VXjFZnHBFQP<}Ymty`)X#uKva{MMQ_VMaUisS`WloFT4rz{>MXe5aQlqYo%X7(hvSiN?|K-D^Uh$sd`oX`wp#`} z$jU9a#delo?butMW4Jz_a1sOi_`X=|nuK<|FtE2}JsBAIZkqKDEk|z;?7t<=x|>@3 z7b$xqdu1xJcc!Kzdtd56d`EmkDp6dYwmbe`oepjty4wDScA|=V=qlclyP%8pXE&y* zme5$8WglFf5w&$2#RmOZ$hgG+n4?X?B%^<RxvrIM>~!2hugS z!E+cCjeUXF*b^Pr2`6N_PWUzTt6lVi9OC@b+Nw)btHwsj`2+DH(rc+b-yTSRB+Ystus{C4N`UIjUr))#@z*H> zA4s!qOzn;QJ=Dw}NhPwcQ+LPz57N-Ii)(7C=+Ph*RQsOTnf;j&ov74aZl#Xo_Se;V z#eD54nq}*DtsAu6r1q&gYS+dJ2-U!@x(2Yv`;jw-@V$Vp5wjoJhZfC`??)bgFJN6w z4!$`s^!0$XK5z`X%}rE=H>|DI`#gneZ6X}|iN?x*O^UtDqa|k4eIt#dvCdGFHDT~7 ztTE)#8p9EdDUtkd!ohKGV?ur@#)r{ZW;i|&8H~H$HNng1OG4rNw}Y3{nm{D=LiD;9 zsuhNC<0Q*YJxy)c76hOAIud&qBbc6m6;4r`GjttzU7x{vdYZ{@RChD93$FI8aD!iv zbc0`qRR$~}+yMH#_3C#0IM|293!2i=`v&bsum_hGgkr0(*PT`OAtq!zyE~mu$JXdc z*#er^71U$NWHe5=^ZVGVc5EVV`O-25Zltlk5)Q0Z(=nPKzlvLYOpmd+adI~9v@>Xh zrH!8bGW!i!(wVgfm`T;AN|P7A^Zo);AD(T|;=@{+*5kfCVf_KDwD96=P}_}IlCfij zxSt@iY4zm(Hpof3?d zf^gH3{q4c8+l^SRNWB2JJa4O(y5%3RYeHkKPu-42IXYga;57t#QI1Zk zT3W+WTH8k8EY?q&()ugYhG)YxSm><2Q+sSX9aC7lVQut?aML(6k!@%q^l6{q(wY#p zi=&)L|1)rj9c$6^eP?+~wTlPUndhlJWJk~}F%f`=ol92vnx0nBEh7T!vZ#4HZwFfF z?#YfFi{>#}HIE6{gWX$Iz};K{b0V?Tbh+O(Vo;E?Z8@Gximj-3$@Wahm^9zxIU?9s8IGRl_R6= zH!kHWc;BJWo_8n?1BG3;5jPL^=C)U$nAHnHl(7%xH@%S;Gtb{ zyD$rL?erH>z4vxQ&%7w(L1Yn1YO2mHFN;=I%@|u+7Okqe;P6m*#w>indg{>H88d6E ztE+0Fb(_%9{%kc>bG640HLSoKX&)vsE9C(Mn=bPC=OJ0t?3= zQs?#hmn+wK1kp9a89>N^O6*EcCUcxoK8{O-eU2?`J6Fe+M|9?&I?SsiR3!-@aITjsdW6xtUOuH(0*;*2i|1O?s z*|nv9ZLt1x9ES&g60Cm`nL=E~YR#-)hWDCTuzoNukBGBwMsvj;xbn^MRNWoXPJFoT zM=bpoV4e|fD$3!`G7nc8j8aQUy0`p>NMftP^FE~Ir0~2|&T>+);Vqodt(ES_u&6X4 zR-4_nH>9IK2-kfQ29br^Dly@BTdI`Esnip$G$IYx@=I<{yD`> zm(5JHMF%a-yHz$nc)?+}76n>bT6Qa{Y@vh7 zW4F=CqQEAFZE~<59qcuQy+&9hf8DIVh6jIVW7-t1+q5;@bV3&F_&l7y_R%aSGnQJd;@zc(*9OP^8>qS?2oisShw*<8u#q{pJ&YoF6{=}&pCNd5I6Uz zY$c2Arf~r~f7PrLf=kB*yw0Z3*-Gs&@cL#fuGO!jX&CytQM9L*splZUddz37!g)W2&uY0b zSU-YhJD1aXFrcC*_x(+<{#{fw4hsIb%Zy;d01!Xz_5`%bge`7RTS&>vl&WP?q#-^Y zMCq!6Tsk+($ro7sq>t85|jVBh<)N_}? zhD*_+ok{=X`0Q6a4`$b`L}h#&Y_7~OZM`uPRxCgX=TFN2Yq0(w z80v8FS=Ec5)Xs_*_0isBQEWwCGrGMm?Z5fh-!_#lvw1&$c-I5{gAE_RHSq`9AH}>^ ziYUb3w9nj=6MWH@!u40WrEHO4@2X`fzKlx)Xt zbM1$1^TF%6-V&^@z~$Kqdz3BMD~V6}-@{d*?C~mR=eB|9ZSnEi#2t6X_h7|&pQ_p% zB5HGQh$(zBUYj#;;nRIi;8SctPufwkub#wM<}P9M zrZd9vW_Kd%&F-8QQ-3 zO4jA&=K*$Tu+OG^8FNKcZ*KbljY#ztp5C3ZW9!3hi(uGe1-KZ|o-i0ahMXFQ1MBVl z7ic};<51f=RH?cJh=RDirR0e?FNZejtDJT($G5g0zodeaXHcxqa8USE2$XH9C?Wb- zwZRzgQ==KOGi|#@d5PUxkAuP|6*Ki>kEvWgn5+6PbyTcuQrUW_QY(z=pSoW8mQ?{e zmS4UTyer$~#n#ZXfvh2xH729AzqK%>0RR7*n!cjH)l8q#TGMUj706~(W6x;Uy?^Xy z{d-rSbG!H5+RwV5-s#rdJ@fs3*2_JR{isLZNBUb$J<}oL`kv=*?r+6*3nRZ}x83po zy3DjU`&(}W)A9ek;PmVITW@D&BfpV;7;#1KJwS4I?=<{>xi`t`z4yKStp&Sdv|qUU z1q=IIx9kD*#XU&&<~>Q?{e3CFwC}(T{j4whJ`#Yam3!@u|0vPk`=#SOOC!>^2dp#G zzX@2Cz0if-9=H!(iVRd2g%j=A&$!VpNVvJi?2!80{nT$!=ocyc8@;)}@FOMsWY77v z2Zof|0qO?Aop#saR%s)4feP@`3*CQF&uzz6uPVwJqz1hZS)rQ7mSrk&tV&)VI($q` zIUZyjH2Cn)Bx8lBtg5PJYUK=^oq2eua8CKm(Co_Sw9wSbiV8exJ0mKVkY=KK-Q^=^ z2yqu}+_fVybEX1?;;TQO(b^F&>v}HvkgHg%I}34kDHW$)OwnVFo;v8o7UcolLC9-` zL^|_;Eo+qcxD8wW>C1>75_2pqPp~Y}t46}x{Jf-i{>S47aFi$BOK;*c=G4ooN6itO}CWsjd;T4VAxZ)Ej>8@IVw(* z{R7P}vTaNqLg=MaX?Zzh2gke;X*`IQJhD~ad>d#nc!KEXaB%EaTv7D!VcS0;LSGk{#bf#&tiPSGrTqh=`lm!cR^64F zcgKg>PR*R#GI5_sQHM%xWyaaFZ7^cX=J(xW}p&;M2{&|QIuM(JA1GFBfRA|b%(HoZ_ES z(v!N&yXv3gF_5Wo7x%x}-cG7SJK3R|rQvWC-4ted%iV+`?U3BBl+DilNEgaWyKZ%B z0#{)2xh4hwpUxnkqK)c)3awxNpeV3`ZO zY?-?69Nw$ois5~W@|$b^t#%OH{W`i|8becucIJ=!s{+l1InMpn4>XZzhyD$m=j+AG zwf_~*6Esa4pj_uXkw|sn&gwBA!ZUqXtbWm+_a4nz?Rm@9oVB_3X!o%px|4GrNsI(A z>EtDbdZ$yO4ZONl%GY=vTwNY*cVRlEZUr6>k(=nD$G_`+9D3fl3D5T}(ochJxlu7u z58v)g#~A|RGbxPSg5D2bsjhWJh>1ll{oMYF02y~tEm9I=s2k>nAz<>9!9;R8ZQ`^#$jm=*nAKiP{%(FP(T5w72V&z_W#3xuOEu z>pXLzA5L^OlxX%!zlcwm^4j>dKiv@K(oaPi&p^#Ij?cm`Kd_bbd2l{`2Gf2_?+zty zB`phH_IHd~A&!d;^`U-7r z*MCaD;LT_@!TP1hJ3lSC>Ns2xUOis0ej+ZRPW<|!{t(dN$zW_I?V~o6ig_<79eYW^ zr6kXME~GxJeh_qUA>Ehr$>Vgm#E@lTM46r+(kNyrU2MQDne)L zvy0^12X}QJDL`9Bm1@VR^4R2Eq;UQVGwg?#o<#xdCq0viy`;c~qQC}c3#pa1 zkbaFVB)0DaV;`wm>?56weI&fa6BD`);$wj*79*MueEXm?IFcBU<)a4dF30lfkX#cdCT3& zTd=+dI({`#GbV7i<7%1r!_T+%do5W1E%L$3>G6$uKMZ}Z?7Cq6%cx)EqoL=64I6>` zZxe`nGMcyPHw@tRlP2rA=v1it%!LdK_m-o$BSCK|cY%J77MZ*Yq~?KY|EDe3FqD>n zVw=_ePYv>Ir(x1jv0&a0xxa0DJ6M0OGWgnMr+-^p>u;>*)=d~!#=IY1|9HZl!G<4k zL3e#gwwsdhkJ>-K9c*}*B)HvjXSbhLsu@=i)-ancQ~N;Ys3}zes&0DDAnz__9UVkS z2WT<($AN16kMBP{iAksGHNC5@6c=SDst$8fWB;ifay|E-?55$^U@gFyfj${4Qq=Q{ z{ijvfe~N(jm)?K64YS~#+<$ri%~;lI=k}kl&api@#BMqX<0btNb0wsx>A15Bs^;TC zF(1d`^TznpiXOL6`%kueV?`^` zs2vcy~45Q z!}C6(yUXyr)y~~zus#Bl3ZE{ZYFC>IS3v;ZCr=2#*yn4oFZx-iEeCX79YwUf<0)jc z5VJR@*QQ$#rweMEgX>bQ-3{+xtEdmo%d4*wed?AQ=;903UkK;LFTe%LmGUQD!TDzq zh5lJrq-nA8%i3Ur4cy~mY@0!2JRazbG@ZM-?KpKnzqZ0oQD1n7c8d1E&K7=?=2YM1 zvw_k^QKadD&28@}dfrSa#HFOJXivAEzJq&2Kf$YFkLa&dv2uUt9Sl-x4e})rwzog@ z5YETPpy&+m@u%%q*cWs6hxWz+?+=yn{?H>Rzv}c*R|cEe8axH8VAmv z(2+2arL3h5r>8?GMBDAKN39>If2!-_+f4;H`S|h!mO2IgU!PYSLcIpz>l7J(#n6;^&^>EL0hGoo&BtPkw(EM2`2MQzj!7_nu0Fz@9ED5uv2JJ~)zU(R z4!+UhriTD2G@o5Si8XhYlUl8Oeynpmx1wNMOWEFU-We%)_J~U>Ze93cT>H2&V-61u znsj#UjA(5rFK@`OA-RVhR;vz&4Q2qM(UGX{2&5y$cYEpmu7V!Rjjvj@iK$yBAM@kRkQ_wVl3riwOLbsajN^g7qy z=N#!C#pg0vHevcZni8X_3_T!5?9KipEcN@Kz7{T+m=$U4={VU+Em1nRR7KQD*l1)S}E#UD~+J z+?2A+P@&R2+L6^CjfH~LF&xKVu`K#6R$LZXU0Ee5r*#*?>>k!3pryyEC^RC*`B3ip zspC=ZbGvKhg*{X|JA>)zyNa5=DP?qK_LcBcXnxxG%#xHZm739+S+JRWi?L6I?-F#V za*~dXTE!@we}ZXgQCZ8sGG#oMBV~eX&-fk}x_Q`^1Nv>uyGZj^QXQro-#s(K?s3K{ zYF?_$A->R_(sau2Ht9ea;HB)avVAPpV#!Cew@#s_D6_EXRcQy&&t>{-Z~FI4`XybI zzp;z*^*0ncYkz@qJo*D~``?lFli#bE{u<;}wp983IQYF#`#pklH!&T_S6TS|YHB-I zrH;-FHKmQt9CT%RQD*M^T?#Wt)paY%ESc6lb5vnwZeivi5P;BWQ(@Fg4&-fSdF|<) z3OeU)#`sPJ=oJg}UPXGFNbi+tMVW)OVF^3;lr&FM@JyI?*pm9A?CL7SPD7JML;zrhU zX-9hSuoRWX)ibU~wSkQ8kTGnP*XVG-~{E)b1)&@4w*mXW@_MaOFLpnL$;ozW?wqmK#N9t?Youu1+aV zY%{1kZZqRD7X(trrFk}+@gy@uu^av&ysOIwrn+wPceygXDebD%t5ZTaSI;!RCqmUf zj6=_MLU+|MpzkaKJdJ6F!ba^Q?{-y`c~Nb;#vYfLhz=&7cXL#qBjvT-Wa8fzfVVXFH2UGgcs z6gC+Il4^y0@bNzQ1Rwl(AN&L#950aZ2&w7|Daj{N)fZE|@X5&_kW}>*t>jaw>dPu# z_-~RyCFd+3ywnFT^TEq~@CqM%nh##-gP-SvPxrxR_~2DOxSHiAolCXc*Fq$mOI2Tx zNr2Qrs`{#o7w++*X^^F=ug-YUUziLk`ip#Un!P56RO@%iAdpmRt`9!X2e0$N>wWO~ zKKSK6c+3Y^J%7@A zO|jzgX&#_Ms&$XfCZws>y$Q$qAl15GXA{y?Ye~W}9bAQ&BIM9`uS2T!cb!d0Q>}** zj`cyRMUSo|hP60M5prl;*CExS2VoOKcbrcVxE|x_w^Ek1A(0qIXEL5;oH?8Ekb$40 z@Yf6!FFs?Orxxz{-!g8>pT&5#OX*}TQuqdU{X?Ig%k&`)a7w?2v8>muK?dH)c&>q8 z!}1FZ{6>Y}VxX4wXNBLMgwx|0q<55Y<{rii4BYwV@!t&8vL06S4<_M{D}0wEe51m7 z;waAUN|Q><^uAsTpsOh{9Ifd0O$2c?U*Vx7{27H0Ou{!ReE%eTc&cR$OgY-c_1e}1 zg&*VMzvA453NLi=UYvUh_<)qxU0j!t_LI#vMMSSFIb&RUEhm&l_7uB#ch1dF_*fU` z+c4`7J~&?T1Uci9=r{S`^!t{9DRvV5p+0zt!ox1To=MPss8@M^2Yf)vdY8VMa|@N6 z_`Fohc}~&4&5swynUsd4ESaqfNK15#RD+~(ZZK5~Bak(1ej+}0W|gOZ=tfkyRpEN&J>Ii_uH?k$?X(_AVc(vl_jk?#{=4!OKF`H9 zeN^G~F0SeCRQTmCPV0pf{-yBWI|ulG4d?poMtYO+GZY@5KNoPp?gj2uFaPktAM?SN z0UwyMAjzI?=s>*ih{EIZZCW>^uu$Rgc{Q!`QFzz~U#IZ+yqebQDC`>~y~%iu!sGL5 zT6?3=sPKgtUXh2JUq_PlX!bUV3l#!IvmGD_lAIa&EoCSGu_N=T|;*g1eJF zt6lp2I5$k;Yg}B*nWXS_E}p}=OBDW$i);Ej75=P?hd8%Z;m^6arvDVUmme~*;OK=9 z^1+jTkTRsKy4sp@ntCuGGHitNYu5N90i!R#yUxbo{bt1{o_*r@<4&5AAD&rtQnaRW z#yQ1Pr|vN0kg}@jE_dExaee&SwULe;#Y$yf9&8w2e!*<~oOWh$N340n9Ny6v9EYFM zI1&BpnoIj z-(mD`6#dJme|d^JFHhwaQ=a0=Q*?QXFHbS%Df(e~+SSAS9^NP#Q9R2fYVQe=1VZme zTO^6|l#E33em$;yMtMzTnbQu!WoQ<8zec+lGp)2{VohmfbY?L@hn*BHoiVkvW@_Q| z=~ZQ=c%5ExaeH#2#FX1bAtN0l#*8Q~8DFN$9|xTVv=aswlg#nIt}dJIIO4DgT5PTb;-o9&f+&TuImFHB>5X3$Y6X{E!_(XETFm`ZBRppFmcxo|P@kzs` zSVgA{sVT1*GG)p+bLLE`F0YwcH3P3Ej9xHhR<3KMkNo^eGpd~z7PhNFm({nG;cA#x zUUuH-nyT~4XGAJz@CBA^@kzs{=-TiVRy0gBS>JY@Cy3f@*HT)$gi@l<1t4Ylkgych z1bncKvDR(EYZ7RjExUlw2=t5D<&hIe1FBLr# z`h|8nGVOf~5!KUZBq^PKVpX)1-n*K2*l|c_l~1f1Q$D?XX0)<&I?n<;+&N`tw6yHJ zDP_~nn^I9)Io&OsY1GJ~${M`Zb;oUTZJAi*nCEX3H!RbHE_Ixx2~D)Un(C5R?e_fQ zIc4S5%G<-;?3n4LGiS!TT62)^^x!gRi>oJPHoK`F)np5Zth7k3NZ9rP#~*wt*<6=#;KE0dv4 zx@reSI^NR#TzidZxSA=eB6ZLyCYHZ_;v}i8R%WdzbwVl2^+beSCg^2R*uqAmTCX`-qcKM0r zrOxd^d9gcT(DV0UUX%JfFK`%l$U8gJrxvBP=lw!5Rb%G6hcTt9-}UcjyK=FQ49}QZ zUK1@ozwCT!A2Z9N=;ZX2aM2wOsu_ttGMF-@Y)b^E9p`a47nu!4{sWjE=3TI{(D-3Uw2O#R_#vjyhiXzjQj? zRp}wYOh)!MxtO(qNJY93P>b z?g^45PCO~G3aPo|zKl9B~rZ4)LP1KkA#hEZ-kSgI;3NHem5slR(mwgWG3#=yxg%>HRqQ`!{qV! zcpoPie$uq6+2V}pvXQvQQLURM_lb>Lty%JNF`kjYciR#1qeK;WSy=7ATr6;{8|-*-yKvTF&8&)3yWc_GtV}#)B*i(L|xvag&b+m z&Xl)F$nR=-r9Y+rwH&hlY9aqHAN&6ke!E8K_48Xj+e3E#LD2t6;MWO!u)t{-PS=ax zfh0MSUbkn$CH)aTatawY+iiuQm+gPH4?XFkKzb$p-3p~=t`e^=y>m0KW5y#E>f^RMuG5C5jFju1R{_e>4!rVnv84zkQ{pILCcZ;k+^>Hg6K~d^mCD? zV9Jqxpr<6X{C_BFho1TtjXx@Id7Z9joXREJ+v|eKv%qD$mH1de zFXhZ)ob0(+$azZOvVUGB@LL6aH^#|t3la78srx0urQQ>8Oo8++Le%9w3wa7eFYP}^ zp~?76flK++hfpx(lS~SP%W~nd3>8fKj~BRosv{zofUgA299L&zll1+gpg` zli#F0|I^C#ny_;U^4kCUc@(p}`gxT9Tg&_ZYCZmMeL43LA<>@yCtr86-;n(zz0-(- zd3_CaU^VW@a_Q&fh+d9UG$*G({g3P?f1}W3T#pxKe?|9D6ioRv$EHBIwErN5I`{*~ z>;B}Q0$(EVOi^Ch-_pw}DVTc87&q;7o^www*E~Tl{SXtl^e4UXNb8mMq?1AfvPa@4 z30#(|igDA2>8Am-dtiT-NVB z0+;1Igaji{BI$<<{9c^X^d{1!pqnRYJcGqRmaT()y5zpL&15ZFe6+%4rC zu22V;dXM$NPZYS6Q_eWK>0(6fw^koKU$k3Uk5>s?%K40O)BfE=`;l_?VVn|Kt{fjc zSKzW-A<=%MJu?L^_0AQzY*#<{;Pgdk3Y5rpb)Z6%>ub2cWx0xc@QA==xvpfK^h*1e z3S5@=6M@TqQqE5v0*$WsF+TNmg21Kyr9OD2z@`0nF;4bNJ3sQFr+2+kFw5IZ)Vs7t zzhi?=OI)@eY0nrR`6U9E?P0DDj&F#lKz9BeQTtQBKZ9`DPW~+DrTjYuF6sZ%?W#gq zpWJWXA#mAFWcyhp%6qU+J?eggiYMzukH01^+ncPf89wc2wU1uB1YHHQ{d_Lyr9D6T z;Avbhlt_E_V%(H}pulDQp6rAFM&PpjR0v$QhnWJG@-Gs&qz^f6NE%1veWLWk(Sly$ zV+Ah#;MabLh64FVwx7Q#)afVBLSA1lTNx*M>4$9sm*q+q^(+0bo4_T#)GOyRPqKV+ z-(85>p7lPsT&I$9bbBWIFBWp<3wtC^uY9Ip((8F0;d1_i*V3s#iPU?CsP{!Ur|o}8 z(93c??t`xuxRn2akT2~?O?B)cJLNo3&g*1(9~AV`&MiLpHi6fPavenq5lsI~@xfOK zT*`S);If_2S}p}T{WzlbXAc4q2ya2u_#Olzkef;oH6B8q0@2@(sPT~mA`t!y%+udiRimkIn13JeA1ZK3f0)1}eUZQ=eMI1r{#1cWdOhzVJ0-ooKQ--lesAsgS^A+t$d~of zBycJJPXd?r+$L~I@BALx(JSfy=|jIl;FA7d0+;e%6S$<;_b=3LWk2?=Q@!dslKr7> z4@58V?*+Y-qvt2&XW73wzejh=e{A@%mXPCez z3;bTjP5H|OJ&kc%zV7!-`Jeg738sS?f#~NUYB@t0H}#Gc^p^;F{hlq7BmH^3kR$ze zhma%dE-zNIOAq{ zHwb!J-j4+RT@a}4|H23VUf{C42l7S~>3vGb882{2uiuA7{*m^~7WC4d-}&Ib7r2yv zyAMvkd!|5kO8G55_*#KW`EN3A*01v+h2(lXH$$ma& zzZq`edLC0?;CjA7zb}{e=y}y-1K;S7SyK&M&(Eq2T+eTYFdvn-7*YFQt{bls_buBMKy6+W)db9bC$POW;!eCjys#{!ZX4kk{qX&y$d!Wj|2H^n}ZP zLq0bmaryj)lykd~BXR8qQ~pXpFXcZga4E-cefYhA!(f){Yk^Do=|qTN+N1X!OgU!> z`eN{Df7UWi^|(ghs{}6l|BO@+A(-+HV4UR0exBZ+M1km~{YUuV;{-1Kc9su*3FD^T zD+RsO`v)KVF9Mf(mkRmP58wFUWn>6~X^(ynG2wNH+W+)^CJH9~LV-*A#~C;MzgFO~ zys!D-^qwaQrktM{r$m;wEM1W+J0*Udz~#Jdt-xi!eWPg4$3mp`!w512ff9+YXE_>Q ztf=r_SOeGn?8gSK_sivd5Xsm5Y|1WRY5V)j2Sm3h19U*YpKOZGQDdBQ` z?=OO0uJ2Ksq(Jf)BKAb2@RXA%Kgj-nmB3}Wp7X)=xI^-9L)7JZlj#XxCh+$eC;OKR z{7ZpLy*~(ig`iL6_Dpi5pZf`1$~j2jvVMmNT*@gFxb#nnz@;4L{fJI~BIT6((4Q}G zNlzbLqCn-6@-Gv(q`z9=l3ri$rho46p}$|?vYjs#xYWB`;8O210+;j~1TN|Q#_M;K z7m~-X&wTK21%4;;x*h8IJNZHOpYw!0iv&G=1&)GAzk+dU&vM=A3qeoUj@Ek`2|zIA zT*x@dnTM#a$3ObeFA?-l3wk*ol>yg!-|&(1g^=^4kn@wk&lYlWMSm{+Ie~FvlYTox z&{LnI?a|{Gl~>|bf?mp>FXYSmS|jM2Axr!1MS)BEt(sX<@NHBz~%Zsy-$&X z+5Y$K?%*V!=3H9-nT!*?TxaXU3kO6m>uaFEWxWsc!4DU>lrw{Iv)x`KaOwZw3tal` zCm;MgE}&_D1LLON>jk|m*FqnBvA|`y-uIFJxxi()uHOv~Mj(6S{NMRztTUb-hjV(K zx`64aToPYo;JUxM&%pJ3`cVVlCjfy6D-B%FOI|SWgB^0~Edw9Ja@q`B&r7~G@Bu6* zkm+P}x%B*OHv`x6u)Pdi&$kXRa6Ny@GjKic*@g9!-gSuh@S+MqAAC=NQ@!IGt}28C z{tWV3&R`!rSKzlGujMeT9;-T0ABdFP`z&G>W894?`hN*JeV*u_6S&T{C+B%hgjC9T zLEt*uo}BfXXeZ^o6L>b~$q%;+JS6a&1wKgN zGX$P1@C^bVC2;*4I)VxWu76WQkhH&*X(*B9y-?uN{>ua&;yjg0uK^My?Z1O*D3SL6 zP2kf0*9Bg{d6IvF0X{{-5x3RLK8N`1$ujzV!1I0@qpcPmMl6 z8sdBkQi?hZ=L}(~8bo@Mz<(?7X#%IYiw>HG0HheuE$)0Vglz|1clrr@C?pV za<9O7s;iJ@f%BABA$sf}y*yP^_+~-RQ!|C6k;4#(o~J76I3#eMN+|qDf$KQ~ozUw} zBuBSx!lw#)Jr^TY zWD7h*3K1yTOXZw@qXfRUzzYT5PvF%8?=SER1ip{J7Yck|f$R5o)9L*L{*s^%3H&XA z4-mL+^mKZlz<1?~f$;qWex$&21YRug0|Y)*;0Fr)e1ZQ;;MWO!kih>ea6PxA({jD* zAVL4Epx1MDI{lTv4-xb~3H(rj=kP^Nei$O~Lj^um;1dO|`(8SIroi(AeZ9bk3A{<* zzZUpI0@r;Poqkf_BLw}M0v{>x4+MUgzz^Zhi^@An;3EW{FYt*1KV0Bv3j7FxKOyiV z1-???`ks$Y=WwS<_8cwf4;A<^0>47w1p>cD;DrKzMBt+Z-XicZ0?!ibImH6sOW@-K zK2_jF0zY5iM8BTTT_NzWpubn(;{{IN-=IMLiKv|O?<;{HEAXELPV^V>xojS6NY3$s zet^JB1U_Bh#|gYv;6$&>wLst}3VLhE%nQzsmY$6?TH~bCbS_#xCu$9uinmx=L(ZN# z(;7m+5dH4Vq_;rhmCVyi6KTx1CV9RPI+4Za?N$0sVeP)TbjUenW&BRGDJaYIa@W|M zlA2I#A4#2j^=y|d?5x~G8~t8|)uorDy7i)7a_lEky+$#Sw7r*ld60X*+|nUTZc;w} zcVFD>(F!~F4rwn&ze4+HQ;zZ}4!u-0QAPW1^`URqx5+%t>qC8B*tWCR)J}=@s98U6 z%lAMhy0HECu6E+(&0gZ#b8$ze__(CASFwNpwUdH9yxm?gcg%BUZ{MjmVEgxoJ0>o< zq^6wCyaT)QR&`2R$3}InXZCF;W?8!?HrdQ}yUwl&_qF*K)RA0(_!}MblHc&{U(4;Y zC8(ipoL`(x-%9Y5Y0~%!P#w6Jql5szPTqUmk*|~XG_AcCOeZiW*z9n%*M;bpQ@5kE zQ|umUea8v$Qto!tc8a|VYCBOlTa~U?WN=TNf6317<&COjD`^%Z>^&WL!Kku+J zJhdbhLccoQd2ze16$V*5Vt#@5=y$@3UqVYw6)hRKx8COa-f5vBZwNm4l~7pKVVR`f zgQ*W`g1DW%{N)Sfecfg@p{~4uJV8O+V`O)iKR)Mp6yH>fyP$T)^vd(fr(Zy|utPGX zupO7-*E4syh#uy6ysI7)(wg$pXnFfzs7v&=hnRL=dEW_FcTHgD3f7KA-q(m~|N8zu z{&xL#<#gzm4&TkcW8UddZ0CH`2{C@n(WA;bAuWEj;p0m+(c0=EQ-0Y`DJlh(_pb!&V}1RxL4%=-CFCr=ud%7LHNj%-LQs97mPSjMArC zxq0D8Pf1*X^!3x}L)!a#C%#FGPwC9SzSE4VX!($F$4xp^ecFzX&zVs>q`IaGpZtuX zKU5uL`Lrn&HTb|S2Ev-E+G@GCwG;Vg@GyaVPC|<+;0$l4S(|V?1Ch6L-PDiYW`6zb z2l3PMW1Z!n=)q5A?kxXV9{lt?T4(vEGrufaJ_@2viM=9B#Abb?XEVRle{C1|2YK+*bF7{9-zX1$dakvz z{I&-_J>S_`e*JvCEdR}2;Gf3&^|M=>z+2e`{(2Al@8|;mbsqe8cY$9&KPSt-xC{Ib zdFa2V3;ZiQ`2X4ke*HY3w4a{4?ri8KL;v$# z;9tW0Qh#d~_@D65PtVA8w*9T}(Enl=_**^nztjc(4IcXGcO#v(|9ubr^!udF@_*u? zpMFo#S^jMv{0qClpT^G#%lf~h3;bCg{Perj&f4GKgMVHZ_y>9L({C3{{q)Q_4R!n& zEOJiJ@9WXWI^|(eA6f&DBaGF#cxU;41rF+Cc9j1R@GASczO?}bEU>o*IMw5!hD(s~ z;y;V|$vzoOetJfid|F`W4>dVl`nLs}a7fQD>;6>Zb-=vzFJS%V+JLG5S>{hM^ekS-ba2jHcDNhkGJF~6x_zX!G>{q#P2Fa52ozq>RRd9(ceP;M{&jm*!Fo4Zm> z{;@v%TRX{5@6GbkuP?NY^xy8opT!p{U9&Qn_TLJAul6^J+g~m-Z$e7Xnd|z{?e7&I z{R=v&{{(OkwPNZI!p~m*%VNiMRQ~SZ_bUHQ9{MME=r8iozku~;f=33^|Ht^~ zU&H#fpUMC9yuDfe8Xx@&JE@<3U*lE&jUM_>@X&vokNzc{)K9ZkYlcxBKX~uXgxl`OomsU*MyEF6*Z`n+#_8j{v_{`I}k4Y(Kw&Ak+U%tlw-u z`u8^-wVy3M_Ghu8j_U72ANw;FIHi{UEA_DdXtWcr`qS^Hxm7w3dDDOS;P>+1T-Kk< z{M3HS5KaHhWBsQ8GIw$f_)Yui{YYN+Z@$K1l=e>tWZGZJ`c418*2CfN$o};{_HSi=T62-XwEtNj`?u0! zJHlcoQR7b)@*r0so710IziIzt-0-PXX#rkz(%B%IUe=={tZD2;SzZTK7|5_jW zkK>77NBz&^KK7rb`Hcdb_Am9ZKbJOJ5TyOomz(x~;$#2xpklZ5{)Kat+vsY3>wP56Z`wZ?{9f%R;|7OgD>IV+Y5&r+zm)Zx?PoD7>d5{(ee7>#e!Y*zW+aVY z3w`Y0#`a79)BdSx{{|oX-|XdR?8yH9=x4nAZ}GxKNB-{%elP#G(qxs9OTl{%RllC(~vt!eS>; zX7tm%Eg7p6a9GmtZgmH#!GVL#=g z{6C-h&Hlfd`MY)C|9Rl|^8aSGe+fHm6KtU=g=zmrANyzTN7h?bo|Cx$P5+O_I7OIg z{}Sfc?@!SJ%=R-D{9g9o^cRO?GT+ye{WK()_E)fe)BmRqboh^V68FDp|FwShGykQm zUkfnpZ}PE!>mr9kwtwo9O#46av47|R4*x{0m{ZgK6JZcx!wkAQ=Ev<-LeTs=y_EUQ z`dh&Ky)+?9G0T4;0I&MXy~AOU_Yc%0&GO&M`px=VbfCjOfc5IcFvoh%$NpC4Ur)w~ zVA{Xd$No`wI!vzjZ`xna{AT@aWd5UEPA8-FYdJ44 zzgf@w9OBTws|i_-acKPu{Hp#8J#+4MfW=tfqp%5)s#NRGCJ z2Gjq0f!|Ai=x+|!Bdn10--T%EKa=$vm#Gy!(&69gB<_E+{P+3TU(JrEF;@oD{>47_ zZ}^A9WivC`e-EN*{}-%(7}L4Q(N6Ak7jQC~Uzg)Z%=0L3`u_~(*VmsGWBTbZ@O%3I zA%|ldDvMb!Fr{m=K&Uww?jKh!YH^xr%m{n<+$e*M04(tp2){$;G+EZ1L(9sUJQ z;{NC2xX0Zw&m_$Bf9_a^B;TcUGP?X)&S}hV6w^AF`QO%rEXTBS68OFRzveNAL0*4< z2c-3D|NqrTe~InzkLcj~yVFO1HQ)HRvcgRe_mGGFPguWMu7;Bx{ogo=``>Vfbqwao zgqi-Edy2zi`rm9nhlAhCe+8=@eqH}$|348;|Is|1T*Td+!-W6MtY6dX6Z%-EH~Z*s zW&OIINdKdVnor~Rf}gNd!+~o$(68+Y?74INr|u;GlAYx5-nV`GscvO3kEiS;|3AS` z?av&)wf}K@kPvkJY4By{H|uZ1DGr6MXH9SNw}M}_U!(pvbNjKGk=oBPM9r_|e(7WX zR@T3-R?Mk+{S1U4D!*xe)?|l4>(OGgeto3Y3X+@lx#}Vc??cd1!T8|c^_3Ptt z;P{w1t`E_h_n{2F`7N54&t1!0=d{}PTh zzt+Dy)>(+etpD88h}*K}s{iqSnqMQC;PeZRXc>T8w!-1^iy+&!)zXpvy`1|2m@P*Z2a~pG(9d zl(7B-1x8t}PB;A{^BZK=Ec3>L2{gZ^zX$x?a9|8y)*R*!X+lo5{Tgmz{U-lS%)iiJ zFb=IJz_0wL1#+6p{?p&DA^*LDsQI=3s63`_5;1Bj{kN9hNtY zvS)R_v^X+0B@l3@z5%@X)s#=VGiJvm-5SJi6h)DNTg#QEaA;gCfS0U2$YYifuTZ;Hk z#77V}Aijq9IwGBW6!9^{#}St!u0W)D4xM`vk#3`&Mr=lGL0pDN=V*ALE}pts>gt|F zq$W$}o=0p&d;yXA{1*{lLZoxlET|uRm5<**`X=IAeEc?2YUf0|5pfeDwOu-X5Al7( z5BT^)q#q$}=HoV`A0uwz<4=%&iui9n{tW3>#LxNo3#4Bne#OUMBmD;PTR#2{>Gy~~ z@bQmGe?t73kGCTw!>A#VeJS`y-|(pTFclKu{$64KuY^t^lfMSS(*43 zM9ku2TD$Dcd3uh6_LBDC<2{k~~U&=Hs(DEkin$^W~gYAU%ikG^XRvs>Hu@Ie#9f(>bN@ z@Zisy!Kr@ExtfoE%V`bLnVgSuT8nfR=Vx;|2k8Zzr*A6a&!TT?U(ESSIQ<>cOF2K6 z(|JfQ<9r>b^++2yKcCafkzT?17^lBS+Q|7UIc-9E73Z(!bOF+9IDajte?WR2=db7V z2BbG~{w7ZUi1bgKznRlpkp7wTw{rRyqzgH}h|}AU-p=_uIK30;U7Ww0)5S>d;rw4Y z{TtGIIe#Cg_al9P^GlFE$oan`{RihCLi#Z0mm>Wq=O01(DCZwT`Z(vGK>8%-pF;XH z=bMqXaDExm<(yxEbS39kAzjV+HAvTTejU8Zz-$ME}q6}XK_x+y62p#A+uQ`r*oqviZ9Mmx*(0Q94c*JA1v2F~~ z5eGV7IFTtP*|DGOx=%7dN&UNJ*R4SQv!`t2&n!GcaT7y0wnD>-E)x4lrQ5d$diF{~ zhnbOQ?USoC{37~Gy!8|OU!woNyZryF|G&5W{bK&N8^>kX4b9QKt=lt#*DtGIU;C>` zc4HN=PooFejhAGo=1kXC7BzWw!BqtJD?&dN+;1)*>&)f2$kOZ#%2PXrONy=S?4)ye-B{ngQFc#+%GDd*SX zz4lY4mgALyRTo$X%p5d0R8d+vy?pABP;pI7RZXa@YHIo6p#!FN*S1nB{Y5=p-Rdkm zHg2o(0DO~UHy%Y~g|X(mX1i%O%G*tQP(q`K)7?|Nd zcluOV>e$atEG)RFyzSX@kZVs!+tZh{J1t!`^Uf$9uNAkWFPj?oa97_!(3ef+AE5M6 zX}c>=sJeb?kSwwuAV0HX#cI^kqn#>vH_Mtr-k{Kt{_a|T^iX%$g~-@vN~`uQja*uV zbA4-L*L7&@mb=LY9)d}blB}HwgZru>I2E(aVLkEhXt?g?fSLiY{gc?TlkC_J3B!Hk zm=O6eUWQ&|@abnRuNb2H1H19OP+l|5w5+Yc2i1iUybc{%^ysbIQBHJWi&o_$bFo$g)>z3EqWLlLhE;NRcq zpA3HWi*4tsZ+AM^Tdq+$-Tv~L!?7P#B}`HkxEf8=tdL^6(eXDt z+XH<+W^&5suJ3^lh{QJ9tBW%nTMx-0Z@>$pzMm%VJI;%(T&-?_?9~N|0jatwkW&9) z&9y_RkQa`{<%pK*$`LKKcds6}JH(kw2I3yzwg7T|_4nV}znx;owiTXSIH_>rq?7E% zeWTv}sjZGP4H(naTAl|rN?Bl_&7sgr(zuiz2w3pe9CE0f4u^D#RuCeEe2CtfX z;bbdVPYWY+FFe)yBA9io9c;K4%Vb53lLr+w+J_Y9KNGx~ruGxc-YXvbT2bTdv`E>D z$2VQvGl0{%g>{<)k+QeLEgMshYdYiu(%x7-Jlyh8YH{GXNaJk_0UY0S#)gauW#2@C z4}3l$@XCayl8kW6hpF-FH{3WeC!;8~_SnWF4~hi7wPW8G=6`;Po&Q#}NX;|s*sI4i zrS(RqR8I=X%#@1Y(3V-f@V{Wxtn@E}y$VLzbp-_hyKY%VB!5}$n{_RLW1ITym;ZTf zOSo=j#)SNzYHvCn&8YCq!rv55Sx%)5*3$x%E-00~1f{+7HC@t6QPM3iUY7J5r=)%2 zC4CPiecml;bSp}_9VPv4Lg2FrP18`)k5WbXdPf4=ead%`S-v$Lm+vsAe9KV2*AvQD z)L6pRw=Q^f8m`_6W$zXbe!;1}H;n3grGx65*cz|CwqTWtb^#+&Pqr$P)W1D*JP5qZ!Zv&{BRDC%$m%lFBzaltjjV74=j!R(Yud7{M zw>mJssZUn^x3%}`%B&NWDXQ>9s>0yay?>?>I}P?1t46neyzBE6l=~#nUJu%m#q(os zl+lB@e66!SRn7OK#OBK`q2~LF(|oCV{~m^~Cgi_Z8xtkQh?<+-6DvQ%v6_pk)%qX> zxtpkGek={S#p&o)8+O6ry}RJ>Th$fg$O)=Hll{l)aig|xzjV9Xe{`kq*b12#RM$HF z$7$4m(6h3-PE>WYfJRq`U;mNPUjK1ZT0;MkhW;a^qyA$o>SMI1k9hy_CHfEQKC+zN z<4f6lq>=mIj`tqRb%XnpaDQ^|K_2)bc$(9LysXRW*Yr?U{~lxs$|`ygl=UO@c67hx z-R_P?IS&`*JZOPazBL_|kDAvrPV;)b_BK(zF83boRo=t}@yes#LsgzEkI{dehVq=O z&Z8U&{fDl%{cu60sqVw6I&>drvRbvZwwtj<7(8eESWG-a%jmD161L9zH?`ijgx1Rrq1O9ayz_WicOF-Y5>w~V zE9i6{OR4kth&qoOsPlNl?L01{&f`AnJoJ|Vam*p9|A;hJg;tFlg$e38*@cZ0GQwqN zx|5MuB+t-8k3*p8{4(1>Ev7ZOOQaJbG9GZaai@7^GM|EraMPV?j zD96U3n#mIh%}h>h`64)Z8ODpEoQ;sMG1%~L)y>!#=l&0S=K>#9aXtQB5+ERY6GaTK z8gXqmf|5|wtk5=#8@US`#EJqI0UJuOqNcb(+JXd=Ah+uRZGHW$ZE3Zw{nc9A`Yvh$ zk^l+@kT*hj377B)AWs$k-!u2#eIx-<`}ns%@`1Z^@64S$bLPyMbIzP|CLcDXN}IKW z_UT2N3bGdli;n3q97U5oujtVppGdn0L?^d~Wf`2K(-Oq!F6wDyQg69mXsjsP5j@7G?+$Xj;rxz`TPo0u|Vu*Ina8Kpws+LA5)vPyTzec10iT2igU zs_1>jdlqUH_pxXv44MT7tvtno6yzO<`L*Ez&tTx9Zh?arj!l86Au`_6;P)+@Iv0Qh zva5ncN2UGIkmgqX_Zuq|ENn2)c|F=!;ODY{W=!@h1U3pHvl-GDJOak5fP0w*k43;E zB=9(6a2N)NSJtC*|J_tIEtchc%vw6_{_IxAgM$RT5|M@Pu8=er6L z`dMJCD6sljShNU!j(!%pj}1y`*GtBIgmhE&@|)mGKzk`aFJvqZM%!geJ=#mX0(sRF zyF!OxNa0HJXB6i_i^3iKMuU}k-_}^B5UC~pvia_yd#&I1QORF|Wz}h+K4Iy#$Xy9Y zAOjxq42JPmNYB78X0$_|odL8LJJlRm^a;R_(TmRlyW464$l%u+D;@L)6apc87BDM- z#Ms#m?#ny?|7Eac4%qm=P)`YaY6qnBR*?8s!VI{<=68Y$|F4YEFB{dvm&!!&=dGT& zm)Wq(nGKSwpd_>5eVGlqd!x*TR}>(8%s8#$j$}YU!mhdyf^``}-)rvn>?{Z!t4{H_ zTt|hD{jp^yj#+QTwAd?jY)NYvpd*yE{w(^HyF5XH3Pt*7jWvem`6I@CKsBO5jSfF2oYi%&j3QcCs#OMW^pk$h?C{bIz+Vv3rQuI0^fNWr3dB&<;6 zf9KH5V9^Fxs2qP}aO$9F=v;SU(egp|3=KpFokYkAxYrfB7lmZ3L($%Qq-%Q7@`2Iu zH@0A2uGZb_g3;kELeakG2O~G96&Py}uX-VV_J`k+bv4%~t&`Y)m`Bsp z{bHm_375lcQWc1VJq-ch`l)aFv)AiI@9IS#*+6h;w?F~(y%=O2mgC@VVbMF$`{DAJ z0|?zM5K)vI7z~Jx7)r;73LKV&+=~SUGA{)V0b`S{#Fb+K-^Tm>796gn>k1A+r!r=1 zFK3MP`&LbC3VoXY?sZnDN@dus@m)6{(xq+4 z{gH00lOY~qb?s(FpI$~hHdY{q^-}cdaK0jIg6=k7d2^Z$MXVL1Pw5MtIyhyh1r8W2 z@W8_N7=5x4JN#uqe7_I+BktDz+mV~NnGveuH(h(0AyC-iAvcq_Ek<1)wSk@lB)c}X{hcrtUB zBfD_}&oaW37KHb5NS8m-*8|*A(ez}0WRPBGEEWE1g>YR{gz4&;%u1veLbiq@gR`Kd zy^oG?6Z&|H4tKHGrE3)%70rUhnA8L6Y;jwKMGFJjHNrg<9S%k(``mifmKHKntk1n; z6E*VU99me29(F*qhZi#_|6sLl@h02)v(a3O13F! zpm#RtU$W4dyJ=d*4_IGxwj=;=_f!R5t>OqBM)~MXnAZv%TDcep#poJqash-5zBC54 z$RuIJgs!Fg-ktjUP*F|xF$YMYGzBCev4C1cPFBETI$My5j`(Y8DEiG*rC)hu4n_RH zKQ&-%)FVG+gdt(>wR+Jaz36-)3BjUvfCq-GeNR2w?#BY6AP{l@RLc8c%DY0>V)Q+d zA=IrgfT{q{qLQs}UsQB)z*jB&*8;R@pJ){m0FSu=Lgug@ir08sC>wZ}s^(_VGFT41 zsIP~fqF`zvIHAzNy-dp49p#8u|`&`{d{afOwKhR#U6y7J$F@@yeOClYFiZw6` zcE@KywFMoS1=a#)&4Sk)3dSrbl3_md@yU}rWn5sge6nrR^&(8OAWjd;zQ&vG&ahG~ zP_Dn8!tL%9GM;UD4F)-_Qm`5lH}98P^DOaC_^ssqof_TR2ZDFN#;O=f~)czCNXKj73<0QKuJ$2(?q`*~n)UC}F7NHd%sutOXWGIr{hxf)m}qmS32KEhDsYNz$NhlB3w zvATA5C4Cqh)b3s?9T}^QuaZxU^&3|wG&lh+d@Vox8t@4E7Fh78e|GHbLTOSn`?*@V zSY|f(+0+f%o4V)4`ovaeY*#mATmhT_RD4(0tY)#Y<fHLYV*(~^ z`o%meM`FE5pgwK01+ZxXFuqm)QyDMD$-$Vxag13-i?x>uv&uG8*>MH)_Bzsc63iEc zztjk;&KoN!7J(1Y8H_aQe>MI2)RMZ#TZ!V@%PrZcI^=d(uZ3> zW|y=m!UR6$CU!wm*&^AUD&~w2q$wd(T5Ip;vUM6X4*7=&3DKwRmYRj5&eu^`>LK>X z2Zu-vE3ZVko*nRv*0MvMVlDe&Pbnp}>?b|5)$h}uIqLUW&-3c{1y7~=o$IOP7iQh! zCUq+GiuF#pC!OXf+FrxfymVCZGWBS{gK9G1VTYfL_BoP4B8}fhRt-6yPRPRToE`M~ z+_AGiBSF)R@hE7c>N3QW9y0dEOhw>=kgV=Y*Sp`B79QsegveSvz5!YSuO7KRt^NWv zu4sE8V0u|4!V@~4$Svu*uXcjja8lDAsRXe12*>SB;J7~kG_w0Y?JXG&d$)GJq6dW- z3l#P#NDo)}ZAw4uMamRn8uI6mQKJweXp=P|aY7E15U6ZF9G# znqO1soG*4FT6qpP$!n}yU>(qz>8fxkZEk*f>J_p~BZS196KrZ4AXv0d zQ~z{f#o_R;ocEH5#}PG9^$(~Ydve#G?M|-d5MOEiNH#q_uGBQW8fqVL>$Z`SSKzGp)CJ7c6@w*AMM*tcAD22(R5HZ`xd*Q5A2>Sr{LjNBWn zCo$_dXWH4ef%O;K^`2t>$qXyAY-$AFe6zld19)cp4h3@uZ<`$mVBJ;BWNttfxU1V% zw`-QLwm*0GT<3NzcYi|xE#acRV)45Prf?X6_7u)E+nF_O#2D21cmj7iJK5gTGW1EP zUX72%kmSl7aI;&9v{#f#N9DiA= z&&VFD5&nU6@!9TR9!Pfnd7#zx9zn7v+^(OxNy(q!lWq8fxojx%6@Mhv1M@%iJWKWy zD<5!%h4rI&)6Q&aVTqI;?2b87(0DIAMUQ?HPVe|PCSIXfmV(?pijhb0R4VO=^Ie1M z>a_%WgeVp0ug=<CQ$N+6zW%}WejNGQzbudIC-90 zrAx9ykxS3eWYy@NFaS15ITZoPY|Geof`H_8`(29bEw?z_Jf3p7z*UVe_9+dzam+Ds z6ZI!HZJ7n4=PVE%ps_KKy~;QsI!*Rx?_+=VYPQ$>*|nupMZ0+c44+tKluni1<6Cdg zwQ?P)CNjK7EQt)nR; z>uCl}8MVW1n`+l~t>@;6t@TJRUDSe(*_lA0;yBEY4QJrwFMEq^XOo@yfNzIZQAuXm z0=H~*_{MuSXwiFk;0S{l5L$So(C7WB7;-g(Iz!lWw6LTA2ATbh1A-q3=pqnO7}W$# z5-~&&s=!?XqF8o8Cu|gn(;GbrPee-@9qHi7&5iLyNycZ0Ct_O5ShnT=x51Nzn)f}; zyI&i!QX6te^R5#-snfh01y5FK)4Nhy^R8tiHZT(FHSb5{$ygj?P}YGbke}h381gj} ze?g6t6ow22Lyj`i>$D-5Yk?s$)pmd(+qH7>2d4N2ZTfLif+5Gr+$0#XUNB@U?`;qa zSt}T_UNB@mtrQHY)5@RY9o4QsNy1AbMt)2KXvC;hcB@p2R%<<1oB~5ofx^=#A&1}h zu~s39ZyPx<*4UuU{9!V3IQ*BF2{UrBS&c?j_;qQmHgc`GkF>{d0!Y%>u(BF}pOgB%)&IUl{WlFRzr)vTu?-Fyf`beqVOWF5%X{-5X9!hzp z#>idf2JVC$YUML5N*IWI-#fNI+qeEeK)ZF6B8Gn7Mr~GmDtGAHu3*t#!CUH^uUBnP z0oAuT^o~(f=p=}Ip?tZJT~Wc^h9>lGCqufRIhq%8??S=7Qr^~~S9MBGyNOkOjHj-^ zSP)9_U}*zJ-|t{_i6Esjb7XY*Si9bm*cpo65ADMqqvr;;PisTQmVE7zYI6&9Tkyw5 z%pqdOH1AReIiYO|72f5|DsB27D4$<`SSz1HB8I7>!PJid^*h>-B??owfs9A!)*-FD z1#JRTmul0qq;+8G$7JpkOx;6UNA2gmrGlxu1XK42rY_NXz7@_D>@I&#+9xwe9OO0c zQ5yM?jj0EuiO22c9RWeKp34MTuhnJ8*0FeooP`I_&=&j`g8r7~U7>j!oQVp>zf@3( zZ+Vw$<3e zJhcihLdIr(i~CyZtJd>46i*wnHhhiN^8m9{8?sp|e@P%AMC?MU(!4c*qMFgIgbr<$ z(XC>1xfx!k$V2)iRCottxJC0W(1uin!Ma`G(t9AL__9-Tu{XG}+r*e3!@@!n7@G*`N5#t#4-+ z3Lec>b50j-&qY*y>AWxw-Rapx*~l1)mf(Cm@RnR4Ul%aSevIPzoZWNXIDrdZo*B#c ze^Gw4H}zY*Xu9yCLoEsnFUm%8oDaQ<$HGjErQ20pEKU?VaahqM^oUfgQ@e?3ClsdvLY zNx_f`zsNndZzJEvWML6$Q}Wrr9k%NLJm~>wEE!A2GF28%oDHntN)5g;E>8e5ET4LI zlIeY$k1P%AQecgMb&r4*-t<=a0x!dyjv`6LBkLu9`vKujsbiEWuP@tMaQ9JCWs%CEIh0PP`|2>y$8RLXWMQ56?yA_lA zz9PKBnjVHbRjlcYJW66s$0Sd)rmU$ny)iZ!O}JCG0AhF}T&j&R0x^YYO;9J1OKpZj z1!b)Ho{Tq&zTV~F&6vh`qZkT{KRqShbg}TJEhGAE!JCDQ{(JmqeHgNm|A$DgQ+QKH zYNNs%mRAq2ale*<*uX%nC;gG+%U~R1RMvqvC&}0(L%(L?Y^tB65N5C-%uyNfb=3a8 zg)nL!?hu55Rh3XW@)l%XqQVHm92cl>5`+=BJp-H1w*=zrRC;e=&iNRk-y3mgIs$(4axnL>1>*zBK>nGGO zoBSQ-MT%i9rE99bCFZ-rn=1KBioP!|Z8e|dp_FH$z_2cjF|2Zou3{9v?-hJZ;8jx^ z@v5QdfEX4FuL{w_cCbqeC3zpz?pOFFTRRPf?kXXG@?rK}5z=k8L2jL?bVr!Am z5x;C9T^LpW}VR}+2}g_T7aB^rvmfMp*UPI$BNOo zW58vpgR2lfg$wV>%kZocze(||&y$ED?r1^Wk7fLzO|Y$s(rpvOJim4Hh$@+gh|$VS`) z(%|EEV~>!zilWOBkyj|4wIGCVq2Vp~uNH&1D7=FI4GEK)HKUzE!=4++ftNi2eyMLi z_^wJRL|$kvmYbM=a3fweN@gQo_F5h#@v^1#MB(XDGb0)Azm|mebQ8wb+S^fhzZ;Oj z*uFu9jTzhFim{y#V{DHHqqitj4HoUkp-HXRA!C7XvBKvn1hY{xq!7?rt}zA!jTJV< z&?=Fs{RB4ms&r8^#_4Yp{#JIU)w(UF%Z>S4xZ3)ziVob94ew{IMrvt-|0`bvWGn=O z^A-GJwf1ggkk*F3#@zw#(1!@;D{>7_potQVi{~{!s~W_pgraQ~#K5QHMs9}JkqOC3 zzl8sH2u0t*g9X%574~ztOEB_1!B|+}nbyb%5B!vB%E;}K{gxnXC6$hvC%9TAxGJ~9 zE2&_<_FzxOE!G)WV6DQ>lSVvj3-w6s(PKR9n~hN;UwX2^7S2m)fx?q{^^Zdgto4q3 zdI>`-r~@2H@0KPmFo*F#QVY$2FtU=WG_zx=yDXlz?^@w$-)~VuR5)QuH?hlWK2oZ+3))4`S7&U+Dl{j6MhyHaTr=%p25&+88$=f=vR-S zVs-SZ;xDX6zMmNxm4>D02+xO+i^Xqvng7UI{Dv2^d7Bn0YEfX!E6844dcP=Gt;vpp z^?s#b9i(d&?+BH?1Jh?jIx&5IoeyLB9K^D>Xr&%`ZVvZ1M8|h>N4}5$#YbWtI4J5- zvVTGJMvM!CIguO0F7T05N{VncC_3b)sR8#QEP{I>wgt66FATch6_+^RD(dk9VyTCc9;Az zfhI^dEl+8>=Z)OhgE=ZLe}e}5eJiG}DlFO=$X-`iG~e!KFghe%x+zx8MF+9&RK4^k z_R{kRox~WVi|VcFWcvm3=!R%&7pt>N3Zvs6#x8QHa(Hy`%j)+#^c#2LBjR%#@At(` z`h5yNK)c_WQjFsJ0)yp+> zl(EBOnx40ZtjW-(%F^Ish+mZPq=yb1Zit34{Vl?pyL~rA@wJ8S`e4;o#w<~F)-S<8~tNEb^L9XIq=}#Ego_B1y&{b1s-$!0wr7g0_|+w zcdTTwwJIFY-K+h+LnVIT4}kw=?RmI-@>2q34L!Jtk%odXgCpDe_{xE<^ZMDz>1N zVz>TFv0Hz;6&a6lYM&H0`X{$w%9v0inc6A9n_Sz zu=`Rf9coHn#2M|waKA?Mg+=Rh@dyOw8sii@HEpK09?$ z1PAJ(`g=<1@?M%nUFfsj-$ZpINqOEODGw$La(rlQa`MsVBqyJFc=MYX-=V7iH#VgwvQK!1@d{+PS0$4a?CP!I zjwbY6NXi6AibNN2trwE=q>z+1grvM8B;_YUQeG315=ka07Ci|Xn5xA16>&MX+>LKz zJGjJUtc7WLA&|Y_SRD5<4n#TzjJ4Uz95-X(dKp}ccRm9*W7&?V*iL%`k^bJuRLk$B zhE`e*0Kp>M)fQQPFMR!#!lDyMnoG!c>FnVKq63sGW~GEL8PNvETU@$Czv=i_7DW27 zA^bh|F7Pgn^zG!2+zhW{Zw3$Xyb^K~2xX@@>xDfpgs;<6hTyE~UOgMWCX~HcN9SkB zpV~`p^YfPCU#yFNu^!tOK!bGL@h{#)P2yi{In-jGdJ6yIR0~85hY|)8{flX?*B_bS zI2cbB2jhmRe^;=mc3=_CRSw3lI4)ekgx#V;QXQVd3L<#6inv{gn_e5`ciS91*z`U_ zc&q{*2b#j;ShMgrV8KIqm;#R=@CY#nn!+P8RrS?(#PTl|7oHQbKIT|`l!UPpzNqHCFAh@3BzZdZA^!tu!v)+ML0fa#IyM;yKg9PgL zu|N?l+K7AV`&Q=@{OgU?g7p|7;K3KY71QzY9o;ei;)2M4oPx-$3jbkdueI=hv887L z{{;Y*1-`XYMp_UVDi3Oz0nYjiMaW(!^Pv7*nOCaQz~NG$5Xh^#cc09PUGZ6ALrXw{ zpD|LNdmpunpK%RtPBJ+wWLF{qB+#smYlU8!LaNGIaor$PYF`q8a`>G@`XurcvQ!}Q z4Mmye2C|R&jfGYerYa&Z;YR#@a=#QX-VbCiDE)y*RI+y%BTrhoU+3mR0cq(EnnXZQ zr0F~~%aL1=w+0|@;a@2NcVSVzA1`7dO?z&LhR&gvdkTw=gd)G5L#{)g2tX1aEPr$u zvR6O6{YP|ep`0yo%Ipf!yEP{=6pAFymPlSJv0J~bMaX>s7X#a$R>f_4AIDP!k%Qu; z1+AJau@J;07+ST-vac}KsbB5owqt!u#jhAbgxooK8}5%g7T@ZPQK$f$R1Lm^Q>y?;_C_EA7=qF8SKTMM_Cc%!Ad4KQ+scwh695v3d>aJ#CJ`{+(`K!Jkt!^DyC8c@ zVbKP?=+F((As2uEhl53UnJENtobC#ugRL=#R8=C5osYQIBLs4jHxm;Qdo>hDN3{*0tO?hr3yaZEp=@L>PM zF3eZQ{Wwm*1V{GYw=I?@n6Xrxj|q>UCTwkqisKSOl?~YzHFN?r&?NQnlzF;J-u0az~z%2_gQ- zf*_0T#UFX8_#?-$#0H!IXPpWiu?s{A_~w`V-SNk-ESZr27YNxEPrI)rj=oT{S5n}^ z4hTv6ZA+fb5xQ2&evqrGwI6{_v`mSA4t;Bo$YoB*xw74P77uoxxFol;U6Mn1IV>V> z1Wv2B;SMk;jTzG}`=B2p7{(^DDA&>_y>09dWH0htillytlNqjT5OmM>Lr%vJIUPUb zEQ;cX9QI^s6`de@iTqd{O)V^{#SfVkNydX!=~{ejH@7H^{B91J&^$Ga!js96r2C^k z0QUz#@A|$jK#&*;cwP1I6=Ld6$dgx7Ext;{Jt?{f3|GMsZNFRPbX$ntCbcd7z8G0# z8bPk66k;ThMo5r$7V*mrxoaH#M97$@=0T(_!+5TYVoCz-Lv%l0vQ03&(A}UgoOmD( zqlVx0L@>Ouqr{cK08`7ngb`K{YD5`X(66^#lVgB{&I^SE>9T}-`<;SZbqsRhUJ7ym z!vdMjy7|%h*bq~y93h11q3D>u$kvK47;Zw;z!=2*1Ean3;`;goc)`Ur1Fr)Pyy~Eh1;`)3Yk>-!1HA4AUZz-R1tLQ&rv11! z>+gy%t_x(Z4i$-gv(3ApA&AjD!5Ef;Pw0tDFr+Z@lJrWtt-1?Fj37(Ey&i2B zROHoER9Jfp-3w4yqQVmX{uYZYrgkfILw4StG8}lPG2h#TZ$Q?}v-y{Zki~gpXM-2} z6aAMhV%Wi0Dj7-s%g4okSxDg;g(%BP=87UA)Mtz*y~HrZHCdRrrem%E5x}yWK?fRt zQZlDN!vTbJ-eKU>vX}sf7zBWhnlEs1uPP%}JPth_C0>j@{!?&gULPO-O?nZuR@~HA z2aBdK{_U@Y&GW%~JSIRH790OTLIjyHY;1}@cLE)h$$>v}+kmg?-UepR?l?Bs-rh2M zHaR442W(JDrQ+xMFwrf3&U}My#GNv%P{H2flAD#z;RyWx(cKT%uoSfI3&ojvd&*@T zGSU(Obd5MO&lP9peXSj>x>R8OS@aM}XdL$694gwSLU5|EwL%J0ZBi&`X8SAG^jG|% zZnS<={4P~n5>4g#4)fU#U0P6a`2Lm!6?>+7Lq-vDA@wAzz1!~FvUoZT4`hA;drJvunca`*MIhP{$ckNmG^Nx#J3H!}tw+ut`7 z9aks5k&gL)(EV1-`X8U!_Y$rDLy;6cQUW0zj0bQ&K%W<$pc~8d>?%F_gQI1eTWb}+ zRUbN;u1){Bq^kC%Hf6D?P&Cw8H<3nDF@OeQqxRC6`4k#9>oSHwGQ0FD1L{pH86n zQR1Wm7jr9AS_bbl9-j$r1FxsJo^rnk;7_#p766FLs=;9~nWAb1uy z{dG`0M7n7>@;E-m+jKFXq)9(Yhq$GP>q>WN(S=qcYOWKkXPZ$%RbL0}B;K`hYO&~J z+^Hpzi12+H-Aw%BhLh)5W9SVBfRO1Eq3d2(0^ckw?pABS3;W6<~zkNvXU1V&%3l`p1{xW`1> zFBiAcAV+QhcLc{2%Eq{3}shNNd7(5sH8O1u+1NVNz5D6bLmCFuK5D|!3VqaTFwvOM@c#tYYA2Vdws{le7$o^Phx z9!2`J1p+W0-8!4gx94#A-t%0ynLIrhNMqxwH_g={p1Sv{aR=PpoJK@PfA23zDr@cq6aFxMnZ&`z7IW_TcjAypw zjrUOJPu0h`3wxfIhm$>G=z328dt81bEM&&5rIJMS$GwS`e2=##(2^fk;@(6{22kXi z4I$s=k{J@HphhS#R$b$Xl5sM8o|c{JQTUBDUaALA3*|=~GrY&?n?H`uTh_ zXqC(JN$KEDI*H;euqjKP)EwB?gHYe|5!~8n}0y- z@fMB9;&&dunfzAqJDT501E$9|_~lVfay#>BYd-7cBu=V0sg-{j7?e&*N9!~MrjSsN z=l9Lh%3ncT?whYwqzUM{c!&U+iO(5xlx~jZjv_7PF67Cg_nCgRNf~fMQ6`P-L!EI_YXMjyGyV^`yGUTCA02^C^ zaK?gQ*-MBG)Fit$iSEH&uxP0so$Gm=3Kci2#5SYcQz~DO1p?DP>y=Q%ddj!TSF-05 zl${%qE^4eAYYNik9`02&?@hpPW;|-&bglfaKw9vi?tFgJv~oG$J`rL9rZrMMe*(H% zeoqe;-FQ~Lk$X7Tl2)A88cr6vtOb0i9>SWFPsJb0vp&EHI?R}WCr>Ea zIqI2pub650=!C*n2G_}+9JV}bw6dunHq+@{p25|KLVAQ4A-+rQGVQ_J$pynRBYi!& z*hCQYEJw65p!sOuN7^su+~E5OD<8&1~9Ld`j*|F!9=TA z&Wu`IU@Y|;`wjdq=WDY*!N{s&y*4uylwsa#(Uv5r81$`3Az2W)!CO$VNSkq(Nng-s z0MlwWDWfLP<_J-HI+G+~3|1?Ttnq8Xg@Nn?5^IzqdBhtv z7TZJmteSI31nGb}PiAYVh+1?4Eg&acUEn*U&6JHwWNWqm7%HmsVT7*Yj0yyZh+JJr zgbu3Lqmwuqp-Y7fZeirlbNC6cH4{97PGMuvz!k%?kqx>rju!jbI>#<2Smc%ngG5iu zL58djx$(HEOC6Asno-|Z)^SjzTAMzT3PB)@sYhaIjq$TK3TwDwikM*T$Ng|<^R1P{ z?(X-o?mG|;fNByYg#YtWN$W>heDg8;>?t<8_qG zRc${J@@>+}<;Xgbf-K)7)h=c8z0SOg6_oWmhEZZM7ssf3<&Fgd2xkT&J;0|M()_+9 zQ`3yaibk(g$Tbh-TH%jm_?BtWTCf6Ay~rWe`{mR>SMEu0oJg|Y2c-`C8m53!l@*mZ z7%>dSF;I(rQ_QKp$;*iO+RO+f1h2bjlwac@NK_$D3Lw=5LZ|PSn?8OpDolz7<^|d` zXyuO~`a*cSb00@6A)<77n9CPuP**2XeZUnr7MOq!=3CYvSD*%mNRDgk*xX*usRbd`3h7X#*gRvGojg9}$ zENW)2*A;Rn>osvTg|f(rIP)?Xs>$My+DeLuetwK(p^hZW{jS;NZ>$Mqj>Sdo%pn)8n3D&Y+ zZ^cCsECL6TR_mlCI=*s$vDJDp&{3;(m4N9puGX``j?b`KU&JT=VXO7n*+6#kc>zvO zTQ2i$);}2=9B4CD?$-UXCW8rz*3Mm{^Dj?6KhEJO#<8%i%u`rnikQY=}MQU2PCqaL*)Y3b1?J#(lm6upA0%U^b~ zg*N?v;6>F|$ZN6*PiW2@|Fok!;JgA_fIiYrU9tx=`E~hrso~tTF&a74Bw`{Ij%-ve~KxVS4gp-tX4jd3+V%jn3kX8|es|djo z%Bk+?O2XGRoNTK-QdPdFBu5xqDJsFQE)625gbZ71)jX5!R>I?G3KB&)Psudmgv-mP#DOyDV zlR}ir`0@isy$sQjIAC1$vZFB3e}?>tT<9fZ45loIjKbTD@m&|vW>xQ(eJ@J}O;CW( zhTst(OhncM9k~77ljzXY*fM{5zTnwOceLqG&_A*Wz5yrF_;b?9>=$ejLHT0!V6MlddPdPoyF?v*P&JmS2T!X|bUb+4Q)`!Ka7sL{ z9?bRR@JkQoTA<`BSv*j6)RBOH9j#?Q?a5cAU+@f8rDZxN$0vwLVEz92qL=BPR}i_U zuRn4_fOw1LC9KFSt6IgD1~%=!Yp>6grToyw3nqDARlYx5bAblIVg?PpY%VC~^>*f%S@hZ8!#z_(kA zJ_b$Ji&(6KMIY)M8BtsqnKg&+!Bn8gOI<)x8T&~YJejKf(d$o&2M?QF3)09Fej^z1 zGve*?@M_eJg|fc`(~}U7S$0(ba{f_^0gkb?3rn{9RaBB{no{zrd5*M&{>p0V^mhY* z_(J_fthPD70^fFR=I>>3EJB&kw7=N>q&^bwuf$4puTq;uoW?|dZJtm1d!zLCTGijh z(q9k#O$Yep@;Y>2o-lWC|BA~~4Bo;LGoi1qn-|j#r+kcGOB2>3re8VEBH)OBexdna2P`S@0OFk^1!l4|DJk&p5D|3>w@akJ^%ys%8vA{#?r$eD zpx^k&*d%fwXN)}bK4U5J-OOh}@qq8J7L|BK@b~bW74l3tHR00cNV?ChHk)R=+olHP z1JW#PpR>d@mj70Yu;)MWKB|;m0pmdSV*9WOL{~**Md%lei}1T3wUYkioE2F1lftrp zBjDSwMR$BC-WemzDOACt@6h?kOhu#)MN5ZBQyM?J&%!C~| z2xAt7%R%=+k@$3@DlVTZxepT-aK36#q&Idg$94CbU^KOwVfEHusr6i-O@ENek^1o6 zCjt!dS+r3L4r;?T65N3F@cFj1R~1GBs-!)(HRh#;BE>|zNY_6`)5%x6i zE^UZf`%8X>>y-0;NhO9AIsxAiQ_2q>q=Q5uFmDy6BBoEUg3zop!#riICTjs>6D)yn zud_nX=r72o-LzM#HHD>In!8>xe~0#c;aWf0BdgRf6e=(qNTKGt%mB6Gm1mCQ3HAwHZ2ji{vb4qL-;;7@%ge}1fks{OQDOPO_gAe$gDI|67K^OgEiM?Bk^ zy$1a(U^s=qOpaI<=IfRM#*&%?1QCml5sszkBZ?$lm2rN~_o-T+(@R7a5gQSU4~Y5a$zxja(U! ziZ^yqHjg{sMxks~1UqCsn{^jt=?l`!OHFCc(y5T)YHC$vxWgAG!|&|0WN@mbv4<5M z{*d;6!Pb^gEeyB>dwyUv%p~b!+5@+cGSzYe0($kxq%6Jc%^6H>xAx$}%pN`RU@3R7 zQnK+ijFW+LFwg+U8Ao(v{d4p_{k`F~rBg3(Y2|I8s%m97Pf{)XFk^Fr&FwN$j7|T5 zaK+_iK#4)Bm;gOCCvuZqwjd&dZkLt7+kRiQR?!dLx;aM`zAvF-i|y_YhV0kM*Qmk^ zw2FbS(8^oBz^F1k@Rz7b{C}rIt~X_2_&YPsWo~0FffSo545Z}0D*123cqj7>Ko$bI zy})L)z3(9}D$$~j1j|_1lZiGh6VbC)JwOm2Mj47Y$_*qJ5kCMO8$CnQM6M{NgqA&5 zk!w|1y7P*QgqQ*#k(64`EYU>Q`puI!W;+FQNJv$}m#Hf9)dSQ3{OU$^q%}`1$wl6) zw2Rl;rRw;_JmdaOoG=iKPR-P_SE!MbzUV2VuxHt*)P3rq>da_)GXwPtVpXw9kB0N* z6Q$~=I7^k9t!^fv_;e(=42ji1F=>~UQ9M``Q_abkG+Gr?ZORy3tcpp)w2bFVftdL; zlpUgM?qa&L%$k3e31^^?lyOo!9dAs6y@WjV@t~)4Uhb6xK(u6CJ7W8=aO&$9uT%^ zuZVrv`!<0+YD7oAYXtlDwE9%AKl*|6)!L~OIj%lH|JZ#SMx)tzlfWscnnbyzcHe9* z=8fFTX@tq+MKCTR$o!5P8BHe`*FECWEE{l~OTz}-+uTXa6>9_TXQZm@Ul!50q8nVV zNW>K#NhEZ+aaWyQBBP2yV#-R@hrY!YZLtg{FN^qLhfhxwqukg!QU_OR+>x z9+JUas#W}qM7(E*11#~MZ6pWqWz|8kZeS*if2ssgx9b5=srNq8CgAfeW;XY!dOt?fuMH_8gdcs$ByydE*GX)L5mklda5(;E2(W5zx_D%ymFfS3pwWHm|QleGULtE zKe-nUbp5?mORh)d(AUz|9qL1_-?VPIHso3@2D;Cl!_!yK=~xqT9XY2HHsj~Ai|~7i zF8`56&W!X6Ukq8%A)m}hCHaT*$(q%ktjF5_$^E|rUFL-?xjxl_Cx7hF;k|*bW0IV9 zQHP}iT{RskysXoegyHF&vTmU3*ImEDdl$DP*^rfnd2-g}F4uFHkb3Wut7+oTyS00I zpzHN+C^H_uv?a;6F1?z{Bc66YAL#m%hsWiYwIsRjGV1-`ukf9hztVAfq3h6Bh*x>S z3nwt=avnZ&d56afU56!k;_?n#Lauc^DF5u0+`oEdr#C{bEmw9VVn@#ul27N5bv&1> z2YX#OtI+jauWa1!znV&N!B=V6im%e-(%v`Y`Ov$=Cn4AGucGLmuj=q&$aO-J)35GO z8*)`$O@Sw``7-Vj*HHe@HKO=@<5~%Dw&!b4fLKrEr=J|)dM7`X>ref>_cwp~6Cu|I ze=66X^qb&v{pz~(h5@c80z&|LLHe^H*T)4nGJ@BqKNWKQPyZCI+xqifg`R$Ffa^KE z1=sQ*4}Kd=uNdfB8BF1NB>1Ku`x~ zEXGa>PWformQV3_I2v5GGp29BkXHO1+BNcbsQq+*2U-ymX+H0{2iRk?zr>b~1QFAX zTkv3OSTE?EDMp#I^D?FS+yr+*-kg1!12$DS5D3K90pb{ zC0#*kDD>UK2Jviqi?zDT*sF?iu3Gt5Xj&-pqjZ0ywFu@b5}hHcYh1h_hNfv!k7IDk zuWCZ6o|O_ry%6l)U+mw*W8?liKcH4+RxdX7TKVhT#^tHRb3W8rW)jta{SdqPq=If` zM_#GBYsIL1HK!t>t{p!Q>v4`pqP4-uM0|OM@{2c0Grl~Fq`74$@#T3_QcZk$lpJN_ zb!sELJ_A19O&sC}x!o zB1o4?BSp#`1ibaKq%(2_AB69=@!$6MG3A6^1+WkXqv?L5#_>it6>^1OZp&YXyDBKh zrt5J@b)4+`+%@8YHqCN;X|zm~<-yovgl#x|Z_2W1t(3xSge^7&aOYfZn@@Tt7-VA$Ot z2%lqhsy-qe$YF?aG>i4#R~v5YbUKVhiY4dfR{9@o6*3YbTkfX1Pygt8RJrP-=3i)} zQ=cj4awvLd)YNBMi3O%~(0*v{C#^c%^wZ%>KJ~N7WJw5K@{>?xG*oZ5R{epUK zL#aN)NnGeavza<<(L$!!8+@hIDgr?^TMA>&hHRH?kX+`-*NYMv+lZm(j9k| z+?7>)$E5F!&${>ayNbtuCu`#E<4e9{7gayfX20!^#`!wR1?CxYps%e!^DIPY>}VOK zBwv`vDUn;LW#c}~3xEIpRk)th=f!>jKC}@C{lNreG<_@w zCi6A+2y@s5s@N~jxXCIIBZq6)Nu|ksFg?^}u2NY;Je~rSW;1>#StC3i46$dkGKNg4%bO*X)g)4Sp>4lusP_&8A zBP;m7SfVx)++*NmWr^_`JAkTC>5n`vt$bA**-+f3&0Knp*e+M%WZF)RhY-C`kt=uk zD=yj-Jkp>P_5^fd0n@dDS_baigo61TNk7>$I$&%LiRtWQ&oB$&WoU8!@yrN#u0fq_ z*}ut+Vn9S2D`q+JXO%ybll-LlqvdnOEN$Y@$M%TSqDNn_e&M_H?s$NL0hz+ZNqfAE z`pg&7WIMy=my`#oHtSr4PS>Ten|Mgtp&NZYgyv~@Q|Bh&{>W}u4aCMuTBJr180no5 z^Gv0(mQ)sxviu~xBs`MnQNY)8{8$zAwyBi$>a%uR3s_$YX)9KINo(QSoB0%P$b1OFb?Uw~6T8boSbrY;10I5MKEMT%QMQxCaTm2vbz6#+ z)TtNcWnnTnC0RGth74#sz_dXjLa{`h*CPN zY`4E3utxGIJDR3Vm$RE>ODoe^yBxbKaV2j0Y#i;a4?E{M>XAMy)7Mx$arj)|mt)Lh zwFELbifOUHFW$ty_e+)u3COe_*~VSYQsO+d4x0@{iqb>A?cwv2s4%Nh$zJIkhtv74 zODp+?c`Kb){Et9@2n~A_GDK2$F%$9?*Y+ZOy1W9b?!ZI$EzruccvC^}{N7dh zFLGyksQaC1;e-Q?Q_~!uc+2!#eBwC+JKyE-)1hcF{_r2*4{!UW0w7rF1%<|VqKmj2 zY=pcQyt)qV89uvS#htQILDaf}0T?>$iTOD92%%?|Ido=z&QGhdA!Dm4@x#SHs4aYl z?GK2Honu~@V1VkPTLE=Q?K6BP&Unoinpw>5jv}P5fx3z=%OYjD8woX@Ie{%UEL4mi z@(bAxlM7*OP0$?Z@k7OuyIh+kzvNDm+}!1gYMUc?#*`1(Q$l!bW`&v(_w6xv!&Eu+ zK<|#Y!V^im;h zlq!Bx$sRE>{xY6;LM?O=rt-yaFVCI@@{Hlm7aPtzW;or%yV|{zWTu%xPi;6vOVV}D z1jd^flEZO<+V%6ynep+9<8Y!cBEts=Yx2|W-ittzz&%M$t%b#HSI%&n`P&GeEUvb|{4M&JipW(oYVhN?k$!z-`G z*nTWHWQizGVH!DgXcdRR7d;|aCP!WGPR3M&Ra@2e#v_0Qbx)@S7@l|#R?^HsdQeyDQ!R`wOc@Yc{GA;qcv^keI9cVgx#hW zk}VTlmObI7WXU3DYXK}*B-N|EoS#Ruwz`RrpSp}{rLs#6 zMeiJEpU5k`V<|n9zodhCt%Ev0{YYu8d@HXy$4ZMSd#T(aQ9{Ur;u}8ioUTs;362^<{UYb861Lr|3jG+$Z`=DMZI+}O39W|c;j{=dR zEHj&$J|m$r_cONgA^290c|Tv$jmKoJna?wk?UwYQfJa(#y|knaEn(p;7QiG*Q@NEq z&5@_(Q`l@NlevY$D-XWgrC9sk)$;GC&&Kuip=ACzhe^;%2L+1-lCH1c+(S-UJnt7pq zNphL#?9Lr@XAt(~Cvp_{>k>}u)zt2XySjFyc6*?!YkkX0W_EQw(5mH&U0pL<^`6t! zwWw9?F~MgE@gIR^y2!9^Sk|_tE=n+c~aZH z8`lF83#|OY0VMZ#7{_((MLc*k^A3`$I;Oc?hdcK8xQpwrom$p(alO$QKA^gDx7seQ z%*LYMdx$ez_F{HN;^UQX60tUjwx0O4hIKC4fdbylCC;1wgiqa)KdVoOoYg0Mieln3>l14F=Lu`xM4`|vu2A^O=@kl* zf3rRzlAkBqgeOj;O`wV9eP~tAOqpOE^>~E>3tk%MpaMd%3X>=Mnh&a9rQZ2K!L0!K zNAw1tQJElm&Hq|`!rrs`1VIT)dwW)&aHjf%v1kich(6(9$DUtMpK#u%+b1+*c+l8B zK?2o`Y0f@@efxiueZr#<6tPbjiIUOLoh542V)hAAP`1vRvrl;3&ijn^3H?uPpYYNt z>=P>f;r0m&ll2Lk9DTyZ{|ojBbHVo5{@{OyeZu^Eo7g9GmTj3v_6hU^zVy^)CZe*u0PI9qRkY92q39IPXDGcG6z27ENBf(B#{)9c|HraXk=h`QPeDhCl zpRgj)KH;NJu}>Hx_6ZW(DZxHLp0U@J|Nn)3!Zg-M3ysg(Cn&v3v-*TWc6Jn${+Bl&~6zjK$MGPh6)T+Z(>0cF<-0^cHZ|T z^Lk~D(2SkJ6{oRNh?)4Eft^AY4am>adZv0NKGs|-l`(@9D$Y}_Gw(iQ1;e@Qhn|VG z!gc{%&F54wq>r8bPt-3AOte=>ZN^^Vw_+twmSnH6B+*{saqvmmD|GxE_6qwF^$T|= z*eg8KjJ?9u(vo9@Y+(UDoxQ@(&e|(rA3e&$N_6k2$_6omL_6iG>y~6X#Ug14u zufTKc6}V!rz!iH1t}%NB(%36-b?g;LVz2OfWv?LVc9*(b@0{C~q}VI)gS`S*>=l+O zdj-|{S^tM5BjvOH56b_c8heE%N`=efN`=c$t5gVR zFEwke@FjEbsq_igoJODU+58?}!cZZvZsPx(Qk&pa%`;2RSdq~F3>68xzlb8?qS*e_ zKT)6X@AZG!nW#@V>;Is9F6z(vKQ!zAAVvzSMV~M;Q(PgIh(2LY$E*I&*(==rZ?IPw zdTM)x>QmS&Jn|2>S6G&;PuS|{6ZW39SNM;Nr*PI@fz1fpBi4@Nld1M<^vFLtp2EC; zi9W#tMgEVsSKz#oX6+R^(K(_IpS4#ImbOtmh5s&lg`b?YSCH+`cu2x#?G4~hR;zc9nGUug3=>=%;s4I>lm7aniMe&Nf~67$pT7s}4sFPyRc!lTN5;Wx^D z;W=f$uu|DCR4V(0ZOVRu=h!cB#eRV+_6uBN_6wx3U*PK4FObB3;bmpNAZgovfuz_k z@PqvVSL_!yD*FY}*e`I!eqoWaUm%VB0$0a=f#k6ccX9nd^bNnuyp!Y}(KkdpUG-#F z*YZv+cXV-W6#In_I(KX6;(DS>Yf3!W^>pzTUV(2S^5WO=kMLrt*+U}brHvu>+htzi zs0gh048Ib;ajvJ76q3OV`FYs7d%^RN+&$ze=Z8?H63+2DvGGi!QgN4f+A4RNx5T9) zogfJ1uhVb|@Ax9WLa4BTm1D%GbnqLsw4;I*8dfcB)*vC(a_UM&hES#9vINIa5ShUAWZ0$sv9qkc`OGSI^m8_ir z)@K&&(Jp93dn9U`6YbH7NzKUH(H{FJMtkh9LeNOWo;d(Z{&vdc4C9Lt+tUv87@eys z5WJit?-TH`RDL6N5JHKxD1jj-Sy3Ou5(bSJ#S;2aqK7*1jIdj@zAuq?r0WBsz3teK zVNcd)2>wVsY&-a4o)i4h>jZ!7ak}7-L|?OmK2B0WAICBN$w40{si2SQc_bm|<4|F} z2>N)X3i^oKU_QOK<32X$S8D{t59OIZe`v_n3c*c#k>uu-U_J>nEJ2_R;63kM}6i z9<}nf)1Yd5>U|dcP7&`>PJ3+5pCSiT`p3n4{62H?-=m+9K{?ZSk5bl&_h`p?l(3Jj zVS=1^hU&Z<7Kmpkn&46qh63VEAuCOSHwFH#>U^hiPbnEmu^;o<#?PU8~^bj4WNHc0I+{j{KwJaS}{z5Kn}KNg#@7^^y4r)0$FnW$2RoTrhicm z>z4SBMlGQq2^wimXA~v=yim`C_=j`ohw^ropo}9tlgtTHE*Ae#;s9o{IqAU9LgIvY zfFCIVr)fOEtxC3G<+2!TIRM&N18;4Z}vZ*ppvJc5@%Nj*zjZ*#B+X z8;N^2*00?yXVKz{#3_$iTF>L04d$HW+)wi!mjdr;LoO6-)_NY%%7yf6J?ClD_mhy^ zcQ{OGDaUvb7i|>Bc@1L=M!2~fxgTCdwS$rS_H83EtgmxsmnstOWMAKQSoj82(DA%ia zkXt0%eo8$zY2GQKzi{-C zZ%KH?9zqw_i@5(Ah@<9Rs&JCIxx{QuTdkASwwgC7!oF`0vunIHyLOwu;F*mcRByR!YS@Z?OxN>^+?NZPj_)e zTlM%;7uTDuTJG)Qdb?HcBVAn6Tc;9K@yD%GdH!_k6s~Jpf0OGbVkq+Sc-!_|Uz8Y% zYumOYxw)-GFPMMM^`y78`x3qb=d~qSiA>MWGwB&z|CsSDu8+uBXiLw}C%N~6^Ekw; zeMgdWF6_p2-i747ci{k%4`fQU^_gj~lpTA1(%H4RW6NK5aXr@=0-Q$4mQ zKQvL49~u+op9fU(XHkYTJGjBp8_99z*0BvzN9@=JS~5fKW72%sqlb8?3fadv3=>&? zBO-;xuUdikBihPH&8@5W|_JZ#FGhD50u3Dq}D%sKxngmJH5UAD6EPspY&l zHc#XSHp{1=tp(&EN8pg0JWyLc-?Oqh^J%~O+&Z3ZWD75KMi?r70EQ--0*>LXTv@LQLg&zH@ zoJAq$-{ec!`+nqF^fF(~AX_6L5g)p8B89Eb`GWQn#X95?20i2%ZB0|wMwF}a45b9x z3QHd$0$RQtT4459x}$u0maLB$rlQu3oef4LY9lP7LnWe(ut=);7lu7fe;f|mJRjCj z1Wqso23}oRU2g*mgka3SH`kt*edPFo&hg_1Z2D5e+yr`37*fLv6W)tsC!4r&Npn&o zNi%lxz#}pqk>0GJmY~@}2~U<(DuU(#J^*HhAst|*bZxBG0aC4HQ-9Ng2vpw@x-NF) z%r??G1?EQldAX;Q%9Kd?2{;rNDfbCRA+lQ8NR=DagVVeDzebrDe3gC&6y&6b@pNyt zbIt=x6zY_^qcZ;a=A(#CHrayX|hruf#Am}mABB56ywqbvzG z2RSnb3AZm2?oGU)B;4mneAY7q#0OuPQ%iL1D}%WQLD~E+-)xRwSCX%gSot%*PEnfp zF3S-ot(kW-g!ZZ7Tg@tNgrw(ZNy%$O1&P+oS_ITJ$IJp_)MRi($nQ!*#NEI0j-=}k zI9W02(%X!5`Nm+%JHlif2VzdX#bA3PU=Wc!;7lHO~ZLcSJtSxfHTjzY8Vqk%MP{t2|P-_rjjKY)#{_Sw4y($n0lWk8BdG zGr5FG&vV{I{3r&x;}LD#hq8E;&+k_BKeMw>99Ige7^HeDr)&L??mz0@hQOtpRS>j z#J6aB^H?R5$I>~SrYn|-&vtpJ}Wg2#EHHI-FD0Y1!!G8^$fYyldBH z#mT=m2cETpOY>=vBl~Q+c~Hl#e-roaOZR1)d`Oldub2rR{P|vbl#Cv%CRt8J)G^R! zQG4^Zs`e?Od)D%EKO8+Sn|u*k$1=esO}&?#bne0@5?W3=moMispBh_8H8-UZK*JvT%Il2pQid!V)J`JQPEs32U$@?ehmN`Zj!sWm^xA+x z;ON|xi+&`GFTq)^FstohI=MeS!assHwaV?>-qL)v$RF*mr$PHx8t`ujA5B}&($?E4 zi+;7g81`>Sxwt=VQRDqCNxn)$d}^sv#l->*|2NR^|Jlf;#mVBcpQ+*w2l=22ju~zI zxz*IMv+2i!Q;wjU8EN!kO^(fCVo6ct6(>4y^`JJ|sNa*WY50p~LW&XotQnc1s!uT^ zxv{x480-7Uk2JXB%GS;zRPxFej~zf^ra7yLPl!)k(ujS+6MPFThrUFf+A>yEe05Q+ z2ULwiiV=_GG zRJww?e5ROPBD?${+CXzt-$2Sm{TNe07qJPpyc3jPpObBySD(1G;w1CpYc7a5i8hY% zk|T}t%oWuL-BQtM?oBNsC(Z!3dh|V^MT1fmShVoT*<7Rc)Izk)tsy64csHpx2Tfd| zc6sk&2+QeLEK$bUC)cXtmJj)r&TL)fKQ|?9(V)S!FLNxv37Yi{QOH#km~##*key&e zaW;w6u?Q_fSA00z*Eg2s(@$#hjB2b1ADL@nbCfzwoXIC(Rt#!p*Ce!93Gw_Hf6v>T zKU*vei21Y6gfVK6dH(F9$4h9pAmJ;S(H8myJrxqFSkuG0ok^WuDK^s!mNZe(l3#Ap zXOTJ^ifDf}85vX3;3;-{%@>L6ESEOYc_W851{buP$KL5iBKbURxY(q&F731&4sz z3APO3j$KwHuKw~2M9tZ4q{nbx@aF73O1Yvy47KUfo|~~YA|PsyJUui89n^1{W}C8x z(dW3;$d&(zM`Cnun~3zMkGVBgca&3sXbmozO!20sW@#OLt9A9Dm1Mej34H}~$qbrr z+r;e&L&20WuhUe)_?AzD^zfZP9vOZ4dpZ19H014~_22g>PPuz4HH#@1y~F`qxRI`* zs|WR$SG_drMg^5`*e*Su-0ea&o`Uy}#sz$4xaZsUBRzYuP7TmxC&V8ov%e6OmPkKSwerzx`bKQ?@9FO)0S6@W5q|2@sx3r@7K&%XgK+9B);47ejFc2xu%UL zPI9Rm%M* z!N>z!Qa1IIeMovCOMjVi8W)uX8(PH<^~F?f=#9P69-@qpT=+1ub3zmSTqTXAl0J

>rF5@~TD;<=V|ZBfOcsq^-_i42OZ)zK!qPq4#(E#->z-V{}ut-0_uDtoh9=_Xi!2UJ`bXgfERcbe5sI`6cq zolM?YsdjRCXRX>P;hi?MQ^q@+)lMDnw9B35W)bJqs|S5V03X;!YZ`35)VM2!@oFJQ z9Z|9oC8ZD-PUo7$$n z?UK!EyM(se)pi+eZ&TZKv>lLaFKH%>c2j9LxZn%+6de8Ul#8pW?9WQ6y|?BCKR_g9GErKH`kS?=F2;z#z{<^DPmLbA6_ z?%yGzL-v>+`CBc5my&ji;McR2r1+#RWk=F<1~oPvAJWWHq&xHV9Baqz^w7Sz43NWmx}sS+d-jr&a~FP`&{9Iz zHL_$8JvlDWji7E9v)Y0!Zw8l+U;%w87UXZOzp1-ijY|6^y_bwRmmjAbLzfMm#&wJM zo1h&d==6wr(4s@>6VdX+$B$CTA`{K?X!w_x@*q9Jv#>oOxPazi=saEgH@YM%YI(6} z!QbU)kN?b5&D>Z%MF)63ThkcNt#q(uJx??5Mbpfd`DJcOsj=n{9)B0!Ti4I7zI!ab ztyxUZZE@%I5yygu>LonIoX*+o&)qBau~Yd|*xPxhf5&h5@rnJZrw`L0;3)2Wse2HE z0QK?XAH;ur(51VcZ^m(ho^WP`j!#H(i5wqXqXx{>8|4(YY?WMEHc+HoCZ^mS0@#%Ku+hbEO5NKc;65gmlV;^}&k4#iKt< zx%dQX+{M_hc=U6@lze`6l16{+q#s<8DF=h{npg}5kD;kC<}6P3kk5iGAA9FpsI)vm zSI+%dx#f+og17%Ukt!F>T8>F4h{nHT2CH?ZTIZ;Bu387hdchN-bz1mYLgT&M56<=m z(ehG4`1F6hK(kU{z`Nk!VPiV=jWP#%kQjZ_VKZ^!tEK&Y+;mthWTQTyEaBKDsP>+E z(K8q9#UZ9iexB@+&DTe=`J#T-?m)t^9q?F~=aS(5-y_~BrB}VvA-D-BpJaVJoqdY? z9Ybi=*}LCSytIkFTmJX$9eWT;)$&$8X%m+2*{kTKZ~4KRI%-4-UcQpxiA(o$JY=B1?VExO@mLTP6vJs(MffL6ITKb`jI z{)yZ>lWt~{+FH3cBUk9PDZLV*w^`|x3B7iuN6iQ6ZIgS~F%235jfsqg#?;aNB;J2X zjE*Le!V#NOE;&ftqmGiik{@;y!aQQWG9dRz{#+_3ge*|U*EjO<1$^9YKbZ#RbV9|T zQVj5j8Sk&8wHVi_eLe-e&zAUjo7zuR`+Oq!c)HqeSNoZ2pHBxL&sF74h)ed+}tw~`wY=oDD8^29ms(L=T=m#}eS z-=B+eo!qXYQS$w|=r^Tvp=^~$X45EHo_JE3p36FG<&iQPC9l?Hy{?Q6Y?eowXp~G- zcXDSwJdL88qulu1#Dc$@OMfC~_BQ&vUc;cd$80xmebO&MO$uC^)93%I~APT3a4m$ol# zCX9AdiHYPV_A_XkS`x86pL2ePD5aDonR6CTNfS9=A&;>b+S`8rWDQ_|*h z&hHS#k_^b4b5Tr56FKK=y7k-nf^K6G4H#QC)3A}S;vp{!m?pvb5REB=L;g)OF6Y)4 zx9mm3_S9mUrY&BY`(sBg-AEKyrNJRD6t#S#hob80m;TL*?lI8GqRe#UQc%UkCW-Rh zhji5+icX$7d+vk?4JObKTh1GF+`}p@$I^vC0(%XzS2{h<(KEUD@lp)1)vYsLQkx}J#^ovRHOQIcQ2SseFj z+p2c4?^U>4w~75bbe+2=z~_hRV7t`s+_{Kqx11@FX|8&!R?6)&)2Sn1DumZlsl2C6 zZqLu94udHW&ec$ME3ziaUWMu@mC9S$Ey;*-LF%eh%88+rv?Hk;$u5#UVW=25#Q{gbhi%eckcERU2^yXN)Yw>DFBxNY1f4`!#NWs$;s3hq2^ z*Je;;Pfn+enH1J?-L6&T5>ihAJ)7IL`DG+r#=;cJlet~HQCLk|#Vg9X9Hz*2O}5We zhdGY2eWn0$?Uo}FiZI7f4o9fL;y89{*JS%l2Fip1E+}N6P8i@!q@;;1SzL$_m3z3j zKrA0#DfYc^F6Uyy(P@<-`E#i(v@|XstYcPrEoSCkE*F!`sBZoEV_}EayPZqZrE(Q%Y?W1@)elWRk@wuFKole3~4jrQO;t z_U;ir(;jB(tj{4|-YgD@;Ss5^R}scKcAqv-M6p?HS8?QJjinRFk(bq#P9jHM)>S%@ z9C=w$>CBhVj;y6AX;mC~Sw+bJM_vy8sID=IjwWhMnwwI^&A;&ZeEaV)x&olve~T^` ztiE`LF2a66lJxIC>pL!epW3;lJ;a2=`t}~dA=DIKElPfH^eZVBms5LJw3H{)>FSF! zQ#AS|x`bNKGqEiiS)X#@({v~@o!4;)sqr}CXu1*kD0?RsRlM$$YDK%SYX`{QE{C`sGQ>K29vZ#g6(h+Z`T+BCe=pQdWN*PT5;BYeC6)k<6o~+Rn z=<1ZVC$-U`Ere0qPFou~jv`WWs+4=0uZ&J9xO8}b?qN9V9n1dF75|Q>x5ho~MAO-Q z2Z`zI#-ZX0mS$A_-m(<)H-kIQCQ^Az_8heE+k})Wriha&{^5!)*N#v9WG0pLpJ3iV zPSnXM=iunSG%gRej7jbIke+T#8T@v~?|FpeEH4yw5&OtJeS+m!+pDY}Q#LS=&{ zAyh@60=7FBh%b5Gfv2ju(1=2IR+qMPVf`Z)*4&N>;(55i8#?-u7R`FoBd>#B>Ugi6 z=SFKbQ(1bg<6aWsi9wny+ZY_Op?Jvi#V!AmfxwW8GnS}mpxGMuT4)lLNcO>xxQu#ERIz8j#F@ffUq(I>6 zgq|-J1Xd(uT%I3zIibfpV*=X~dcHg+aBm_F(H==W;KKaC+N75fX!TIfp7gu1=PtJw z1YX=_97(>=t0(=w->c_U1%Xd{Wn5AaxMkPg*X0LZ-?is``GH4v>-l(o;F>;1JeMEX z)Fb~Nd3Z+>BQpHT(1jWer5JM6&8e_ByZIA@2=tMY2$ z&-SxM?yv(F|50pzSoTk5-&#ILk1ucXUzJ29aPha7&-fj<>|4rb{KhEvXLroI`CH0ocO1C*+sbEm>_=MCpSOOFz|Rr*IRgKKBG6u&E7|1a^Sb@VFKC}G zs(<_Aozrhdoe=O39qc-qXyns8%!R@Tt$p_zw|Y81QK zLli)wd=11*d(tv)!Zf}fYGaHpWJTIjtrO-?4kR?CChXIKN;CVk}c^ z1p>X)ny~`4jdIf!M)$)-V!3Lyy@y(B`w8<)iiP)H*YlBmG>5}zXONN|Piy8K7@M4W zSz<7`|HVn;lGBTKOYUEkoH{1CcOkthfqiUd8A{p*+n6m7x>G`HKQ{Okw4Bh!9TM_w zgYQ~$LL1v8bNH!}pG@209L!8k zy*Tldr;>Y5;f=gxxn>x#s}l+G9-e;LCdEC1+l|OI~u$!d^*(6Lw3^%u60j2gfA$ zA0uL#*C+9HEBc-l{V2)+@nA0N6c_%_A3t0UiigYA__zdB!+W96xSVX|lGM`*Cw^)r z^P?p&9G6!WmzkZojB}o&v395bv^up?NeU!bxD*qYGP*m?>5@)doaLn;xh!cu(aE7A z6jf>p$j(}2?;F}ClXO$bt6L{fIiCUb$zHigWe_dfm7ObTTi7WV?aqYVl6&X%IhC3^ zC6}%`*{R- zPvV_XkZ4=hDnGA5nOA-aJwM};TN9J6pfGmwGlrUq0Jkk)D;sIlA84+ZC3?eDE28A_9?f*ha9(kPb#?wHNQw($!%YOm!ENc=6c)I z_LY!)U|0SL1fGCcEamfdSrVP2i+fNZT-dW9IkQ9tGf%f+1$~mvQ33WaG8wpxY)w@* z2k#b%?-ktsJKD&L6KypuX%7n=?347K1tvCoSzziMcsy1{JUHzySAyeq#j)Ba$15%7 z^ZFzmY=?U#Mdyg9?`DyvK_heQ!G)7jy7-mt`wGST04j94oOTt*U(yMQZZ#4=x1wKK z(QQ!%h|gkL1}lDh`Q-8|JC_fwUO%y-PA>N=F7thIvA6F@yVxmq*vKU9YH8p(F1dZ> z3A@QBmkCyJJNe ztjTR(zSkd)?K44-JDJONrT4bhqc#({P=6)by?Vp%xIUc6PE@$r3vj%O)rDpe^i3*W zk+C7QrD|+gK=FFh8n1COUMrNn2M@yfFXA7uM}4ZYH!gWwkEHvOtro{JN6z;)Wpiic zn{5`*|H*Lb#(6C@&ucyrZ6aICl+BB1oFdNaDc(4HtT)b%#Bv;sn0NC$0nC8>~--jm-SrQ%4T>c@_b0ye2>br zuXD65A?Zwe-V1cy=*$1-Lg`~_8+_SpPE5+~Wj*i0CZC?SmCez@vaEw)g`JXtew^0? z#X=f9QcP0{38e6;lMv};Ga71&mH&|4*VYu{7VP^wFCdB z1OJx;|F;AG&VhgL!2jdGt=%KFGYQ;%Mx~?xzZo++B?Wpo@SYC5mjmbj)Qe6@f!!Q< z9|yj>15b9~{Iq{`N(%67T69VZ?BT$F;lTHD;Qbx=uN?T^4tyU6KEQ$R=fL-O-~$~v zzw0(SB?SgK@B5jnDb6Ie?DIZ}Ny zp|>IbXR-fgLaKqw5#yT){S91>0Jj@xAn>|C-iq@3w!q(x!sSTm&4hGuJn|z)IB!Mq zkt35g69z{_#g-gVyqS<=;NObb_t64@Hxq&&%bWca zZk{jMa}7_>&n{>+*|X@UDKtv=n}nS_@f$${0ojtDlAxwOyhE}DJ|#+iq(G89IlVDi z;AU>=MQH+8H&3-NtzQ&4O~e_gPa*^AW*Qvh|0N3q%&5`3bOgRDNXpIi0#`RX;OKt@ z-Ukr5IY49ydjp9dDR7#+G17E_CmU!WaHha%Qp!k61#Xu9K!86Y76|;(kf!(u+^iKO zDMI|KDEU(bzHb!1Sm4~6bxzL;eE-fM?Inm)l^%r;75HIM_;|uI5|?9j|qa*${;nC3y1l||&t)9HD9~o5CZ1Te$coE?liP3g0 z5%_OB`{UIXzYK3+;$KCnW=NORcOCXOIq+@5eq`QB^FM+Dn2{Kb*9bf^AEo)+De%a= zleW|0zz-zC8Huu&VgA}qxxjB=NF;6N_YV9mfv?iyo}KWc$c28d0St#(kJY3spbKpM+e61(1?Hox>Nk-y*9zI!Z zO(%R{;{9HENLP3x;kI%(-(hE&z$5ciXDT}n3j6D#?7!l$|E9yvc7aFcwY2@cs3{zn z_)wJnVT5NSM$1nUcx1k-Nb#%?b{>qf6DHgihf5v!l@9y{!ZQ-1{oW(+HpL&c5|pKOhwhICcpSsqT+R-}sv&q$2+ zyHemUE2%(0N9s=kkIb_@t0dkb+{Wj9A-~15qvM}QU1mmNWIm0bh2xYb@OR`6{ql2Z zoGuV}yV&L*enyPbqXK_V?$9qkuf^$mfqy7>=$D_J;&c>|wDBw^Fe9-;3eoR3YOBG4 zUnlTSJ^3ru)>gt-CDwUyR&E0$Xu!29vD(9R{1+3Rkr-`fv%tTIvj2;IEFX=}5crp# zJU>Il=`Mjs=E3-xCr-~0PE@1Pzl8k1JzUSoWKe^dk@&rbAFsA1IPm!bkIZ*z`E?Hb zKLU@;cWL<%d$QkXyjtLq`7SNL+<`wO@W_0ZZejcVg6&7rp9w>P)wiB7B;%9<5Ef#oWJ}OQ7k$E9~9lD)xTY3181K*v7q&E439Qe@= zyu^W*JMel3em>zDiP8D`oxmgWTKs$gr`H4?nZK%%aA3&ZY$q~LC9gB-`D=kk=A-!e z3{DRSJTmXZ&slJKlW<#nwmI-09r(O`>~@wr@JAf@^A3C~;TegM`7WK`Jq9oynb*>B zD;9WU{)(Ti;PevVw*2;{OB5TP<-o@|@L3MLiSU7mYrS$Flym}D3B2CJsThlNm&49F z2mX=+f7gM3@4)-fC0Rz|7>^G>7s9ELa9ey z;B%tz!^ua##K`<4KPSRz;(_+^Fw23@ci{Iq@IO27PaODv2p^a@)8kLW9+CE-c64B3 zg@@}hJeY93twhCYf{+h+^3<$}G)LgGJY2T}mpSY_AmnFz^4iX;0We;^4k7q0&n(kYIa0Q8O-@w;Ne<6i*W5riHcRekYDJ@Yrkaz zU*zH1&UpgA*u#%g#@YmaiHB?Xq#?|QUri-bu3C>1_@y4M<(CNjG7mpS$!`+)QV-Yi zyC1^#uki3=mHb43%UMu{wEUF<|BWZF?Y}JWt2|uG?{O&GzsAG0{b>Tf*2A^@Zw0>0 z!?pZh1iswEwfsJZvHj~ke6->}UEnJ`T+3f0@ZWp*kxKp*f#2ZaT0V^$pn-|2JbaXr zFBbTX9k4+hiKTRddSeg*QVh>godd zQ%;(i9~_#Moi!>@I<9!)n7rcB(uT&FrA4KsGbWrM-eZ%ES~>J08hX!8eM8~o6ZjP{ z+2U<5CzjV&mDhv|1Km*?T2WhF85mlepUpo+gnx4cAdpM}@Xv7m8Nojz`A0~O=B+F# zBMl4_h>*<^a@pc&b{6B=0?!skvZbW3kS&a5OL^gZnA950c@l9j-bYk0qHwNvEc)Fk zG2T5ALp#=+MPjIT`Qnfmx?R5%B!+UAZ~Ta%E8ezYylp1(whceZ#;ar;%KE)b-g}=q znbt?uTbpJTc6GF}(^2_mD3o`+!wE&QI={B6^P#+%4dMFoim<3;S();+H3jA2^3G!F z#Y|J^JySJj6jgA&99Gm&n?Jj}UcHrxp;1(CYbwj@EAy(WYb&@3DC|VvdtsHb6K18% zIE{?RtFJGgS2V|uLnX_i+1#cSgu>!gT*G;%Fg^>TsFC8p#G_U+*N+b`EMAGoA5mCU zrK|o(c~Y{n3u_u0>qFCOs?Kf<$(BJhpX&JNqJ}BqP(N1E>>zomR@3V%yyJy|S@oevOBAh-)bvrWr%{cq zY27={&2wdWNn{)vZJ`VMGQeKpbUFy9q!T`Z`n*sW1_}C%#XFiC&cmo2F15wA6=#9F&ZA7fjIG_(ixOjMcirszQ+GChTD`O(TwZY&*VEEjk~OTfbZ&WR zHO0C#Tz&>iTicGT;e|~Vp}KHYZB2f4c|${_g2%jyg|Ze?7RtAhjrWQ-+FQI9tQ=xr zGg}?UR*Ux5#ie$%k1mA4ve{PnF7={<51SA=C+d7tRAXk&cA+n)NmV6`^Yz%H3Y$U| z^hWWb855>tmqw59t-6HgSx2cCVHeR`ybDVU3+GNP)s?`~m&KTS)J?jY*NpDW z?ANE}i@oDyPNT`#%qZ^*iG(G7)%p3IOXUnO&n({e;y4r@SrqVf~IW%2#Mh#tiR5X>B>i(uQq`Ly| zKFGweW2Y2OEuES-rnpelwkhG!Gs`Qbit6>I79mLGa_Whl0pTP(yT0}uuh2%5%!2vE zSlx-U{TWtNQz<^!AZK8y(QsUOIHyQQ7KEy43btF#;)wj}5KY>87eNHZm6P@Ge1;0jsjL#G9|0j8wNNs)444hIX+ZLH=<~eFpG3`#7C4&EuJ>jyOJ3x zKc|qNWxa)^ZfmK=yrh<{PWjUf5+12w{=z|d%^B4pKE!=-CfRJPsoc&uM zcwSwoaOSL8m9u7PBF2Ty$Z2(zj_&R&W|}qi;pb3e|^dDnhchR&#}DW%&i6|+e}&)^tWuk2xJ zk-S2RJ|yhahg9n!_V}_Kn<@c@XvSMR61Ma`hbdkWGD*vP~JIe+-$L@wygs!>%)&6*c%#VIRiA`Q5y36>|QxVF5qp>WO|Q;gbeCa1&ZlU>x8 zN8+^*8EAOt-Yg`UMP4f<^JZZYP5po(V~w6V^UZPKIq;MvH$h6cK>p-zd$Nyg}qN7me( zP7%Wc{1Tiu{xHB3CuC*vK&GjDX4TxRtWmVhQ)FUPTUu2!t5ytMq&@qW;ylaF!<~I( zlfQZGPF9y%YCn)+^; zmm2^K+uj{7o9)gArKW2P9tmA+33wbt6(X-{de_=r@acReqDOPqhR>W3K>IslLd7%M zguP*kk479eoIEV!l=w*aHQ;1m>uckq;M;@|lOO$U5 zU2`yoOf#O_3(cWT5qJ~ zd->t5AA2c0k=B2vrLWpgQEQfenieg;tHMor{eL*7d>+_AzeRv=0{isu86y46GZF`k z|IhK1arwD?$_o5{p&q?Ur(Cy7nez0DccgEnZQU;E|6A*--S`0P=>N-Nd9*VY?0*RM zrvi@c7`C4sB%^u$6!t#_`}+UKnEz+A=s3{74U5F>^XIf^oc;|=B*w3zMdKqSOz$uZ z1g-`=SK(~`3&1hI{}cF30G@bWu%E*7G6v+gLcS&ej_3V!z|nra14qADZuS2?n&oYr z!_FxV9PRVlS#)_T0QqldTc2Od7xJI3kG7J|HsKjOaydCb>Z;E(nn1swC0 z>%h|$&hbS1SPqeo?ibAX>vrC>GZ*|OBt**9V}K*irvS%ti09=4lF{XD49IV#ZC!4$ zp6*EdL$50miSu;@E!zGJ35$0A8o;XnzZP))pY&`8<@JA@Gmi2ngB>md+V3pDQC`3K zfbF2Xesh3nzZUE)1N*nqIpW0fh%e*{M2T0u;XGnH@F^YB=Vf0Oro{5tpAHtNwEsD6 z>wFCd9Q)Iw0LT8cP~mJJ`_p2O$NH=5Da&L1y#(a3{I66v%YQ?Q=6ScmIX+k~9(3SO z0FL(mrf}2#mw;ovI0EeOJ8LzcAjl(6onPj;JIJ37b`U=kaI}Ac!~RmhT|6R19a@Y(wmXq%scoGw*#H&rT=yLu5gOr#S zmd_0Wl{l8?R~-0TfTJDe%!&PCzVsW#80WXjX+FhpUeW;9Z$e^uj6-jTC;A{Vl+>G=7syy&vl+S^3g7FN3 zJo1_1z)t}j?bkW%p9eU`XA$7o58eSd%HIz-mgn_=qx>^~^V<-0d3yl$Y&utrNnW&juu_su4j;vi9aP_fwPR3AF1q{@{ch<$;3Yc z9POO0>ZvJzXHUDG2LVSr2k#P*NBjUa;AZ=XPXrv}&`X*T{JGBR{O+T0jx)ctRO9D? z{O>@X>oO-nuR}S%c->c~>9X>#1q~46uXOgZD#yL3|?@C`!D-{_!w@%JcpKZTD6Cd1}q_*lw%_ zdAwszhzeA$I&*YLuff1@UaT#I1B~61n?thTl1f; zaJHWb@}~iganRT4EWeQ!&1W9SWBcZ6Z&#BpC$@uen*(;Rz18R4^!q%>BcIm*M?NEk zSLqk+)9dX-V*7}n2srXw2{_8%2{`h>>n6mvfIRZN4EUqpwR~bJnLIC)u&CEp(zZS? zmpX7hr<~Xvwhu#;eO`S)i!LWK6>gp{J&?z8o~YVGwu9wden&;-3(NTdO5QBz zhd{fE<$O5cSk8|IzgW(3T#fmi2l5#In*ispe(5;B3HVmZo5nu}9P_K+tIl!2@-Tz} zN*ul$Xwi0b|I3H7z%PHFgcHkS`#%?OJip(o4%M`i3;hMRIoj_Az%f2=s0mH>i+Jj8 z%qF^CpAI;dlPdwoax+A;fIiKY!A06oOxn7*$Oz8laCe7@xgMkOCJI# znfV>0aF)k%a;ig~zt_RZl;1^FG`7Ez79Ib)0e_cpT_5+`opva({BLN{@&^IF3h<$T z-w1d);5Pw&HsCl;`?bQEKhODSzpn$n73{nZIF|G8zwFDQrX5ObAMK0<9LvK= zfTR7g6k$fh2iwE59r*3^-2hJP7wcE5nn33`V;oihj^owa9eC0&*m`vN8K`ixJe=&1 zKgS_|_%Ee>lm8ZlGym1J==1emf4lr~>P8XEV>>WxZz<0>*7r#YH~C-ckYD4Ff7c<; z@3ZG*+P_F$05E@CY0>3ymcrToR$8=t1K?QR z=7Sw9&l^ANBf@x&TrG#d}i!Vb#tQ~Ua6FF}0FHJxDV+IZfA=-uzo%n5UuR}S z?4z9r6wY?81NpZA$NFA$fZfhD3THc5Up{ci7Y>qkSbjAvn&(9dH{!B@|0Lij z|0&=b!Oqu!qkO_aBt(hh_8u)d{>gxU4ESDvqn+CTN1pcrj`D|+O-}3=uNVG*U0=j| zT~?bQ=tuEC7jTS!yw_!?N%O)!U)$>QGRJ}QJyuQ}&peR7MWC{u<*#IDJC7)w<|4xyl0Xy9~Fn=0mpt} zAQPcv#vxDP>;~J7AmD$XV>+G_0mpXZ6ovB&+l}7>j_uWIz_FitP~j$@M*+VX_&f}l2J;0xDd|E{(vLT!xe7w91i%+WJ|~GD8P~DIEAxccDRUd>G{Se!!0f{4v1s`s+o7a~yaMsxPfMy$<*W+ShU5?`?8o`Eg*s1MK7V z*EfJ~Bpq$%KY(LMvZI{q`?Gv_0?3c$6GDk`Y?sOa$98YK1K0E6Y-b|a-%Yhk ztX4v}E+>V6PXas>_+$AmaNzoTeta1Fg=-x0w>xm02gZ0F0_6?kaJ2*94mkGvJ>h(9 zB(C~=4ev!el$aLUzaDV3^Eu!sf2x|dG3`7KINI3+IP&QL9OJ*2n*TBFFLL022ORx= z4LJIp1@kZ{e-YqVPj`iR6_no#aI`-eaFj0v9Odf)$Npjg;257j0DcgZ|2Du;{+FsE za6AzoB$MZEC@J*zn`P2c9ewzSC`PTtQ`|W`9y&G-+ zW5D+U{7b;mK7YTI6Q7qq)1tx~NLD!K_i0+R{e1vOK8HB)VGjGpfjruu065zJpU_`S zrFiQ2V1F?U@Spn&`F}t^_ZKn_|6BTtTcBS!7}|~XfMdT9Z+}s#DvsH|tWdbwU)%*a z_7{&i@TUOB{^DzeoBc(vpZg0@K!5HpWIg>Ut}jl4egXT7>45*-U;N+fFKXaA0>}SL z0mti$G-!uWem}r*yfg!Fls^M-l*jwRczw|V^4R|04fp}jUpxai%I^>DFyhBM@LC6c zr^3zt;&H&Szj)DszX3S*7d>J8kJlId9sNZ<$m8|J34r4`|3$#@`eF)<&++;KuNUxq zxvm$Q!4CRe4EQD(&wmIw+TR8^USE6*I9^}q>j>^=(SAS2_1s`v%4 zzc?N6pZkmdoBhTA_UnrqRKLLO_7yN*y$||}LC}vp4>_9 z4LJ5ATO4>h;Mk8O!*u~(cMNp&BU3;guRBfw9LN8E101hADquX1*By8rf#YP?bwn%J zLBGoY-vsCJ8^F2YxT$dB6wngQK0dKpydb0*?31XY>>_1y78_lMZ|^+#kpJ6MXIh z&tuqeAN(!A(aw-J_j7_OoaQ|h|hQ6e^59VFMJ;Lj}Ck*;P{+s zPc?sK+S${A9|<_xnFjM<$p1mWF`lmhj`L=9&@Z4o&THX$e90mIG2kelq}p>Xb~tY~ z+|kaD1swZ}6CL>JfMb7gnZnsG_7`~n{T4c=@7q2H^4MRz0ywtYlN|lUHo&pJ=;vt9 z_Xd0u@Hq}}jAs$x*v?M^9POMAINHJc@7RwlQ1V=$YQ$9|y&aBSapfp#9-=S;v+{wTn)Ul;@Je+9Jv=K@{{xT{|{ z9olEC*YytE)h}#t$iLyhzXlxp1^t{PA4Wc>^(26jiEnh^pF8mVR6oL}=XbQ|`k3j! zrvr}vM{qviXs6YIKLj}1d0F9RzD7bng5}|Qz_I=OJKz|%snEZmd>!D}J|{xEjq)jg zW4)UMILhPy_o4isKpxxYcEFMUHwx$Tbp@QSe$f68g#I^A;Vh5s^Ay0bov(1GAV)@(; zaI|w6;CNp6fBHC?`3(Y&^8C!3mPh_)0FHi7lH$TXwlmi_@OKr?`JGKRbv*wK@>PWE zcygP}iTPuk?*V)!$gfv8+sFR&JHWBu{1ppQ;uT(}==+8y{;-l~K4*g8PXWjN>)(K5 z+Ru4*9T(4?YKialQqv6Y;#`^&|dY`9hd)M7%PUGDC^; zbuBIW{JyAgjt|O@Oe262%VRywS2)XmMvJyH3FNV!P6r&{Pg@E&*3+}VKGxH7Kpxw% zMIevu|CNAa{QnF%#`#sivHb7Wk1|P#^NaGo1RUkh0vzR=07vKZdW<*6g40- z`P{g#pc&OqeW!4i9}eYq3SITr9!!S8s$v3}hEIG&d~0LSw(E1if?;`p2h_QUCnMvn)6n=W7> zKLzA(SGbw4`v6}}syYtuDV+U|2Rk2wJf4>$29h8pmdE%^037G*W+v8{|4E%S>{+|u}VTHe9;3q5mZw9W% z&7Tc4E!GoPs)%RI&S>zBc~JtAFA+u41A6h4;*aZ+{beoX5hL!9B1HMCODm7 z;4>6{l7Sy7#l2q^tD_&)><83vKwJ;jC>x$IZ7|f}kUtybwLOMv0oS$|a@o=E?qk^< zu`?I^qMdU9M?S7NG&$s5{O5x_`mG1tkKc10@-DyUgS;QVE<4Q*I~M|u{9Seyf;{qR z1l*6Ei$EUj#LMTBon)tFC)ruDlk6Np`Ms*tr;RKjr5dkjL_~7;ry! zehczw=TgA^*jWzpXy-D({n)u4JuLAiTz;6UR7x0?^NB;U9EG&xr_1J-NOgPu-ayPHQ2}VI}-35kYBI1d4)U|fjq|l?;wvn6G0yBV7rvAbXl}bZS%?x z|C_*F(lNW%K~ zYy=MM2+wrz>!;pb3-ZYGMc{)xHv_&SJTt(rAD+uV9(leDe30iWfbR&;9^lsx&+9-Q zdAzX6`Ew!6c#7x;DY)UH_cdA&pHbhVvGYhH93t~MA` zx8MX41f1vQbUIaSuzXJq(z*_CJ!i(y6@Wjdwt2N0aCHkvAa??;$0`iH3b?w3B9M;& z-%V}vN{T_+Ee~utQ3`Qm;A| z`-1`3Wta~f4fwBwr2Huad~d+30pADkM!*LEel_4~%3mD)9pGx}UEu2gS5x2u-w1fR zK;+N+fDZ&5zvq$xxULMWb^zeJs!GE6Ai&cBKM?RCfFA^SG2jOSJ`Hf)cJbjRz=weR z0>BRed^O;Q0)8jphXMX7;D-bLSHOn?-d{Be9ET$S*YC+>JQHwyA7&QdlfX_k;EMns z2KZ9Ib=$><*8)BQ|0e(E-s{ua&@H+w5_k8%UevcpX84vQWf&2u(zXp6F z;6DIf0{8&cX|erDfFB6>WWWmmp91)Jz^4M<4EQv_TL3>1@K*uX&p7enzXCoTk1@ely^+0oTu6u>C5){|WME0-mb| zD=dE&;QId*7_SCgzn6pYIe_E;9n=863GCMb{u5t# z&jY*>@FxME3;6SZp96S*H8^8FO@I#sd>-Ie13n+{-vRz>z&`@~T)_VU_<4XItp

;Jz~2Y_Lcl)*d?DaDYB0)t76G0I_(gzU2KdE*Ujz6hfVTs_ z81SzFUjq0KfL{i9Pz{cm=cRy80-WXb^OS+14fE!N%V*L$TrbzN^;S646b=lnEDx6l zhR$qg2n=OlXz7dz!|E!kM^2qxA1bfR$}X&FXsi!StEoD>F;qA=B6I>sjV@}K5)PGD zhi9V%3uFy1sjsaFH8kYStgR1+Dhsk%qCQkz-pN~(Sf*Vpdt9g{R9{t5G^hNGP|<`b zrCB-owR7sKLro=BO`+%jkudn4k zTz5qy#y3(w&Uxo9KWk`~rMr#D1ctiegECRn)xj=LEXqU~$kNe|;qq`}!}!{oDyk*1 zs)$86rpYeZn*O6%igBem9vn5EhLAMm<58h4)-jbVtW|RnsiiT9+vTGTM~~pT?rDcj zZmeO?mH}#)qnmD!@@3CYxVr4SyF;w20gATghgjF$uC`<=pRV)Rjo)z-vNw760=atd|JHD?r6@a5pJ zqK4Z1+2!@>N|2#Z)QHtome*J2Rae(mlvAr$=(h*&w&j>)!^|vmr!$Sy?9QW^HDY}E zyqTfNGzlPr94ee+Z>dF1(4D`EuW!~?FHxBoDb0=?TU$S;JX~0ELdASH7prh&L}l$* zvW6FmIe@C#n*8eWh6dMA%cruPoNwi*{Ex`1uP>ihG^cxo-=DV2Df`T(3Rhnc3X5_0 zaNa50Au8Rn*#*H-G=3|f25E;``84FBQZjdk!V*h8%B?qsjE9PCKN zcPGC)+qIwU+OE>Nk>7B4^1IW0`_8a&sn(4QpV{pU?@Zs(8P?+pZ=xnYyRfRNi$2h$ z5M^2o1DpfpxCaz*Sc)P;m##IHRrNGNki&QC`W;hy&T;F=f>1RLySpBx?MyFGnTTUx zH6p({L{|om2|XUnbj#R|P!c22tWk8Yn{+4uP)$WhHUU#h8MVz{6_R`=O&~>P*9z$o57*_+|7Ti} zGA-vcEc4lxdC;sJdWfTHPUD;@<@|uhiRIPw{K;g#BFY-6CjR(xs=Vfm>QGTtA$18= zvPR?>7ZN|QQ+wEda;KfjUYFj?-Z}obb|Z^B!>O+<+Abb`>KyJYpZ+o!efOdpRU^Jr zXdAY7C#b$MXuT%tjyGHL=d2l)XL7m~R$p1P&%ylEdE9wkePz-<5z(!n#&afjqT5I| z8^Y!F;l{e5rQ?bxj>#)7Ep2F=Sz1&|&qk^O#m@mWgsbTOLT!BxJq*CJ+zqOG$`-f2 zPAsplDz6C_s@{l)l%?f7F;9T^z((BGEQ7wrn(C^vLe=y50g$-u+55_Pa@WPVipPwK zN&b|RrsfBSW@TrMf;df`BA!VdonKoMF0Y~|Ky_5bgD-U2D5RAAsYMns9cyJHYea## z$ns3lgF;lCac7*~xh^wFE*|GWhoLTjuP;pfQm%uKJ#&g$HT)afv z9e1J#`_7KzQ7VCTbTY|>$nx)Wm-ytPX|XwhFEhkl9DSFb}5{%?yzzf9@tcT_R|+vCvJ?|eZ0JL1r9wfMg? z4*fM2{k!7OZ?ov%9f$rFi~ia;^tV~`?}kw3q0(y#wdE&BW(NWc2uTlD$;jDGd|@(W8SA^(SH->?1vi~hrL=pSa$ ze-Q5P|3Af%|8p(=*TtcKnMME6IP_Oo z^dE~u{|<{je@D!3{MK3Y`TIS7^*34c_m4yWZKaRxM|vFkA6fhlj6;9B#XrC2*l+%O zsP`%&{{!OCPqpZCpXk^B0Hu%R|G+r(53}eW6o>xN7X5?c(AV$JME;M*QT|W0_|J~R zf3-z_SRDHL`{T%ecpUndS^V?6YW<%76&8K|4uN0&J1qLg#-YE?qJLZ*`kO5JJf`!@ z|80vtf1Ap${-+lGDRJn3Z_z(74*kB0D3%}o4xV5B11$PHruD0Tm_@%d4*jDo`ZMFu zFIM_^{mS3}^2>j!62$hGzx(A^zs%yFzbEEbf40SceH{8>i~n#O`sZ5w^LMWN@?UK6 z|3e(@Z>vRr_c;77v*^!?Lw}`3KNN@l8jJq-apYgWuNcd3-#Gj~Wbr>Y4*fQzkL91g zZ=_&v?VA7DWbx0}w0`wpwfN_Er2ExxxA^Dp*!k7}$l{;BYvfn|Ym5JL@zDghapXG7r?`iSR-&69-Ki%S=zc1-mf3U^>ia7L#Tm1hn4*jDo{`vbye)$J2 z{%?pwzr^ByWgPmaTJ*=pp+DQA|1FhAzxfYa^xus`zuBVyX&m~OS@b*N&|hZJ|7RTf zt1bE;#G${|qF)xr`CDhvuZTncX^Z|zap=El(LXH?{dSA~j5zc^wdj|`p}*atKQ#{h z9_qU)*nXGCp`U8euZ%-~fJJ|L9QuPT`lrXCKir~!N*wyR7X3+a=oee`r^TT^-J<`T zrT*?i7@5`GHEqdMsr2=}Ub8HwfwaSznr`$C`PDy|G`NrNuKr=9EBLGXC7M8;;;)7= z8uspoYG9H>zgg*)D3ui z{^W9!)8i?PuP4mLf34!LK661*GMV|;_asgKYnA^@rT0ELX{Bw`|89ia{BKtN$18ok zGX3j&@}~cG<-ZC1|Hk5fg7Tke#BX0k)bz((G2P_gufIPPD}H)RX7ZnYkMxA`<8y7s z?=y%05+xWbejky(t^6!j{xN>PwfN7bxG_^Re!ue>zr{*_7bE^_m42-FEhIe~|G>S` z@#DH?#_vUk|II$*_pHNzrt**RTVe5^Mh%}We*3ELWW_3fl}g`?U#8NJ6~9u_x5aOb zC4M(p`15@_=5P8hQT}6mE6Zx zBi|_G_HVU?|D_K9n|;RbB8UHGC1SHv5cU9_ic8-)2kv)>{0xDF0^s_U%K$lwy^?zdHD5 zD*egQjQ4BW+v4CKd_bQ6pwi^}dmn9^@k^j_3QL;&FI4`uye1&6>b*c> zW<*qMnf$Xz-xmK?#lKAHGk<>mQ}gMs@EH#N-}>Z#g@b>px^Rre|56A4Z5ICg{GrMJ zJ_rB#%D}2Y>+VufWy52kd28T!2mf@XAFKWpI{3FM{%e#Y=HEu! zBrcNXKU4WP`PVD|92-m~|0PP_jDNGz$8R;V9W(wHlfEtfi~lG+Vf(*<^iBSEJNSR& zGyd;8_@}B1Km7KnjsM>q`~we3{$;F0iR1qitxf*DX`I25X8dcF|5)Yc7^NQ-f2Ci` z&LNrc&mnzV{L2)7jQ=xa$K*fD!T$@N{8u{o>yNIl1n#_P^1t4}e~aSZrt~@fn`qnQ z|BQqGO7&e)o}a-a&uRooqJEk&GyZK#pP$*qWb*%yga5LJrKc@Qnfbp++a~`(%D-8D z&R351Lg%z?@;}kRf2GprGK1mr%X8teJw#ok-2me{>pPFKo|63jW zo0a~vNS?M${;M7Q%l;(!uL1tAS@^%~;D3BSsTeE%eW{;kPiFZkQ~I&m&t9Z&i+}HR zl0Vj8E=y+od7Q?QX8Czt`HvOC4*r?Hlrlfk^(`io|8W!`Tl|ht4M!~hS1Wz<{MRY{3uDCZ3evZo z|79wEWr{qhr2km_pLX!ytn@F5!GD8;|MW*?q=J%$=>I>o@ZX*KNgMx@hDgO@l)hd` zt9maGs8IT5{8uXdZz7^%%PhaAlfEtfD;59Q$|0AZ4zggzztzG2+C!w{Snb~n4*qME z{*^KKKjYxv`*BHpjnZfSpIZ3ycgtDQZ2$5Om5Nk7Iwff}0{vR)oAEDE`my-WC4F1` z*IM|0L2k|XKjq;6u223MR3JD{CjV_pzgLX%zc1ky5t-MEU>H!v9?5-;Dpi zj*v0Vk}L1mjQ`&q{4+D9%4;#&@2w90y`PYt`YU}dKYah*jDPPmd->_98vbz}bGc#i zAEETK4Y^{aPxLw^t*_T%rEi|UGNqrU1(g-kUM=a{&R_aQsi^;tm-GK`vSH@`W=Hr<7!8UMgYDHV(VNu+O!|8xugAIYTVqsK+79sG}1{@ zzu3Y*kpivxX#Pji1hp;xxB2A1Sm~SbZ}Z82A?e%V|B!`0-|IB_|H;9Bw^1_UTHY1^ zA07PDmHvZTQLWAL|E+`nM~eR%rN`x;>$2vf<3DLnd;DKl{`WHc^SQ!wztT73zfI|@ zX4F$L`QJ_Yw)nUHS$b+!n#{kCh5ru@{`abZ-vH0E+%Wl{^b47PlmBL=KX|v!22B2w zN#Djl{b}hbT{&d_$+Vd9e_i=E+n??E(r;mB_fhT7EIL8#!sMS@AQjax-m_xzFDHE) z|J-LJ@l2)3{JAeN`QPL4U#9$5$B5q@4*zw^KgMqli~p=&+RN{z36glOmvgxxa}@!f zQ2J*4QYT88^oXd~GUN9s>D%Jh`mFSX@!QM7e^;uAENS}BRQ?ZO{~PJs;@_s?U#2q7<#&K3 z{!{k0^Ph35RNPnT>y;V5SCqcVzgg+u6odZ@q;KP&{+#qwrW`Z>{Vn|SX`X;3&GUai zxm3(j`g+B(n4VPnCjT;}|4a=2kCVQQf3xBrRL+=x1}$d$F`OD`=4A38GD|AvAX(aG zSxgToeUpEk(m&5oFze4+(zo${TJg_O`po}8T1@_LI{1HfhGcmFlBI2fP9T*E7-J^? z)Y($;FNT82zYpo#_y?Ysiml2&^B+u$$$x_KZ^pl)N-9$JIwgZn;CC+mXG%3?#je}7k{N+6yy4Ln}dJO3(`}j^3L(kvhXja0R~H&{5xu-A`MSF zC22JR-L3SqBaqnoUg-}uaILS`A1Qsa{$$ol#Rm`SY`{E!?~%Uk{LNPRU)e|MbN)xr zV%DEurrY!X;Wbh(#dxkx^VY1UD1DQEV40MNRsJTBzKwtHH>Iam<%s!nTW0dVRQWg0 z-`mQ6tn&A=(vRZ5Tsn@`emzh6HvY>j{ExEmPa9~D|6i_?{$sUY*V^vM)>vGo-#*e*!m3 zsRL1%wzYru$?03AZ{|N!=}%3Oa{AZI|369Jmj7k#(nF?-ALoAzE!w|smn*1)WJxps zi|&ygw`<30Ev-htzbbu`fAhUkCKmrKq;KQ@^oPwWi?4$I) zRQG-*>g@)OA8hB}mLw%Vru%D{O#X$WZ{z<^&qSf7|BsmY^Z#F&?au?szsdhLHF2)0 zfk(mQpGEiC7*k>L$Sv+8`L`;Z`SbtJnfw=%KA++wL%&V= z*Yf(X-q-7e4*&i8O8>f@X8$K!{9mo|pRFCJ_0!7#AOj~8BI)&CmA)CjPnEuT{U%vO zjBau8&s6-UD+T6%s)heShuF_w-JX)+DH#!8yk(xhfuwIef63DEVi-U2|G(+D>$sLH z|7O0P8!7!iELR>0V>htIp}$yNxSIDbwSR4Joz^!9tW^4Rd!HjaJZ>ztldrO0v$~&Jw{{K_0uj3auRGvSx{%%(OX?mhlGWi^)^iBTTl)mRjS<(Kr z(Su3f#y?l_4=O?CKg+^@x`Th}XcDFri~k}A|4gMHi~j`<{);XAt1SH2l0L`8j9*as zH{)gQ_dIOJ^iSJC{rh)NKl$*k`E%L8WbRk&p#GmopG%5a{!3K+X?nU-GRyyaO5Z$x zvwfDIcSzq>{x@67Prar5^ciaB->m%8?SW3oA{LU+0tm84muv2gve|<%i$jrR$H5%k>Watv=(w(ZPSMPyTHV{v{Uv zi!A)VaPV(e{*UVv{Xihy*gr1QUVhSfvWk+9lUCF5)B8t~zODQ$v+(Ele`$Sf_X_3T zEI+x*f39|<*6GH6yMuqTPyTN?__tg5^ZUO{{#kT`iX&z6U#a{bWAHWkU!e5O`rGc4 z|9sN7#eeX=(dB=sh5z#o{(+-8S2X7*ej`8Wkxj8RfG(U^(&V43^!0hxYC3*;|Cgk1 z<6mdt-)iB1mhx}LzfAd$75|4F{8#$qf4_tOLl*v5S@`!FW-mW&KI4C)(l_HDI7Xho zSn;1k`nLE7_KPk**IM}B?BJiS{KqOkUpx4h`Q-nFgMZM%f4PN!{&0Kzo0Wfa{v%x% zT(w@R^v(FU`Q*Qt^lkBPweVkI;s1t%f4lO3q`}wZpE1H-f75xgpHi&yvoGn}_;0cB zzrn(Pj`DBT-(2N?lwcA0Nsnxbtp^)@Zhe{}i3(Zc@+2mh7Ie~!V|D%JJ-NOHN3;%l@{M&r;|JK2OyHEcAbnwqjk1qdrS@;Jj zz#M-weyO>P1_D9x8~HK&|9sN7#c#3l-=F>L3Y@ zI{y#(^dBI7+xbt=h>rh57XL>&{BKeIbM=WB@hT(&zj?X7Rt>;lIhJ z|F0bWH(UI-S^Q6+0S>{@<mf85db_~+!4Fr{4a8~M@v zHF6~B+u|QQSmq!7^CM+iU!VUg9R8bp`oGlSf1AbsW{dx~9sVEk>HiIf|7C-t^Z&BN z{~zk`Kihr!Kalio@y{I+?f+Ga|8pGva|)PM?DJpm@c)s;|LYe28y)_eeEM&5 z_-{QVI{#ZN{*!5ffpgkVK(ocBefFLE_eg|t1)1EyoP_EGmOX_QUZ1Mg zr>XVnv@TWKWwb6=+cRlhK})6D57BxSEoZ3x*|e^rMelx8X&~l;LUr6gkv|Ob2 zFQ)Y+v@BNpEwsLrmL+QcGFmUC<#M%u1+80Yxl--_hSpcna<$sOhSt~8@>{jPjMmF( zxlZl>p4KT4AWM;B}`t|pH`DM=XuFw0v&;Bk4zbEl~3csiE`(ON+_IdnX!0#W%`*Pg>iQkL( zy@X#Ke)ae;+oaR_4vJl->b&^Yq&Sz*KEAMhx_~Z zePFzA!Tm%0J~G}v#{CogJ~iIA;=T>PsPVoX_g4IN81FlA--X|9v~%(&;{exC9CZ^nH%?%Z2|f5-X8{Q~1Y!nkuf9sdqaOY+X?E#5iJL02`O z>GI^AuB$@hxyZOvou*2Ke@C%#CyT$_cphckb=-Z%^A*OO>u&wVbE$E^3iqpx=h3)d zV?1Ar`xxW74EM3d^L4m${UZJy0bI!5`8*Dn8;s{5?&FQ;Nw`nO&;GYpJ7vEfzAj4- zwd{lh?cNaD zQ#7`y%okceRu6qM#vfX#SM4a=qq*)S`A*e_uDg9O-kf{1VEt6BER$92(I((|_u9SM zxO>SYkg8r=@JKphN;KCDPuA2TZRo~5#ai|ZPoB15AtQ=3SFvZ99=XdiLXT88)0Tbaj=h;x`=s^)zg&yzhP@YJSR9% z!Hsy|jo+(#wCo@uDqn#Zga(?~_C4C*b$WQT3jhcFo;hwx%gUQLI#cq&8C%psmodr@eAQK+4b@O#|#+tP}vK0J{BWz{xkNvIj! z;(gOs-;zGHSo1cZOTFJjW_9@Lx1^)286Gd7_li2~~JMcqz`D6kfID;vxzDd*O=L1Go`w5!-`BbCy{5qEV zG0Oe27GWz{Pw+ch?;sxA%j zgJ11MS-_ZrHFp;afB52c68*|=~b%=Zx~+`EE-=lVWl>(&{4DD?r7D1XT^oUFU>2| ztcNx=N2{Vvy?#rE9`W~cF`bs}K(D&ct8+dNHC4474AtwA0WTLcRs4@0HnOF6D&H5{ z=nK7@Ul)y_Zt$brld8e>4)9ppwQ0C?q^*~n#4_@yZ<+r*ZSbE8#ed$!;AU5l|2)(K z{?ma@1S+_B3xW-4t{)Ig^tU1#@}I^S|Jh8;LE$nU;0iImL$=XCzBA!-6mkX&0mlLF z*$>`B&U2T?g|hYuQ~C%`?;yiL{NBXxUHsN#Xun1{o=r{@1Ye5dHedjE2}@d;lJDG? zz;}M$3%>JK9N#(E1>cbtCh#5bhhFiUYYcw#9va?>-)uJd&FkbByMg@&-vwJCM*&;W zW^dSqw+(!w1R!-N9`iETMI%C(5QI!N117Q(p`h6E6&Rcxi+KgXOBhVPQeH=P6t%M> zhN1k821^11O2&N3lQ5rs82%XZA##m%2n!;W3#I`=PTjt!aTb760*~q;lg2?MEv& zcoXlgjC+tJXmTiMRHFAzSjW%?Ejt4mldD*1QFTy{>Y;Sn)T2>JI1~-SL*-Clw;=!Z zz`tF@{4*;D^N^0UVh_}Q=ih56a^9`Lj8Prp(sn90Rr zW?#?rtZR~RF}lzWm5YJ)JLy?Tx!3POU%la8-4(02*44e>S_YT0>s#G$tTz)mmNu}G zi~{`X)5GIef9#%L{d+2Yb-=O%2@C(e1AcWv2JE+F{wPlJP!;diAJt2HQ2C)~bM(X> zq%X?wL?Op_ZV&EF;8$A=el?&sekdwEc0UwsWjckr^F!4F%^_T2TEk?v`JZU;B0RzW z^gQ{M=G}|m4!D|fi6U@6!SjUQPHi9}XVI`b_&PMMr1}@st}TG9d<)d8z^Az2$ubWS z1kV;MLZy~@#UBMdCeVNoy3@Sv05*gAnRg8?<#Jh%2$$y`y0}`94&aETiAZGVz$M;^ z#S}=o6>bPm6_adb66zYk_3>`2p-DIzo$Kf{=uru7t2#O#?h?0^xSHOg?MU^7+Stpy zqoq+iqwDA?D(8g-rEBx;ndiYv;gX=>3n)jjX!JmbqxCLgr@Tv`luREZFZsFK& zgTG09+ci72#a9SRQI2{j&fCN--A)(xFvb85Z)jiWYodNbeKf7=qXTev!@C`I7KJtg zChx1h`VZ4dW8V}B#89OZ2!555hHZY|x| z2Uj78e(NAyM8wo`_@u;L1ShTXWp6?($u0l~R^SyBIN^0P;C(oXq^J$_8dt(LD}!w& zMFd}`kEGIYUDs3&kdq0^@bW#sQn zr{vD@^wo1ZO)OLBRgW*PXY`t+ta!RT?)#(LUnZy9zZ!J=?a=F4^kmrO=Wz)5&gk_o zDe3k8e<^ys(V$oOEtPB*`B`Vm&o@8-aAi`6f~pUG3}N{W9z=e|CTB3+D8z?Jn!qOf zWL{UqCj6QrHa9|Ia?*xB$X?42N?{9sD5sezI%Bj;5u8fCGI#K0NIt(!#$KI3!(0jz zqhSazh*x8NhIB1(pvJefdJ$RHq58 zS`b0C-6C&V1#y}IbQGJjmYruy>Nt?}#>Sm(e<9bU~Lgy7%&VW^y{;`JKq; z4uj4t`Me7O-xG3HEL@^fsypOzXnl#Zs<+q@>?R4ElA4 z_7%kp-XgJh_ld<@5_*Rg?<-usMcO*R%a>@NTDS$SEY>a-T8ObLhB4M}bvAmxwA;HI z0P|oja|xCydv}AZ-TH|^z8}V$yD*gvdlx(iOCKPrSH_#VHY>MV3s>{Pz%7?4gMDa4 zIhJo>1s-f}Ea*b8<{EGhYEWyu4nh=vAo0q%HUSI7EK3-Q!Uqu311ix4%3j8jgHE{WVo=j>zIm@AEWgS{d z(8YrXXyKOOx)vqEJAJplxY&&` z;`Lwd;R0tp@~p>=`!?Y*h%2)%026h}w&V+4{UJbFCRy=NEqO5rAT)1tcy?BJZU&yd z!LQ99o(&zW{F~68&~gvgjW>7TwXJ!7=vfbIgB+oAlMdMr@C+4NR9=){{we%7ki1;? z8syqA&ZfU5ZE2E><#6(t3&RG}xr61Ws4M$^Pn*PNFY;`{1G<)LR9{mG=)GIyX-9Zz z&6gGFrQ!3#)dCk54=>(NE{Y|p2vV?RS9`dinQ`wUE;6?xw1QnX#Df7w%a=+GXcQ0(^+45jCu&>fX%Q%LKGq{cHfG^Dv>!RRHeDOE)Ke*u-cR(%$c=b( zgjT?@kE9v$rXwX+tkdDo)U`+<^)})`4^?}(M4lP6K@}c1Q!GIQ*DaEqsuW;p$nmf= z1P?~<2y@Va)zTH{*iHD=0osQ>&q)>J3Fyf>mNtJB+Kz$XU|>SsNbC;;pftH`{?9=CENYTo725OBj?Q<2p32VuB)3jTp! zLCi)R6!QSjTMd@kpbaYX%!YxKfvWtT8?`}`J)>D^A^0ha%G%-w6H`dHOyJXU=IXcDeJ z{A03?dVAZ|OG4W*OpQ~0+Dr&GpmYl|BjX~o4>+BYJ<7##A-O9|P)Wt~Y zh|KN?)hot(BI<8J5N1|OJ=~=AF6yBw zXX?k?%Lf(+{dk2DW9Y{ZA%gmGE$-V088l(lt z4dhsA>dVtc;BA?q*Lh!&LQ#kc0g_M|h7&S7!=p;{nx&c5KLjX%CbWB$s-bjl;mp*t zXQ0C74$-lvN!@n!c#$W7FqJ)CE1r#T8+T?YWWoQ1IeLI6RsblIB?7=L(AGWBP0*}D zgy0S47*uNtQ0AJ3T$a8(+|ZYoN!@_35~)mmd8u@er7u70xlwA!*%_xVa|ew!NGa1X zU0J%#tJ23Q%?ph(s1mnHcX>b628n`~^Rd<0rlIH2*|X@?HbB_R7*&uBbo^H&13kze%^`fZou>F~->X-Eaw5R zbpTe<4`X&f40#IFV7D@hnM?@~B_){3ZTUlNk^$8%lh)fs#KVefi4JO$Kgt!T=0w3Q)MSL_K+VK6V-v`0BG-;VkyzAOhL!?mHhxP0GMJz=v{3lP%1yHVaA{( zfii-_@5>4iSaJ`h25J^b2P+gcT`%M!m7%=)Sb50qeb|)$rnsJ^h5<#;nS|*jB&n1t zg4@x0ni@lFriMt$V+~V-m~NAlq!T46r{PJft`n6)OpVikN!7~Uhs`k>Z;ONp5t)_E zLCydqo~(9x;t9^wGEb&NGC&c&<4TEvdTB4H014M8gjF+c?zPCk`?x$A=Jq1kw9E> zkWoq-2*RZm+^P+F)>A2o?P8p*oK2hYMu82*DzS{rhDe*eg1b%YP=rnT8;O<6EHD6K zwHziOb5J5Geh40KCKEv!p!9|0G)27GEkc97&_((t>NR)DFag>xuxIdh^-1dhNW4Do)rE? z%8T^*JRE+X;HOJrr|wjKx)V;m z!r_=let*9cYC!=qgO@F;g!&nOCy&Zt?dRX>JA;j49jSkJ0i zJNG1g5>0Yff1D*Syn*?_wi~tiFQH8^tn=5lTKaq>qi=J&KB-NTW9KoFUEZjTY6>+C zYOHE^{`>=d(r5al4SM~j=_VIr(j2E`$PZnugE&3}ifuvOGgy^YL)`I&M^g@DfZ+r( z&I3B2Q8;O+c8@ls4j_O%hvp#wnK$LvJrB4X1z1T$kL?{K3RTk8%|0|p58sZWurGfS z9ojiZpt433$a58dt90O&_je)?-KjsM<1`SI@OJbj$YPn##ak18^?LZ~LZfZxutj><2jC`-5NSL%9P3psPgbspC*Yc9kl^RbriUGu{obO1-!!g;oz&JtWnXZ$?;-2Nz}TqGz$L z&D*9_5WKbF?Hhl1E;x-bp~%CdWJ0l_d4Fk52fVms8%PGFnjc{&^b>f1$QHbdnt^xj zUV)(j)f=8j*-5b#FZ6NpB}jdoQ;i=W5TbaK6e3gRSc|8QyTN#ulHHk;YOwlSkj#k2 z;RS)xJVY;&=>|?R{t$i>!b+v*PEmSfl99k7UA0UfGHwFml+#3W-Qs|}2iVJ{Y$!Z# zV1g(-O2+}XUyux-h+wIKX_DrAiIg6sG`-MJW@XY*N@8O|`%T@4vcFc~_QJP^H5SO~ zMOHjxvQbTgNj72+l_0WQCe#KE$1p+bYEuokUqm3YJSD{qESAowi*-6$;X-Ecq`|A8 z>98rFB3K-h$LQ>K{E!@00+k??t*m+UWTSK>C6zXROghWO-UxH~CA}yBRhjW%j_PH$ zF%OB2GRi}aJcdd{CGtrqE}wx+UBM@zFkxo{6`j!tTuYXjF%+qndMc$Mq9eg2j_gZR z0M6tHas$p=RFMktFheZ=gNDl-st=VCvOahq0`Qs3PAa~Oo&$`-)_1TDdQse_B7{dt zKurlCnf?uW`uV!lbP}l=#j9QpK&bb?r#>1W(WSBphVYC(J8%vD8QUoua1zjaTFvK% z;=_S0jZ|bhFeP~;(2+P2YA8^etyVn~uL^&a;^W5HnaDpF&PX_{ThId-47g%2Q1uuZ zOW(l@lw7t(LOEE{Gz24cq|_-RODsY`=JdSMd5(k5Lo(17(%dw$TA%)Ltb@4hahC z9i}7K_?!*J7cCVoq1C(uC8xDa{~#Niub?A^qSJhj8`1k0MgIe z08)Y-AaL*vvG2_E5^o;G#vS-)g#5TLg8UtZv z7_%{9MPoJ}D2zEeo>5~e&B+ATKZGy3rc+=oGkkeNU(psks=|xl1vdpxErRgYs4bW; zPrEUDz%^w23dJFiOx|xAyl1MmoP)|7#v~U6QdC+@?4S%t zQ)voB4xn8v=)z~E8Zdu|1Tbmx$j};@fg%6D{tT8!?gzUFCIZ54 z0o$Yi{l7by1izh>2IS6UuV^Y@s6#CPRS6^}6Jr=5Y8ea*S|Wg${NJ)^E!&B-pxRW9 zb|K?)2+-!ArWiYTnpy>zZ!q@Zo>~NfVIDM%$K{?% z##|^z!OprldcwL{msZV_7J<=q7$dP+hv7l3pa4!PZ$l#zqPwYFQOts8vfphi(FQwm z=Xgw>T_?#pS%~D>QuX2%M6+u0>|u&$TQ!42L%yq;70*V^0z&uI3uH;_7G}-L@4m^Z zIC*;wX5C$LV|<#8u~%&4)07VJe3}%k)f^9od8m9k=5I{Nr#qRr7N0&^SroY^zJQ_M zOmlR88YWLaNegEItoT2RUvKb*py4&zmylHLn2Wya_0;L zUz34X?04~Q(ZkazbGIO!aPi{Mr|`>+L{L*RPm6=*Pn{mo!UgdR%H{%EFLvyfBTmke zgQ+s-WoaB7hZq=f*wPEq6!jj;e?TX5$0?jf5E7Uhe|5cPX9dj~`%@^k*rNl;HvCX3xJx0*7siB~72@m_j$`Df-Bj#x`@&aeu>hQrhkd`^J(oiJ z`hwN_VCyNj8nO!ypygW3a%2r9$|6M}DXN0}5+e*#ZeS!((%?;dqt+m$GCafFyi*4P&@9A+r z={kqwx6ZyedpRu+zL@lW4#&Rq_2_;3Uku-MSUR2Y9bIq3cWNhtfE8qtoow9BXS&Xk zL3Z6poCh*t{DAX3=T;B@g1D>@1^dVaegA{#3$8fbMRdK(GZM4$Kvo=xX`zMEEM)Fm}8&|5Qxee@Cg;ixE1pK+)#Gk;S z<4;rPbtj$iC-0;Z98(T5`Y$KY=W{2}=ee}^I-!qaj6UcfG+7te*<|poGrZ_$>QY$< zAc`N%(iT6twyY&RTXBQ&NHmoPDzoRc= zF+xM@@7ShStw8r@!`oKSJZGK1V6|3#j-cOF?f&qDHoa<>tF;QYT|XMJMOk_?%={c^ zq^`aQ$fgf0nuq zplb7l)>0IM&u3@pgZAr#+Bq$_Qm@~iuGhE2w>iP(kBsi{4QggGbm1n(Z}(Nz1CALm z$!9d6$L=~>%Rbs4YSu&VN9laivXAhEUgz6n!w%*+PS(#>13RY=tRW8d4Qf&XTxMX# zGw9ZLoqcdrxf5$x7N@yzV0+pC5Mo+2V#L225oWB1j)bQ-ORuS`$ZzY&(tf?7dc&Nv z#_Hi&2-{h4h93S|mQaQs+WjI*ag66d>KIS*ZPQ;kUJk6*vlzp_e6cKdqJywjgo) z!#8D>)_h!Xyf1v0N3~R%=?`sH0936)PNV5XL1{dCI4c_#&XxGdU-I^TyZu>ImS5)! z9iX=47%S~r13$jQ(WX7ET%h-3JDAKRfL(?;zixpVZiJue54GrPN~G6( zp&=d}O~k3fD`WF-m~1euYZ3Fa)BfUg{N9PD z9JP&*K{nNC*}yLIgk#k)p^_}KGsc^E#NOIt=8hpAp;zb*u>1FeeRnEC-~sRaNBFzK zw^&PZ+1Z`(sg_8XUzem=m$VgiWOxKM*)Yv&7?=+Pn9($U=nO*S3l)2;wzWP0xk1-37WjwlS&v!vTUDa1)V#1sYOnN=n2PIB8$MGiTU_))J z<3-}9+0bO&Zj$kjt#+H^s>YLN>&$Xt1|vK+0|(^1PVzW|nF@;m8b}HL&?JoH&F*jsPXDh6sA}%Mp|@4I zyRO1bt;C=s3l5VFtSJ%LB?<5*ReW?TkVS|!)X;haA6maa4@+yLDQ1(p|EM*}DYeSE4COpz zlyiYEe7WGPCGAjfBFe^vVzZ*aDSD7aI_#wb;+wU1B>(pe+)DqiA8 zNZS4X)c8c#Kz(CZ8^VztwGBUuNr7sP&jXdN*&si_)7xsg<56IPh4E}K*xM?^08Pzl3k@Du$&OFO=ep&CWgx+V$C@*>48pG}W(OR&!eoVkBV#{xZY%Z*N;!pEF>-{;JIEFCI6 z0-sBJ5MyoN!&sAlmiZ&14?uol_TAEa3;m&+Mv%uHZSp3q`etMo>0}xM>78WVt(|bm z&;}1f)k-)n-mzz+M;bD^HG?Q;7&A)K5N-o5bHYhLrkiu`%fMM_xesPIHge(T!VCneKV~$s zNw#yF7$rhk?5JeeG)1s!yvrsW!egj9jSHuX=2X$cVeV%rPX6#57v=A9$>py(Sz9IUt}6j5wfaL-fJ&Pw169U~YiYV7STHG0Bc1}FQ(Kfb zKw!Q&8XawX$;D<*`@^>Yl${li#RR+y2~7dt8Zqz)^0ZL2p2fh29& z8bGRDKX`jlR;vsC`oA5EbUME9q*twU>fvkfX{4rGqo&rnGHLrk@7=mq&b5X) z4hBxN5eBOQgN}RIQ>{-}as+r2F3E#~QO6d==Ka2cjoLl0c8NQs;o+XEBQx05V~wu9 z9bHqT{q1shRf|)fhdl_K#x6jh9@?nS`vj&|hd!^N1&T&>omS(P2qj2-q06&$XM-;^ zlYQ?!n7B`MNV?i|)I?uW zd`fuUGk7*jh;wNu(4xPRw3X;`M<>+!8#+k)TS;7Ve~vJI>Pj`&7i%uHXkXPQ2a}*% zbP=XZNx!Musa5l9mWSBZtEF&(|H_E}oHQLi^dr73ai>)j>XDyd=njHPP6BkrY)g@h z9h%Is`w+G2p*H;t8M;i4TnUGc&vw}b2MKTGU zYbJi%$US-o8prek5D%d@(jP3Wh)civ4!Y>w(c{6)^r}x${^i@EeGTCSldH9ls5POL ztsY8XGJnB8(?!JC))q6(QIf#4ZOt?$%-JKas@kPdIU-WY<%|yr>nE?dU9dSCY z-yCr)uA7gnz%`o1=Rfp;>$a_5zQZwU;+)%Vn?7--qjc8PsS_)VTmCTPVT5r%-?$Gq z?&tl$c*y^O!$0fRDKjhXWFgm0ymid9iL<9T#?HKX=Bzsm*$4Ox|6dr>4hO2*`)CUq z5T-}O&8$z#xJP$3UDDA)Jv1V-dPX<4#QaOP@YYY^AF;o`+39_Cr}w{gdjCVG_Xj$? z&yRnP^6X_3k8Jfud6t|VkmwZ%U~7B!ch#&4_tfbX6;mcV@Lgrx+*jZ1xOC!V_w0$c zPP}DG#gtobb6hpcecP-Vb1J6Kn#t!$vu55t<<^^~%$zjE;hQ;e(xf@JPOO*`OJel9 zd&;f1&brkOh3Fq;_@F2UV1K5z;4#D+?hy>YeY&#|0}%7q+nWVveA03Fe!>$WvA3)9 zvv20@6K71H?7n@5R$x@Sz8c~iwS_w z_QDH&GpAQfN4`6!cn7HxrN4L@Is_M;hIzJG&teZm<)vBN!mvTBev%y-hVTk~?F)U5 zy$uEH?#5;Yt>ytlv~?ivGMA}4%o*s1<_!GW{L#5pi$CgFhWYQRA#r888b_h zpvbWfW-tj?>8IFo*b+GZSC?s!DUckmgvH z20>kt6n~+_iw4in(H?;Qn>bsgRsU9oqg%D=4k)LVW(7Tp#^k;KC3$0tP*rTyde&iiZPjKo825-FmF}Gqk^DTl#T5^yBN4ehd~O zHtWh%dQZin>UTd8p6w9*ZVH~e(lbgVZ6!ts#zA|(iqoJ1KcB_7=IvCIbgiUW$95ws zI!)L`DvHjizNVgYM_=)fNIR4FncYv@dJHK9c2esp<^$?WqCF&47fiAO8I3*`_+JKf z;TDh+RECY2j#s$oZKLxvoUX8+io?3JOoVPo8?ipq@lg7Ocz%b9LrePUc>G<)vAF&@ zGaJ`knIJ{`pHQ)~r-xe%XfP((htl#LWLmy`=&?{t!)SuCerrv8QqAM5iQeSpYt`Hr zW7eV7oQAie>&^9ebT<0KXMyW!)!ZuK3kS&{)r`#BDA5Abe^bhIsB1~QoebLQw@x2hiM$Wq#GmtN_MhVozO5aq-p@-I3Ud1CNUinWT^vK0)>gL?jx?I8) znab(|`pzWG6l>`4laD$V-=oic*Xg+a1czhpX?S?anT_jSQls(5GGg=5<}@(+p_6x< zyZ2*V^KH)rTi)^a09J3Sag*{>PlLdv`HA7wP2waUWp|RFXORv>mzv1NjJBZEr$451D$pS)3{44Qvp9Hs_qXNoR5FIG^`c8GE^4;ByOd z|C;Vt;>`U=x`XG5I2NXZ^wgh>cWnNID~8nEbNENl4vvg>VsjN`Pevo=U%sU)B@!Ow zBu;Ev^1ZAC%4SMU6_sGbKe9%=voHH9N`^!5Ws{+q;!v?YK?2i{{X}v;-Flxjo?ZBz zdA@%)>7py)4&dN*G43biV3;q-{b#!4QD^STbS#6zdu?p&i2-W-Wkwao1DBY@GsOJ5 zBB<8T>wb>)aCU87s|f-d&fvg9-foMJ&{=Y=)^k7+kOPEhSL|S^VM%l_f^$7q4XSi`=$QSn*0q|4%NIHbcPd{ z`)6a3Vn#iDnocdd|8ZDp2|2rF&L=p>SI0qSD6D}k)t$|{^G#ntT?Lj#Vm&0*7Q#){ z-=ij6XtQ*^8ZLBmR&*aaUA40~G%dq7X=5^mKKu|EI{1af&$XKEsHXLK={=5*F=?KR zrw{9kAw32$XTw`Q9&CI{?h+8Wv(({uf}{Oh+Ua<&On2e>_jJTxHs{CFCykjsWBSY~ zUD%cvy8TmbyUkrOZQ@LK#T~QUlP6Y8bkCkOeP+dN?%QThnKXUs^eK}eO$_{rX+iUL zOaoTfP^emt45JxZH8%q*h?t8z8KAO-3*9;vcN)%>&==HMYaTuu%2D_xS5dgalY#lK z9~tPUEnbHhJ6}kSRrVn*MLAuWp{1c&E~If60r$9!AXe9zhf-IUCNJv3HiDZ9i?Hp0 z=6KE5ZlGlNGSfPLYzSXVvTSzwFA)TD)`!ywEIGt7x@;56@P$UXe34OkIt=1M)}cy? z8R$?VXLThdnFocq!+{LxaZ~?TQ!PgfaooA4x)4Jh3VJ4YN#Uo(>59{zy}-I zU0%X3TM^LzU$H{v_c2FX;11>aB0nD?fS_*RGutB0S3NY0!?>ncjxTWhBMW#5fq`+k zku9tgG%fZ_i=Gc-(vYXXGx1sZ!$b1mv=DcS_h{mP3fCjIVPZ*bnJmteMeLt29qRzJ zs++x%ZQ@aJ+0eTc9!Sv1d0A$`Pr~Sp^_MEN|1d6mUxi+o;qemd*$2pgG2DhRM4%M@ zF;)r-P0&>aRKku8SH>`0%CI%aI2=K8@#wRl*bCUr!NvV}p8zDu4tfHp>F!lhT&5JK zde0y7U_C$CezvlXb8vv|-3FGjdrUX@Z~-L10c7TYwE;!8U;ads-lv;g)K{ z05IBCkjE;Bv+rhKprHPFW;fjB(OG+}8`=Rp0;R~G!F6E5W*@SRSlW-$49qsW$As+@ z6xO0(!~S|HC`U5HV8a0~G1zVbBeB7jA+W92!-`v>utq?P&0$g`KQ@XjGYq;4MG!z2-OZL`j?*utCfV0NC|Bu?@|d;8$p}Uh=$1k}+DM!-J6rbhxpg!ZSjPjLA`u8Vy|h4CcIq z^%jS3QHowFBTy8*r62`;(%1}vDAK>l2RVqnFpamJr1UBD6G$K%v(k0gKC=Q*^>?&d zYnSFwK6JHEuQYU%E9#DcG{*!fxt35;^QCt0BcO?Rkj4r`C(yp`2A9d8qJpKc2H(Q3rtP1&TF84UUJ$K(Rd7 z3Ehlm_wWF}#>DWeCn(>HIp{-$r)T)JRCFTvGotr>-TU#YhuDjU@4LhQ_prpGxA^rm zAo};o19@1&`G~UGVp(p}Ksh_;XGSo*wlNG@y8Rde=YQ%D>7l6Z@wt{DE$D zIPi3fKdZj5;OSBSKt=mb;W<7APmk~iI$JzEJ?D?)KV8|ga0e7dZ~nY@{X;b~nF`fI z{?j!)Hx)(~?X}?PQU6fIjf1Cm{nIr*gFn~rvEb*rIF z!ZN_HL%$7uME|U#qc}7he#kd@hTlRc@119t=3pMAT4H2%1ed(lOos2I2u3r|2_7{t zrJl_?nSM{JK2CEc)R)WpWCB!8PH8m-pt_<%aEVqEJcq4)JWeHfeT?DSNon37P}Sko zr~JCuP&qB3GU?1pKo#puFKFh_I@4^Qst@B=i-MC^$(UG`c~FZFt;*uK{^V3}LVYrR zjIsLj1Zcg7-=ApTl4SKsmomoIKIpRFM*AL5R-d$wF|qbR3;b5v_f)d_q9TYXUD4x>H`KkHJ~#~53EP>T+uK8wFJCaX`zk1?_FgVyt{j9*i-`eghV zV{4xeipv8 zrL2!JR(*XSH4mpgt3TV5)hGDEm{@;PguSK(pzFmh^pVgl{w=SVR z89&BY{kd=F;q<3Wlb919bawhD;Ye0G`SFq5o#;o$72zS<>iv;nlTpW4iceis& z0VhD2=ZA4Z!JG}@B*PuUbjb2T_!i;WCgNFsV-_rNaiJ`=Se1$m{$Kgw)OW*GD$^lf zm?`0}1%TlScRLGk#|5*1jBRwWzRE~=fYr1IU^HCEn6{B42jQw!U#hX3iF6pN`c0QH z%h|aZ*~9bns@5!j!CtNUlq|;2!p3QJKE(t8 z-V2Y;lc_AuQ=sft6Ial_ZvE2T+EtC>{8i<}rry@bq@aw7*+b$SUnBK$VvDpfEE4Dd z8e*E&Ya77PS^A`v=GpU{cN(Fu$ymXRHcF9R(^YXYH&*md(5)jn2Un|oQb*@Z{>UUu z!e9h(RWlcOlfxsB(mXT_=**cKU5Nkt~XR!ASf-P@hDaNvMds>nl4P5 z6GQ&c-r@qx?rHaifDVfG(zL}-NUcE(APMjr5TGD;WQY*qRGg0k9Oyhg0CxZi#86ob)1bPLb9sr6pMvAE$b-kW?4sJ^pW@Ja4y7% z8cPni_k0}NU@f@Azy<)A4ct0<3>CP*Jz20913O9tsqF=KdEzkr5#92Y4}0goo`}XK z^-1)=f7ILgh|>U?-QVB6|K{-hCEfPdk6?He8|$_r>a6_E`i(jl;t;GCQ(oB0=W_AH z@>_vL-$MCddU=V3zj~;J!_Q*rnIn?I{i{POn(iQWL`*&X54bO)`$Z%c10fObjf?++ z@psze-Er|(!km?zj)GszPk>|Phv2V>UJFV$;tl#Y7Iqt~3)8k*^_6fmL@$t;Gjn}5 z&b^(T*sTlD_Fj9il)o%gf_2|bJWqFS=W;8?^uEkm9g4whW8t?}^T&740`9l5N# zTJfiC#zMm12p5eI!bPn5!4GW!>u`-d)Ld{y zO(0CU7$2rbZiZSx-Gi#{0Yv+;wjP^(S9ASMyp&RfL~f=!Q3iDaL;>k+*A^rNV*7hp zCbR>T`8m^3ou;MGhV)P?Z4H+1t7R~~T2^8y2FOy5vsD8vP&RnRDim0@&Py$5GFRnH zI6(2AM24ciLbC?wD>NNEUP2KciYnF8lQ)c(1e;jk8)jD380a8FBr}_evzy~%xv~c3 zAe>EoS1JLlIHP{Tdq|HZ9cFp~gd>m~5HIr|Fab%@@2Dlmf}_kc!YtS9a?z^%o)Ihu zNA40NmWHvCbtn8@&~`R&hh!uj>%bX73+f$Anh+yBgp25+25k6}slC^&P8whVXKS-7N&aK4iYQI2rF|2kTG9u1r7TurP|k8j0H5hcJF@hB}?u5UpTF} zz-Dw(wGZnRQt5re4ZSZ3&h|?0n{4WRErk7JbMOkS{udJqr`S{Pi>3oyMaLaY(aSg5 z_)YBWP#>lgvPcq^bc+7CrU`>Cwp``zR-*W_w7)80V76}YJSyUG_`hGfzbuA0`d z-ThKoA^(N(8hr}TNyr|#?vU$Sa&4CD%W`dy>q~NNG)@sxJ1T5gX`UmZ7Bc%o9UV

4S0In4X1ebw(zxi!yST-H`r5#xZXM(|2cN;JP>C9E3lbnfuop(zj&>@4q3v@raXg zjUF))*C&qT^SUF?#&w@O|32&A@Vq6a{aSh|JtA7AIWp8T)&p?o#xUao89+AQIVj%N6hqnT!EP2wd66RJ}>vN^7QsR z=KcE#%)9mkhBu#(yRkfd;fV}ib0WjvK9S*DPRxC+JpG}Q82;8t43D0~@Xt=l{U=}; z!0@dD7`|@+!{?ox`**-_GQ+<*nc<;R7=GU=xogYQ8&6^Qf`JVG%|M1fGB9@~ARNf> z2i**R!p-of-MLSWOW)>Z_#aPY`17YSy#CbOrvd+|4FCIS3}1U1!<$db{lmEQg{L!o z&FKt(`*enHIX!pDxb%lS41deR@TiC3pLud09GCw184TZg2E+HA!SH!!=H53h{kbz4 z{?(ZbuRN;|A)lO;iEGq;7nZW1{b2_$Ii~g z^{KNjLG8a9l8Nh*A%%dj=A2AiYtOj^t=M}`Ca#s|7NVt}oSTVj+qs44jg3Pyacvn| zh#qSgmWgZAuuIUZ&*W#~T9;plo`3ATOkAHjuMng2>wn9{b;-XKVgzf3XX08r{1S}v z-rF>a15@^1!pp(;8oB} zhwJNw19APb@C;o4SadY5^+j%6cNPu7^|4F+xPEcz@wnDrMx1}{GRD4p8Q}>RpMqUW z#bk9GigOQ)Pv2Th7Wk_Yvbq;a5V@~}kj=Y1cONj|azggi<;)ox#qj$^<=%td8O3s+ z&>8Zyo*M?g)0y&*KBj!icP>JzuE@l-_KI_n{-Y~0ac#TeY_zuS%1m4vuRIs!|JI+0 z>*IdLHu{-IH}W^;Ma;F1gABt{S~66W1@U%3%1_8F>EF)r4XB)$Fys zSF_i`qtC_lpQAZ)8%Gbqb^bLc;=1%2_RbsE=(sMqmSg!hxvszVR6KunEz{gPhG||J z!`O{u7`}fD`~AT(j>H>f?CV`+Z0Q4Inf}?aXW_baENglAx>8(sUdMi4cs={)sq5MA zZ(PqlX}f+1I{3N309@PTS~)Jeew?Fe9L$_w2Q%*-pZ-Yj*!P0zuLUVwmXFU|GQrU} zKIg#+j<3f19h`ysnNt3EaBFYYmGpitj>6Rxxu)vmk38#{4IoTcsVQ8$O52KWZl*4& z_1P|CALuGJI>*qRQh^yQLxOL&Lzd58L52deq3wH18=(Pu`_f@bj zp^^iy1n&$(=RK2PqgTK#{vN;}Q^FsiDdP8f>*VB)&?`k{MWHuv!sWajkCT0bUwj;? z`0>1lf?> z>m^y8(UU1xK>z$oZfa!SlIoomrxaBkz@>Rcdp`)HY3LT3Msxd%*7Uxb1tsSJeBh5DjmW6?!DUGCnJCf_yN~4e7F_g zUo}hV?}1AP1B3x6WOD59EW^&!STr^%`H`d%8+I3au9VqeaXkUv=pD92EcLNK`xFGsI2yxRLca$tW;BY<#a6F#rg8>9Mei zWCw|(5fOxueqCZR9Js(VeBrSYfxs&T4g74tD?s0d0vg#0{NNmxau-TUe7d+64_Fks z*n2s%mM@Zmb?nHWU6S7+d+`TtBEl^}I@-?x8QyA73*J%EBKaz6>o{wC)xlt4^(jeT zXcyqR3+p+Yn~-=UJg9gJV3RBywYT@HyvuW?Q>zJG1kyo;MOACC!+&K~v9rCn0K|iR zv?YQfb#!XGSQx%;wMN_vD8?(>=_}Ou-_EZXd_*5YqNEcTFdVzV> zYFMrep>I;g8wFq&9D5W^LU4fTSK~4hnJk20FEVVkvIf_T5vp5(!&)%h)lyB&i{D{yls=P>s$?u?7dS9wNHYdQ4JA?GH&bLHiX;eTsChHGQwXF7Elji10!XM80>oG!V&Hp)XRhkW3Qs^G`*4Nq+!1a^c0alTjh>c>?3c1K zB0521VF}1?pm?1^UN3M}K0|7L;Vl5{0;&Q0pyx(3#B6s!ZK_73AS3ypcMqCN4ur)8 zs59eiv)djJt}i}a;iu7z^N@Jt}N zPxj2lHRzdZ!#nb8Yjk5cH;qKF>xZDANjvg)nuOx3|0LZv=)G1@DukOn;`IRY5`h$B&cnSgo*Taj$=cc5rO!4E*o zio+TFc>M02QlnedD_4LEG?**n$B_c*q#plQFYe{||0gmS<4?uHHuCs3Wo+ctsG|#k zA_0yy#@YN$XhgrI8f$!mHQ0`LYph>WV+}!WjP=_XYatV~)6}kPV~rr&SPwAA`aCtV zmOh}(cPEauaB&y)w7^!3HQ+=~VywSVV+}RSHr8AZg^=i`xUqg~SP#bf)FK&c!B})A zC_Rzb@deQA;T&&j@lf65S}0eHu*@W5^#I->3@rK3?RZ}THMm#w-dE|(7(RpE`AJxF z)a@f~qjh{l-3t~~z6JMH_U9(=eDu`8ucS2x;}2~ALeO8$rX>gOvM9o{u`)B zsLE74HYXeXZ%~2g92|Y6#|K48$I48M{x+$fqd$X`E)*&DTT({P{kw}j7p53_96*qS z&+jR)=$vqvBaT7A`ok1-jy1R>VrlcrV{L?unH$5CeMSnK>67!EuP#Lzd{ z@iF7d>T}DuS_Gtqyh);Oeuyuj8FFJd&Q7-Ln-)G1pOxsfEUMK&xJH%Wnzgutjga+q zCqB?yKqZA>t4(XdFnZci6tKpV|r#W7MLVgG)izP z*Wv?Ef|5#}1R8b}L1^qJyA@p>hdKkAil#0~hYvr-Irv1wV9)WEcO8&nU-Ol@OlGI{eU zDiCdhLk=#g>XWNik(^;#fE8Hs#-DP$@ip=sC_=p$?+=Gs1#G z%5gT#&)7J>s>T`CvoX$xrc<7;Mis?i06{0({3P;51h$Lh6nG!WpxZ*8$K*}CUO}ag zdPTgvISxhvr2uscNnrO{mSTK*;CciPCl6?(D)9UB1tG-LV7c+W#U;dd{DB_cMQvhp zi2f=54~U^SVU@kq@JtbI0S@p$G|>Q`T1yJH+-Yl2f`3Spq=aE&lptQ+dx$|1c!cdE!{L6CZIXcTVY9C@Dci}%_8u6b{rhM;mtu&6! zJ$kC3f6R4H?gR(E>9QdHr*z#fGCcOKYVqi!hv0}Jrj=8js6*cIZUn-$QjVW%Jg~QX zGaiKNBch#zgFAHAY??k3cHjl0G2tWJ;Sel`re02!7_?Hp3S$Z<0qG_PuVJ7Onbb)M zcvvJpQlxrcXb=hmQfx-*{ibG!QWbeELGSZVxgwuaFGvo$YQzijz*K^&N>W>H(BFi2 zKx`WjfJqIx7Rr@L9u~K`<-ZqNilapo2vEgkZ+i1VYqL>@a_k}widP^5?Kf%g64*Kj zRv!5Tozm3b&}b5QYam{qREn*lLtwO0DLo@lU!qF+8&4{g^6yYK;~0$P#Kai);2~x*=nKWMDf&pE3;mh2HQeH`-V;%rv z$LW~8p~WAbnTi(OmVX!=D9IMW!}YJ1#L?sPuxN;DhBz|u?farf_{`9|-v&LBmV_SR ze!Eok4|=KtAb-rLk%+7ru|1$f!5Obfs}O=qkez>V@^Hc)gA5hXp%AlwV)Xc|%)43i zDD!El>9Gk_pcs=L4WR4kGpq-97TOcyguhrQauYIeE)AI!9qOD^12R)Ma`y|(ygF5? zL7%DYy)rmd#NNvpCKh$YG3W(LR%#2%z?vZmlh}Kw0W_ptq!fXKIR*eq=BRwbqVVxO zu*g#hxG=n6H>S&ocd^&Wt-JIc8h!_m>hGK&;VSqZ`>k)X4_M6{xH%fkH@ z=<*tH>R!?%cdhlDE@5RFLeoZ)vuPr?gUOWe>21B*PXwAhFoC2KX1^rM>Dd8M- z#4F@TiyL}$fHN1U6pd0+kNRu;v?VI#%&!uHOGRel)l|0-UMR5u-!T1b{!FY#viY-7 zB}9awq%INUg#4I>>P?SldA)eL_na<>t3(@s%06wC*g*lyq*Hv%R&nT!cf^#sk*g0;8OD~VSelq0j8m`^DK`HDIK z4zP`nHm^9DLTr}PW6pkfm6rlS5!^u>kGA1iwHSFOR)Z!?MNvHe zqXza`B8^BYk;d5lDb~CIkW0y^43wQ`1-~gg7-djddg(;cn&!1`Ozxzj*se7T(Y;V=`x; zMV(^CAdMC@MDh5^!lqXtW`#jANTnu}@V*Yz3DJ_&e+6qR&KjpkM+ZcfK9@>O%wa-f@pC^c)m%a-}Nhcln_<4dUZW(%b zRg~u`>3k)$gzO=m<}0_M|F$69T=AA-QOZ(JB}%r*cheC??LzT0HGCAzC3N&Y55h_C zEg6Pvp~0RWN9L6Cl}YW_m?T`V?ATO%=|WU(@FjfGzQ^;GT=xl7vgRt$H7U^w0wLHY zR01?o$kouvTx~;f@oVCgYD_$dQ;ip*7epWE!l%nL^yyvzy)-#H%2O^m492&+K66T( z|L9kJq-(!-#XuHYeMgD`oG}h@izQJEQYr<9YpJUF73lhy8|l6O2-aHj`+yGx+6ZOA@N;^&sZcUzVFa3ji*@c4> zESGnTM+fwQIJ8ysgBTANN@W(_W+1^zqezNbX|iU(Hi3K*aI2)cL#sB{E81){Yny>flmRMX$}DTr z?#Vzl0F`_)d21Z^y(?WhWV7Lw2+C-oAk#EPF};~h!}>JwB$%^lW8LT^7+vM~#k>+S zo5n>6ss|@vG>3A`T9m(vA12oLg(+$}qIJ;&(TIjFGrUnS)*A)O%D2{F zWy3QtD^ShF3iAS;mhdlOF#b^12Pi{Uw5aAjY|NR__>ITrrG^zX0n>Q9F%f_+cFVO; zuE1vaE|l+(>!SsK#eeTwWKbUL@rvs5{l3O0sd*wgn0Z?Enpp#N9gJn>viIL9?4yVyTO#%uz0Npy$E8Fu@>k#JBF4h zvN8QRfi+2|v1PVA<+^V4aY`P%3Dt6kinz5uHavl>-sA ze|WFvdT2R@m&CYN8wZ3dhZZ47T>`wLiEExT8-Rdwaj{1^XPxUn7+jrEO!O?@936pe zjh#!bw3UqXu2Lp7xU|gYn$LC7FK|{}=j^r2zE>+3+BE=#?-6TFPz;DvEno#4a3Ctc znhn6XYEl8VA$lqf;^|y+F90jW>ClIfJr}1hcg`;DinT|z&)%*x)Cj~n+-w*2HdyT% zhI5EJm%Px{;pB$~(yAV#AJAk}m|%8|hGRAgl!6-yCX!;qV&BA3@i$8AcHy>m8`EaS5ee)F)hm%V;i+0SV{ ztn7PUJ*@0&)*n{(1?v(pMOMuvV5d-#g&4q4;LSB_yFw7~J`C*xYZ59b8FARCC==g; zNR23q=o%10AQ~igGuj;cboL-5ItY>Cw?PJ_k;+aPt2_l9mklEvR?=XRKpMw zosLMeJg8t&>NKN9=g4&*v2l~}iXJmj>ku|>j*NyVGzSXIG^ei-Qly8-!G<36qz&9)v zxsgb_XBZC2M27f|;cOH;=2%2hpOeZ}zo7I0sy6yXL2AK{2CH@{xPS7#lzmrRzhJHp zH5W$9RHPa|fmeo&1qTk;fR7c9L?{=7`83#j0?brD2=o1jwDq@OhQg8n)b|u{t5hD2 zXAAbyZB5eOlrJ35Rfx2eui&pR`g@6toa%2i4P^}BnLDJ&S~EY+IT(!;sq-_|%D>?4 z&iT8opSFsXzZSicP`|6o`Wb8GzX%i^pTFDs>87&sFG9~Hh%|1_QcQrGZH zL1F#n_<^ZfV6|SbdJc9KdK>i+)}iD!>QyZV5niuHa#rXC?G+hd1ZjHxzI2qcc8{(N zhSZ%<&jb4#IQ9OJ03&+6sr%|7d>)}N3lVWA&Bs37hOTj#DR|<@jR<&w=>?s(F(cdp zY^KcaGuk?Dy1J3=0{XLJvqpdDCVXyRw}Up_+QT0}BG>rc%85k4vs{ewL}zNtRf z35UmARlz;2NKk_W_I4zea}rs{1go5s_1(~dbmw#vRmBEdPgxGwf zN0v#w;X?42!O*~z0g3LzRL+n(-18JjCMPt~>*1f`TP&Al;A1SxQ%!dvX6<(9k&z96 z4veC~k4GF@50;3pZM0q`_>C&@-Dac6YJ<7@`LP_%X}fapF?nuh&yn+Z0KDSAjPdB< z%lO%!?3@w4s@+*dRXd&k@iZ6N^e;Xe8(jR6rP2_F`zAHW5k7$4<&VtGYQ3U1X}vh) z%BXiFzcqq-M<&!e(yDhP>Rp3+8=S=#q1L;WnF7I&EjMmUDl9-cTUFC&jOdTC4Z=8BEOHc) zLl0?sXcTH#Bqw@B-+|W;l5A!}^d#%)C_drbp;gg=z#*G+95uo}16|cE*Fw2^qn85J zRQgsh^!W79Wudt;J?sy;dZWi6eSE4UOK_t*@KL|`R39Th##^o|3kF1VbwaA0h=I-^ zSEhnR7hRH&Dv4h|dM8pzAM(gHQC1G^Au%hD)@JV~mS+Wn^H|T_J+P>6^{=DD`DmX! zs1>(nIvf!vE-&-)y7K|&uOD_gewhwl_&@0tkK%dX5t+O#$f|MjzOIkFZs?O6{jJmS ztG;eY(--MO{Uqko{&HJ&)L6#6eYCu7IXd?_ygjN(@{kM3f8%-}jVWF_=3?INJN5|P zevyNy|IC>uQGYs4qP{s!qP{#HQS!J#_S24MUG=9+=-ShBUqw^G9)ayMezbPp8S|x<2hWnCqGw4_A9@kB z$E#}T7%WlEXG_$pLlD(6q%Vto?p!JMk)d*Xe<*r+{xIo`-{h;9{M@fl;YayW;Vb7M z>nG=3#jH=9FA46upp0*ijgYrLkH~!s$@h+s3FOB@l zFO96e3Q-SVB}MJJCL~2I7$Zf!KSqlBbWH9dRQ;ziDeAtlNdL&##cG(Zm!j?qNKwBi zN7R3oOQ!iZR7z0~1f{5*K?(gLn7bTMJu_a4`rQPi|LX*)dj5~+N%{vT9ZMLuPm=U| zCgncE^phq1Z>Avq6H|UERlj_bRQN|V%xytY z|Cl93Et#FgYMz^Y1#iFj$pySM|3uy%y;a^mRJSK?lfbG9xxJ@uf1h(AGqles#PMcSr;8D(^waV9FvxS`A_4lY1ggBv1_BPb}iAWd|{9UYPHcTUy4UFq%{;2Yof zd*A=_zt7Y6*8Sa6r>ag>ojP@H-Rc9290_#)NYH^#93H;Q!8uxWmm_xr(C6=V#MR-t z=WfRkx-MVl=t|etWsZEh{^7Uce*JG9@pS+2J(Nb>y&~4H?{#z`^oe^Nr_lA)dmX*# z`tN%kXVMjV>T!qWnXFwDH(BfNS?bVA;&9@8KJN51yR_ZTIGhiXQx}c&mD*J zpWL0kbZf7=<8Zz^&a*X6+YlFr^T%$;O449{bc1a0d%&7p+!kbgio4tzv2NFJv|!pi=ZNv# zrmr)uS+eo#45R)ajHrVyMWuumPY zrZ-KMU^n_#z8Nh($3eQj4O2LEiau?Vo>JiP2FQlI7XQP??|yti>0}=TBXGFK$l0Jb ze1v?8dCr$Qy$79HoQ%`NG@ME^ahjTo)2w1Wr3-$fVTu(;}0 zAqe}Sp04EoC!6a_+>5LE!YHL)ydzDnYmv|CYQ$}$^KF~>f&w<42UCjVaQIkfo|5Bl z%F#TE0z=b_@KHrWAKZ8Yx1tXJZP2~W_m{zlZYQ#w*Yx_&z!~eojX*tR)+|9|OHIMy zV;+6k#)h4>m-xiPBB1@e*d^BR`_f?!x=kZ{Xu7gBE>_=o!s}IaZT&5RtIeEw4~WOkbDE3E)35 zWCSCSm~Q%aEurn!??`2#-75Z;XI%!z5+<70-zPny_fSWJ71egO8R$d->?GZmW(1#a zMr6(f!qhxO*lfMnDww!4X#QIUluhp>3=TbdYFciuf5&V49WS6(?suhz;%;6o1VgqHM2ImeM}D_^&ljQTdOffQBDO&l_86^O4_lbYysqT55*n;jde3{CU9%m{uM%g1$G! zI$k4?>~kD4{P^3h`WAHNZMC0OiCeYO@*nkb+6*Ay?7k|h&B0WRBmD!<6nadzfr zB3ZqtCT>R}qGXObJLhzKmTq+4@6@LDfVSw&ye>88L*Z&o3 z<%v)s&cF?BG|9jy$W*B*BdaCg3|x_zv!TYFbEx)0TKJcphhCHWWu88h!_(4-=3#A9 ze$F<%;X@}pSa0eLdvNt)J)H;LKX@%10st2e$JJMUX@1UkdhllmXB}&NF>ehhHQoDN zLDq|yu)Eizm1%)7ZvV?UFD*DF>z&4(dHy5${?~Nx+j%*y`l7*zM~jATpoBtt@J3wy zuR?1yRw4wAg5bh4K!jk5Q4|1>+(NvPz~8gQ1fr3|8>p$ z_HEs}vG;ra@2QP``?miGw@P5RPh??x{aa%6Z8Bd-6V`W z|7^G~@c(o}-^3HNigD(Dq4`H98|6?%2G}Ii|JP**-#XGw?)vDoU>Dg;W!L{uZ=bZ*bs_rD(5)P6ZUyHie^9{e|Q=PP%oV{I)m42gO1JvAh|_E*>M$ zZHE!aqoGxAV3$?^&Fv=qspCA4fd&S@-(h&Bs%M(biJDv6#b_?GXQ7~PV8Jq)239O^ zQ(>nMnhWlKxq+&j8VIbK+#?2B3Eq6nz5sl>;&+wX2!IP(%O+|qZ|ME@$kwtPt)&fr z{tV?w-o*m^iaenqkS7Tii}TtRb8)0%Zu^-T0BbQM_oV=h#6wW@XsvC@!yJy$`Q@Tn z6Ttv&4UWnHUDge%YwS6iww6@;7Uven+nu$0-HD%c)^@njEZ>ehP1Bx;_t1Sj#_CXf z_pdu^$Kny=cb;=VyVnzkb5ke8UfwDBgU;HoJL5~4^_@KkF77fE1*WX$T}k$P`|%<_ z;G`jg#)})=QRBsM4+f0bu#*UL3G@gX4At4?#9undIx1ju;#5M~wAot=c+Nr#WDJM7p;;$Nx_Z7+<3kE!Y)$4v>E6>{B7;B;63NT>2f`{sWu^acHteqaz<7Bm&Czc*JaUXFX-pGBDU^&69Eu;_=D z(iOj}JZLRW*;r_C_Nz5$HvRTkjini(?QJcQgT_F}l!S|?o7(RDe>ZAetZC!ZG;Je| z8ZSAwIreqdn%#+Cbk^RXQDavehKg139^CJwQKK!s`@cJDw_PBu9yL%8@-W8_FU<$@#`((k^L%3}W*IbokOK8Yjvy1;&p6J{3yj3@ zF^1hOhQAak>e^{y@A<0*LYuGi(7H^mG{l3IYKkSG3FYn9nLkj=!^c0 zcx1+h(BX&=`Lx7b;~+xxUHL+|%e4HQDHt@~1cX5&l?IJBfnv-^RmKd1Bto+cyb2OS z22C~c{H7EdxnB${Mo&?JLQPl}#xPBNYZfbpUS zPcqVK&ZFdMl5r(ZGHk{R&Hxq6fT72}6HGR=oVEouzVeq1Y_XSGRQ?ZNfbFaz{mEC0 z0)K8s(J&~uypGrNz}y$?@g^E5`G349glAMBu`7lRNa2?AF}qJCzfk=KhyKjva5l|? zXOE1%WH+s&gTE~YHO?Lg6xcbnFa`Q2` zz^<3hsX$XR2^BR&HBGg&51vl0@k?1f&qpJzatm{QD9rgI)#v*HY^&?fWEBPSxaO!P zX|p=_VYB+G_D5D4+%BO%poX}Oo94DKO|OiZb@QIOMlLh8 z5E~P`oJ{a5;A;6BDbp96TODm4ZJ9gqs7HI=jh9_tx!nk^h$G<5I83Py#&vJ%r2QDz z6YuB}(n0)kLLAQjNzUT?WBYpZg`T*(EFK`w5^e{rSyU4=3 zK$4#`1Nw9?AXA@y1oXoH&*;+)C>b?nOP~H7z)z=7e`S=vaaphjHvM^1s#Bl-IG1%X{^udH#qgbU;ZQXYObAL-F*^z)$^0< zRa&qr^h2axog7QAP9WV?e!i(!_d~D#98g%VCgYCu>b}qw2o;sjfL{Gn_m|@4zd)~= z{+hg;&3a>3q(S<%Gpkpb=D5@KMb9E0=~ovqg?@G8D)g%pAq>cFSdI&SPhogB*gH<9 zEp9wywSJ5T(6X>~+Iu>%xG?PL$oqCrzHaPmZ?z`!VCnU@+Ssgco>RUaf$rhmm`Djh z0m8*m=q{keyRm)Zg>0-Qd&^%@JmRzr8dhYgX{<(g#CJ+PV0py10Z^P98IjJ7I^+eK zqrG38{Tr~4y#eF_?|+1;st12ZwB)!XlNB;73Iv-0!OUd)#TRrh!!33n{n*9%W0!t# zVCTHxxODu#-vOsD*iGu%IwJH2E{BDfc(LL5-0;5y+1!#jDwvpT`ETK$aOVfE!uE7n z#7*|BSN}QO81!Wn+qBzi_p&QuD|GKu)_gO*$bSn~AGWh(zkxC_30g;bC~@huj+d5> ztrsFNpm)NY8#OT63VW z8A76Q6V73BO(()NJuW@lRJOmcF=o#TWSP|kCF`aoitrqnA0CUTNYy)LUHId@{t2GY zeYR>grXTrOEF)Ir+cH^C*pFP^4gXDYIgHpfWW=^OH#%?PFT{#p*>rqZ{-ZP+yvx-a?jnA{;xt+_q&Gc=CagbGm{z~f zVchopv16Jx`$Bv|a)EK%`>3R2#yV?#&}|#{>4<4A5jxN|0R9KLAqp=$5=)KxWiRH6fCf0>T@D|MM@#CG}bUIHazYe!jy2ILNy5Lz>0xc^Z%hfl-&0y2d=JQ4)52Gr>4qRTTPJGA^x_WQh%soML2w%aFtp~(G#?; z%G47%KB2T|1=K}iWfk0Z;btn_D>O16#E&~Pmch|`g=l?ItMIJ^Uutf|_gb&?4i1$1 zLg7yyN!A*v=GrPfoDe^h>H~|bOa;d3BWzCzagnaPgZ}S|WW+4s(T9k9E-cdU`uE_a ze`+3DfG6}YzM?_Dwvw?^P*wq1^Gh+Jy5&MOrLcW`0q!WI9Mg`cY$YReY{0ZTO!_s-n4DcXllpgY{%GSHO| zM+v#RlQH#t6x5+kXS|=R-QL-FIz{`WGd$2sPq`UyT#`P-v!;~ukk9ZziIJ_uZ%weS zo+>Ew>QMFA=#U= zW6lA?|2;<1AB|w*o0L<-vCVL7H*(&pi6=ANkMpVK>eJfZzQDQk*V;Y3H1%Z*gvG(_ zL$0(mjp+*&L8HB4o``9fQNI-<@dUh7*iidP+w$=GQOLzZatVEa<|!Kv4Dy)kD^ux1 zku!g$Y1zHjy0nKJkyfQx6N#86RkKNj7>5xynYI13U9Ge|Xi6YNO5D1k zKe2$SbaNllyO_AyNV!r>uq_0IM=~&iYnqX7GYbse)@rGX&`qQ%gKOzuq?jgjKO#j6 zCbSS>UTXnr6!U6Nm>-X_=3+y9qb=4EVYw^w%4 z_7xWz!{t+Em?pWbHMBF)IYNJw(Nj@gv#LV3s0rMJ8!slJsY1M>^x)_9%hlNH79uVH zv+ag9BL-@pS_0QOM{L_-<{{LNt878DWVm3d46HrK*x>NlYK`*l zUv>nX4S$e);Q9W>RK5i1O=JGT;66MfGth@y@**G{G!VvEzbqG5+}}S`Tvue{s;s># z*p`LaO&n!IPbtIzUYLd-hV8;!{4iJ-mf|<7mCVFrTj4m7Yp=H!CTgvB)KNSfM(Z65 zMF=^*gSr6_8m8%Bj}Z&N*4HQJzA_^|vGyEbGol- zS<@RfU?kC>ncX$F?#DE};Y;{t5X#jXJ7L#zB>jg{Q1(NkP=R9ph2;vc zF0`el%8H_=rUCn0Y?#r@7g$NEuBh?Tn(o#Vsh#pP)g;#A(f>y^d~hZzLWaLR17X%{ zewY4CBWbpUBi!cG2hdIt7S&5}8|k%%X`IOU5;bz_6uFbnHujE>}Uka952We>2`<;R`wN`Gf2n;iV z9K>@@mxe&9_^MO!uPb;);W-HiP-GCLnFI(o()egSN?GwR>QL{u85Apsy6SYjAM;e% zP!vSX(EF_&AQGwA^t>4309oH(XwaJLYsl&xfY&* zSz{VL0HB_3eZho#GM4zuMasHJ^qNM>1h^6>BM_uy#1{(UtpTry_p`1sF3e+ZCaRTt z7`;|o-H$UzkuLGx{`RWr*<36cM$iMNY1ox z!xnD%5XH)DE_Cv0vTh(_Oij?#5nT1|=;xw)S@Do2%?j0{Tpri!H-t_YGT zD6Q9$wv|C&gOQ@pkRFB86r}-A5G{^Fr{v7c)ELNyKFLkypaCsM3O8>d)_Nh=D@ayw z^kI{R(jq_o0WQi%eV(vs{J)}WsQ`3~f0{z+xm<7r;yhBrv_Yz*lIu$y?K#)XCguCdv)=Xzi~yk>}vU85RSW1eDM z!c{nXAo)<*P8H(>n1bRZy@56nz^Ad8=^g@OOm;g<`r19jg*jnN!Uqv>$ca(V-xHan zrc1f-`MJtC`5|h9!IyG@MrtTV!0mK!ivvK7$y>h_3ktC`(9asy=#BC4h$}zmu)c)e z0~BmsW=b|F5Ttv}+?o3_FJAgZhv8(VHEr1?3|I=%kw+&EzS3#q})F)A?haK8VG zb&!^r?D3S}=l`6YAn+qNh*8eATc4LqMDxO1K&0xU9n0IzXeC^Vq33W>&Q~?~n|qAY z==i7xj)~&nqf>f@ak{m!6kL$<$tnq%C}ctmpn~`!tSXVgb`V4BHtWYuV3Ht*H+>mbU ziL3>08lV

(k9ma0dP17)d8bcaj*qnpsW_bdPat?~{e$DW2@Cp4`bFR;i|4cIdpMm~{KMTqNxxg1>mvCFG z4Z%jn8x<_&xP*0YO>dLl7r39q=M4-n{QbT4n>d=!&!8{oz1sKal}CSkb%%~Zg9h9J zG%!FQ6pgck2G36d;)&Fie!K(3D^J5ErXJXDAapa_;NDftv^ct;d9hx5E*If-X*e-8nZyW_2~-M>UO$${0Bac6n=JIz zJbe@!5b%78b|k=j%6jF4`P41)lYT0tIgbK2G4Yg>2l*O_cM#AU&H|}XUX0HmX&uTi zOc&uhmphJN}NO~#ytUI>>w9OL)`p8k&WOtS4TxiOot zIwjI*yR2{U4Esyd;%?T_ELvsq2Of;$Ik|gQA3?96SEqQnd=1we#}_4!5!aMRZZbt0 ziD}d|+!jtS7FmL1?8ylpG6P2XHSn@@f%$-Utb<5AV1|!>w(7lC(|Cwx#nTM4K03-( z8aPVgWOnOefTaEknCC?h=?>x}u#_M*^Q!JZUq{Ez1)({hqH`k-Owr^Va<+~vE?1)K1EssOi@&8%a6wF=mgU8+9mMnE3f<_ z=5&jqn(S!kk~+j!Udl}x>y!71d1tEm_~qD1Z_8g}58KjrFcCxOyp44y>lqS$$qAW6}f2Ypl@_X;R-7 z^Opz*sqlOG4TuoUV(nDWv6eD6yzk^3VvPb)Q}h*)NNe5jV;)HgU`aYgPJEmlhoOgZ zpg+m}yL`t1={$?@9pDz5Hi}uLl!MS*Vx(tT2*WbqV56-JJqF#0ih+X5=QQ6nW8ce9 zU}8@ddQoZtAEX-K$!n261WyU}5Fu{}&qGDg1ItL7us(O;QhaPRS+mDhhgsKePOHaO zxOcpU*}JS{d zY|NgZ4wBXYmKNhVOyW#RHMH8a>&R*%LH{$fkoKeOYucZzGON<8_8)HjP?`Az^DvaR zjxJJPW>8Som)t{MhIKh*Y1p#@|I7(^RmfFvA(_)$o|+rO%MAA51xDmD0~jZ4KZo;g zt~ZcQji_Y@@YKK{V*i8T*nsV~ytGG(bmpv`h`wh8=3rJ@h;6vAO0exT%iiaC3)%2& zwP3yX;bXe+e)om8qL|o9mewtvW6%~-Fkw5P)r#eK{9@94jp*~QAZlDl#f9F7W>E6q z`!&-aqj(R(&KwU6c#0+kgbNM%q06xAGS|;Z${YKL6a}Uy`!1a7sky-$9G`}{5@tsW z;BseK(_#+2;U2tBGUZ_Iheo@g)$coE<)f7q775bhb!;Ig7R@y%tEQ)ng)1lErZ;dF zIRK=nyNY$EQF4}Jf%UTCKNI(I{0$N2``G<~Ck=k~q{_U@1?>^TrcusA1a_TSjfSq_ z1=Er#(D5=`LNg77g9{T)Y&3GZ=qCXWX1Vn(Zd#9zPr>JW7Fmjm0IZ>kM2qRkEvDTR zj+-^VK;gW>J4VFPNfz2meU|IH?v@n1#2eXFZ=fai`1Y#dFR%`V;x*pzFGw}APY*U= z9b!L=(GD!WVUD2+JfE^O!0(aeUlilD(L&9=-7(t?TVTvRytWb`8XwO#Vp8 zpcrU8@IoF;I}hHRTQT$>zP0AU*px77audU3dSh=?@3U}aXjv_=tiCiJ6Sg~5EtVwm zsuMls5(HP%N*7v`hwzFt4wt7Pe19f~ug*kxWiE$r%td%@F^6w1MtF58hpS5wUNMWq z<+BjJwoWcfm#=a{7k@}a#kgRTdn7oHJ>7VILh~HUeqU@WyxfeFWNI^FPNb0%nPT5c zj7p+(`mqMn@9<-JUW_7QB%wx*8tntuEivP1a|~w1Y1RZnzhe(}Nr;+6$nmw6r=8Sv zLia*dVLLiBwOMGZ!c_M!v&>b+PN(N^`_Lme*x62Ryat{%-Wr+f2Ngzs>`)(W>bckz zC-m88*zf)1Ui8x^w)CQ(wk|+SJ-8UXTfXRjO<#Ny-Cc|=bQX_Bh&J9aH)}h*1~IU7 z;YG2gB~az|^UNk^`z_sR%aa$e8_tG&;ib;=x8(b`(ej5y%@8|%MY(t+qF*9>vq1x4 zKZi*Iqi~0X2^r!Y0FZ_BPa2mD$GiT12#6OnUHG+u-e5rRKi#|j@TLS}@tItcvAB63 zP26~t#;ytF>?rh=^P+>Iz;Bx&h~C@jgD=`+jg|le^HUswWn|6QAEI~t>i1qodH13~ z6}|6&-G_bHFjMoox?P%oiFn_iJ|;NOeBZwjTj3-R|AEXCxmj865g+zs|A^jHc;RMw zI+TEn2`T=nJGOIyw>4i3#I)Pdk|(GU2}S>ZQJ$7$bQ&> z{Zz?*kT0Hu89`3g&WP*p3svUq}h!*W_{2Em0y z_j!SMo|HC{s|$?JlH5jOEP!`8yz7}qvM=SXNH49>Jm}Tg2+aTB9X8gOuPlt-uhZY7 zph`EuVr0+7RqUH?q;8z=|Ce}SOp1jQgDap;Jh1!#qP_7`lt?7Wul^rih-{D=qSgfC zjyq2ohR9Z)22&ofo&UrF^8m8Id>t3Pe3GzO5dwfhvRxnKd^$(YX{!Y;Y5QidQpOx#n3Zj-!Y zG5tdtl@tO2;r%L48rH#+F=m8+V(5Vpz+5uQ?r?F@Is#%%GWkN^$g~a&Tid4S<2O&yC%~V4RSQNJ(%5jB zu?vknYy5s6=9-3#fQ z2gLHh0DEazl=W-LbL^%h#mKz*~_jG&py>fhAS1kCWi zXGZ6_2$Wt!&0fg|Zg;(L3hvOM_$l+!8^$seb3$kG3-tqyv>#;x>dZVB&RZz-##EOWI%yS_u$#~>x9LrHcp$;n5vBCRS`3s0>ztMYagyd0xfd@K zSRIfm_^)3H6#D!fGN@aQ3VmXZA<|3Pf{LMh^KyT^yD;8+tMBh@rd{Y^h|04x$&yqQ zRWocP$&||uEfmw=338(I1z|svMDazm9Ns8vn18P#X8y*5g6Cn$6Wwtaf*rE<1y^$9 zz-m&{KK~bBL-AW1kKjy)Iop@2kGY|8=HjtY9wb?j5`r&_lox8$vZY*O}y`Jw|f_lu%rY_{HZOr-D7x%xp$ zrNtYIYiPr~18D5;>vwF23yx4BpMGmezWN<&1S%I&UBjcRq60*)Y5I+zT1F{@BfsYb zFBX;9|C`E5^$t`mr^w<&3_sE36f27`st7?_0+r=TUMb6Kz6Ro&rSeO9E@$Xev`;x+ z8!&JE99yG-i)D&cd3=xyC=5dPcmh970yQSUWE#UzDDH{#H>oV zAo8%5Ms#qK;)jFBWwM9TY3*@G&q(8#f zX_M77WRZodH|zqH=}c(&!eg%b*Yt)a2s=i682ruDkzujAGlvKAGwG`!>7CIV{5FX) zbvV^YvB@l@32jaLdoY0@bBv7$fT%N*F_`&!1`W!DBGFKiN!Ik|AY&O)N%2{DoM%2peKX zSV>G|gsI7hu)EEk`)Y-F7QROo8CEk%tJ%!K*)kS={#lvAyfbaPJocNg%wk)3U{3!c z%|*;xN6kPIMEvhH`Xg?=v2QzjO4M{Yf3`yvV!rAL48+%^ z9mo`ZCR41jWyAwCaop=ZBHH1*FQNs;7W{vYX>F!$Hlfhs9Z_8ng{IY}TqeZ^s4`EX~wZVK7 zda7-m6?)nVJ!*xTt)|AHCrI`|My1OHk!2w$e8(VSI5tH zFek|~ge06vwNnTs{9BQhzFi$E>~u)cLfF$GEyD5U__ zwvL#EKwTY#iisv&LgNk-cePO^YoTAfa_rb{Eb|gQeJ}U-cQ>GKg*xFaG0o>tjx>tC z9RIvcdJ^}cv*AxHfS0-P+Lz2lqI%=y2+M^g!pEA=A8T>pymBYeavm;OH}D=z%fyrz z9!0!t!;3d8V8eEz<=9qK`G`96RbY4!d5^9)v!XKa`;ce z;ndsbO6952oJd%WtA^FMDz1iA8a3RilwHNuu*ydbi^@HkuzNghR$3`$o)Oe_|07HnI1;dTFJ-dH6Tl=7A>aN+^Q@s*!UUe?vYtFs&@NBIqJ#`&&k)D8aYkC6kf2F76{Kxa$ zI6rtEr2p&l6A^sie1cy;pClB#;O97Rx`5aOGU(|;84XTc4qQk#OZuFR^UHnWo}I0| z)n~#>v$cO-6!*=1?Ozwgp$Z=FOXu}{6LG$yUn$O?^`lt9OsbT>XAZ{s&MZ3b%__wC zx&9Om4xsbC0mE^AVqiC%xAXbHKo7zn4T?i~KONNTzB$^V!6c5`hCuT+4Y>rt2eNZ; z-kaU)iFw*fIa3gBx`eW@_>$9pJxAMh$=L{hHM9(DKK{kUI6r>rCaTsihmi!nrN3Ya z=28al&!zG{mk>NdXzIQ|~oVSdi@JAykZgc)1 zq#I*hx005T;m+=1>ZWyqeyPdV4U}lNy7R2F=;rjxGWy$KNpX=eZJOsdHMGF z+K#bQkbPs%!1?Id(Kx?6F7CN`+B@UA;r#u$t~lQ_p3YB?PsaJ^_&9KAoN(IvbF}pn z;x^9LS|^E93q+UwiP%(|$8w+jC_K_%}@~!TH;Xem5@fUYm^E-F4mD)FwVJ zrN;87vh#6%v5d;Jy$mA!u#B?u6$9T9uw)Vef0{%T%ju72o@3ypNkakrx;!4|d&*I% zPnHwi`toye{+ zzg>SO&hK4+3eMkN-xcTJ)U$A2IW_KI=txuDIKMqL4#*+K@2aF&Pgll$Gf&%G>Bjl- z8|djvH=K&|{u_wfk2l2qbB?y`#_l*jb7ME0-@LIa&R_6($+TpI|2~a!^%9>SoL*1D zSv7M!&YNcSK&xzcG+PmLSr_iBjIXElU> zRRdAoSxdluwbbBRY6;#_3mD3@FL|lA&Gvucfxhr zc6Z!$+Hc}O+3ujx%iPNYdobPh3GF5eQ|i`IoC>EZyKi6zH$2K}fr&*<{GsXk?H2(s zf`!=i@ZY}RoDAN-kM?s;ldmx3UxA8sa@A?zI2NB*fA%8YKfq9Yr~x^__4jqS;{9S` zIt)O(6C6E}{x!=3&#!nf$hILixXr+l`A5h*H_t5sPa`I`kF@d-=gl zh^_qK3t66C2Rhtg8$XCutc0J(5KUvO0qNo zypZ0^z}@MY0QBB}NYCZ#@^tz`2Z~wB*BAJo3 zNwietg_Jk3ks_pl#gNVN0m%ms9>%RHCXx!oBQ{JV=}4)_Em8sCzmXxg6uCz#01_7g zEecoa6kH2vuLG?1+?(1nCyMsmBX*~d>$zmM&9;ViuQ$;D+nK!d#$VBbbMWKRVX;%g zjSQT49|>I?USDqX#*St;qn5trx)ZfeUz-esIzb(W$j;_Rq^a=2ye-`fSo;Q73S^7< zXiM85I5(Oh6~R;Njc54x%G(!MLe@DEtqi0qn)%nJDmdLkGiu5zXH--b#2{%0F@4sc{K~3|@)|3e zx3b{4F$Ei&_>+$ppW_WGsH&RTaUKQ#0fiMPOlA25WO8Pe_qg1{MQk6xsH~={a_-5; zA5=WTS2AJj$jX{=Q>!YimF*Nr1RdA?}TeNEXV&p^j{|dXcLV-%7P_8t0w5U)l5y? zes-&Q#au#De}eAtu=ZE2PTWUbCA@FF2<%%g_#Tt|`D&$2G=nxy?fKx_`isY83Y*sI zXTPzp??>)j!9kq&4I9tL7D<(!d*AQqctqZ7k~&phJ-PS)>HX}(KX>FFxc2M1dB(nB z56#m8Kg@rBSk;CzemMI6N5h`@a^^ipFaBg$+1|NxCO`h=us1)sZ9?h7ABS}xzxw&V z-ssGIt=q*<(p9AMEYe9vRu2Ed`Dwo)pKbkMy}S;)?VEdkKj(w*hTYuliNgK!YlaQr zW7Du79{GG{(WK&GDTgk)?RWRwBs8#=Ci9mpuVyKai1^>1n>*r%Q6E0`PiO8M?meGf zd*1$G<-Zuy&?WDKVGlfc{=aXpI56zR(YLvt{%6~;U%oMA#~t0j7$~3;@YMs14@Og;H<%)df&%uROuEHS}D_5#Jh2TOd= zYJEBg%jA&YXJYvhBQGf(W<1CIVjpu&_&vctGkH^*>4f0GPAQy63KNb(^P%F`02wE7 zS_?|~*G48KFLoM9sX^E9q_jou{G^PgxcsEd`uM`6S*}-Hos%;2k}~p=(uOCc4o^xR zp5!U$;v5@|=3zfI;{UYdf71!^-y4H}euw;N8)`ZpIU)YKJ36PMI^6XHMYr1D=3xeP?Zq+>c7CX#>xyp}3>v{k{V&8E0Ks$kdeob78iZ`0OS zUfu2-OAnjk7P*72#ZKb6Q1V=M0z5aIAW!<6cRF4@0iH)=^SmrFpP8~Vt~ddnZ=N8} z2Fdf?6X4m|6;qy9MCNmsa0&In#ncCb?%_!pi>MDa#pfqw*C&ihI_z}K zjO(0~jcP;nfyU~L)a^8?qdv?CODB|ewZ!Rd&lB;R;`0R0RZiCgw62bL)=8erJSUjX zeJ)ogPscp}A$e{&(X#Jwx^g-wJL$R%Qpz~GqfJTnER$S`FU697#v|lhKyqf8NIBQJ zT;t+9&i~z#=fZaRNB5F-7v{-wE=)rHFY6%xRCfm@Px|N4a6Ww&Pi_z4x+_dt(wsPCrqeOC7Fehds{>7aQ* z(q4fu(@siCZgO6|HOVuU0w5J**N2kshIVu}fo{A-M`0WBb6Ls0-%1=sj7IjWaMF}zFjqWnv3ZsNnzCXyg514T) zDZ9?gIwyIIF4rLY!2960S<DuM{DzFt9ABm1k<@`$0AFrH5n?{M?n2jIHxE*ij ze=&#XJ9&7-nnaIbeew_7DF?D9)1oKO12huaOnBR0XPH&U~EIADzvGQ3G?U@hz+ZKf9TqUEaYtugm4!f2dyFGX5`>dJU2c7g4)yB73zSV`Z+hC8840Pcspp8!)cP z=J<^~$a+N|Z*se~QM(W|Ny;l7v~y*eqbPm+v@1!z<>=I7ES*#XxLML&Y38kz#&P6L z9mm6Zn{xR*+VCbc;;k6QU%@#3D$?E#9rId}r#LCMKA|aoQC!fy*tNuoZiJ{2!@bB~ zD&Bt4(NX>e;(4y5JA$xT|BJxb>=PrCGMy!zx#0>u2Vs%S=gN4mo8{tqV_nO-!qtOh zCiK>*E_qhJB3V=XH8TEgCBBroT4$NA^QeibeW`%k%n=#?g?917basoCY~)+^@NhsjQJOua*Wob<+Wnbz1bYFZ<$Ho*1(+j7z# zfQ__jWX!ZE`&t@)MdOrZE{bJ+L`99nUK5x`Q(2Cly0I#As0?ySVyd z5)ovEybH_gAClio?d+#;pNWuHeiH1GCc6wG ze^dt$Km-a$+NvZ&H3bVhi!DO*Zibrhb!SYJaX^x5KN$c`P8+JmQpi?-JKycQ9^Ie0_q;lh7G% zn8Gfu>y!JYRrV$Nbo?gDxKEpXCoeHR86C{IC_Wgs*u8|NXO!M zG905bjiSCyV#ttApd5rdI?&xvuFsFfqH$?g$AaODy2b{-)&{@M1}Ez?`fzEb(I60) zR%U}wvcV_Y;1xFb^)@(Z`{=`^-4G1|acMW&;L~mJ88-MV8~i34yxImQD~Huz#2e2ESI zYa9GGHu&8(_%a*(9vl2#8~i>Soc+h`o{_2L)WSH;?ajlb-ERilU0vEA+ufTtF0I)N zw!6Bt2io16H~8-=GuZCx(w4WoH*Z|ppUq&qt4sS!yL+g)ASqwVg^8<+OD z8EkiTX)D{^n>Q})Ni*2)>e5!VyEkuK+TYAzyQ@oks@=VL!J+IzcVVCxT6;=Z-jl3Aqhf7-@4FYj#8*K26Huz>6e2WduiM~n*x+y4;Ja+_w{7sfHu!rs_@n zvcV78;GfvwpW5J`+2Dt5@GoreFKzIzZSZew@FO<(_cr(sHuzB+{Fn{yP_%oP#HG2S z@L_oD)WZB}E@~bw%^gKg&s;wbY|T;<+k_@MIgjQsQY5^fPSmYKceA4CdM3#1``= zeyS#MtEA6VL4+G59sz59#zpDWXNx6$u?ix5m&8jW@ZU+iE&~6P zMWEQ)Pts>cJSk+nl%=FTDw6b5RS@B^5-*Lwe<|^a5qOEjBl}T>#El608zr6_f!`$Y zSrPagiO-F|7f8G=0*uo`X!Rj!U%ksdS+Z;8NHN_gO9DzS8@ze->y~Mjk;9DgBeG&M}65kbpzb^3|5%^mY-xh)I zmH5F3`~!(+Mzpw)#P5xu|4ib|5%|{ejFx5Ojs(ZS>Db&g0r2@;R2ms1!oaim4$ z^HhmPS|VpiJkl~cN8+9cKIchXi@-0G_>qWmWl8*S1U^LKkru%(7?0H2_?Cn5Gb6ZY z+C0X87KPu#_*qf-BaELDg>PlNXB7S!t(j*h!|j9+Wv2{N>d@vz@GMdGxc zr>C>rY7HKVzXCkj;t~$*XFjDCVDjk}Px+i=;bmM-yvGF|i_d7LudwK8-60)w8J{X{ zaHjQwbgW=J><6ZGest_)e1^Eenbzmgag6bs#0}20u8xi&5J)d)*ndlFic-T)% z>)Ysffbsd_24`BMM#n!HUm$L9rgdg?bb$bSIqNt~Ct52;M-K25 z4LlZ~U)bOUzxoe2N)gC1c}nx@2e)<6(cSDbG5_!+uv{?AC=Zk(a{FHr*ndp|6E2jE#Z{dayY{V?+d(_GnzkbxZTUSUUJnm zT3qV%Ef!AepXgWzyr)ylrs+PHPB;!QJ~1l)DM_*O-xGK*XEgs& zjBgW6aW>N>`=hJ#Web;TK&xi@S1kP3GPK49KgxL6A4_YX=;*4)&gU7xdpV=&`vULk z4Et#h2{zhgjEAjEGiNiH&t6HTX}^?`S_eELM_ zKQOInqN9=Vu)mkqD$%hMcq}=5XoG)YgF8>9c6&@P#hKP8(UA+hmox0YrS(H}+|GE| zPfP24=y(8lto;1NhJGvKVgD_y^PyuXCUCu+VLvUc)uH1l#>2A?(>}QX4vbjo4hG)K z8TQB0S{gbYV?6A4rS&j$q;)6yGh}Hrjn=f#F^loAAJwd{M}T*A_O$3}eF+`so*p|t zqipbNZScEo@JDU%78|@3c&vQpL4m}QTOsgX&agk0*0j(u1^5HbY^%KHc>O%%7hAYF zz9(Ty_JDJUg`4!HzcJRH~9=^e4vG!e8w|=iG^dB<6{c&Soyq}=`XeDkqtiXWqg>0oBUTZ zZdwPL<&WIS`0yzD<~-!n>d#J)H$n_yxdY~a=piRk%gOb_<`{;7H-m?(Ia*~FSfzQ+2GZ{(`4S-U5dw!#OK6)%V*8f zO0E)LDQB0I;N$I*n`$e|Z!D>vSyfX~;w_$xkDX_aD;e9rqgAv~g8sl{M7`_~N{;Z$uWI`qOCuorch95S<3nDT|+EG0|WGGU=2}ryPFH z_gNe@OT^&FSxnrY!~Hp&#hkM^Y8J=s&vE;U3~)OAnNNS_)1T=Fh@1(W_+G2IUti{3Q3tZH)Jv}rTT%dp`=L4nF-u!uZj zP(ktNar(;hEb8LN2qi6mha)DkbUTWMzYc>5u!rL{O& z)kvI}6>C6IRYQuP`=GbN)jwG5)R5J`U`BOqRRuO+xT#h?7MfE$&+%4|t*I!RRx?#Z zc349nudE6?a~$X| zlzPF8>#^NK)&MAU-^{9t88!2vk_(DwS5_8}o?JY+Qmd|>|g`ezp?tgv%Tq=>*Ci9q9yQ z5FP3GvdAJ?6qeOiS4UKO$yJ3DCXMMoyQE@n*m7uJ^*M?-VzUtTM!Q%PX~Nj4Wv~#G zCT6BKyJXhPIW{eAh>~0^4#HCDuuqjwE3gcb_U)LmC91T2wqleZOU=j$#_8YR;(ujj z&D4>wCngWCs3|*cVgsnlm~B-gX3wCcx~2>!UHQ}-OQw`nPP60~wJl42f7U|dCWzui zJulFvR8>?U{^V)Jv!{2!Co8N7qZO!4DwcvRpajZ_I~qx2@t3N;vLHV*M(Wl;V3WG_ zoKlZj{K*CRGFevAIR$geD`v5IJJ1S_m{wL@9V7LV9d8Gc4Vq2D_RTE6F*-~C0l&)X z8sax&4(f0Gj5(DvCYM}MQC&N|!YsEmKH4<}fl)lF`3Op-GGyG2DO{#oSUrs$RHBuXl+P_IDHHa21%_g&iKsn$xv5$mmMLqd zR?+auVNxpXVuMxnj8$4V&&M_FMHdr^9&Zw$2>&D|0nsU($kZV^tq!IR(Mfbb ztZ=plH>-Z&$f(q2&8)7RTQa?3I;!$|v?=LpxNPLeu?6Ew#^nw76`&HY8iOu3scf>S zNZFajc~y`qbV39mR8dsJ7?E`n6C9hnr`k%P4Of_-ht=O*cmYA#&kXjJUFK3iRTUcQt)V4LBjpmUv zvTEk^u(v9E#LVflrd7;s@2?u0RU&_aE-{T3+h5j>^Hu*eZ2WfOB$BpHITHOoRvd$vF z31hM{$vB%^HmP!UR@M-NX&%Y%OG+wdOqt1+yx?c?@o^hbKtl_!-9ZF<{5 zGV-y=q-A}Y=4g1btQIB8hEY?9{ZI_jb&wyoLM!!tj0?Xk(FD7|6}0T zsnGM`C#J^C8Zm9=j0yuU6Q=PTiKid4;0!OBU0GFATQ&_ZBy;3TNm@>|7(eXH&ByH$ zr}ydKD)>VZC;BA{zS#!fDc`IT{cja|bDd=*pG*R9(B&Td%={$C7yE?&M!_#t@LwzV zPgSmi;7LbhK3}paSG1y{@UbI~ohU#NQH1qD~zzqz7{l2`SB`DH5MOYt-NyZEj# zS`S>Nac@SIVW9_Z9{J zpHSW_ZSwz!4IZcDUu_R{3a*y-83q5JP~Pip%C+7G*OmOM<(;VDYIzqc_CI4!9g9@&eS9}*G`h{BFOOZc1C>d2>QJ4-=bE=)Q zoKZo4FT$o?dRob+TCP+jKdOGaOu>Jr@EIp@O4kWlnf%putI{{x(B~@p`96g|{plDT zbfH}nO#WMK=wG&>A1c>hQn6M3^qm$Rk^EOG^lH5vP;j+gIji+0zRMKps`Ag4 z@*)1J{2x{D-{YB?pO7L?Y6B*IiXu0azPlo4m43Jl{RA8ON*nq)HuS$$=+*xFCxu>Z zKhN6Gx7yGzR{D`zk9R5kQLUG!Z0KLMq5oE)SNr=93ccFSZO8kTP znR@#KA;r|H2bP%rA*J?%u zPGvOnV}40S;{H~_uU7J-=JQ4y+)D}Kpo?1X`xIQ|qmHL)KP^?-r`k`CD(zYAk9Omx z_`W~dPPk5KCu+O;hYj9O(dTOWxn9B5_A`v75H0^(6kM&ZM-^PHuV)lotuONn6%wl| z&t*!zsPZpU5{OGX6shz0uSN#$yeNUVE+NIR5n*Y5Dy;?6oaxDH*jNncuHQ=BG{Jqvlif)2etU zrC!wfy+ElKRc?NTUM<%;1y{>uH?MiqCZA(%+S^SEuI7KX#7RDCKF#j~DO+kjlWg*7 z&X0&s5_p<=Oqw&Sf9R{nM49hQc_sQ3h2GSwgwyVHvG|a$&*YPB!)K&|(^rxvpK%JV z^2c@wd{FV!d|oW^$b1$mxXR~h8(fvcnM(doRt{;BKjrf*rCfa#oOZ=C%WKM$=vCa5 zPb8n&k`I;l9EHz11y{?vRl#ZR9W!0EyuE-&)>mY@mn(eERrr)jJTm{++u+p-uF8kn zJRMXnl|SixIwISf+8)&WUna=8J*)h0ka#5jn-zLh{3p)OPq&wR4rf+E0fo`BD43TJLH^lUgguG z;3}V26k%FuAacJ9gP<^Sm>352($6qM)YX4H@{Bxy$sr^E&-x-{$uz%Eg`Lo0$ z^YfH~tL1u5;iK~ZMxj^BWqx^2{MGs;8ag7&YwpuU?O)}u%17ZF zlq>1>LDQb7}+T zxZG8iE3)466}-PfKUw0Ge^n0TOQ9pOT&kXFmrp^?^eP`s$-gR}Qxsg~bGd@6^kQGw z==}U%p;!4lr{F4|Rs~n--&Amw{%adt^^d81dXwOBklbh&2U9PZ@4pCF=~eqG3-o3^ zVtWxjBI|Lug7;VGCrLcA9%=4LM`S%dBw)tX{In{#T95x$a8*9$dx6Mu`E2C&O9fZc zZBlTR|6K~M(*I4tRr>V`uG0Tk*Y6CQbo)uUQ9Y`5rlH7F)x%dR^s1d{+EK(u#ZCJs zlK-tX{K@A=M`V4a3pmOi?yul#y2EYoQ3|e>w?X2Ru3FwF6kKg@A1e68kgeH|)c4LR z|1+fgBjwZE2B*G8N2J`$ol7X6YJMJ&^pUvOw>X;58N?VzRDNvmECpA~HACW&>9#1i zD$lbNKaZM!^}Vyozfz%B`G|cKe>_dW zY1bmN{hy`aDxcE@8*XnC5H{&ARPaA3xazN<-GfZ}5ej{?La*v8m42*3|A0b2QQ{;Y zmA+h|e^8;HYD2I30UlE5=i1QMOPt!ta)o}O4gFmT{R)Mi-a*h2nSaUy9mJn(AyaM- z6Nn>{{wV=7{a+9^>DNd+lHS}wkoXf%lYWN{{T_)E{UZwfej9oTbAHC-rdXk)An_r5 zGTq?th>L}rayRW1lYWt;OOBv#miMYXL;RnXc&fabe74E^9ufG5@;)sBH{^YK1a9VE z!;~s?6r^+s{}tWfP}>#Z zX1>*SMY!2c)OJO9E`D^V?TT=7{yBx8igKy;VYPy*`gys6tMq?WaFu?yf~$V=0}4J& z(W{?Ioa8_}O?e(s=+*XP?tn=2s^9W-@T7y}uZ{~e#?e9awY;MhxvBY?Z-cK^()}CKFy;K2f~)+^_g0Z| zu(LnSd23|;`w)O5QVydf9?5^Af~)=F2?bZn`>}$n^x}U8M0-}-&kr{AZkNa>Zy~RU#t2-)iYly`BeR@4q5M1UR7>p ze~+w}92@$Rl|wJ3ys8|ADEUGP51I|0&A5*_{SJhKzdG5Kl z?pC)e%oF9^;_p@tXDBPp(>oV%w0{@i82`y5hr$9iKq;24J$fMdOp3+16d$>{nG>j5lpx_@rQP1k#7+_phE zL_63&#PWd8kC6WY;E(b*0FLr&07v;Z0Y~|I!Oi=^{y$*$eTw|Yvmk9|90~zP`?&5D z+o`)i9_{yseggj&3!N|dF8FN0*&L7Mwftfi`6pcPZ7#U}hgh6m=+(as%!qn(b@aWd0&2;gYv6u{BWUjfH-JqbA4*$6n=8Pdf$UBduJI~M?s zcGdxoeEtbI+W8uAv@^b|GoM1h(asfsqn$4SM?T*Hj&?eFBYx4&Y{1b@72s&+4#3e) zJDET+^Zj7J(awp0qn$qjj(q+CINEt0aI|xLw@7-?&OpG?&IrKK&NG0coz;M&oqqw2 zc81G?b2C0;07pBQ0*-dx0UY^!1~}T;13225da!eRDgZ}2w*!v-DE_||ym7kDg!b+= z!A~R{$6s#=&hgW5GW1 zxg2ohb3fq7=V8H3K7SY7eE7(UquKn*^M&-;R#d_EQ2$}&kX87{_tY;eg}#B?oX!?@Sl`Ru}vg7yL89 z&G<9|ehYEc`S>H?PXXRBg-&SWbRo|ZQW$NHpOvEEX7ZQ1;D2(#pK!r93eM@ma`>T( z{7)c{<)p_kWPmm^UBxbVwF|z?1>fv~?-ZQ*uo4?7kE8xhpr{E^f!GI&55r89~a|Ji~Oc31UGZ}E? zb1B%zxIF?mwhQmN;7u-gMq1=PLOXdb_-q$^i3`5L1^-NNjsv!LzXFc^f$qJXd7kKk zXS?7|p>wNW zAdl(YR;GB=x51arvwvUqpH{0s~;27s> zz_A?O064~TDd1@5B^Uey7krNk&K!7S{%HRcz%jo#w!E2fvjjKeHX3k@+XY}B^Q#1K z81IS~XKLH%=Hvo?D{{?W2LmN)0Lmc$_WHSy2i#+cz4u=bFmY;rrqu;@T zoAEzQaNc3L9S%79JzH?o?_|I+K2@JGO`h)njy!(= z9Qo+=)h3_#cp^d@t0A8*fFqwCf}4C!037}H6WsJW80@3pGXY1xXMugZU(N>{{p$Cg znSQ5%ee`=7;OJNXF49bI$i?r?f}4JC2m9#vFMy+8{2e8x_XQWft6ltV1pDasEx^(5 z2Vfuleginh`3J$x^!^I=(Qi8rByC*Y&~I14%{cc09LxDIz>&`g!A(ATeVtj(FBEx` zPa)XHI8*|Te&@OPtpfWPhg!ff4!41Q^!pbTH9KxNPTwRrs~t^sweElNJLP!ebd}Oa z<9c1L##32{wsWDL$MJO?;6IU^w(}j>zY%c#|1X#izL)Gcc1W9v4;7quH_=DiKb!?= zGv$Z4;FAPrJ9p4W+tI%Z=F9QKS>yP=YmD27wj@X!%i}ocJixIW-Y>Yx|Lu0ljEX<< z`B8ATkMSAYJ|d6tyg+c4N1pmUv?kB5KpuGxNQ~IWIM3=3!O`zr!P!2Jmj`x?$fKR} zJ4JA`GevOI&e5GC@@QvVmk5q_CJAoZIkIa+9_^g&jo@g<65O=YR@SYV`FOXiA7dQt zta4dbHWb!(Vfi@+aLkuG1ULPzm33C8-_3%X{A*=>k!j~q8DN-pRtRp|DUtOaru-to zSsu&nJs^+q&xQ35D4z_^{SogkIQzx>MX!Hgzj*)N0e0}dI1HYTWBgA59OHi_;8?%? z1D=m#y6%JLp2%|*Jm180#mPXddD?aFfp%8DN`yE)kshV0}2?1ZVqK3U1neUgjrF`ya!+C6xP;{bG7c0mt+{ zFSzMAkzKSf8iYgm3t1ZSSe|7*aJ|4)D;|B?M|`)mix&#i)+ zeAZ<+^Jx^^pN}A~?qfd5$5Z*akT=epQ;!5?(N8(i@E zJlj6!JC66;4v+Z7c6Jcp7`HOPO*>0K9_#G~0LOZ}%ID1ILBSK~GV<99IP&Q;B4TGH z9qRIMn&4~)+rf)LzCXy{D~H?<}9}f}iYy&v3!77u?L3$45o{ zc7^#0{T@Y@pGBXC<88SLn1@09vZ3~MEwAGoa>1W4a6RApstf+Dfq&M<_SZ@77d~Y^ z8qYBB#Uek_1;5O|^}J-r1%JZ8_4ABZUGQ%WT+j1%lKWBf*La43r%BvLy5N@?xSmf8 zx!_M2xSnT!)dm07z@+u#$6w>8K|R2@e(tgj?rX*eB+wUaD@NIS9f!y4Q_o5R z-z4}(1OHm^e;RlviQ5MTuHS?3g@G>+`ELw-w3MIk3|#a7)xf6+pTx861D&oH#eO#f zUo7&68Tgwbf3$(?c=j>yd17affiD$1ryKY>N!M@#KS=WB90RWqd2yrK-x4|r!FYzR zu^8i}GG8gvfnhvefX*yTo0d=PXrIgUSQy{k$;M^cDS~&g@nm}!#y|Jkz!3(%;2;}F zG4OyGPBrjJGT$W2l*0CdGG6Ly$e($r4Wt|RKZS^>h3%B4*n%=#2;=cWM7n8Vyq%2m zvkm)qo@fKP2EIfHS_a;S8#mhg_AYGyekmt1EKu_R*v@_`@?1O+=eC14&PRNI5g+r$ zIQA=Y7@*CRw*W`^n*?XS*nhYiaO^+ed!JCgUA%Iu(uMCqN&y`0G z{hm_hiO<28fczm~XDQ(L9Q;wh(f-qbqdb;FjDL=u+-CWBKj0SupEZDEKk5jQ;f>RU zantW5WBg38!^gaFvBdQr!v*JT!{<}^faCKiUR%W*+sEfq7Xyy{mdgOgxas$_upNwB zXYh-0I|J-sIlmQfjN59!F>WPLo>!4?U4HPrBC7#EQSz77kdNO5pA6*zd8TqgY2zK{ zm;V3tjAMS~iM*L#e!8ra7;>;N3&b}Bso!uX6A zoYk;A==YE?j^*JdkjL`yC&2MO{WIVw{~+Kf{{-MD{}SNHXC2@u?^dr4gYt&?emme; zK5=~xmd{GgK-zeBBYkwf%m*CD-F;ok;n^uza2gIF`@hf}7=Yl;BJk z>l6IHV^}^Xg8kN(PmIsE;1}bQE&0fNuzX$w`HSVV7H}*Nw*ijj;cmdOygdLo%0CV` z%0CM@%C7+&`D_9l<=aSkGtrgZ#zv_7vb)-u@xDS>E*j`(`&--gLQQ9Lt+tf5m*TyfuMeEN`bu z{Mio1VJhI5-Z_Hv4$B*sAIx93^7A~{!Sb^Ta4Zk_e<4x+Ef;zH|7!U%@@a69Pjso@ zvY;Nr{Jjovtlypn9P77JrJV3?4SjU|RtGr7S=VEH8Sx)Qo|A!m^m;$WvAn$q`HtmH z*H>nFdsXDw4VJgJ0mt%&{|^+)TYHEzmN)(XK-oUVVV207>AecN#^#38{%P5ca70SESS6_mC0k{(z&Mflz+1yp4tOfaUW-z>z=p(@Czf@V5a+ zKC(Pb@j*MOzz5T-=l3|y2a`=*Z_DFiWe4SlyVw~GIL7S)z>#Mq;K;KIaI|w9;3)sF z3ts1fZvxy0>D>x=9^hXCj(&Fmj`7*+f_H)ZIt%O{0XW(}9&n5Ujz23xc0QDoq0qlVJ_RoLRWA6QF8E7;V;nXK z&iV2bef0g+NBVD!uLV38@O6MMalyZVe&94nuYSJD*@NY0wDiZ=?@F*gumhdYX3CcU zJ{{~=3eI-$|4QEg^5{1t&u`g&5!hJC#n3x19~AZK~(59{|Nn|xjd zd5l9B_+1I!?}r19!ZW z;4>hb*KHCL<#075k&A;$g{8DY-a<=4+H!a zz^?{;BjC>fz6$Wq0Dl$m_A)?XzncIr2K*Yps{rRVPUrixfU|rmeR$gd_>Xk1<-Zc# zj6)|`m%)5)0{Py8vphdj)^^fC9@{%V$YVJS0*>YIUBJ=)4!|+LPCA5$&}Q<_cEPU$ zd?xU}OK?sv$IZ`1Y1;|%=(mF`h++BH=%eFsnBXR#fgt}n$PWX2H{g?9>|6u#Z-D$C z0sjT?r(Nvm_q8(ryFtDI?6igW94hN>%ybPGobCJ!c8Xl&gCPGj$lnh59>7<)*!ckD zH-kLB9~J9?j)##DZOjwvfkOm0({-{7ex3_{7ue_WGn1Xs_9Wmu*4E|ZOR$6Y#f-yk zJ?4Y>r+{O7v;%OgpY?k+*$%e9<7J(cY5!Fh{M;iWe9-SDfTQ1Q0Z0A^9Tl;I?aQ%% zqn%2?CqmqUf^$B00{lV1I|9BD?BM-lBJMsOTw-JELUYzO;$j|py;TYOI-me0Q*7qO4{(Z@${Y+o{5@Y4amATE->n_X~x zpC0D>aVJFlq8)tS9m>xDdBp$df|sR5?9T$8+X2UM(~p4T{6L4^5j!Z~4e)cp{-J=Q z{BbUL2H-e&_Ekv~fAyLLYr!a*WoAGc3A$OfS)Qjr?&&} z8RLQnz|LD>=T;Z_w0|E+1A99hu(?x!R3tsPn?{&eCA7rPO(}neR zKfp0vV*tl??Lxp&ex3{dDB$S#X~5CWTY#hAlLkllqx@(Wd=B8~cLCsN=MKTS+-{|h zEI?oUZpET`vIsFTmFU{yyNF0sjE- ze*yj>;GYBj5#ZkdeiPs$Po@*vnCHjz(ea-IILem+z76E(3(n;ne}{Vq;25`00G|x? zLtG{qppESm0-g&vjw@#Zj_r{zOPNu2u%G`I!8yIy&;QUxe!?jcJ6(a#B)~CUAs74! z7kr!G%qI@)cRkhi%Xk9dUv-P%)pYm;UE^)zLH3^I8P~tx_*2hlTtAmRvsX0!q}ZA0 zg69AqwlB?}XSjiD`{x+=CAK@ySOeGmCmHx0k)LVcHG<=N0GQ96f-f@UmkVBN;JXC> zqk&5pJog#6S1vqe;71Amyn*)-e4T;U3ckg_>x9oo20l#W@qGoHUcTpf`_YiszpH6; zntffD2Ob0S*44oI-s9~s1FsbPcmuyj@Bs$?wQa_8hJown@gofUA|^)LcmppMe6oRW zvc)|m1}@3>Tw&n)cR1G=xPDH5vw;s6`}Y|5GU4-(fpg!Kw`UAomy=Zn{-W4<-M}{r z{x1X9&-=eLaQ*(xT?Ve7_wO}uuRQ1Odb-V*-EsNR&*={{@Npu4yn*ZI@%SDIwo@VU z_#O$yYXl!**wN49FEH>UM1HD)>vgW>27Uzj;O!~{PqpFjH>a2Dj1Qsy<%=5sMDRog zY16p=zh#|mIE>$Ss0}0;_!z;v8~E5{8<1Vt&XOKBuG69Y-X(a7Vdo3Mb^5e?NAWAu zDq;J{Qt!*~G>ji1xURpoo#%w0bOXckbz)zd*)V>Y;8NVec)8fgHu(1wJlDVz1-A@5 zUU>QqJWc%O8+hFzHZaz}?@F+N2?oAY@QVywudA43;QD#Y6a)WU{7yIU4T8@!@J)i3 z8F(kD$N~oL6@0FNFPHJ{JOlrO;0q1BT<~fGA1nBE2EO4i8@R#1HwnJjz)u%Dw;K2k z!Iv2LStr}TT?VfEsY?yKeuxd+Z{VK_zRbWs5d0AXe@F1;2CnZw}9g~o#)DUGv&_&9H0C90Y^J;aK#{Y zqSi%7J#E@=$AHMAopFF8fBhZ{zKndzKpyRc0LOm*UjfJd`Nx3c_zu_S!t)$Rq!& z07w2@&*%;L>$UNG4ecxhd9=gzlHSnH34o)Ws{uzlCjpLj`T?FIju_ghozfoTc>~C& zgM2CA7*E~yu_*Gya+Lyh&Hy{;SC7S66#b@wJo^1XZ1N8MUJLRVpFx0Qd)hy}Pb#R{1Q_;+&5JM8yL)2go4hz$GGZ7W0AFKsU}yt`YDSzgDAA?!DH z5EpF)o{2OrHhh+Q*z~xat!=7xp*_gjPT35Ia@V*MMzitIw9%ZWwcLOeuniXCT zxC|*3{w?4cwrTags8L>pF@r`Vb%hJxzqEWl+bsPM&r z>$;jR+zxn_lC-~804`Hh>cUFE_1q_4_#W`nY!mAHH^618OyNgJWykS31LThb{7k_8 zfM)|f4)7en=K?+y@I`cp>2T0zL)s&43pH{vO~{0Z)?70rQ*&_@RJL2Rt9} zV!+P_{8GRd13m-r+X0^m_^*JM0Nz$QE6lSD@O;2$0e(Kx1$;T+)qp<-ILnWc ze#Tb7gCPG2;MW7*S30%KKLog^U&ZCK0tJ(4A1Jr?)AdoHXl}sMZ%RR+z|(JXMTMsy z1N|mmaQ4W7WrZ^b=arY2mY+PTsG_1^T2bEY$Ys7dWbE|vqJk+I1M*5LD$9$;l@woA z86~7_h*XxZVoac@U}j)Cno$x11`Vs6TwFM&Y-Vvuk*_3BR9;p(vmj7hTH>3Mce1Zy ze8J4(DXcZEuyA70+`^)=z(h*M%%U*Qm@P!5ZotVzc}nrDqLK>oRWNh^T(`nVdC|;* zaDX|283Xdi3?E(`$SavfNzWKahyK#?qLRQB#RVmK`Lm0Q^G8m}pHl3c^wwEu$$2_C zA5}VaYC&Mo{&;p%kKOH%19Ka#9=qGj19Ka#9=qF|19Ka#-h$f!8I-rfipvWtXBLzn zPyvg@QVV1p(*hCJA3tV#L0Qp$)DJGoEx61$8PdMrzFV>q zMWW?qzi?*W6z5hiR^2Fv&2Lo@zd<)mc4`ikR;x@lrt88-v_jHVcfIfDB%mSGeoieL+dBZVV2!-jmb zB)2py8$4`gQ9-#|E^*Xjx6sUa#^C&6{)ywqP_1N-ZugycF5)qm-FK{-v2f0VeU5u$ zh||6X-Vya?soAI7eFrQC)mFOOXCU|OPN_ys37kyh@m!h=IeBcUZx&B^j6QqJ#Ebz_ zA1lbm$dKVPOA7+|)OgMuTV7BcsL0F9^Ym-RJbW{aq58IDnlHe*>BFWMl#3RhpFAc| zP%@>Ud`iyDnWcpVRO9ExS}*UP*=96{*mi~u$jcvD=-#RsV&$bgZ4{n^(V@#2Fuby) zkY{hsE|^8rK|JY{(J#Y@j;c)ER75sL2PEynB%LA~sH_-EQ(Cd{h*D^Qg((~65K9e| zk?t!g4iwYG))iF7MshJ|R`2GG89dPrUZxSe-_wJ8cDGcE#+rs^`D3?NCl4zq<5IHE zoH0e6*{Z_ST(ns^ADmNOUU0c@*8bgfv1z+GC7(lNvhRT0$85)qNdD{t^52qrGq=qP zHq|rxn$c`_BiQoI47XH1TWE+{n76gHTkmw=%~4BEotydQA#6V9?mBpE7S86nk@{2B zEc@ye#Cp^3qvHBK%sbZuzZ-k3Z!1e?7SAY}d3m^@liQdwrL=TP2|XG)XDam;^Z2ex zr#oC4zl`+R1v4v)CI&92shr95>?NuwsT%7*3`Mf+KukFmngg*Hl}64DsWW4!w3?Sn zCvpdBvl+qgtrZ@XaBUMy^<*l8!GuMRTLOkz+C@+8u)EUgy|} zdD2lBBE8YkG&@jGGHqrNO%TLXp@td%XL+imHAv6EmCE|Bw z(fS~q%t6Q)^52fa?@MDp!!U5b{}*BS-DormL+nk&ARd`#a2F~(cA9cldFhmz_=7L?D z7rM01&dt=RQ>IQeIynDT5|Pf)e~X4&-{rrXFVjoa(jE>Uct*zivyQWoK1@i3QK3v5>;BITT&V*>UY-J<4&T6 zws3}=Pb;bHS5{t1N&#*ZIU+^VCr&M=XD`&4mzP$S;Y#5BI{vv&^zZ1jk!(4TpPi`x zQL%$CSF3{@$ErWcL7(4)AFDpU^ThPusTKMQ9rXFP*s=Ow?4aMJ75Ym>{|Gx7s{Z_h zj$`%zf`k62tNm84{{{#CU$;VktAl=HEA;Cf^#9!o{oSIE&6iL7(5r z8ms=T4*G?y(7)e7pWpWutN*7Q^ov@dzs5nI-}@7*|F=XR$4~qovRL)?dqZ&i!tWo8 zRlnZBKfl*3R{fo#kN)|+RfoQ>hZd`Tf(W92e!p0(`bi>)@jt2+`pFLZ{GPg4 z{iitSbDuI+{WJ%Ceji?}`uaUGn0|gQU#$9>4*vN)bg}AZiy-D-b}RJ#4*vQ5b+P&% z>)`*YR_IT1@XznPi`D;h2md@Kh*dw};Gf@@7pwj}2mk!Ov{?18bMVja*^57=zs5^KcE%*9(hj##-HCo8!P|L4*E&0&`);I|IVTR zcsOBXHtL;lbm~bJeLlvGWpO)(P8gHsHhd{o{S!!o%lQ84_a$A$U&afXK)Udk*IsBi zJRZ=%NEiKl(Ko}O`_o##%te2aD7M#vvN!c_cF`{reR-Wn*ovvYLG;@g>0c!Jy8h4x z%>3gyDW~`?j?q7lX<6U&uiu~6l7D{Jq?7;U;=e%OFp>Z>{kl%fHqyWJ-)zEhqyf3LjfrzQT2T=>_C{(~*>pXb6q|C{Fgr#tX}%7uUN!FIx1;?MI0 zPVrwX`oR|Xf9JwKZAWwdGaUH$p^A$o&G;WG1*|3hrJ`?^pKQ^8uLb^>lD<><@$78Q zzr=z6eQx}Zj4l3Oy73qNS#%vY^ZxzBh5uIJzf+XC{9i`LX8BL0#5=|R(G*(|->J!n z9Toc;e^-dU8UM{Gw#;oU@Gl{Kr}%I9*7k(_`8`}F|HoYT7p2<%TjIY*^iBQ?MgO%H z`2Rrq^w+HZS+T1*e}4a$$)DfD=@kD_X|eI=c8c{){`&u?KF|XHd8F^ef7y4<`SW|n zO#Uyp@bAGL3))(We5Kw$ad_nn#ihlzi){^^>o=(ouK zCO7_~{~N^zwK>T)f+{4xi9L0`X%{=KY(LYfG(dq5L$t@K68M=D(TR zXWp1UzvoVeL-*g#5dUWU-}WiBsCO7MVq3MZ@psULzh{Ik(^LFw4Kx1Lr0-OIJWaNz z#iGdkZ=hq7|8p+nEy>=$mHLrgB?>d z{&k~muPxobvqax4KifqAx)#dMbkcWpr;KKh;7u$;Z`JeVL*{M%GDV?PL2_yDFo#_8&D46B{aMD-& z4gIC^06$r9=6@$0oBYog|3)@@UX+*W9&6Y&=y?93`5OkdiN4$hVJjy8do+JTe}(Y3 zfd4%X{MT##hW>y_wxUk2m}ypj{_4U%Tl6p0in2HP|K!5o!vka5CaG_`{=b)wH6NWX zDV?3m|3jjv<;6@h{^La7EdO<)FWI2go0b23(swHVlN|WpPgXP^&7a?&%w@v7e~&J( zUDD;K%`88Ux$sXH{g%qlgD(8*guf-;x%~f)j!phsT=-ut{y*HULGyaQ3 zf1_5Ey;*+RkiJv=6UE>%(PRD((Xr;E<3B+BoAJM3vaQ%t^!3i_@|5hOX6SeOnVQx@Gom`-@jW$k@+vD zW0U`S7yjRf|CY-CP8a^3DYoO5?%zfi{#Ii1`sYap{@rPwjALq+pNZnXCH_9qH_LyS z=+Cy35&kygpG*2q<$sy*pDUUi|7YmfjQ=bb{$Iw(|2`M~YO<32W{g)mH2+`g&*3@f=O>A7`vt{6&A7pVM!cV$ku-cHzHM^znZ%vA)UwG8g`nI@$bj{QffOoBVHg;XkLC zy+!}e89q1pzvjY!sp!99D46^=xbWZIxq19ok$;mv2ZUXi@h_dhY(1Vc?OpiWpySCE zeY5;57yXlL8ex5t|Ct0hl^?6Ct++uPa`{5e@}_6-xB}F zT=*v?+5EQw{|yfOKXu`MQkm_)rSapD^ni?A7{gpozUUjn$7bb!mex1&X_Dyw!KM-Z zCc07EbkcXqzn$G|gUdvk^KTO!oB6jw{F~+PTk+pg`_cU%Nx#8gO_r0tV~oI<{Jo^_ z#DB>_w!yl1I|0o94F~@H#lOk_7@jPqO?LJPeM@l&pN|*)0b#^GSR#sM`>pl$J|y}^ zGU=aU+IGG+?3(GnhV)hX4Y>(2@slQT<@EoPWX$|~R{Wdc|F`&0GwiZ2-2U$3e_^t1 zai<8g|F`Mb^uJB~4?v@I-2HMJC@^pxH@!cYo|Eyh8NY?1&t(=jGk#r3-zk1&huZw7 zizDXGeL<7|>EhpvpI`n-NHRL7V>5o4F8;S3W?Nh=`t1K-4*sWze=~m5#s4tFzveH= z@@x?OX7#`5pRWbQjv2qzn!gc%>4)3ELeXdbA3E?qiYiDJG4H<)^K6I5i(kDn=y(>2 zzM201qHmT9t*`fwioTitY|&4W`a}CS)4z=LRrxW}Uw?!RTqiiE{}VEz9i|ELT9X^WIvi~ZL}Ug ztg!Vq84V!&!Yz{uD5u2`^JKqlOWkfL*sLNJ29mzwAA!_SqGd~F3t{H}8(lH^U+?07 z+iKh3n6sk|oAIl0@o(iz{OJDVjr}*#-t_-Z@o%PU&_Ns(n*UJWkuM`0p4VOcPoHXA z+-93m{^RJ_^nd7KcKl8M)#CqrV*n`T!h}jh-zxlSspxNRfqx0zVtmgdr_t$3m-zomh_?PvLjsI2DK(S=A@-O-=t)ID^^qu&Z zmD&7dr|#b*2mZUozsdi_el~xZ#ti3zjfPJ>RYy7VPv;*i)3%+-!Dg19t4QC8|F-hx z{10~EzgPU5{Er+I8~^K%cILlW^mnzuzlQXk_~%zP=ik$Tf7=w>zsdjVtl0SfLG;b? zvs3h6(FIoWz>NP5r0>MPZjQ~r-rlM5bEpIVuUz;)H`L~Tk@(d+8`Wp@KZcKSj(^H9 zTe7A8qmT5R_%FM{Ccao)as9*Z576Pz{f}DGC%D=8SvR z@8o|WFHEOxIhAkT*#9vO{&$LhTiTZ8@3H)2E!yhTcjSwG;nwKlKmA_Y;zChi|6HY; z=`W`Sjy;+FyUT-@1xEdEvx+c?PnGx?2A1AnOQsw8X8iV&e-%GNfB6G8kR~|uKb}4& z|Gwhiy#F`nLnzt6*rTI%fYkZ;bPZxmsbCas|b-E5c&YAyG@lV~OsLkY)C;BG;I?>mD zv=QxJpJ$VP0-ac7!~KIbiN=6UJ~`{r-To9FXLpL5E* z|8)GipmRDl<9CPXoAFPJG5>EPedc7A-|PqN0&R(ZF2AQa?uSMUC zf12o<>DB(VnJ-A+iT@%qv_OZMn*6iHf2wvQ`xN8+JkdA#PZxdd zN2_W7`g}C$JMmxa5dV=5{BLmKzfk+?=J)Sd2mj?R{y7*r#{xSXh{w*CpUH*>j<5K?qNW!$GsPD*^ z*4Icf={uFb%*UGN|3wb|M~VM~v_aXYi2phR*Y&a9U+AL0P4xBrtu~|i>-}^W{bYIY zMbnE>8>f{wy}v^AjcIaErs!)wwpJwm`n;0#Rs1v{`-KueoljhT3moEiv-WR?J8UI8 zM*p?izoEax!GEEH|ChwSZs#-sOZ-#!IBFvkYSa7mq8}whCnch9;#yDR?~;CdIx*;b z%0xd!3(DTij~(LQ)L$(6nMT1h^}i;4r~F$k@mnkl*f{^D(?{#;eC70*zM1NVhwPN* z)A)$D8FadX_NIOZ!pySA^2wWR{cDT@Y@;k;Z#+JC($D^fuu__GEN>aBvV0?Ixfib4{s9}7j_@#IYae@qCHZYFN{PeTV2fd92IwD9COK| z5AS{S89|?s^tq5eJnwliefXN6KKvY(9|ex1&v^QrM<2d+4t?_Jb1r>G(`O8Q#?ptc zO`y;D^tpgO)95puKE?FmYnRYxB7G*&htCV>Gnqbx^qE4RBKl0F4_~{KJ~QYulRmTP z!%Is`>BHA5=`))?bL4z3?JuX#6>>h0_Vej;m7Fi2{X+UIlJg+#ucuE)&TpjsP4rnT z=YOF6&GflN&TpmtZS?u0od1dTOXzdEoZmtFJLz+moZn6Rd+76LIbTZqd+BqZoIgnW zhv@ULoIgVQN9psJoIg(c<@9+%&R5X>Ir=;==l`Jn3-ozW&R?Sa%k-&}^Odw;MW5Aj z{tE3k%JHkT-$b9+yIp(z#arF6~K0nCukFx)X_PgcyXW8$e z{V#I-tL%TH{a!h4l06&c8-s1Pk$pVv`PnODZRx9>9INMLT9p#wcv&`>Grauoq zbL%R{UfT0BEc)|wr>`D-0NZ!oqxM*#@rhP&w-r2OXHy%_G}x@FbtzWW-ZN(p_de6U zYFk`zm9=PZ6EUCN!wT-Sj`QqnYO>mH^LjkhTPoYEUc4fklu02waGdw(TpmBwSy}7m z?6#`vQ&xMArb}P$wrYph)A2%fvm%AQz^5;`#R~3X)4lijgYWo)Z(1wAIn%fD=Xk4T zi}#+D*@@p)wjGuA=7PA@zN&^et2XzL-M*@ynxRpMer+U|IjhpK2QAfg?XLs>-J4~snbkh+9wQ3z3+BoOisotZjIl1gI zn}fml$~oV1Y}k1_`Xn`OoVqyd(dtbZvdUVyC*GH}WkHI+c0|+s!+f>*aU*I6t*2zS z-|f%ZIR9u0Rzp%#Qab3|>z8@}GVeJgjzvz(8D^a*_h+R}x0SCeB-MLYI8dpo(| z#CaM&vx0k{=Q7dwR#Q{l5hv17F|}7!acw=GKgD(NcwUO5;rPNf1x%hcRbFc8A_u#@ z6*?=?s;LY3b~Yt?Z(Bu0;LLGWsFbknfzz!}UJ_sIX@xTRR`gh*`2;it+S+Hq9WNyl zdNJRg9vvTDE-qe8bP^^JmFUgce^%Ik|FHj)$Q=>L3bTft{dt%sAia#_haa7IcfkS+ud8xLi zm)MOz_?7LpY7J@bP}s#e7pbsP5EHv4P!mfZwYB80f7st~+TRh%UnG(-JIyDj&iVC! z7r&fvdQR5q>E{dOrmB*8h%T9&LMWQ5T*eaC$vUhOT|2!wV>9Y}!C%#FHBRN{dhYIe zc6y)a!F%tmbf*OJtk6k(#`j7mx>qRg)NPefcddPU5q^w6xXoIhr%H=2*f-UpET*ho zJ++^{UtUfl6L$6o*REI9ytO`CDbSvahllojpLrHqDe+_v?Qrh+f@`?cgze~bQ_(r7 zTPNya(UtkV9*gtb7e`0V`PorNInaJJ-CDWSXUnMLia^C6I^C!5Y|7)RK;4^N>Y3S8 z?~XceH>xc{QnA>93Fam0U|g*4ACA^8tsSXIn7w^x6Yb8O;_1OFA>2VTwwB6&BqcpK z*yjDTm;`y!Q9kv+8X~z?IPdUH-@$C zgsD8y+0ihIYI$`#Q(5X0E_W@Z=RZ+@NNtrfcAQnKa%zkf{Kc-b=32qhGOqNy>Js6t zevc9?DpqjVBr7y*x*>5bON54HTEQ9Vd?}I%7Qtx*r!YKF+pO$ug=VC2QAi0_x)+*R zWtYPX`F5fB`a^}89OK7Tj8*1D)nko+wB<=|I>~vfXL6(JT+ue<(>3Y8Pe3+{cH zgOM{XXKYUJ`*CA}|D?8SI`tB%`kG>e5{^rws}|K<6R2*t)$7H@kLNQ^xyNZNgfPpKs+C z@oYS?@kA;_)oh)MHFslEQ;Angwo&TwHFoZOSz$02`VUQZ&HM4Btu#`-V@hGp~^&mu-*#3XRT~F z)9SsGZ@-mIG=8h|-m@xkV`W<_>z8?@D2yH>ph(-|D20+F3Fj=+N#>YgT;0pn~dN{D1V`G>5a*=@#foUKQ-7kxX1`{%jA>2yoK&9`*AyNUG3EzR|SzNK?L zp4?zr0xM_wgL{;|$}Ox8G9$VZD0^+)uz!jNmnT(dz1RFiiK4=z3U0&KbfP-44e!#C zvdhhcG7xn@tzdIdA=Ih4A@0a5nsV)NV`tBEac!4&_PiI@p1!Nw@bL|8di<%gr>@Nr zbX*(XmyUl0)2-Pdpu35iL82a2R3#` zhaQh~_H6FJ$lV?Lki%^q`x3IWQyNKb>%`WGP+w2`3{T&-86K+-y(%xRLxtzrxV9CZ z7vehH*T(a8TwD6y5!Ydq=k7LbN6C05)SkPSkzQv<9>mz~jT*=Fcj)gA*}q{7Hw8bp zFn&qwNd>%wYb6;^j+YS!H_bG#97p}_?<}V=<>fJqDaS<(C~MxYoX72$qIBx~q`>i1 zovXV1YQE`d`lN>{8Kk5Jkup?E)K#k zoZbG~>D&C$h;s$ti(Bgt&PpCpo14BjgXS>vlBNcee4&I?J!tV(Pa;N~a9^l1HCZ`{ zjY(4%d!IR&kF1}_|x`g zyg~?tKe6Fvsu1n*$EZ->RL5BIxIK@0jrM#*SH+eKIkouV2?-zNuRo}Ux_UyQ;aM`R z#_ij^)eqCLwh%RRxBGYvAtk$zLhmt(82@_}?=yK(X+DcEU+`_8on~Jo&Ab-YSM|kS zhho=IO;tGG$8PELR`V03{Y>jw%DC|NQ>IZTx809sGXnU558_^@|z9ToAuNK z_FmgW8Y63S6ZdBPXx|Fy4ebcx{>`U!>s(sjQ1@#jeqYh?zT&r@uB#g{d>>L@UvaXZ zFVO91(e2pKNEkb?*uh71B2OdezV%9Z#oM>xamtr4q5J5Bn>{PIy0L>k=%VIebV1WY zL|tjI6m^^$+wno;I-Y?@qbRFjXjy8JN)Dwdn=zf~pat>wcPLAXEorXyE4-0Q~jvg{3I(lF4?Nh@0jrl z9npPkb!_;GJg9laR@PI*mTNm^dE*7tv^Z7)F*PR@l$KUHcTX9oD`U&lV17qzAp%3~ z)?pB}4pgJnszF@i!7AO}XS#*kiIvn&jJMkfn$J~Z9BPK`{)*fEAK2e|u9%{x>$!{R zcwhJF=}LAXosw=pn_>k^WUu||rsV8!RWgQ## zsOr*Ak8=!F?W^y;gY1K~jYsK&UXFL772hiWRC_NV;KaC;3BvVSpzCj|tC5Q!%Ak6vaczcRN-qJCb{P7;$j7qdlJV z63JE=(3}qV1fd?WEcVne~U$0nt!&RG^p(O|c@EcbUsB zx=V;%T783kkY2ydKFF+pmky%RBPU-egEVEU=6dIH_Syk@hq_ty_bPRodaD1E9HrOS z(vbs!o=o5}B}D|L+Xw0O6YYb{`tfwIPXZJenqzNIZX;Rt1b1(AmJOnq)qAyvcG|;l zTwR1H+~3ndlm~|_Th5_=)z(O>Uu7Sp*FUFiEO)YDXW19TEX-vIN2f~LxkB5yOxu}G z2Q6jU{mkV|ZDWYGagw%?N(WKtp<7Iy>nu~V>}N!>?0qV(_1~zD6KC1ya+F^GFFDGr z-%Lkh)6RKyLU+DuGSr>N&$GBNcx!eL0Xk6`Q!|a?O(*QL@&>DRfj#&AQa<@?d|9*>b6*vu%HyqJh>z3h zxQiTT(s3LgJ6mk%q0CehS?({}c8=mei=BhynC)<{)XmOVx)w>_E}Gnlq^~c|C(s`;F(J!FgyIaNFCLniY%AJ)!?XzL0oJRhNaHf$$Bdt4*-E>=lW z_D0)>Y>)fxG1c+|HC8xPj&Y{D%$_Yk@UY6 zN&hSE>3=^u{YORg502<3y6YcCm$0JBR8vXOoCN7lI8$u;1r+*Z{Ek>v}(I=wrYM1#9N^u^eB7w zM62rSIIH(6UvRT;WqrJ_sxFQmsE5R%i^Rd`o2y zJAWt_t6!zWX4ExYOgk&ohO&>ca7m|(4Ep{@!ZGwyj)c>t zeCx7Jg{d^rej2!d%E20W>PTZxng#nsO%3`BXSK9`XZwOHBC7?ukG5(D=`}p-W*_;T zx0G&)I$A}vDw!7h*IOZrmWYhlZDs8&|17c?g=S=D&@=w+fy4ETojm8^?9@s32Ma0M zz%rMg-%n2%SvzkQE#>*jUdqEID6!#E8lyrO*^C*+<2q854x`T?3gKxz{vGEj>q|ep ziK8O3IqncTt!hITj7`-K;rRJOC*;uMKduZM;+Gb28pG0IRR(;0h&)vffeUGZULM@> zTeHl^q{(_d8lSh&v#Z^DKK84RrJ&?(I27;qmqhY zK0QFqroy`_P-)Q*LFmas?d7|xK56f*d4QPzKa`6ma}o!>M4cs{Fd~0UaNDjGV}EY50t8F3vm(E|n+8=Saz_KpgJzWcGS7-t(8Z6%_bI z@e`s-fXaVv8A7GB&hwX0WdhZ|7wISJ-;hRRMm=23M{0R0TRa)8m#-bI*V($RUMr;b zXGUgdR6@-w5jWHJ!%gNs7s(aUZ1Rlhp>YW{TOw|@5!cqHhL+0iV=Z3cbaFE{l$SuY z>jXP!S6$p%7jyURVy>D4*ZI%YiGAbCGXM4VT2>KK>oT0KH;hq}T<+I5QF-Ee(#3v5 zo|HFQ+|#I@pfvu#Wv6k6`flL5-KkQ_?@5bO`uBJt!IMkB`Qra1JfDC+#`Sn6!Siq& zL2q+4|9KpNzs2=_g8ae8IN@^R3#^s{WdNlGI(?3sOrwPUm?bU2jn}x2@3&^LMqp`t!MmAF?+qxY_#Y z6Kmzy3ADa$wA~8ZoeAm?q=aiYs_A%1NVtZxLZ@1xan!ucp&tg&PpGoi1&+1bZEBAQ zws=K|v`HgqDJ8c@>nf=|@*Y@q#L?YH1#?KGg88V8XH6Xa7UdDEn zIoY}&#J?+4&;1?q=cdmx=?T=0^y@aspZ1hLTPS}LbOY2v{tUG9=WNO!dK8LvN~HFc7= zH$4gP_70?G(`iXr4nHW&T205#EF`m*cj#7c?|G^DY=mT|q?UPmKa$FqyuF`F<&akG ziMy&hjZUoI_VYq|YUT08(=u;%ne3yfcN!Jcd#i^LcPr~d?=?@864`%RVm*JMRjZHl zIB#ZA+$&k4k^(=UQ!}5UpU0f@C<`jn`4Z*Bd}chKG9xda&`AW8dAmKz)U2$J0@Qu1 zEv4MFUXB#8jaKh}se<;EwZ4wsQ+?3hsvWzf1Fhdqu!8SeKYeUvy+?`Oy+Rcl?@)Tx z*?l6YGB@ZnT%DUB@X`=Zno`ks=SPTwG5? zv(&uQN%VbJDiic}D`J)VRRF!+W~EaCvPqT_l1B--nDicCIcw3HrL@z-K<-bgj$Ix- zg+HAW5IEneUA&wn)k3&uDaN!kD>pT2ozi85R@ZrJifL~x`qW;awTc&LS$_`)$k2o$o^-r{|fehC0V_I{SPD4H;ey~?0?Koy15tA%}xHxm($Hn zl0!*o1o-bI}&pFC%^n6jN21_<>>KeXZc{B8?xnEOtWtyk*IohRrD*sNqOi$&*G$D~~g(lDdVp5Vn>$A%C zjr1c1qQ`9LE+US-_?$VeEI)(}hh@@XUSfGCI#wJvRCp!heOVt=u4=rVCP+TgO-AGA z6shj&Eq!&oFk~}-ZKDOpu&MS@=4Ys%K^^f$|K_;+Ljz!vraJXH!su6`^viqt!3x!6 zo4wT?=n=8ido$O0w7mCuUP8ftyr6<6Q&w4p=kZX;Tg9&zAih26Gn~VJB)g~mZ2Ad8 z8Yj3Ud6##>2Kr6Ks|5T^qYi&6=hZos?zFGy=N_L@qBqSMOh@ZED0BJ{zK&G**B`X< zIc+Pc(0HG&ujA|9YrY}};dVDK`Q>~%w{PO$S}O4LqXrM(2ua><*-122ltPzz$|z0t z>9Wt{y+2r%P0JA5(REAVAv+i_P1S=si~I|cMQb>6x|X8JD$e(~vwmOy4Odbji}dd( z(T$Yo*Sy#A56}2lP1(#cvhs_ntd@UftHjmsS)zXz)jDO1l{wboV7J0^J}XaXoia0? zK);en%^wvip`ZBBkKPzc85NpMwPh~-kcrM{X&y__QQD}iZz@w7)%tOYS$+9vf6$&F zqD8A*d5+5ZA;7glAT@Dnj<p+JZK%S4`i|K+Qu$XRAWmy#n29#Ue-XBy;`55P<>Uq zN|pn4GlcJtOvYhRFnLh2y|qe%N11jnhHDc~zqvAN|TT__i#PwEUs| zs@;ozn39=Mr`GVTr8a3)sFD^J(zJOK@f{VqicV-Tz+se5UuXf{ZgkS6qpqw&3+&sD zE~VQgEVLj~9Y`s)OEa0F^;b>2&`?ZlOl-XgT60CtCm|DF%&PsmF`?UEkx_EQgcdU) zle!p8L?uQ}><&Ifi&93>I)?H;9Ig8)bm64_c|VeBMC*grawH~pw61OkOa{}*0Y+;} z3?}v&Euuxy;#WI_qxBJW3B%FKIPhpaw%^fuifDzIl+wuoMr%rIqebIJEUT4NR?V`- zFU1RUtlE#H8fD9~A13UwH5;SV`@p01V{4-obtlS+G;}l*!w(L4#6X>m8hRDfM7k%b zgMW6twVonKUH1?z;||dfeEqOwJ`c{IZcaCP)=Q(0YF_t3-6e}VB@@!=smqUikeNYm z0pl(o{i2%sDD=LoH0s09Ae#<8p;u&4C(6&$8EN!nChZ;id_a;gsX3})JMxAa`bH{Z0sycn|IljuzRvxQA_QOY9@?DR#0qc43 z3&VCc*(bK0Hk5K_UJd=|l40kFpTW*}`^2_$1D&|oSwWX?X2w(iE1ifs%p+`c$?&+ z?bUG_Y+g^>hiva5l`) z2>*C@{yn1k{~^Nvnh5_Z-TBu>^B*7KKQh8U+nxXDX#Vv-gwy|_eaPwG!iUc3|C}yC z`p=4_|FlT@Ig?!UhefA4dSw7L=Z|zuqDLK_pQQJi*_#><=;w{e^qYt1 z?mzulN-vmgi8J-SOIeqaM-M3Mg();xa(S@~y~=_gTKEcS zF%Zv4Q=?l+zn|I`PwS@QtgJUHXuVWDEoi8VESB2ce)dpaEVYGx#P#M5s{eU?1HVxu zVI@5=jH6ez^rV$6)KahK^-^_K)izo$)qO3e)rx!5ihIYGRj1ZB(EBfGy;M$9=T!Si zQwqKKDv?(>xV-_2Uc!~w@N>A`;&mcJ<(zF!|8#`1Hl3eX9z<9AP*3GzYO9NSERFZn#nGD` z9^_}vE7}}O=L_SL==)h7X8MauiVDhy7Y9x`C489H`;-)aQAI^cV0uAGN?=ZD%9MgY zK}uO^aY>*erJ}5;uy|^5(UgAnVgrBe({rhrRP5vhQ`8>Q%$^|Rgz_{M?p%*jtv5o+%smJuBKv7bnckW4$p*Q%{qNcms| zYdAX^ibSm8Vw(1#{93B>s9_{s@rM}e-$lH)nN7@f~)aAZ)!J0%ms@mOtK|lI2 z=?18%CeUwM$-eSq)fR2NP`?$){*9@;gGnuOvDVjIM^;n`4XSjiGUc{XsOEj|O_ek@ z@dqDZwa|;qI_pJd?7gv^>&L?N{III_ZWXfHglzrZs89_H_1;Yt9KEkdz3z)5noJnQ zcLMK%HM^->+c;SIe_Z)eA|6dw*Y4)n(<{EZ^-cFxt*7^ZtxNQ0JOFjWg=#pA zR!|A@`@q8Q1j|gKIerxjuG!(WU^Q%-mdagqOAa|pQ1J-XbSF?^;9QS~ln7N@H`P)k ze1&7VGAFY3yTWLZ2fZrnxNv_@7*R?%>!V&9M#V(2gMtZ`FHRyY)o`6%+xItC_XodL7P$H0a|#&CsKuIU zjq{1rg`i^2?&xu3AeGjSq|tbD_ThHlstYT-70zyT#jDI5lcprOSZ1> z!zFaAm;_bUNdze2i|InFsimY&|9|Yg34ByV);8WrC(tbBc7SNWg*Id~5tpE-iE9FZ z+=h+@5e!r|C7HSCnOA;j55xF9nHr4|Axc?E(tN_uf&%bkPlRpSsN9+g#j^YTKe;59LNQlFoMrl zWhAa;igzR(K$5rm+9h>*_e-OEEi&H;EL0ZqcJJBw+0Lq+FYVmB`;(np-qDqDOG@Ou z1Lf9!X$+$cJPA{|8FMegNLP98w$yva7X4lQQ(QW)7ejd+wQIMXV*T#DJGboo@ZI`% zcI=#I9D-(l<| zhWSqp5F*?WD4j$BrMnYR{e{q0e;pWJfDb|M2re`*_Bdp++B_NPsE z+Wk8ScN5&CSTOk~M%mq+;Sp`|kJ0Jd(&C@W1_6*(wPo?o4BqCV{Tu25yN^d4ZSU_B ze#7{@viG-r2J#kj@ZB0;hf9q8b@rui_NA|s_e_!dB?S; z|3VN^x9NvEVQ|2Y*5eS>Zwo&nnFnG2xPIslIqf0Z9KuB>omrx`LL`h4TD@v+G$$FTMW~u9=CxQrO z;aoGYd>ImPdOFPv{2H()3Xdv9X{(v<>T=x@63(lP2^EvTqa~Mw41zFM_Q=uX8qI$4 zI_hY)6V^CCg^~`W%!*%zCKkK#mx#8O%`Y$(qTTIp3Yj!Fo1RdPwa~Plp@1vf6lqXdI3}b?JsO{Kvp0D zS&@L0q}d&0O|@NICdn`kIYM7pIfUFta)iR|L|EXz5Yuxt@MlX*(tW*fZm7feJz+?) zBc7X_@px`^Cf(J`ac^8I+;ijU(-2>Xr`3V(y&Z->)XUM((FOMp9XtM`m*XuL{oi$& z3wk*|>=gfbPe;vhe7<^I(uX}A3ldI-dso6aC~KX;RIeMI@NAT4rMnN@>)aRO`Gfl$ zlv|Z(!2L<$IY|3;Hz(3A>3#{GUnQLYJ735Dg+8dm)u+Ti9OF2n+jWi+@gF*I5DMdY zO^j==6Q+gY@!S*Rx+})9I5r;7yJI_j8|zpf8;@sAY^P<^m5;~s9%rX5P}OzD<5^EZ zhW@d|LuUaorv4Ys`)onc?LF^PZ%Z;-ocH+`WIfOcoU{RInOK^&(zZU$o}Z!8L;Ygt zTbEaPAlmYT^(d=L_xxl<=_UI7O}(6_U}FOJpal_DiLga2=*I~4_^q)xe=`wRB*kXh zJ)z#x9})TmJffLQO`Kw_?4JxZN;7!URptw!GX&M|V?I~be2vFyxN?B{ZI4sDSzk@N zfajjDtV*=o!_0ccsGx;FG)iFumQ^?xU=Ix6nr|Do87E=dR&}=B?I!lIngI9Q9{Sxb!1D8+l3x!{8mk_i74AVU79a7(y zS0b5n-V=S_;9a8c>xY)_$LbVBf1HB&2xk#(E#EuAGhivY$(!|k$?2lxTgH|G_?^wb z5OnK$)L;{8kdJc?`OV&}H%j0421>CvclF5*G=aWHXkU&or3Wl$VoTABTB+lDS0Tv| z+=KH`X+1S+YYwkb`wdMx0-8_r{dXo??_f@W{1k8$MKt57W}q0&cpIB>>igCch@|)+ zh46CR5zPbD+g=d&Aie0_R>S^a_(%v&jD(II;8=)i5Q{QR;7|f@V>x9SF2ssCh+ahb zwmu3>KFX2aIiF@CpryWO8vI)5i}IjNguZAPouq4jioR%9SXXzqP#3)byogd4JrgUV z*6O0*Hf(iKPTwJXjfvI-+lU7L$@-#fj0pMGJ0gLqhrTFVE^4Q?mA>dtF8_%7q9)N> z6hMWI35m|2$>w4Z-jrnXExYTymPMjdU#peMr#4F8uEecWK944GA@xOz2w3~U&JRp* zVS^O|21%)DCTgLgAPQ}@5~VLHnxjRGl98YFu~BgywaSAPsl2O(z8;JB-P!npbx?yb z_X31*#K)x?=@qGE2p3gDs`NnzwL;D}n1O4dKzSv2$Qk(0O`T}^uf`+mMVzzPYz8u5 z1jk>JIuQarWAQbRD~JV5sT(xxACXLr#56N-x5~|r!=@lC0wT{lP)`-(08b@&?9VYV ziQ1Xx>@~_qU@R+8dGT5p)T&5O3kYf*d|HA!lc3IQ3F=G%br+f^3e>w(nJMhQ6I96! zpz13~vY~JBfn~||e+6Pig0cc%p;kl3RHUwfPfJjW2}*HGP>KbVvX-DclFCeVt4VGI zWs@S3Ez7S*)KK~8|BBQm_(=KwyH)Q??_s^lJ{t&3(7pDAgbD~}wFZItY7ittf-oRN zr(eiMu#Le-OKZ@>A${Qf5Dilu7H5W2$9LI#UsRD6N9;}}y4i(xfkx|H=tdtSFnv4#XaWM$3*@B|EDtot?{z`O;0yza4kz%Gri3R6Z6rJ2Eeqqb_ z#nx~vMs)m)R`H9X39GyDG+|@G z!Ahv)(t=7$yu)=g&_`iPNU@oFa0T`tvx9AzA{C?~rhvx3v<(R;B;j0OCl4z~WAdPPT;W}ryaul9_yyiS_|C z-+;G!qLt3`-`v!B{zvza&hz~4)OlXnJ*4w|up4!r7k8u1^So}Xo?mph9nZNgy6xYxIxRv-c{GSwH$4tWUugDE;VeP`e0eW&TG$ z8k5K2^rIg@(}h~=k1l&|Ic9D0|LgRl`(V`*!maJ#>q4#d@1q}mGhkFy^U(cv1l{}p z3H|71jP_7#l^=t0^MCZCfp6qt4x=Bv0}-H%z!fkTh5v?ALoZ)wL%F+M$d6lD|1+i+O9BrTas5}EYs3E=RpK`ru0g>)^H&uI0b z;JF(ghscNO#ws7JAG?TUD*fYf<)nV;Oo8Oc`p5s#kN%H-bO?X`qaQ6z!SVC|h<>y? zQa>7pFhSJys?Xm1Faytt=t-Cw`%Hw*$l8jNcI3uwvVyYnXk4#XS%}}-T%a8*l=#7x zKHi$aV5cBb1v9L;sw1frGq(MUT+6_+0?jeFAhC(iqpV16Mr1S4LCh|}dW89OXqE5Z z>P>&gTm6I6XFS%BQ~ra~So9tECNs3V5tjvlddvOr?V6Q6cb)#Zw0wUU*Je_49 zXNQ@-6KWt0X7%UXefh?um3;nso0SKRiiw?I_J-E&#=v1dqk?|yO*IH`5~uRmR2}|n zP5;|aBZ&bNq61#Wx`O4v_EWke;6LHS{VzLJ8ZUjeryCkV?Ha!QkbhBR9h5rqqde zLc%)1I00KbJS7IuyZf{`0B_(h4V(i^jcnlUrXLNw+YI6$TeZaoe${-zZbb9c1LYr~ zX}d!69~(Ha#=Ka#Cgd7vC=npv1cgmBA1>v|Q7qc0a3q0O>+u;QZMMCCfX`Q`<_GZT zaRBxD7yjP}+mArwurFx9YdzW%JX$U~p_zH0S$k}uqYjU5h3JM+TjAPV7c*gyF=`u} zquxcXwAxX)4Y}4Leib}M@v(U;T6)wg3}4U3i-=SYxU(DhVBhYf19rl;8S`hL*2sVz z`yC71hz>=oC+))j2RXq(2>fD;n0-YW@Nj67nu^q?>A(-ldbJ_N5G6H6A5!xlr zWEC7c@ZXI8I{afR2;G>CAoQaLAEQ!DJYn1kPYBoW#KwRcAO6iD3l?q`Wj;-Yn*X@5 zElwcP5o>sbn;CpAwG4sJn0Sc#l7#vHu!>SS|&oDp;IMZ%$9*3Dpt!j8Mma3}u1r0=S zw%D~9kAVg-g(&PZW}Srs@ICsbRI{=B5|S4-6!-U&vGrXt8BwL;paDw#X{3)xBoqe1 zLii!UNI|tiA|=R3q1vJ;1Vu^%!5W2;bM;nSM&?4YL@bhCocaaacudA2sShOxCnf7t6q!`+I8 z{tpj^vgoGKJ!oPI;vOY8_CScH-f!iTuuTbCwrvkKvsVk6&&#$&=yjef^SOd;z z#sEm^<$zH?pC7lXJs~l@p^1+3QuP6+*LbYf>)&ctZZRsk`NMw4J*TjNy1wGI(lgD# zBdRo*(Clrty16Q9)>nAYGW{gt(q|G>D{ zG)K*wwlno;YGvx#W-hRJsz6(@71jJ7v7LMiXWuy+$tFbYC6_V2FL0qZaG5VK8y&H~ zJ!Gh|2lcDgtT<1qknSq`&LM?cHF2 zzLnF+7htnJtaNBpJ_{Cx-B5*c(6>g#-^8QUwPvl`nTCvYJEL0!d&2E4WIPZnW9keP z35;QLs+I&&tYC4x^}VEz$Vv28pEM~45vd8AmQhOg*yF@H0}FYH&lwQ^RUwXsDah4e zS`KqH1q~Ru1x=t!rQ5CEI1&kZh54e$=l_Uvle84bDc}5o8Y!%W-wx#^Gi!Z>TWTP2 z&#Xgc5?|xT4ZyBjT}l@KIjqvDbe*;C_2D!DNH&;?o2~LjzYsQ`UttDGLoL1=ua3a~ zCsfyg0x_ro|7`3uGthQG#vuZ3g_X9?N?@i}?p!N<7^4yUYE`9wfFpyBrEnll6)%)3 z&1UmevApZQ())H!Utl5z)%!+;E0!SKt*e0JA|Sj3eSv^>J4o6ufyY~k!Qw?i?7stp zD{!uvE+{PCu;gU3-+vRGY2&fCpkyPPeRpCS2vgQJ7B?1;my-@*N+g_3KgPBkZ$v5v z={+=v9mnAj6Rdpx@-+yAp#>b&&7kDI9#&*!U*FbaD7eg0MDG z`VOtDRZU}wJf3p1G!Ldip@XnaZB(8Fw2m5tUBsj1AdI5W7H?f$f-$fktQ(A2x%s*p zlN4T~Qj;;2a=~#B|GUXUg1t%mNbXnXWXv->BH7Gt29rO^;^QSg)-&#h$YbP(_$>T@ zpYN$pV`RgZgN#DX*D!LKW?{7OzZU;h@cRM(+wd==ZJ9Mf4nPYkvys7l99{df8QK0z zqTAm9Bft&`x3@$%TzgZCo4pg!-qkJJo9fF)nAEI=h_l2@$Bz8F*jZ};T*ww&Mz(86 zu)oLVBCO{@X2Sey3vLUx4Yi3iHNk?BBo%{c)shozdGS!0RM3*uX4a0<&(XY4jsfcd z{IX7E=9=_bS9~cS`_UP#yV`nV9}e_&6axIZv}Kt13W}1l8Wqz}DLtQ2t?Ll<*P^n1 zK;0|89hq?o^?$3H0JMrU$_pE=6%U2vnyu)$nkEse^aJY-M6-txyU!j*Rx0NnwlJtb ziB?$v*#TH!-JI~TSs&{WW|6*~t9Qgq*1e&It*tD89sSK#9HwFu$1kYlfC=0iTKZpR zsw3MoT)votRwB-uL+wDKfeJ`|GVS8*8x|M1pBkDFYHqa-0!rN&(vpFTBWJb+sF0a8 ziH&=m(4aDSkY5<2IK>gDggwD+!UTtyrSDniAS!B#6+kxm*~&}|AL}1@NEgnY5?O*^ zyy`w)JJ^o-)A}B?LbNL0jciy!URKYot4G+aGo{5^H?69x(hQNNors7Hs&aC=SLS>r zEZWef+tv#|TpXMdZZmD0o_1tx-hUnA2FF&o7QDuij!R-HQym*!mpB|{owmlT>*IK{ z^CvNjQXRXyI`RCf>j*rz9Ortkk7H4S6VDayi?Do1yvE`9C^2PAAID$2Iq_W3{S=3z zw);7Z(Bl^l$I7I5r2AXaDF^yEUP?-NvyWrV@umOh<5+b<$CZ5?pPt~vvo@LeZBOp~ zSs%w=dOGo}>jksvwI?!g`-#2pOLg3Hk`vG0pF9egy?jbvM7gJTKNR;v@8gj4VNW7_ zUiTzA9N&1l!uz39&u8wZx)42(awd{)Pw5JuxqTAhrb=qYCkwXf*9`*g2%)lFiEhI*o`H?S-!vUSccOs8}Q%{SXA5V4rv4O`s=edE2TOuBK1y3cP7L%D18}c_R+0bkLfuG6 z&@N%`Kxaril;K09xhd6yW8)Cc-K56#;Ku3p_-a8x{)fjC;1sGA0UoUDV#9Yo=4@H@ zgZ{WtW9brA$6Bdlg;3>CJBiyemrcgNrYHA< z^T-d}#0zwB`|zt|$G~Ho5ptM+v4-Uv3v8hP%s-=_%V*IJST9ne@>#S4CYMB)&*FYv z9DRe+vADF21}k*29zlR=2c3R>IQ>(~$@GjCojwHar(l3AA1a{r2_$2Wb(SrcA&y#O zgqtd3N9piOMNO7+8_Y4*A5lx4UcSeGX=6g^{S+iN)s?p=C?`ScN~f%sZ57;bqumFd z)7lJ})p*5ndzVq!g^Zxe#-W_d=4-%VXQM>T05C4q`Vmot|06t-o`#cj`X=RM`VZ;U zV5sym7g%4QM&gn=;yr%pOP1f%Zl>NsH_iiO!(5Ose3lzfhgd)E(dGMJ$r+LF-=vSg zG@}W9SVd#yps4Zy=Mr2ZUQEkQq;wBUOE8MDijPsmvDah`x^A8%UJ(Gmjee z9fAe+mtKD@r2$@^fXaHsYvk2Iyki=Jal9JqB>b0@H)Egg0JiT!qL?z|$)A7>CEU<1 zhKs%s$+-19nQxxxFtMyDgPTY_5lZ?|c20ojW>ANtKo9!Qi{lDd3Bsg_yDNq;Ef_-V zZF}{A7tPpXKLyl7MLP*3L>*&*|0w8M2e>lOA`!^G(Ovjg#??dm{mEPm`5zFui7f5z z=tLL?p(&A?R_L!sm2gMG^mB2FyaB6@0Sz=$62J{Kel%g$j*^}{bcO(|MzWENGIBEw z0W&_9vs^fNX8O4o1v`p(-Xt49f0hju*)IWIQ_?#lF@_S9HEbk*4i8_zgbOwWjLIe; zhkd|2s3eP^x0oQ)rptI1+2@PI(ZNR<1ukgusIYU4mk1UW_5s(Vf-=wcc>0R7u$fN-{yuc=uR z^0k4sd~KjDUmIx4*QSYljpa(VLLU^qg=FVv`yehZLkwD6I8|=r!2DU#S&nQ-Dv=h2 zg=98n4ZuKx{u?ljsX4fAsp5wD#Xxi;_$=6Y-FMPw=puF%_s^;%*H9l2I{s9}+cT!P zF{j#+r)NMNs*s#*PEVLoS2+Qv%J3bksBBx%2PCQ;+ZHM}1!bTRb%i(&MMwtW{Ssi7 z4Zm6a9rv1d_{P28{;Jqev+)b_{U5{Jy%!e*mYnMiUhByZ;tnWWyfQttc>Mu z(J|Cqr<;Luj;5tl2L6sep3fPzSdTIxPNMUfCBzp?QyMO#s|)l{@x(gRQXt0 zA2V)j^!dlPg&W;TAKJhRAka_4i)6F|c#=hTfhYtA!k7?F!-}ad>z}|u&391jjZIX} zYTP7+bUCpJ_ld|LX+M?758Uj|?|ZYWWVm#`x{PTX8dK4Q7d&hiTm)3o6U?nz zAJ_!K7o1t|E&mwzZ7Mzs^Z?XBV*uuIQU_`I3^SlFIm3l?jo4nd4U?^>h#y3vy0kHL z%pR8IkjNLnx}<%R28-~gS;u2W*XxkJphxA+xVY#t zmYK|$(HBgGDY4vV6lX$PNsO9-oysQiWJ@diNd5fPUa&1GxIP$o4#p)`IFG3qq_;s* z&g19R5Tm|b`T+#^*qIrIk9WDNNUURg$hE-$O+$R7k?mTf$$Gc+gM4f@p9X83f+-hkt zE8wPJ3>gO668_N}pez3JV8t^S5+9Q%3SYDp)^W&{|16ebA zdUSgzc0OWJ*aP`v)3_P&>~$e71`5;jqaI=7F~Y{XN`^&@umFH-IrE0*Pkrwo>_%XG zh3~VC8ee+$6%umv;|s*-D8?6>FU`uwGER-JaQ)lG*7|_*zP@+5N^T?Lp@!mppnp>R zb;;}v(wDPa(HG)ZSW!~lDuz*bCPv|hSp4WigBT9vN%FCR!xlk<7vI1G8_7$7I-pA6 z6J3p`gvT2e78q|_S75;*@Ojf!l zK4AtvmM3HH@y%q$d?z_&X{uvGPsUu|E15pMQhw;;*m2_ZaQ|=;<5ZrUQl9E)Jb4t{ zU!KC;?&%HOdad{AFr4l=&Efdi11-*PJPdjGR6gI5=fXZuf;o%$u{Zvg?NJQ_1TClQ z5dF0IAw6GzZ?BeH*rRIe{`q{&LA-z7n^kR8{04RO`Ek=Ll;LmxzI>0TwGe>nLOpD@zXrFmcskS@sU>Bj||74TZ>D6J{@S;YmZe`ytozCXwVk-7fLJMi-PgDdcg*ovo7a4NXnjpr8Q?)5I1vgq0m zEIIBbY8j9-%USu(bouoQNnh{p|26h_fLUd`It;^FfRiIX0yPdag|#_1@=1n z0=b2B$a@P=AS|4WnHU%z2P@W|e0HTxuWGmw)%TSJW?*d+E12fCZj)dST249O{s`H++4K`QLlG6s5?&XxhdX+?CK~;`1-jwqQBUMN;L-L^c z3mrseo(z-XJ5UiOk6a_jEllm%_L08lqCH#_B zLXh+rg5v6>&IS6s1WrmMRzA&$0}=L-gqaLO7u3=lhd>x*4cunn8Z1bz!0ypt2rZVf zCdx#Us!AXk>g4|A^p-88<3wI2xtM{$Sl=NvcarvC8sJV+7Iu>Axsz0ng&p5bxDQ*l zl6qq+$pas5C3*B#Qbxc`_M4g9Pe)D%)nCVGwdY# z0z+KB^jZk6JjSA#z%6Wh#QTEFt566|^_#(&pvAj6Z~9=P*$=V&w`TQw@sLQx=cljt z#cc6mb`K8oc+0>&9#%%He{_0;5LFx3suPC~s zEG|vVMpkf8*z!ARBUs0#fWQNm3c$Wy`o6|xQ?4r>2EW}UuvTBD(@~CxbiAe-=vTf0 z=~&6#NQaHDbAaiEL^gkLqP!}L@v;#?LINrzAR%^H;Koe~r*F&j`mb{bma{WK(_(Y{*MY!^9SPbduP%j& zaofH%zH5Ov>jzc5Rx$turr|#Z|6_sk!_ZRc&}WCb%}RxQBi(_*WL>y_ByKz|aOVb= zvK;9C=K2flV!WOf z>}E;RbD1fMxCLUBk!~r==O0E#KgoL}YO$Ji(%}0?X6E{b*;O+VZ}UJ%EXh#YGQ^`h z1NjH}fwx#GN7xe9UHIkoghuSRm)uSmW_+sr8|d$l_TX5}w#O=)ytJO1aAS};fhBh0 zfER9FG!mhz$95MOP4;HE-LGq--K{$?6g6EKz!K_=`M1DJ{E;mvYz~Hc0kC8k=s^Ln zWLPH20IOppf@lX>6Kv(X1Hol*`ORcs`irD_{sT~#04ZyZH`BLy{p)#5mP9RU+Z`vF zT&Q6Cz&{I<#mpbAk0GGo&D|M5W1qhR$UAO#VfbJuPS;tr2yU@bGb-W`7bAvagY%-6 zuX1L zCcgY?1`JAMe650K<7r{}vRN)Ep}L@^rYuQqR9uV6&WF27m`7ka!G-v@?#@9#_%5-frn;sP$e8OLe~V{wOJFT?!rcYtI2;`hUzFerroO|L!S$e$o{ZY>P)g2Gn#wg149QLySAjguTF9C^Zb+{u0nv()a?aIUK!#8*m8XeT@m$x1=Pve?VnhGtk9$tQm;O zAHvE!94k3w;GVsQ348#@RSuc5Cj)DwyIIW969*!SS|;T@2c&gymE*50V10v|tDB9u;`ch-^{U3snC}fQEdWv@ZGRI@R1@_zbQL}L2pWEy@ zPAqd!=GHg!)uTc4>|4NN5G?dkEpk!|qrzHnw?WdC7HqmerADW8t!C5dEn~AAxlYCG zN3-duEZOu_4AExL13s_;gJIeY!_);IPzPS&grQ1^2?|CmP!gw5MAJ*C9OCr!mTv-M zy_zUxRC2!?m%6YGz-+T2jmoXSA}&3qWb;-Dcp=ql$AuH>l#T#^#4g7yksk+BKca}}ravrYzH$ULmr)MlgNB9f$F0Y>AummBkD;HxE@ zO7qfTHq{LNL)kcAy9NN0Tjj}MTYiQyL2nJbUIbw_RGjN6;9S*s1&FvH1}blCx$q3)Q@eP{UXE;-3wAFKPMa6uUEl42V0sf{+DIuRuTy^7@}D@tAdQV9vDkbs2P zWoSOtbSm2I2d|o=#x(mOf>%`-r@EQ5mGG*>BI|kLB5qtke2y^-hev>fQfHafWvlQ~ zRp01&T(t}Il`syNT=tqlzQBfu{r*94RQ4Wb{~*4-!Q51iL&2gJ$W+FRXtWC$(hRqk zRV0}ni47H>Uv3id2J+HEs!hG~12d>=TXHlNQBNmmKg*iS8k8dbu4){T))hy`caeo$o0!?Q9oYr0uadzv8M&p zLr$0x^>ekXpJJF$%L|XCmbri+AXl~7^@PItx)sDX)R#aS6;Bh)pQU$tESD+=<J!7QPU#|4r)hUU&v{XI?Vv^)t0sczak^BZ)y1X9lV$ub zm;Ss8_ku#H6Le43m$=rC2wo%83<33KZ89o6ok@CBJ25!m2&`R&x0+tEnlKSzx62$S zsmyWvA%TcRhEF4k>BkilAI0m*L~*@VwvaO9$AN;eEDfo5bt0yA`D(U z8cBpK(p*70gE)gZ%6t<)ui6Ej<4e-sg!-@9N5qVu~W1Cl4X zZwOfmWz|`pq@#k4u4GBfE)_IfVMj@BbjCDN5Rq|ipdg|OPHAJ8>vMJvW8y3EpCap1oBh6@1r741{ z17FpemMi9LEzhAG2%1gU!g@bc|Gr>QiN9=u-oi(N`R&97g^)PCH?7(NHy$#o&;P!4 z30g$Y!@9Gk9jUYS8;iFQMce8uY(}Dwj?hmt4oA7sPnp)=0Ns+K?w@JspJ}d=3Aorr z_m3Aeq~){?xj95}t=8Z6yj>3(!ck}XYxLY8-LyHMr>r$g(MDJGny{qZ{j^r~(|-07 z_$Sp*gQNOM&C(J5R1As0(f5-@Dt2uBl)@!GCWXUHvH*`Uh(Kqy*-;R|Ux8Xj^w*LQ5#+dnG71XvQ5ABM+g2K?>uA1hn{mU)>!Vf-+| z@Hps&@zeN^B>|X$q`HY(vuI|cZ4OzQuDFRK?1iuew3Kd z9zWr{ZwB!>hA|YHKO=xQ+XTMPu@zviFVVzol<+vc4qw*ip?MCsMCNscP_*J+%se@P zyux5%3=TtX`_3slH0H5OYG{pfkC0|;9%58$*^3$MQHQOiX~(PivgNroVE)V~(ag+t ziDqU-NC)0i(hDUWP!lgU+TCMDQJsWCKPNDw5Xe%7mQWL)9$M<2+@T={ymt*WF-J%CxVNDK;=Y)2SgB~&nKylfqexJh#RXCVwzL5 z1m^G!SC0%yAH(8D91hdFrW+W5B|iu!*KwGuBi3=YXdbb-X$YWmQmdCM^j_|SL^3&?>PT$5Y9 z)Ycc>9%&}!J-msaRu)9n>UW%F%dl?J1bUoJptWJw@KAdLejEUCo0JXmmo3F29L=^(o)+EwI`NtwnE<PgtV#>~CzaUPp1E4=UZu6rm5dG!oyXm%Tw>1p8AALU_q3oH+Jqnnc!$miC zW8%iIE!__~ldpk7^ydkv2zR5j z7LQS#6(#VtlI%j?kIYl&(3k{;%$Pwq z>$ef^7lF<)EvYUKo{w(_5y;lRh}O;xLIBF}1fUwnDuU{it3G4gVcH)L*8!Ou90nI17f2k zn73Ss=R#}{gC2h{CaI|ir~Pn}q@I_ge@oBb#wLAV+N!wn0B0>-g)o|Wkg4W{QlJleTGJqgbZXT-lg+WFEML*5 zN#BieuF2>F_vaZW;Ti0gGN;J-ZNFh~|NcD2dGNfX-xN7_oX0r#^zVV^>i#K9ikuIg ze-+%-7ckD23zF_Ba+Y0qBHV9YNS}8uOj%Xr+?L5Wd$Z_sAS>yCBIlZmq^ygitcz3r zgt9JXSxYWG3#IJ2G#<~UOV0vS>o1GPv+lBV8&x&6(&)3?Dpv+}KIu2Td!v<<_w{xOmY;+BshQd92aPbAyw|PV$VO zIu#K-S4{Ct9Y10G)bW$Y;jrSZV{absnK*VDPAQI`?737z#BI+H;S&<;X4+w(p=Gw)X3^lc%JzdhGs2x6;Vy`9FNkm#fi&ANWJLIc11CrnAayV zJUDZviXZwm_4hgnFR#f|-*)3GJXJl?xKkIcJ}pX;qDpC8g{m(>IVxTRd}0(nI`tJT zQ(HutsQly#kLXmi%^B6c9a|-`5Jd(s5v%3-+FIZ!&KgK%{cAb2ZZZRLzeqy@n02W& z1M|x0PW}vJL00`dm!ZPS3(l={^QDI#m4bQ4VK@m>^iU5e;!p=NlXnBM}2UH86l$N%-KE4X^12lsxGm7>tA5 z1b)dHY2RUtwUkS}OPDVpoLQ1-!Eb5`LBYIkm>z-a4RbDiQ~ovoXI*C^D{e zIVZ?WjJf+U$W;zJD;8u4#(eI3@a`xW6Z*`k*m9nVGKi<9r3_>49JU_{9>n8pQiU0} z$v3kW;ri6E^37aDo<3t3jsn3jH}0hCkV$n{;Z`)y0F#|I%Ys;G(Vw{YE)<#%qtOJa z^1mRtA&AszG%7lQoJw&KAb#BnL{!Z73xR3O-D>-VKsDymD4_N|TYK;b%P%=z| ztgZAZIK)2dqi~3Q)|GG|`-!llSM1Ku`nn`nDv@Eg^VGCZ>z*PZnW5HAu-ny`x9CCu zJ7*IqWq#J@rO&ZhaH;kG>&@bB)hxD&@fX1YK;DY|OwybHcjRz@CF?~P&cn*zOn=dw z^DSG`nD4@L4hl}ffNw``U@b}9Aew031l?AsG&*@I6xqOu3!iR$ z>cVG~n{(E)bT4g)gM(t-aRyenXq+0l0PfZ7Nw_D2q)b`KuEfU#oMxV~mVJqj=@_R| z*0D43F)N#C*qcmKz%=YmrYT|?_9xR6GYz{DAJ3Nogh+NZgp%2u+lY18fv=oqyYzKUoz&DI+ zn6R4&5DtIJt45)n95ZW;Z;T`Ob{@oNE%5Ch-PjTT!8hQG8%+#EfKkOME7_Su7vkI6 z4D~Uc_$FEe2$@BETV0?+CKKOQvO}4M__nrKry;(H*#V{@zO7!OLLOE4rpR8aU7>7X zXnS{s=4{~TF|(Ez6ICjQ$zJ&KT72XNRxiQJ>)*{|3zahHc)4ZY;h0{(*kV4Pwdnm! z{^2M&6q|xohzy(AxO5U090Fd~m!@&Xi{ug(JoXEekY39bk@-wGRdXDouV*wEHmWif z{1VY{@=sPNm=kM_`Og6~%-I>p*=8y*u%sX?+*)~MyBmA(Tp$M3K#&}8n|AFs@LZl` zjHL&&Q%j4$x+1v4cFZ-Ctk_==84T$|vCEa+p%H~z??49Lz+ktxFLbJ4UBT?jGk@!i z`F~62aJdFrmALa59u;4B*a~&B;KEF_3O$JuWF_@};xD;&k-& z`7s|{5t!u3K&vxVL=!V}iRGv5071pn zo$HxN&iO-R3(G_GaL@YC23+M|07RJ7%bmm9(_zUs_u}F>V_{ElYsi&#h>RU5jKlr8 zE^{0Xn=7Immn|lS%bSypMdT@I``#B^S_SU8-;d_A_O0*wD?J#VW&n1I{cAJm z^uGd*KS*bzNA%0^IT*A9#*umgl{*-T+*6;0__LrG`#J2UemNaCluud9j4%DSMj__a$P$e%T_32+Ac(}i;s;=V zd2_5$QR_w}0?XNu_BIYqqDkBN-v!2G1A*8N-s%sWK4+2AkMfO^C4mka8a!z>RFs{j zlVi5t#O;?D?u*h-W%HojE5Gi|f$#n`Rz8U$A>|5)Ys0`&78F=p#?m8t6O`mL#FbSl z)?oEqNfjXu+H57?7;KoVu!RVBU#TVQvgmDiA}O*GEo#`eY7RJwQ3qv$>xX?IU*LMz zPAGS&XS=>L}P!8ZAZIL`pDA)^(~V_>0g8Ak`wV(3{-gM4X_bDF%ch%f#h{ z0E)mD<1OWO!KRciFdPbTn}9>vD4K?|cp>>Hy+UrISj1S%98l%+*@cm1>e4D%(o`-l z1QMhC`O~DG*XeZ4#{4SmZs}f^W{M#|l}-pJ|7ZHV2YOodxgRZsI!t4quT>3v_&x{8 zWY_Atvdg6}EEj;)_=~|pCZ1G}Q-B-pHQG(Ss!F@bSJi1Z`Ko&DCSTR0-Q=qrpaIN> ze3e_dZ6T`qQlHA#aEU8&-3vx{03nD z5ApG;@TrI39dM9T@$s>U_P7&34d?>z(-ANuPgFF)Z6Cc7?i5U}oj4ogX z>`{CuKAv5Q55>o`C-HGid^}|}z!R)^ln97!;#-0CC%zSFH}S1lyNPdQ+D&|0qTR%| z70PY%@%0Md*1$K6Z+b()UNky5m&l@VQ>#TI!vxuOxmqFHY>@i@AR8BrOEb{Ezyhct zPZ1d&+_Gp~UZ4U-dx%BsON2}yvaKyvAJen(A=<+TnMGt`&%ajF07O z)W;vnK+LQQpp)P$lu4hU+i1pN&s*z)eRkS_Pfek{UH>twH0?-0_PebOL!!s;!YOl z|5oeePl*MvFwhL6b#M%J)8(PdLste}8FXdSl}%RxT?KR%(N#oOF-^yJYB{24U&S26r+goXkV!|pa|l)*!O9_6c?2tmVC504 z9DK~XSa}31hhXIqtT_Y+AM^P(=Tx(3@0=Qez%NB&JeAI&zH@iYMu(V5 zz$1FaVg?^~^YA0tdI~)o)tOz7L(Y+%`8m3)b!YAZXTr{W9q*sqnI(5fN6I?r-=rV? zXxZ?29jw80e|A9Yvp)xi`g5>{y~F+-9O}=(+4N(74i5F_;3E35KL>~UQ_u_Ex<3WY zLj5U4f^|Ns{=6Nkq*49ZACq-de}0P|Yu%sM_fY*g9PgjdpBKyE{6Ev5O03gjTxwZQ zMa%yD|I7H?)7YXvM|En^pL-xeZQY-L#?8wdpAX>upZ@&!p|^8Cg`CR2n(I94GO;rz znlaw=SA|ehubzY&QgYZbqoE?Tj;$m=WPK&Fu65ar5l%qXzI6g}>((`xs<8}R5S^g5 z%>)fha03+8k)R+tL0y{(nwa2$Pqc!lZ(MtyJ*uReRC?rr#(|&=? z*9y>GTQVPU{|fG2;TV1JbPCVGInxZniMF|hcxgths}VBQz-Y9EkcSo* zah7jfdkmkr4+m{;Irq;Ugd@YbTEY1l;Z)arM8O#{{b9p-I!?_{{-U=BLRv~njzN_q zEW5!WZDM0-p#^uyeKC!p`JPqQQVsuZAEafJ5G??pgLp)KH@Bh-=_6hb2 zuJQ%rwweAH*;!aCyYO$K=c+Q`7}5;0$!7foqnlYb0XDvUS?f#R5=(+3hxc0}!@l#bJ{(I0$Fi zuZanl<4te!epCN6mL!nGeG-?S^(Na1me8BM<;~|9^HN}637*E>o^YVi0Of0FxKklU zaIX}YwtWIo$ct<}Y~6o=7Tk{eVfA?p)sB=q;FeR>jsw_^*=)ybwBx9aNW24$1@}n4 zU-D+vm12)S4L8Xm<`?^+twI`tc7@T@`h%2S6v=ntdc@kM+BymE{@aoKMKi0pWFX4B zh5(9e%M1=iPE;K7rDT_lc`NoH-ixM&I%S&>>m?YQ?BCg$AvxRSVJQrO_mKWu|Y zgCHj6by`rVm)cRjZri){>mKK|TA`(xTyBR2*(I;xc2F$HR6ls-EKCT#Yx|>od|x@V?4U5*^s@kgeQo?61mJZgw^t>q$;!@j|d{z_ceE%1s<4D87Ut^x- z`(*5x@I46DLisMn^ube=LxXqRiqZbDQxH;CRn{9|ylJLnXz-HhErPlr2sr)$`dx&* zd=tGvjV3DW(pZ*wG0qH9Nxotnx9_`)Yjo$M&I!I&JmaLQ*cYLfAbJhS~OWlW7snjAkp3U$NO&uNuYGzpXuRDlEVBpwlLwZWxvP54nW za4oh$LDhmY@L%bcHdrbzR$&0{$w&@#1n~3{;P((xn5aWzK$8gLzW|pCp$4U$kERAH z16Cx$nClAUiF))rVm*Ac+9E2%7(19KVZ;`Mp2@M730;*dU^jX?>yxbNBd<_>a^w;T z`bmXuMuqYNlhGMS%9;%1>iOvU0{2dcJ=$UwOM7vdtQ7fUV7`_;I% zRP$)yBdT#i6nvWSXLVrXO5!lT#%LA{3`};6nO?&Q9k)vzKUDZq2~-*bo1gNL&R-fE!n!ARVRmS~Q3)Qbq*h8lq# z8Ob-89k4RkL@@hj+o(L2De>_Shd%~`c$pYzWc)KsSI8qr7G`tr+{PRR8K zFJX`SMU4@3kW0D{G4&peZZ150sIvL%p>OZ? zN8HCtH4C8bK&;6&xS-9N2v^p>W;FQxjkqz#-1Z%e{!1Ssk|(G9L$c^AiI_%3f=jbI zR#))k?JF1O>DymkvMx_}3ZvpS@M{8!wd!4z7re%0-9{-+c&8+O8S1I-PUbF&LV^KY zB^@EoKR!BgoHN*2N66;_A_%UFLHn@9t$p=j{+6EBQiv}=B&qSRT0Gv_t?hrUuXxR< zycfj49(dZa3eOqar}HC3BenvEbrZw=>#?0g;!9yeC(*;g`mwOen)xC}y+I z%}(3(+P`p%bsj>+xW_Itc**rGc=H*%kTlr!La+ZNv;4h--fiFcVs?6iU9oU;Uqzf5 z;=yA8FQn;bBu>Sx$Rlxk$#rR{S|a|TG{*aX5JeO(2Dq`-tDb%uzPmB43(3-q#53%R zgb^8W6HTU~x`a-ZCaI98T_lnv8;RF}WsnPqSz2_u0gOC^rPWT4PKUCFxQ)bL!ub3U zrUM*_LtJ<$1zKJ%lTGR$7?K7nKm~9jCwZH}A+Tjx#xA8&4!no4fEQ=%1wJ?MJ6ozZ zV=v8HvQ)1Ab67_#;rjW&xA^=c2`A#hR6iaC?#3q&jJ4kYv>d~)LtUX&h+>VzOe}B+ zfMWa9H7|Q{-wQRGprYr*Y8ZUNW3OW<^U@b6ED7(h(^%MmLjqpE8=69HufG`FUGb0B z)?Jul`c8!1uuU%Peg$WGY(xDJdtiOK$=*o>Eh5Ki!nlzb$p5b7WH2bU9#bs9jmW?@}g2byttqDP_^>PP00}3WgV$L-arYouXRn7T{H9}cq-a2-2gjlE$sXs zO+92StTdbL9mWY*Jm>eFtoy|qoOS3L=o<^ZE5VgM=#Xr%^DXZyK!14E#aa*mpaW{C-tw1yak>nP0smbGUG$*J7_gES#? zCp3LkE7;a<(^nE(>r=|1D6uLb$Htk%6g7zK-DWe~~xvu2A!(imS!gkZ+9qo{=3vl{tOw5VQvC{pyg z`T!*g9g{OEVr#)N@%SOhj!>bgJm{znBKDGyFy-mY5FTuteoe$NxhiWNa@OM?FzvAB z03ZPlf*b2`F6fki(w1KO+mKUQFMK9V$jQlObsB$M)>ha5hkL7hs|Ld7yK;%`xgMS_j^NOAE~~&&h9lHlm|(%2r=CdleFoM zj01Q3sbVO%qsXCsY1)j{9{3~U04gm+X*0WUux*CHZm8DPX(E~^!v`2-#F0Z~`S0eh zq5fY73r4q}?U;!5`1L-A<8LuZzlV(V1)6f&5OZ?PoEXRZF-Z^M)f^MYuiwO8axY$6 zVw0Yk8{^m=+mTldr{hwr*^a$& z@vqKy9EeNVFx&BXeEj{h9nZw4ES~My7azZKmgBqll&!NI>pG5`TaL_JDX$@y+D=b7 z7vXc~aqD9EZZhKe+Tgx@H$wlF=;Z6cZvHsFUp`(w?>gb5Sblzd;*HFy{^WSR8ct5y z56`Dg>Dvf+K076iuNA#V@KxrC=j#vZwd&NG7=AA7BfcB^oW-xVQswKlU)&{uWv9#M z)2B<|f;55W&*=hym9F5q>umYlezt<={eFLu?=|QDRo-P;>Roq9gMj~5j%4|6PSPg; zbj5%a7F#(`Jc9$1?n5PN2a4z8x#GD?z2@f0*HZO*YKWVae{TqSa>Y=|IOv1>Nnbqu zpZBE%+0prbh~ek6SDwIp-@5X6mbtVbk!98tT*}w{VJVN{RW&UBVT8RrEM+rZl~=`o zg7m?wQUVBje0cn`cx@TpjjwNpJNf$C)wz6?jp)hOlOx3Q(-A}XReQ~;e9gO7JfFOF zP7FWqAs@QwIy{1-B*UenQeKDuE2H99qOk3wQl7?Z@eT1C@w)ehl-+nO8y)}GS&sL{ zoZ@ioy76)8lf4s?*~JgtY!LkQH=oW|^Uc!JYbMI8Vd8jt{_B=$d|AJIUdn%A(j)So zGx>p7!t+S66b&7}XQGn1-kIp+L|{?Gqv0G!dS$luc_0jEl%)Q^ws1i__uf&VRo1sq4(&|ESB) z@Ls?E>ixqXveW|ve4E#Ppr$6KD-#z~5Ja%H|)&*t6e@eH05WPf1mf}b@AIfzx0)cXF=Aub8fu; z^k)v}?@mv@w|?slOTV$(YtW+A_YWxg!=LQ*g{L0hu&r>q<19tz;>Hpf=A0K??UK^gpzgThA?n!U{)Bdiw zY4?Hi_QkEW%m4ko-!FgSFT37q(BGyRTP+R|}ul4uu&Y$u2 z7T0w zKCDaG^`Q>0*YB!JRJ!KbI=%h=@y^T7M;34Bcug;Cy?FM7Kdjh)xuSVl*(!d+Z?-baF|lr(eIb&pkWitP4x!^W1dpfvDgT9d7)`<3I0;5sp}xPo5e(EYe&}-RDx+v(qXVbAwT+MX!ivDw&TRyUf`1)I`S3*$BA}6%s*Af{WbDs z+5FK@H?HHCaEt$q3GR8Zw{1>vji4ik8<~uE6aM+T4*%hJMTmDzRJ?@}%i*{xD&F;o zH#`(C4Pj5{cw_8%gA?2fW6gx*dCt59&+Q4x-URmm6wbKyIxb<5vZLb84#iDHcvn5) z9jW~OI^Og)^Nby4X9~kljv^iR#i+PL32SbGCpN!xLUN8kJG9H~A$Lv}X}1S-+6V2l zx3C#vuk4)QGP{gIv%vpM{BP9pp10#g)$uxHs~Ti56dBkiU+MTqYCra`2MEVs7Sc%j z<+H7G2)~)&DUXY-2xULCOHQZ;xhP6-tw^WOX`LSRNBVn0>GPSU0RMOEG?zgcUdkMh z;9eX%C?R=~Ge5x-j2n=UwlF?7A!A;LoP^Bsj)N0c#5kXe?VOOAlaP^2_Z4XG9J{@5LRfzt zuNs3=;-S44#d;HxgHDvaFfKPCZC*TJDen+l-Z>#HCjuU`i?bl6gP1CUk)}?k8DiJrTGnA4kmZWd80wF(W*u*>9Zzs3 zkNpaG%j5DAGGc$zIl+UTR``jQB(2C0KooruC#o4Y&$*DzOMF?P!%u<`!!b0$9gIa^ zEM%U5H`Cd9GXQ=WU9&a8HMq;n1lQ)5w*rsm#VvFOr4Q`%hl8KxH2=hM?DU5#2QnCk zhlCfu2T?&O6795@by~!}*0_ki*0`9PP&Dn3h)CQn*7@-+bvwVvHUj>Z6SoT#Mxgl> zBIkCAeV~OGhqH{AjXKYrN1dm$NF!sYoB_y`?VF6T$KMSR_15EF@Wc54aZjO!w+rxB zyE*V#&qAI4_M?aCoR%TI(K4%YXimtsYbjS4XVy7 zbe{2e+xXH7|H8CTfV>Dmwm}O+aDJup+>3TSe4YbIU-J^mVw|URXfsd2LE?+a$q2va z?7Cx|w1L;zr7fzS2N<%EZh=mJDYTOXCZN{5*u3L9co#bt#RcORb|~){8|)13W>6RB z)XsF|bQyED+xcM3*(}$C|Ce z+QfrmR_U@rJWfJYY~=i%i#T1;AN&=ukI@HhkK@)9pWqV`kuS9SXu@#yK?Y zY)|YyHE{CIcEsMOh7Nht?{)gWf8QsI)>WLsJBz7M3k3&I2~8C_JohqapfWWhaJM7E0)$jr{n6@p73!x zMjXQb+C%sk9>Sk1y4F9Zc<+z?URapga!?y2s#t8bAG zI^Q?{^Z)hacGZ3F+3M7}Rdwqw;p-!vQk(`|jLB1+nKAo%C&ihii!phMb8gJO-br!J z*TtAT#o=1SrxfRcc#x13=Rym9kp*91!7q-(hmb##ov54)ph$5pfjzg_sOY1(x(*Vm z6ek=<&p?XPWWg_s!yi%dqj;?R%j4)7NO2ZhaK6%wPbtpT@gN~7&NUYNItzZi1^=@J zztMujs@toI7zx$meqD^oQ=A84_VrGR^Pn!qyd5t9*|3&SNqAdMCwsTo+^V6z7SU zeZ7<7@GLVvr8q6|AR#Hv3Jbo{g0HgRYvS;$lpmrv&$V?*ah}n|NIoQ${T7vvHA!*S zMd+}Q;yj1Dk#dUjLZpm^6z4_Ujg(WI^^r0bQk<7@H&RYGXKAX-C723*fs&sJ+I-IFqbpPAfsoOrxZ==l-^)A@oU z#^nnY-UH5lm*Qf=|A&D(&YeP^ zZydQt@PL6oD0sGk|5NZ>1Aju{-Q()DQs_@I=+_B-rs27l1kX0`*96Zu@J)gj8Tk8x zPciV11+Ovi?SjuU@UI2udoq}Q5PXS&?-G2OfwybV+})E}47{`8>kYiS;F}G6AHjDR z_<@4cNf49z37%o#0|n1C@WU0}BdI7xisK9uJj=k3RCrIr8hTh%%Qxu93U0>Lc){}x z`eMONdrlU7ia}o@c#VOF1fOT%XA8dAz|RqUiGj})e3^mI5xm8~=L^2xz{7%XHt;J1 z-(ld_3ho%5{)^xl27ar;dnQpg8k7De^w~zc-zRv!fj=a8k%9k9@F@oVl;G;$F@fgQ zg3mMPpA&qsfo~9eiGjZ%_%Z{3NAMN{-y-;W1K%q6W&{61@Er#Jt>83R#iXAE&oJ<$ z4oub~X-W(=EmsRZ&A_`Vyl0X*Ui1|DSqA;Sg4Y=M!3y8tEHdx`f*Y{&N5Reh+$Z=( zgJFciUo%k0Ia=X8lI9slMhR}(6BK;0L4ShaHyHRN!Iv2LsR}n5i)dym+-MZSA6B?| zR?q`~3Rj(XjD{TwS3fa$vT7)^wHzl?K^bI%q_S_aKZ5IN<}rl#N!}~cJ1BOd@)MpBp^g?#QF4M2;4CT4QgS*+v#we?iCMbTkvxU@0(m2k#nn*E+f28a=S>q z0)pRck#mPd&Z7#~UUVW?bk8V!YDBO0|3?ZxD}wX$4xCcy6zY@QHDXVuLJ1?hZ*n~S zu?n9qR5Xtf&eI9^@=uioud(14TJRe!_%aK=%7VXU!9TL#UlHCnxgkIpO;n8)%<6PMJ#eyG3`gP^hx`%Jv$;eb-yb0Al%EIKPdXIBlILzrO^uiCW34Er3(Kp zf@}J@3jaQWYx=(^{D%mx>6a_~#|Wp+V6n%h}^N!{y)u3QvjP+Rm*OIh_vhmhZ&9d^GX4kZc_XQCc5&soA^-HjHKn!ngR_~OsdKVRN+>Hir=ha! z?2@`r6}_HPQW7jGrx!#fmK5jkUsch>?2^Hib+x5YzCzzH_syEop~lM6`pOyAL4F0p zc*~`=w=(?x@(JT6mQ+@jYkPigxr57QR7He)ydUJtDGt?7(EmE#KVcl3oD<~#AV0aZ zwz9Ok-X9|(_fHL_T74r=0pCX77kDpN<@*8f8 zVW*aocWNr>9i_^O%24gFni-X(GG5*gZ+TU9F?J|_$2Gsd*jM8BPoRUt3TkUhX9p*i zP=osY#Uo0{`#x-16+tmZLLIY`L;1%&%%wd38KDmQ6su1W z_*_JB_=Yjf5XCcOgevE%U&T9A$seldhq@Y+oS{n2P{lh`@eWnILly5(#XCpY3t z6z?#_JH)lYwOsM~6t7S5`V?=DI+~++a}+Pl^T^H|#hat_<|y7A#hasea}@6o#XCgt z4srD=u3?I6nBp3yxP~dNVTxa&?{LLCT=9-jG$Rzv z2z4}9@#ZQyxk}~;ML$B(=PLSKMW5@^tE0K6xn3JFK2%pnLpn9$=o1ImhAIY^ zluVs9tE47WTQ{S+w5qaxc1dGoPUO-2IjZ?5PL6%|G!h>4-`Z*1C;ya}7IB=ER~0o* z*Y5HV=iBpW^0p+gQ1r){lo;RW-PlVZyjzp_HE-Ps8?!@V-M!%KJ$KV?Sm`v`t;PIm zw8dg#^|Ck;2ct!;3cWo4tg=uIPmO&;BgIiwrFC^4)oSZWI+W*~xg2$cG_{X6_&3O_ ztgB~v)iWuACsog^tS&E^5UOjK9@1Wso+!qN`aO6z_6HzJeM8LS z;0yCmY~#fpWwkXk>MCcIOb<<`PGM>_?ap*)Dp6lb7e{5&&Mv7at*j!TY*uMWse5%5 zDhcUkc1mRKal)7}#dP&Fv0!AOzl42JT%UJlX}QZHMobJMNJJAS#{x=8{j^%Pz`a(B zbR=zUT#5JC&a2HrpcVD7kfVl$y87CxP_?#FAM@!U1N-4orRs!;o&eE7q4lxEZFp6S zwy=ra$_!r)O)X_AIioh0t}y6oskY8@KB+4d)wKuXmZ!~oAP1Z;_Snb2c%61ykQ)iF zNO$JT@mJS1)P^QiSDw?rgD3S0rSaohVuOf>Fl`e z46Vj%oCxYwrq5`Mbfb7J7@bM^^F}sQR;eY1-CaGa3m`FOcNgF~h%L&7DP^vr1f)gR zX(GWQjbHAMtFH7~d3-5fT1%(e5Ze3`%E?^%D;if`JfvhgEtSx!5uJqf4RzyZR9Dh! z6?fnhgKlid*Hzpemq$D7ZQWim+9L50k;`i^YK6u&S+rRVQmv~rHkoQ{_Kl#khU!yE z1If9e^0Cy9`-^D7BXau0w1_=G_aq*6vqaz-54+Ls6(GA24*?SIHXnU7XnIXUeaK%q zHB{ZGK7>PEuZjS*L7}jPi&Vw(CX^Cm6@7K6vTjU6b(xw}XE&BsHH1p)XV--M569}@yBu|uZBnDohqzFH&x!5EhD3O6)pM^tW&De;o*Z_$ zqZeI5AHC#67sg$7tAp+cYmVdY<+?Pcc`(*CLu`y?5zd$nUDrx;#vT-pMEbi(Z-C}n zjtZ~m#b89MdBLaT8iC>~DQTR(+ep#ICpPOv+uP3Ru7^ik)t5bHM(y;{`XHYqYC+Oi zX&72OjpiAR>W-s+5|AG^c#SrC>`0|t$@zZw>$K4aa8()u_#1#v1bidlD1Q^-TK+Jg zM>(Sax5;@Ic0XW)UYr!)GXa9dpn~tl&fb-J_8rSW}^oZ*?H03mk z9FALlT0zTs5^%J04d9;wJ^J}G!nL1sh2GSQ{^6%cwB9K|kM>Ws;B|nbf36Um>xJ_5 z6H<(0y)X{Z{u3Go^fHe9$+ciVo=0mf_^W`UAM}$l>^GF7pENPsy`MZeV$x>=j`Hua=(YJ_ zZ=p}r57&WwwEuR%(Vmw8NBXw`NBW-tM|%C-q3NGLf*+7R7jTsSFvv$-Kj*~qchaWM z_q~MvP|AMU|UBqyPC_=49&C zPn4T_e|5>#_hqoY`U!DUul|OgS>Ij~Z>HXZAP%wJa{%8+Ht6=!{T|D~erW>OiQ^!T z9h{iHfi^8i+t2ky`Wc`X&zJK7M|*Au{9BN}QE=AV2>2GD{|@kNKtB`kuL0*dhPJ;a z3#P=`EZQ`F5#Z>b2L$K(V!i$iIMyqb2`R<-2XK^gKHwciQgfDc-oRt>*NRiL(V|p!Tf(4&z;QD;K z&VoN?;LF9Hmo0ctsh76LC-esxxSnri8My8@eFi>WBGF>Trp0l~Q) z`5e^viGnjd&acj};Aa7j@-GnFl-~?E#!r8XoE*T>o{<*(IKa`K1%jLQ+z&X${|A64 zkuSA>^cz~HKlg<=L^}ssa3A1k=V-y%PPFG%3*MOxp%iBi;4$`Ca3A1kPqpBtJu3mn z_|e}1FzHWB@wW3E!I>WATnO}N|78~Z8o<&1hb;120LM7&&4y4i?LSsS%IN^-DaO@afFu0@fMY!O2OQ-b=DID;Z$|=-^11$;IOjR4ZWn!> z#5l?y#Ke>s=eJ-ry&lgQ$Mg3rCZ@zV>b+B;E{^k}2L)&M@mR0rp9%CR=PnEWxdpe) z^W{VEadti=@oC!MV!`*ev^#(QiIXXZzccKGe`vwKvfz0T59ps+fMfgOc!Br}K#y{I zu;G+AL;8aONBUC$NBXINBmEM9O>Qf@x<5nY74#l zFMZR{%%)_8rJTN^$lB zj`ZU!an;uT>P%N{+IX{Ue8+j$ z(J(IKI?p)3-ymKc|0e;C{S~gi@z)?UJzlrs`p>^W4$6NG@SULdZNU#E4A-&sdL0k* zxQ@DA=o!cL+iyWWu4i5d^8}nsBJ72Ki*p6sVmPIelhcOP%0(#VY1>orC zRe+&@Rj&lA2INHPCujRz@ksketIL0&LIIl+h zPY}1L7w6m9UbgsIt*nfXbG$CV_$h>Xq26i>&ff{<#D4fK_FMvT(4K1mM|&Q%;7U|e*{yLZTTQ4T0#2Mn_E%*f% z{5rsK{=dY6|J{QB!-8)D9OE+su8*)C&j1|9FT5^8IqvsRT|c1x?sre)@jF01(%);r z9|j!H7hESqInM$;+NtlSuscwW`@K)sPNYBDa{YCY1%J$fKMgqQb-!O2@1LK69_=aT zV57wGKZG_NhtnCPWa5o39Ea=sDJK18LeKs|y??XF!TZ{1&%Z46Ph0Sp1UL2S>qpa0 zj!8}?uAdt*ah@A{(d+xvre3_Cg7rGWB4?BZ*W;9F503BX=L(Ty+H;jfz8?2Y`FB|8 z@3Y{KS@i08f+_!9i=2-wxc>gFDd!i9-UFDBl1V?nf)BRfBP{r6!A(DxSm^b-G#|!z zILAVNt_8nDa8oaicNh;X7CGxI_{$cYzX#8WGqhj-pFY!`6c`_ozKaFl+kzit!T%_@ zsrNVweX#{U&4Pz4c&*^3-ewE^br$><3%=BXKO(rP_h}3Mxkb+R7F+qe_xm<;QX^5aGV!i2sqmFZ@`g$9pFgc1=g97-u=#T z{5)!+g}xMUlz$W8DF1H2k^Wu4k$xNCNPkEgIgt{(8|jAtj`WRyBmI29k$w%}NdF4p zNZ+fYGAGWSet;wWWWZ5=8Q@5N9pFfRJK#wFI^amZ1#qPA)yZN%;7C6iaFkyLIMQDS zIMUw^IMTlkIMQzc9O-*?w%89i(oY5)<(C1D^w$B7^tS_!^sfVs^jiQ&`t5+@_1YP3 zwNzYfrLyifdc(X6*K-B{j`H<9md_VlcP$0_ogjaj;D-{1>#KSlgZnXDU!5)VjN|(1 zg&-f-S8oCw>$?naw0}9^pMsrTsmzJ%h4$;`oY|i9Y14i?n97`(p1*FW@k12q&aXbB zvc7+xFF4cV^8;fAXZd`MqvaeAIJc3;CkxJU&<`QNQNF$&WcqzU4nO6KR*dL`g675W;{GExET)|lbpP#o&Y=1|Eobh+VdvhXwUnAW85aOLQ3pUq}R_inejhJ zQM++6i^}?Z83*_r!0!Tl3zc<0@U-A8ANygvPH&)NTK*caAL((u9sBJwEcKcXIIneR z`A5NZ2jY1Bh4!BX^k~n$faAEZA6JwTXK3di07w7h^#bZW3FuMp6@a7OhXv$ zFn^v)$Fv{10gmmM1vttX1~{*wX*uHop9gpa;Ml&40KX9E^?E7We-Yqs1O0r!KLC6I z;GY4$5b*B+zZh^w=J~Am62SHI^NcS7d@rC61AY+TmjaH@pEm)X4fK}*o(njSLE6tF z0lysZLcsZ6o~EA+_+r4P0DdLlX90c{;QD%s{cttlw*dV$fIlNRha<-Ak#IeN=S2W; zJTGbi$2h+ht|JhCOK`UHTCgX%BkfRPdyxKZ!I>WK`?TxC)Na4mNV)dseuA@{?*Q)$ z^fLiJ6mUF`##r!4fMY+fP;l0Ze!B{A^xLf#Ih%kU<$MA-${7yx>V2U9{FC79x9gz3 zCjx#w;3a_H0QgkE{|xv!fZquCd4T@~@P&Zi1o#zz-wgPl0skxD`g(-xbqnD40sRud z9|8PUz@GyAHo(^bemmf=0DcGH?*M)$;2#5i7vLRaz-9aKeB2N4zX5$F;7b9|0{m{k za{&K4;70*|58z_}zZdW#!0!Y66u|EXyd3Zc0Ivd^@5Sizv>xyW0iO%_KLB3@_(OnS z1^B~&>;E;*etrb-yMX>tz?T7z{pTBi_XGO(1?Te}ukSb}Ik8@(e>g?K3NNOjp08ie z0w^&(<9a@QuJo%K*Y{VhvEVmDzshp%rH#|07Q7Smt4y!2Tl9L4)~oTk2EA^_Pr*Md zhsP>TUmN&`)HiY3Y2exq{C{;gX}$V7u&aUV|3lKt!1e#ZIM~3~iQX&&*K!UsaP9v* z1K0l##P)m$_X(W1Ik(cL{gWyB8Q%{0VSrxq{W z`x(bmmdVMK^MC6(iW)gz*q;5VF4~{_GeF72@3PG3%Y#PK-|#CKTypU86>CG>{&j(?A@b(?A@b(?I;UJg0$j@Hq{{@i`5|@i`5|6M0Sp>G3%Y#PK-|#PK-| z#1nZ=1L^TO4aD&|4aD&|4a5_9P6O%jISs_|ISs_|ISs^r%X1ni2cOeGTyc;3=8?JU*v^^!S_x z;`p2f;`p2f;{WaEGAM4t^o4*U{mFnM zy}n-N_CoqwE%dJgj`UjqNBKCvMfyaZ(?I$}p3^}3M4r zNM8ncjQ;^gdc7`c%E#w4kbVouLHV}lG*~Vt&QXpm=fvUrD(d)gq>tdHoPmJ9No9RK zg6l1K{gMatXioretk)S9yaI5PUky0Q*VjR&{qrpJivUOYyk^dcm_l9oct84N!0~#&(t_*z>?|MekKjBXtsUqU}r!MYRTO@f<#*6$HB-awnSa}JEBxIVTT@PonrsW5)UtOo*)=gS>{ zBmIMbBmLuovz^$EJAwXnu)jU5pJ2Q61RUjG3^>;JW5Cg$3t)Uf`_}`Ga?a^Q#!+JX z|4EznGv23L4)|R{&&_`z_<0rJ7`Hy?Z+T5v%RkP7WB-rz2g?bUekA9Ub@&9$_q;a3S>#R2LK7wyB@L7VtW8g;$zSY311^?E-^*Ei>!zIx6 zNEkbv4E%VJ)62m1yri#zYroAGKCVBWch_0)yDj);!P(AI+O&LrHGPseaHhxk#sz?*oG$@K|8%m%v!0)`e55b6#QF6g2j>ZQ0FL9! z8z2YkwH@fOUMUc_STB5U9qpV8^k`2L;Aqc_fTR2|5Qm6koTGf(_aQe~JHMTy;w`163HJ#PYz z_MBpwSHB84%IOI6YP3JyGEd$Y=EFFzo(wqJzsiCS>Z+=%>WlX1=SkQPSg*-IkMiHN z;1gipi}FhVNBMIBNBN&w@Y7&EjPff1NBQ#w=k5ltJDPzW{kZ~gl>Z{&D8CELpOJoF zz>$73;7DHvIMQDUIMV+WaHL-WIMTleIMRO!IMV+LIMN4Y-pg@<<3%;#NPiy8lhOYR zfgb(e4EU#{Lys@l0?yAAY5ZltQO>7;qdngMj`YK2zHP?;F@U2zKC+FI*>Bw8!f|+* zZ05xD=;!MIM?3ZNXr?{efgbI_^*TI{UQ$|Jy|}*dHsGk&_Pka;=tVi>0Y^FK0FL(D z1vtvl@3WZo{SVNioPA*afO7f+j`jp$e6OXt>-f0}#&?w8o(-YI;{HXOroRNn&HczW zjpOr6C}%N@U)b(10giIAVO&5tuL6$rUs>>8FpltAtG2T*;J99w3*!aKpJ>7BKn}{k z0C1GA#~1eJ7TSc&nbehbD6zY-zSjc&EgjSLKLGenz#kR-P{Mu${0YHXFRn|k1svC< zUjq5KF8vG8bI53Wx>&}kM!>fN{oeuS{|TVwyZ|`H^QRWP1B^#V-`|4cx)b{OC+O$X z!Jcl=Pa@t2@cuxbCpi20aj5S&pvQiDIpAndF7&tPxAOo;d(Q4j$|!OCpdV%dj{U%; zf}3%87to_Un*hf+{1R}C!<~YgakxuxGY&iMrOc1JKhj-rt{2APIKZ*KCjpN2JqzUH zd3Q0;V|^b79P9fA;8@>x1vl&aq2OkHzW^N1yYE3h);DYKsDJobZ{2T<7ToMN<^qoP zuK*nV_9Ecux9$75dQJJK_m1Ky=PbZc&c%SEpMSF8m9hZHdNKYR0Y~{a0*>?%6T1dlr!Ogs6B|U037Xn5pb0M z72qi6^aG>v(ay5~M>!V*j&gpo;FSkO<)fXAfTR4SfMcAm1bion)Z@#uf}7{*2Eonq zbQ9n|lN^2CZ2|eefc&(BqxPdc{QyUM4i((A$0xXH&yj$mJ)=NA+A|GswC4iA(VmM1 zH|=Q_+_dL-7NOSg+RrM>(hVkIF|m zRe+Zw);1LW4r$(xY_Q>3{W!Ly$j&j?t2Mt_CK|NZzXxU zAA1XM^v}nDV|_dSQJJHzQ?OnG0LOX_5}d{T2zrMIZr1B)z_DI_kdN^^8E~xEs}}s| zK~ej$y^aGM>w6a9DF00hKJ+ke`2~QZ{2KsAf8Gx``tuRNO@IDdaMPb_07rkm2=dXN zod-wl$8}L3;AsERfPVn(TMzhlz%K+GWIR6hXZO?vye+u=@1swfz9N;Lw5%8TLXO7@zyDt#jZ1>9n$9BIC z|5t#c{Ufry{WjHtUt_^<0v!E$H{huEdBAafrkyWp5Bjr<;Ow`5 zLwyGTJ$~0~5YT@{^j%!BP7vsS1vy1P|2g0%0*>GHDgimzE|q|z{WT!x36LKKdbEEr z(4+ki06p6ODA1$*PXLbguLe12|LcHbd+h)m_3i{5zgN~X$8|W5Yv_ml1m|{q68ta( z=+O^H06qF41oSAs3h18#`3r#_{_k&CJX&iz`q9iWq@P5tN%g>=sy7*DhLUN2FTj!ha0`Bd1)pKT z@wp}(_pbo@56CVZC%0JezX6W^e;9DIAOFuU;;&igzp&s*DaviiZz!jy1s`C+M_BLx z;Mk6*0FHW#Tys>M*MZ+o1bhpXb^kaW@UH;BU2u*EyzbyWij#@Am$+g#)zYThYarn7 z60Y@*gg8X`_Ujy_VsI29`0P>fEUj5yEwsUWw_dz?N{8|hCkOlw7f*-&NDVhGk z_dAZG9M^Q0gm-r2ROc8`GEzWCl^9o zFSKWc1#dqvY7f#s1UUNhtV5&pi08mMD&pM-Md|T5mMjbY)?qGvGG!}i)A7@7a8wT3 zd4dIBY{6d_oaL_q`THIomEQ;Y!?A$lb?6Be{6q_0X2EAz@R=5TuHbAxj)S)XJg-nEOJhR^%;!YYXxWfdFrIwcNx%Qzws*ID5qTxF;g<-WD0Kf zKL@kXluUdO;CSB610409HO!U6dQ)iA_RkjFJnwb_j^}&+aBn#$2yV)00UYHdkMNe$ zU2s#*Jit-Ta=`IC{lJ2E%XRg#e59`j9OYjKIQscHz>$6<;7ET%UbMa#KlcKT^Muua zBmJ9zBmG~Gh{|70Mcuxy3vT*zuOnT0#$N~eK7gbBCjyTB*tLM8oZA3LIhz1SIR_l& zZO=f!QBDYOlyev0XwO4{qn!1E^LbGZe&~C2)E(H{0ua3%=ZfziGjD32xf6|FPb74iKE}`5x>a?UJkht%}Ne{mut+81Eu6{@ZQ}Htf!{3j9~$^9m)!Z%z@HHMUkqH=t7E>) z$bM#>8sFQ%UlKWe41BxbLk&FBaZ|p5>vgwN47|6{R~Wc{Z}1WWA1d@$8~Bl25lXk@ zt1Qy)dfn|F1J~yG;guC=YIwKF(KJ#GVE2uJg5l2L#_` z;EM(CT;LXTd)*}XJ_dfK*x%2<^}6J60~dA9NCSUHrHzoE<+YEfX$dP3s<^Mk>(X(Z{+?4K$i^F>XK8Wad3VkNv zhk=}d7Cam9kEyKX2<(sur$+BU&UiNcWC)ffIpc%*$4CqfvC#W~Udv+bQh?c=QliK`zOdI9c;v^sBXx$8r zrXOt|#+6>9W?J1JGkt+Yj?I2Q&}%&m4FeqY^8G2Dkp6QGQjYd~0eGgAS;R+xX92ze z@NB@xg5F%f^}REO@&OM3J=%XH;AsDQ!pj-jzZr0pbF@Xy2SATV7-@W3*xQUO_#g>-KHL}ZVSqFJm2#{Ia9IjfM@|Mj3*^iK zT+ey<@P&ZO(x&3t47e<9Dts&8gB0Ta?3L=~Z2w_^9|*WCJ*uNe0iF%?e!zWz*8?s~ zZtCb9z?ojh+%6s$*Az|fafd3{lWXK1%QWuek9;G0X_=wI{_aJ z_zuARfd2sa7{EtMXU+DH1$;cjXUO2ha`c$UhxY}X=~ppGX(-?)xsduj z8t{_=Uj+CmfL{stseo?;{4~Jd2mExv2gxAH_MZXxFu+Ryp9gp;;95^@0`aJqz%TGHGD^Y{2sYpAL8s z@M^%%2fPaKg@7}Ci}d450IvahXK>x@>Gh>&QeI!{=F@bkJ~XS|8C+gkU+N4#v#!n= z%)sE1Q;r`uq^7KDn7_7mM(v34p}M-#sUd%(ao9JaxW2TyytKBwpsH#{S!w-@+Psle zIJ>y=+>n3z;F{9f`oY;zCKj2KT~b0>$vF*`WoMVvg{nej^(7_2qVjUTe_}~-4*yjZ zP0TJCTv=CJ%G^`S%1T1B%0e~uC1iY6h^^Z*NwuM>(ntkagm1{$P<5!bvTS^5eQo8e zV7Y&E4%gDA(nfC=JejIDqc(Vaafxq4QSq4KveK%MzplP=Iy-B4aq09L+D}w#TZFZ0 zQbilJYWhS3XD8%DsSXKN^sNeR&53Q&nvk$oO-eXmq^_FYE;t&AiB-p-j}ffS;XJ=O zcPeL8`-Vn}qpC{l>THda09%ZjXiu^Gv&ZdCTpF8z-BwxzBo-~?>fH*9oXgRsu?a42 zsI4e13l-N?RaS=*=p?-9lX6r7p&^OHOVn&A=D@*Gs z22@X^d%eW^6TjbIK4IL%lFG_*XK+-P^uoWt3R~y<`)i7;Oe7|XX*j5!8m#ADB74-d z(%Ol&rIqz{e${Kl4SET8;Cm)E&dlMioKZRcqH$&R(aIpJox#JrIkt}~t>L)vH}d4b zH`r%1F-`*_q~0nmq;b{{E2yn4oy~#BBjRYXX%F4nWavi3!Z>dGoZxht2u&`ntt_ps_Zz-aGm7|8J|RK2p#R+r%l%VBY5Bz3P$piM4wN3rV-_dQ}A0(mNt9B zjqx^~?D1N5Q;Al`f_Q1RIFEW}4}`{oIt(! z!oaJQcT=-H&=6;QWGswa!6n{DB*Gh=Fmpu;eZvds@^4IK{qJ-!sD^E7)XSJF3vri9g%^_8Vn zv>aPLwsyu$e-X{^r`sFozo|2>f-zn0Zl>mY&eTE*(GvuNefcPkDFArn|TP%WOn0`2}Oqmt1KK=Nwn0+t#4COr_hkno;~HIalv6{|UuDs_3XeIJ zOmo^I#k&P~64*8=(RxV0#N7e(4UwCHA@|Op*D9k&ouDVxfw4!Ty~BDBMeQbP_fTRq zDC_F!R&qnl;F7V0CyXp8EGemLII|>JqT6;47hRQno+6c$@{%-pLobm}ELPo8-l!SX z^`$iHuhnb4Y6+eAh?G{+Ck8#p3>m&*qbqCaA~_-|SmEETG#f*!a@DCC=jzB!<~Ax# zKw7I7(UO3Kn5W<3YpNLNIRt$JD{`6E);lL^2Ao?#i`s>ib-YsV3LQIHHQ4VVmL79x zO>7zaa7eIjMgn(`z+ja8UoqEH=x;LCJaODRwYzQnD2W+HdYM`->svcrJjq*;*;-&4 zGF@_;%*b;3ZtEL~xfpU&W@PH4R)9yA)`fO2)SKRv8h4|4_d-3%<7CPLU}DSnttk9G zWVxqyG_3exAMAGc38gCTw2eMsw_(-_lXo21m||MKRrB;DSlH<@)^~%)KEXWq>-N5Dw{EVdZ?P7 zEvueU9~wON_(_M+7+!X^>`$$37+h03gP7`h*kxaYrj=CGmQD}RzK)CPY2J__nz-v<6E9{TzJ-Y05*jR!w}rzKJT zc^>@yK7XS8i#_-=+Q7fWgP;G8WTN_)dGPahd=lkv@!;R94gBjp`1yNxiR$0%!O!2j zPn3U$2S0y1Gf{s1vKq!O_hE_hXYhmFl#u^`Ht=V9@E_O){%qlw$Gz3~mDvXVqdfHY zX#;apccT1@JoNK> z&WZA0;KP={^$3z6XpN6hyG9Kd`y&ol?Ok+ zdzmQz^B(;CJ%dE~U-jVsxDEEd?ZMCAM@Urv2Oj+V9)F_zp9w#8k5B>bTfkgSUJoNMX=85tT_0XT+ z27djW53E0bpCD2F`uoD@fBx=4qWt=OS=7(($tTKxnn(TldkKm1mwWi1->*-Uzs7_A zvo@Un=X>zK+Xntc9{gL{z<-Sg|7&gFU*f_4RU7#4_2A#s2L9z9{QNxvv;Fv;bZSrXooSAJW>8X5HFu2d&)mZ^tYG(mUdNIF9Pvf0(?NvXI(1C8Ak=L z`tK0_3QZ`v$v@A+KSdmUp5ZW)|4HFD%y%})d()Y89Frl==}LgI-xMGXitlW)98-T9 zF|(=p27h3Yt7!@|QQ~WdAmzG0)89nkIU!T(?`<(Hr?W)Argu@7R+l-i5Pq}$<_SN( z+spK({iVe3W&cvKKfp|s*#1JwwLRMYzlna+{@lV94y6Q6L_gL(25&m){rm|`OT^9Rq@UVXp@tgMZJkiVl{e`eK`;Vc1 zhWSnZXA6I8@smgVUjE-H_6MZ??0|5nj&>T{)vP|9ww*xw@jJU(JFmkK}I-#}&4{%NA$jNelE zuv2UO$102cHNwAw+82{)|5FzG^RIL5-w6KavDCExJ&XN5`S=*O875b16lqTa8Ow=6 zs&u>Xn{lQ2bv{J+&HiVZ@auITE#9pEVB+^`zuq^x8kR_0aQmH4Ld^P45dCKRZOn8v z;9f#*hjG6Xl_i-tX(}a?n_Rq1{zx*awQ?~H2{TEQ#wEroK{pX5)O|Q*x zrRqKU#vgUCjG66pk?@=L8mF0)M*Lpq|0f>yU*utbiADbs(f>%)R8=zVImM#C_swoi zasIf#L;vlf->lc9zOLef4gIdvD7e#N|2*M8fX**Wru|=A>|ZSQ$W#^HDm^%_6^M`}v9A%YQX@#{2Jbl49yV zU-X;)J4^IydToF!RqxUF+%5Lc6aHI`z&7oF%wqo%v45H<b40&s|FmH) zqlB?YiI3k+7WgIP5WQB*nfkE{nvZgzc0;mS%qo;Z29=3e*Q>Tz%a*|Cj6%V zmk9sqt;A0m@q76{YpJVAKgYrTztO|~#TNU2k&jfiHvX=&*gxe6x5noh6*m39%3}Y< zyIn?%pPN1G??>}=rZoNk){(A$USG##nB!b7{HFh%qg<}14F=QxF!6i&f7;*U?O#G7 z&G>)AV*k@eyZT#;A0J&OuqJc&+&6Rl}-Db zM86TH&Z`A3V{7(*XR&{W@bfcQm`wlk{|WT6|D=0dM%_=c{dbWd)Bd?6kSR_3e;w&+ z)%@B9!yIRy?&5z#K;|fyqg^ZWj~>MD6+bm%|5CVqxSK?p_FpRc&G;W61LqamaLG;k zyY=w4zeV`Jr11rl>Hm(z?`41Q2V6}&zHnmy-%Gh^f4S&4?SF8xVsrL&v&gS$|8o}m z*9-r@4F=QxH5U5=kGqVS!q4_U;9>ty7W*$d$u(JqQLFtU=%d=KA}2!O7FvW~PUFZ? z?LRTgxkLEP^Zys&&oSas^J#&%5Wm;?Gff(}Q+_q`;36jk&mn-_~I z9Zmf^Ce#02h~G>9q88WE8i_yF&(|WR{ueDNLsQcM!kV z`Mc01 z`mTlVKjn;X*?B92$tM^}S7Wp;pzg_rE`!@@JYyIb6iQmiq7I^>``_B~~ z_IIKa(aZh~^IelEJY$k+|3$)Y_8%V!zq$Tzgp)Ie_?7)JS{!G`+peZ(L?Oq|Dxxv{ zKY}`VCNcFdTi^;j#0Vg>{d0)lOaJnBUB#I){<8ix9{S%E{bs#hzs}X)#TDc3(66!U zT(_UtZwT0Ny~{F1S6C#N_FqZ-%6@}?%?hgGLyG|BO5WVcreAs3A(qJ(C z*N^zU?4Kfxi$yd0??oz`_E(60)Bf&{x{R&OUzZ7gj_A=@w(uWn*st|#c&G52?KkD0 zuB4nHTB4hq_5Ygqz3RV1>i-PIHz%(D%am*VI(~8vbp3DE|C&z~o1^2;-E(#6GUu~| z->kp$g-dl35>r|0*Y$s1_|5bGB;hZU`L7mZoF>j%;#c+81d=cB>{9OJgOs@buT!q| z>-uLNB=M)HqCYKPx#hbGq8OJ<|L;%yUiz2G1N>Ri0ki&%#Bb`a5dCJoD&(JVZ8GYw z{idyY!eW0BKWs}WPZLUR+P~al|Hl5VMR@*fA{nOr2hsv9UBbpaKekx(YkF;l-q(3= z;`j33v;nSu-A?SkcRchDBz~@`8NW+JKV2ThB(whGgg?b-faSt((rdf5&@tM6gMXgb zpDl!J|7I#{eqFEW7W>zWe(GLhl4;MME%xsaeyv9f(falNH5U7qiTwc~Wc#;JS@UbT zt1b3t%8lz>tw{1rW4{{#+d_3Xsj5*#BE8H|>8Q)5T2vOGUq?XBnK#{nS3cjsMi& z$p1(y{L+29#?!C4->L8J?KkPo{WFQ5TpQPaX#W|PuW|n4`%KJl`hR(X?SCHevrYNQ z^aE*;NBe(C$94PZ`2DNJ{`I0?hX06Uv;TO;V*ic=?O$oJf4ztO-+0*nmBs!Hep!Q3 zYxW<|&)fgm!ms_Lgwc=opWfex_`Uq!`wz*ABp`%*{(TSpTJ9LpZ;n4j3EE#{vA-rk z`_H!6KgGlTA3f~9(PIB%(NC8rG0BXd)fW4g3BO5i`oG0u|5C9(TeP$Pf1$GG*Z$vO zvA-oj|L@n|JAO6`e^yNGqxvZ8YeauQE0WyQ|FT8@G|}H8eBA!+JoNu)(Z5{u zX9~a0O#RuYU&*{f7_mj-QPQ>OYkDQ^`29|F7}T-_b*VxkdlZ1of9#^e^|& z-`PX|pDp@(A4SBJGSzSN$MpX-7X8kl@&4y`Ei}K5>lZEha}(6R&Z0lyp`YL1H}&s- zh}-@>qE%F-DWX3+CH8>s4|P7!!oOJlx$Dwc_K1FM$8ZaOZocb(x&0E6!m-9l=K&vp0ZjfS#IO8k=vgZMTPo|{ z?7w|I{Kxe%b+f3zc(H4120kpe;a;;yt3yU{Gl*ygUDwn^%u>j_xibVbJ^|cp& z(NNc_N2z|8O#Z`tBZdsijHc{pG1D!(zr%+PRY!(oXJ_ZA;*?Go_zTA*CnZJHCppJB zrhL{t>*WZEldp`)ciN}4gXyY}hH)z{P+ncn#MH?UEwU)PO<28?W zX?u@0#y8XUK5hS@Z3}H5(8l;jw0%t5C$#aJHTRW#@0^eEbt5n5ZKLgH0)C zVcTi@oVJ;S%@X`O+UNQ1PTIKN%b=~h9Q%PVo=g5j8~<-`UaI1E`{~d5nKquM{Yu+G z1RP9TrW|8}B-)Z`W9O&R#$!7DIqm63jjxpRIM<0b9&hN+;qQ+0q>cNJy=mj`cmPOk@+UQUHUu6Ei!{M@@ zO}URY{$>LGIsEMb{(b;2tMEQw9`O{B%iPr;EoFYkn!9fLbMon@K+62?@hI9x%f6rT zF|>`PEg)Es^5bY5M_VCnd3}0UqbmJ+QPDb1?7uryHfVA zqWo&wu95v~DZh@k>t+8hl;1?#&9eVj%5R}`E9h_F8g;TH4=fNzAH!f1n^O98AZ$~-bC+Q&jT`BKITe|G?k~{yu z?;f(>lk&Z!yf@{&Xxm5jdsDtIZTrdo{*)g;n|`13U@B+Q)`vE>r7z|EXyavZ-sj~- zUgF@(Jl^Na6`nHlu>D8c2GMpHZG7x-%K3XbKH2C0J)TF~5wc$)`BciMNx4$;vnW4X z%2kq2r@UIqGbFE}{2VFQN?u2Ky_6dy=l4BlN_m##vn4-Q^7AA=U-CJU&!zkVDbJJq zLdq|a@_fk`P`*&g7fXH#<%^^omi$u6o1}c1<$p>380C*k`QMU1LHUzX zeoFEd%2!DFX~|bozDmlgC0|4NS}8vx`8vv<*%0H0uhm?OL<&P=< zM9Nz!|5VD`DE~~#+bREC%3n~vL&{%L{*{!!ru-Wze@ppyQvROuol^dp@?U7<^mY0{ zKL(m6rv<`01L1vk>`LZIBP2eKkk`JiB}(CSJg|1Gn!;1AE+M1TuKw2cpJXnc5K?0K zar-PCk7vd12b$Y4YheCoRLu@N+obZUw3WMdC8c$y3z>cRVn!0n7y3zo@GlYi@E1z! z=}HYTdeHyZ<%c^+CAD(O+1`SQXt7bt09l?(gr^srrns3Q7+$4e<&DDd$110Kb?Hvd z*gMVV9Oz!%f5q1pzd0%Vbl}2YckQBy+1`Qh zj=%tC$F5z0cAL{3XTi%2$txEx&nKb8kY7I_{ov6&Pi+b0t(mzqF#nUxmFWl5p^tV3 zn#X)X<#|NuEYGAL2*B9-2AamE1s1l{`*!R~OTYGMQt^jLfujN>Tk*9Y@9G%$zE>|e66@YA#IU}xGtuws3Ruk9gtQ=8ONXAFxr21(bK~;vikV*q^PZl`CbBWz zGq!Cg48P2K1!=+Xx{5%0_4}+fF!0B~z?~Jr^y-y?6+fl~R_sg(G@p@C*j%(LIB)}# zkqbBS@lS*ESCAc5&(pS=Ja&G!^zPjX!y5wOcemD37^Zh`9}K_3d*!qjXmZ=JJn%=i zVH-LIE?mV;edIK2p;!X9*M^ z$@ciTh2rB1H$GBTe3Wy11Smd!j>N~$Dn7oZ_(+Y!NAJa7Q+yE1C#f7C9qFjUe%(sp zkxGXGsT>~9d56aW4v(*?eF{?D@VK7XI}y-5$h^rcj1PC@=;*?D5(NhxNnXVWGGuMZ!@s$b>B4J}FJYJ^o;Jt!W9UiPWHawCkJd*byJnCY?Bb0D>{DT^I6NksQ z93Gc)cs!WgpDs{TcsRlE%YpD$-1QCou`v94kYaJg=f?(D{E!@2_;UJRSLCOC+0br$ z-i8a3RtBld2sDr0=jY)3ACl59@5@mW{=x5S;eKRX^ImD>8)>Sc*9V&aL|)J6Mh;M| z)n2uhG*)LqBWI}t|ZrOo>!>9 zjwqosHV|GBpo#|bp1mNmusOJE&VIq>K+7=>Jc+WrUja7 zsdxP$(A?!E+V4pH)p6WaCaKPq&L`D{b|EA=(zS9Iui$P3k90d$7t7#2xrcYJ+BLoV zesuJ>G&NpPi6(*b*SOv4myz>{aO_`sEM?{GY0KF5ERQduQMJ$0+@A*XUgq{WPPI=F zwa?JC+&()C^Pc7Q`D$y1YM&j{3@^FulM-w$qW0Oq?Xy9(&l@XAF*~F^_v?+@Nex%d z*|sGR{*~78$)rCx&b(yZKm`*Eo2O>*RIa#bY}Ue-^viD~=0Y0R zeVh0^2sRDf7+CmS{Y*UvDs1wnHTkoGYg2i7ljaL6lkzrRu#tvfO%Yh@SHn5&`@UQ2 z=Mmf?ER*xKel=}Uy?xW9{!I;;MAbAt%LN*;PYpCr$|Xq8#umHs)32x}pKQCaVli8` z?JBBTTIV8~Z^v@2D$Q)4KiT#T8<(c#RwHbl%*d409XyVsD&~!AD6@*)8cGgVsMQzFY`%a+{FiBAfM*vdcGQr%vX<%%vX;NH2E`l zGTSTAl&k7T6IcRv)wgr^NK5aC7CoNE&SR&f5kX91{a)7}+LD5ZB_j%(rlyTw_(A>P zVAJUS%94GwCBdfi8PTRFJ0hps{8co8l^M2N#PIpS7b<7QI-4wO&7MOe_GD^%_F?Vr zOkPdn6Hz=)EB>F+C)c>)vAN{>d~WC1s^+untyR_BUj)K_>ho5m=?+SHx&y7f(>#Qe zwZ2+HRDUP!>iR?V6*vnIf8mCkH0u-+s+G}rPmQ81eZkTw+a6{MlC1VOk>TXDq1xz%L&=m}c3K~03P)!r6}d{|lUXECtBq98 z>b??jpXu8yv5Q6`IxDpH^o2V}ez2*EPmAs83;siUf#x|y zh0TX?MO+Uy&&hWSO@10vrf0MLhieH90}7iO$o}u@4+u8RjS27X6_}{-ObhQ|-9He2Z{k;{a}59V-s9;anfT=*Sxzmt@hc+yPcGt`>6mC5MHg!1 zhEpjb3QjLLgD;*truXBePnr>P+D-eZEA`l*SN)AO=y%hxByxVMc!>u2VUZ|^5Apz6 zu7lk5yAG~rTMe#le}jl;L8|q1=tU!*t{!u`(9bax@qdX#Jo82j)8j+>f_5~8(yg7o zkZ+o*fOMBO(iiZZRSvg6^MO?I2)97^bQNydT1dkog-s!Kx*TXZbEEM_%<=ISqImm& z#l1?O>5X54E%C)<(m_S4Yk&!?U& zeL-?eeDg!R6rMb=q%Ytn4iat>i0?>~P=D&>P&dB+x7tGn3HJ9E=*^}Xw?d7)CxE7`i1n;TbpQy+q8XWUY4NV8Is#S`&xqGpVejBBz3Z^r5OZu zIOz|nnREIzw31ry4>YNjBiCGIM-?TF?FIcif+PO{cIwW&Yo# zKUHVNC^;czI@E)PYM3GK^*LR_ zUx#Z_!>@;nx`f{`l2i{uYhkpJNzV!}BCE@XK^;jWdMCVXYXR*=`^$o+{46qu zObw5u1KTc9ZQ`qwKucPT1Rr8pZ`fxc;v$1a-3(@4)3eqB}QSEPT@lHQ#bQTPM0 zG`@u0@hj|4(__}@D|yuVL9;~{R=5(8<(sr#v{%g{#9uN@&tFSp;Mkq&)O3%=99O+@ z^971V*`udgu3(o#)z_7$I#YeWyZOA#Q}tv_%jO*DmHY_(oXm)hT%wB@kIcfar^ia+ z{I%2E`SI8r0`prksX|L56SNMl$mYiv5vN;j8a0L6CO6Vc4-Pb)O_1DQW#@OK$wBPg zC5zZkbuDt|E7A7k`WW_{)T%w_&C>kyErrf+$s&{K zWW9uCa=Y%U+ckZ`wG6GD&qp}v2yH%ZS|FU_#_gyKjfO`}bK}D!aF5k88;0q?9TXoc zs%jjyI6jiU`FiJmyxzH$cJ%d; zinsY+WNe*JY!r~~T6h4ACb$0y|KbJ=ooh?!nA=sU_I8icX{Gg34m2`;s__a=B3i^h zoV%fc@u9{1SrHwJbsV|Rowyf5QR}3?Z~8CGcYR(kkq1m(=9Kf12ZIc{{oH+Q7Hzq7 zThbjzqmPHF>$J6FGk4KsXU*9DNfqI-C(%=5Q@94i5@_SqULZVbiVgrei34j#)vzSW z)huD{{CT`fiMoPCZiybk@t6$IIMC{~YFB-JZp)##YqO>IumNPpVzGmYH%L*<3RU2R zS8v;g3$p&r?OquE@DrvBG@m!cEl6Ms-8OoNgDw$>b8j6gicDYT2B1^h_83L9uh#^6 ze7EnVDNb_|b+$Jo4W#ECe@fbiey>gLOV2U>Gr0qmpG@v`bqYNydAb-WnNsG)S9zps zJcSn*3!DDHM|q!UrHeSUf{x&OG)6aj6mKyGe3*237$$; zpRU4PZUjZ*UHOQtPo3C5#vrz*;KTwL8s>j?55XN#^XY#ww`aK(p2 z=wY@S@Uk8hrvxwR8@pFHm< zY#P9aI6}Jc7((+D)h2poO$X8!@B{oos$`my625a0<$<*eqo>S5eab|9NppBL5ujQ7 z+J#G)kJ3{C`cajOxHaOT=6qT!BNePiwYrFMYeZlsODLd1mM*wHcVmdjXc%KN5y`bw_2bU+JeO3siUL@1Il{ZlLph zPR3ey2C&wzE~3`D&m64v4<%Xj1VXNx9pz^EZZ?`T>Y=#ibXlY9BTI_b_)l`y_)q3T zQ}|Gu1DK|xGQ@`c)WiB~SjrmzEZSz%b}nt_kx}O}ymsL{&L~l1EOJYp9d7!<&uDmU zqb*xMC7wXjsNRu&XFN^Gdh@tBn#au`JGb0>Pq|&4Oo}xUS;h%Vck`~eo9)xQ6hU$_PsmsAsmn^Oe-M-h>Wsn@SE|;v! ziZn-x>c%RmJ z+%|;^+rHJi!+2Jjt0+Vq0~zY{Q>dD~MMf{(|Ilrt-YyeAO5m2l@3{_yEUDMNDuqjH)wwr`;D^JUH`Q&I>540<{?eA^)R$g$4(Y4hdVPCzi zijO1&dtH|USU1y5l`K~^aCu-d5D2f_`aBVco^5~B3VTPaSji2a ztvI*d4W!)z&CyHHt)I{lAe=|LH1fWa)O{NLzl^@`banp96Ni5!^}44ky(6~wRbA+< ztyC)SOlo&`XL>fP@9mwPCz8ifc|%IZP2HULQ+i$9&G|K@&n4ZQ+fp+>>gudZZMUV1 z^I~cbDsN8h|3()l+^*|$U7YLMbs(Di+g+AK%ulrMdt+zkz4ob8{J%f7ZoW)-i?3|L)l1$!^Z)9aHJ|hmJjO z>*`$AX)niF)~PR%eBY@j{r=jSB6?%j!#VI(Qa<}{&!7Lx^3|%fFa_&p?9+naR_)??B&-B>|KzwYdjaH=UeLw|uZ-E-Ly&qYA7+tF=Al-QxPQrVY z{Z<0&@Fcl?LU_x2nxXsleN&v+>OaBK!l%8Z@o>A|hu`kjvQ=){tD5=0&rxDa@gJ0@3!^BC5xm3@R-wn83iUYOKIb-qK5I$)yc<;b;%I^O+H_r z^!nd8!HFe*hynVmRx(aWW~=39mWEHxBxCy$ZSRMdT}tf_Q1Q0jlMG)N?!;#I(qnDA zDjz#JGa<&7$E~{84Zm+1Ndxg2*xgC-XVw4qJs#oDkJ-NPDA&6$m5CI)$nB4m!8E4Q zRa@Pv*V>*|C(u7&W6K8P{$GdVO_fu3#+mcoHCNs5RH@wN33d>1W&>Nl>aFX8rbp~+eVnEfH zlV>NxTiy7*mmYg^X51Go%yvJQ^6pMmZAw%jC9Ql+U}9vsR$M1o@&8Z2YlGl*e=;*_ zkQ;wg@ahlXwO1qV-3PFW+Frm)w`bXPxPFWv+wvVruO|siGm$no{_thr380l|+l&Rb zfmn|V!~~_`J*oJMPW$DcM#_6SI~*{X@%5f2=N9!#_RMb8HVTiEH0pjexZn1= zbN2e|_gQQ#UOeM>Psp+*S+$-Ygnb$wQ+Y(+<9agVF23th3nHck9n1UyV&`U2-ED)} z8O-N63W$PmmuwRrb*VTvjcoaD?XQjp3GSY3p;ZyUtNN0n$A*?I68) z-8tv!>?P_B6VJ@I?B%e)rb4~fpJ-Cu>Aq0IDB}mJIllP`HeTpUVg8~jPWt#ZV;v}w zd;O>0FBE)lxsOc;WLKb;2akX%PiFDB`0#%XhyE$do&HRJayBE#6zUiw=+W{KYL_L6 zqW2KNPr0xq7{*v)EMuAQ9&S0s^&WvRS)%Cv;fEE8f6_mH3!KbUJgn9vsvb&oJ;yHi zMFVtP5h~?A)R_$L)bBIe>)|@I5v>sza=e?K#?KPa6t^-Iv*YFefHzs%t%h3E;1*HC zbK`a{O}jAs?{P{`-R_j0wafKR?B|2lZGHP3=bFy;&Q>h+zVyk&>aI7o05k<_R3#lS z%?_Fm)DImB)IalCVn!T}2kwF&LwIg3k{3kqXJsisC~pf@#whq(_6=^lZwdQ%nG?m| zaGfbn)}=>Pw7nBvHVQ_;t=eGgOV0`=ie~_5(7epRoxP9KzLrYd_+yLDr2nV(a5-zc zn>j%@7wmG=C-ys~2Lp&|01|UbFDQ58+grx*a;b9E;=#77#`(R=>!pI?(%5Xzox_8R zM^h7dmpml+y518BkAaqo`7*g9&2NY$(hYoNpDxozou>w>;J$5RS-~<3UM0pd6Es)} zue;^%v^C*_&8Axiz>AK)NGpHpH!vYRZgKQe|v z&o@VeLbJ5A{d18bEgX;&H1=J|%!TI}F))ZGU7U{u-#HJ!1N_UNxbx5JaWjpyuep+k zIW+P+>iPm&y~t%$`)7M6F^KOhfraUBsjN#kgqZZs>R$*adk2o7^=oYKa%PHEFkeAoIwulFg5QeWM^RLIVF?2(&4sh-dK&UsnX zWoD}fM;a)850Al=A8{l!m5uw4!arctt}iR_yx6sc26f=IG;mC#2E=d*@d>XH=6#NC2-0vDCbNbG;ymQ-@ONTTJ7^Mdb zO;?@6ZC>bzzo_B4H<^Onv{6F_f*z;i9*Rh&f2NX*)bo$rB;ZkG4f#0=$}Pq@A*52u z$z{Zng}^q_NKx5Z=|4{k>S#^Kn6XyYq2Ekk=4;x)O>J;vMF6Cf2PqcJzO|>7KA832 zAB&Hd(frq1+UBNDi{7e6c3atYp#DkY^VU7dv|6Selg2r27uWO&5jS0wKA3k#vgVXd zav93n@tsJtnhIvFPbD!~NghpZ_oMH}I5Z`GO*}{5^uL{L0m~6Oz@P@GM3q z!W(@qW|!87hkPz(y(nrjUF@b?A&8AoZam53>s!8Sb_!i?=6n5ZPY-rFexbo`+ZS_I z{+sT)b{CJ|GX4QPtHKFyZ(>{4;LU7yGxG0?Y-Objvps-+>x!}OTJk*Wq1*P%2W&XZ z>gk4i-0*#DH(Hb*rnhtuR1tUlzlIIU?Uz&}q?(mtvm7TUv#hRfeW~|)A6*W(s14+k zt}G5MP{gDiMJLf+eV4as{@e1WA2)vQeY)|(bk2+)Ufxc-@rd;9VmIn$E_tu*nPR8o zUOR?SXXOSvhDG@?d?(TMQc<7}*D&Hn8(A}O7#~>jf*r>97{+TTf?-2e<*-=onDBt6;k4L6fQq2A+GZD%)vYx<}T)@>H! zPDy!O?@@QpQ*L~R>zvSki+SOku$4`z8}>DIZJY3RryB1GxLWcD~m_= z%ic#qu})tDtij1}pBsOz;>^w7*M_4jqt z-)F#;h(F&pFy++yy@<9Su zKXQ-Iz!sskEc+iwAk01_h8@)gTG*xP>hR9rz;6x`70Yv?|mZ;8z|g3u5TYMPgqQ{L-^z-oR+WQ z6BKav+Y-ZF1ZzRg6f)|-A~Xyi&>%zqt$Z8zJ|MpYBf7Z<6P@9e7H0jcZf3dVsob`m zA7}>{D6lf4nuH>q2>oDjv?G&DThfEB*^l* zH`WeD#;!J4F~4QxJfu)m+VOY`1i-4tSoI~u{)W_w?(vt!TD}}?uF8eTz+trQe!=ES zoItQIwt7SVn^mLu=71(Nm4DuZ#_2ekuRrAuX=Q5Me5??#dr3@wtUzMDP;`m%Ll zHrII{Gd2{K)^b+D8&i?XV(>{}1+Zf+OICraT?BYY#P40WFa=kRF+leL0h~a#nDkyk zUT$7z&xgFPQKEV5z0Q_vG6YzZJ(4^oJ(n;0Ws>srWNIe)cSO+WS~BSEhVmlzU6Ayo zcb{#*wye8t7aLXQie^4KDN`T)VEh&fu4widpNR&4tPzsdH{bY-#l(~laNI$AK+oe2 zW^4IvpxYfTc`_2ZKb(3o68g`g8txVIj38#8;TCHn;$O;w{O;n(JbNYV!i>8<>4krG ze)%eAP~5L}C*FG|+mu=JW-Yv^IdSp%7tT8Fxcc*3&Oh$By16(uoZm95vg)|<#JokV zvu9t_e9^3VE#>oCFTP;b!t(jE%bVw%KX2Zwxr;3S7T62<3wn(=p#qsvq~3!An~6~P zh)U`*0#^)z-gZ_g*d&HQs}!KJ&bt>MgH?)i*|xW6`EWL0F=@Uh(Km6<$;>QVL*91U z71hp_{@-n8QaZm`?>0}vZf3LF+)%E^1TmO86si&r-Foo^Wh&j7Dv2o#8RczAG;c~~ zCT>!{lb)42!v!Y2cgDZ1##uRw+sr5#1rG*B!%b!yy>Ho(J{>V4$x%g8Pr$K^lHDv^ zeNXEP^~cYx7`1G&UX;1gThwJ5_MM!WXcp43Gyt2S8UoCW*_+Hv=nD8j8j?o>tpEg? zda^Yufp!^U!BONjZRkBZsJ|h4VtPWggaD&*Uou%v?2gzy;Rci~o1*|BzTwhs27>-h z+-g~*gYz~E%2;GYD(bz9@n?RK`(#A~NuJEJu*_<(M3;CR1moa6u{jLpq+6?1Ol3}M z=yY5MnAu*|_>nq-XrVJy4$;e`#Rb<*<@9iRQfjkN-n1iA$nKwj}@poIZ;~$q*V!cq1JzQqO6G9r- zk9~4LxQpBg=-Zdyb3mYHS3(bFuSqmNVcKg;3}|rDdtEr_(=`o|aNHWZv{Vp!MF>vA zJJbxHJ~A~7?j*ubnyw|hL2AAmM^N0lQ*Fo|LY3y7r~t(WCKuhk-!;kVoCF=`P{F6^ zXI=b><@XKfWw#CS(%n#L0EG>fe!B~zy9}rh6tvuRLF;_!&Hw|9?(7dK#&3Q0FmNEa zzc_clA-lIA&&q=PvE(u8@MLDLudek8p)8oZjkZZvgP!mJI7nJ95s<)=^sliSutzC*V_2wXNa@wXL$41Z;k_Y;+%~lMzlVP9m7$^c zhLUj2u-b=*g`OJ*Wu%VFXpjE13cLK8z6OmqZ&)zStgG58Q-TI>Q{Cwe-aXbHn_X(% zo+n%@uWWGKT~)8udH1CU*X?<--f>?;Xu0gzPbjc#xzzQnfX~}q&uBH)dr#MUFV%a# z`RLzR?6;pjCYio%EnQ9F_tvf$N{P1Rl9N76TEZ7k*L7PtG|%NEBP1OlkWL_wPNb(8 z3F&tOhOqU*6iH&w&PimJHYRh+X;Sz|QmqBH|77K*!8^Ow1W#6SYSvdHJ~bb*__eDo z>_{0_+L~F8iQ5!k%BsN(HrCnyBRZRlmqGs|-mImoxg5v(NL(Q4A9DyMODC7?Dh{27 z(aDd5slV0bzA&aIfmGA?gRt9xfPw}1bAaaqAz5DjL6p7jIl`_7iEkMNJ!P%}=e&82 zm#mm5-l?X5cWSTbr;}{l;ve|&hftmj!}u6cwJasvOcJBW%;^;qSyP;#+cF_@H7!kaPmYoT@=mVQFVE%r<=L=F0Umji0m)>8%&DOC)=8=KJR|Kt z?k|`22Nh(NfvA%QAgYZglkk37FcRKwSw+YwqTbtE=WRDwZ?wcYtwl}&;2L9V(~Zn2 z`^InSc%Tk;8$H0bbaea{bB|N6n~u${V`!VC?Jz08nk(W{2#$ZI=jQcqZUG z4A()R4P`fF=PGua=R{0JZga?cH(#3&BUZ-{nr}=Mrtx6MT%;|5&}3h5MvH z*ZZ;ge%JJOWl&=ale#g}2vY=dQeL&VBc!hT&Bpf0^dG(M^wd27jr{iC_ z^RZ0vXF(+iZ=80;7fm(4B}9O9jxpF~ojBe~SO>^DnW;--lb%o+bl6Qd!ny83_7+W6 z^?@o_5j|$%DNJ6rF?$f@T0Co8%Eaop`<;FJG_n^OSi9-P(eydd`pjuGim`RtuLn>X zih6ANvNw}C*PCCdxjs6SnN1AxQiR^XAL)(Vs~Y+c05f|$@@$n=K%lcLD3V#~#-mQh zdSD?^9(N;7$2uOe=bP59pba9OS|^`3O|S$iyPb!6Z$tf%yPb|RSu^8@I34npkDp8d zlezJ+<3osH&?QGrb6juXyb7=+`veU!AQW2}tjM3_o>jSJ)Cv&qhee|m^R)!4(bLEB7RzZ5%=j*-q$);ovr&sq%NMScdlyWA;4`96Ep}PQa$LN?T}}GGMCLsWLoFs zIWn26S&hBj27>`$CKFs5d%G2e%6Sb&W8YAqv9~Tr7%RC{V>I>+P1#{IqF`cd>aDP| zVpDIWKRtSn4{pA!8wnbZGdyQNM1o}^*r*kHB_PPO3qz2Z-#aR4tv~FRcr(dPJ!CG@ zy71vd8Tt?Fr|{LckVS?M`5+Q%FFN$)Na)u^C0zelRPt2;qkcR67w!;crO&{V0#+DrMky6dM=(2PcVx$BKp5!McMm zm?ylzc=d|YzEck-BIFU=`B)y9@F4xFNqV!8s&=;gT~I*lmy+p=O;9=F9~HWg1=C4- za=xtO%W{2L5RZ;8O)xp)^Bw5R{Qi{hQD{iSz2EmXJ|EvBXEvxaz!NIBA2wU$V5odt z!l(;vm2c@)VEJR(Yxl!Ju^_C3b$|gvh*aB13Q;3b(<$4U|m#hOpKl1^kM)1 zyh=YYGZDjnV2-rF4W!1tuz#@Id|J8r(D}_)a1KHIa5fA^AYV!N@|Mx#J5dEket=>& zvXWK9xFxH2C{pJ|B7iR9=X5aYoW0>NBG{cva*u>sjZ370%Eot|@>rM$blpaH2on1zKKnD>kBe^k*Ym2 zYLhzbhPS!lM-uVQmO*YBUSCFf!z-+nUOA@AQ84AB<4=3viDutp)~~6@0XcyK@&O$6 zCUiGI(-Eo(#`ZjC4wE{LYTR$sMw#nL7ggWITyjl`A}OQ&P^c$Vur z?LUGvq^DP=zc-E-50Kc{NbpuS{;son8M)o&x9b?w6q>Zm@O5gC+x!M}A1A+-ibjrN z=pYkI4g!cIMwR^5q`y1iq)hS$5f|xGZ6Y%j7l|Y@6@0;v&5fqdiX^RAHGNTas(DDt z$Pkhhjp1Im`SFDFn;psKp~>*wl4T`|$3)|AIhlEk5Z{lBCy`RM->w?L?WUCX7COIT z8kgr665dn2!!^&_x+AIho|X$`ls4F$`JkhJcBKg0s^zL$8CZu-uPEn=R4IXMm;*;j zlNG};}2T(nGG>P?0Hn$FA?fUq>OOH-8Bcy)1SOV{_DA7&dv{n#A@aLu{j1axT z!cR0SzVEUfa2|6CM8G0jPWz>W6l;sfm?&0l{N3eS18S9-4|{MRiscqktVW+=RTok$ zVEi$JD#;Xb4WT+IJ-lonv2w#$O#&AYtS>RC8QgKW@ItVDq8=7Q;!@t52@FYPH(^BV zy+iRYuykswPp5hozan?HTJ}%|?lGTEF&o^>BxVuQ(2SH}g3Lf+Rmq@%6vn_ga;>P+ zf13$qM6}X-g=v>hl&S-wbV;5lysh*FzIlZP@*F!UY)QF^M7C;@V3^>pRT z6Q$|`qU7#Rl(aM)h$y)qB1+{SO_Vmr?{ik^3^Y663`z3dv@63@kp!AuBWzD)DhBm_ zPP7L2%!I1TQX8^eabqg}g46z4@}|=BYX$euCo&D9{WC=SeKNId)2B2X)JziD5UIEz zPb%cKvmdEAMD+9{>4cq#asrO|2Alysc*&;+n`AC|AbJpm9vI}v&3i=ikPYVj7lL_D zz)64S8_aKuPX0VrKo7fbXY?&WE;j_Z8n~8&JHs&}TP<6ifGAt6@rm+@$k+p%35YUz z^XqetMvMUc7`$4Hwc~r8)usBd`8BZ?TAS+AMZEBlMJz%p9YHOHx}j}zv>_de?_IWi zKk86W*hXn+K1E^oUv_}PWJa!*E%}s%eYj=f4SQiWIBB#}q`=<{8o0w7eoHYZZ?1cMr{AGGR9QKK2^=#DAmxb!R%~cW!>eH7+PR@+EMvX{hTD}%eHt$ZQy|p}^oEi0&lIt_y-6ywI@Zsc4 zh2d+`r%n*x(^nV1|D?=>FD06HPt9EV+XyP>eYW zP$azFuyF6D!h2xQZjRs|3^eKiF9YV?dvbcrms8<)0mpQK1+ee|K)0RMJD>z8 z71e3FU!S>1BTTn_6nHT}2@N_u4N!qj5~br;!e%r6K9uM*XmBhz@LxU-{0Sjf;MZaC z;9iRd&(rbmtK*BogRdGqP&X%n3}(1_a6y5dfhe$k@lhIgg8&8PQ?xyd3KE|bN8(w{5_QU{zY22j0;@T;=-wBtVjPHzFHZwpSd3g?TzpE5I`Wuo8j zt&3mL?AZnAngHGQfuPIb%K)%!90-=58?eA4^*J39%3a~7gZbiq8NQ{52rA~!(7!ZkAWxnQqB^Xxq|nko zBF7gBtjzv;DzfE9G-?Ir*-hg+)8jGbhY5>R^?BXigo-^+Ic~qJO?arPf5j!Dhi^jq zG~riVVs_alvdexRQc#y}!q0p`u+KhKTx&IvNml=a{K@9K+jfWDYnjF;X2#rWn#(@S zB@c4XF}JJFOnOw?kz15lD~-2Hko5^kkD!Q~>bxL+dHN4)$=i^gR$Y(2&TvC+`dnDJ zOQH>kRGPn;YTg3lx;NQ8BoW@5=z6*+Svr9SXhX^O1EE zMBCjkB87^P_3=Jub(J`j?~cQFKjGaAfMJEJ#UWS20bPZbhrYsU!ic57lxbyIog*C# zGDB3UvE4+rWOHx9*qRB8(9Dc2a_wMjWwuZ-wl#KapHF!k>%2_`{8KQ#AWuDq2xwRk zt^@=8m>J*)7~pr3&83MjzLn1~z@r%8UMF)ntpPldID)kHH#BN?fS*oz4>86V?TdHz zkd|R?`Gh~l!8-A5!T9!K5>+_91w)J3{4whnZuf^)1HFAAA#-M|4~DkSYOoV7CB}9u?-2)o>@(<#?`Uf#P9XFA@ z9|NlSj=}{P2UuX1ednwbHPu0f<$w5?X# zxy%ZEG{~kv^*kDAs^`(buQ$2>Jiji72R(~l`u_i)IB-@QioKil*}c|IVs=GxiIEf>l3bISf*da5 zOGUvlO=G*C^6Byd#%nqv&@+9K{Dzsa5`4a!Y(5O)&rXeimA?4%xH^bU=C^q{n_gBj zAtFdVkB?8NXgxGrXE(#`41{n}^!MEs45}Jj@UIh!TMUiWIlNs9pC(llSCe$>!Ux@S zs#bBSax>C7r@_$Lo$0Vt2;Y|HTB`Xu6$%%=Gtm|yXe|C8KZPjR`qV$Qsa(`Eks0$% zLpsj@$c9{M!Q*Xpe2=sGR)23OlIfboHTwd<_37^^5$lQo5TOFdGh|X{340*4+fN}O z{||sjR+&bZ$znxTuWmDkP-EJX$SEf(0K~=qQl0^|!L(ZMC`y>mB8W-@yZ#BhaOrfRGRB+c(6@+1R5_!!q`P z79tp3f*umNS~AxW!6{mx9-!5{y;v)3_Md=+>enYx59?GS3MwXM;~nMn$-u!FfSdlJ z3nzZ+r`KN8+o|3tBMPIy*h;Ov>r^jt^Xvqka>TD5A<0#P*!w1$HwwG``Jet?BpnxV zbS(igF0JW_gT-G6Txk&Ch0Ati?~!30#1$=%*3#Q~besDHWjo&W={h#~VO}TGm#?LZ z{wBXB2`?pOqc-`QFWa7NlaU=1xjLZ8tG`Q%->BJZ{(O6&;>&hqC-RZSrl30(e?RH> z@9niJWZ%lbYHm$|@Tya^gD*$BbGrV6ZsPEo*(=zcJbP}zcq}sox{27)UN%l z5m6LB&gfr`3SCn=j_V7hBf0Wt_)*z=_`ZTLG3V9}U_w#x1#5j_8) z$l=AQD5m(XiB5-{fD+#O z*i}5Q0-^iGroC8b5b;~Le}85FFUdhjTrV1yKtR&7#67A)|ZYMsu+IE#f=%iPFU(fq-s3~gvu+l zO$*Eg7!UcvGEEW8Qk>@-B?M~$3LMi# zeoem{I-XlrA~gK6nGtEs&ZME0Yzi$kr$peV-SKwoH?ucVEc{%(_e{O9`1WDMEVAFU zphY+nAKIxTm`{-}DTd@$d6W{X=4%9WSv=cBW+d9Cw~g=$EGJzoC+`eiJUQj{D6mOl z+b*A8V&hmCm!>L+OS850`6MAyJ`|Tm!AkORX@cl{oONv#-k7E9-(yZ{eppgchjnvYJrqe_}ahl}2|o@=5RA;Qt1{ zO{P5=L(ObMmejENvIn2iV`m2Cs~^!}Ot*3~<@_)0Pr>&bD#OPF#rFnd?^9zx#~z}I zoVgem13u=#;K%<`d@8n!e*DdcT2A!iZ@Raxezs`j$LL-3Ryc|Ca|A@GO*nMuv8oKBHV7-1w zXf}5pVozj0;VCLTZ+MOi0eFUT=%-;os`TO=wL{}u|C1g5b zClNdeHPh94UEjVDe_gmLLEWF{l{C+QB0wt!yC7=k+eM*EdYIR{{HUD+#tVavPho#F zL$nxf!^-*oGW(--wDzOzkIp@i{m}^n?2i;Dtdt#4gr!*qNW*gmNYLZX0~;WT9*6xn zVV}+fX>V?S^KpERzgpiJ4Tj>+E!jpMVb*KQ=DZ{}{x7vdS}QxGR4DWd*&*Fh^d+8G z6vw#!UUo=kyw9xj9yKPeh8xrpEoP^o>c!J=&gA?XV8d2s0GH~rtFmOJ9-E{w+8bBr zPPMR8FIdX+E4cu`L7*Ht`E}t67JfByO|PzxKfCP0`l@HmgDhDyllF~&oE`8cec|gl zn2AV*lHsQ{x`)B@(xlnW>4vm1uT2|$CIVZx8gjw6$QF?|kuoSektLpL{k`_gygNuu zdEGe*e<9P_{1(~1qC}Q z=-F@y*Ud$`K4q?N6b<42pNrWc-BNr68843<%JuFD9EksyylCF6^A}FOsO7lha<_`l zl9a`L3(;80Tb9f(aHv>RzG%U$=8I-uG;1af&G|odV;Up+xXY2PHg1cYmO%8XH$aES z@kPD`c?-kZ;UWcMIPBW#-QLKfcg+NoIDNzGPLp|2Few^(#)Da<*H@Y><2t>LTJA8B zTz)iY*i*1C`*l<`#7qrtX4dv^*;D@N&b7;EGIPTURrX{6)cW|ZRPVBd%nKB3`Kck7 zy@0>(Py?;U-U6n{+f)$wJosyB$xoCQ)wL$F+F?p}T*(*17c3E;z)p3nRdRR7jr<5T3@8YtWBthX zqgQUT8OJ(rGOAqPb~SVR0zNgO8%nEDY2GyjKsEQ;pIkK<=%hQ8+gP;ANnubkOmi8A{NHP0Z0(|#do494dD(`AnX zmD~$7}lX345THrPd>Bbl^vZs?%wg*lP~Sq z@`U-GcjimV-bKAVuREu_LTSIsm+f4B1Ett9pUm3d?OXikuD|BaFYB&cS)cmu$>59i zPrkNe%Z}%t+WExx9Z$c#v8bhJ$IgKr%&#aGRI}GGQo+Q$7Dxh#+tq6=eL9n1;%k^W zg_Fmxt0B>8pTq#vama?hsC`u+hKfOkW*F*3`389bV&9SxTurL8^0UzOfrHt*GKCV5 z>guA2ZSSC(f7HxKpq_|wS6alYq5P*RCZ&kP5dH_Lbw>QWSV?5J>2=)1hG_U0Mi$Xg z+ZGo)rQ*#JL=-xOFO2;HQ&}|~OvbyGyvF|KC4GnX`k1aIuP5RUEE(okUwUva_RFOz zwsdHs>K!6)6B#Yh^-i(N|76v+gqW4CFk~hf-*G8HiVlG)AXJef$qDA<}psi}vWeY`nGwXO#nX{MQr1}g)~NZ%IDv|AsQb4Nynkw_({w+yVwn_N!vo)3@k=!h8*c~%E**y%Hxw8tKjF}52A?KF4 z=YZavW)9^XI<3prfgL)@DGuVX+ZGZqrnaFZ*57zv2DIQ z-&WpxC*e>L^TY0)8EuPr{E>ot)QuGdG- z&yEbOEs1i!u4M3|BSR|&Dg9?dO8$9d=(Zt)xZXNcZ|@&EgzJmu`h#Ida(~CLsa&@W zFDB2+!zXgRZv?LUtDT=I<*|cH?i(3;;oyV+ZDi;lN2;_fBbl)KMn~q z*Da%*PNwr+qB#_6ujT z;q9(Ve?CcgiK+Qb6Uoi*;tHQkHxWT;;=6uswoG+MY4ydZ3aFDU1*-iVYsN;|UDs&E z80@qUh0$tAAFX`#RWG%@Q{=4LLz}h5sU<(QUNGEyZQI`PYn+H1r}A?KLp-f4Kgep@JBIdRsY0pK z4RvE-eAs+h*49fkGZ0Nb&O3IU)LqFH30EFQreTIbk43hVI~>%6irVBdg;)CBt0W7p zQx7PG>?|wO32kVO>T=C`y>KWH+vc=wWhl7Y>a6@VcN(#}wsDHTuv;UiVe3f1Fyvd} zk5;WlYgazmA1(Ov%*4HZ@<)$WHbt3hXplL`iLrQuRgvSR?7oW5*H_G;EpxyniTYPb zF3rwI=U&akbC7Ya4d6&0kFW^HK?(G;bf(6_rkN+8Ac*#kUXw1CBD+2_CtUB1ttUu| z+wwg@Ohb-!5nr)dQ+2gzKSzHeLSXk!I%zsRMXPiTtk{gmt7Ig63a##@A;BQXer_t@ zt<;Kd;IA{YcwMQkqOIR%Kz+p`2nj*2>%BKp#BW3aiq=+PDe({%bN{)r~nOc5z2*t9F zy7ZY=XJ1c)s?l;=T!hqr#6F1}imOxIfu{Z;#v{=@1wX>&*mkD^H^RZhsVBLMK&*ilBfhXakiSV`rCkw!T#s+Khhx0oo z4nDdJU&4JYSR^cusw=h|{=#6fTFqu28!^qru!YS2Shb!(vC1aH0w=>295~fF=Ob=l2IYE30^i6C#nT#QhT2 z7bhOWpKBZ%fd(hv!Ku%7nh4o`S8Em=>%pjewllg%Ixf;V&mjVrU%6c;FGQHeWp398 z2qz%3oI`dWxVpn2u1{5fD~CRDE&EW&Jtg&~DogMnY94z$9;uZIsIBjUCBGASix^+ z9ma9lf9cOXcRcQNT*)KWIZ2tpCENOmr@xpKL4RpZ2-P}?5L{ORp8~O>nE-A#i71ii z`vB zKN(iWwP%=vJYg80b`B@&)dzhJ7m0&-ynO_ZJDvYSasRveCul}uEK3KPmX>cROc)r3 z^I)8cjYm-3?d7z9#M+j!oPJ$?LF{MG2h#et(`Mbx-P7N%~+R=fO$Sjt011ql#=!sdxCPp!z6T z0+l1P{zep%%l!rX-|x@x z{9h2iG?_UV{!YcIs9?0^XyIu}Uc0h>XHj`5ALgDm545!R?j z-SlTP%?Ot)hI{oW7G%t;FOQkOZ1Rpr6eq$P;7xwkG1QE_~UP#fVv3 zq$i}GQ*0iJ@^wNcCRh$Wq_SPi8Jlq)8V%U!2E$=ah!3U4Do*#?%y%Sl6DnFtbBBbX zi$z=?sUVDCg&7$^3f$R5Gornp_veAFALn-BkoE23P=!q(6i5}{-uj$Q*-K_F<6%e3 z;eP&>K1@s~oM*14M-Fy&hQUR=r{2m2RLV=tjaD4Blk#2?RC%lB|iZP$OeU zfvfSsHla zGJ@a5+BYHcjLm~tYJ%sPE@o*jTq1jNlBdFvRieO}@eF&YdzKu_T{m|tZQ2w7aP$UrQO9(?|!7@8(UW-8}3-bA&P z{%^JaTch8kx1g5Y#US3hCY@lQ>U_aWIFs#_4zB&dMnP)ed~m~4{{Oc^Z|W%_mjh2Ev0 z)aT_styJCG5>U6vj%Wd5`#PVQ+IRzvQDaO2x$mlj?!}dNNM3P2Y+dT<0|Eb zw~Al*E9co9%`-@xKhd(^1fdNaeDc=YWN$X)Z4$}`G>zWo51R4C&pC9C8j$I;iXyy2(ls9JJ#LH;Y6-9qPH1w0AuPZ)X%@2o$epDR&_0Uj{talzOF1cZ7=*8la z9}f+^SzPk(Lqb1`l>Ecc&>ti7xc;i7`uZWECrWNE;^Dueqq%O0#y1Zo`fK#|p`jOs zRM`Ddz{G&Q|4;D8AhveH62_U8Nc4;}ZJ62rPT%INT*aj4Zar^|AeEe-BPq1F+~#X~ zkl$y>q5sB+gx`mtjkzxtkKvmm^bO0#)8yu@a_E1Pa^0;QX0xt(_1~{)piT~^bA?Kw zy`5P(Ch4KzPl)ikGp?)dOzOxxp>puw4_>~JeD&#bMNb6;CmQ4+6f z9T61nGcmj}kVJp_AX3fYZOis>vmja@zsp%w zLNY8hY}SIZxQw1+O|g_S^;Lvyv9m)Rk1vg?tXwJcs6d%SrM_$mc#pNv&76bAcV5gE zaB?)^OnoAmKDGg?uYsSdU&*vcb$thEcwbZvtlV(W>(0p3Q1w3etujbn^2N}T(QF5K&N?}TX7!OK#rH7uU*vO<0>_?jHpgN@+D-xiCYbyu)G-3#H}frrH8$Q3Ny0+47Rd0vqDYpqa=h( zO~~Njqb!B9-HrJz1td@x1Ft3{(Wd?~dNO@G4iA;x>J#p$L6roYA%&V7ZJmBE$!`35 zE#oyE7ECLcX$zgFMYSr20Ah3%)izDBCC*Mc^F9zT?zN4YZdwqtAdUHucBao{wWSK9 zJ!zUrDGg53{h(pf)0DT93T7G@>y2_%s)=@f*XvzWJ=s`Lt=`*Vo^EzxGWXN*hw}hc zOe4j6jXysYHj?4TC|i0Sip156N-O`#4E1;Z+?|pQ&U;*rE8Mu#r?DEk*#JALd7r}`M^2m`C(1qRo^5nARyVV@UTXu%xCnkyGFE|xml#;lSGNp&@v za{q~DAl%}#B`D)u|5byjq&)}9U4rM%to;5gJoP;t%)vX`iz6NTVx@CB=Us*s7hL7k z&p1Ar9ZZJ8{YDIMvuHd8I=`VDk7uta;NRW!*=5;>O~MKq2skPAa9Zc%pX#}+5E9?< z>t}r_%f|UI-_C}z?7!#Q!*{jO>~NFYwy)K+V^4NgA^%Fd7evjXmK}@K93E@LVenY% z6v6q~D0ln)X}vZ+N^DtAvmO&)Fdj$8e?QjpMeCS1w(yY4No6WQ^Mw<~S!Z(2IJVvS zAXDr$|9qVKoR3|l5&j?{`+}qqs&I(7Y(s;MFe?y%839SYR-Y9W2U|(IOn&I9`K9xR z$PMlod=<|=yfYkHK7xY-!aU{wa{V`*FOX1TIF;)f_@TI>1r_WU;uxM?mcioP4R}_# z<;B_-=H=!4pC|s;oJVb@>A>@-H>vVA1THIY(_Po@k2;T1*!5JHuzw*HGVE=2}@rY5gnOe*l)USS;GpK*g z8Pv}~Z{8`Itl{AAv^ldDoWF49#{`!@uDq_LeD19C7qwtly>Qkn;>s^*xMmhY9%SE&0%7hO0H z3H&R3i9byLE*3{gWRSxkN~p*1X667v+IHR(6qp_!ci7_Yv?;x|K~TVO(_ck&;r8L=Rz=wAFOG>>{zv@t3%nkN_860EvlWr+$RAioi|`$lOQ4$RW>(c*{?r{WaZWR zUZg_)_ zjP;Y5Mx=!861rLy-DHD= zdhT)lrL(=WWf;MF5g*^>ddi*q61Vw3_oc%8QfUf-G?f!Dg5rxz&H+2~CTxx{Pcy*v(9H$20t_5*zJu+I%wy0+EVu4c1By}~lLU9W{0-U`6oZJLB6BcF zd3$;n1^bEg67`SKl_<%WKg-IjV02IPM;A?q)BZU)GHIyNQ_6Dck#gb+mwjCHZZ zgj-NR4`kx(Pm@x|St`XWEX&(BB$0(SCNapvBuv8viulmBo$1dNeJn9Z`=#kTN_?D( zrqulg&2ncdvsz{5%A$|`X8t8G<&n`2v70|&3cerF>091QD8jdTH{XC=8i@WR8uiODV>c>POfc9PiWHTt~9jYFVX zI4+SNBHQ3?Go>$?o=O|2B)fyngni{Xpg7j`Q(~?+-!>uTy_WqRgKU^Z5#=?Yr2Z^e zDWLMtbH&0neFrUKsn~~YjHy|4Yc0uoAiR>zqlcPaRD12bVLD;rlvMMHSOx|s5wml` zAcL6~f%}UR8_SgUzVQ+czY?&_Xi-69macT={vSv=BI=hS7M1U@JwWpzSwexO=nRa3 ztg|8j-sN203{YhDR~~#U46-D94(?kAXaUJN?{S;eG~vM2vl#pJTOkM{u7dh^I+x47 zLZenmq`SwoxeOgiC zFD)K}tHpci6W{ZOy765t>=|}N(oxSv?YCPME=MBma zRmU{bIJwQY$H`x;;`lT1NhEi};o70^%N-il2CW{HGWciR5} z&_mf4PfsCY?H%pYVY}OsVZdkf-WUeF3eeA%vPKk3T4_FOeMH5f4u6I9%zJgses%#V zYZt&Ym)2c@SGc^A^qZvOTsRFaGg_ymp!exuuJf!o1?K{}Y0LL;BvA|JFBV3R38tLg zH!BjAI*%P&%)-4x=NmFMU=RZof%bX4*I>Df%N(a;lHQN0;Qa5I%O<+bV=9QXf;#HM z2D?q+pwGNu6Qg`v6t*l}5#lt)8 zf09&O8v#18)V|)2|L>k;w%=~x#y82$6PG6DQxo$^@%;q71?+%PQd(w*1;BEhPSqF! z=gx16=}jkDd2^My(PF;%U|7_v413B=dp<*t&1pG^+1N%6E-6kU>F<_UF1cF^4Bnfb8AQotgRiLh)D%$mf zjoO$M$WYy}uuW~95yUnvBi+pR%HhHNvDo<@i8<2ZbqS1>@{H9EExxFe>!Ls*RAIMPv*XDFbqL@uwMSlV7=@b>~MW*i1NH??pF-0A?2Z=QLg<%ze3KP!;awk$Ki{)ZaZi=IbS}=;r>S>O1S^o zh{GSOEdH@`szt$T<%|FBZ_YuRm`=2)Kab;hkl;)`wlJT`p=35{AgJ<`G5MEL%FW`?C0^V`0VXr?r;3u zVPyZ)=b~J%{QN%^@$=hqWo`fB5U#)Y;&QGxAO5>A0R2Nn$x~l0-dr*AkuMj&Ss_6G z=7`GQemS)M%MhsRjx1SsRPlctIr8D7iXT3*gnF;8ELl@kytZ=WpDK&*t5kDuuPRx2 zRA@`psQ0Tv{Z-=&&nyIQbAK9oKSrSO96wT9Ahtfs|Hk^K|4n}lH$Bo=-DoXVv{M3z zwMvAEe^Ta>{^M7Idw@~e0>mNZZ?T-y0N4P=DZ!(_Z z6#(jb%#Cflx8A=x-dkQ?pYwk>&0i+jsz5vQi$g$nQ3e-;fxA~e5a)6{by3}b;UHe< z+c1+1RN(kvjRi60ZhN@~e$l9o8jKLzxqLYJNK3(99W%_i{C$d27IaF-q@vE{uh?hI z8=PZK;`s@l*~ls~qSOAY9(4Y(w|n3J7=gzp|JkK@)aa*ST^3dTMFot`7f}5d74VQ* za=%4z#f`N@^>I3ODuE^yY$>(Rr%XV1dJ0dIq#-L+88vPRfFExK@+k_F}Ui;Vk2D*k@! z9oczQv}S|2@CCd_Qgga&*A!kP#=3lU#R^7%XBg;0MPE$f`<}(OD94o=qx4l~+uc?~ zi0G@0Zi@njq)#o!?YI3dg8`>>dfRlI5JgG#7sMNx(F5DvMX;2XQL1CxUT$08dV76X z{-V>nIv!Y#9xpJ;JZC4FG1!W^?5(Vfkc922^q0xoqchZyow1FQcfT9ofD6rbwl_P7 z?jqU6vXO{u-Kq_S$K#s>$2Ot}VsB;yXUX{6Ef?eKvFKFXwdc?4OJvUI!)^FzH~wJD zHxrq~yE!e%t=eu}R5C7-ydHPYb~pZp+r7C@!{tobY`JM?%6&My58`OXA}GA6P5Vx> zC8W6%DxA_|vqtwYRtDz0YB{K2Ka72O+Y5azUO1i&>uk23M%%Zy*MU}yS6IuoE=a|~ zJ~wj)8>zcncS&X#>*c6~`NxZlNOnaC$v!!`^h)a6smn`vYi*JQ0RbX*dD>Ex%aq(o zN6a}H;`qyFJM&3Q;xR3yD%0-`ad&0eZ_rPmZ?+%VRuB_{QGVD12uZG#2M0 zsLhzlNf{=lmcH4^Xk(5$_dR|wp})P4Z6X`44wcIHQ!07LC>RpZ?lDS+?v8Ohsx3kk zMzq*MZpt{2RbgbbA z4=Ja;fw3fxn7-6Lc(O=LhdyyGKT0#4v_VQ*prk7f^^+!x_PAMty3FVmHhhlnYcjv)~zLV-@0qfRqfhm;-2kWr>5Ewv+WbXrO?U& zW&MSPRR0YMnOwsV3y2-JF=^7*Xgp2m5qo%{fvJfRQSIBVFFr-aV;)A->jYtM+Z)bN z>)W0Vqe9PIquy5awDpC(4&A;1nS8?;*Awr7KzSMEcb(+=bja(7agWX7>bC(hwqZUr z3n7){RMEg{%zy2APwKqUMEsGKQ{BvoeMHw#W5z#_tm3G?EOtj-Xtd?ehKCH$Ssw=1 z4gbQg3yLZnz_umNfVB=q7J3_G8Sw=Z zThPjIYX``1pEA7=(rLOknX9)q_sDmDNKo zQsD#gvL{lZ*4L!Bje{MDR!HOnRIJZLQdJMS;k}#$k?^)CX5sSrL;;T_<997gD1Rz_ zSPGj0*)89d^m=-U-nRnCtIxGU`L4yK(C3h`P0Sm}qS#yZuHpxMwj-EcN;yQCZ0xSc5-;IodU{zhlZXju#Hcp#5-ij$Q%28{KEku9J|l+g zTJjn;bxV%Ydv)Ppbx<{!csoV*Go{J4gZA{^49GdyLmF^goz99Ts`ds^;`TDA@1Qr| zl8X}epdTe}#DFMq%b2u^95*0J++EoVNhT1aCK*8!A)_JTolIQ3jwrXe{TfJE@2%7F za)24A!%7LQr4La3)_iC-;<(BTRI#`Y7h#rogDRxRx;+oo7vCUKLde;|Ijs^2m>W4c zJ+qwPCQRVnd$tyvMT7%vJhLqApWjW}_I16WYB(OrMif+!oQ{c5+Uy^ZLW_0FS)-mj zaH@VYn5u^XcT)#kshzTnj!7^Z4n%N420MlQmu`AMI8?*>4-6ZZtNBwB2~n@!wb-ZN zvj!Eq4wGLVs?EbH`@nIjy!nBBfYm-vEHx~i8OKC?qtiYGX}qt>H{{v`U$n6d4ar^j zCGb770C+6{0M=yU8ZCP!pwcy3g%=;1Xxj+2xItsxdUN(os>^|(nl$)=F242IiGfTv zr5o;G(QR#JB*S&-DdlATx=&y-wWfg5+l6LO&iOLO^VaWq%yGAB*qD0vTi&BIqb!`f z&~gml-=K$W1Z}AlH^qNj0mp_395S<)&v}3ov}dzy-X7ovrxdK6GJpa_y8MORB;nmuQ2q_k8-&PB{WMCl-s*q zxUZlBGj;CCQCQgaF}-X16dW~vjb65l7PYW*{sc&@NnF@#w%4ABznQNz)1s)Y({DUp zm!`dxmOVw2do1l0d(JV;-wy=imOJ0<$3nqSSE#m7;SB^^B)&^g*En)E>I*&vJEEjfxXTfNFL`?lL z#GBo&70~P0X?{%Ue#`8ew0)B{Z-QDq9H=~kVisSco+P|8%Cdh_@2j>#Ibd7{^bOj= zzQ7-=Y!mq;ok@7zR-lVyp?5S>yim5_0|!&8n!j`k7YHc6TYfFbaa;KCCl3u>UG$TZ z7Y_|>mvHv6D9qyr(T!meE+00O>+j6r1tX&pmew`q7%EnN-|^7!%}*b#ef7IqC`pj&t~h0fr#;ZSoRab zq?&_UlFi?VvaPhS)78#sZui9asDoB{$Bugpyzr`Zq;YzSv+9@Jcnc!+-W)WH#uR`9LRT)k4kNe+QZ*x>YfZT(^(J z+RggS;MX+k&L}zj*8`Pi-EPKgbvfL^ybt7c2A-%=!bJ zAG5Xa{Fq@@zWY_YMJi=wI1UBAPR40D#7)x4~3hu@fgUuAmJfr1jecU;uwQ1UNMI@WKP+a$PC|V_aVrm zlVJ`@msJj8X~fZ-2znYle4zCrRm-p};E6q~&axlhnZ1Y~>_NeDntSJ!v_8CKo}0d6 z1$R^`+^xp%x!UP?Kq(q3Z%Va${FKU;p(~b;3~^E_ERhe&`Q=$6WYE7Ng9btebHt8u z{U;2L&e`er0YFP?V_8Me=LG1Axq<6FHqFCn=Un=GrG$ow^qB^ZO#uIL(TbzEA%S9b#aM6 zb&Pt}dT{6~6yDRdxIJa#_^(-hAIT_m|wR`@dCnYp-)oojTR;gx%Y*g5hOP?m!*Vh?7#7 zMDT`K@n2eZ&8uV6YY8G-jl$s^qX#pBZ_KBIzwWaxwmhDqeP(muzQ+a+ zx7+W)2(!sC5hloz&INi`iwgKlUJ5QZ`l63ka>BKWHtTpuu{7`x`7?i0A03U>Z}PY! zZ_*K)X%g<8p{R};e%R>A6J3ACS6rjUO(`Eafi~UXDy$ece$==Le|Al&m^=nMabkAo zP=J_8avXNoP)Ko!`H`d(@2TVFJz%PFssaiSG!Ztu!$_nz)q{OgH2Oog9y1SwR_n(& zCv6-I7|i6g>+zd9#yMjXHge9WgX3+?tr@4~;2W$aiMYsA;f&S!2XT%shyi#0YtB#} ziIgyKfQg;7aXenXPOPDuY|*^giss8n>v8nMq&kdlGoToP(3>!x;Z0yKNvq$&x$+#` z6ZlIejUYQDc$hbsOjjDQh)vqL7U&vLP;NJ}mAE zLpb0Ncm2@lc6!&|=l% zq9OAttALthd5~uJ4ugA-baRS{DWfn1s_5`o%a2O^mX%&gNt>`4xX5Wp6e;4a1BNjH z1D#MR!XsJ&CZ1|6wR{H6Os+WRb8dSz=8^RPf-Sve!?VYd1)NDQpuNC*A5_xEGG?we ziY=4g@$2gBbhrVz6a;s+!A<*!=@L;O2Lw<-dA&#}1r|BwthgvEy?_}%n0EkCmdI$R zNW2sS0+-USQ2Z%@7vhODOqv`PGeymtXxh38{Tw|4?BAz=2(d_Ea4+CgsxK>Zt)PLD z>4kwN!hnY{341enQHat*K_TGqhhAbQ237O{grRLj-LRAm`;P==nW|L9@YXI|LEEu6(0&0R6AGrCF%SEmna^)0* z3e9zcp2l&sXwI~G2=H`LcB{G?!>~70j2SnRY+}LFbk>&sGjQ6!O(A@w3q6Afk^IJ~ zXVQL6ao#l@kB3d`)u+-cI%TBlOT>f7p~2o*(Ih^G4-&P(XEc7`4|MScqjL>v1kC`c zO6@_jK1ozS5v7v#E0h=?nY)GOV%q+M$Y2Dk`Y?S^c%YJ}3Iv4(6WLSHHo0s-GT>Np zQB3HTR5xV3P*D=PUMyA$z4^P#^NOo?IIC|$Jb9aUw~~AV&OwBU!&gvWnkRIP*fGYo z3-h;CeC7$BMm2>BcfU;S2Sbm0)mOGnyWEyF@n0!T-kr4|0!ytf$`08=%x}c5Kgv?@ z0#9HkC%U?>Vk6Q`?HzQ?Q+qtlXP)3E=iS)+Q~n^$%tCdHi3w-TLl`T)RcLyY7-!9L zdPD>Tcoc-0bYCEP76`PLvQH(y<*Zob;;-h_%@*JEq7hU7Vl+%71?WJUDCQ1ByP)X- z|F9o6;cfgwUO8bkW}6A0;8;&s9lK@?Sv%x;NlZc4t`FBjh{H{UY*?a|a1)vKb@(Gt z9EzSt_FtfZic4Hn9hc6wiqFF#Gy#9N>mhJkn@l>zx457vEB!PnN%R5HCe~vfMgKLER!t&qO13;(! z0h|Z*mjaq@d(kQEx#Gj>ITwsMEKzYRP!hje^;@_9d@v%qZeej z6*?SqKjB<5U`$O|tmu0~Ph?jjH#BwD;@4j`il+K=;l%Kd)q6q2a02DQYf8&icCqk= zA1GNgXB4N0pG7;5v?fFI4WeJbZfAk(@W${!cseS(6J7)1F*S6Wq@%J;S_}k+uY`1+ zQzjUchHwg+wsKQ$gu6aWL%DFT4U-`kh1=lYOns9oToMw3Pm_&7sc+JInomjDpOU9M z8Kogg0;j&W#gL}QkS0!i;$b#Yh)0{RwmEB_MV^i;z*d@H(2(aKL9%W|NgCujVEBX} zNbd!p2tvl}>0^NCCde%n4#)QjQ7J0>k))9df22?81A<_IK@1#)QRQY}h`?+>&}oX_ z*11(nM?vYM&F)8JW$woKF8V5GID8`Js^6n6g`Y<6Pz@#zkt+8q)Y*}g$Veo=FFjBf z7L69ve7FNba>5c;Grv(8=@>oo48eEQtJW%y;iW)DM$eM(NouWYPD6bCZA3JnD&Dld z!b>PKAg9nuDn&9exrfg-Wc>x*jS~`88JwY~O{zePUZ;OgmWV#rQKTt)MD<}heS_lK z{R-dzj?Y8y*=kvCZT~F#<4h7-1gz~JJXw3%nx$#mtPVJvttW15uf1ur<38UG9}RZL zzdC8Z*t>>K(RMf-zjV~@OmZ}ysLgHR2z1i!Zjtp-d+oaxd28Bhk0(2tPu5l>cYotV z7|F2%`6bzg`_h(|;@;5e6AMA99apxu>}Y)!+|Q&vK+qv)8{F&CJLA4R9n{;m>Am1w zd;)ZiLm7B}D8qs0h78AJCu^T%y1}*n>)T%nPc=HtPjt-Ql$2vHG)O5t##*U5;kgJXv+fUIJcLK1n zQ`=uUX|J9P=cgyPhPM@`!1>ZC$#9~`^s8v%^{{S20*~uQj~a(#BqxoVK6*TChFm{s z{AkzIk>e{yYrYBig`i~W=(2KHFBv&%6zqwRkq^-XXcECZu6Hce_+IhiE9zl)jvN3$ z;}IVrf}-`2C;70QfBEKa=!fEx$GwZ!!RRq8R$wjLn(#~gO%2rgWJCieK!4yRCc_-uL)xpk?%HTxwj+Tv8O`W@L+|-OjtjC)` z^Qyz0VMaJ~(}>7hZ)i{s`*?$r87vw>ES0RnqU7f-C~T}>agB@#TwDs%_Sg!C4SZsQ zAi`+0_Lq-B1;eotkGcq}iC*Hu*K6@3;ye~fm52esnh=b>#6f>u6cm)A*n?lXjy)Ar zbrcFDJr!&IvTQ0LXXxr2DkqUwZ`oW%`KVlQ-KE5TkD$t?kQ755{hBle1n`reCFG}U z8P^dBdUNrgNyk>*JS}_%MAyW-L+&)Qmi)1y3SxtU8Q@#6f4L0D-#kq#EjFxj?Z<}3 z+aRIDQ8yDH9>#rCwx3Pwvaq9WjPnpzrL%^1L}O_$(-kB!GF-W?3qYMYLn~X-SFl*< z4KAWD@~W_N-ZV7vSG{;nT!Q}4bTX^X(nfvg0UzH`>_Ql=p%|q`Ke_ayd$2=VTa0YT zQNFl3x*R9vCtDoIZ!(11#U*;2$f8@&%H-WrJMo+xax44@JrSgQ*ZD6yvvN4w!zJ z(QXep5(?8k6Q^?7XR%}|e|5#zJ}j;8o{!Z?SMXx|We2dZ8W`*f7Uc$ta}g6~AV~QT z=KwfsiqU~!B%lDsZk*M<@Zdw)mij|yQpyHE;8{Y1#ThC<1uWx~XO}{`)a>kE3h$+W z1#tn#;{_xO*vhR;52SPU1v5YaaTYr>(4@Scn;?9zqlAZU2s5Rg}4*Tl(GOb^KhL@4gyo)F7 zphxZEq~7&-@P%$Ik!36zTj*0X)XVzWcDcMCqXDe ztsF%@jY~W_6qbFC6bj`HodvWkL#P44X((;eh9yf|&fjWI1(~3vKwjie&Gce~2yof5 zv;+MGgJLZe0nVBX-7S}{=4OAyp`d{-)=~mOY=a+qK|^CMRTXwgVCd|{B|ytNBOyS+ zE|flahXJ@J{oKtyP1|c2E!V=cP1=tXz8bG&e;nw0um)hltfg1c~C|5 zF3a9Uuf*9nJjND)7Qrmj1eh)w)z`yKrPPZA&9KcyHW~@vNI@mNGsgKIiUR=W8|C*A z2b#;Ccp40qS^!hnZV#}}ZsIG@OU6Nx-P#~)_-+Z_^LL$3H>zw?o*Ow{ERgG(JIU;= zp@0SkS|;KFo0o@>G>V3rRc}~TvHAiZIjd)atHV(?=xcIOt*QxDJaHC@XrAbg$v8y_ z_DR!mrXilt5eH-90JoICdMd`yO8ShH)xbao9gDS>CQm9qy%VsR4?>PjEGp6ou{u$R zG_|YDBL@_V$aC-kenI=RsyB6{R{0U?$hRqCIfK85=@hUx)P0c*CgLFFS0Pkn7&8It zQpAYa6^#0@X6Q~q>EJ-UrQ#}_@ko(u+T{<8P~@+Q=a}P1oORHAhu9AKmOLTi3wRPe z4U@ujRK!?L4nC$@kVv)atkDE8Qi`+R+bmNXxL~ydYNx{HGS;Rb93@JD^3{Y|f{qz% z4#7VTawTmWm@3MpItfA-Dg>QogUOAI7DxF)n?LDt&{IzK@Z< zo}9k(xG^AYs-(E*a7l^PuSkhOHzh}u7y04zT#*)2UjO`cb_p#VP-zzj!oENwmbwG5p(BVONqVxf2NJau zz7E?oZC!QtGB}|ZCI)EAHI2)3ar6)=>SHM7H?qWz5ad%vTuf_5%Vfh8L$&C@U|i{A zQ3DnRAAFdU02rqMi7x2B1z}DN2Vo)=%?gB@nmJu`h}hk{?)d_Z<1+uTB>Vi&Fu0SR zXgX$4;>?KB%?JNBuby70Av{=B%kR(~G02SY2D=j>n~XFR*wJLD0g*Q9`}jq#1PAf$ zRvI>hR;rlh&<@dpxu-smy%LE;mwh6eEX_kzeLcE5HfG{3hL_ZAG*D0`Gp15>d0R;% zbq!S6!G>VqvuBeb@3p*cUsVs4%C&Yny|&zkA(*xxe|x}rHqM!&pd<@u!Z&EE39Q_n z0i*tigho%h;28H|Lq4NrQr9$t~Cqc_(FUZ?aUR)Y%l- zCeS9ira@H|>62GJ4O0R>ZZ#aaf`oifKT*9(Z_eBS@Ua+!SOPwl1w_$Rhzg8}fFD!78(UDN1>+Y>EZRWb$u*!?#ra)hx|0ELBeIfCSE5Ly`}}QYHNL zLP4Qb=HiD&@|~dEx^4_K{IK2WZT6NO&fC0FtF(e~toQ!#gHQ>A{-?8eWBywet>sLL z8M&+gT3td5iPs*nK};^Fxgwp(`CLKv98dPy(B^E(C_U)XjXI=&F5&-}C@iGA86lvG z0Rxvb(oh`U5X>s^?=n^|($#PRsSx5cW2P<79!o@O5~xzOevXw^nNE=jp_9|+drA;V zionQr+QZzs$0E;E516UrU}7T)06HahH9{Q+juJN+bnt*HtP zoobP8QqpOQq0y+M^8ml%N$*6wiqg~h1BP7_J)Qli_T$jgi7yS()nR?zR49!IT^+aO zZK;Xl#*VzXD@hbeS?C5@wW=9LL6FF%8Tl51XVEvfz>NuPoR%G?BLofU=lVb% zsOeJ%+9u9Gu`vUUsN@0~=3YKh29U^tUZnoB&3Sg?)J|r3;d~}+2YOx$`Z&+VOf&UV zvpBdsL}4T-e3CQSU6f`RlM5$d29o(F)wCGBqf|(v|CjWMu)Pw>7ELCQU5fj0!Io%D(V8=+F<$sQa22;9A~efP;WDi-l@NIWDR zdMSpG@G69WreZSEfB_Uti_$7;oC@~w*!79@>Y#=IDJjSZ)HQf7nDGSxs-bfe2!Kfm zK*@l(MWcr}tCPV?fZP!<9Dk$);r9U!%5hXOf`g&vuwyt5t312eIqP8>?=Yrf)HL#P z2>X)yEC_meBn})H#i>|n#z50{R$s7>j9M$P;+c3N%0s+{Y^xIkN7meF-itup*pMBz zh_TJfn_LE)m(WiGFE7MxWU3J&DeM;`bC=lkhCPMSz73LWC8i^ZSU2cFf{**M;!9$M z283vz+?VB@oV1@D{))+tKpPypycQlC*kd@dQ^g;+4qWz4=@*AQr(xbI$_yXm6w;7f zr&4&!5mQJf3nPWw%i-&wls6h-3uPAwvM~gBO3dsdEqacb~SO_KVC_G(yUrO(~Zh(YDAGygveavt9jJjX} zd4C>eQ7HB$?A>65RLBnuu@iL`{*oy>w09*+le$|ZwF!+Cf(%kfoKBWRC3mKzZPAjy zzRGfG9{d$0LZ3+09D^1EHLjJ158rw#{y|*z>*a0eSAdkFT^-8XDl-Oem^7U= zUqaQ)Fq(iO3;zoPOk(2B$oeI7jETf&lDJc39Z`7T12a()>O&FA4l0tAFsW#rodOn} z+9UBHiRil2Uqn7I(1NaOCSB{~S4RLd=vqU@C-NvLG>GElV8b#w&~`wWw8M%85q5#% z?w-K)xq+*C>Rb*&sK6Mb;U7g$5K8o=8?=rugpnCi z9(NE#DB32yWD2toFWGLk2u!-*#n6c+8uJ|11&`Rxru8&Z2tSyR(A+M+PGdEXL*xj2 z;0-`|Groodt%)g6(V7jU7Y>sYQZKyOIsa4;oBB8p$D^E2jPXLv4UR{%E4i3Z@Lbr$ z`FoKux~K%G1B&`JRsg+J6#!2Z0Ja6(RXbtO1M)M-Bf&gOqUjQ3JT^+A-Z?@zO31+< zUZfmUf3h7KlTm6&1`QiWP6oF26>y3vn6u^?+{v(Y30CwLlN$|zlBpy#tf466K5A~O zIF;r#3Qim<)N^*fL_7ib%2N4Hs0Nh!#ks7Tivzjy6js9*yEpii@!_}3(EV~j8u2N*1 z9aK3~rGlJ*V_D>DJl@DbmJOP+zIg(AGYRx2k#==d{!)yl4_wSA4Md+wOlC)KTc8+V zV?PBmP5!{=qKQ>uQig8(CK~QlQp6iHqUiLI zkWil!#7poS;B4{T{WO_UVWDr(cMXw$4Ex)rk)zRIl%Z9}U)@Oc^1HG?FH?+IqD{)( zHe99;Aa!n%m+56L_5;W~ky#Tlb%VigG=G|%$Wq2_Q&~cW zp~IVk-9OHn`#{t0IgIT@q9^O!Hk&M8Q{O()u`U#fvoD9M@WrGD6I*vA&hQ6aWB{%} zs2|Lqhlo`pAXDPVQz2HsE`uBg`?B*lPJu!8u&ifq;7z3;jNzNsoW70(#n6X-#H;XL zI3O;Bkq*$P9y%6%r=ottJE$K(oL*oFuR#(AbVDEHJslZr+RbEB#{f)Qn6Y?Q2N+Bk zH52oC+`bO70jF>5PG|tfoKzvyxer11!V>zgZ@IrXx zdCCK00h|U{jEE2h__mstifazsI!%?nZZ3kA99ZN4m4O+Cb#JU}i7d&kGa!KZBy3}0 z4JDX5Wm&IqJEj5|F!E9uq%qGD=M?^6$Kk^s7$NYLy+?9l7gEi~eZlOLjlWqTLDo{%-^@$Vdf477V@@2eBIq2w0}(dZe~DwsM-yAB_G}f z`^OZN=9~P+Td|Era#amN-GJ64zA)1{;PknJgR|Yi3K#hc4#<&MMXoP27!5+i7XA|w zBtGGsPX|-)zLzq)64?=@80lDXWremc)b}wp2^tJ@m4niZ6698_7EE3;P#-G7@JQwz z;$lS&7?&Jz6mW9*Jo0)R$y%mZX$o9{T;**I2S1@WIC(_Nj16zXYFFOZ;VZv5idGV~ z&HbKQNo!C(5v`6@sFf5?05<{ePlZe2?0Ma6Xf>JI? z{h*+fD-@JYfQ%`jcG7I{kqNbvLO60jsfdyc0^R>8N;G9?NG!7O2WxAQWY%FCNSy`b zNhV0Tr^&7O8#f#|lrutHyoV>E-7zLWma!gB zzR)c(iZr(raHEDM4isrB;uUGGIw96e;USv^qV=iK^)TOx?0~c{Zd*Fda`#So?Gv%G0m&)fR`MiXF zCC|_06SG`uSRxJIwG*R1s*d#Q$YzF0KzKMFIIvJ_Zs74xDNN%7SQ{pFXEVIs#D4@o zss|{Q=zequIB(sZ=O8H@d0No2YP6=v2tR(>H#78UDun983C-*3jbOz#f%1 z9F|p%*5JKw#2WB>bmsEMmaLi~u(07cJVblMnzf=-`^f6pU#jh}W_?krEwpDme1-O+ zeK771IUIKku{`EDY0qF-(6H|qY}w#&!u_EmyK%53kaWfSLoMGVW#j&Ai&JsGr`5^0 z|5vLn2>Z|0yDj+H?{sV})i$I%-Y(U)q-WKaYWK7$fcuL!N#73DK5koY`E00GpHWC( zYiGm#t#&22zucbO-?VoVaw548op?UoJKSS=c(8VF$M*GuwWXa-cy*|@t5XNu7oO4w z_o~hg-1l^WTGZ@QyUi}umYDi+q^wktH02J`#Tr5$NkWScHF-zXa)cObT?b@ zu(61sxt?~oFY}PsCQmBve=DZI-xX)zUfY-O`o8Dl{#d_d7KE<$wZ;8uAH7)NYxnbD z?E{|^?qGjHmi2d_HrMyh1HQ)J1;}#)D6d-wkbBuc$6bRhFAY5D@xhjD1MMpYTRs`+ zgnQ4x?Ae1Y4_`9sr^_w#OS<5`u_Oog=8`U`%^v`}2v4d%&geaa|iQcSsb1Hq7*tpmELafNi{(Yet zBiONfF^%AId(9V0Sh)K>PM2E6+FeN#Hd@>9>`Bt+kp7_5xCrI`1z+HMH_WF6Hed$> zF%3-Xi~=QaS`O!2NCflhW*)4>TbOT2#(n+>d>#mVIIEu^WF9sDnFs5DtVFNVUZBvg zKwP3ZJc|0I9JXk%vq>*T04LX1W8@(ZrCqfjK4(k!Uiedh+W0

    )j9V!0lv6(nts8Mz*qs)FWR*%W(T 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

    nf3zDUO_yw1o6y@ zbUgFXjA*8PdS`lv=ZE@MnP@aKc*RWB%2%aR)D_05Qk0sc3(^5Y2R_>s1tw_cVPl!P z6V?1?@A8hlcY2K|knNo^`B-t0hBD=CM%`DOWrLX&?sn;5$`MvWy{lSZ%Oi80F6l|f znCNa#omeoGX&&()yFDe8IaJ2<-g+J~ruWh@UGkMNy@!nHrwY|ET|ZaK+u6*k+a#k! z&t#9=dSi9f@<+S8w^%y0|GJ%?UtMu-vS4{~m&>H0|E!?@56u15-!pN{K`%Rq&oMY~<{;F@{@y-4xDId3Oxwrg(ez(o#|J%*~FLgUW zzW-KZn(ue-EML#*(fNJZi`iqBH)LOCk50eYso;?w-R1kQdK5pQ_g$|nxPPaD3w!P+ z|NpV)K>7cyZTiSzUu~m0m-p^`OW%T3y?1%EZ^2!?JKfv2;Ag$N%lD^x7hlu2;N#wB z7u>#6!P(pGBmcj--JbIQIeqlt)3(=xpWj~de|!7Rzwev)-VU9g@0<9+j@^a)c}M+q zRbTy893Uwpu6dWnHQ(2`=J^`ed^$PsAIZeZ!p`!4ARRo<@6-d#p^LWGIgczXo-iN! z)&I+*`g2U0GGt+G{m8M64J|cw4XLKe7?BKQ)Ph#+Et#;OW?sr1 zkwaDs&e~_>$EO+>q*|Jm<~qd6Pj9JdS=2nav7t`01zMt;cPF?Dmy2qSVe^?4uc8W}!={3HEytD^-JM7|n* zgUhC+<}7NMQ`68gc~N~!U2|7c=bO77Bf7;5izsqs#$E_TzZ$8x&mv4#v&1dt}9LLtTa_qS|j$PBru}|hW z_N^SpYT0(O1Ku?Kt|vZQ%kYTDi@HqLFXdX8Dz{G_a$3jMSUGt&gGtIBu&mB9)we7U zeOiaFw{ky`@5a6{MLo_v8JqD)sgFqT&;Z`b;o>PN?jtHptG; zQ+BlI{jQb0O6slodaT+|t~Qiwc^6JBcvK8|Tr7E}sLM=6XA~NNa${VX==h!0@k{w` zzMAuxXzNUJvecMBcw*NR!tdo>6MAef+hO)|`B!Q)5FacroLE$xoF($&1!)#jx>f|o z%J&1intC_Y9=n%2c5-NYrKzjU!O>Dz57N3iK>nR>kGa;_TBrFX58AS*OI6n+r5Ree zTl0_`EwV3Kxrdy-wEa?s)uG7~yC$cFe^him)ScEoa$Fy|#;qyTkx>s04^KiHoXS_V zQGSV)e_W1DmyfGwYGY8*CWwA5lQmX;Pv_V4Icb^H1_wwvOw243we2l?Y*;4gbJ1g) z!px)$r;28iCiVdrh6GEL8R%hYLf=r!qtRBC{9)AsvKTmC1RXC=o_*}K= zjLzjnCCfJ}JV!K$4f0!HmGR%Z_V{<*@oE1_ok(66`p=w$whi&+n4mobk7khz32i)9 zeLqVpucQL$kF(1;`Qy;{Q@WaZbU_>B)h}zU{MF7j@oSb}q^!g*XGZ;^I-8RtLSuxUPrdyXevO>~!jl1LpV|)1IeDdoE{tUS{*jB{xZQ zTyNz*ggxhL-8oOoepRP2MFY?6Tv=3d#%AS3Wy?1oUo<*-^_E3t6N*ZtR)|Dc6RLvx z{c%*E^if$pGj%C>VNkL?p8i|X4z8|R2^>#WWu)Ws}6 z%6W%=oLcxoL98PW)P`Orq7erl*j0ToLpyd!vpxA#YI&vesVJIS_^0@MCUn*MbiLJg zpnNy==}@gtwK6bF(J#_a6Nx4A+cQ?Kr^|O%QIGSrk6=B?%=dxCdG$P(LQg~ec%{|(N9n)w&{urSi|%V){>=N64J>$f7Q%3ZGOjJrUwYmoN6p#N3{FAkrHv!2&w_P33BUYd^y3dqOC%t!qj)KBVJNf;mwm)EXZfx5JY;83Ta}ZJ*qV?L%#lDV4wNbK7J4l{TN#GscvN?Pfen`~B4%ZBFaVdaH9| z*O|k%3F^#lZSeb`9DW}v>Tb0 zuF@f5fHE6cyx9FNZIgN@6_o_>pFHJe~a5c$HCvaW@)j%7hyiXDmhNqf)XRJ>&x+?ydoI$!qsGDSF;wp zdjpUEcms~tdD+lyIWx8+*ZGIG$#VUgL!X2# zVkSppx@taBDl#`3hh>jU6-++sY(BEZXQSn#{+Y3zdMA;1SO)gU`Na9>z@qiZBoWFT&Ch8tD$L-cftxhD~ zaP?9S;tD|PZi$s?Pu*4DEVRdWRNYx?^=<6BGjMzLjO+>9$aUueo6l~0uw2t?xX9XZ ze9_v%(0kEkNrBZ?o`=)a@C!BE7P93qjShx?eUc!yGn7#Yq$@CQBo=N`V+!yobRM?L%(9{#w8Kk4C5dHB;F z{)~q|=i$$L_^&+t*B<_&hri_EFMIg!vUq92)}*VBLCTVdi2{1tqiBOgg{*6hN>pR(i?6eixx;@T3E;F)^f%92-5n0Pyj|4T>` zJX6m*S@H@BgWEwee*2bmph@sdJ%7!Rb$=8l-gjTa&$Eo4G|$xYK`6&Bg^9oMPxJi+ zqbJQX^{mg5S5TPvD2s2O)bmR7Og;a|k`MHJ?BW0N@J~GaGY|i_hkxPWUwU}#a3_8U zZ(qnbt}vl@i)E+6M4^Z4?NQmOFrhCQ$WDccE*`#xhj;bxZXT|)#_Uv>={OW8+r#(qaGrfyUtwZDk9?_z5BBh(9zM*& zM|gOdhmZ8|{XKk?hkw(fGX&yeq!)JQyc;or;RTgqfCnMmtd z22%?YmuJcA&xMIAJp3vTzsAF__3$5f_zfQZLl3{n!*B8MA9?ug9)72X-{s-=c=){@ zeqR=!WXdb8hco^{xq}+T7k({FJmBFEdic*he65E+;^B{a_%A&CaSwme!=Li-r#<{x z4}Z?Xb(NQ$3KPHf@E5cA`KG+mdftFUVd5qHmCmQoM0(SIyKjYw-+AO;_3+<&_-h{i zx`)$hXN~p)fAYw`>EUjde_DrrE0p&dWs=}8i34Qu4~;+5dT3dpJOead&-)&}&cpxa z;p?;bR0*~x6KOp!LqgX3_$zH$Vd5Vi{;`Mu%fmm-;Ul}x1dWR{oixXn!UMn275Ts_z?er9rDrg-8NkxwMfOcqD@>y}4w z;?I_A?4Ide!_UgH=L5rMWu5Qe4WF0AKQX)^i+^GDOYvl+r0h@8S9)bY`J;>BXJy^i zS!Cs9%SJ}(W%xx|`R-u&Wm&w~@GGMN=Q2bhL zco9hO^+dy?ttFAT)bOpdeFe#~&Y$tR5yZy3HUNbq%Q;{v;Z0KZlkZZ8;u zpKEwukl^dD4Bsh>e{T5BS$u!v;$5=%1%~gQ#osb~k1YO~;iIznU{h3XCx80qdc(h& z2KL(z3@^{(zc;)xi}y4|J}!$NX!!Unewy(9$@KL{S8`VveoZLvYW!Uu{yeqjbQZ@S}&kh@^sU9LV!0^V97uzF83y;&^-NR=K@1M-h_Y}i# z2<_R;e!J4}H6eF)zTn}yPq}~cmQdd5DKq@GkUKpKJp4Mt?+oRgo|g?zU&nNMwvy}K z{gc^ztl{bFm`=}9!_(I*ot`^9{2jy7*DIZ#oyGb6lWRjeot|kPeum+XhVo9&&kTP& z2Ywv`6bFIk&a4~GaB zQ?pW;@czkPhkTm-c8KBW>yM7N2=A9nW$C}rBY(T$f5_7RtkJVPOV3|D@?E5BjmHmj3{zwdWSY^>toBDz=}$@aTWb!`~O)Ke<_$uij^fnAyJ)~ZEzhrZko~u3bzcPHE&>pwq>a@M)yI&R`ZusDkUv0k~Vfe6+ zyP3^m;c@NaQX@Yily{Mx*9{*T@(ZmWcHcqUon9pml53Ak4euRt*B+k{-anbGrHoHeUv2n41wCvIAKD{dHhj+l7YT5@hYU38x2SxT;k#$apKAEn&>p?tPt(o9 z`z2R|=e63gG0($)X!xX1UhmJ-Brlc`J=y$V znL77R9u&&!J$0H+5#BGkG_=3i&_v?L!sF`0%O3u^hkxMVo9z;>zpsavczC&oPxJ7j zJ-ktP|KzmLKYD+lrkjNKOV)+{85rQiS|dL*l>dq4-HKJuVIf~?d9~r`>u7pEpQd|@ zc2&D@hGdj8~*f7i&Tue<5}c$!A_i_iCH;r)^|;rY68WU27}$!tB( z8lJvRr}yS*deg%{F?@bOAQjvrrr)RckGE%uho9}?mwEUa;r)_3CSAVLotku?NB%hv z|GV)1$;Qxr>0V6gx~uZ^^*+59NYi}7TS9rqA2G`eUCxv?SelkrnWMbSed3=_hvxWCho*K&Qy<(dFV)*iq>%Co?X6>$ePRi1A zvGD%MGeUX2Z%fm9!&in}@3Yc$>>jG;lq@~h2=AXfHiJHV zo?C_YOkNVoPY%Qr?+NdpygcL=TRw45)w6S`$JK|q!uu!PEH#mE@=qFmZI+%r_fq-v zbuK5r%J7@ASf){LxTe@5Rux-0;UkuJ=@Edeibd?B9A1gr@xmss8l! zAidv3(;dR&#-leq{6y*JdM2L>^Oa?kNt^Gd{MRAZdtEfm7T!PkQplZuzVG3`HvD&? zygT2mOSE2{7}l#|qdk$R6y86XzP{u9aD(MhKYV3)I{L2nZfIIms`jU^*SPa~-tfPK z_UL^Wn)V*7`Mwu&cV4qS{Bq$vlYa~4^}YyAe>d{!>mz#Kf~LKOsQzp|TX@f8`Z|c- zqoC;lBcHym;q-j$;rk3#J?ZNgdcT0CGlXB8+%EL9?H&@pH+3`4gZ-;z)E5F$RYR};zck;U$ zeq_jHx@giQ!;cDindOUwJKHQWAD4P~BG(gk2h}cIn5aH{%0zwG{RsQm=?QZxhfJ=S zSGjmlU2{{-pptBXx!D4$pfvkw+_BHf9;#0cFDQ+x!NhoYGF-NOOTaEQ_NGJ z+odP&>CWv}6nTtuyA;JdkGoxZ;-0(RE=BPVAa9qdm~$%~T9In0shvNrsd0gMgnT}Q zpZ(DI;pNTEb@Li3r%jwbxO&<|^Jsbdu=#27@_?F#dG)CYb(NKMbf08(29nU85+uK&5Iz~q+(e4!iDuqE2rsM<=Lnz z+hSsF{qg1Bff>ZK3<{izcT%Ar2bcGel9IF-_1d#Mz+)lmm29(BVKCc2OIgp zMt-o7A8h0Y4^<6=jr?FEKX|yd2h&^QEf^KUDi?=5`nHISALAaqA9J>?9uwE?wR%wO zxYX)V@eQNZ!(ys?tH;Du;`|PZRLzWoB9HH%Tbb+EIXQowo%w6z#VMJ3GhRx*vX5xBCOP*_Z)vJ)m^YzTyXPSjnj6Q;OHu60Ocad} zGv%EIO>@HchE!%cE25`G4=QP+lH8pNeKV}Qsi|hEd3DJ!^9G3Nsd^b9<&6-{mHC*9 zvZxyF4FI09B0-SL1P~=Sze2!?~VYgt;oSQj`m4hcrG=%HcV zDvka!JebA8tf)iQDi7kUnB%|_2*tr;29iL`2A+%c`07k5l+w#D^Str{15P;1u3 z9+a1Pkq$9G^P&gkWnT0kn&;*k;T!d=9j?dA`n@tSw<(nhJJYP+GrG0NuQFu}nwdwt zzK_o>8nO@Nxki4K*=A0~`XVZiVmZ_*Hlt8hN1hRgnwlP!qCIx$km;$G;PrPVY%w*L z?1)e{eAi!HU0rBmmhPdUeDE&8U`A+OM7Xe~HdR`(xTbzls=8(A!j#N^^w-FQ+k5&_ zB)O|Yj$g%f{56tgq(maWrVWbxkWm^VE0@%!7V2EIbZGc>Y<-QqIWt`nt}fVVciz)w zGX*Kr+B~VT_Sm#R9iXqSxkdFg951tunGMI+HO#4=mTF$KASH0d{D#uu)xpRtow#ewhEMq*)e9fmT zViO#QEZTTju0eT;XSgE!h}cP4Ms12&JH;K8%d9y0_SnVZ$v%~s zby-HmiWD}2&L!2--fSb!Xq5{mRi>9BnH6*R%!L|Q4!X8rG|H@=r9S=x8KT)D%9SAz&62HWAYxItR);R zvg>DTD+sD|I}WtN55}kL9Q`dKcZPAtp+j#aT$Ry#w?^I(t3&Ga%EW@y z0-5_H7B)85Evc42B$hL;AyHjjyQHStT~@A6xyfas+FqGCXxzBzl{2bml#iKIX?oA; zEhA^w%n1&0Eph^(nU!S%lS#|`rpDtX!)Cdbd2Ds<{9~)<*3{LzF(J2iN{3IA5Nu5| zUUjRpUFRvBc-kB7?W;^5I%G=f_>P)TkEp0?7PqG=r{)-d^6mvoN6c)flb4&2M7(i<#*{i{zUwxX2GS<^COUZ7~i*c!9GMD@?^1mlL;wmZeMb0s!JxN)^xhiFYJjVbTSX?D*< zN%e#o)p|w62*yn_P0+%1OmSU!?AfJjf3~mVqmdovk9hTTNL*oeq(|Z{$mNol2xy1- zBStr!v5{*>OzycH5f^OjFi*rO{~BEpmwl_gh(vZf))x`w^u@+*BgPq#{EahA&)v%G zDRzgJn*g+a33;Sks&8nX+t{?gc6`}=l+QdnL`7p!VKH`G=B2}@)-6fZ+g%0e=yr$X zkgHX8NCvHRfgO@Z?t!O6vWRU39a_=iy5Deq)k-sn-)88{i<$Ywddzew83B##=8)q+ ztO#RrjIRgzWSQ&8+HuqtKl>=ccl({Qn}jJQq!`id2*vH4jY>!7!WQJgI?Qh z{t08PBh22WgBA{!{p(Yvm&lGPTraq7QTa7o^M==@XI*qs~cs}RhKdz%rBrb4EH8s;{dLj!%K!{oxA#HCa9Q=1yi{UB+z@xQs_D(aeKvu6g%t8j3(Sbgc>s>`xkdi#)|rUm`WDw7Pong4|Ur*fV98vu5KI&Lg@HidJRM1!AV?G&cVOtgo^U@Qt~y zpxSVR%_DA(<()^mY}$5Ej-31>eXgu>9F-%lR!S%CoP3Am$fdOsip$1(Opbg!GmBhq z^Bs~S7vHd-D;w`It>qIlD7TtV+%Yzvk){s{V`(+IiI2_E`+IPF>j4@l%Tw4|7U{S% z2c!5OgCkpCn_7ppE*M-P!}i9KaT0K>X_=t&0<*QzOn%b>L#NM|OP`AqTiTnt^>I(b zbd=;e4E!P{u^{H;%?BDLW3o8GO4Uq3=^=-;GaKt7*2Y%R8ui920@@Ypi(0<+X zD%8*V)H~PSzZqm}-eK(P2lQ!pt{-Tt9`{@yt>>T1KbP-;HecnRfm8kqaQ8eFmH!f) z{gpnQuf2A<=c%ZFj)H#PT6nBV|z@B_CMpn+5a5j;ndImZDZ(Xf6`I<*9-rfDSsC@<)5%z^QAvOfIRj58=QJ}mvhk+E#D#Fl%ESu{mtN%Ki$KNO|JUR8+lfz z$hdykJ?~0+9k?6sqI{f3&tl8!hyN9v`n!q^n$%9((+8aXDYIP9mwq@DoPN+T zR8!OsKLBUG?#YU(pLTxkk>64UCFuwK;GVn}Yp3InXh}pU^HJ}ef!d*$2|cu>L2%H^(gPJK$3pY zKki9-Y7gynPoj(3d66oS6y;CAPG5b~KH2qG?)h+0dkzlN8~wCrmgUj&a^qT*H$$H1 zd%j2iRp9?W+0XHU?bDwDU9%clAflm-esm=)VV?_V4fE{|)EGdgz`v8LfwhTK`1-+yuX| z9Njn=t%s~{EZ^^W^xxsp{~$QaakPhz2iG~On|DpITCE=qeCPk0{k5*RoPWct!)PK2$-{Ik7a9;GM8}Fiaaz4gCpT`bqb*gyAzJj<&eILqrWaQ4qjJbX1c`|Ufy*>C?Goc;F0Vz;Jfxm*uF z&`!1&?YlO$m(2D1*V$e)rsV1^+Y8HOQ+o;G+yANd!ub!&rOLFrpughyQVq_2Y`*2u zevIQX`>UTrp6z#c+pk9Zv3)I%_G9i%YAVluYy$L9zs4#xsUD6CdhVK35AD1Z@*H=r z^6;C%ss9;|{#U?h=cmxacC@|i_wpNe(>q#rG z`Ep(Pp+}GI+0Yd2HwL2rXTHP0+0W>h;`C5{5jf>ndicmdjj`t(k#Y01{Vdn>IuG3S zSJCm2ajo+qe>C)vySQakKjSAHUsl0Ro)_)pIGc~1>}O~vIqjtWw%W=5|1$B9TaWaI ze|SB8B{=(^3&3>_@5-xCzH8EQ;W*pfa`iLE*}jnHIJ-AE{d@rQa9*KxUX$wQyh8f~ zO=?f0e0O%LZ#60Byy8l5miukswC62w%DXpDseZN#_l73r)H6p7m!u!;|G$EM%5O+H zvb`rHGw_K<#lf+Z2@~&zP&AvmT!N^vwTazd0u0ohvoZiaF*|E=wbP)jHYP$ zUJK6hVjPC{yz7zwCphKZo6e%;KEjr7wA|errlRHU-j^Je=RP#r@4Mb{Sl|XzuUNiZ zH?cl&KFRWZ1A5qg8MkEles1NX_HSkVrsvD@9RSYq-4}jl`Kk??R6pBqJvjYyGC0fY zZg9$XvgH*mm**i*J??s|+Qa=PFR77|qP&~cqxxAc+kmf@@2-E|6`bS3P!D(OP}R@z z;w&p4wa2}wQ{_|0_jTykwxh>sa&LrGd6wfY3MA==?m=?>ZG+{}e6NN)%l&O|+W&8l zp1rX?qW@2}Tn}SCUja`4-yGqt-|J*gTtC<@x?8UL*)IA*p6y~UaMqtu&_jPt1E+tE zfF8CB_r7cWneF0o$g`f`3{HFA0H^#qaLR8j?}62%e&GCJN6Ymvmdjz_*Gau{^<)V+ z$ITVs%=eezy4T3*c?0}<@V{8Tm)LV7_y?A&{XYc%1bmHf*B-xu{+l3w2=?{6@GZvioOay1X$ADA537qoFz>mavx%X+S{ggis@>fIt zQgF&2qE3*cdRYJ8HZ+@e7oD2aKkNs#1;16kyLz}cIL8I{|Kt^rXTN#^IQzpZERWj% z3&?YvS_jT?gz-a;Bj3{#m82iMzu+Frqxo`NV1Kv|`fZ+9x#dwkw?Llb!jHk#53c{e z51i%lDmeZ24b4!Jez5+Jvs_P)!)i=lkHa=U?FL-xBEG z*xtKLcX%Da0(9hd=^zRM*tcTx#Jnb*{@X6q`f1XGG zB5>M&g-6d#;I!vH4}Tb(_Pl6$)SsiJ&S;8q_vZ8{KS>MF%HM|ib_e(!;4gak=iqlj z-d$(We5q%u?LVWO*GE`SIPayOYgK_H{a`&g4)(A<6sxc#mDjbuYhU9H4fyTgZvRzO zzShcXHs?X!?e9{4KKOSaPtG_S_1tLXHDCJSui*DUf3bYmr1G@it(VoF|B-+0d~dPx z%A4i8n^$NVX;MAxXWTk5%3t-!zviy2lHJDelyDPVsO@_%up0mNJ-}S3n3|vpGhCKD$3jPrE-wn=s*cJU7<7quD*L=T{ zf3BVG1o``*->nB#p7V_ZAkTJG0sSq|GZFmf;M1Y!CUC|Z>9;!Qq2C&yhkk1Yr{7Kl zr~Zq;S-#%`r~aRSQ~o7z=KC5r%j->W%KsIdb|$eNWWKw3_&(s&Qwq-WIslyZRD#p~ z1Hq|(7C7t4eDJj>_l4lpe--+xS&$zm^-_~IgNMP7H8kMog6}NfHK{zukujEQHml{k zo5$9IGd|V;u4AHYh6&EA8Ta@TEv`uk~kM$9WF@ z;hm5lYYmRd9|O*~*-tIk5BkkrUr;^j6X&;qsJEOC>~Fcsp9cAQ$W#9XkY~Bv2hMVN z44mcCVC$9U%YNf{)Hjyb$&hDxodbE6*Ja==uRFk(!~gpt{><||*mAX#=j-C(%6Yyg zL7wM(2Y8JfBK5-S@mueme-qjzHVPl^nA+@m*Dx11?TzR zZ+Y~5AAvm2_g9eT`Ep+k&-V-H;d#{|UcvSL36@9w@Ds!n*l#@N;p;s7UzY3na=pJb z;twqMK9;LJ^uqwi(+{QK^utJSt_R10Gv5O(kLG(Q$Y z{yC5Qrg_w+c@)>1`OKrrrH#4%aML_0|9KSswrL)ECLQlMkK*&AIIq~r z&RcZc(K(NsM|~5V^NI=J8S@Iuv*s0$=Xm-&vA0i5I7wrZdx)vwRMbp6I|mg@)S z8{DVC^Sw_MNQ$2CtKdA}x50V7M`2#XaeNNuKRjPvFXs843OzjEtD%SIwS{LMwS#9K z)f4lgayf73x4k^v-Djcxq5NdeJZe5T{m=;g^uvjerytG&ryni==X~aJaOS((asd+V~_lo9{DXi^P-=K9h$TnF`oapp#i@R^?5(}t|=;C2YwXfbq}GFC;!;P zw^7GPQvHRhJK0rc6Nh2_hak>dG6a80?vIq?mE7jbrbR(4gK`n!O%m$9Rhj! z?FexCtrnd6c^@Ln{Upd!Klk%c{!YjUb(Ui_ zsXXTids?pT@frE<=0(%NIZrqmob!a=Sg!gxPQ40wj#KYIp5qkzbB>S0(BJ-2j&=RU zWXtt~^M~QK-&0-y`EP^qy&P>{4?>>v zmS2Fgf8%o`DF187b3Vg;)U=cHDDqwycc_Q+E1nnkW6+*`p@;Sl2B-ciaL&7?f^*(= z7&!H>LjRM`ysOdldO^R(d6&*TG--Kp-nE>o-a)*ALD&X4!sHc_HNIgLD3{pBgSH>YwSBs~-Ai z2{`@3btV1tPw1zAzJMP3hxdKZKYh?H=$}!RNBwXWxU-6QYTDN(=mu=P_p{l@*+ z?3d1mJo%j-{&UoS&bwX(r{DerJ@nfLkf-1N4Nku$F<)Z4>k7_%8Q){RJ42rN9&Wk% zjq-Cn@@pC5p89>wc`%=a!&zCVW^=KHxvesfPes)r|j)z>5M?i7l;9`$DlE#gON7ceM|6_RoVJ`g1Wj z^`8k&f1VFcf9B(d&0)`fvmd%_@`LGTw%Ftcn1-KKXm&q@WU1uM||^; zt>A~Y&O`XV4~}c2ZN56ba~?7tob!-_EZ6a!bVaRjbe*v6&eg{rHe*~wV)4+Z6F}1;!2j^qt zqpTh+U*&H8!}$_9%Zq%B)uVpkeBRB|R6paKGa=9U`~~2=UZZnMO{$;#WkUnb>$dNL z^SUkXW13ZvKHp9D2XUMKl>hY}a7|ji$Dmwh8yc*$RttCWkmcZv1DprWIKW+&tA1WL zUklFb<^__Mrl`C=ssj17?eBT+rVl61K_+q`xrR; z&$)7*n$#ZFH@9BX!&u*btiqC%v%b0abSr0ldrO5SseabCj|>es>)T+IJLOeIlj>o8 z+YIN${&p+N^@H`ny|+&Fuv~VB9{TfWaQ3$=J^U_k_QUSEteP+T;g=!Lez@4i300o; zu+(xrjP->3mRV26K@ZRCAn2igxX+pXsq^SL4xDx_24{OY$&)YlQ8VAmpojID@2_Ni z-c}tZNk3Shzh$}ljrG|*=TJH8v)eDNob{ReoLN7wMZT=hZ-P^PnkO#mt~={ttk3TG zduk8M>rv>T-(CP`xx44gs~*;$U2Ggx^JO`fAihfZGRU*ORf03$DbPdvkAOVw=X3L@ zXCdTi=OS>{w`HDuS3;ioeh-}W?HX{_H}_sY^&9)8%~9^;ocHoNh|c*n>0x^Bw(IA) z?~e6~_b;%XyXTo}`LdoLjCRL*?%I2_o-aqcW4*lqoc8<{obtoqhjVaVM}yNpzW`_b zf5!4?{r^4WS&r|5v;J&p+lA`kbNt+MJM}O=$B+BI9)|s=qkT1kk3c7uFrL>p!MR?W4n0M% z|7ghH2i^>>d&}KRMILqq;aF*9UJ-m~Bv4_?- zmgBybN6T>vILquL|b*K*C5_3F57({|FIr-8HI*mt|MJo!2g z-?C3y{$|v}!Qh;?9OU7Dwme!c>mko_`4XJv(s}!|JNgg0sKw)^GtB&doDQ7>q2nqzs~Y#J-He3%=cb!=KDN2^}h&Cd;SPc zKdiSrYEPdXf^v+O%Wjryzr=DG3{E@00Zu!=1x`CBfV15-c=%#)&XZ3Dr=BxB{9e{kY5fvr+~9u4!1nozPN9M_BTNf>(w$3U*XYz5#*`=8gTmOR`6vwue-r{UiVub zJ+CJr&wP0uf%(1#`74p{I&kLu894P6$g!HV9Z`NWaF+YdmaF~y$v?MV*cMO_Jfjs-?ePPdh$nOtc2R_Ne zXMj`BV#}lUTnG8nusesDg2s^x0W!;+Wt&&A;E zKL;Rw!gVg+&#QIG>A4YchF^gH$a2kw=ldZz%Xcdqmr!|@*A9qRa6H`uoc-QW;CgMy z+39=l?e8H!7xM1@T(yVo;zP)@-hKhjcG}GjNKyY6Tdw-|mw(RAagb+yJ`VDai=D3i zTmsJeuo|58;R)#HdhJDUt*g$S!H5e{-n~aa&x`B3?GWdoKXd(C)Pk)wy)1Oa( z(?5TQe)?xy8@JJX>7Rb!^v@*3d3e6x2B&}S0jK;>TR>6&d>@?txz_Tie{O?3{c}G! z{qqL&aGdIiI2G5$+gq;ra$P(S@>~}m4$gJ)Y;d;6dJkU=elzOZO3T$A+W##(;ZuLI z|CwpI%Kt|Gxq4d@;REG2O$#D?N`MnfBizjwS48+RR{p{Wck{5TBK%}4e^Z3J`PMxV z?&gsXN4T3;JsaU}p7ctDue15S9pMGyYfT?T_yLxG8R0qxXxhTY6`h}TkB+9^5q_iP z{UZFQmhT(kZhkp3!had4PmHmjTJCHw|5x_0xbjr{*__fB&~<6Z=3c}1pBYP&V3ZDC)`KDda`LBMNlr>N5T61-@K24^(UWw6qM&a3f8wx z`zV6?=G#Z{jOjgtaZ~3?u0Q8E`vLfd?4w{k-`M*oUP2sz^Mt*1f*?sh&cS)j0O$PS zesIp;9o`1$nM_UI*uTXLHX!iYn}j_z~uK zf%Pf%?}c?D*DoJ{)1NzG9oHasy7}Q=_KUiMc8&n&`s)O6+H)5;&ucK&Wt^`bf^`|| z;ql;{Kb!`Bt=MmiFR>o_Ssy-uJnO?|c0HoUvp#GC&iXJE{85zeftG81WBl+@4?hU| z5a^#j_Y?(^)E<`mS-8$ygnTc?b>aKKZvp2z`Yv#mNy#lep_L=>Zjk% zhdllEBsl%{0yzElI}iWJ^5}W>?w>G8+ZXLG1Lt+LgTQ&cuO6KBv)S^b=x6_V3glTo z&jn}wybhe#6YsP}r*;I}E@Jg@2Cw0{9O z?OEjE=UJ|P{-*qM>zzv=Pe0rZPWyl1(eo_id0wxA^Su5HJ*?;JA zlrIKn`IbTt>&ZySvwX*a)Bf|Jhvj=U;M8*$IPLtoNB?t>r~Y1hr0WUWi(N*T zcKQ+8qrI$})i2rUvyrEMTP%jt{(XaN4X6Es!C61m=bE&7QjDzQUvbBFIz!HQ@Bmt>DXWUhcY?`hn+lzm<=k*OSo0d|w7Ybl80}|exwzm(}sf*`RqsH`gddOM`Hi!+mCeY zW_9=1wzCGfxoL?1N z9_|14g*^NJZ-BGkdkS3pM%PZ={cftC{^?`my~-Ki*cF`djVXu^GhT57IM>(rf>VAt z;=T0GmEiQx4=j)R=MKozKM#V_KYxOraye(`pI(RqbDh2;;=o*|?*)0T(~kt_I(-f} z=OMgbk9-N_Z$>$uW4Zc)_LtfTU$p-jZ@J3<3FkXK!rgwP>Ik1A$7nh>!rgrF_y|8H z5KkfK-n{WLv!reUbt_XMYs-H)=nXj(tSx{~N9RHWBXjBkdC5ZhpCUg#Xf5llVWsAIV;}%36=u%Lr!v z#&&JP5{9!~?`{2|^`G<75^&A~M}c!5SOL!aBPM}!{(PwA(S9ifdD`Cy&i204!%y?* zKM(TMe+4-Gvj&{&kvqV7UiVraJ+DV0&wPIk&V1hh=X&HFaOV3lIQ4u1PI=c}qvgJx zZD(r#VEO0z`CTnn`G3lH$4kJOub!i(sQ#JY)H55Ldgg(%9_lm7oPO5B(=3nLe*t(# z`~iAcE_$um>8CxsZ-VVbuTg4>miw=uhx%s(;zoXf$k^dE@t?XsVj}FXlkcv4r-RQ2 zUu?OSFXu}-htZ^d(6VsnmCt%)HRShG1(NiG^Q&)wbAGkNa<%7S(c|nt2mCMK-3wKF zP(O7na`HEH4!9nc1b+)$+m4ej_pDzQgFg-VlPp*L^v}=1Ssz{lXMFyz(9ih%C*bTS z_r*Skg|O!v;H>AjfO9_iW6RZkwji+{c%WFOK?=N{cKX2Pb{*V-{Z{?P& zJkG}7{wV^dfA;sRN2^#kosV*bp2 z$?dCAdG=!!R$l#oHtO?H(DRP`=IVJ}gzqlDX<8KFlLDOhPK3Mp=&A^xXXP)Ca5vAp zA;M3z@^?n~d6qvI;clM#RD`>E+e;Dd=3#$|aP@_z4O8^%6Mc-vp=pCzh){8uN7d_O<61&38|5>e0M3MdfFMQ~nZg+Nph)(?j|DJbbO? zYCp$8?PHxD_DelfP?Fktl*l-Lx_M5N9}4-SAwM6S&;2_dd=}*G@Rc<$b#VyImv-)^ zMoLmnKkRF0z&Y>LzDSeGbAImP4azw`AE&~SlyjXp#n6Cro${Z$ZgnB-p?|Ihr+;n% zUk3m4z8;>}&#b%_8|%;G(8GM$zL@WukiQc7{uP}0x^@>W->*FKokXW5m1nv4wOs8V zCjVT0W;^{9_NdL8qWO*nr~V_rsYll!ae8#l>^SS;QgGJ8vn-F=egJ@uHn0n-u0haj-1DK)H<<;XPx*l)`Nvormp^Xw(Bpo zCu81axz>NqyG{mw4tiEV&uPNl`1k}k*NJa~bDj8i=;u1|D{#(Bhi$I4HfX0@CyoJU zJ^#PBPJABz+}P{H-dGQE9ds=?*Fjrh9mjQ0FRbI(FYO9>_Ddz;EU%w~bDj8C=%;_U z9%TF4-mdSoo^zcz&a>`w&vn%LuX8QeUheeBkF*tD<>{Xr!0De`EmwQ!AKqV2|2zpj z^v?&-!*Q)Y)@58L?um67*NJ72=Q@%1(Q}>1bsyW~$J+yx}tW(%u z4F_j`HP7;Be|0M4Kajj#Ii4Hg1LZeOmqqxL04J`Ga5o>lBf^id@()CKljToFxVtX) zVuZW-+#e&{%~RJ!xSO|q8sXtQ4C^fQ!(XjEJtExAtNKRx{?Z0C4UBLd8#E1#aGld= z8Xe(oUNR}de`4hii*Pr8ofF|t2I@Dh6NBl-SDV&}L4|PbQu_h+pI_%X@eHZUuAiA= z>#5qqbfNOTqnBzSp84? zFSGK|a=8(DSRd{Ir#-G;SNnNhPkZ#g0zK4!h&ij^dKuRRbHV>D-<|*6_@?=)uN-&r zPCYNKBld+ox(0XhZX8qjI`B!5C;$I-e`6odI`Ipv6E&9N{B{V|Us}f;KM(v@;Fnmg zeqJHmPE!*vgR|WK3C?m%VjaizV0UoNGb_Ql9-Icw`g}h)=jV@D9&InrL!R}S*9WP8 z9poQ|e-bv(srq$J=lsd%wy~a%fc&rF&m+LO-kA%|_0B5GwH@6Ld%h3O_0DJDlyCH` z2VVlGKmTBP)SvG`p8ot7IQ@CLXFYg3)`RrVZ@}rF*TLzZEj;Tx_dGZC8~xMdk^eh5 z*Mo=IhM;=rpK8ma{;7vN{j(ID{<#Wz*#Ex(d9DXvhCJ7Ue}O#LgMF~R<9e_dob8eO zC&`CG{$|v}@s_I}GVBLuzf@$`JL*sNOM74)^bh&XwXY!&K2Uzs0`!qg}D?Q+s}?MoO~7g}F}j zrRezFu7j+27I)>Q<$IpUe`@86RhcB^{{uaH8k)`BK0}q)d4_IE{Y zFSjD*I~ejMkRJ&<+5bEO`O%Pf*L)Sx{+A$6`xk@L{u989q5nT+e|PwS_8$T}Y5#0+ z`eAF2o^L~*dTPL_XB&?mU4OYmJ*R+E562gt*Qt=Fo}u8yHX}vDz^UK8n^i@re+lHN z-^Bn`o_aX$P|ryoJtu?vQ}ujLZ;oCRKN1r)sv&hw>yp6^?b9}PX1f>(jNYcz^ze}9ktXFw0_KNGwd`qzWg ze(IeKWwGGsUClAaLp_@#r}i^0a3fIQ0zo=s6Pd z)Kd#iJ!Kv}mqVUyyd5TU2|1IRt0)G+w0`ObFF9W{@++ySZ{lSav4_dS+ z-o#LFdkMl2=TDW@Se{Gs>=)%_(7z1aUa~M`1-Oe5DRTC!9vhN3lGmF50~@>8@A~mm za2tv?`QZ?jba2wh*0iOx^Uf^!5SNY!Hiy-e}Zu+wub5(vj$ZJeklkz_1Tkzi+ z@a@6x1m6MtG4LJ1p9Sv=?#6D-*FHMY{Q3dpcZR&H#45iFxQk^eF9t7GAW1*^nQy^= zZVjuvKlmuf?+RWCJ^c81{lGihPC(rFHSib(eh3)K=k5*vQQ1EgGCZQT z9|8Fnz>frf1^g&*H;C%_s{h@1vxOa8l^+fHQQ+!-C-1J;t9&)&>mff2d=dC;@U`Hz z;7@_i0e2H?%{K+Ug`ET_p9?-3d>;4&@cH1&!0W(QfV*pk`twi0kA?ih;Pv3|f-eC7 z2)qHjkDbKmc{PIf178S!82EAE_25n5i@=+~Zv}4wzXyB~_>16+!CwPE9{dY%^_#nP z(%DYV^n8~T}23J2j{WpQ1pn^872iJPy^nV6^q7#c}3VbH`FTu|Re;WJ}@MpmP z0RAla+u+ZES8Nyjq4ul%9fiT)lfj=4koo^s@E5@E0sj^F7vR4J@6jjtL-TzRe0%Vh zz~_Mf27Cdyk+<`ov%p`5{Dt7Z1Ah|y74TnyzY5-G``{0?|M%ei!2bY#D!9r!Kd%IT z4f5}TzYhKp_#5D5I|P5IJ%0qB1pX%YOz=O0uLl1U_)XwO-un45@V6oVEcjo*JM9?! zp?1Ctz7_a;;D>>~16~8J@|~X27jpiAAs)!Zse^! zW#At{z8w7T;LE^2244aGPw*GO{{j9AxXSmi_IwQf3FH%lnwKtUshKUGElt7aeD|#- zwWK96XiiN_O=8gO=H|p81%s*&pE7aC!rJ;_l}$~JO(Q0!nwx9pr79Pvf7V}1OC~H3 zJhrjEv8iIP{@RqPuL(6|iIl{P44Xc`rYSXNYTc4leT5hjsG3(>Tb)``n_AdXEhg8e z)Fz`bUOYSJEIE^X{%Sqe4mEa`*Vi}J*0eM>O_(yhx^(!s`o@|T^TUj$n!1+e%F0$w zqD@+|&n@4>bDwgXwB%>Rh>FHVQdk@63cs2SFr)3xh&7`P^`dNS^2(gn1B#>DpSLv>14T2hg!38p+U3mmktrm02G%sZLt0Nwc* z9Mjo!khyKtoR6__ok0g#+g8@toqVf`rI&7#Vke)ic<8k8W6Xkl`qJi> z)PmNQp>fg~O3ipRveGQX>lzzMhlXFr*4H#Q>xw>Z6v*SSjBJ9Tu6(wHC2DG0%#h?Y zea8HT(&5!XFkndLA*JyVhKQ8U)j1TKL$WLm!XsWojfs@WQcyZ{N~4^utPvNa8d_3w za;u7$&Q>~PdP_~qqUOns4RtbkYDH(9aF$AY5y znf1y9x8mw~T)p*pAbU;}GqRKptw^=h)XpE*)VM$=UhSJ~wM}uhU!$E!ZpX$-XDdap zu(WJ?szthXsfo`FGxOrG8)&Xgpd>b<^9X?IE{F>%;g>JtQ@w&1M zDvk8HdG}-{8Zcx^>iAqHc8vB8HhM%wUGu`m=2YcW@6Z{{@-xS|ws|I!NynW+>4=#P zb+XQ@tEsO$AvI@wQ{(ZK(-z2tBBs-|OXhZ-hc~CJlNlZi*uy6@G^d(cDi=(hSSwNR zM%`o(Ud4|re8&#f9&X6sF?Dn5nu1wQO}**v!p^+LOnqdEGjT?>Su5CVDs@*w>7dd` zpxu;N2j-H)qaB)y&zoZhR~kS1%GG+qiACIVoN!?(Z;bw9=Br zHT8>9)h$aGrmWk`;@rLwa?9cVjgnhdF_h+&4VDapgIZcTJZ_#|R~KF$@)hVt%P?Iv z%#y(F@flmQ&@`~c@y#h#G{3Tso2|C3ss>?w+$1QxRdT! zWAb)M+`fa2SkfDqU3*W9&i#6OZ&TEfv+iJPA`{r$(U;P)Lu6?zYtPiAnx(0x2@P{n zODgMvNp8mCWl=+Y-La|qrQzoH_UMhwh|R3IeR|?r*9NFd`%D+ctuM4khU;!Sm&;!M z#Fcd1s*sM|xS9JWmK*PcrNlEL8y%NZWE)L4MUx#b6^V|rojhSm9bKl7B^<}ydyc;`7YGsztaf4aRT~j%B zzI4nG6QAcsaBbX@^6TEOzS=0!~@xsG|< zB6E*%Tpco(^Rm|zRQ%t@X0e|&sk%G zTy|Y#_M;6eU%0S7*rF11R+Wp*cC}2i!fOP%7sqyb6MJp<>omhZWR!lrW@J?5JVuhB zXo3xcnI&MZ&t%`XF4K;59$dL^aAvVxYeshNsROy|MDA1aAB)2obBtC zThWv*PWJ?b?1~VlBD)`r^I;p#?*Fm(F7QzmXV~~|vOvJ-1`QGwHRz&I5fTMW6g7ba z&gurEf(Av14N`2qq?#aYy@V#gY}a7CRoYsc-Ym6Nv9*Y;mxOD;TR_ox4_>nZil`W` z`JQ*?o!zsubJ$&_?f3ovp5LCGbI#5)?=$bbb3N}l8=v4erj|h-meL_(xd$g-F2;Jj_X_oOHDM_=asP1;tuNYqE@XgB6bO+IvQk2Xd zEl88pJzkOyLjEH~=^!hrz652d-Pp60fQha{ zl`CFWRDD;~;yn#@HDhK^37k2xBrtpSRdwH+?Vr6ThS{ch9(RxAjXe7zdT0R`)UB~; z=ZFzd(WEObuf6CJyxK!)UN{AVGNR(f>omV1nwCbvcsvb-mr-1NX~mUSh=nm0Y)r}+ zJ1)gi;dC4!hxd)_mS4emGazBQb5c!L0urYCy;Rc`0KD%l;*b5U{Qe8)UU~7wflIEc zh1PbHXey6}iIyck-6`kFk@Oy*dqwpRBXk{-{f30?DgQ_48Wa6iWc7+Foq~5;38GPS z^VIy|cbkg-s5eE{(^G{Vc^S~|Q#3|TkY=KasikSImfCZmyJu;LtaG$I;Jo{^w1|2- z$BPFkrd)i*Wf#|8`QzOu6(2V)wV1aHBuFhTZd__H585Y4EiSH}n*Pqm-KS@Yt*02j zRV$5MCkWw<`kVrD}cQ=(uo`6#-Ni%R5fTzg7kc!Tr$n-ee zZil{32rcEr?gYDSMw5eUG9yoda-W`P0IT)CGP;)L?iZ_en}=@%l|#|!Fvw8#c(j_t zfQVivd@0RHLQtJGW8Nkce=V3O^G@8df$YaLkIRvlG>9RbLdsR5iP?CW-|6@(!FWjE19&6 zjbDPyByQ1U>sfsjUbh>WbKz{9{X{v)M|v}9Vx{NdCh^=cvuA&Q!GhT}7hieR6_>-u zzV^qn=i{ZI)mL0bFEewEx%`USi^oivI{jFzLskEf&%b|p-I$syuK=i))`ut;7tfnL z_sWYdyBPP9uDqhI#{S~^Z+5(NmdiEN04?Tg>i=7A#*6-s!@KkOZ~h{o6W(Gx|J{#^ z@IzC;S2CVo(=YJ*rhur=qbW4vAehoykO(SScZ1^hAt|6mGu^?$(X|DdS-{&@=cCt1E7Pjw>M`qORT z?@IySYrv060pG`XyZs%J0zRAnKgw=DN2Y-H8Sr^2;Kv#8^#AV3>c7;0r~i#l7C+5^ z|62-p^*_&c{oR)WzSbcB{uJhZIpGW~e z!GM1%1$@AOe>w&HOas0v1^lH3{KgdU*BJ26rGUTDfPX#({GA5;3n}35HQ>8bz&~QZ zznB94Ndx|+6!5PY@Gqx;-)6uclLG!r1AcT0_{;%v;AyY_$EJWEVZgtc0)8~(`EN_b z`1kD;@WlrCV^Y9Z81UOuz*iag(|>Mru|z_r^@m!6{0~#WHyZF`Q^4P5z~`rc|Dyq4 zkOKZe#@p9#`cuF^!g%}m$AvL*vik2d$WKcF-(`@Wo&x?AgM3d4__qx52c&@CVURy4 z1$>`Dentv-&p_G!*vo%#3iwRM+sl7Q3iup@{7X`>zgz?UrWEjb2K?74;PVamuTsDl z8u0T{z!w|vi&MZ`2K-(rlwSqo?dAV?3i4+f~X&>;Wt6!66c`MwnJ0fYQeDd49WPXXU!kUuU3{5FI9@hRXxHpo9A1-y$JetY|W zVhZ>S2HN|d!W8h?2K-eij9+sN_~j|!M;q{TPdr)sEi~XOQ^1!R@E50muQ1^6O#wgC zfWJHi{5%8xvJ~*O27FNp_<95WXDQ%sG~k<3z%Mc2*QS8~qXEA@1^hAtzAXj(BL@8Y zDd0N|_$O1qKWD%{lLEfSfZvn?ewzV*K??Xj1Aa*gc+cSY@q3{Ge-NVKvWuq+5`^z8 z#z!vj0mZd%BXL64_;y|7r)2R*0zp~*rufmo3jXLD?3j@c|+k?Xi-;$Ok?mHz}M z6UYBX{9uw_!SeGNNb-M=V_p7(xJL46ZP~tE%JNnJt$w4p_N^BuCjRw|A7zh>V_ko5 z;+lznJ@dC1PyGLcW1atA5N_iCCzh}JYfeVQRmT*b#`u9+{+A`G|C4|>@$WR~e<|eY z{D17g|H&lvPxtikaq0YflGMLilhp0E&!GRm8u-(iFv-{LXTT6##Fj|^e(2rAKa25+ z?7tLvlm3fOmIZ3J|NFp4*MB3+*ZGfT`HAem%YlC};}hBc6At`qn7<{o=o0rIA29IW z3k|PH{}(5z|MM8H+fPlB`ac_Zlm1s2^iOS#uK!yd_}`eM{(BtwwcxGfH&zse?q+d|I5JtZU_F`lGOjl4*XqvK^V3~_Wywc z|0?EhxBo|xo^C${1I+p##qvov_KnKQzFp6FUH|!vPt^YW1bC96x1UQ5`fo=(o&UoQ z`~xgMQTs#pDNXHXRg(Jeci`V`(Elm}|5I7M-hMVEssEq@|JEe+PxpyT`p-Qj-u~Ab z_^)>0e{Yidr*(3Z{@at(|6ahG_*XE0yZx^>@IQm)>-v8?N&Vm9z<)=Q`oG12{}O}# zpEU5_xZCrETBz z_UBIy{3{rLwjGRPoqwAH|EyD`{acKu@$)7eBf8ks{9`@K*ZKdR<*WD%6S`K%6n@Qk zz5QI4B>&HVH|f99z<)F3DL#t-VHoF$G_Ld&MCCS(dMt-$b5xD}5-tLv-c)`T^IyPt zsz0yeSn*NzSIP4A><{!xAXkG33!VSN4*YW&pNRj14*c5<{NFI}AB1*Z)Sn1LdGLIa z{O2-WuRlAIA?SPF6c!1ABG4f`)OxCpZ{okqz`xhP ze-6vn?PoqeRGNtYY6t$Uj8DY>aR>f+C6bX{|62|G_eDElvY*MkaF>Yxj~K7pPZi@6 z@xK&!lm6Qb{NFe5Z+GCo|9*&!EfN1*v@<6A$!B~b{s#eX;-51yUjHA0kKX?Lh~?|{ z^G=fdpH=+z1laL;w$MWKOK(4)R{S-5EAy{nD7Bv-<5=hasp7BUXS4i7`X7yUM(AI| z*CfgRNZ^J3HT(_(|4$A4D_FkXe?5~V|0W0iJxTJfci>+!NoL5d|IZEl|Kh;^v|)&h zEs_3TbKqaW_}@_B*f!mMUUcBUjQLkEp6ur`4C#?O#6B6viP z*=~2>zm)l_bq(U5Zs7lK2mVC|N->G-=OYLH6^uVW0sr?M`1ekcz#7IA|A7Yn+2|)p zr@H;z!wWxDw)Rcee}M72{VZer@9bb4gKo?=1$dMFRGu!0w{vXbKiI&3jsyR*4wgV& zp3c9;fqxC-6Y+0$;Gc6wJpW7s|N9;I4?QF~{%<(&&u9E&tUnd#`gqlWe>d~*W+3U` zYv7-baSG{Fx1aY}exmw2p7FZx{d@NX`U=TGnd(D^TM;D1-H)L$b0PdM;j#`v`|naHDNlO6Dj8IR#{%to^8+XBYx_S?pIdgjf(>H510 zc$58BoEcyK^!^XM{MR_}fBG;fHIe=f$2f~9>il~c|6l_ChX8NlpI0II(=#iyQTgW@ z_?NMKz5Te&Cvge&@4$Z<)SN;(xe-|Dz84&pbln67k;;<3tjn z>%WTeujBrleben{AK*>;?>t-b&u2XGr}t0j_Hzcy*Y$te(Nbz6{=B z@0%XapWc6<^MA^L|JX6f@gI&3%B25d#`h=C|GvPR^qG@xse+A2r)BkbF z@&A~o64_{^S_kwlz;Mn z)$7k)EMMo}!SWOJe_uK9?@E$?p9B9M1OEvI{?-9fe>(q*PL>%@#Q(Pr_{$id$bR2* z!2g8tiPjIsA86*^kfi+U9q_G5%72>iy8X2={z_SmB37u||9ap}_SgJ92~_om>~E5x z{JwVJzwfD1WFq~ac96OLKo%H>ML zf0+aS)?xv7oi2mOx32%cI`FsVO8)tbB>sK_|6LCJUn-VB)m|t9tPXYRD#tnnUDNGn zN3o1T&%D|@^$^EO_EX*=|3Cm6ej*zjQ={+DvYW$*u{8~E3- zd|m&`Sw4nmF`Lf+SqJ`IjQ?>AI==sY+JS$?RZ{^=54?X{&+7op9V*A*E|GG-~dp^fg0Vk(UUDde` z_A^69NtbGj#Mk-H0^Y>GwN3(+eBwXLz`v2@^K>C1C;b9>i0N(2rueIHTdtXZF5?T~ zUuWNR{_g^B;@{5v3%UG=|3wD=lSi8Er?N^)J>M=I$BMVQ`~c&1`)RL|F&<<2D!$JD zUf@mq`+h9-Z@+&q2f}sxd6MPp_J7^QQX-py5+BF^BgX6H*Uk9i2vQy>`Jf`U>cbq$ zZ?63P+63+IEZ|M~FT6(PzlO`7%8&X&C12H_H7sAxf7_)}{t_8PzO~|T6&`NpUwoN_ zkbj1K)64I8;7$COE|mP$dr*k~4-Nc(!}4|hcQ24qx7mf`Sm|9|-p41e>E(9|H@uqq zBY2h0$&Ar{W{!akjl>Z$!$o%Isn(}{zA^)=-~I`FUhljNU4nZri*-(cW>8P>URId1&=;4%Sot&~CJo8sEH zuNkkm-}Mj3SQjVI|7XCP^gr(}@%mq6;D6CEX8yeoN%@KNznSrI{8vbP;~;x(KYKY2#-UnzsgH^sGY z&oEve|E%beu?p>xajdeV(#ahwwZNO~Zvp4uuK!;e^8X&o*ZYrKH%Y-x z^H)V{R)IPHOBtUi|IaaA&wm%=6XpLI;7$3je@tr1o`3QsRQgxtT84t7ve5Hi{cLji zf0*$IVzvd0KQiWORK6fhqWm`kZ_0mbdwl-?WXS)QEML!m`sU>Ff8}^{{&N_g zDF0!`>-jHce4_ln1-vQ$OFH87{})64FTj0bvPC`r&$9e%&HgB^ed}VpZvVZENAnu9 zsrskVnS7$z{&Sv}utfPU0p67Vww3Yu|C=HI53zhb|9@rqiSmC8I#|k!p8s~nC(3^t z~+-|&Lef1><1Fka9962_ktQ~L4k-)6?^qLzd4pBdMSJqCCX#GG-&L_N`s<*Ai%D{5~2$=l^fTU&B|dlNZ`q81bk7 zFH!Y3hp+c5{u=(Smt=%Yj;8{Rj_b^m&Gmm7;}h{e9e9)dXLZK&f7HPLCYG<)|HocV zj(?8>|1QQS;{P)6CjMOp{_O_-2Tw59-`8GAj{grCAJ_gco@uD!i}Syk3%rSc>w2kw zyZ`(u1ONM3zOMfjuS=1Y5y|p^WZ5^*DQ5f0>XEVjpjB+${`(#HyZ8^Z?CYm%4g9NF zzRv%_cclC(8AQHy{?9q!v)@e)f7+=s|9bmd%XnljW*c?U@f`=nz~jn) z74W9=ui41;j~f7LKj{B&^!8)YX=eMaO_vOn|Ak_q>+c!HYsKuU86ffdDjTzZQy@=G25Sp{~61FUDAmBDpQS|y2b!+l5es6cH8=8mqGsTfhQ4h z`5z<&pW?-jwoT9fZ;H+GGv1I)v$()0|ClrSAiQ3N^;D!D)#pb*xFSN68;=dV5>h|{!mao^}_j9EDMEzIVMApA1-*te*Cu%>x zf_xMIZsu=qKf95n&VLHa*ZFtSpKW4G)PDZPfqyRlfoP)ka|!S!{?>M>5PSPc{~x6D z|H^^?YWlNAY*per`lZ{?6_eQhq_{{#-{HyOdl;|VUn}EBX%l$8{=5vlDgP^WNw4FmtF zWo-W%{_iY5QTyiy-Xy=9<=fl8w+!+hbCBOg&Q{pQCTRa2c96ehpv=F${d>nCKX)>h zpO*hFau&gssQtT@@w)xFsw6&9`?nZ)p+C(|mhL0@w+j~X{!7@vzf1Ag@cWRn2)0D+ z-yu`X<$oaKUy#W#3#>Clj^x1sz?;f{o|pN{K-@ptX5b%kkngINg3A(={~`zZdHYGh zHC$n-{=RRJ{~pWN^JQHr<&Tp=B-fNz`*yy?`qL7qriBDAiBY`)SfBRAK z<^P$1{~VUDm;acMl%J^l|DpJ6@5Zk4zbxQ#?SnWnc2v|dmapQgU(~q@=K*ihpH(PRw2vRi7gOQX z^&bOIIo0j2o#hWzf;rUl|7*tUexBWo*W)YsD%oEs{#pT6G5>syNcy8bTHzJ{M;-X@ zVEHPZlBe@|$ANzaKe(mGSMpVQTO9be8u$-3@b}^dt4aU4EMJ@c$IbswX1uQdV#e$F z*ZH3Sys`aa{+3PunFjvfci>-@B>!6-_}3@Nf3XAqj3R0OcK-DLWh(zlFONI$Z%dN@ zRtNs=N%DWkfq#X8KRwH#^B+D{Uen9Jo8_zc%3k&JOTQ(4^|!mHziuisw+*e=+0r^6O2~eohA7RDYKk?B^hZ{mgRU@A|Fm|AuS)v$XR? z4*YW%uj-kC>G@yiz`w`9{}2QJ`yBY^v-|^;U=DTu-46UKlH~ua1OL2};@h8*2L5Sh zneC@0N&cf5uiH;+lKhVZ-ef;D2L3(+|8pJqFJt+M?B_ZM{+*21%S*SPA3N}0!Tj^N z+-dx9q=En44*Yvq{(cGUXM+R(z9jjtap2!;;7|X5rt+`q)%yhiq~{1-6)1ssv=pZ@<$;g$V#JMiyf`6`~0r`v=39JBrOCaM1~ z9r*7s=%4=oOy_?z%h&D4Mb1{(j#b1t%+=24Iq=VCyq$EtDWT+Xnb}4a~ZFyuIPmW?@SkYlKW4gF|Me_?Yy$q5GhWyK zvLyLm0=!B8#izvEKfRJr)gPso`yBZ9uzb~jsBGx=^MM2ZtUt)|Q*snu$yev^Iq+{b z@V5;7^UpQwznJAG(ti!(b^X^Q$^VDIoAlph;7_l_Q~6hVS?0jMjpZlO|A!9zyOQL; z&4GW;sqywhuVmBtA9tQv|E@pE@=wJ7D#q*j&u6^Sld=~jU!7kLyh;C62L5Lm_&?~t zzk=nDP=Ywr``;}N{A(Dm$JhD4;=q3?^H=(#@xwF&|9vXW`mbmCM``?XwR4N{y8f3X zssBm9oAlpp(EoV`{y%fz-^KD1%^&Y|;J+hD{(pAhpL<%o{nNWtRr%$x9-nvMpG(fx z*hXbI9pvXHDSw@V{8oefiw*MK=bP=XB1!pQI>_%f$fsArDE+DWGtNPN4a?6{isw+_ z)#b6ko9sV#qSSvCM#Z1R6-kbk>_{1q%;;Z=V1{I@#D z?_~K)ZSv`rHVUuwzs^Cv>(9yA|4Ik>HIw4){|bZrFC66Oviu5_aSj!Kb$OSA{1q&} zog-5D|HvS}^a8W}*CZ+bG~iA4x1cn>{h?RFDE>*C#nCSgZ#p>c>U8WQFQq) zJIL=zQvUM}^6L%quQtd(YNlELuBFM@pAUGG{yPow>6I#a{%alN=O!ut3J3XFljHUO zQ-l0=2l>TG%Kx{6{7QrTYYp=Ey3nluswCwP1m2|oHiP`@4f4-(kYAsq{Ieb8_Zs9c zG|2yhgZ#E6<=^EXKYvPm`8OEkcRR>$XZdZaq2o~5ue$uKgZu?7zf)Et;Xl@7ke@wE zmjAvgK@O|vVL5DS{=t_c_rKM=<}e3*E8{a2kVCQ++Eh5!0pG@WB}by7^;hYkgz@_L zc^TtXJRPsjCjf7<-(tTkKh;iC|M7E!{w`zrx}H|B{3Dbg4!Jm7DxA-FEt=~!#_QJ= zPF-IF{2-iwTFlnN_}rMQQT?gQcd>jO@4AO29js!?P}k=#ffxFVjpnLk{q^iGe<1zc zWY8Z;iIYu`by9xwc!|FSk&eS9C0~^b`De+JlJV4cGdW9PTXu@NB13sKdTl5UP58np zdG&te&%WvSvoF4U&c#=bsjjIRbH&))+}wQZYLmzE`-E}h#N}}(oS1){IIJ3SeOX{~ zn%f-_?{=LUu?xG*ion3gX|Xsec2%UGnND0j#!lfU*mv>qrwIG__%no`^YIr5zvSbu zIQ*K!euR{e8+#gdN*o`T2VVoQ55ztQdj@uV#D8fF!NFeGGqLZD9Um9@>w2+gVIPWp zU+nm}_QO{;_F>rR(Fl6H0Uz;Be|l8lKxB@4EC|u$sZ9PR{_4ro{q;(KC0ufe1tpj92{JXeJ=LzW5-9lQ|%HQ`~dq8v0sWEAJ=90x*Yoz z*lV!=2s=KmEAd6HxwY8qu+PVik9fBext#tO`%kd{6gxhyYw&d~_Uo`;kG&rILhSgs zZopSF_8|73V-I1!5j#GvR(#!z{T4pI72$2zZ|C!0AiM+n5_oU8`vyLL z0^yU`pW^eU5k7;xi_bSA+=TsEK7S73X6(;ne*t?pc6?kf;_D^sFZ1~;2w&yn*ATvr zy@$`YAbf+5-$eKp_P6=`9fa@laWBF!_V@UFE5dDjydB~D*gxR&9SA?<{Ye@lc(4z^PS?qwaS$J8 zASC}lx;_NqUVKbGcYE{kJ_yN&jpERA)kCq9PZ*u=hcFxaFg`yJA^H1^;PZnKlK;%1 ze4dMt{80|$^TQF6f5#|3KLR27OXTtSQ3%QZ;21t1jgao=kKyyN2Hh7Bd|rri;(8lbUYs+&2tyV{+7cw4u6O6 z_k8>Z4*!VoPkekghkr)6l#lPf6b|PHQ#~V0& z0^yT<{1k^zBYcLByExp4a1$Rt%i(hfH}moH9KL|Cn~z`Q@Fj#V^YJSjzKZZQK7O6U z9)w%?_ze!4(ag^Iv>s9u^f)!kRH#V z-|7E(C@kRcI1Z2Ja2$u@IXrrqIz zcPOM~7G7#_edIml^PS$=E3tR1!f$jw*PGY9(|chDuDytmetUMOw-Vuu0f^$FcxvPL zF9H)rJi_%Nd7Df)WDKKp5o^OvZx_|%@`li z?_=Bs}Wf3nBd{>11{qD@6SSc8m zQQ$gQu9kc!|2zGEXMf+-KWa_BYk$6Lf2musZ{PJl-}S%WjX%B{e~BLQyYc7$$H(7R zXiA3F)LvV#qd&uY`^v^mbw^IOLRaA0_S#Wa=-Lc9?ZA|S?g?Kgx=T4v!z{3#`i%=$ zVUppoGU%8#r~X4pIyxdLHxT-MMtRd)wZr|PYkX3Y5Tj-ibnhDwp*cE9}w60vP6tP@KYg> zGx@p*#T8&UjZ1wwfuput9dCQA^wGYp50#u(a&F1=l4;Y=!Ne>t5E@09E(v*j4SnwG z_XXv=3otV)xv*qb$!zGz^*FKjSI_i$M1ua{+I3P_+t6>e)QP$@# zdiCn%%zZ~mf2PlSdwXNMx2b~|g~a1SumEr41LFKbn8VB7#yiBxBxt(F6KE0n4z$R) zZcK)GK2Jtt6}?`2p4G55%L=7iAy=TN$J>;R%n|oM@E9_(aDPe&oOryq_8&7NUjcwB9sVIO#0|MYlpyw2mnb*fb!q*NhV zeW54y6}w)*wb6;EbD3Z{uHaBAN_Q zOipJGc)XzYRtP!ZDt)i`^3VN=+g7$iw8YB*iKAtM*3rbksQ>uclHdj!UV%>eR z91VIFIyN=yO1mYqh3e5>O8uV8`t^rUIh~t$DENRJ=yUp5sCT7%0KU82@c#KjRLLdN zus+x24?c;p%;s~f;73p_+NJX{q6?H+S1!QG`88Ood>;GLSlq*M=?t-yiDN7g&JfFg zNa#H*2X4duCXUzOI`3IR%~&Svy)qlWGEyxS&cFg?-jj$ecEk#cSR&2nQs;~(tkA?t z#F|)ziy}dsoIcMA6-T(%|7340kY>>`WF;=n=)(Rg1cGi>C9ci@*UD$HT>CPXG_f2@ z%f3VR!;ckM8O^H6WymLpg`8&9gEtKA0;Y!;QDTo11QNv6x&co&Qa38y2IqABq%dP`o}8-YvIOQb1&f@V1!nhr=A zttd05D+x@Q3p}zsz9{PFiBMb1U|*8m2kSrbo_{)2I5fbGKd$2t7bF>`%GZ=Ic~#`! zmiu}LCZ!4X;n6T%AxEBX?ULJt?qS8JiTM;9^(!S@foAJRf4eD6`pvFb7g@1vpl|f}L(? zz$|7>s&cZ4Mj=Sr#XC5T+C{~lvx`xC&Mr29kDq<~i+sjhezk&m2e zG`V}2(TRRs9HYJIP~A(I8 z29;S>9xlTNfVwT&Ty@Cqx)M$Zvo4s2<_crn3o!;IZ-&|UQH~SmPlK*8hENuXL;NI^ zK>3(YqbNw!MtHc`1(V%?5WyyZZvlW zd&VFn%gTVAM9f(Y#-%x91Qs=C*fw32!>~1M*D#%^8N;+U<9y@%3q^TG%z2tHXJKt9 z)Xw=c@s07lgE@nfs>yLC&3-izyJibkBYfEPA3>R~vQ7V0ji3LkaX$9LI!L(*V{;*?X=Egf$}MoBq;3SzJszsbuCLwc%K3ZOwDFcM^S|lZft#n-BUMH z;+<9Mt3s_>hggK5WsKQtl@@?PFCsdf%D3?=Iv&~S(9+2pgr4J@2lTtxUkC6V?5}wj zy$W6+ET*hOeLh>CgT#Ea3K8jec5V%jMs zL;;yT2oPPH=(phAHWS_A3_1KN@m2F3h+iW;W5f?Id1VdEv<^8XF+ei-SKNvZ9EcZoOsh7}eh?D@Ve@y2GWyhM^KQWLB!J z>k%Wt>5nID-%lkq9+=q7;$s zHL4WEs35O5riSEt7u_urQ8|m&52#r2rNTr~kqROU^ip0kyF{3LF&f`I9;SdoPIR@* zwire=602j#X{nxKuFNSC=?V|0I@hYQ6!u5-DC<+-m$v$}_hGn!^m}S>Qm#+*02PnY z#sjZr9i;O}&ylqN#6)NC6++d880r*?FKa;_;!w8$zv`GeB?ocnNoXyx5>cb|iF%31 z#02#U6>c`wu@_bOvb96!sw9P-%U%OQW!ZFk7d?$EKz+vgBx;gsd}+ZF5z%`*EFs^l zP9dMj%?#Wys6>4`Ydw-gOEIgVUZ^s*+xT0gGR4#v?k6I75k`yj&~F?kdIqO{V~Y4S zzCMP}5w=1UT;I4}y$LW#e7kyepG@Ri)T@j3c)jvcy|TAgB8y?_gynq)S-*Pq`c-x} z71ZwUSmIZ^&jkA2x^3h%kw;Dwg~D_L!G3W&Pn@8^6Jg8^cq??N&x$xrAPuXC61s{K zDx`#pIU$4hh1K$ikM3Y{>e35?+5~oSr<=8mmM-oo=K4-qRLX$3Lb97wZg}VC{j$m^zpzJhQQ-qey-l?( z;Qq>A^g-QWkL6&E6fR|4g3_@>oTyeZrjBi;^$PZvJ5RU}MLcL0ZX^E=+a#jVw-gst z!?do^w}hbBtYBlbx%At-k4Dmu>|6FY5fenMyvgV(}&nXW8$?IXee6ixcItG74vSeZwkY#6{h; zm3BuJc#_?jgP&C!4gWH@R>5Coqmos(E)e=59D}ykKIT^rjG}l05uZMI4Hk9REj9X; zXqF&Vy{^WcNG7$x6IhBlMD;beHE*VVAM+D0}R%n_p-)gzW zSNT{jeilVl5?t2=k310@(JJA#NBQ(NzDwC>HH(-u<;jObTbl4t^Y~czR(fRyDJPbx;E7AcJU;J4G?PkVg9g=}>s+ z;tY0!^xpK47?Z=-Quyzb1}Ef`Yi3Ey6mZ1Vlaac&C2c>9`Gf01>F}JqZiQ4}^$+E` zlcSsDcJEDa@^J+ak+M@Bn#)d-+XF@0uevZ0+^W_a;2R1*NkJf@g4}WpO@wXizZ=_V zSd-;%Se@lZp8Kq#tye$Dn%L35SE_!JFyjax>EHJKs5Pr0N6`*%(}l=Xyisq6FmDfp zszLm%+J~H+Wu^aIU0Xz+lOL99!`M$U5d0{7VssuWTOv51%7SpRT=G|a5k}yzE+v0e zOiQg$Ih-Xtz4vPlNwv8rjcB z-YYymD-C6)!Kr8=ye>Uf(T=+J0>O5xq327hWt^-5?wywVLw`|w?O~y`pxbJhh-mBP z4+~B71WPd;z;^4`5;tUq`ehzmRS2e*YSF<7rB>n1Sw7^ zR*6b!b-a-#s++x5R;gOq^f5FjT-bv1;9uIS`IqL(ib`vsRxmHnQk7w~l=TOKn9!lo zrnS*Rwf?|H;19w_RMj+5CY*%X!IW$@Ll`Z2nEsoZ1f&cX(`PXY5bOWauWmlg9ppI@ zr@^#~sya#v3FL-x>S#aAv;gb2Qoh&}A9rh+K}fY3W=o+l}aa zih3PWy8)WyY>IZn>}-nG+1_sWi?;t)+Kn~H)PKF*IECy6s-E3&F5p#g^-XsyOiOs&SGm{vpDFWQX}+-{8Ec4O_gY&W=hr&eS4y@WrA->u-* zuusds^)36a>2q71?C%<~zkaemvy=RP)&9f^k5$y^ZK78k{MYSItn*R7b>kP2`wRbr zek+^pFZ+MqZ_UH}gxl?Czg6ShZ`H*2TdMyt_Fr=4$4?JS#PnWy+7Fb(!8uczi}H~FIOr#L=mYw5c6t^4Emxj#mJreuVF z`dLhWd>6WB?vKTDAp4*o*tgY8Mj=!&0 z{WQAUjETX_Lhg&{(neapn*#Z9M$JnJu)TK(4Gd3WTD!(96{ZV z95>0N7t`9BsDnwhfn$Jo7{kvHV|b))?uS8)=63(Ljo(LMgz~>@2S3&Nq2&7E1E>)9 zKtDX1+riO$s2xnbA1>DNpOg*$3|*Il4gSA2kBs)mE&tR0xa}MD#}A7k@eC37?Ye4ZfeXe9OZi&`bK)2I=ADwzmQzivw3AaMfGvvYFhh?J{P6d z4^r&Ea=B;z_WhTdPa;M1$5TYkN~81RM|}0*>(nDRieDq0^8RX;933xw(|oD%%D3*H zWAnFFSTOPz8E-t|Yu;@J>DNdG{|5D_hX@<-1N}tLcTU#&`TH;oi1zbkEm!x8Wi@o$ zF3f!!dcH0>Y8{r#zM}qit0nvS_^CC$_mpPhVx6xPQ*o=IBcr4Niz_s2C_TBBybXSe zw$a{IU-wVFn|7Wu(@PDbO=QfJ`Fzn$7yrM}PeHmv$w#a;0UuR3MpWaAjv zOl}`D6U>(bNv^Y{-cO$y?WZI4>l)uYr`Ds?H!o7NzEDkvn&+6-+2q|bv7V-l=T&=H zyeHcWjOSmAU0=J7Dx0YBr@qVXEp*#UGzoOz{8;yzNSycsXVmT=5|0rbNjBBgBEZOj zJ%z}{$btP=r{hTE$U$sOsg1~w@dvTdqiTr6bc&#^!;5d}fc*;bg50CFo#493J?yy? z@b^2z9zOwZj`rYqgWH4auet~RY@Dk(ZPb?I@%Bv*zQ0KO0q)SGmp*ZV>ru~uRz&ga zi|<=9|AJJICRu2(0r~3-%D~4^~GGo+LAl$ z?QyR5k;um*hfx;jYs+E7+Qzxs4hQu4!vVd^H|maYuGUc=e7B7P^o>!7_1>sqi^sV- zk3c@w9$A4G=jI&_f$!!GUp>yX@Tg%c#<_lR)BqgcbCd_yR~(g(*!4#rj+ECOJ^bEr zt}RCo+jYEa*UN#4QE~Nay{q9L4Dewdpxdt(+1%Cv$T=0r}RNq^pq~$P^$Z?>@3#jJdeH5wy)VmHysHEheZf;+6xiEtkN z$eShZuY~50_{clsiKbn3qv2IZ9(1Bt79OLmxC_u)++0xHd|Yue?iH@i#jv+gBy5Gm zYG0{$IeGLQOV_N>2_H@LW@RrzdK;0}CZvT&DB!QS6zMFb6e6HB=g4h{+y;r!$Zi>V zMkZ1g4B>?fKh7nk7{4zmZN|?hA{Px`ySj60vS@_61v$Nsr!QLAt;iAPa4XGaY zkmdgR)c$w4zd~f8EAR4r(C#2rKu9~NudxZka1Zy=$h8s!IPdaJ?wybIBgaKMy;GiV z&H@cw9O_-(?(X`RxZdTRvJ$+c!saZ3=dV=YUIc*r0P(aH+!a?q+6wRTAtbF+VmiH3I-1jjGz?y4`LMiAWrzp- z#zTfvFh|Oz3bwQbbN_T)W3z>$cN4f4e|&3;367YFruly?qX$vs7IqHF8Fq1M-83P z#hhPZJv@n!suf(MVG2u-=_NuRt<3{*45waHwq~J>W|-f?)g%s8wiLG$i*p+K_Pu&* zpheUTf3;^}z}e173a5cr~g*L;v8b*93UAxZ1NK;BH5(RyZgJu+A)#6ur5e zC&4Y%cwM__NyigpRWude<@>AL;zdNrC@P!uMn&jpMJ}lZlILuruO4~8q?`h!DSGyS z%zEZZ?5M8-{**!~T?x%BfXywydyf(6DKa{H1s%w&PJ-ALdG)~n&=Qe(>1GvgQo@{~*c~9gLlEypD!t(cV~C5f1sV<1 zEtrgGbEILef~<(z(GH__^+d>vW2)6N5KZuvF}k6e?(k1Bsf*S%mH?w10twPtShOWV zf--%2G_%x)c2sur;Edy$)XyskGDauz&>7wlBSEAon<`rdh@F;!c3bi|#;bS8=w~3N zEe|V@2Xx$86BIsItlXhfP?b%D-sPvp)-=^4j99@5N2|;-WNMkMxG-{ZAyOvQ%V=Y^ z6tR|Klpy6qn!HF(sIe{ewINm;h63$a2&2mXU*G5{E)P7=uA)CbvTdUO3=JZe!Xe80 zs&+{9{dUvgz7!h!F9PlGJ|Ii(HoQ2o_Jke%Wza6Xyl|U-Z{e*&g97i+GTc!Uy0(I% zeY4=nSI~ZgxOCwva>)Bk!3MCC55M7Ebblb4LI3A=xg<&aB95ZLFRXR+M|3U=t|`N< z;HP-}QY1l+p5&;s7{3*?8`#1RUy_0Nz35(>B|RDyF`|`itt-nAsRxfy3(~6|&%+g_ z$-YR+&lI8XC_)GyMa)sG+;qzZ72^XVo1^$$gyi6sDIJVr>EH)%6FoN-6^{o3q^r;F z#QR$&kA&mdY2HPv0WNv87~eQA_BPUaxf|X;y;tKd=k{FX9V$Jk+-u6=PbD@O`BYQ9>eL{+4qg>2pZBha`EI!_lc>3&uvMcKC-HEM#?Aqwof| z{y@vp9xo<~>+7Z|nWwj8=g+mgm$&=fYbe|xgwOR}+JRS1Va$*JMhRadhP=gK-_sXp znb*tDRw7TikQY8h{EYF}ieeHkE`m;R?XP*o9sjUZlj;!@?2{W4!bbm#f8n*sC7A-71~_QwN5A zW73j>bz!$C3#irE11t*rD55!7xhS32`Ff%b^VgixHNxgLNO)ke%h+u6{3mbae<=Fy0^46e|)bMTnTqv zl4EUr&l)c#)rqkgmnGP~d}a{T>Bjsr5sftJ9ha6_!kcL!QLoa1-WTCI>5 z&X>{rqQ~*LKk`;$+Sl&+$U79io$#|FPrX3VGj;f*4Vw3ypBA03NAmlYV}1i6&y+}h zKcd&Tp$n-@qtq$iuS61swq*HHez^QphGs=FbcP{AYXC(Nz61a8*!-Zk^SGfh$`78f z)boR%DKDsJk$h}RE+2U6I?ID`N@W_QD)J!`BO_vOFp4{%QEA~*%l&*wpAsT9w9C_4FhZ8E@8G}bM zDqNbsXyg3(YuML4U*BeX0-kyH|@YIN-S#%97bt)6X2yQ zF@6JUG$VB|sERB<-o}Z3wDw9XxY0Ta-Nujm8nz7bHvI{STMhkL-bKHrqmB>K3)UBG zA}jL;Kl5)4NAwT-%0z}xUP zn~LWfR@QCX`p0N{kMRK<$=~h^zX{Vw(8lDDO&o~j?!vCSBM``C4+rUyS&YdF;-GDlv4PVx(9TPEB@PVe~z{U!C+Rl2-Q&tWo%tc&@lh2bd1sM|||ucD@iaml$= z@Xqsy!9c?r3fJQS017wxLsRGZLyO3f1ikC|Q@%tGUH&B|=4Ld;ZUg7ltAthiCo(UXJJ zNmogIou+LPP0cl9nqyrNN^qz7;GeT6ujhYFg0?n0&zl zqG{9h8v{kqq_^pLu|5OU!TBc3T^ig<#Zpw3>Ak6YFcp_HHd`lj1_rxWd?fo+V|={F zeNUHhZlsLgBBK&hjcD1{quem=+#}^nCELG=$|gsa&G9a8$S11$S zf#MRPW*-Sr01Xdbg*tO$AQ&##g@ZA=K7Zl~9w@6#5vonNVXeF9`AD_dR9^HX-X{*@ zkLJ+ZbP~-BMK1iI$$22K^7N3WP|HmZk+{)Ef%hRS^m;PFM*t_v!KQgb>zHO#csq=3 zq^rDTLbJEA1_c@josMqvY&7d{VRAjc((mr@yH^%B?(#PMbEKGXPcA@VU!G63sWA8n zY4^2n0GgTpyW#`EnLi{H8Q>Im&lYTXkO=SJc&UQO;VT2xD+(6DsJ3f zdpr^J_>@hoHrd1q38FyR1l|`M@a2~TzkpfbHJ>~l3ij#sP1y%EtKpJ{Rp$r@3ey{nhhJ$%ic$5^*I#cZdh}BHiKX)E!2;Lac#wpeuYxbcHCi z>ne+z@#=}<#(r6anTW`qOnVm_m$c zK0}i%5jhe;LGzlD;4`(Sk-BqX$xsIDo_O?=i4EckDPg%1MuBK`@m7l|crX#=Qxcj^ zeJmV99~AaqR`4w~{GPxnsNsb9f^V{90K=AUM;P>ks{#EP<>; zSVO+B4}8h-)O2YUlvv5acgP}$AqGz{3$hg)+!nPDs(=+zh$wx6k#=aXCF4iU2zQzI zol)qG5ifv8Ds$PE=#FxuFArB?OB9IIq`astt%WUFuqArIzeMCq1O);?^@x%r!@|EF zaI8WZi-MBowbI_u+ADiQE@SLXCS5E+6bO4;tL&|?By7as2!W4KP zf}esXExgyK++UHuM^>QaHd#Mt5FZ^nlvlTNABI^%Ai%AdyRV^lKWm8}4H-rd{_4r4 z)c;Iv@hmKF$*iaKBx`62H2FF)uC!`QumiS+UX%jw@($6jV1(V-{N&sqb?a!* zHi|LviM!EXO#2->EJpv{;cfa6N>KdcjFmnyhuVa~@FR3TiqCSxOR#2*zVuuSoYt2$ zZt^zG#+t3@T;*`*PN5j;GgS|(I#$t#J_YuUeP}!7u+c|>HjLv6c`?o;L_jvph2#z$4f6yEM6*m~wfS~DkC`)EW4SvL3ub7cs zCsDc4M}ZpqMd7g&Mmsv{Ud6DI21Pir0>Pe=Ao&~2 z!FpSe-syI!FTXrAwF(_UVY!^4W1=^&WLF0!<^IsPtf`^EKK*`o7dX^lG&w$tILyxu z?)2Wj5z8TqkHf9NhWFjb7P_RD11;H~5QRX?rN_Cwd3asHBR*=Ur?%WVj2d@5;*QnN z3Aa-mbss1+9J-9w4=lWAi?w~+39H*lx(MJ;lgJeev&L!24~oNrOEWER-`z~Ig4298 z0X$$Z4_(J|0c5iZC&gI2pXs|sWVI6C(|i@e0-&ThzRCbn!ZW8I;N^0iXetmffF`yI z2|O8qD&}D?p4u{P7zRuDKadKs{w{f9J+^X$&hLe~E!0VaBUCzLHHn8CP)R?W&t_mS zU(g;19WR@EN*HY9cr0|A=#y!|0=LI8hh2?{ZE3IvFS~N}4P;O z;V;@*w}s5{E;2`9s4ZA7LY+Ik<-vn#odIU>tQyY-LPIH?$oulpSXO$3K~aJq(t43q z^mJV}XwrL+JAuU?F~RU*QKiB4xYt_>`zju7$V23X$cR-oQ0CWOaikbl*D2`$dmSwMao$dErtZwdhh>)a`pu^Fz7&YY1&&L zvRAHd4$Hw+WPDc=%G?+Chw*=KD?RQHt!fx)rROFKx18Um)+skkuh@j30Hqs52Fj~1 z7hPxpJPqV3R{#~AmcdaqF)i-hT|a6i=tt=`h@l_#7d;iz?)Z!P>+Zxf?ea>jS9qHa z#H~o!f#@}<1wu;$1*1s((f+aZJzCv6Rr|3+mOrFY@n4!@F8)ec{1g;ylGTrEq!^b2J<^32 zV4(C-Lq$GUDoco|l#5@6k5eRvO^3+x%0`Ffz5grHz+T891_SlTx_aRe89cf%YS&P3 z(oY~8Yr>f&)D*fuN1Y%$xS4Loza1WnB$Mc9rY7iUq#w&S9yk341wJ3EH5f05Wx2m0 zTj&#NsW<5EqyFX*F@B=eSS-#|lm|amjf1EQ<-zAEiUob+y6BQ% zVW_mX=z?0ZMfc+m4Z))eG3|%yf4b^+Vvr7ZkC*CRr2gl(s{g^LMx=-?NF*n6KwVHN zsK=+5$?cInJ#;;Ap_}mpMnQYyerEK3p+7WO=cC#)f$spHjnbZ}%Mq&!?~^_YrOApO zikg3PXjt8NAF6E>I;Ga55N9_EjjN6f+Kt4(0qQ7H#oZeAk?uj(&_7WiqRGOVLERMM zJt)do)DE%s5P|g~KE{4)0i{E_-YnOtcE|)NXkO)QdJ9X>qAf)YTIR>%bXn2WXiRsa zg)RwA$quJc|CV@;5J+h0Xq&(3{NT3{J4fq=<>#rW^{U6)K~p_8V$sTJQw5Yu6E>QGG6M0sqW^g!bdf6=Ns`oE0mFkIuY2)HN@#(98S zS@%Y`1?wPS4J)N4GH!Kl1=J0#Q=nGowgC}UUY7 zRI$|>E47DM3ZS6ljU3GTF<;sTj=5ILZK7=u%^iLevplx5dHYpo)ixF2e;qNNH4pzQo?VZt}k?xig^iv|N|mPt_{3+7|G{Xh}*nofU8fqGjb0Tigk z)glky%M3ep(&J0a(W76+$$-X0Y!mkGQ{oBN?g2^>B#LOz#MdM(akRu;ii^&ee zwEjUH1lM@)f1mokPjJ#wfoc7A8Y$8Iro3gurr=7rY5omAVKnoe=oc}ir}ry|#>V(x zqe&_qAi6|ezmW@;-Dsew8|wJ!2iKuG;Q*t4*^{Fo+!)@1yI11Zst@Tl7G_D|-)yC&^)JJ>BP6YgRWAYxz*%^e z5M8~Y8RQ5_?J4%I@J<*YdBa@DxaAZ>)F(8OG}NlHFnq#-6<#h4^TK3`hF@HVF?=e9 zHg_PUrzuqwZUwa=Sjh!Yq`&ArDfzM8r;Gcw_H=QIbo-FPGh6SLH%L~8PkRluE`1{A zJssiO;e{rq*8j>NzTVQ$$!6}PdI`~3!y-?n>OS0=!a~P5s;kuQqm^iIH@uGmM4pjdv0g`Ob&=fSK4Ymbk5=id(6TmB zvQ|cb>aVAWGKzbV@Nz`;O$)fY{Vkpwte^+(rEo_r`l{}Q@a0Hb$SpqrUV~d8vqQ+7 zh#DX=jE*kHs@_pXewY|a`)#`R-rvWnE=j)*;{6%$DS@gdwMw4^CK#Tw$pYeQ@1#;a6ai@yf0W$L5!0C(iJs77xaED#PWW2`6!ePY-&8(DI@+ z$Z$Fmj~96`Zf4t6yvIcLLS#EESyU&K&i|bo+`3o0_xn5A#xLoe5-sG%y(I1TXpwsc z;P6BG`f@-s&X>|#AeIkajjHymOdS3>bGXa(Z00ZVQ;1gH@1(Csv*?fPf0K>F`{?W8 z>>JS`zjOc=V?I9M21r?P&|^s8w}))P_w6J9h9BQP;(0{uK4uGmua12h-%lOiiR=F? z`V?!1>(5w)UmvU}!~0auIuCC>IeR9W@pJIiIBkZ@_1QFB+cq6hY+Kad*dP2#JZQ0S z+XAE;2*J}IK7nPS*|FZn^YCLqJDgP}AeH_yyx6??Wn2nP!IMC>z6n;#Oy4PimN~vt z(NJceJOwv9Z^h3RoI`TTgMB5T;_N_hO&L{AOiP zrt&uShtNq>UrFA^%TOz~h9+jyvN3#(pS6OUE%%H7Y@UwfF#-!cMS^-R1dqA?RH55U8bR@*Q>{K6mn zpxnJ7kZxrKf}6{OPl|CrwIjt?P|J0NT*%=BZzBoAU>v0&!eJclEyJ1V=+ zx#&)Es2f4@A1Y7!lF)hN@KK7(&>ju-$%}V9_mgU#B>i{;c$0e&?jGksiEeQ}9&Ws! zN4(A8kp=G@xO`;Pj+9P1t3Bb<(Sw2?@yH?`S>>+qRk%joCHeVg)6KZ-67uq0+zS7)gL=sS&qM&u^dG8o~rG z)VRt8MTr@!!qW7%Pt5zox}<<%Xm$Sjh&+iyRgS@BM{tNe1OIe;{w85vR?Bo~qb{xX zSd`eoL?7WO4v&@LOpM}YzJWdL&3g|2f#%J7$_j>|_L7FxSTkKC-|=1^y4F=z^nKjz z+5q7tVv(>e^ZJv?o0}@L&71obs;LWCQ~kGjb7Lhjvov&d236?NldsOab`2SfKXe)% z2*?*LHi__8pO*pVhhb(hy4BnCf7p8$_`0ex?>~p6ke1*{As_>>J4L?O^($&i0WA)#y zplTVUz(2RM^^i1c2wLy&hfdD8OtrTG6M4jY0!=eh-tKT5Mv-bQP1Sr=ui31lK-4ToDjMDqtf3iLj9y<;ou9Vc5a zIeK!H%6&bml_QWFRf~{7;#U~@$XdHp3+=nQeEVuGUJ; ztZadsr);cS+vjSarHr+dpIkV|%Tn!A80D!p!UGy>a7<(*c;yuh4D2h>|F0 zRW?(XZl;3S9(k);Kd;zBT*21Q(ZX0Szz?YLPG{Uo0AsK&$0JyC`dB5j9&w1UoI-zb zRal;_Ke+NlKgK6y(ls%>lsQcKACs3wT%&*<$@(eCrIJ%lBGG z9diGqADrrC&Z}jc;y2i@l{A>S1i`(48hs59S&3|$gH*fzdVVXh9`U@A@SPVv=TeSC z{?4_}eSQ!wMm{I`O)3AaFzxZ}>l^n|P4o?s;~YYHM(Z2WswUPqKDBdwW54m$jeFjO zx>252H|`JBjTsEVj?|4vE{@hW)a@9-re|<8=EBIMW3UITb~JXX2tUdtO+-!NO)^s= z-2(ybw%yXiK@>L?>mCj0VG&>1Wxa#25a}I9A$PR1N@ezVxQ-}K#K?bDqMUl3sd}D? z4)Rs*kJdp>Llv8@+gU2LZcQ1=T*3H`@5n}z^8XV_D$sI6}Bx*WwHsk9WcWIVR zplh5L>Kf-2=^8HikS~ls1Yd$hbzpDxxn@WxrV6+{-sUzonZkd4tb{#u2F zYN8v89qSs$IaOm(Ue!2`#z@s@_MgT}AyuP+7DTFs8ZcVdV0~efo}migrA?@w%$`nh z#TANZBBBvT8@HI6;b4@|U%F~LQ zaRljQqxB8SGkv45yaD1b;0uwiQK)CIzFn+eXgH-`xc4pA*Yu0K$JH+$%nnMw5Tz7t z_QSC{ToCU{d<4(i1o0gS> z%PiPqO>-hmbw+{2;fZY3)syfQOt<)(B=q>d0RDXsZ2G3a?m(+wEn&ui%a5 z#;xQB;n0{ZXTbE9av*Pl!&OR=U*pxhU*jc;A;7yf6}ykK=5*}kq?{VCntfEqN|K^^ zTaFp>Xz=C`NRh^#pHawvn#uU-x;XS_q~kq5;*I!?<=cdPmkMeU##)FykQ0F? zG$&;()usI>TVpS!%NH{|G)3{a^{xINQc7aFTk#v#zVGDQ_eqDqBwqt7`?J> z!`p_o-Q|D;!QG>!HQ(otfK96_*szv1TNCL8bKis=V3}d^Ygh-=yVNi|H}J9X^$Mkh zjh`o|@lQA6I__w|#Sue;ie;O`Pw~c3%PMNS565FvwLaDAdev`Pc45?A^3&AO*y+}1 zSKLNl$-)WkuEc~FYsznC=S-=3uz{m8SO;Oc3g4Mo+fS|O`uk5-| zJ~LVPLN7?SH`U1Oqy0ojwfF<+_WAQkg261biO^i`LBjvETtvuhVzq2?s{Pm$B%>8G zjQso4v0<+q5mpS93SfT+=UF8MbuL*G1i;P|k)|2@lK=0}%2X z;$Nq>2Gc+5memFbfED%ZDP)Y-Sy!v2&~*DbX3Ec3wg^G_*=FWZWXey6*2z zp;=8{-}yqSdywIMsPjG>-gve1H)XE2HS3cy*Or_0u3>L@m4P=mAM!aYci9BxZRvbi zHjS2V=Tk|-7|YFcr<^;ioLfWvyH)Xw#r4DcVf9-b)^7#%yW8qFEb_aLT9_YD2Y5B#tMJ93>IdoI%DbKabVbZUv{l9w%FuLt zMBVD%UFY7lp3LcU(ff3|da>yJ6e^V7w=XNX#kw(j1I@In@oJmap=abL?s9*2FEl!1 z=y*mxKJ~Y-wHKtgycV0!g3E50m*1;6NYLP)0!w@ni!*<@`;U3%#y$Q&X5(M&`9nBr z!M_iZKGRmM)fwqCrpchv>{OlkArFtI&gAl)|3mee*4V2BDh(beQ)%v^yT__D1^$6? z^qHHa&)kF%Bf?`R3e5?{3e7BMcNfd^XdPw;`V7EtJJV+bVjaKfz0qfGLZ7(_edZ?V zGqs^UbJMT_UvBzO(q{m5i}V?GG+wz|q|bmYaTEH?P3SW>y<2@IF_AuF3l``zwqUVK z`iv%iq|cyJ?}|QyE@LW9fj;8}$4RBh)SOG))$6AzuwUaN)t&B6m%- z_^ey^i2O9fo&1Ni`0Sj=z{rmH!Nmi=(DW;UiVfQF99e*Bb1R{UH-CD9?ULJQ+Vt zfq$k+{u!cQUU97hQKmp|V_m19ed2~eE86I(ww_5d*U{X&wwaM6?cP?vwhgJt>-lLW zxpjt=ytGeuj1+Z;);VOA$+9IvxVU5H7IcgNegIhOq5>26aSHlp6yB4IPoaN$Hqi+} z$x$Fi_8__fPY%^{Yhl!R2t6D3f@_8rLe2f_IgkubG;%hadB5Ck(Dynw{+gGk&MKddIx~^SHHEt=fBkbR36d!CEYPZ zXL^psimNT!9;<#&S@kl+iPECELIpeT;U3RnI1|BKq+k;h^kU9oxK`}CX_UioM+){2CRDJGWb&vq z&k^h+VkCu{*M^+tWy@Q|3ikIj>lO6u=qA*&bMYL3soNFaD1BRa2kG-WYdIf?T#NCZ0e%%L(YxYa%*z!lsG+ zgh5qc2)g(QqtrewW=Tj?VaX=cCJ3kod$wh-PXwEIMiLf4#e@UOu`ImyKzp`(v zFuQ7<%3e3BZ1IV(>>Qtn%C>d*(C-E5O;oN^>nJzw?~Y35kmz9l^4 zHoiI`p0U7Wb9lzPIXq*0Z+QA0p7ET7gEO8*GX!VMI?$U;)*fqz5(5-VTp8jS&wziS z;uZL>-YK4Om(U6(z%ypu&uMfM{HvLo`PFX+tNRbEo`VwejB5(P+F(PeM&# zqz_X2h-m?y&y*-n;Ef>mJqe~x-v5mjx)7XWLU2|AImrLuG9^b-uXD7fJa@bPwr;1q zQ@0mG8zZHaYK5*GLi2^t#;8iwa}r=`5VvFK#x4`R4N@X4P=^TJcy&X6*ClObA;R(M zj-z-JFk?f&LocHAg7=k%!upgBmgTnEg(7{rKso&wdhb~MwAnwJM|10FD@aBf&LOf6 z3CNhfdj)1g*Px$P0%QC#Dr%*{7%vH7j74Jw%VM+Z=%OVnMV1B2Vy54}2LqcM(;STP zV$l-D2$AJEh-yc_A&#+)ox-R>Txvm7hvR3%#~?09j5B}^ySO@!UHrpJBOX(Z>3`fo zZ50e8sb12M7yuo123>qK0~wXDXOzWg1KMWW^j!|3lNF|e%UP5Sfg1g3FLSvOuq_TZ zEE*@?YNxo=4Chk}rz|7DrM6`MuX35C^}Y?f;&3L8k5|kT6kajdec%-fFhE|kV!YyT z4w}gkb%w($)~Ff&Fd=B)My3a^=Anu;Jqm_ryDLKn%aEiq!RvD<#RYhM zqvyw8>>RK7t5A8qg$}RSwZdhV3$M5esEdeDwz`_=5T#xUoyUft0O>IgRh(mc<3JVD z*Zr1Q1XS_bc+XLcEN)5KcZ5r^4P>8f`Ve#y61I>h~PM5kPepk=tawl@ft0D z@qi-xeUyD_c*L8-=~SQnB5HxLxd@NAmQQizvgLLtgy+wV>W9<8czDE&EV%p*kNBcj zU~d;CW-v4kkhtEUXB!xzXmA8B>!O|Wi2a^MtSRkp1%K91XwMdU#TLUPX79^e62cX9 zdO73GCKFns);18x7VAf@p32A+2(b{FSgcgy&~ZLW;RLS5$!0Z}_mF%1ods_!z!`>0 z9PWjJbs-WR>;b*WQ00J#1s+?EHX`s?_ePz2LkGi)?f8WHxi%Ds6taij&plr69@oK% zLoY*wGu?r|%ECj0Uov!L@`VA3Y`j;@WVCSK4=GyCK$rN0Gea&`?uI zL+*_x_l6GkMnrWH0I_?@b5H3Y0Ai!F`muE89-i+W)}ffr>Oh9GZ_o=E@N zG2Za(c&}niMO|$UZ@5xELQ}w&UJ~IApF##P-D6BUL^P>LC2ZcH^M!s@@>KmBlfGX{F>=sC?=0LEH-R4V}6F}QkiN5>a=P!4%G0c zBBD|n^gJImc0Iz(@LWekS!xrQP9aR3Y0fXZPApPR!F7MS<=7{YCk#11fo zC6G0v8bB}EgqwMrFob6%FrHg&+C>n;HHk3@!pxu1e&z`GkU;Cg_0nBD7rz%Pw9wv=T(P#z%=Xca_>IqaFPsq!U{&qvT|q^Wy*;h;ZKF-2NZByqYLS$+Xs%`J69U@a7j{RJO zOnu8fP@W-EdnmRujP!Eo)cZxGSEDfjnDkze9`MxYyy!Ir_`Hmw;ZXxa9pX`^8sBhu zi$;EmU7leGCW4ekg+!eJl0+0}P$vACO=AdJ=kJ0dgx)l-E(T*rDF7&7LRXj#S=Im}-lHl)A7kq0@>x>gO1z{crgY=|mX9!~PdglH@TXM}WG1}d@6uJ2 z9yuH&Wgf1prJ)gkzKG$VU2R4glC|KThF5VPtbExR6j- z0RWfJE3cUbhWc$T#F>~8qDn*j-!ImPE*$>vO-Orie+~AE2x!MCT++8_qz>jBApy7e zkD7r+nq}I^@@zbwLIf6}82aHo;-hUS?^grc4hGjp5`mcumrI1M)rw@~b^jfR>L zrXMmA^kcSu$h^=GndbycwE9odK^VO$|5+vw=fwK)H-Qc>jzjAgVh$T*rI?P}At*Ao zf6~WCyS}p+X;?QTUKH>7OI#-8!Q_!Umx6~2?KWrHVAYT;j5sy$xS(nAR2#*foB(@;p5&AWog?dWavp-4&>V@M9+d6dTRI5RLZr7JnnOmGn2{}{iVeu>Dx33$&tx+x)rl@j)>QHWa9648S&0kziwKWsjSED@XpLX9 zPg0$(5NISCWje?eaBC{lQBfezr;gS)qWshis-N2qK>39>9|)W^pWGwSN8u2BMfoNE z<{Swpmu!--<|WpW&T!oik&25r=vXSZhI$S;;uX0=<#u-imy(nFxv4X}ZVMTW!M-*A zL-F3-aBPRv>=0&K8lmQ;`xzSYsWsUqBz^?_ei>abKJ>dJ27ta6#o?bDoF?AL(M+$Y&3aD{WgM&ZZ7Q7&ThY7E-_QXwTB&N=th6(S)KhQ`* z{vL$~&#*+}U5E!y6@&%9lJAWt{ueSf43Q2yz=HoNvk@$KYr46HgVDCd(w}1FT62YV z->Xmu=>>T#_!BD?adv4J^@tEr)I^5`ZzDNzzOrkB;jN6T0yu&@$2CO| z(8$A@@SmXy>Gs!CL9c3IyAur0%gp%=Kgz%hsshpGh6Uz0)RqJfz#Hh(8kdj7cdKn$ zJE0lQYn$Vm+q*igWzf0#TRf|yxy~fJH5cEojD2(Nu^5D~E){pA$qjodJ6q1C_U||l zr8@+ov?nsz3;tE@LQAw3$=?i?V$NO#@3>XC%XAO=bp@$k?ZdPRJc2aYIFIVf_DU|k zqUO@p9Ncg8umdA_BKvcbH^oT2(hJ6*@KOij=;XH(4sT%x8|1Azcy)@Tsz=qq@7@l= z_R+XHQh?Ve;emfSAz;3H2u_@47n)--|C@ihu|S z7~MW2qOtx$D5%?MUk&%KY<2`x(7`ps0=C|y23{(D?goY`frf4UQq#qIE5m__$u={xv1}{95D5{hA_ICUh_* zxn{rY7jUe383(^;{01}D0D=`o0AhK40dTK0ahfs4hPXz>_826o`4l5XrNB`5FdW3p zC5C}Qvuo&KH+!UmiqG*~6Nn~{lKuvLsCSts{`39r^~vFnjI{F@dG* zxRUbFyK1#Hc)Xe{b4BT3-J0#CBswk9B%Y4?tzd{4eCsqf@HXfoNJd8oSIiBDb1crk6GkRAX?Z34*X z08dzqk?K1vVYwdVG%&}&wW4`{C7*gqM)cGC1XZ}T{R!#2l9Ucr_@qqLliVsx#|Q$f zTj9K&@RM}#zlAGo{>}|mg|Qd7Yk9 zEi|I(pRqZt9ti<;w`b4ODhK2@wy2*K7Ik*MC{ClIHWd_gTQ(t0lsb$-L@sVEdVgVS z`AMY=5jne;I^ULJR%VZS*v<{SxCzKtn5TpD_4Xg}x}V+(MH#g2ANXn^)@;K%v0-sG zNO-Mefx-EvgRbQ^2#bO9W%g7|ZWS_w!TILVZP$397t8x51^oW(Rg|somi>FB-VH&M z|H;scnYN6_D9mJimanGWzNSfo5&i}y&8_M7{Z7bK?TJ#yY+bKUr(;>^(W&yPPtNnJ z3Luj`iXZ#Yd81K_$8TnfzkW&;Pd?EC(R?G#f9d^O_$u63@)zi9$`z}7v-qSn3K@o z?zLB3>czGmH?m3A0!v1hEvGHT(cINhG&ccoU&?L2?gf8Vy!|>sa4S7R;W8IxaMB?3 zb5Xy~Q8AAFFhS9^EVyK>RcX7ZsUpQM<(wxfVk|&%$4yR$Q zg?)2_8o3Cjl?7VA*&$cj)*4aN_e!@Cr~P3~D!bU@wz7^-1@dn8dzn*QEvW&6t}d9$ zYVkw-f8dV~*(YXlZgm);$L==cYo*rdi9tHf%Uo`QZV^fKR6|)CLsKAd72zh()H#7XYVBHRuB>X>kl*hOIC`IM@59cr^Eqh780wCjS*KF zIkJl;1RfEIh=V*(OidPH@)YxAtN*Mc54S6tTkon!SZ|L@CoA72oiIwG6Bk_`Qbs<; zyb~W|esFV(wKBV~>vY&zfce`c6~u0yR91zga)N9iW*by9JGY)AABX%Q`TW+M#G9X; zsEhXs;Xw2w@xLnaklLCE=E**=)Rg#-y4sbFF9L-lYg#d0}L$C&Tyri@z- zkM{_lCm9_7M~$`3eL9{Ma%NN|Gpf>N6e|@o!8#yJ&8&ma)Y7YwFOlbJUeq*lJI6GQN}1_h70d1~!$LzdYB0R^$@vjT1Hm-j01TL} zn99uZZO@K)&t@u?4nA9%4$ef}JZI~xj8iH`pRsY_-ycTT6KmceBBquDBUPZ?(GjJr?D(%vSTnXRV%-HRuYv#PxG|9*^84f&F{_3A zI9wIbrV$?D$v_WAtodQhVtJQ5()fMg<-~`A@=%iZhmxGU;TPCC-rNSy7}+Dul|`Nk zZb@i?k>ZfXVNRAFa3Wp{e6{*%f}T+^3D3h|{#hl7Z`a2+t9I1VN%ZI@&Iq_ffq-{O zUDxm|EL#WevQTIxow3p_z$GUu%)JTyOkwWsjqBYTI=C?RW>W%eE@$Rf1ZB}orX#H_ zK!B%TXN{}a5-4JHv?-21G;{GpX(5*$L(;CiSA;)f#e9SY)7NKv=8MiFQ78ERCe0WaoQu>MjW(h>CJ zG(^!8A?xfHYF#gV(2>*4q9*yKMiEnsHVY=xg1=`a>T)EdrqmYEmA=eFmq!G4WuCw! zdfURUig5I(`jrBRcu>{zbU0gHuNmBMk8xt5BM>7@Pn(X085F86#OUS#4?D6hCdT<8 zF}j?Ke)onBR(wRhQM|l+YOQ-p2gS=9!8W~9f^CWjcE0GfsYqKzK-#j*X#E3mF@FMm zRmAGC`*}#L3tjwtwc_WUzPfb2cB>3Nk$qe~$lRLDm>ofvyGH5|En9w5LC_MG@`eD2 zai>cQUlK?tZsI zk0sO#buVkmDE&*6TWKjg!hL36N1bP@>mL3MqfTZiZT(|8+4_jZThxui^GX=@dU98Fu!E$7nR9nAdyLkAEVh14 z_M?hV56^eU_n9xZT<|C~oTw!s_OYaFd=L-s{P6j88s^geKq9vM-7QH%7 z>n42j+f15d@P#VR-;R%hjG~KRi**)&zuFpg95d=7qVF9#y?7q_W6u9z3LrD7wtG7+ z2lhOKg_|-+P*Qu%Uwg6j$BjIuI27fq*NM$beY6mKz#QI8`Kb8 zTg__)pR~kYcX~x}{D~J_U@)xXz`Wcy8s;U6zdz$ZR*HhJceM0A7hn3i_;;qq41HLs z38aRN2rf0q5-gXYhjHiQR0IX5+4i7zLIiZ3)?o3%*1!Y~CTc2ZIwxr{`QSR zP1mx(z=&EQ3Q;NgI+-KT=V{RAQmGaKKb{R+fkIc1H3EgkP6`(6J%V9?eJI%J4>MsU z7@GafAr5nrpl!<<@iMn0G!fFdtdX;JGkSA5BLw_~^!9i}Z{Y10#nS~GuN8-H?(#S}tnZ#>&f{r_zH3o^k5euxj z+C-m*<|+iTaRLhvhMzS1Z?v#sO3!3kn+vwIbc?Gkv}`#%BNCqM zvtZm%Z;%lPKqodhjtlM~CFk?k<<wGbdHH8 z+J@4r$akIUdO_s7$EC@uaKN3TDXd?9wr`bxd%XAe_^qQ!nwN7+k1^Bb#G34DyP&gK zzS4vwo}aI~$bZM7bLA@;oqt<&elD3`kuc0ymgi(Pc-`Jx0<-=b{2Geo7Z{ zjfpZXTf^vIbg#)EI@g^x{g7_v`IO8>vMwycRlob}p-22Jj4A3Lfnl7m=sae!JgRP9 zft_KKIBTtr35B zc-_0A=7pq+QU|GuP8Vuk{mR-Cp!hk*3gmUKwG2XoW^)-JM4X}9p$a~gCwZP_B0%Nm zY^Dj&Q3qY8Eqvu&GE#-I7t`(eClo6hJ^@i%hwCk#x!g$H3gQ<%%U`;czwS8^|3b>m zXE?Rd!H}~K_EbN0&;t-Yhii?uMe82l=1%B#UdZ!I6=gW-RM*1{r*m9^Iw-^GOt@V* zH>MZNjW@Igg~-ZIf&J&x3AS(#Lg3R8*>9Ba!SQ}oeGG=1CGhTm=I7cg;6hAP15!tY+4kN*z8`!{@7 z5%!Oa;j5~EEYt};POsjrZ{*|4mlVZ`kJBzQe1(e|_ivYS6cz1wskO^^Y4$qqs#jSx zjbFDxdcXiFIbrlZvcu^C!-T2k^d0gvr;$KVoFKu)z7UFX;`W6=umVT)CL2Jjfg`GY z`B@@GIy8hrvuKBgP=o3g#`%-(yugSR`9L91Cw36>ri%FfIr#*Npy~>%>WUD568Ys& zGY^&jE9xp|_gGg!*KPgTa?1q}?Ef8bmsczoU_P{(%I&>k6u?M<9tr=zaY8pWmqFGN zuec|S{Fb3Ai3~PH{)wH7JHq}O^83pMHJ7yp6)x<*sLZw29`i{&VCvTr0%mjSm-9=Q z7~Md7HfGz4QUvmP*Zf+TOHZQS%}O02#j8mv0^(U-hBY2oJJv?pf5w;xe7FHMc7Ie3 z)8=Gw@R`U0+{902z7BpiUxo~E{~5_dii*lPnsWY@&yH8lR#%P=O?|5nOFh*RMXHpm zjFbQZ4OBsjaC|L_Krg6|Muqz5An)v|>^cHWo%t^lD1GN~Kpf>t zdt9A1Va*o1f^<+pgW1o+HEeXQVjSe)bv?^61cC$F+3rS3hlqAgf`N|zN~OJ`k24@T zM6cW}gMYjzeU?L5cO**RYu`{Dr7u@(81h>jrT>xQDE)i$QTjiKqV&DSTRZQI6r5{a zl>QeMi?l#q#}4|b*_E`xh3X4>&|*7G*%%V*Y@~ynvJu&l{%SG((3nhRrr#zz@+oIW zwgyL7zJ4-DPcjaHYgrlw`(F)^@_ei9S7i|+JNL+p4&WJ+ zgx?YODAOV1G{KNAn~^(2ULygYKtf zMd#m^oy^?XX{n~wQR=z*QaLRuwK(Sg|0#XIR$^9VPkG4B3A103JrphmM;#UJela{s zZK-$Uzd>sYUzlZ)M+`I>DY?g=if$|sJ4&@E7k>dk|e;+b#jQyd; z&fd3=u3&7{(wO`*-u~;n?ng-|7_fwbDR{7%eqiM@%}<*pC7mEEYwC7M_>!Z;p z$2t>tj1xz^h*1$7V!br{hhTud6nb(VIfZ770Ah2SCkGW zL)1Yz=WKK1SK%H@o)%S_07gauy!VzI^tD#59-qy$sqMO`94}Yz$;@w6SaO3s=yP%d zhlLl^V0%Q)Q0EhkB*8JfHg-Dv3m>NJ@yNrnO(2hxh+ODeZXa9B3OVG#R*UlfhU7sC z#(3m$Iwg<&-d_`P`~H0I6O?TIMNL1D|Hw&L72D?@pn_+Wlkleg^zF7070}x6)8hR<=sZQ~6KXY#lFsp|ClEBYveLzS z54v^r-_>!~9)(4&k%mv;SW~6m;aD9Wt&A>jM)}r}J>%c&@9FQXO9x*oYwdlm;}CXC ztkeftT5PGdl76c))BX$gBkg|~QIh+r=!q2`R^;p{dxT_TJ2G$f(=7Ptk!59{Kde7i zb_vene~Ixc|4;8*`>pY0ZIU3LP@_Lo@DcPaG7R!f;ezsTp&d+ILqq7aYl<@kA3EGt$GNnFRLR?!Uu)oc{{&8OIw)$4xj zE&M$9QUsdjT2nUf@7Uc7=pO#=vvp*O8_grq!T)OQeWK&glthz8bBc9`4NEwjPlsc5 zWI;!3|LJP%bqhxH{L{A6md6n7uW$;~LItX=aO*G$zFCzD&SF37#+SYL+=p>tCAwda zT}(XM3*HgVZ=DXlT$U<7OVElMa`Z#?%p71CJN^%g)ZduH&{uAm8pfR*yMXT3ZBD;Z@h>_<09uEI96~qvziNP2b687I!@#`rDw##5C>? zqyus_F`5>|@41!#_?V}jy)WNb!N{!s<_2Dk?~U&I)LWE%@hfPZuULthnmw2@UgL`$ zQ@mhr59;xJ8zKVwm^qCP#(Q?Nu^94>*bvoz2tskSU#&B0?`2x5Rr|HOSo^~HG;<$U z|Ej^l`eUc;%b>gJKTur#t*jTh>c{R*6K(BkU+($4d70y_7gvS-ckUWZt`EhJs4(MQ zJz0@xjlD_lK)|h11+%NLSiY37RXR{N^dZx|$PGLx`gFv>g9nD-Zuv_{U)9v)L+mMcT(L-Gtt|r$e=d$M_!i zALRZo-Tmx8a71YAU5$tN)5wa&bIZz}i2WF!>?z;6pySJ5`{+rXU;EOR&p&z5{PWLi z|MCSFoOk{OBC^7NCQpo~yp=q)6Z)gQL=LDj*%t;2Fvy+XTP4S+SxZ1cP-g6>H_DV6%2`pmo zG5nV4vs~q8Zn2~!PrzUdCJRSAsyevEy=JQBObV9tbO$4uFg1)PD^8r$7V(-{_ECAw zjs5Y=z0?iaFr&Hg&Ui*yWB&80;8aA~*RlG)e)~4I=luGJ*lF6o!9gv1uQUe-EQ)`L zjP0w<$3?UC0Ums{r59M1FWnLUUQgmhyL9e=jF}CbOAO7XhFj?s-guTvVu$s8T;g0T zyEZV+P3C1!LQWeN&nf67?s{wp-P5`kC*8-E#jkWOOFkCwIYH@X-K09boQ$8>Ia~K) zyvn6&dvG`RgVd9$HzX?f!I)QZ(1Yb1kG#dM`rEf{hbu2) zev;j9eJFnEW2*2P=UJveJD*J<`e%GufBpdby@Q~RzT*|gz*2M+z3%xgc-`y1C~+Yk z;{Q`gi|7~Ytfg-;Uv4f#+56$PTdd;$u7a_;Pg>FY+_(1D)hD=+ze=(^NTTdt_Ct~i zOey3zQ^jq2EqdzYAs)G(@Ah!{hucOVsOHSv5xS;}3nES#-Xg=r`Y{y#sMilFW7DFK zV|E`ZljFzGTy>`6So-p5na%S#LHYU8lad;b8@+l^1f&p#2QURyh!@;oae^WdD?DR! z3!qqCSSbMbB{OOfSGeVa1{*dy${*RQ?n~R6iAbCoi_u_OH1i0o{Kg*Z%y`e4a1v-` zCW=kdzl}g(*6EEmB)TX*e)3rfg8VO{U)x{KHOoF6oKx)`i3lBdv%LGwSbVAF{bg>k z1ei!O$h3?wn3WVnJMdR>3?mC?dzp$=x}iav;q;cEyg4|VeQL_jPE^9X;#V9Q_@1Owc4mxG&EOPHCmDMYvbMj zBuOu^AJmd2tTEPY`>e3lJQ$F@Cyw|xPz}=Kf}>4)+c(mWy`U9^V|~2m6y1*mRlq2t zx(#-2viJ3EDY3rl@Icych&saTsrVJ2$hEPeE=FHz^QrW)=O$*vd!I!FHEi6nXYPBx z;#YH{aE&#mi5AS+;6M0VXeA`P%nA4r@mqD?(Xdf+F8@-lKlDM%)a~Ks$XTDS| zT{qSJ#CDXHPk*C6eq&34rW?PsilO({|&%FGCBoH!>H}0c1fmOXFb2 zA!&a_j$e4e(PT=C6`CfFNAWpk9v}Tv`rwTY46l!Q{?SgQ5D4WXozJy0YySjvBLQBW zBT`@JDVEfABgVlw;xG#>0|*M?tEX0{W1Bdw&E7=^hW(H^wc0yY^fTnePb6GCJ6HFX zy-g!D9b8bIKJtRfjx$o3(`GpPQ~SV~uK(*98c~^_`{&ym+MiygZIjpiI67L$y{Ks_ zwmR*1lFNm*-NH<9lbe`AG!v5yU6}b%dkioJ&!ob3oGfNE>I^Y zEk{eIJ&Z$)kxmU8#iN*)mFdhZCyylT!afZpZ_tDnWM-|ATTARocT;oPx$N^AM+@<- zU!KwIe=QP1%njJ2O9~YcI|;OyIYJCvu207Oq8C(PmTe)FyP5!iU~ zD+ij7q|;^fbiWjvyxxq;zAG(u?}yvoN;dX4$4~C>?e{k{$D0SZ(hRvYQ)08f9`D8s zr1HsH>21CXrO@MgIATr{YZs{wJYM0Ix50rTmFtAcu3PK_Xn^NY36F7=S}>p22?V6J zjFfa!9Gco5)XL&$Zi$yHwDJq&)Sp3ozLp|u?vAtFQ5!GwjJYhhH^jopm5Fn>C|hH) zEu$>v7yipyc%*8YQ=?5Q=&?M|?Deep$$I$C?3-metacVeY!TIy^$?%xOoY&I*s;N| zZ6j~VWRStYp)9+e1z9CvtjgMkx0;`>zcQh&%xafuvY}?nob2a4{Zj|oEnHkqUqw?| z8QxgVG3@y9bY16p6*a&PLLIq4*UjDo?{Fp)9~1|O@o$ukwChbxcE1tZf28~Ax4PGq zXEzWaqn+e4pQ4IzlNa$gfc) z{Wi9stn8-pGggpPt^Cjw zPP^j2iE((cTGyYeKCJ7|vb(3As4IKhmAwz!HlytBeRSoinyLJ~bU$jabibqiWk%Wa zI{opqNq^4*|FpxdIJE4sX_KxxwCsgx(=I)-h4nK zi*5%J(0bi;wC<}9((6wibm%oR%6@dP&VPFFpYwqBCD}BCMYrgmy4(4fOa7oHBOR3A zl0T^A4`PBuo}QCdl>9*jGE(MY$scrf$sbhm2gyCb(rC#agxj*@4{}a`l0S$ZDEWiX zA4>ip`XKT&$+0osqCm+XRPqNgS4#e%l0Rs0OUWNp@&}dTgK+kj;)6=@L9BB0Nivq= zgK#*N;)6=@L8bVh)RIzs(50pLAeN;|@jBXm3}C>7O87w~{GgpB6PNPE zO87w~{GbRor<5-ixBatA`C@tWoDzOeDPK&^mlA$ZDPOFFA2c4|XbC^4gde1!rV@V8 ze=q!?S)>Q=6i>QNV0dpAPr4fvq&%MVcfgbW4rqeMaaHK4!jCS*ll~Ka3o~!I#4vb( z0>v{BX&|MWwSgvkM42bJ5KOu)1e0d(&K-kE3qKmysRNV#H9vA-(zk=}+rRB$5?n?B zNsk4Qe#?PK-zk{oJdm{DmUo&gHfz_xq>nY+=uu$O4Q%e31Cu^=hhWlIzIR~KPlJ2B zazZfax*V8v-B>W`AypUvw|YU%@lWStz@+b?=hh2Mx=!1`f(V*J!5al8eKPRTc`)fG zAQjN(-aeSLR|qCOOV!#Tm~?u4FzLEHw4-3xp;-ro7bc7CMT>>6D~gi4zAd)OK}di7 z6}t0z!ANfjmo)S`zygd<&ilXZ%K5~*7(WiCfEp^9mKr$SHdodz%|=|ktQvF z;Ei$s{NhWm16?$o83ojNLJmf{g`Mxj0lY%^=x9FxeSq&*m!BJM6Par@hzNj4*BgXq zEF2VJNQVfXv}Se+9NVP-H87+A8m{PA?CK53Gt&-jT?51AN^n< ze)JOIMZFhkDi}R)4A^eKl;B3ezKt)H%sZ* zDSq-Nc{YcKZTQIr_~T>olj&B?>oNGrTrb8?HeP6>m_2}-f=q^ye;ih+TG@^0=)nwy zcsv1Q@^*tvo<9L(^6$3q05Z956ek`9=pTPOkjbOVdS4)u*-^yxO}_gIIsAWd$mF`h z5SR*qe1E_plb?Vp$A?TlT!dTznY;%nmwvf1%=Pp1N6sGH5|u?>BVvxcXi8HkgJQed_EY=;R`c z;2lCIKV!SAkA+U219b8&4m$a8I>mY+LJ}@OE{=enca9reFo{Df;|Py9EN*bi-US^V z;T?w?yhZ54TW0I6Eq^)c-Bnxm$w4*0AU)3NYbi?6HhK{=$zH(7Mz22;ogC^;2D6_k zxN9yEd?VS9N5n9m_MJU!hj%Nu3tVzn2$%e)Wo0)AF8PmwOTJ-`Nk2HaZ0jC}K6!B2 z&nl}pUn98WKTOu;f1Yya?+-4!XUe3XA6)kElxaUXxa`d-6;+u%4Ii4q>DCYZCdT33YF&S*`mkpXDjS@7BIoz*J(a)N zefZvs`yBP?L1lNjtlR-$~COTsFM#wC^5N_S(M7VqE&WX@~Il zx6}C29n&Up`r}%_k+;-h=KbgZthdV!)ayeB9{T#hWxdmNe#Laak$->C5pMs_cY%le z{`oWB%l)xz7cBWTi~!$}OJm~wu|9Avjk)8wG(PoT&86}Cx8>59wG)@d=Zah!TR+e) zjbi*8?0jRunTn6$*m$1*TR%{ajqkyqath#k?AR#YA4`snv&MC7oRxEIyjS~UjpN{O z`v8sEAL}#bW3c_PoNJ?Kf2>iyjTW{hc{{$1pHJ-D_($_O6l{?7UGr@WUeI8^4K@qy zlA`yH_Q%4%ffvW=Sa`~0`Ap#6cn(vH9Z{-s_SxIq8s%O1H#U6ZecT^w$&URS?`VIl z_rt&O-tLcO{teqCD_!j0uuZbK_ICUm9_sO;Whi(%+aKu|Js9nW^tSht`YQWLebx4p zI(3HIPU=<2brf98uI{JBzSUoQ=le;qpO%Yp*_C~>3-{ByCBL86yYz2>4x;U${v=d> z-5kyyNDsen?v4Lfa&Np(J3^%!Uw)5wger1xOe(oIcG10Y}>%r^>HSOAi%lthn zxbpKo%XNLvRWS~11jXNIBPdRzji5NyMo=7{s-DH)pG-aMwS&sK_db#H?eb}K)f~0; zpt4Q!X=L`D^vi?FuHE;r?;cWi&%Tr1Jh<%9eW(5XL1lgWEsJsKSJMvR@9pwwJTz?* zr@xd><8}Eoej%U6_Yc(Tj~sZYe@NMt({=v0@@Z_5PowakJV+(~Mq;NS8zuk7JK6vH zU4(3u{2Mk+wL^NzzhV1-m;4)r8-SPm8zuk7d%gd6$-hzZZ}eEKD=W70YT_~lJ#)w5 z8zuk7`?ceB$-mM2!3f_d`8UJ~+|JkUMfgU^zwx@~uiEmyhi{bp8)YT`#x@TdvgF^; z>aW8mDdJ%9D|-^<+}m*=8e8ww@X)r6aqp4ev7k+S;MWKFU-EB^&^2As5{Wgmb#TIn zc9N1(irP>SE!lV;$LeH9WPkSI>Lg)2Pr+Jvxn@s{UKHqrTmocZ&#MNj5@h3V$P*eU8WzqmHZpM{qd7l^zIOU^*;o1 zqvYQx`8QfCy+$@@F6E~KRH@EfK0jZ*xEUy9!-`8WO@j^Pc^fk%dt{z`WG?kVAK&^?B|8A6Me@HcV*eLab5L_7em zdcm9x{)4~83mwu>=7g9cGD`RxH@3{^-W2nefLMwHwUotvvQymGP@d(kShhQra)2jMT8wekoyqbQrTy+An4Ne3Zcp-Zh?RX}^@lM>?Nt z1qJv|(pu>*?U&NHy7RfMBYVcb*Wc6M`H^(+Q%fRj?R}!-&=mgNO0RdMV@is6vTAef zhS>OS3!6fO&^t=|rN|4OM8asYn1kX)jp^zzPa7Yv~AMXAi3x=cB)OqR;K+gzw`Z0O8yL4 zF*^kiE$#pMegTM<{23n*fQ^zrqvX%{uNa_F@@JI%8M^=;x|Se(R%>Q7H{Kb~{F)#B z^Qqv}S^zRXaGSp#JKpB64gb|Pe;s;To4?lWWb@aPi#C6Kf*|;t1^xcRZMPWe=?5zL zWG_pjZz|K0pzVtiTLqbI=Km`te@2-NRpTv*E;;&6J~y}R>nmYmOtdQ4R_z_xR_P7A zQQrMVEWY$Qb}3C~Zn12LXpt;)!pNHDL?s24wKR;g-D__DRMs4Wa}(9&=O!vgeWm2j zknuAZ^{7JfuAw{Mr+kx=KcnQ&fVfKjjKX}Avj`#4hOe){;qsd{XAgKkH+(JmGfMu9 zW`F&W3lcMcx;uG@yxr!z{3{b4s!J##UD9g1sB_@)3a=bloXcuGp|b0iM3Wq6i{j^{ zrR9*G2+I0=X+9-?h6HHlzZ+m^DL$hVpYh^8M?HE_*RKcnQ&_~3zsmi!qde@0on=M)mw@FUK`pWyx52r0uQe+J%y zQ)?}6TCmAW(E+{24c|D*%gnFbQVpJ@7qnJ;jqB+<-Rj8x5s-9qZ8AaFI9V)d3D;c!s~wR)8D9%zdQVlQhY|q zpHcE>;DY{d2@qO}&nWpbBvVWN41aLTWSOSg7WGIkgHZ$_nr#SL!R+m;F4)8R7|6c*@8*)m&iZTZVl@2=XiPgs?-|3a#$DqM)F zV#n+SBO@cx>(4|d@B0R?rT7eWbvoE%4a%2*$zD!&UAVZcZVqSNDEPi8EV{D2ZZ(M!JGs*51v1H>*-$4T&tn7XDlDmT4 z7R6uaf60q~xPLHyNVB#yX{w1|x3;(c;wM^zzAiqh;+nWVYe_1YGpI6SeDu}$jk7)x zJ386eRCCGWg{7#T1^-n4M7omXK!W_q=Qd;K6-dd@Wtx0 zy`bXoI&RAud<{1n`a!ga_uaG?di*7o&Hm#l{|^7nW4~1u&+J2YEDGy8myUQYo%v~^ zi;L8ImR(N;pN?O*Dp@|a>iEp8I-}v%;J8%#>6KolV%cZ>if5C-+?rJPs#tU5=1cBM z2A9-!kL(@4?A0maS07gk*cZON;!-cR^|%qt48lLW;IieaUvM%O$oxtQnC-Psj%`i{ zhoyr*tMsl)2WM7$@#_Xs?I+LjVrw}x6Jwi-txClPQ<*tcN?@&Q7)f?r(uS-1WQA&E zdaT|r#j8JM-#j-_o7ScDry@Udi~bim3%& zaMC$mK#wte@f%NNA*iX20xO32wIDIVY1NRfb5b+p1*a|af=h{jD0_89tYfkl%%U|5 z_8ajsb1IWdo(2YQWMufI_!(ASDmdn)cw0q+D!5&%f-4jKyc)l8#lWWO^K3-<=iPd0wN zDt^UNl^PjGIcIxEI#P=F{_g~rm#h@AeeUzgvyz`rej)kA!S`-BX;3(v9Y#61;dCT) zZlcbASfk0PZe|GGXwFKwq0~Gr7{^p_@~)3#DmZ;%D!8m*9Oq~pr;RY5pz%4CBf}6p z_!pJb?_)S0ZYK&R8rJ-n_A!|Bnhxym{x$&&?U(W7LEw!QZjP4g= zE%6(_*w)gpF5P}V6uX=%Lg_See&xJO#l8G2WBR51eoe%A!JOgPX78#|)6a{o@iMdG zEj=6Ky=$P5ba1%dQ;qzYi8P9dxJKIg%zvfTU+qD0Cv;sjt)3pc4PSHo#*;_lHx4X$ z+&X4c_2j{Z{=T(+w=MDqDYRoBrdUijM;OTg(fi~<`Xrh5vn>t%oWYp8^u^+S@iOOE z_y?#Kp5GukPeT03#-SXg4|$Dm#(U4B+<x6{$bI6mTUFXSgX@8@)5 zO(NcVk~*5Es;BF-OIdg@4v}jAX0u0>P_5d%L+(GXx~S{DV4kuoQn3NpKB8d2pbO}R zOWK+Mtg3J78Hx9vt^tMrUx;Tb9qg-bz@d#kMVO1_@PczNnR_A`agbGni%mW*M9;rn zgE7C=e=6z!KJDL{=IZQL|6aItA`!}oprwxQ?k8Cxj+_d9Czc^XnvEMQ#-nE?s!du* zL?o9yAwoBHuL^{+;}l)F+-e#Mkp*Ei6hGbjbC40$JyvVD%pe?Qjg@j0UxUHuU=OIZ zdLVvdze$jl40?T8v;S!BjpgnQ9r{)!{o6VY)?n0H)kc_*dze&N>1F1|jI)YPA%GLr zrlyvLjhugy#yfvre%|fJ6vKCgd^yZbybm$)HYe$mWaHhMc&jC1?o2m!BuNF5kpN;-95vWQ}KjwqUpC}!am4rMvr6$z2H zR)0G`ZTL0h3sDRTX~awWx3~Har~SJlf}-zd!QXzGIA=5&sn6!;`p3gD?=kWwuG9Wg zqKUNRRVuhygc525PNjfU>Wq-6ctkTs8a?(IYFH(m<1|MtA^p@0rTu59&Xq@^6?y>Y#JLkD{!B1uu(ow=vfddjs<=v(86us+mnA|gb%I3lc12J=OPpB6`&Z^F>& zp?Ug~ej|Q_exrvSKwME=Bzo!n8-`1r_!2o2vdC1EDf|0O-dp z!O5WNA$il8tBv2Zwx8ZyAZwDbY-{^ENnfNcLMNS$U$;)0Zftw^=6$@YQn7XE@~Rb@ zTdlG6(forPOg@&u;0I#<0CT=TgwkVk(*6V1Umr8QeQbXf$;smG8g6Y|-}#g5!}OL{ zetfMcyFU9{pmL&Lwb>uPPRrsqenomjOV1PW-h=jIf`uG4lxU%#tCYS`?@8eLvl1zP zwPctyhn{H=9u1i{u_o}uL?Y_bY5zqhpgwNxd;9X~-gvK!Z^RQadsZU5mDnz|FXazp zkAfUrTi0Z}Ac^SwXD>&i-MUbMmC9c*V$xO7Hg4D}Dv`9k-_OxS>q4IDNXUAqj-JSV zr}*~y+%3!9{P2V~A*s7W!k1tqeX$B|QR|}JI4RKC#RYJ zvzzIb`bF`&p_h{J>L2z|T(aw1i>cZfcgK5%KcqG#Yg+sj&GG9L-L>@pF#wqhDV^H2 zwhuQ9r!$u)x{y@q%=GQ)*!{9&f`+s|v}hUZWcS#5B30!m@ETw1e4cq<+1mI(=R92nwEJfaj@(T_06jKf z=){cyTDy4FsUa|L$pTq0C>x9Xd!>OsDfMRZD%vX(JV{&Cs_NtYnb%A7wKV>DNBoK_ zpypGH!O?3lXbm_;3P=Xm=yPUCi0rh zpaqbk4h_ROV!S(N4ow~m2Xn6cLDUywoPLe`IxUUoL5z(MWA*|lt|jLE-}Kd zN{Ly*Wx zu&(c}zIzw>w_C^Hm&rU&?7LEm8rJ2< zMa-O!>7Z}KZye?`TYm7LJg+gd+xh@*Wowt-cH_jCbo7qIm!AIy(mm`|y56LVECCFj zCtNRcQ`4NACSP>1o?bmWlpQw5L+h`_e=^?FA{*Nu5^-pJH$Z*OnR!h0et)=Oo#@3B zL8g2A+;D&kE}Epw%Zo zdvkKK-nk?qL4)Z>|AnTk>&-J(^O+k$sUF(2vuOh2b2Zair_j_IXU-ZGH*v}Q8?!a< z^-GFYkCN1wt(x7-rIWQZex)P6^hh$@qHFDjuedq_2YU5SU?XrG!pcdg^rMDM>^5Q-vx>J z5m9lI?%@J|xvBOrG0(sW-9e9F_PRF7azuBtn>bRe&-4UuU2Zcw|0tJiT363t)Qb8uAEJZybl};DF`TgyD&@JK8a10GhE4EQ9tmG-<9RxBC9mpK*ZZ6oXQ3-l zhrYph?`f09BjziTqGA8}?5bBWKicP})&E`8t+o9tHR;UERh%lZvDV}~+yvh_+$Zfn z=1-`ud%-o!dCRHm%}9k6>3&ITs zN}nYVs&K(QsksQVkJ=fLN!;~Q0a&KUuP)y66u%se4M1bJsg0k9m1=bA3REQuNM~vs zjaBCPWh$s2r5{!89?{zx(VJ6_Hb8I2uH?RzFIpN`PK+@y;gZZ+E;Cv>Gz>cu3{?yp zUS2*FHTM%t3r4!KY>|I=y!S?ac?`oSPE?KkXib)M=sf`Cks++{*DyqXR3k6MaoieQ z*2SlAsrPa~oHq2EDL`XGKX)>y;i;M=ZK{a9?zIoo_ceRRaBQsZd|ZvP_K1NG#CwnA zBi1OV6Xe_&)kefae1W#<5P30b^}>X1k2*)BIz%u0m7~OhW;_h(wgy*pQEFi`a{h{- zCYBC*TFNM-s14O>!`4odLneQy$F13y5X=63bkQF~Jy%k;*SW5t7 zso)td~?=EL!OKcr5Xo19~q}PL%isk(^MAJT$&Cp&o?J} ze=6^LjcZ(gyXLHQuhE=l2t)6s!{&^B>9MFe`pjTU0spQJ8QUh+kOFk*ix!IJG1GFD*tM?N?uyaDHE4G!(eUXekG{E{%PKJJ-yQdj z=lVtmS5yOx#cF;P#mKR0jE#sBbWP^aSi~ex>odP3|2XBKGwg1S&BM zXPj-WbhuQE@ zqNpTkv{8{J5HJyxglu3J7l{xM6b&H+p+ZPQuxM?iO`vSoD79*}wH2zZ+FFaP&z33= z5#NGOe6-@LvLJ#~#drSSbLZaKv$J!P-6i4Y@Au#Nz|Q15XU;wM+;d-N&fL3C5I-KC zf%3tf$HTwaqoX|l^A7F~XM>sPH{B3UN0q}h<`^5oFNZ~cn43nOz3=FDU(0*@FtEs` zzHlApG~M13-b?OXh4amr5R?5 zbW%-F37&GWklkdFq8W-cNmgE{4jYS}GaXOV1Z9~O0FEa#K~5E5C>X~kcf-zZN^T4o z!}T8SzpK4nlm(T?H}Pn1PrJi4@LCkiYia0DKTf;CFurnONWRjIKY#B29C!ZM1DB8V zSZWxX55t|UhvCmx4%>-4?_}Weql~}c@~vKU*{i={+}xYCf_dc#{JoccuFOPp-Ri-e zKY8%yBlPo{X9J$uMf2*`e(P}gMt@v>*dLUu2GART>jt8sS~Ku?!+3chJV+l7JP(vd z-v-Lhj{)V1LGWSSFeu9~?i_^psJ{<7!Z4m3ghyVctDSW9(V*Kw{orwLg8ad}m+^c1 zx1WGuKR@|jxDI}2BhuPg{9Ew(ZN)xNK2$luFjkM73JJzfGmIbm@Uz$VE6B1Ya4vbM zM5m+5km3)g`q~y{PeI6)ujPHru*c&?;a=G2?V#C7boewV8-K5*OYFcrz}NB!oR)jf zzaUI^P5%I4=U=c%d|#U4cX0YEKev3EKlpX|)QQ2T%d4jbpQdn7G6FQ4pW@^Vt;^qm zGu)dQ!D_sa#>Ozl9KY$ zC1sx0vw_lwY2$EKV^?w_jKts6HLNC^XK>WT-Tcap)lzM8)#6r9oMuMO$j8V zs)Z-s2SiJ#7skJY`b5-ZU&|d^Z4F)7&RZ2 zv|$rzgz`Vv^O8B=3BxIv9^R8Qr_}GdfCc#`32xo-tu*(XT@72@Rrv6LLhX| zb&0&5>!+38@bl4J&w^)`@A0f0OTnISEvu*~AJ)HE32I-<<@rl7v6+vCEd;$FA{pc6 zui+nhz<_QNU2?4KMnoK;@iYvahtT=JXKJ~!Nn3;4gD)f9R=_tNXoo?0+s3y;HOl~y zanc~1s)BH}Zk2x&(j5qcJ7(BtxIg5!-iN{Fvf9!|L6`5*ObLNPwD{QUcjx*%KYClX zmaq=8vGv3RRdA&^-y_0%h^b)SCR$;v`a#HQP{?QH?MQ2jmNv5AeUT+q+A}=YZESsR$q--YP6_X69_$MtrVG0(A;7sZOC$G%D%e)TGuC)8b*`Q{5w#f2+gqbvJ3g*DX?tP~YoXc}y=b zzt`Q2?{ya(?Dx8*GxJMmpCs~!MHVfy^nq-%y^?&O&RMeE7rFpAbcL)Q^!{+e=q)ZL z*3=ShT!;89H4eci(D?kh1z$naC(xUk_UOLXg%acV zUKdo(``yD9;BUl?LWmFu!7MPXEZx*RI1t=uwHLn7FhsIZQ%EuTKFqrIpyp-y+Rnir zUo`jkg@*fr!^Ec8L=(L~Ty_3Dvin&+gsDsy$gt6c)GVrR0)$+aPt=Gj?j{qW#B~TEP2kR^DJp) zF$x{*r&sjUfcZn?SOca;A$)hZ_uAH*EIb0VR(Ya2hO=QgDt{v1f)R{bx)O)mi z>XHpIh8_e6;|=cfc_zZXLzK0kXvPIwb952@Jw*VvtrPUDknj zlq0mh^xvN4bKsl6;tlQu7j5{T+AOcJoMzDGNGN;&O*(y^Rnqd+*PfH`Wt8XI4c=3r zbei?F>`&|Y#Dhe<@>&r=aN~im%S+dLJ(JciUmx7=^>{Y`@xolZAnLZo*j|SK=&Rnr z3BFW(6qY6I59i|m!Ebf)*8QFfH^K*o_mu@(=XwS_PjTMUArokhG-+ml2H-q^G}q`U z98Hb*%O9%D#_-XHOKTX7*Pmis3M{-9zDb%r{IKK!nmRmc&LGm}BG)u~@bopO2y)`k z@r2>PYj}#L3^ZZD$p}9|-rt>Y#D;TWMPzSPriEj8ycGoGAQU56w8=~H1nT5^$`B4~ zkc(-sIk3V==@EHjHO^L5F&S8%1?0{AtX3rFG}aBjfVRV&G9f`~0n%{T=1B2pwH(Xe z9^KyZ-q$T#+~Mu}DZ=CvUz_lOA}-mt;mvfc!FR03bJ9&>-V^Q*r3m58FMK!cK1*E; zQWr()!a_=AM$j{1fGHjqLv7VlIn?RShWxvqH&fZnznV6iP&u!NnjcuL6IZWU2oh03 zpG+6KKURO9sxG|hVyJnsdG{Sr(}nP9WF%@*)A@JX;fp{IpWQEAM_mM$Ra&)S-0waQ zpT71u-!T4pc#qo#8=oDX`{ZEbu8cmo-r5t{`l=_vn|mGk;9z4%uO1r*8@qZPwRW(v zvUfU=-}iPC-g_i|@91+me%Bu{7{70r{<|KyY|Si!+b**gE|+=!nTFH5S%mM&%3GFe zJl}U5A^il>FYiE(@qB+m{xhI2epeg?39dTo)Vp(x59spO1ADB=HU2&@@9JFRt${sm z$Tjv39JnIaxITMT8lZJY5616nM`Kp7`{*9HeBc-?(YA6Bf^GhCEM{mo9Y>G9dtC1A zImWM!r|Vmf#}aKTbHI8>4x*;jLFzsTe^4=+r%wGr1=N`(>JLiorx$SsrS{W9V;tiQ zdI8R$C&(F8Kp|$B-B`Vt%^8$he?CDs5I%uGJ7IRTt8te7DR%><_S2&;c~bl7B{=ji zi{JkcjD2L7edY4B5cX_0flkOYt@*rP_v&-WI+~F>d9dLPUhwDR(RN(q} z-P89b>H5H{RpstDGU7BLM+xr4IiNv?;gU1i9?!@C;d_2CTm^#=F<68pG z@ht@u(jt8JFuIaX;#+8;DhyPox1|q9Y|97uzYj|NfZ|(rTYd%v#&=76OB{}k>oA_M z-gzBFd`okF0P!uwX=%tX-lrFzgrKwN_!e4-ex~C>^fU7VVldxz@huJ;?3wTJW8z!R zvSL4uEsTwC*&Hb%ELe*8mU_guT%g9;w1#Pi0WN>QY*!QDatqz!YtdhW2{1){6o~+r z0oHzi9jr&Mi*Gq8GBr|>E}G@&_h2f9H=2E{`PrfKZ*0G$8{=Dk+_8TnsrZ)e@NaZ& zd<%u%A%Jxr#kb6|EVoexxd4klzNISc!-RY8D!feVEWTkR5vuuo!to#%BOc^p5f3s| zhJ$>9X4w`F5^p>Vmf~4>Q1LKkK;OjW2xfIhr8j*5qouT+CF_z$1-tc%3Mi1?1= z{Tm4WqV4rgq_=+&_r@S-m?ApRoR6SROTFP#XJ4BckfDj__*6u6RB0kQ{)W$-6oZ(E z4!eWE7H{ZDB%;I4t6L&EFjV};xHke=m*Uk(K;QOD5HUK6LaYY)LWd*3rhO~^Hmm6t zD3baE1ehV-gu?7zP#IBYVGrEB(Ie&Fh||4sA3injzQ~TPh#N5@JC2ssR>l^pQDS#T zb~ujm!cU>mpiECKiHhuqnjIwR-uO4dHk=|mMkBIgof+A2G?XGtTLn6#mZL{R&}vk2 zp_Oo+G8Ly+kKuIOMKs69Y0l9ce>k3^IX*g`qB(G_qB(GhXpY^-Q#8lD$0M3!;GM@C z!QSaW{?OY^c<;?=I3bV&zbcRemnx70mlVi>(|@vx@%x*;d7m9;wDcQ?>rd$$tYrgE z-FKX^gZ9*GJF>?gk2CH(GVhwf#tTRG`09A$%_9e{InG#l)T%TXcI@1s?{zRd zFhAb;2mY`=-ucEkH%5u?bZj5*6#Z{=Zlw0t!xZ22You*9KiO&c_#5TcNX2WU;x(ur zIduMvF8E$26|WKfy^io_1jwIJ9qrE`4DYfN@@E8uKOM@qL`vCG^w_Y2xJcT>jl_A9o94x?q*X z=WjCin>>A~cP55bE<>tC>*YQaKgM8qlh}rW_HFRoKj7T7qsmLm23+xW6c>`z z5b|SvkcV;EUOugSYI(Ik_~leuFqVQW0-@7rx9P$;SQ+Ys0?>%1d2j=QW7V|f>qFx+ zJS!i{LIeihkB=JP$J6#DB4DtiY9P4JBleM~8X&%!pd}dLMqLF3(WazU{4BQic*z$k zaaZ*j+g5zCh!w()3zOSw-!{0Vw)r4U69s?V?(vEH3(p^_P?Zq~%fe?hCrA0r- z{*}+s0;%SzJKi9+lNj(zU)tx`z>*>e3z2TZHDPzvF?f}h<*q7$b^@U@ z1EEVYuweYlzPhEwflvd&X|b)!Qm-%VIe*&A{RfaP5KzeNBwaJCG_g#1<{Rw~* zzs6OcCp`C`MHd5}z+Q5*e4$n5qDE!&KG}e61brcF{}l>kB4l;6tK8f_zI~heED~#( zV?`_R*&}_Q5xUk~s`kE(wD5n=N3oUq)|D^JEyq@?P$=aBUoDuL^V~lbdk@PE=Qq3j zAzu~k2e;v^?DC#3g?t0B4+7TUY|hWY+Vr?CQSr`2&zav9_(GZ3%+A+#DfZhf0=+MI zX6ZI_pLK8P2HJrh+dV&i#nwP6sjPK1B3@+5;V{C5yQ^saAxt5jqLJSlbZPmtZ!`5w z8y3z%9@ zvcfZr7wGy&qAzX0ISAk z-~*s6+P*ZaywscD$8+^X_zHtwwLXBxi7h@lI|uNOAE5@7tvo8KfL)ioZSsYN#_G>U ztx+zTpUZzJ-tT63THh6A)`0Z_FUcx;+;iX3>1eXhaFqu?6I-6IA4Imcv`DHNTU0!W z(p*|t8GNd2CDqRRmJXwf9Mz^#TULO5$X!_A+0*&}mSPso!~IjCeQF}IOzl&X*7JGn zdxb@&ThEhJ(Err0vC}IGFFyy#4(Pk`Wl!sck-O6bla(l~cRDLAm^B2c3~poPg$7>O zhcBcnFK_8H)cly`Mf-hcc$R-hmRL!6Eee6QnMaXOS)qgIqzKR@up-g

    $xwU|Lz6gWBhK=UFK*60WUkGl-7jvjQIsVY3Dsww0&;9ruV7-f$ z6U$N6_QmqhMCy&OGb18H(E{Q6^vHg1k^Rh%qA^t4g!JIazF;OjRJwusqfHnzyb|e; zXxZTc&+^S^+o%dp$JZ>sp)cZK5(N-5UX#e;HIo*S#Wq%HFPj$O!=61ffKXMmL|H|d zunLL>hHAwMk2GMIlfM+B1|X+W`m~xg*#+9c^59p>I;i-oQ2b;LKJ1(hwaye~0P8mU zW9;|}JD7-_U>?CZW3$V1|L~ZS&l<3wl<14L0e|Q!(`2w#hA;RmeM^;NnS?L|u{90^ zyj9tOuwW&zFNCFt%|QjA2}|)awh^CuHqhb?Z{oi)u9-XV#|f0l{hpcF2+i8e_c7QD zR(>yd3HR}Tde}Uh6=kmHJNugk0F_T#%U=CTYj?WvGc$u7ys$6tog|PjJNRrN&H8_Oh+cN{4nJi zB&hfUHShwJF1FjQ`44WMQwXiyDpfT7X<}3WcqjgsmqFGK@i0b)S@TQqu+$*2uQ`C{ z?vWL6`ir2#f}R%~Y06!L#&fn=TNhA)qef;-^G8hoIwxa)8zu#1?`|Z{beBu zl`85Ro$$B0yrx+z%X_|v8|!fcm9mWPUMsdZ^isXVoyTyeJh-`h<%`WHQWY(rDk_p~ z$G$aI9Yu2|M~tYXXHz8|>yzEMSx<-0T@_nDy|RLyO%-&fIn#O48i+hgEp~}#`4I65 z80v;MxZBpvUUegFpN9c$_-1^Uf$WPi#@1j^Hw}kT($Ew#yc*d+Zs;VpI}Wd;{U<>= zA=D?&8c&4(ghhUrUDgNP82KS!L!xXwD}3evU)U1V`v|x;%iTwFM9n~fNHf6xqcEE+ zaeKxN7`VW}N|v;=49|+pXr5G+s|C+F`HH8RA#ekPU))CG`@mE10#9ii(rP>_{%l%^ zl5?XaXN0G!Hj<|)Ck$<-;1#|J>h=cz8~!=kMan5^33fz;Wb^*(Id4LSVAzOXv<)ib z&G`VZ;VMM5x|F_HSlqNj+NM=ef{UP>E-0yW!v&gnP;OK-7{7`P)8kviM?f6WIZq5t zuc9raXlQ8bs6$l&3^}oXAnnwK1^lZ@Ce}UIva5eU%;hi*r0Lw~moSa=V&vmb`+QQ{ zfOGwALne!U6NTST4P!9xh9&n8Zi^mIn&ZX2Gy#f#ytp3S&7+a=N1*h@CD(>WAv>^B zVG?0ly&8X*de29kBK{Bs8_uHvw|g44&#BHY2ye%lWa_V+@I5e5jM^G82H#WJ`iW=x zCw#Lhnsh{CJQ|r=qqj_GJ2HCfVC?)!^RYB`6U1upjBdoN;bQPy5eU9v z4#r9&{cnQfF@Nd%p5--iG?pFCL-r|;{^0ZB{iw`leqRiiVkup9eGRspqbh3+Dp9{P zNK|tmiShXF@VOgN;6@g1m?O;ajTYKV5r@m{Sf9S(UC?@Y=)yi2bYx>yf>yK^!jUl? zUv$BX0p|o(C??e1oS!YsHOfJ8>?*h;e8HLdS;7}FS@;Ib&V8G&u20C9_R5*%Lx~k%$$Gy1B@Vcj$1VVqJ_RAMK-yHAx zXn)=Tz2UmR2;?Qd*q|3fkLM=12OQ=P4tN~91YnE#50|{`$5PM!A8()r&EN8A_LASy zfe@WvW3^!KMIk+HyUS-iIsDok{BBlWN!}M(s5!^aH7#X=4gs($9 zNz8-)3IyLKsL>y!781=je$h|u#->l08;uK&UW>BBj)Tql*ir3Kv{HWHvnFCY9_pLC z!H@kImCU;x-VT3gH1?|S9^UT9_Tm6@g5f}LmxwCB69Kl30d}(%_h_3!jF`ZO8V*pR zHc|J7eht4E(x?U|kdMjVF6>81X_<77fg)fHc4y$5BNBKPvW@5Pi+j`vO>aj#iM!bR zFA(~c*~j3?R?*dCwnu|wwF6yw@MW>*;(IhbE$_Ld933pw-nyTvHd1a>87luVNaO~l zw4K8!J^W)jTlgw5%|Dl9fTIh1zfFMUR9N2}rU3sp7K?uqw6L}f>o{a`#@fge_3w@3{JLF9hddtClR_sptDmKgr zpsHf)3iXW`6g;ohbFr(J2$`<+MjpGH!f&<2#ZZ;kklDxG~tw6qMyGju9?ocu%>&B0alEV?aW zPGoT}o7H>-IFRjP>p|)qgQNeB8F3ob(vs4p&7P~5!yYlL$|mncw&}gNYV2M)tm=sm zt-Yan1H5fb?Ul>-{HTVQ6ne2?NcP0Km;81A3e-(6_HTI0UG%tW&wQc3uNI}(lz}ZI zpZ2@cOFlbS)yrNK)at*~RcMD^y&z|~eR z3H0YT$%1L5f|-|L)twV*NF^0tiS269u`g8>h|0ifgaL|SN~8**QT7M_?F(+k`x|1h z9`a!?;)%f*M2TV1CODyJH2xR~4uS{h95lP%01`rDiY7K=_drn;*hzIY+z}WM*HfkG z0SgYb(IejAn}Ohdtn(nccykm^efvC7G6bT$hy)`3W+fh=W*y|HOlBiqhIArdNHx!oPkbiRsVjrbi_N>fS*fR}Nsc)1vPNs_?A$Ar7j>(gw{kqYR1wz;9?HAK@q3^iu zSMG-b18mgUuX4na{UV<*OtV&qktvO1VU^Z2d!{r-)5@|;XDtkIhB<178IiN0Rcr_Y z^V$Rp@WBEIXU^IxK*Fm(i%f+6A_x9%VQJN}rp0My)A2BP(8)Bj-xHU*ssWY3Fg7lJ zg8I5+gj!cE69qW>Ix5Jb$Hhw-nsTAD3#IpiMyJvS0O{Ve$9y+r8L9O#93f>7+{KOmw*JssQH2 z1ImM2%UgE#uS5jFg`y>*X)?y7>x&-uZ`k3s#vh@7tOf&LXfX{&U-e?8=1Y6k-&PI#QbSUI=@Uy{fXk?vg)FE(vU2$+o~s^#V*sNabH?El zn}Q2PVl+%65UxlxV^qOV=?Y9m(20%t?1M~e=yJuH@C8VQ3_MKHOr|qrTe$cgah>50 zz8L;`54@Im7x?!KBogp=H!g3-^!jttSPId(W&7&hD0-X*>%xUbWq>e;&_k<1PvH*; zd?*h-7pNNvwe*Up<)ulX;xvra5qyDdgsp-4D@$Gs&ja_EBwJ{UG}vd?C;23jJb`?( zOLNmO37dHIdVkA~eei5#Q`6A|+Y^%#U)`&eNo18gg~%o~F6NvC^AI*Q@d*p)83>(A z761ndETGsGn^j780Ju}SEK!;Zofnx4VIpK|m!&|HA4>{KJSN4nLPID;AK6@#c3%kj znrSoJdUG2o)vaLypzK;re&{Vwfl39ttJ6%VOqnR0Fw{q4u!czj4MWhOh1Fibyhz{@DSNuNm`ptEp8 zv}eIrz|-`9nO3Cl8ekaj(A8%yw3IDwTwUpI#EtZk zhH-5V(EYv#u(drv*LoPPZafThx6sv{hh1hE4)A8^7y)q+x994Ss*@gBx4>faC-E`I`QG;D~;PaYH8P?#RTS_hcTA4Zb|Uc6l(N z{MrM$>uFEEw!XxwFIIH=Q$Jj->j&bO`ho7L{_yv{(;vh?88Fo_K0XqDm!BNfWEgj6 zgKkUq>mdC5akzZ!ILPtlaR|kD;CMWD=in1DJRgj^SJIYUkL3XSL+*0S@}K(FZ9uOr zcoe^%4A~8&weVy7-ZcELAbh{19j$$E>{U?Y!xd$QakF=dVO&#*UC(|t4g!2N?sp{L zglX6(>@3iW_`a#Wwnf=fe3;a=ybt3Z4|nxmUuf;^xGjtZpBH80@3r{bhn-Oe_*x!; zA7$_P7leUeCPHz1gq?rErWC&}(BDDq$5sfJaHspR4WY4XqWiIR<@)8AP#+L(S7Ba! z{c`c8EXE2xujRf)o1fvOF|`*j1Xjb~yrt_sZ7;%jF}X39_@c-uYl*M*Sbyp11OLWv zI}Nu2!F$Z0N8iWZ&@ot(X$!3_O+!|!KS$|<@RQ2rui?%!p6gokKNQe{4Kyg*j%(U8 zvjke*hZ=<^-UsBl58HdM1cYmPRgoRapi?0Qzf!M;UK)({E4~bpB{4El=v-QgnrLo`{+LCQ7Jb@i; z$u>U&#Rt6zWnJ|(+;9&VM&j$2m+|$>hY-6C*Dv=vuV3EiYm2O3UPymH7!3IFb_M5f ze-x<|j|`j3YD*slqj`@e*HyUK38lVE>zBVR%$Wu$FokYezZ_c_Q==_pTaB}oVB~w) zTZE@mZeVi|>z7}i@5Kv%A!%vIFmg2HB>1^7X>E?dO_#?;ccVgBrAB6r*eh*s^yMFnjmc|PG!Eso>d@j~6zc8|X z`C)9W7rccqKSuL~CSnQN$2={!p`X<(Uw$jPE!a%H1v|-OLwT{8{E{7F$y>4PE$zgM-1z@=YlJ0w048Kd_-=7WCIZL)jmh;`T zxEt3m|7iyKCUzi7_IBuvMahct3@5dIIg}X3{%oLf-k%M&5W7EH*REe)O>RfLai*9% zG#j-Qgu?C9Gs>Rv>K$F0;ei@Xke!$J(Z5`9_ibZ1s7@dGmeY@pNxh!s~r4 z#(Lz7#d_q^a?I`Ni;?pr*CT&45L|Ll>yeu~wNJz-6zh>Aj0THGBPd{8)OzFx%sL*# zTpz6wB4)$yN7f@xIRF1g);kj#z&M@Ws+{zsYz6NW(YR=G5TAD%l@*V+7TFo7u z+X%2F5ycI47QRW~n$_I*iPhY(d^qTXqIVQeo1=^H@5%YphWCslaNU0+ofY}>8>Jp( zZ)sor>~PUStP@I7!n9SQd8IuhQ7`dPLb2H&QDLONp5=4kFB~hg9$&KXMhIaJb*OU=qWr_jra@u zEM%kK_uG=nEIJmexZh;1;@%%h5yGog+|N=MgVaTly0DN^sRT@V z{lUY;;|~=;3;0|75vgfbotCd~gw~yg{JWnwQ`x+mEhDefS){3rQm;r`Axh|z>0d#Zvg;!k+H7_>rzC+|eJs&=ej6_XN5PMT;7IG93G77J=NH=^D=;8DGrRyko;vPz? zHjMk-=iwXE9`IEC^Y9+G4W<>{pTxT98GUfAR&>WDR&;-GFsyFdASv~N(Co6ARuJL@|afI{}NWZ)T zImYw-3Hi@}zW7~n6pZnzqfWg$$M}FQe?73r8oXK=n0Ixq@z%f|H{=?72M%13Yh0hb zDh<%OqX*;nwWBdB*nM;lTt09NoP#R|!TtA_V=+U!={S1)-Q#j^&oO>=JYC;Y_9)C~)b!LhBgIbV_^3YUod8l%9dFY2F<)uHwXy8nsr5io1 zBXL&t-MZeh{6zds6YJH;7WL;h;4GX#8!2s!W1D3pCU*wKy_sEVy?5av3VwQEyT`XB zv<_b#8U|Xy44i^rpfw(VivzEDd~ZCAAq{!FHjx7Zev2eGvrDb_jwx7bz4s}Y38L32 zMtrU>GO{jRm%j{F=9#o0Uu|RevDw+6F%skO(DW?dDbq828@_P2e39n4>Mw9w(1&fe z<1y76wpFwvMmPhAfw*&OCCYr<{bTJ1hY%m6pXElduq~Cc$f9Uza&N)l7JM`*$>30; zJ?zSZ3lrMI?sv$v#tC#YYFCsK=ql7ZU+MNsP8Cj|EcgpL^#5$v_jM8zYQ6W=dhezyv}Ge)1(@rUKDuPjzV_ap>(;lfUotch zx>YnFG*8O)qva6}pkDOyCCUTzo>{|#5f9Ka!b=gK|KoJfM*Ba|Jn8)(!a3sL{{SBC z|DbVrfsibG3~qMY26hjpHn96&V?aFng2|~>BTI<|CN=u>o{Xm-*LEpsb63GhG{Rm)OzpC zpRok~j3w}AoGtws<81y6@^3`^8S8{U!xw}z<7;}aAfi~vuOXV-q+A;M_?BS>@l zy)At>d_*7M|33JMKA`v(Ifuq*8_~nv65lf2av`(5L48Ot65nzinks9%qJxNU!TM>4 zZz)boLxzz+@kt0ei;iz0#|A$Ab#QFVv>Y4%l>;i}*s$#fEk4P%J2omU$A+5LJ32Tt z@hxWwA46)r_ra}H9q_Ix{`i)I^KYcqdrz(R?hb@5Mm)^LA|7U{jEDIIW|(9=4AyU3 zcu?^$riWwV@;wv}gGG|ec$ms4Z-{)Q%Df@#BJnUHz9V`6#sy|X$BFdzFXG-9)Sd2) zzopz8-Q?a#t@r*7ac`v7d&gMWNW(#qG3mI*JIy{gB^lX~TJQbPxHnSky{q-o@nP)O zu{egdDLT3AL zC-$SAug#Bkp2ZBcJ@VlWecsaP$2-OGf4now$+=O4)yl1pccymu@lI6pb#Nc=q~bN& z@fub{U6X(Ves8_V_0a=vrYouWfSo&nA;p1qu^RNr4DynaV2 zUSo&9<(*H%Z$pdzwp6?ZmajK07w-_nItKUz&>O7J@dg*FWuWNmbqX=OT{P`?n!&xH zM!Y`|3v5SL;4r`Dv7!;hx=M#|1&&m_Mk-!II3K%tB@V|?Uic|ADD(}^)aaEsqF#8W z;x+JEkG^T%i!Y7YiWmSyBV@fvS&RTWwX()8b&+dcYzm*j?ur#UFp3I~kTG}8rIXj; z-E`c=>Kmze4KrS2T6ysK^57G+yZzKD{!n=a8u~(7KpwkJ`LOtCbAB0p;!Zo~Rnf9* z0sJ*<;_}Cv^Oh~m!g8Qx{g!-tbe5-eFa~F%b3CoT#8_-Jc3!?3WnZ*jtyZ^*-b2&v zPXUiETk@{wKJ3Q)oLD3DNPM+JUv&FI_!N&84NV6?%*#CY?V$ubtv{2@_u~$pzKwRJ zm_-Z2(Jp^g_ycRELQq=ly99%@LT_-}`QG5G7nIK|zo7g=u~aXjR$s6d5{gS^8>pAH3-vslhJZ}XMmFMMWlOmD+jg)7ke<7Wb{%sgRQ`V73 zGppG43)*ndgi^jk{%OtTsPqj0(dpkM)2~1^ru2`YGv&W4(m%(Z|FW3;Un0||=m1K; zTBd&++TP^yPh3_aozZ2U<+aIj@#1-u%3|n?_?6HZTIqW*{J>`#@qt{A;{)uZaz}E3 zPr2mtvJb!>@`Ebi2IKtyuU!VxqiEC@AsTo`ea_U6sT`NjwtS|1XJ$zp;-*+n%i~pGdB8 z_}`h?-=H>Pe06*sOm}A*8tt95fx%8U{iM@Rk8QL-c5v@QSwukwt{gXX%?|PYrCPdK zA13OlVwHY#rAyxyFf$Lq1e4n>^rq3+LVY>4FJ&3x+$I(qlnZS7HDZ)m=@uyze7v@V|1~JM8vKlqK8GMGy7u`gQ6pENi%+(1|fi?o690nVll_r!yD@s zlvXTiXs(^#P~TJ;Ltq00ebET-{HFT4X6rHk{K`(BG#Q!CkDOfJFsHt$dR|j~?VPc- zi|e&dYtlP=N=?!5@%4~+e%&-kvZ#qfh(idIU+kl{Y{vbkBfqn!6xJjp&oHhJKV@#@ zxCM)9o2%w8tzS^xR6DJAX!wy0E4kfKO zKv~W_kNleFSCU#Mo&Futcdi!QWPiH!6EQ%p1Afi*kzoE4GC-atzdqRX<268@Cclm+ z{n(nWH$TpsU-NY6+Ud~gKQ{e@&F|papBO_s#O<$h`iHLl)2AP=`5l!09V(jM0HtAZ z+vC@CTh|Zk?9UeFK%QrQ z9e4ht6FT(v7oGm0x4+o*53T*hrhjPdFE)LLW;yuWYEuWqE{@iB`heQU^p;x_Hy?=a2c*AL)2?%$t`DxNH2I`^KC! z^XiQs7u-4KdGz&rZyhsS9PYANyL&yor}~32%kK5(Hf{ae81kRD zx9^p5tXfwy_6I%poG`fTx*r^alsAkaZZogmKjsI-{<23T-GH*}Q@zz+CDJmK|Y-r)Br!5hG z4m(K#AS1Uu@gg_;__L?d9AZ6Tc%>;0>~t)Sw96(NX-l)x2K6~SV--C9^vtpHp4e9t z*Mt>H>;!ox%qy?|z_97^`ZR_ukk{ujY?-_!`RE{i*NQ8{z%HKRAnbN|-Cv%SY-yKO z1%%{>|C;U$Qu5R0o%xb>BF>a&V_as|l`daq_6qm-%$z{4%xr&V*4WI9N-V!XY0!!= zbf`3l$2@^xDShv3T=xtQ=(XywKK6bi~VJ zmIIG<3G%qrfrpw5$1BH92OeID#mi%etTbF76#I~fJ{lc(Je44idmMOVNi5#HeCoiX zIzb+zMTLmA^&1l8vCM(T>k0CB#DPbS#NyRQhHQX%+0IFjN5Fx{?FsT&<-p_p1bMvR zz@t!N@#-TRky&(beKaS?W2OU-2NLA5+JVQH3G#Tyfk&Cd;?+li?2NcRS`*-r4_)3P z=_lh_6zS~DtQD^FAI;2|LKo$k=;RA7d^ zc8$%IW6hqGYj2*C?=;oGrL@9YFuyE zNBnPJ?|eMJO7i(w$yJ$|)#3_dmQhZ!P_!6i5Zwb>x=NGIZ_@41(v36eAV2ZT=!qX3 z7b^L!beEZQ<4n3jNq27y-P0yrxk)!&OSd(OUkTz(=$K1C6DhCX>y?=?w)YhLR`#Aq zrfkpx)3-~0`&GKamQh|S+)}?)?pvbtJ6`B>hkR}<`hs*yL*>hTJ*Y{crrtB89Ft?{ zej(}3>RpA$3nkrB1d|AU!fwVp*o~+s<1_cAxxei1SRu$1jU4=Ml{`aej|5LV#481j zA8(g5qm+EU%z`VRBY$sq0R%)YTyt@nKs*caf4ijr8`=QD^Q_Dp(p-x`0=t`t(^vH_3D+D0$8$dFmj@*;YG8q`;w>olt^AXXyXH!%Z_lbb~)NE zYPrd?>5ucQjP5taXRgKW#p!yUWV?Y(!P1ySC)C#!uFA~p7Mg2agwpVe zT6?m)KNjct*m7~(3{}OV1>F!vL7m|>pNoIf^yI^1$`5fot~MQ#51dsc;=A=pQ(auW%8MuPVG#u<7gZ;K66h~qjB>I#Zd!JH)4j=&8%4FX9LP#NJWZqzFcjY*`%5{rl?H=D-wBxHJzxPqMRK8_@ zBKSr6lM2(GcDUUchdXk#^8HRX@GOxI&#sj7%5LDfqZ@b@i=b`8coJ=Dyk+$1VI7yz zO3Cxp1bB8K+kAmgIDD(`6C zjN+q(DH(U0C$s&N>8w4G*Dc%l5zYkZhr#@^w|ikH{pn3Iop}2n8gpz-;+gbg%#0+G zPDv8aEJ*Mf8mH`(`RU5`dbE_It89YgTqSvSW&83@H^^B6{|6miC1(zJdF9KvzY}BO zr*Sn1?}X{n6!l}RO!wInc>Tb;I6lAfvigDX<~g0rC)UYy6S3QUNj#H(9A(UidtOWR zaC#EYT$$iAWOo_znXarKGbPWitRHJ7&#tmN%6t0p_`%VYa!!{#yGqUs_}cE2JkMiu z`m5+YbgW-|vN;E^-13#ZsVWt~Rcb--7&<`kzS{idyu@=io{5uIp^A+Xg4a>!y0 z<1hHH#^6`FCQ5&}YbA4A8Z@NXnS&o3G$a=Ea6-DTgi&b@xE(?FVY}09xABn^j98G5 zHTVGy{+R~14&8azXT_tfCMH8|}O5qr3e zObwo;!TV|O{u=y94L(qVXKV0dH2AR^{5TChScB(k@H`Ekufb2$;NRBZCu#6gH24q= zK2(DjYVaZrK3s#3(BLCAc!>r-U4xI(;Ph5C_HY|xGEBV;NZB%OT@fzH( z!6#_&fCi`aU}6uqF-e1;qrsaWz1$~5nvm(aXZTvKbo^HF1pa%b$2ES5+x5eNg@OK#z zoZ>yy;Wn<0p{ILpgCb#L54UlR2LFWyzfOZ+ufcE7;5TaUUu*E2H27~d_{|!8jRyan z2ESE<|3QP_ror#f;D6NMcWUrIYw*8l@VjI1$6*F8Bf^JbKGfkh{u)D1_uR%k8vH&D ze!m8PP=o(NgRj%z4{7j+HTVV%zEOieqQN(7@JBWH77hNG27f|>KdHf=*5J=*@U0qr zn+AVggTJ7`U((>)HTWwU{51{!x(5HZ2H&B<-_+o5Yw&k9_J5zXtzEgMXsI4`}euH24=9{3{LKuEEn-FBj1(=F1wqhXy}PgOhhF_HY}$ zGdv4>H7@TGtX$GwvXde62 z1+!Y48#ae!2!9rNPh8;Ad*^G7Vm?!7DVl`T{1}R@}xo4gGix z?$h8CGlDdhugSFgU{FC7i;hZ8oWV+H)`-E4c@H5FVWyjHTb0({0AERat;0?4St0N z|FH)Di3V@g;L9~QpPfg_*=?-U(9>Gb(Fb{ETt)<^_Z8}J8&}5A-y-NE{ACD_c*M>6 zLB+!yF;-apqr%M*V1+wN0rG5)=qlVfHryPcRk#amxH;mgaLcd^>+Y9gq*UR?tGKAc z94S?}OQKN2Fh@QW?m`>hTWFxdU1r105le;JXT!}AMTMK*Tk^vk2~@bJa}d{N4_@J( zWy8&$x57QohMPTRg}c#)n>}5Hd#MdKd#DQcG8=C8EEVpRHr(tHD%>~NaI+<^aIdoA zlcj!E+wkcUUu(nZ`xV2eaNlmj=Sci98~$C1Z?)lOOH$!}z=oSGLxp?24L56ag?qaV zH)~>rdxs4-Exf|L(}rIqh0M^|*CI3$? z#Ju>cq|dV94@i0pPNR;8B%WczACY*L4Sz!7**1Kuz$;_)@RG#s^1Lqaqs1>5=q-Vu zzT5cklz4#+|3Kh&tr^C*gd_-Jw;c-vEIkVqlM4 zEpQpk&+yFx_b|k~%oP44yLJ#qB5)b3&7S(5z-3@C!*>Z>2F@~kxcH_}29+{=p1^r) zZQi_F;4&DI(SI&*8K}qb3Vgp|h&R>@#ATbnWe^v;^^(A4fD^;}h$581LJXfKa2dSA z@S6oLgG(457Pt(&VE8a$3WFJ9US2NnoEZGC0?&=Xw+cKj2LD*#--*G`5T;fbga1_E zMKSo_1U@1L-y!gkG58TM**sU|{l2ouLV-u#@1G!_JXhe6_xpd4_)>vK-tV6#@mmER zdB1(O;4UH7WWH0(#k77*9g3Sj6APt@O%_vo+}cEp!h5l zc%-*b^4zDv+XWtpLr{EtXbSUOk$3~e=SLd+9)Sw_ng)2TDT;#c8@fiX?$)Z<$ZV~tp3s-#hXz{yf)ki(c`WA@GqFuK4^;gYOo2iAAsY6r&5tbB(fa#b>?-|E<6yaR`df^8zo6 z;d3myqC8hDUN7*m7QNzgm%tYg_6BPIa3s-!e)8K>91?IWPD`*}{ zo;d=aWZ{a>T^jsTfuCd1D?VekHTVw%erXJ!y9Iu^g-X#MIQ$eq;c_PC#_$UotuEEa%p6B{$n&LfLUR?q_*Y)3+{QgQq z|FFP+CZ9G8)pET9+)4hOf_{}n|FOL4g`s4gD-u7T@F4=fK8F5mf!}E1=KLA!bO3is zcZs0C$)dm4W#;^s0>3#1e^B7Rv+%i6QSS&m@_v86A9~4KMr`F>#tV6 zXgvrz&eG7IC+P3D=xIF&I({bbbr$|}6E>a$zQ%R4EDaeejC&_w!0#mI5a4TEzqaVr zc=!t7d9GOgTLk{Fl`gFzK}X*co%v^L@WH_IT(NxS3w)!+e}c*0xK4v_5cp<`{yj(2%3DBAkbi4-KsT@BR^y+DIJqMy6cM_%hx|QxE0&)CM;F0(KwC(~O&k8*9 zeqYfab29NUy|qL~>m$%{vA`qm@fH2O0^ez+OY0cWaX9jk=Zd_qSM-ww9(i9+>kZIx ztHAeJd=&j&fty}mqN8;I=%^S%{13#?UnTI*V(>==9(m8M`1d=N_(a~bEBpe1x5x0g zL*SA3?DRc79bXCD^d8gSijQw7@z1d8ox-mbc&`}zDS`Ki!3Tba_+-Z5bpkiN(3I}$ z^n>GCfk)ntD~owr;Kx{e=sO}hstTR$?YkQMYT#>JrLt9vv_Az!&U{7z&vm6)^kpJd z!)Vda|51a#slg9u@ZrNqZ;|)xD!=yuU*kH{k|$ltGif- zDKUI@0MB(DXW@#^k*5)#$a{SHwu+7$fUj|lw&<09ib{yj7goAug4!@H1)k>`V&U{X z6&+syU*kF>hR-ibiO**ieVL%fcZ$ICT#@(wiq8e76Cc_s(ma$rp8(Hwxh=d*-am5` z@fl|ES9~@CU*kH>qE~!ojwU`mEL`#VJ@7nNBu+r_DL8}p6j=0%&j#SRF4GH5q9{H+ z&m=x2G4iwlU*kF{hR?Uh5T9HNSA1wiS_klfWZ!2nzp1;E^~4Re$TpQ+`KS`cZn@1w7Z) z)56Q7oX7h}o=ALx(%Wj_Yh1+^z2Z~iCqBI`T=BUAc%CZ~x1j9YHG%jHx9An0Ujxr| z9bw^$&)dNBT(c}aD|zOgMSO}Zdc~(5c&>}K(lrmoXMBM8MB*HjJWl{$;~HksD?W7- ziI2y^6`wx=&vVVSvZ^S*g;u^)ey<0f>*{aeW%Lk^CxPd=F16BC`k!w&`$VDVA% z98*nv)C#+idVLS@T-Tr&K3@UPb4B7MlswC(5})r_^h%zirxBkcEnLY{3%s8z5=TMb z=+f~A;E_?3iP7)h2#@?}U9AVc#`PO3Uy_Y+0cMPnl(n=6lTpJInB4;M5_3oD)2QHpKQrzg1~RF@EnOZ2>ezHSM=8i z+Lg)9E=2>h=WuIPu%B>sQ1a7EuN@Ov%1NXm1E!0)qg zMgMPsn^6Qrs`#IH0r7t@hQ2}I|FCdHf1kkDS-9f=wZP421mcfwR~+LnB>oS_(618s z1`Aj8uLyjjg)9Dfa6IO^%%}!ptn6W$z&FRx|4iUpEL@e>Hi188;fjCuEaGoQM-YFN z-&q2GGKT(kfj@2GihiHKpRsVozoeGI3Sr^mCKI{}n_3j=YM(o{dSVgC1))K^|Iv~E$u;^xMtMU6uX59(nsS}=z=oJG4b7Zpz)Kel4g zf<;YJE?wMQzp$vN!e1Gvon5^Mc;)0d*bff>=FFMnn10L_%S9#rhWX7?mdsvUyRdOV zy&oGeFBP(zNm7a<%A1;MFZEYlBDT7l(p=jxr?zQM`GN(D>T0pYa%JU6f5YPXrsm2j zBs}>n{4C^Y51qfbsWzg5K+(v>^BXQ&P+zfVVdJ8P`UY%bY}AYoOd4ArsHs`JWOj|e zMyWbh+7TcyC9Rn+L_LT{O}!2cR1_Nc8Ad{}lXr!PN4`FJLM~9hD2@b==v%|zw!vu$6f_|8wA13$=6MTl5&x)sp3l4C+ zfZK5K>~KLj+!R-E7;aLEr-}uAu}G`f%$#_tSkM;>`eKn{u}NQQ8EHKGKBJT?y(20w zN$4SAKn|NlC&kEN)4inlIBlMnJfrB%`8rdP!^VZ0{S-Tq$bnHDCFJmwNS?N{jNVT> z@#IBW6C>Nk*ayKWG2O=6M{=rl=HsBc&I&u0Q5;1S`%sdK?SN5YdUdET$thODC<)DK zIK^hUvm$a}6h|33JY^M961t6kIlowYiMRSTNCEF-%el$

    GJFRGYV+f?0DJ0AlVQOph_qORgoF`}~StUA@l%7NIz zcv9_j&<564=iMo>%8%m+bi}mU1sL#R$f+HqmZBf1Z&*CP`O*%_hWk3Pj2oJEvO^-r4p-TJy_uSurcaC_vq1&eB%tL87QUm#6RSb9-10u|yR@3}*p z>gNuvskvzB(wfHlrp1dIY8RkbYA&HU%A5sNmn<}DrZ#*ZgX@~f^^2D*tXC4pm2qL2 zP6NC|bE##NXwJ2aNE>RN5l@*CBd10$nVdQCNhV`Xe3HqRV;h`I#vBNsl--L^2tn8u;AtR=vx8!1D7RZrNGC6Z(lxWuCXzF6K5l2g>c_>lwv{ks{>Jpo} zmQhlgck(JFoi%%{OFCNsl&FiI+Gjy132V$+D^$SJAJ zIdV!Wcd?bHvxZKSIVVO*<;{sv!dZ)>rE|zf98I0>se~o8+9-SdOU|?spDsA$L@QGq zxr@%mL9_|+F^a>q;$xIl)*S0!90eCEk|U?2GUv!CsoXi$z@#$g#3-q}IWbBqYYs*q zS9|ABa8AR5q%!9yQ^L86x5bOjNxUtd!&6*B<-48+7vrKPKiuD@y-0UtQOx~HV{TJ@ z#Mu{f-^(=_d)G|6;rs9&o;RmfcoENQsHMNAG?zBlH!YmsP}^J|@wnMIL>%xPifNHq zepGu#EQ*fgjS!L8jf=idjzCA(b}?crW_0LfCW`5uQk>T*ML|tN>XghPz$G^7!!bq$1-E$q(wc?!3*o`OsKKbIsaslGQ)`B$)YsH6t*dXO zmjqUX$fR-Orc_qfRF{tpRMwC@FwNPubIeDiy;S=-2%_p~(SS&#d0vxgG|uvtmNzyo zxO8Ie;)^RM&qIaAzqyp22&Sp34ot0%*l$c`ogSWRJ#N{1GB2fgm!T?P5`2ouhDxZp z2rR0*n6g6e4O9jXMncAU{^I6{k`6*x$95ozOjisOZ{ij=H!Y}dFkp0bjhA*smMe-9 zdc((xu+z7Jyv2?&v!W4J%-5XiMa{Jf{NKH_vT{yU)mhawldB7B=3AMIg)>*0AyQ4fRd)>--CAFRJ%f*Hl_{YvkDZ%?oQAOQzJ-Hc+=v*+Ibr$x`j?3 z&~>6EHHd6M?0A#t$sB5qrYI|CPsSbDUsle?q3c^`SE17#QRBxjscVq&8`|Z z`x4RVig~8wa+-f}<-$e;MTwydze8h*X7Buk6f}j;2r4JfM@eExCZmV`=dw^)RMN0y z;q3aRNpq{37S+`+Uc9Jju^KDNC?`2KQ@#cVLyfg=oziWri%KS8QimCz8Nn4;R67SM zTxbniqy!@nlZOuyh-tA&S=BUuQ4<24iV82GXtkQ=OB>l(M?O}3E~5G(CRRkv7QStm zf6=_=DfP|Ghyq-Uf?2R=HipXxXuGJssZ!Vg0>u`Ya|&x*6>Vj)VO%7dgY8vzjg>i> z$sv_NXC``^NI*Pg6P@Xp8ovbfS?pYE>@-6-G9;no_{B>|#|~8_(P3x;ou06XSYJdp3DIR*c9c(}X6MS=tszdBY2Hn^$A4(aLP;&g@C8T4=cD+m7O-{pPhl(S-5tO;EAFFqnmK~MktmY0z z+R-g#H#QiDREETroPc;r$FVQsVqYT9`>x~b+}KCCU*2he-sy`=ra5i60XA+c?&{at0OuQQevxe$_-AhrQIC|0)W9xav4y%wX~?sbJY>n*{q$H|?S zL|t*tx~dnQ=}BXR31%gMAz`fQx=)0z(56nhL=@~ep6s?R)LFybBtuuJ*ipQMbnMXj z9BM0e7`${vC*EZ`c2ZHoI<_^-|06o?dKtP@$9D0Qj$=m}v4fQ6WCkgY!_Q@eWbuyU&C$?}SA={g^9IEWS3n8)Ec(u{y@meuS8_KA z(Pdh8lrJGQ$GQ``VpIkZv<|H30RUCV?vbI(lbUuAbG~Qf)%8E@-;?oEARfhcDL&LP0N}({0 z<jkxo z7mElnEHXQHk$BYPS2V&qzX_kzS#0rT9pkLM9i7H7q_=o}N6AQgFhkeI)-JB+i8$ZX z2}ot4zMru^OsMQw>W-d~>BO>(DA*xAy6OC+^)VjLqK$hrjpXCtYK!soiE$qjETLy? zg;rEkbIC&IQZwy}t?{Pv8c%wpY^M=B*T+HgNkC^LkEYv|706*G65F_S#3n&$90rI{ z_8Yf$XmTFiZ@NqldIPcX&vYXiOFBq$CpLldwFb z!YG%2lJaQyBq~qhrm9hpmQhj?C1k7}N#w*xD^YAK(z&sA@Js^fBxS0xNq591L1`S6 z+KHt)i=*X}s64v1(Co{cn)sM1Vzpt3wW)eOPS%x-JWhPH`f;dfottS#4<(XPM;4~d zxkKU|@kvx3t%)Tnkd{%R62(@9PU?6&&`?s=8q3F_GQ?AT;%8*8og$|{MMV`0 zu&s+vcq8yFl{j+DlR+ErWTY9!m+j_J#qgdC$M#s_Ao^YmZ(w+DhTp*OJ`B%h_z?`x z*WhaZAWE0>AIs>uoO0V|k*^EEzmKHz$a6Z*H7s4ZEprV0(Hi=4hSxDZ*j7>;#D5OM zv0bu-bNZB=roE-~Y1&81K23W_)gx06sdmZKL#q8W+lN$tWZFZj-!%1*>NivUCLd3x z`ps0onVNSPsd=2)EE+TqdfxtEn{sj3<>@PN^5^^w>C$~V zMwut^_dQIWTN%#va5uxbJWos9&i@?^PQD{Li2g2?ZWhCNxy+I{$<5_i$Z#&t&l%43 z`CEo_`rk|3F8|An{ytnQf87U+p38YOF~C7`a(&iFoKDm6U-7xvhATVxz71F9-D1O4 zdGmJWLCB`+#WbWv2R+91e1SksoXdZ^#O->%m*HG*uP~hJc{tM>$4eN_?f(PDhx6z4 zl;>-fq_^kmB8KyPal7UA^N=RpHyO_5*U4GT^2O;(8P4;o?4R_^^LreVKNHU?J5lwN z^6O!^YL^J-{$#EPs#A*362`wT!+*%|ehmLL!#Vve4CnL@FuXtG^Ekt~Klw7y&_VJK zVDu{)ek8-&Bu;u;$MEYI{ZS164Z{aAoazD{_H>D-!g;zIByLalaYoP6-Nta9?mG!+Cx$XZSIU{$~sy#PAy>Zr6`$H%LyN?!$}^Pj?H$dAct$ zoTvMa#O>*R$>@2y^bUv)l82{Db&w9idAd0a=jnb&;`VeGXmDMzd*JCl%jkK! z|6({#_kB&e=}d1tU2YFNT}q1%yPXs;oTq!5#O?Y0rr8Pa2YGuk$;__EZ^};0a{vF? zPQJzL;W*f~YL|5VPBo+Fb~TgX$1^^>pW@@L?@4;9M>LjD>0ZkC3}*OphEp4^=>NcQ zUXJ%LoY(ht4Cn346Ab6|osZ}F`07JO&(m#ZI8XO*$V`X5ouRRf!g;#+61TTAqZvI< zcLKwCx|12s^Q-2MBo9w_ktW?cHTcsSe5VHQLkZ%b6YmF))!;)kcqzkkk(RQDa)#$I z+|O`sS5q0z?dsb?N>fg5=PMY_?fDlHx7+g?4gGx@`ga&T&zI`&NL-%oM~t55*Cq8& z^qddPq39r-)1Sz2ZdYm^NA%pTxE*r4;&#aGYKG)*x99I^(!GM=Jl&r%oTtm@J3QT6 zHR)1ari1du^ZNwDdAiRroTs~k;XK{F61V49*|Qy=NP^(7xt(*n<#x{b^LYWcXFf0B zeE2w!(+_3k$nAmKIkyKdqv!U(+golAwHkZ4l=0!|ay#egUd`xvx_n;G)77=xk1#$w zU2f+*-B%esPgk|`RPH?81Criu&)+orKZ@BQ*Fz4&xgH7_&h?=D?RGtkko0yvsPUB@ z=i?||fBCqb_eXa!d3e1zz|!UQj@JuLujV`UdOeDjJExz)%9rzB%IJB$ev09|KEA+k z&i{3W^LqLL!#ST%7|!{8&2Y}A4{HxOpKOM6`jHYR{ZQRe?Nx;apU(JjyJ}!Kx2sDS z&h4s|;kZ0Fh1O_K4A2ZvV1B358dYWwn<}eZ)xo9a}B*3_uB34R90TR z994U3r=P>RB5;+kK1=r`OdBvTZs@ zeopU`xSjtzM$hYo&YssXdd{D0j1Eed+u=(L=XU#VhI2muVL0c*?VR%w2|A>E0tteH z^2_aCwZn9q+ab4eZih1@A3AY6yoll44jUzIx2vBpdY&$~bDr*R89h&zkI#9!|Innn zUxOdP?3T(@^;0@K_iF6_Y{rM%|B=ua9i)eQ8Gqe-d{tlU^nCnN$M{SZ+)e&-7+%A0 zPOs+UcK&=m&gs?rJEG_O`Fq~Kvvk+8bUFPa4CnlxVmPONm*HG*yBK~yOP74Jbda1h zc2eayK;kC@e}>^?GjxzyJj-zE%jh6{E3W&9zYIh5v&5g?%_;t;OM1e2zUmpyuAaGtLZ8P4VZn&F)OFxFmiJsiVuPM^ncPCts_Jl!&ebG^-DIHzC8 za87?2!?`?b7|!|J#c)o4AH%u)PcWR*KgV!R|2e~Xy6p_-^7o+v#6hRKQ5RIZF@WKm z{|OA|b~QxecDoubaVlnRS7$Js+f^mw&+Td&!+E+FNZg+89LArg+rV(1?j?*rPxogG z=lZ{f;aop|VmR0TT84A|Z(umj*JBd5=j&OC+x7Vh!+E~mWc+!)_A{KP`b3RKM&dX(}klvL4LD;$KH`RMpl9R^L z%Kqm|dcyBxc!=@&3*)nz(Q`iPeG`=zk4sc>R(70Xis&Gm`a~s9DZ_cXwGt;e*E0GB zhI9Q~$#AaE8yU{&Nmq2(<=n(@F3+2c57z_lH=hKJ%Ga61Sn{8Nv%>j%9Im%ZCA~er zD;Un@{|)2M`SfG$A(!)q4Cng%8N)gM+aylOaQ^Ew_}2{Q<(o+v!a;nvK2MXlJ-=Rt zb9v@7oR=?e-#GmbCB0q#Uo$>jKMPs?;`+Ia;hg_+iQD=AnbC85c#q+{-t|9Bs3%50 zCrg~f<#G-=JVMXQWrD=*^!GBH=W8RwdA{Dz@c&4IkIab3!^?df!+E(ck~qo9<++^U zT%I)y=jDDE!#VxE61SJjbBvzr^A;JXYL{m%!#V%w7|!{O=w<4`&SxycIiDJd+vRN5 z;P)|{>-kZJb3N~sxLuwv8P4U&?H!Sy>v<@{IsFKU+vT6a=(&DQkR6j zq#sUyhWyaouD1yc=X$$H;&%R*Yw(8{&h6?MhVy(Kkhoo*^sI>9xI8B@oZHn%hI9He zByN}gJVwv;b4uSxy1YFpVL0c19>Y1G%?#&!o?|%YvsdDFIn(<&m+v@+b3IREIM?$P z61VI5N``ZJ?q)dG^Fs{h^qVDam;Y@>&-HU}e`h^!WH{&lw8ZWF#|((@;q|Ca;zZB& za2ccL@@!=|ucrg02f~rGMwAheui_s zc?O#LvGdQ@;By(y?dlSSbA8?{al2jpKlZ)^K8hmye^AhPCa5UhgMvmyOb{_DYB(Z6 zqed>liv$P;4G=?6yw)h7WP=(Nm34KEips9~TU?LDJD%XR;?272Zah|_f<(OV&Z7YubA#kqWR0zXKJeZJN4fC_N$|-tE+qN1|0dk3OLrQ{{W8p|0lT3e*?lbiwU%|2^c#@_H9=oKN1J6;R;h9E#V;^}qu#4rJV) zUwFxZPl59h=l8FlXFKqt;QYe*{dFX#I`9?HjyS)6oxH|@KLqW9^ZWP1UU%TzgFiXH zKd-UB1OLdv{p+AL7Vgi#|7_vI$p(kbW#ZoVzdt{|t%cujvPX8Y@RtP7v~Yi3zMqBr z^Z2~KuC#D}zDb(3*N^Q5^A)|#VR-o7fR6zDb-?}h!SpcyTu1%~9QbO$ zd2Ns1KWt3f99aJa6n&iUiF06lAIQH>{AA-^X32j(rGo{KV)OJcK2&hIOpM`k#h!G} zG5i_9Wmp=+y$#YO-E9mXBK+jE7Q^QXzKhuBUFPGr)2M}KNPX^U;RA%v?to+Y?hQDW zR}J77(YEjBdo4WQ-xoW~6YB%6*FwA9AV1pe3HZLW?b{s&IM#;+fTP|2I`EGHM?Px+ zM?U^M9v>Il#ryThbAptc?S}^)_~U>hAHSUWXXN9rcVZm*43hF^9Q`oEf&24*oFDDZ zh5TsuFMy-np8!X@S<;YfJ~@D+-NAsPUA(V>b{~ZNX!jEb{srJ@cOBqpw+D>V(C#sS zqumjJqyA#RQU5H!QNKS=X!{Mvlc>KQ^q~It0Z09N!n`8#-w$xq-yd+)UjjJlsd3={ zpnArE-OX!s{dWD4hsNVSIB7^HyxHsk&{5c_S$ z7jtF`*l#oLk0-I;W_$@}rhxr6=UFfNJuUnh+0V4_WwMXwW!CTW&$99_ zm;HVg{)X)5SojLrA7J7Cmi=4{Z;<^V7XG2^$IcJ5&paCiFObyt!*tm%v~a$b;4so8 zvGVgEc~0!1}L)dfr3x8aR2^CsfEA7gejDnB*y1QIe(N}_@06v0Qg%_ z|9$^3jkf_m5%RA9{4@uC2H>cl&)pns{g)fq!|^(L55WHgcKz!xK77=FjO1q=d7kXR zCjgFmE)|@4;&u0nj{N@w9PNJUz}EndcDv9qaw2E}ZAd0UY^Y zx!^p{bjXkQ_x*KT`;z^CP#)iJ7fXJ2_bY(c0M2E-rSQH+a4uiGzt3}D92kF&wtfBn zdnD}oz_J_|M}KB}XnZ|f=)k9d9_%;#*tc9|Ab)zj)_nK3I;61ZVwN zj-7Tj`E9$K0gn0y@7AmzkM~T#(eCciX8l+nw%9}0Q{lj$cHsT@)b(8Az*jo(gL>+E z&UN6gIPkOgYCc{puf;OKVb`m)Ox^A}K2cEM{Leu>^g#OJ^17PhIvHnjJ`O&9z5voa z#PEv*_s=JO{#k-cvxwz?lQU3|Y97PC-PGXzdED32Rr;4*%+Im>KgoX7!aLEiap-B1 zSpF`8i+f`DW`g&&^853>Sr-1a@b72g-wB>$;X8_cyzXE>^E(|lewNx|m-nt?t3IKMXu{EU9{ zpF3kc*j|Q%-_Sp$;2-qE1%h*e`v2;{--U5I>iM4oU**8NK|M$QIcdfbY(A`?S0~}; z)7!|;CE_=(hv=Vk9sYFr+2yyd9sc~uf%kIwIX?+Me*u1W^)q9{pX`S|ke{!4Ij}ph zz73H6!Onk-1NZB{o&Q3~&-$@mZ4CVk^6}Sc+jZ-NB@4WjUVmEUjh9I@_8L_ zY^OU&dD;5+gK|W_z3ISDg7vXs+tHU$UiozV9GDM|^XnL-zc|<%KvtpMuv}Z%g}Po|yk+Xcw5j3~Mhc-?oXW1it*!I>83 ze-H8(gMWH#NjntSF7kW?aO8O&%o||-O903GQylXNR}0Q|xxD=HK0?NQwjYiH9P7g! z+mJ8?&X4%LGHzu*ybtAm*mj)TD%TA*pIZUP{ONMRX4_p2IF?IySnq`8 za)D$1;X1(4?rfNsz~lW6aI`xR<{wbc$+CdJ=KoOCbDP)hQ2)z449@<+`mp;Rdj4t$ z-r&G{?y2iJ&w)SXz_;kB>lx<2*Yq;^`MA(Oo%h!DjB((%Iq)?O{DXa)^<)2OP*ZOg z(#|{3kMnQLlkt-~^IpsQp^T3cT$*(({{+FMdBt#lU4k^182G$Pw zH->BT63j=NmtedLwN(z8CW-0M<|R0PBOf@0ER)3YuN1tWg*OSFW8vDo1nbx4B^cM{ zB^d7|{QdsSFBffIg7epk!wPAegP;Ge;`osUj^XzSKE}fTF8C=HzK!&cMHc?1^g9zR z{BxN@Jb7RLGYOt-bZ-iyafBFui#Zy{{Di`w(xgE|6B|I zkKpqx{C&Y|E&LWEBtMRqg5<~Rlpy(WyzTpk zj~B;XPtraIuDAD4^!?CJ+5zL(e+~c~$HN7H<9Yc2RzQK111OKLe=LmCQ2$iGQNRB@ zIO{?EC-DJMu=S6Z{+018uzLpJ$Y&?%7w!Ce1CIGWPV>xqc9H+LfFu9TaK8!p-wNYx zJiqS?<2|&yAKX_$yMqBoyQ2X|yBo`igx%M|uHfv4Vv2rw{R?p9b1{q?as03gJSTx5+kA=~J_a0*x0CcYoFDx*TyXXSzhl!s-s`15w(~zC z^T&4nBDimbc8_)UX_?ff@5@Kp}{U>P^s zda4}wOAdUey>$Nnl5wM5zFqgx^Pld(XYbeS2P~J2-nyPr2fkqc=KQYl>fMy(61nbW zzi?pwjDIG8bbB$}zu&(lXQtri|5Ea27&wOi%o!+1vy0)?qF9i}qg-;Z`+`>x*ue9(o!Dm`{RCr!s;XMVfvhYm7XIuCMqJOT1R|!7P z!e&|TJcIDZ@v3xh-h2hF zn;H#%xF7V_0gm~3Y`}s2HUaW4_t1EJ1>m^ODjRULyU>A8BU>EUF7mkmaOCr{19z?a z%4OvgSpP=U=>7WOkJ}kXo)?RL?jN#g+s|JOcwfMev@;@&9G3VbD@K53TB8~7Z#U8$&3a&ApbbXe-7YSA7%rN_2E^(Hv|4Z1O6fCA1&84{4{k zY330ew|oNi6UQw$&i^fqThI@waf|uC@6@=(_#w!+1>0SaaSP_}2;&y4|EY0{Dff;% zZo%@xaSQg_IBvmyJ2h@Gr7W6}E+>#o%gq?4} zb{Ayag84hbxCQHfYTVNC$1PZ1LB=iEZ>PpBsc}n3n{VNFg@u`K>E;->;C$nTFyDfH zNR3-k<{<%Q!G?6*_%Ev6h(_lb-jI`Vy@9YT&< z_&=t#`$V{23&$&;p{&ovmbHahwBO(4NjXgMUvJ;G39&oJ7 z_5bIA^Y2Vw{uEoQ{5alN130dy-4oX3VtdJib-cJx_6o@V z9Pqyr@}vIyAV2D_2OQh`i-2SKz6m&%@4JBGI@Rw0$9CEY*7sumu7D$-zK-?7M?ii& zu44d4JtF|eY{SP?uKjp}O1=V8?T>r72x5x87yOI&VT?AP-yBp<~<`8Jz zEIz;XTbd6+KkNeMYwU+Nw0V-#Vf=vSk?R1*^PvAe2YdWh3g>q`zsvv}+i3&f*w1_+ zIJYAlS9}Ngaa_>}&eu4u=qotu!S-@6g4yT<{J<$DI;IIg$|aLhj+a2!`W1vr-be*njE#Ycc+ z|NIT$SRcm0c^ttbqxZ+2^u^^DNuN^L{rt|Kj=UBFK;93VhB8#}yAke$@YzL;ov)W4nF_ za4g>s0mt%P2{?`u(%?Lc?KA^$%pV0D`3w}?_S>qBaADs-loPCrr!SlIIh5Q#Bl}o!>MtFDc{t%!ua8r99Qfaa$M0f?m$w_{v^>x(vo`3m$yYFx45j4QCc1Q}Og{*ExNzpQ9t7)W z>Uj`TKRd$nAUN+4Ux`(b<@1pDFC^B|_&Q_q8V!vp7ikYvUc2ZS6~WI4ta zIRA#@iqAH%aRvG(HLm#WjVrLd1Q}Og{*ExN!1|dQS0q2K!0|vb&za(UMUZg?mLrZU zuph>81@^8+rB@?$@_WOF1`<^PF?_F^Vu8T>w@KejNqJ~%RQeWhwlML zp55SmDR^A-;C(3vlQN&@5%9mph)?Qj?66(b)3i-9j&|SOwi(C#=Wb_kE*I24rdxA< z)H4Hc)N|+d&3e%P%XiTAdNAJ>% zV|`e+TeE)TbM)>yKHq`A=D@d&>Uv5X_+kgXvWKo`o#1voxvHnhZ{yKkx}I|!_}zOo z=g0Ri8PxPM|Dv7a;C;CK8{1_(hbtZhc|BVUA0W6i#~7X~xHO9xeg`Y0Ak{gBza;O) zlj;-0|0f2e*kkwyMolCtsn7Fc*%!CP@_#0Hrj>uS?Dw|tr-Wygg+C{FKMQ|B@Ei+Y zC;I~|eB(|A$hGiI1s`JJTL|v=TmJE;3tnL5|4!Ofp@knW{mV!TA0hY{3qMitQ!M-w zDcB+le^v^1qJ`&4KT>Mp=ScrsX5r@xUT)$3`^73Pe3s;&Y2jU@|GmJ%HxsW-0*JD|~<&XD*JijxT z^84c!e0~S(Ki;>(@#KbZ-wOScx^MN{yKjZu)lDTii zeYM{Y2f1&B<%svKuph?zR@e`x?ptk`_pN@(`H(yqR|J_4ISR%VLFPkn-s!jWz7h08 z>U|@ooo)#4UB~tkGmLtAz1jiNl z9y9ERQ|}uw<(_)qh&R39yw8%%d__KtD}u~d41;k+kogL{-?SmjSD=4V^A)E3{+8Z1 zg6$>9d#z7ZT(Br{(TcAYJjW03g@?1xkH6{g%%?;BbFxFVVL z8^^%7BFKD20gNkx%va#Ll;6^P1^OX1Ut!wmhA>}&?Ip;31?KMv^A%WcQ}Y$3-gbof z3Vbd&$b1EsW03g@?1xkH6{g%bwE2oF%`n1SFM-c-JS;e!+FLwF^CI9p#_;dc4WWB> z95_EdNANJ<`@wy^uK<4?@TshTf^GM|fTR9m$8$Y@0vz@G>qu?=Wsc``Dgj5kJHWa` ze9q!LSx?CN@p$I}j(Vc7J`nZvhxLKH=GOP~5e|G9;M+p}vjFEc?7p500Z#+`CcrZQ zzYFlLfZqrBHh@13IO_Q);Hc+4z){a(u)Y!JZ)ZC2KREDbWuXq23$An90oK252mE^h z-VN|W1?P1{j{-gj@^26LNr3MF_;|q4?zw=Y-75sQ?Oq4@(eD2Nj&>ge9PPdgINE(* zaNF*ukRR=C1nUFQ?ty~adQNrV7d!AN>Ew6{T#ntrpXWL7%N%%?Jb%D^u-`jTaMsWL zTRue&+d7^jivo`A`fq}>{$oj*-|pUb;GO094?BOA10NyJe=tw9`-I@Op0y7ACU|}g z`>RFr{F<%*XnDTG);~xdD6;c^CAgjc6L=mC?fwin9@iD}oSLoYF$dn@z_;F+OVd36 zfc@>kf;0bOihg+=@s1PRt|vF`Y4Y26pPss&Y6t!zJeTKs{_b;9 zd7kq89pig)0a1|CyVuV!zPI51dQaxb_XU)&JOAL(R%$h7iz7QDBG-zGe>Ec{Nv`&sy1g6CK`pG!ClFiDIL z_t6}3y>HWRv)^_Re29fd1^4@1HplsU3SMC4pC|oMp@r`v{ntnfj|x7g{z(1oh_wgY4@&0>|{P;XV zkoFsAF>mz4 zZ)yG({g8V8&di6Tp1(7G2=e?Lw!0wD-(mia@cbRt|J3t$rreWx{;nUKzuM#ZJ1j4J z{to+XeEtsm?bP#k=7g7e{?63%4>F8D`27A6)Z4J*mX$`0H=YUm{M{HBw**t|{`o2j44tY^dVMl$Q! zwt)UW$n$qtj<}u;`(b?k4*TKMdNxz;sr77T;LslPAt%GQBFKEmDKM@GG9QBTNWZ1| z5cET8J)3E#8^U@vY%f99vtj;@u$~R;ZE8K6skh0jXTxztGSA=Pdix;j*{~dOJsXZI z@cBFJhg0j>Ou27p>)C$E`HItEToGixVjPSsg3MRo{i6+Gz5@M|ny)bJ_qQ}(f$b&8 zd#3aq!O`3h5SJHmVg-UkUXUxDQqWWECX z;naMEDfbO+zTy*DFR?A0_b1amI1aoX;|Rd{zt}i1z6;=!X`2J%y#W6N@RI;P0RCrT zE5I)Te0RW?0zL%rbT&wVlT5%*1pGw6ZvZ?4@XcX8{z$-&27G(K-v)eRz&Drww_!6y zfFB8XKfo&h-x2V?0=^&M?*qOE;N4_hKieG$cs}5L0KXCNY`|Xud??@>rIBI^tp8}h z4+8vDz~ylQFF(GoTb5sYIKJQ8&rd2M4^bWS*8|IAG~RlCUbpP8$L_&oC~$tp{jjfW zFwgrT|1iNh|3u)4>-JIqiIAUh*2m#AlX!Od*;1d+1i?993Fw~;`6m(ngXw10RXFf- z0e_41ua*3>06!h{;Cgt(uYvrfl;78L7vLKKe}TQnH#R2R4h)@1dSsba?D-VN{kD%X zj8ApsFC*L!zCO->2H^hh>$5w}k>6$aEXW_ku1n8!hn^{bBY&5k8IT|OQ~-{8&L!N> zC(X_)uX7-OcM)K}odKu&hUXg46NKj_4xZ(p2YH?a zcrrY{0zE-^&UWxT8}uO0a{y0<=eM9I2+vC$Jg0*meC;rS=Xk36pjKFD(c;K}ej z0qh3hSqJ%%=S{!|dHxCTWO$AMyFqx~3i*-e-M|NV-UE0tJbwl~L3l27@T>zp$nzG! zli~Rz=n2B}4hPTMKo9a<2zW9)e*!&0crJ4AyaV(g&pQE6hUYra6NKkq96bLFdXVQ| z08fUecXKjgf{Um8>|O8IgWW9ofuW}X&jtJ`zzYF?9`GW-mjYf6_~U?A0sa`^wSYeX zcpczl0ACFFSitK6KMC;VfR6^e0q_$67ufS#3E)xrfr}i9J%aDAlO+sZ&V0!4-&Ie{O+s ze~khE?4Ls!msg)M9P!T)jLWO&Jp2K$yPb!auYUtBuPpU`@aJ||kG#Uq!~JVj#^n`( z9v)?Y0w;dk=Y3ui!hsWcg`cd9%6E%RZg#7aW{~GYi0pD&bv%|-A1>m~^ekI@|0j~x8RKTwS zd=cPR1AZ^y^8xqYx4?X^1-#4FW{2_X051gmdcbD`z5wvc0sjNwD*(R%@GaBL4%_`B z;N1Yf5%40wZvuQi;C}-ACctk7yb@c52fENM&XTawJ{ujWP0e%Z@Tgo&vfcXt9|`#VfS(HZ1As3A{6WC)1^n-T{|NXJz`JZ`c9_q@fENJ% z2;idte+=+Cz#j+v&wxJx_*a0}1O5}>PXeCb&FnDGrvN_z@TUR45%6aKza8*r0dE5Q zIl#XId@0~Vwl_P>XBptf0{%SU3jlus@LK?X5%86OzXbT#fWHiQ?ha;$`TPU$VSv8^ z_Z1AY_WuL9l(_-lZF0r=~H59n@on9m!4=K=mE;I)9i1^6ETe;e=*0bc?5D!~5< zc+QSyhxxn%cmd%50(=zU?*d*2_p0<~04*>i%DAMk~Me*pMB zfPV=1TEPDYc&DAs4)gg4@B+X;27DCYjeyqy{t4iJ2K-aNzXJR-z<&aKCE)ooImJ9z z0bU09=YY=uyb17nz`p?eE5O$Pp1G^pVY^=fehT1U0bUFE*MR%~gTs2h0sLji|1IF% zcQZSje=XoW0RIl~GQhtFdYBogPLHmVYZlm z(0t7ON0wHU6i>|Vn>Tg(jEa&`QzxHAq|UZHBe@P4Hhn~8NpV?aDd%Y663>5qhnGy9 zSW;nB4m)ndxa|H%l}#(IESx;Eq->Q=fS zT%WFx@)Wee!8Pk?<&k)WnM|Li9GpvM8yxR?RVU#BwVw!l(suYjRoX^QaO+Oi3wBr0 zCSI_Wwxt(T-9fw%e|k*1YYVP2tOr7BZvF8ql{rM;uG3U?wv7kes$1uRa9w-+;Wqck zVTS8*J#e#{)*S}dWVMe7+??YN&8f4EN>UqIda9Fjf!#s0g$rz*ZRi43br2UQ<(+hg z7D8uO7lc)vgbUP8B5*Zu5LK17krUjylkh@(iw@DTJDi~DY$G2yRkzXw;d*xEc$@p= z5MBFv^|bOxVjZ#FRU}=dxeK1>q`La0u{1!`9jt|G(} zRh71p6WqF!@PgJ^Bi7X)UwHEmXw_vyU$=r z95*6s9P!V~vu~#KnJ{hY^vd#zY2|&gwA&`F(-YJ~ZBEPFy$NmJb<@Xn^g}`wSL`T_ zSaYelZti7g4<43RP&|I*G`i`RH+&-1b^6e~zLuq>9j1D-FrdD~#QG7hvF83>VB;VY z%)ppd7!a9Y22N^)0g(x2pr927L?)Pl@vSf*GQkWKx59wP1TZj!ZgL+|FnMZ8afPYi zR?nkX;w;KLavIgZ;_;?UcsIWT*TZaGJ^)=ZS=tJJh)gg86Ix+FWSR}codx>iP47X) z(@U~*hE1JZIbz26>BUpZ%SwjPE%BN9{qDe`S^;>sx&v!yJ^=qNd7S7W1Ix?H&ONqx z`k8sdOHFq;Nh(dnG+r|iJMje+4bFN!rg5=Cb|Ax(l3~rl$?=YvZ^7I@%Z;e4m^}6L zVH5aj?Z9EvrwuMGu8@@x-ev5F%HpXLiz_A$EGwHfp_oQQc|iw6t=1f0HIg7ZxNlzJ zF%#C~!#2%O z>H(^4>@vk3m360-h9-(C_j?+aJXGn{_`v8@9$l!4II-CgMvt=<>S*htHTAa6r<`PMfA$UlnPM z2g2HDoeR9qPFcFwDz_*zS8eT;kS1F16va@he4@>~wY5{i+GxF3G)t{_OUsF|^>(tY zYC*~!i}kraNw-)>6T&Tca%fevPjpF=jDg^uPsU0R-z%=+?kj#-b)MVz@uvkvD^K+% zslw}5mHO8PYD4u*fsQvu)>^#lCM!j47Ps?tev7hKjyqwy3sr?f8faw|4rwJ&6^_^0 z7FAf+s?_Xo)jD2n=#~+$!aH7uTdtIM*EOXI>smvdoDyC*9W=O%rVEq041G<(TLXP2Pp>HE`#G+bmhf-`>TlUg!mJWG$x*N4UZ3!b`skM> z)jAioTlW}nq^$d>-B=}X(s~Avzg}DWg-NadmTvq?jnXp`t&>P_+nK9?HL_~cd*|Ww zyXtM*A4CgB$4^n@!n`pPOWl~*0g?g549Vq*10Ht4Dd@1)AUNDTm`fZsn)y5 z>au?QTEykn9;8~F7~}36$B#fNlN^Dlqs_J)f`m2Dx-m#tD{(b3JAM$N=yY_k&NFCm zty;I#25RFQc&MR?;)1ZF8%0Iv;Z4hdh@$Zq9*MLkgSeWR@Zddn#?MK#O_%Lzj=wIe z);URO48P!sM5#1hcM>or^q@zux7(!$>*|H`#mQ4%ewnuPm;poKfCqToT&i3pNR5-jPnG#{|a}^P@||)qlcn?{D z?A-$EuX~p27E*R?kH1if@A|#*@Olp>jF#3g;L569)2!bQL0GL%b8DGuBg3TK$3z{9 zTgy`!A0_D30((@O&`|1kD1G)ovQ1p74h91;RqA7F8p?XqBraD)*sCY;w>HAIlyI6` z&s4cy30bZ#rn=@^(byF zPo+S@_ttTZf{D5`x0X zo*Es-TMDi9Xl^xASCwu9sxH;7<{IC7gl^X^uf{bZPjjo8dS;YL-4Tw6-E zy1nRXTE$^KwK}xBTGCpN=2kOxRq8gN>Qdcmu5Hy`6t5=LUgGsB&9Ze(yY;I1cqwGQ(DSFwo!38G`B^0IaJ3xJ9JHOX!hVFTbH7v)dkj)N?R6K zyyiA5uz1yNRbcU&m2%{|VD4y{Ki5>2j0Dt^{0j*3vU8@+m@>Yk;`m9071Jh^OrJij zg8subG(F9M9fzG-b2<*a`1@3Cv2LO*iq`8F!Z}KNKS1lKv^=N8PJ}Jn#;@n8czPYF z5yZ3WP>mp-UPo#KE!q8AjUc`{b)+`19(FC=_p7u}2fOxJ4H~+8)7f>977$PF*J=Pt zkJXV{!20NQfF|Ie7hk-;N&|JVist z%)y<0xRc%AUbSNs4>_?Rsy^ci~GsQqbq^n^2I|MaOd`tV;>(VGu>Su)QImz0j1R8c&ogw}mmOq)?2X`68J zoJgdrqAFLgG)a%$I1(A%DH7={`+n+@&zF2#g8YdgmNeCPLV%2g!~dkJ|~3yaz*}-5b}+R{GlP_Bb1i| z`tPt1^4%5r0U_kG6#2tL$mc8aM}&|sQsj>eAwN@*&kZ48tH=)wA-_nG9~45qUXdRh zLVkrJKO}^FlOmrNLOyMy`1*TP2>GZYKQx4Vjv~)>(m!wbsq6evsK^fsAz!M?0DI>28A>?;a`+aJoY~;L&(=D_E&|FU#!^wJcRtCiv86gDz^er*W(0!9A2 z5b|Rb`R_x>PZW9d{|_PLFHr3N7(#xoBL7ne`T2_c&mrXN6!~=_SLAmOAwNcu-y?*4sUqJig#1iJJ~M>;Tt$Ar5b_HY`92}!7b)`DA>@}R z^8G@{FB5qjzaJbze!0kF|Ic$mLHn;pk;n7@AtB_yQsfT}As^W^e*AG*2>C4)`2iv1 zyDRdChmh|n^4NbJ5kkJ7B0n&M{18QcNC^3niu}+J@)H&LqeIA7iagf;V?)SaAo5uM zj|(9`U*xg=A0I-#PLbz1)u8R~Zbklt5b{eD`QahtpHbvTgpgk@@>u^zhLCSi`*O@_bJyDF0eT z{;d$lzd(_n9>RW|$YcAd3?YBFVt+;m`TG_7XNQolSL~k?LVlTIe`W~zHx&Elhmilb zV*i2=@{Nl93q!~^DfWLCLjFg^{zW0=J8u?0{^fh3LEBG;$O{ec{@ukP?xv`wTk^KLdf5!*uOG_{6fWkZ3y|riv6oX$S+asUmZgJ8O8oJ zA>?0D?9UG&ze2HpZ3y`W#r}06^|Z`+o`{KR~g6a|rn%iv79}@`Z~1TSCZ>QS9Fu zLVluR|F#hFWs3cUA>?N&_HPd%U!~Z;BZT}s#r~Zk=C3HN^E>y(0fm2>F*3`E5e*U!lmShmikJk>4$Ze3K%-a|rn#75V-lBt3d~OK&LPdUX2>DYK`J+O}mn!lFA>=C+ z`C%dCs}%XsA>`*N^5a9uFHq#ihLB&V$e$8Iez77yE``8(`F%pjXDIRqgplv9$nOwBKB~x{ z7D7H#kv}Pm_G=%(IMShbI^0kWmb|K^!DDnq|kgrqZcM2iDNRi() zg#2Pfe(MnOOBDI8A>`{tUJ`HqeY|r0vNH{{3698e88hgn@0WbR7-BX!FNPkp!}(n zl<#3?%5eS1*Ob9OAN%+`!ZiCCLi`R?O53*m%Lvo#&lUScBG1oneM{T6{UwBH_Upy| z!6NS`w*C9)2hDz?a{S*>Ufcd^!ZiDlt&PPKO%nUI?SD$YX!av}8vo~uBp?3|v~An( zLB=)vMPgr;kvi@3GnJZrxyZ{h5U2bUhkTXDZyS>|8}{*+lDu~O`EvYOBG1Raj<)UN zzsF&}PV66>z&<}`tJ$9^_Gg0qPL$WS&(EaLC$f>%epZQn`*=AohJGZ+7@wP3gmkl) z$bbHr)Na2`ivK#3A)7zn6VvQR#eO3H`S&Dk`%!s-3H`T;V*hQiZ~JeG*iYoYgQ;F< z{Hp@`uP@1K<-b7qWBuDq;s1Mw{knkuo8z#*O!40qiv1O0-}c|Cp#GzS*Zk*q)QRd} zUy|4Sm)nccNCf@2wZgx~VLvJbpQ!#_>abrf_ObqDDE8kG`?mk4ho#R68l*H`Y867 zh<)3CQ^bCv`nMy^Gi&~<3g|z+&!+irh2p<#g@2jDeqBKSo$j!owy!Ba^xuJs{fEWA z?Y~t){YUczn*So(1?&H|BYDk#Rl*nIPBL2^xugN`(wmD)<1rK zmu>%gv2XitRY3oJ;NTzWW-5qOW2r6i^GE-2@L#U@FIVAzFkPn;9C!U475m4=ESn9x zKJ+Ddt^6YL0uJ=wAjSTrV&C@P6tQpHW3CuJa`3MT=)drRz-1 ze{})I{#&H@kKf;A+piY;w*OWI^xr2A{*mpCmlM^$4;}oY`^UFmet(zE|8Oc` z&3{p`pQ!%jki6!IrOOdCh-o760-3i){N>iGACDs{;COje~z=2jk^L^^dP}H2&p%;_Dy3 z|HtNk6pd3g|3$@qqWU+GUlq`QO%DFu4~X|4 zzkk*CUw7Qrr$haLRu z75|;4@ZXNc37Y?+-Hq8q^)H>|HUBj!{wq@KPZayM|E7q2`*@ivhG!l8t3*DL|LPt5 zOS9tZ-vovKj&z>W{8tyyf7_9~=D!7Ef2JHP-+w7l?3apt+kdM9`fr(oe`H5vIFbLJ zcJR;0j`ttmYqHzVuGCL!{)>wJMD?#b$!q@075nJFGZg!Lo@M*C|E7rjMD_0<4*pdE z{r9|s{}RQ2e6P>;-yYP@X#T4U=)YY_Uh`k0;=gH%{jkTF@b6CLtog4lp#QcddCh-0Vjul?u3~?r*th++Dxm*vaqy4u!WIg{ zO%nUI%i~4||HZ;TUnIHzzChvstb_k>vG2Ecp8)$B!}kvUMIt{AGt;)s|7!>TwZgwh z7w*#ady*8XuM@6{g*AJfm&-&(<$ z|0N3lg%10<^5SBC<`skOzndNQ8^wNu95CCTt=Ruq>|16cOLsF?PeS9gZTs&q@)KkB z`h~3BjUc}>9)r!lKgnzDZ&`oizZD|P{4Z1ZPZIlf`IkkFAXTpx!J-qn)xp0uYQ%WX z3xm!7CI|nzgAM;C5oZ3sSNOl|;Qw+DBe*LXr)`T)WHYKKjM??KN#yyNO$;{w&Lr>o zA2ZQ*ZI0pJDDuqzax&!i2h?qQ;aIV6nTgElX@0lIZ#Ms1eg2k$I+5phUShEM-{kYR zw$4*UV$E>rcId zf73w2zdO}?4qX5LpzvSi;NNF|BbTWD>_z>oR)2Cu{(%Jidyu^5|Fk^AAKUMZ3jgE8 zzFmL5J|GzX%N+bOvW$Ep{+BrTHw`uX{e`vc|C<&5e|7MGwr?>0jSl_|B0tHfiGADk z=K~l2qYeK>BFX%3Rrv2l=Si*n3lB7cYZ8?IjwG*@|AJ$TeST*X2e!XZu|Hhw+vPu~ zzmZE+f3J7(7x_VC7lZA;s~!B)jx+qR{oSeXf5O54>O+F@U+dssC-TD+@c+`mKYD`U zkM;L23jb)-l)vr&H3Ne2A1m_q`9E^Fk*}fkSs1M96d4)S&;QYphQI$FAg({W*494% z-$e2R$BjQ~2N|m~X?%mhF8>8l-G17s#(oyf&vIb<{QR?R|MjT&&&$>Pm3ErhKH4fj z=89pb9(wyLDmJ+ev*d05-AJC9+ULKVX@-B37-Rl_BjYyz5n|si{~IS7!Az0&6QkAN zi$sod*v~AFw|~E4zuIB{8L>~(8!ZBSxkMTammfbrZ`&W}u%A|DOeE?* z=Zd`Tzo^Jx6=P~PZ2!%2@Lw>~@LweI%>Pk^|630J_lo^Q*Uty-skfhck>_`&V6gdT zk-X;r+;a{8#l)Ed^M69&KS%7_?Pu&XBiGv`v2Rfq+yBVHzgFarj^#8PHvjh={F}}* z{If)!`9G!b@7`0dzwd~BzrOi2Z2qG~-mX7QBLA^3D5=f=dWU>Nxe<6df&2=G{Nl5W z;FAgDck89spQ;KYSdu_~N0RSMdF=ipdOo9(NWS-N>d!L8|0jrjyZ-!7?A!jb{eP{4 ze`LBboT&cPI{23gf2=<*D*Tr@_#Z9y6V;zB={l8<$*w;|BLAj!z_vd&C3(&N3xt1E z5`)a2>ypiXw%E7*_u5^?E;Y{jH*@E_~2UnTYne1{8T zyZw$NdCh+d#6J43QL%ro*th-n(zC{3BLD3~15C|-8P5gtUpJE1_%E-C_aFcNnC}k1 z|15XdFB1EwZ6=O$`0q@I{m49HAIIOT6#L7>zU{xqUoi&h^w=V>uP|iOJg4TrCXr86 z|9X?W=D)?4$NR5I;eVOKe(rL^@?)ys80`9YiNk(_*vIoP|Nod>ejkZ_+kcrq7^{iS zzwbHhH(hOxzn1z94%~lyrPv?T$N1m2UoZBbH{!8xE-MW8h`inZ)&6L5B`Uu~B(IfU z)phaZ$NxWO`)}g|^!n2f(EiU3`->I(-zoNwa@f!MDcJE3Bzf)l8x;He|6}&?-{i1g z70~_yhy9G}MFN?B^=>*D3aorU4GYap&LY&&K~ZQv1MQx8FRH z*Zg1Z+uy`UbNlH;a~byW|5@zY?dQ?`m{lZ_sQoT<*sr_E_#fNv#)|ze*?RjO$q#!` zc)|N_{xWFue!0lo?Kir=$$5NpR&UGp-(Z2vvyuwNd~{*w;-MT-42 z#s02+_4-pE(0+H4*N(qdvA?-uzsO-fgCCZokjVchJM7mh_P12*Kj^Su6wv;?4*N}t zeSUwCUH)6qeJ(yyyZ$W}`~UX5(EMfBzciB9{2#s5)W2F0<@TGQ*dHSH?e;tG0ONmJ z9@8Qiv>BS`;xF=v<{vI|@L#O(-&W!OqJw`mKdeY$mu9Nomd$@>nqXl}y17{H#UkI; zxG{#?{@JRd*5zss)wtHr)u|5oygc_{4S z6BQEHZls#-vodD4pNxEyGZFvUB(L$WyW5l>^5^%5+5ERT*x0xE|2W3jPsIOjk+=Cr zPYTBWPLkL7k9i=Te^lY$BS+`I<(a|w-zoAo|E#iL{BI?Bjeo}D@%;JydA9#|r3+NH zWcz=Y3xn}rDDpP{+}{P`e>2Hz{Fgl!&wnq4|4xVM{Ci&+jQ=enZ}TtY#a?W}kvjkS*MsrT zBzcX0LsL9|et)IS|3R^D^S^;7D=8%Me_^i9zwX0e{Es1djepK}@%(cX{_lu=oBw${ zSwbNZ{}}^y{#CMYGEx6iPVyT6+D=_O``G^+rtn`U_HF*hbfL@?67@ef4AS`*N`pwm z|5}pQ_&07A&;JO8|DJ=5eVhNzJXj3C|1pub+i#R#woD-r|0N`^@z32Rp8r6F|Ii^i z|IhXc#{YehxA`~m%en*bf0yJn{tI@B=g z{AHhik8;RY@t-AA@YhlM8f^K2B(EKR(;nvdGfm>nf95O4zfkPk^)IW)*k9lqmXvK_ zxY=R9yBNm#o1+!`>m2r%iG8^Yj+r#QQfxOed8qFH$aup)(fq+glGpsVXg}k)EHTB` zFZ}<(cKvzWVZSh-{f8X(S19(6SL|<>uOEM1K>O(=uN{9{@A%_CL9svDVZSM${SzGa za}@g{6#I8O?B`CP%oGxp|D6u|rHcJgiv5j->He=3`-!eUe{$GgAolV4^F+n|Ibwe! zbGTAl=~*}avr!6(u0MZr@UNR;ZzaD=ig-x`FfFmrI#;hQd|CMlGl!Z@o01Wxc>Zf z<@ooe4vx=>_VL&L*YHnt{@#P+HTw(38T)wto~+oP<*=XGVC?fV%NVTP$mb$&kN@i4 zGxGFvi(vcj69@my35GwOzsnT~|Wjx8Gg9GWHXlzvqg)-F|YvHu8ziAG1ha^WX9^!ynJz=PLZS z8KLvvq6-a}DI_|7+#~Wf|BOwHe4_KmB9hnmXU>S{&;S2zmw*3}I{#0*8T*OOAInAF z=HIlvkx%6R7fD{@Uv*(T|BDps=Hvjs)gZaOSAMB)Ft z(K`Pd_{H`V68XRTiAH`CFL(1-U5=4I$uDsEDWf@yx3w+Fd;Bdti(f2GVGMERz}J5~ zB=yz# zetG%7`1^jk(7`|FYU97|BFOyt|G#}XAAf-4nbStr0Yt@qSKqLtw*TH1`He049Fe#4 z`}TdcuaUgg{tAUZmVd3n|2qf&Lb1QIZ^*&F*I0A>Hve*w?{3N4{G%kV@vjp8`6AE$ z=l}oq<$b*;h<)4twPJrq%f9W;^Bw#b2lW5h4*ts&|MMlG&Hr`>|9Y|Sm!E$aQGY|y zj~x7)0{Z_w2miH-|No%y-}@wUOm_LF4K^*(KVF}=`Ly~gx^`69^e?-r%}v&FvM z{))tY)Hf`ty+7W;zbYXAQyu*0D*XBXzy0I){c??if1TJ*)c)RZ@Lw+SIo9#}_I>yj z2mj^5zeqB&|9MKrm-qR1J5{eg(IKY&4e*w2f!4AGXmkxv}_8w2wH(7}JX z!v6_{|B>VM`V-AJ{!hgJT9LQwPpQZ!@_#MKYyQu=KED1urSSjE!M{%ICp!Q3o}kyC zyH=VaET1t@>iupC?5=&i^8x$p4R$yvDyt;lE7b-)*8^ zf9k~kkOchC5P6$_V?h2TB;T2AJ|2Gu=*E{&viTy?RSpI+x2HfK>k%Eulc|5kMZ^A1BL%m2mk1C#{Y@x&n{=^^`}(i6ZwA!lGpez zR``FU@IOoJ+x4eT>?f)}OC9_h1M+{$!9U~1c>jN*@Za@Jz5Yax59a?0k+fm1|_7nMk*D}5SGzR3~o#ZwC%N72s75+0F_M?Ty|50h@e&V-( ze}B5ee%4K<{PQIvH|H-D`}a8P=LWRD$YFn`V*g9U{wEImMPfhKKTt{Sb|_+e;zPJFaNrL_V*=ut^7;>Wc-izzg6s4JM1?Ev_IQnKjY?j``;<{-*?!L zo?z-t?|ddv10!!hy9{}_UAe5 zM{bL^-$k*%(qX?Yp#6^>_7^GkH&yHpE!X|u5YYZ0lGprSxG?_sH&g6i?yw&nL76Ee zD*w3-`)d{ZTPXHFa@a2lX#YKj{kq%ZkAEx0e(qVi|LX$UKaAux|L5NkZ$DkJe}lt* zLqPl2I_x(o_PZ+fzjD}*j-<>1%73-P{(?K>kAGXm{$Ulm|BC|J?@#iY|8p0`+vg== zcK>&+!+u>r`?U`Hjf(vp6#GpM`wao@f99}X`{(%M-%+v8@7e4`8x;GyD)v`8?AHaf|FOgV+`HnBe|N?HQI)#?8v@!N zNb;Khv+j@8uTbposo4L)VZSJ#{cjxhtL}+E{$7gx6K0q` z!LI*xVxN7B!QO95QvQmwle547ImyYtn56vZnaSDzI!XC!&P~pK-}91_U!J7=$>%3$ z|GOmRufHHU`v+Z^ocwD^%AfMPg-5OZYe=5YNx2rD`G4m8hwqQ& zCE51)cd6Ll#*(i+kup=rVsa3Cc|U!_Azwen$ZrR-yvbZS`00BN`38}XdbyjweE<3B zS0ZnpzawLfeV?bV!QNj@^2{Zd=4LPy{nhx-pC{z`Q(lte%lmkAjw!z^6sGMovA>sv z`|kA9eMH{M7U?7MHtx&$_#q^}DeYMFBUvIJ^)pK9^Y`Hs#J(+GDDq2s_&H5#%NLNm z=f9TOA~VH*>zmQfCa1~ge`h{o z(7|+n5`*o(uJofO-}qb?Pi#CL9|l`~c**qQDdlA)eI}Hb_nCG;G%MO1%(nUN->;wd zL*Ik54$SV$n?;*nlvi-nMxA(8&V){pBfP%A-}h60EhO*fdSGs(Y~wRGW-bjBIekyk z_a*&+(hn*AkK&e;VJnJTQ>0JiBZ?nWY^1mi0ozjCPJa7@uumy|MzK3#J5t<9ep^Y{ zDvF;|+>Nl^DMsbD)r4_h^##SAg!Q7hm;APdurDcoMR7C2HmA6S{Ps0r-%$LPVme_N z6uZiAYYF>~;`bE05w<X%ZPZW11jGwdHRet-KuyqvqV0%#9gW{g@TPI03 zqLiO)+eG#^r8G^p_og(H;yx7jrO2;B<=2tYC&I7Qk+wc%%<3vB7GtU(pNu< z{OUe_{ocV8x&Nh4?-6FHK;aw!g^IEdn4ibE*UCz3~B{3^Yn z6#12S!zdn2kv@^*>8p_92^9IiW$GzDNs&I05%e{Z;wXyTZce1gue762WGsF0>*-FW z_z=a1DLz7RIyFRo#*$whK)aDs=<8I9r%}9*;{6mKpjbk`Pol`rGt+Kl9DNm0ET*`a z;=L6AM)5rQ{d|i2+#c;l#?#jXiW4b5Nb&C!mr&&AdZ$q2=WA)#`=9nnv~fDcdno=N z#lKR#n0~*6;w;HmO4wwIXHa~U;$svar%0a&zy6M2VK;^1Unt&1@otLriA<%hX%x#T zUP$qG6fdGkpU7GCRY7q&#cGPbr&vRgK9NfLnnCewinA!rrZ|TpeIn=3*G!7%QoNMn zWfbR9q)+5L`Z}ND1r)0&UQF>4iu8%hqp!;;UP19s6mOa}K=DqBizxn? zB7MC7_j#H&o}u^;imy;yPLV#5XX)!Xic2ZJNbx0#FH@vXWEp)uPw@qcuTp%C;_DRY zO7=gebT!2$+5dvlHM0FBrC-VR*OY!k@mtwnOX+tMznA?VDE*P* zPqP0rrRym2$&8aul=7MY9+&WbXG*(JzGG2rTiYa17-gpO8ZkhSoRO0^iYcYt}o6%fYQS$^1HKm|42%6 zDGrqVL6i=r$nSRI-}5LvisDe&&!==4#iM2a7)lE$9xMCDQOfVtDU|&aC>>65gzS%` zbQHzWvVS6_{7mRr+2?nfoJ{c)+2?nJ@PDq3ll>w}iz$wm{dtmJPU#i0eWj%QeBM>E zeYK?5P&!|>ua)#VO0Spg1(N=O(i>#^kCNUf=}nUUNz$7ot&{W?NpGd}HreK9W!Rs$ zQ+kJN-zn)LO8+d|{7eVuyNlAhW&0jU|BuqY$~HfH!1?Z_^l!3#pQQIw`haXdDCyrR zT_W2LN%}CQkI43;l0HW1cLrVWA+aF2#F{O>N{fVTXQu>)}uatBZrJu|8YDt?Y{X(|aNcttE zU&;2@l72(!x3axf((fq!UbcUb^hZj6lI@=*T}LSooZ06*g5`80O8FiyZ+DiI@40Rw z+kF3%e@mm3??v+V=92Qg!7XK*@6+*bTT{yS%y>IPQoe_^jcoJ%r0rz88>RfnKIi58 zEd0N#yuBl(JIOZRf7nH~`Ch)6C&~87l%68nr&4;FY>%gO z0!0j8rtkKBe$D8#{OYy&)jKq;+vsWhm98P^cZ7I9yS^FW{eqgIY5A9X*KYaMn;tu- zzOqNvMO`ELONV+_o|W4UtBDj;FU_yXO839kNNk8HF zHR)qsT$A3lpl4Ifke*G|n-E6AW1c2#NY6&X8ml`!E$w{HYcmQ&`BtKw@{i5UA%Q17 zfx4QJJ?l72_4Z`76aSbS`*8tjTR_?-`SpI?}QMb=j3(k)-`7wLm9`=!O=l2 zCXLXS?j*9R3AZhUTC(=%*Rlf(jhM)y-R$(w7-n@myuoa7uTo9xf|z6Dhl2{_Xpno zq*|$ek293N@ytfa##z1K{VwMQ(;tn>ul^~nKgzGUC?lUL<91aSa-WoE`lL2k7ts$Q$6K$;t<`OfPPj?=O0p)CaU-xlxNOCpo*tKHC3Kg(3hX$oAU4f&-G!} zN@_ZrHgdhrpY=={pUTs=pc@A}@XZ4WaD38!Onz!|+y>*?3FOaD>HqEdCx6y+(fnCI zA9?ms=?`u?tD#f%Q~4MFypCq}&+e9A-IU)e(zI?}ewT)Hnu&dF#zs%qF3F`@LISy! zz0!9dLYtlH^ACCMoVEG08l!yP%AfVo+WgCpYV^kgOQMwj>GI0bijv}qyTE+TtLZ51~b49|DcN+(0N_A!h$8efQkRu$q1=^5=Y0c}_v~$KF8| z)a0erZ*V~)N97Q7>cCUH!9%UlpMGT}4gWs7VNxwK`|N73XQUy_*+;N8 z45{Nul@HYis)JFk7ODE?wa?(~r~Ud*E)G}!JT}%pA0O+VkIldQ!a}cKpp9IABg@~2 z`Wxod!PgvfNx$jiny>#__T%Mg9trs3<25E@6JmUFC~q+#Ha@>5k4{0}MJmsVFG@+46M4K=Z=v|nFa7>6Jo;)x-{a}?oA8GFrm4Lopw0MiEwAoG zUl_Q(r;dj`;&)`J@*!uW>YLm@Xl?t+;+Z`E6go6hx`soj;~wgb_$#%pp~9Ci7e>i< z4L*U@`PFptrH;bCj)=`io8x>noIqdQadYYLW-ZE1;yk+Kcc*{)Y z@Rpg)@uqV8&XLD)+-veE&F{sj!%X82b2`NqVc@8NBS($Mul|8=EELq-Sx3JPtEucs zQ~uwi&*mo{2GS)eFE6;_1e#!ZBA*a*uBd)?skbsKe`#(SfsumCi!x}NFEeTGM^;Pa z5tJ8YXsMalmI=n@3_1BVe%{=sbtIV=&95Fz>#g!=2syZWe$A{pl8$+4azV{)46vh4 z9X9KNp4}tqvw5LBUkZCX2GT|*S#B=W<=UUltz{g_O#Ms5sz=pptSs@gFUsg8aq`F?wy|hBz@Nm>YQJ*QO!2=TMkR5 zcO9Hh$B~;|KdE}~7%rNVsZ0i*>d&(cq@@U%$6j96Gb4M|ociDOEvV`IIjxXNpM4Dp zdp8Npso5(NFLVCV&it?p4cDLTbV%bx|0s}?clI~56~qhPp$?=~DLn^LLDLO|)dOn^ zdYW4bjARYFd}L3$sbCC$@&nx-Yo0GKR@1K>$@dp#Ppai2NTVXSg>w0x`(!@t@QF9S z`svShk_{=+2bCe{ObRDsV|oile@4*k)eXm9;14lx7il7ypkRX8?e(q zJ4a6K{C?+1aXM|4N3ZHak1}jYFFma5M78pUjp&)Shj=~d>-_ckM)a1uFE{Q(k4tp% z3Y2|HbtTmvQtctt9!z6MwFf@KrrJZQJ*3)$caBVrmr~=U)Od+H0~yVx+C!>6v}_N2 z)e?8Vl<)P(_5QxGE7_=jy}tv`oSKz&-Zi^_8MVIa_+$L*_+P_b?BYFkRGa%pRk^9G z%NRw=_h{juznIZm3PS4{XTMf?c+)zXai+C|dDRCN!a zcm*#txGT_l186_Z$JR}2AGF@_|FQQa@KF@m|1*;W!eJ5-74IYj33tLB(Up)yW;7sj zC>|IC3=$1VOeTOgY(SkIBY3-uy6EbvyX(rT>xl}YfUE1`waa?!;%$rv-gxr=zSmVf zZ)UoZnFQRw{-!_B>G}5SSFc{ZdR6tRs{3>pjf2_!Vtet<)I6?gWO$jj;bBS&@gHS+ z<-vYrG1TR^ZLjqjtxGAev=(`xSXz3abt2Yi2l~dlIy-XhbYl&#AP>ve zY5vU0=2v`zFSxV#coq6;`XC=$jQUKPvnYG6Hw903YBH~LRr{~yK`!v;w9&2(=M`}d4bnx1g`mVQU?p9<`S2y1asZQcb(lPoQTFdM9|e(Vw?;>L&6Y~RI$YKHyzX#liNqtBlnj*qvST4$XySP2owolK?0ycKKFuvlSN697 z_E(|puQJm9yrH|6;1RMvG`{WGpT#NG{toJt{b?DHzP3M_#>iYg!O8rF#G2pP?VI0M zumCat;B0>fvHkTZ{E*G>32iimAGSPzYi)gnA6mwD3oy(0rfcJy;$(d1X+F@iI-Kke zQ&YlpTQ4BO!W+Q~kE zg4ns}VDf&Lm&zQrWl=Bel~pE+-cUB2O?L4mU6h@=$xgL}UL-AaKR9Q$&?)R8j|5w_ zUL@=%wT);yeHqd__{qO=(I|cwt|32}FZ|@*mYt4u@{M#;U_IS zJsdw`++=@%QEu|A_U-f&7|T5DzjE}Ck@mS!+ZF8dAzVk>=kI~V;~X#0e8?iKqqFuI z=^xLsY&4T?v`zn*dD%q};K#I2Wt<)|&UwYbqkhm9x=dQ=zS=@3vxOeP7E0}_-HvP9 zXvaS9kFd|Xcb|P8Bkl7SPWCyVL-zR@j3rL{+^p>i_PG|<(e`;euz2iqiRPoNQ@7vL z+4Kd!=cNaBfAjn}`kUW|?Q_TE=EEN>9ybf^ch~mq^MVV@3cuv`+aK9}Z;Wcc+xMFX z3crb_9c%GlOU?T)CW_#)&;d9fz1B^s#Z4RC#leZ+l@{I44g1B?DEDWhoRxRMaYWwY zWuqkj-j-b&`j_{H?Q&M$g?B~wFWYM0kyUGsU-d7uqWtFh=$%=84Dy>KrR_JzIoai* zv340p`@S7Ul3@G(h_)-(=U;FgZJ##)^M%UV?OZl$K9Tl`w=zVIV!Mam&%tr6VY z@srUViJ#2cKyj0=qv9r57LgB$?2t+NKKNB*$;ji&pN4!Rbx^QzAa-O8qnr-VIqilW zV&O#~;oPp&>td{Z#Ma89aOo)jF^N^Lvw%Q#y%Td(ZTKYbYJj0?U;NKn6? zYLoQ>B>d#}X5(+Roe)+gWn-lhy7;1+K`exX3~b^Jzwry8f|vC}F9n`?-wD}GZ@9ha z=UT6{*x+6ICY#{W4c1F70{cBYo)|Rk7$2Ao`*6SFE!s-&vuMrMw&`u|JzpCp#)lDh zIWOq3Ow+QJ&KE)LG$30CkC zUJy%BDYzMe8()M!6-lNO0^%_e^`8MQe8AkoH0ULbHBaiaB-}5ye zeiU(4w-3*2d4ao4v?0|>8-xpqg7|=Xv6aq|l#czrFwP3475vg0T5Qc?Qd(J{LZR!TTdo)fUo=N}~=ge>E0B$x`uS*e}D*-cT0`Kc~~;V8oxf2`&%K%}e)T32T;b z5QT7pFTh9|r(uexXI|#j>(HMa!&}fdm2q-D+TDh}KsfN)cyf90Jrse8yN3IBUVARK z^%06+QyezS8+=)}xmr+ED0;fEUjn`(8^x)BDxd% z)AUy_ytMj5+P898_T<_?b``z%e}TUy;GcU~Hpw1YKVC%r;HBC#BXr~?9qC2R5NtpC){~VKKCg8{g*3h#Dj!>p``Hie1r1Qf@<|mi zF=T^mA)BzV^eC&E$}AgBfXid7x49?E0~*Dn&2@XJcvR+nXvHxdiuiofdXKkgd*g@R zAXbkPr);8SLk91$%Ff0Ud$O~!)Qg0j!34>>kSS&^zX4Cs%|7KQ-#)0v<;|mr3(Hd; zoJ)Cwy%AI%98n&elg`tRI-fdVWfu#$BcO8=Od;V!T^8Ev7sGhRv+?30-Rpjy({Cw2wlPljhEPyWMv}SgYh`WSSsuc`kDp;3p%Q3jG_swzo=f|XfbaU?l zZet+?x3DCM_43lPbi9PRr4Gts0muVjEYf;_@+hz;^u!~53Q`UaI`sMxi+%%JLhGLD zSL+xUEA!Q6!FB32ODSP9#8rWXY0shlwr)~#w7x8>~-#Zs;@=*`3 zpw;(xx^u7ZhPUXaUD?g`ThFjtaqa2(aJuX9l%7weyF#fcp>)?}sUX~#+WXJlT-S8L zgEw|5`(?W8!!Bq-Hg|<%x*|PxK?kKsv7|4GX%GeXxby=O+Z!a~4wmP6%TZycl;dh9 zT7|0 zg62Z2m!2|OY7cV%C%=3nhN^k9L^-D7E+Y_TE_*)PBts8G(&Z2%<3%np+EJh7<4f!$| z;eUkF+vZ*R1Qnp=(Kf7{6dH{F(D~`Uapz|R))%AUCE-@g0x@;*?_wMEZ7O3|i@@AE z^iIpLkqMcj7Y+ZWwb_z~{27|W*g;0-GU`uv$e$es(=QJlgJ!3sPx*k&-r#!gb6@+4 z{$791q~%Wq&?@|crNhA5mJZv2psK?$y0^QDJVON`mq8556#UEU?f94V!oS%4zXbs2 ztvt4Q`Vfz==<$WKCSj6&Sp!6*aeI02pO!4owRoR<&s(%U^WvGfbxd>Vo*3jJ3_xSt zmJwmT7IkE?2YOMFxBM1VUzTKh0(ZBrLVr{BKU?4AN2orMx9X-Z_IC75+Er>_1%Khq z!r)pf5Y?blshuX_&0`I3}eoF7U#7_a3^gFCn_{R3U~e7`aiD zVi*`jMJaT@MULm~@fq4K#0AAp#Wta4fuT#gA^6tDi2|A9oy?V%U-=j z&(N!sWk`$9v_?<)dML>lbxl6WOb99o2~bj{u0<<`VR<&u>Ij>fO=FG?vGm)MVm{@{xDiAexu_c@4_0DtvOm6EGvhW zocYn9EU14w1-)$yMXvGy+Tb}9AE-!~Ay@y>ASQs>ldjjO1 zaxL$4;mPEg_O|jWJQF!4(jK~KVHH|^&f z>t%PUmrNq+V=HL|0_!TKbqIyzXP~jFK(=f0@ZFtjVSU&lw?8h~J+5XvnUdU0aXwi}e`SKfEbm6#a~(XM*Coy6UsD1GU+s zM-G`?708}bOCzAg7zkCK?nfNTs=t^hLWJlsZep80$cku-;njV?w=KO`$)MGO3sRE3 z&pqIG)h{&)Qm-b{p zD0;fT{-;|Wg`>GVexmuX&1&pVITx~isCquHy0$V^*CHm{#bZI7+*KlS{u zGscNaz2s>?YJu;BB6U zo%2?E(efU;CN%9|^qzX3=nZIl)98zV;UlSUSW;5os83eN62_CXZ&Z(@KfyOblm6tV z;lHhSh9I&~9_p`Nmvdo;7|l{VJ@{>cp@Q(V0|qkzyy$(3iWU^*M#QD2Ac8<|YkoXX zk8dh@2dwutpS`2$^{$!AZ{>t`W@TPP^OxTBAEy*Pg}71ECbuv6wePtWJAU<9W^GTX zq4ySV)8lSz(104&XZebrTl9`M_ze~#{DA41m%suaQrPTuKkF^}7rnF=>gi&K1{<+P zq%SSg$+7qGbZ2F7tIKh2-Nbr>gCf*C9wB^$5!T`VMoeB!#$@p0jUTk$5}vPwUeZY~ zEpN6TH|WzHL4y4cz(@3QA4zfj&iz*?{s+&=B)xr5`%Pn0HE&IGP&3oL<7Q?x6k2hL z&^U?)V9u*6Ud^ArGs_z~cL!&L=hrrs>>yV3K>dqWR@Axx5HtFyLeX{T-3{_&Bf|BI zbcAMcJsba{j-)(E{qX*wPS_7`1Pj~rAuw6k;<;IY91fdaI7r5~B4gX4Hd=A_u+xJV zYkxi6_MJU=dZ01CJhT9d_&y9ALeYOpup3r%TK#_I0<17idC*T&pd4AlYqiM!t)N$U zLQD@KP=)r{165|&AS|xTUFUXPm_Z*F$FK0g{qdi;Klg_A;wkpf(eO5SOB>KisyHB|v^DHHuQ{`#spJ_=JF zcGy&ZwZF2#Us@Tc%pY)Awy$PkWp&lu?AkhiJ)#`7HQDp@bU~C0Ik_ym?h~s<6T&yQXo$Y((~I=Vi~CUs+S* zuSU4l8vm>HSUj6bA1SAm5;MKcSLNLc3U4q#^LF+Uon?9SeRN)a5&SCDCp114Q=bLF zWfn0OrZnHn6RKELIWl-XU+$dZ4K3pylbl$s#ysJ_>@!T zia#)?WtOO!cVR*5MxHJ8hU(D2K!0g`R(bO+d7D9op3u%M-c8GRt{T793Y6wQF%Y_x zrGZx05K9!wI{K^Q-X9mPvoZwoElhwI$s5{T(z2S(>s0JA|4nLdt)sT`AUg;i`J5Ky6UkY0sA z2Js+0i1#p}rALZuRf$eZR|z=1nX&Lohj%m13pUKeV0(P#p3~64WL|bEObey58eGY; z>hNAiuUZO>&KQ(;9o^B3JF%>Q*U8{7>3=NBk`7#sSC=8n+UdyxKtxrlZqfA=b*+?Z z0baa-@iej~dV-8l8BsPF=1gF!z%V&O5h}2$(=3t9d|cDRi|Mab2Nr{5HIaDKvxv-L zy6FgdzU{AUK^0_?WYTOsV061mYhGrSRZU>ETRAOMXZp*g0Kx|pp*OT-HF%Klo9RAo zq21-f8^lUORT)qNw!@=f<>BHi@A`K+pMRR9^zVa2J`2-2`=<> z;Vb3MYx!zZY94VzBbntLgobkcjudi4C#OSVJs*!8<%=^ZpH4WtTxddxH%0r{6 zLmwKC@ZXm^x3HvGL!ruM6fs42#~VaEkbiiCb?F<&@8>QL&dCExO2lxJ#x$Ffh z{-*cPlD`ihhU(NEl#Sc?S$dutdCX#$2VeKX7n2C(L2MVXS5MkX!1q#tqAYqIMtY+U zp1CoBI$#SGAKH@@J_@_i5?U=5eRo{lr|gk!V)-*Zn0p}>BeUMH7OGgy7?QTPu>xjd zEtpoEPV4%N-WY9@kPsd3YAT0TxswfPH)+| z#x0PZ90KO0Z`Xbri*2s=Hm&6f>dIUmOs9vI<(v5KY33OkwHm?LXU4ibT z>1^hW?K2i<&9$Wrfp*$ofFh+aH%gU@wEn}E!6<-m{TcTV2zRn(BDC^$%iCN~=vr7f zWO@(Disg+>B?>OiJy^_sTT=;ln=24Hg%)n|ro?jmX18DkY zN9M9`aJRg<9+XGt`{-+pO?@LAu|cWAY|Z|O!} zEsw>rPvZvsyuE6USH-TMRP;n(-}2z&E4`uN-e4hu9Y}3`y07R(tSiN*g}lwj;m3D@ z-n=d}QtsRRh0lm)1veqc} zY1#IjTK@pM@C|rIJz|>%mNdegtSZ`43EGvgxfWW=s>_3ynG`>oja)$y<1?4_<(mk{ zU_Z?IMLWuy>kv13XGcp9;NB2iKbZ+uvhTsRP(I*GmF6r}zqUe`hm0pPq(RyN>=s?* zzQ$REn^5_{fvY%~?S}dn!#2$w2ij~CdSEqEji3)gsubAqBQk||6jR!#DOgoS=nz}( z)K@A8dqYYGG-A|CGsBzAcq|z1L!6hl*lxzHMw5BR-!f90PgR5JP5~5TiPpT9+jQ$k z6IKF3MYJ9e6^nWfnalt273mb2M$dq{(xstWtftj!B|};G=6B|0H9fDbSzjmizxeY@@@1EYfU5o~%44tiFl*rQ6NLOn(bJ=BN2PC^Ucst#( zu0!e?R$5ewMU~4gp<7TStX8eHzzd@5T!DtN>1Vz4p2H0aL`&dP&BAWAe*xFW(}SwVTTA8mv+!G`Z(+TX;q6oijq;-i@Q zJ`WFcXYn9B&ncYdMVIk*{?TTa(V@ebx#!8Kuli-)R+2CS)xn2y*eXsVtJsbNluT=R zohbik+4ozr0B8&Kq2+T_&~RM{S7L8ytm<9t+|qIdh|n1=D6&i@bNO?h?%dh(4{R~x z5-7Jy09}d9WwYQlj<`9FuoL-y_*gcuya7&rQt)%M6|26 z*F{xn`IK!KLv!{l@TR(PDMzzIV9UkumoR9uieu5P+vYd{KhU9}40YG#OnO;E$cpc2Xxjh|#+Z)*9-esDv}) z8Qr6WmXz$ew{IE&yq38<4eaB8pfz)O6&@g)*s9alPd}Ef5yY*%oA84Od31*2#U+P1 z!sg5}#&l@1Ez#9S6udC9`KUE3P*H59&UaL5HAs}sXp_QxO1||@+i*~O$}D~HSD17a z)WWwm(WnQHEV0tZ$fV`fu(n%$l=_s|zEaC;Xx3%a-%dJ5^G* z+FcD6fj6Ysy-$+od?AlA{tc~7(Rps6x2o(`H=-?bv9iq8E`+r1Pin6twR@YbP6}d9 zQ(B&ZS8IKXDJ(iq>pykf-O!qEF~jykWhmrOFNaQbRSFlB<;A`5K#IMc9H%oE>2NB% zVjo_rHI28ITIK0vuzZIeY01~mS`w!5EAm?CEpvREh8D~^lg}A+rcZ)&Z|R0REvYzJ zMfPW9gVwGABFSiZN0gdf!n#dDZd(3`=0kJrsV-X5z!PiCBHAmc!uFF9&XlCi#n@8Mayb=~5D5ov8c9G0);dsWsglfd8Q+PP{=s{8TO3&rj(Qq2fA-bNnJ6>eNT$#>Ot=HDQUkQKE(Y%YS$%0 z-H)Yufqjw4s`EKP5I|w_b<~@whVSJPfPiFusf8N_Lsr# ztI|^LAME~3TH2<;?hR=eUH+F&pLI#QeX#qcu4%u{buUj(`)fb0&+2~ed$We(`irc-XhimW%!BI(dLM%Gzj|Z*@^0@mTz=oX zH_of}PHP$9{$ihQkm}lfNw(kayZm-K<(!PD)?CbitZyL@&^hH5lnU@N9O<<*!v&D-2WU%NnJCz*QV9`<+6@J6IK%VF`Kg0U&llX`#g5wGM&4zj?^u5=)1><}Gng`A8#Yo% zGP+-!oWDxWU!gfg_u{mU&0jtAlbpYrwnuXQ>QVR;tG`NPyp{OzW6xi4m*#&qcU6&2 z;p*`){x;{W#{cZ+tya<8i1WPF5;U(7^HwV;T4tEHvR<*Ui{`E9T_T~Lc+Ey!^HwL2 zoYuTnYm<{!G>g@NNh^GwTSv@jp~jS!@7tZU z`c-(+>LfJgIuOfov+$(V7KGDwYjBaRMg{VclU5GXNwjb*IcWulZJOmuPFh7R@JUWu zVY(_gX_cI`(i23jKdnhC!<^L(JZJSj&sn{}b5_fE&gxe@XLS|NS^bIUtXg=^>Wd*X zXZ6DnnzQIjb9Z&gwFrv-(3n z_bGzmiuf!cXRh4_hE*r`#x*)-T&>L`_cgSMLi0DtnHC@QGt7N zkHH@ebAR3=70Bg1Q*hqga~94mn6tv4P}V+I^PCl~?Kvx4W6la^J!geW%vs@#IjjHh zoE46|OO7^$ljp_U-vQYt9Np5p!1fjXA6BJZD7=4orKT=dAw9 zb5^T)&I;Fwfp3Y@BbyoE80{IjeOvXZ3k@8iap3C+(L*-2cky{rO<` zvRsns-Q4bL@?2l$_TAdo^;X|BoIj&Et4s1y0pFUJhVzFsXBFy4m#<^aYV`p3=ZAKE zW`O&b{Yg>R_D=({tv}uVef}P}et1AS&Q}af`};8WjRSi>G0gq+KuRh!xYu)o-M<@} z_Qg>5T|;}nGt~X+(6lQe=ByH(uUeO!uS)K>^6u*WR_lL~^HnD$=c`=*`}rz+dF=me z&MJZZR#SfV^H%>~?zc*8-YU7@O76E>PLn{G8~O?Cx4Mu-O>Dj@x!)?e-|FYH-)jE< znfa;#$@!{XIbZeoPj|kGK0ut~JCb{? z=v6oYyt2e$#<3;2*UH*omfUM)P0T0vT78q;YsG$ZLrda&t#09Yt50~|s)gsRLOgGE zInP_I;(4okc;0F|&s%-R^H$4wuho}4Z?&BFTD{5hR?qXi)iXSA^##vc-O2M-_wc;c zhNyX~TX^2;YM!_H3-7i1g!fwA%6qL|;=NXn@LsD8yw~bg-fIN}d###zuhkd4*9r*s zTH%bnRyfmMEBwJ;tLu5*3fK0$6|OOFg|nWw!X@UdaK^mV+dOXtsW5MaGv=-S#q(B= z^Sl+VF>ke$_gekInzsT`#Jm-LW8Ug3p0^?f2c|v6^Hytl-s(1@*1fd`?<$i2FY|y}yMnb4jL;a=YK3=lVXk?|=KcTKlHq z{0+@pt;kCS{HMG$oIj^|t1J4^<$IX7x@~~_+e5p)Fu)z`pNeeW*gp-(yZ!0*o%ws< z`tbqjIRAQJ+Ka>7w+`(6^f34H11YI12KU-J*!_p0Y2OWX-#4`PheO?O4o&-Y#Jm-j z>hY22{MDM|{8e)PYM0MnCEpiFl`;9gKm^K{tcE5Md|#mTk?o(t{8fH({wn#tKzcuS z@_m7LsRO+NGWov1d|zPleSw&g;plSmeSuhzpkHxRhFxVC z9|OUw@aSE8yYGF0R);c?_XU26_XW~x;!`&!-xrvCUm%P$x%DdfzCc>|MQ;pGzArHO zzCa&dmPyM1mzArHOzQ9hsFA(oxPQEWN`Ms-M{JpCU zKgs=9rzH1Z{r|B4%58m8<$pGPbqaQU*x!3>=e>d69az5T9ax{Yy8|m2-hp+T+<{dZ zu>)&UatBs&2Nr!sC;7E2z4tEpwX1PfUorW$EA`F7awy#MM3-hcI1-hcHe@4vzu1M%L#i+TUm4&HxtG4H>6oA+P6$osFJ z<^5M*@&2p3c>mR3dH)sOCm8XqE4)(>-@3y4^6;&zd-}PTcT4-Mzx(!XX}9%ruj!Wi zFW!Ik81KJ&lJ{TXy?*%C6%g#dTEY9TzT*8?K(PM`XY9Yinf71d5B6W-1%&w46|U|5 zSGdOhE1dQID_mm#70%dy^)Bzff>hXlg){bF{hRk+;Z=J0))lU?|Eh`iU*S!P^sOrp zMeM)AZ|uMNn)hE3g9Fo^=KWWX^8PElD-hqh!Zr3^-A((iX0Fb4zkkr7IIqF}EBZtG zub!g)SKnvT+Y?{RNec~eZ_DZZ{a|-Tx?_O*`$N0pm5ZVNsmSK){%Js3`qS;Z^7p{?69dw5UNtc7 zpTpd@4eX7#2fjFvlDcYeua^hA|1>lWFNS#kH=2RDz)Yb$lt7`o9Wey|}5YrcqDy^#b&k5L%`R0|i z`=rIj@ci5apPy1$Us+x4ubxt0JICM9U`|}6=UY&Dx__#_p|-j)P*qzKOV4zp%IfQD z+tz`_Z{+0KfNw!vwSR%XCg7hN%g)xBqE~Vj&#tYHhknFFKMJF2&hb!kZGHUOb-Aqc zqMnaiyZZT&QzuR+sjaT9pLTXbz`vl~{Ee6vs0=hVOscJ^g1k=TmVPHS2K>?Awx`_!o}uWCCXS#}NM!!xQ9h@hjr`iejs2 zm{(iBpwhX{QaLgGaM*k80)GHCCZ1;yfU%F1+v#gR^o2|3gZYmbjjZ_V>uReZNzLgA zB^Je&`Hh7qswDT}Y}YB`8N|6F4o{zmpDxef$luYwEPWOhHwJ2_)K*b0xN=x_C300; zQ#d^QvyCc5RcjQgd(GU+`nje4YCo}@HnIY>%PBWj`eUb*lvmi9t~nh|&FJa#>;08; zJ6lydl|RQSoLC0q%AaF8(Iw^lyHojdav_OjPx+7b%CFx!L&Q@i0*sneap=ZO##FCQ3vh!!mZmbD3W)~I?9X_;R$e2d{IedTuK#k>6 zt}Ogd!~cnsXSfgtSx13+3+U-L9QzqOs`ceIm!AC)JXc47IV(jTkto6?`z z&hv}gdH%XKo~Ll&1L{8MlI1%#BdZ+Rq2Dj6d;Ro1mVG+wj-LIzjc2n|Wivfnpzb@R zTi(vI)ona`NjuNp-o~>}wDas+Z9Jb`9ov&nW(-k6cjMqW&WR1W7UIv=k25@mR{D#Podd2kte_}K!`KcMd4 zr=OjWk#(u3EThjwDWw_NO{t#c-81@lGqNURq#xA-H1x~|9e5^NIe|pdncjhCE=lm2 zJmhDsdZsNs6Wv>i?i^gR3b;HjM0uP*1;aYc$Gx6iaKdp7{xe+}-S(V|;`R0@#(83o zQYt&59h(5{+yrP>CP2G3PFk8Scu&#Zuk&^k*^8I#WnxCQXDO`3$JTOe4;Rt*Q4M6g z^xg#N7bi%6dxG>^75ygX{Qd^{E#~}Aw(^^fa-}0)`mqVp&rgv4x&-MrEBY^y2e#da z@;%Qk-f}ntD&HLm(&uBcsP;>pW^ea8%%btgg?|s%F19B~IEr@H$V?-lX|fvA;c*{p~4m&%lZ9mN@9f zgYFqc_b9GePWIpMaZTjoDy%9GZ+}b=&s6(IX^#^)1Hh?XWc9=ehs`6R9-*aIZju^R zq930ieVwA;h-YJUNite)*a!a9|M*{H&mU!euEFGP0XfCuHPbnpT`qa8Z}yjIm8!OEXSOX+SL)3kcN$B&a4Nn5cak%(i$Ps0JLng4g^QUQmM4S6QsS=9uIn+dWP3x*XSB z-j!_QlVRh?N(U7U>5yMNPto6p zu~<}HfD=X^_U}S6Prd!)7}O2Y?OOGGTe`>w-CK(8Y+Q%s@=QV*9M$8LjC7(&r^<%o zT>NJm^tYQlo>Q6T=!|sgKMz(kk$r^HaG(29Tf`D_MWlz*)HAP&Jg%U&N7lbmQUAt! z{EpSHl*-AWT6%jd01gf@)s=O;O{M>-&KJtFnd-l4`%0qALVh{A^^U)sIjl8diXG#>&(d_FE?1hAIyn+8ZjY~aT-j;pN zu*Oi!0m-a}R6_xC1dtVvC2N_X_v95>1W z&&B)VghROw?w4Mwu>GuCoOZdw4%mfhf9{ZWIyqDvGVRTZE_WBEU8mBK`CjIbcB#U4 zrOrQaNLy!E=6ju@%fsJYRo?Se0y5v{DNLtLcCk|ZP(u{9i(3??su^PsD6EJ}&3u9z zLmoca=|qv@+U5jfZs>IbPOWzAk>YwY76g*wdfR}%W5C}t;4KEc)qsCsz&|qJ9~B6Ep3Qe18W?lIsg20YDxcQxSM40sO% z-qV0*81PI3zNZ22Wx#tIaC%2U?2+Qy*MRpi;QJf!0}S{<2K-~5e9se0UvF^#~Sb=13u1xA8x>ZVZe_x;Kc@f zf&niz;AIAUq5=0B@S_d*F)=uWXgsbkK2KD?6xXB}dWr#h1U^54{@56Lx}D-W&VWxd z;4=*P@dkXR0Y5PYKZWHF;}o0HM~ds@7<#&w;yNV;zZJMg;E{Z2q!xRmxGG}s51CIG zkK|JsLr+{&T(e_vswp0UNAj5)LvQi%$KV$*pD-TD=kyqQi;rHdLBGOBit7vm{h0=Q zfdQ{E;B^N4ECb$Pzyk(+p#fiHz|S_|=NNFkq9v>|x=L}KZ=k=>fG;uNzck=Y27I{z zzsP`JV!(q2JY>KxHQ<*S@D&F9asz&a0l&(CUv0pzHQ?77@ZT8lRR;V91Ae0cUv0o| zGT^^6;CjVWv>pE5K!2M7zr%q4!GQnCfZrK|Zvx_Rg>jk()kli!t{8f{m*QFzgQw#; zkH91O+#N%2@wq1k_c5O^9?9pgG4vLn`(p4Q^9kdTd>)9QxA;65gFnT5!gwT~hhyk1 zK5Gs5qXzsj1HRsXKW@OEFyK!ba4P-SBgM7Zfd9>aKW)JOZor>4;9Cs%a|Zkc1OB1` z|EB@}w*h~}fWKzI|7*ZsH{fp?@V5>4y9WF{1OC1NZ#Cc_8t{({_;v&Si2?u2fPZ1Y zzcS!E4EQ$&{96P5y#fEhfWyT(9EeL8@Du}{YQVb~@U8~Dn*r}`ztj zc##1gXTT3P;J+~7M;h>A13tlkmm2Ug13uA!dky%}2K*QUKFNSjHsDhX_;Ch&ngO3~ zz>hcJCm8S(4fsh0{1gK|%YauH@Y4+VYy<8$;HMk#`3C$9172;wYYcd;0YA%tHyH3n z1HRCJ>zxLXjZ%v190UD%2K;;jexU(hYQUQe_%Z{2kpaIX2JepbBpz27*Yi!k0Pb>~ zmXaQ+0#~WRqhOcMfFH|v1)t?J(-ls0V)8gq;nC@y%6NH9|6z{8)iMQ})qKXM#?UWd zd}|C|&v+%DZ6>%_#7ISonliL+ov-k08?i2$6rLZ22N~ZZM*k}q-#-Swn(>2T@Kuaw z$KW?Ho)?4P#&~`VekbFDWAJ+zFNnb(WPD@{{utw9WAG;#pA&;Wt#CEHX=~{@#^-vj zvk~j!Ukdj|;jbw?3UkMXH7_zjFti@{%Fe0mJN z2dZ4IXPb@d8g(e+uiH3RfBY(A{0$rD>VsdEjK68)y8V3+c#dZ_do#Mp=8eBEF@B7V zXVXm_>wrhMrG(S^+gwj9|7DE7LnM6YbYBIYQs&YNC^uK2O;}|}l0MGH99K**8 z*Ou#vrC-hXr#2sLN$&v9@l1;0GYGCQ*Aq*B7UN&U@S(MMIiBNU`21j?FM~_X^@P`r zXn8`wb38L*_|Td*C;ENhf^$9L^(30lEZ{jFtM^61W-Ez*XP|$d@$fnm&8HBqJjXLD zMxI5$b3L*2k23CdtK@heJ6*rPxF-hx*nsbc6nlA6Y8qG2YXr*PiYT#xreP(+}96Jr-XW+ugPHKTW@o8p!nk~PNxwu@v1)k%{ ziQ&HnxD)@420mLEKi=lA<$vG6XRjP*{zn?{S_A$x@LbP)w@V#5-4@_Eo&#d?)dgKu zC;B|b!|M~yQT)aO&+!}-!{=lJ{UXL|Yl`%R1zrDKPk23p#?N6qyl!EWO7}tFIi4b0{_zU`3b<1}>NeOJKNxtfCzk&# z#>49$bhm@XwK0}F5Sqz^O zfaiK*>91w{x)^!>#eA%27^zb0bDv?vCzk$r##h;VzEt|Z8n~1GZ(;fyW9Z*x{H7SZ zZvmwnUN52f&td$w82aBa{s$YsSjqDk@GNyL|2zpi$1}**TeiCSwSoTNLZa^ihHo%C}v)337W^*HWR;JKdIbW=wV9$r_V<;gbShcmv}F0V(GU?%|2 z@f>2ypRMq-fIG>#(!l4BjEC1DX#SfRe>NuFe={ClSFll~`#Iy`^#eyJJaeS8Ji~zJ zdcx}pj#Bi~84s^3(D-5lpJt{HuQ#|umBh0K`i~8`YZS>7UZ0?64kj=jUY~G{;@`x0 zczuG#pJY6|K0)JMM-%_>`h?3>evbuylV`PUKOC0Cy_*@o-o~|EePQ5p#2DiLo?Tv= z|1S;rCdR|-8ID%+d}hE88B6>>viaYq=+9(4ylw&AQ9f2O9$vSg@p~8#uUj}z(LWE| z$!@*;6n(dkb31>xa!4jR9b z@$h;Ejlacsc-?}=M;=Lh!s`<>zMS#!Is}cs#CUkU!Kum)dyXeQv3LpN;q?ZZ{#*lo z598tW2AckT1D;b%>6Y30(ex)8@XHzZ#?U`yz}*vwe|WutZc&OD53ehza#_b6jEC0` zXng+?;uBscpz&WZ9$pWi@oyOq&--hE6KjX?DJ}od0CpZ{xI&l8&)u z&URa2z%Mu8w;1rJ4EU=C{96M)91XWq{W{rzpJl)o1JCi?Z0kYS$Do0Jl>xuQfIrCm z_f_5td$uh#yIy4c_Ly`(Ht^{_(K)}_zm5dv53hgFe2zqe+shMP|DgF?3Ov`d)aFBbbLse)>BH+BG@p^j5TEcm2hC?GaJ0*A zZCgDpHm(~P?`q?FEBs;LH+gQf(@j@+RypA}#Ne}m=Xfr)@jVs&BF39-T&I62aDA;v z`On=1?a_0Lue5P(&)W@r_M1fVTw&8|K4Tfb(#AEP6Bxfb25(?o_eR4quVDPT z82Udl{%af8dECVKO*X!V%Jf#?nnvp3L#DsQrr%fHOrK2ox-ACp%lIE`T$lTJ#{X#J zI={0RzthGw{W*;P*~T^fwT!Q^aV^i?jQ_>Pbzc6?_&qkhkCOjg#_zRpP47OI@^zn$ zYyI?M{C*qP^nDqB(8jf#M>779jcfXo8DDGT!<0OiG5&~+Yd-54f6T@U6#W;Bud{JY zKVS;U|G157{--d$!NxWH3dWzbam{}N;~Q;U(|^VIW*gV^gN~zgpR#dHU%~j(Hh!Rz z|3b!}vGFX0|CaG*Z9H4y8yNqGjpr-;UEumz1@WIfr;BRpvo4!`vT*CN&Y+OJ48ROe*e4L^mK7;tYZsR)LvlxHV#&y2lWc)1~*ZgN3Pki37 zah=Pnn`>cE-2c zxaNPriA4XYjcfiVG5(p2YyQ7x{0kdLG4ZjT@h@#$^PhMU@!w(N=<}NPPfK-(k;6BfI>g86TS>c&(b%Kv{eJ%L=)$2@4fU1bqI4=N zhwp$U#K5795_>-O>w5`3?__LF3?`NzJE6F|qN1U3c7?A(R|Wf9mW72A{ej8;MN|bE z%BEILE39x0EiWl7pz~LW>KN6k0Sz zL^<4I$=rwYQ^WbG;r!Ha<~y999nMdUu;{I4$LLyG82ypVPJG0!bX3{Gj`3~#<8dA5 z+xAD>I?lK4kEL~-Z`&U!i{RVgZ<%(0i<2Mh02>D{*a0q1KCq)~qCU$O!DeLS*Q+D$ zMSrO|;^s*H_^;hWn!feg?lbLb-7%q9x7dC{4j=lA@1eHz7xgvnd1aEN)j5zzVHEw` z2>QaPZ*xaH8STOf?Z0_zf9je`KPtxHlbmwscj6JZSPJl<|aZs&Q20!%3R_NsR~$vgFwWcs7Z>g#LkB~mzYa&5pzpZdnf za0C9i5%)%55D{o>m{eO+g^$)p-cmz?Y51mj&FQ{5WHKXs4YeinE9=$Q>*Os|-F43ZyhsiaJcrhY@>DaXvwphI`xp|{TC zjtG$)MsyDDE}rKcEIyvcoIHBm&qeu;i063tYuWjjN&bcg6im3QtG?-8IJ~T;p|RdS zqo(StMs=H?Q}>H}4buV`#s=nxAKj(B@8RHEdcx3p|Gc3U6{jy=Tv6w*Z=erRR|U?l zSV-gY>Bo2A!@2E!xLOVOcWG7%JF22~1`?#A4yvJT&US@LObu-_E$y%x+8OtBLJe(m z?w}glX4-Kzv@=ZWgc{oB+(9+8&9vicXlGQ}2{p9Mxr1tGn`wj^;_K);G+w2VneH&3 za27kvq5~On>`-z-tjka+EM5+vUQ#EY&*l1)P5wbOV@zA-`6$QCU6cGx{c-x*!%4^+;P!>VYC2oDf* zQwrr6Q*{XcM7oWt#s2E{1HO^&B)(_blg+VawkMq9L+wfD_)vS|In~Veq;qi_5 zX-_uCdfA?Ejt{jbo#R7si5Fcj;}S3Wp}540eu%`Y3(T+gSI(_i&=~M9uArHIS3_W~ zzrNm8Q8BL$F}lFKiaGPo)a_q%2p=JTOI{s!&~drr{c{ld^C7a}nuj^(Hl7!vt0{vB zjuuuHCFoo~0%)~oYqsjaSXQb8thEi%ULj)5!Ibd4W(?hkY5u@81Sk>aM2xO%N?WvJ zY}$$b+6DeV{n=$zRaIKh!WiBoZTgbh>e_maXBY70w7SYU2o5f+tZwvI1kSGWBgRMJ z#i)6bu+xmvJ*HP8G#OoXXrpbhVjmT{j7~9%tx=w+8xbBly2aUD6FQL^_>oc#>-9%U zaF?joA&}eV?8>fDZGx$GUbP7(xGPla&~)v7%_f*=rxlxEdb>ogvAwn*L9dA=+IhVu zmfo(=D|cq1dJDT>v5BVIY0V~@;4V{b;b>kzqUJlx+ElIVLw2S$Nu)S;L7ItrgI$qi zf)!;KBfq6?&y` zSX9<1EHl=q=J^}F^Y&zdyu-5*{;9pZ zJFOT=$h@3Jym3qK^l-xBN4d1bbnoc=?eS1N+KW!Ula|BoXhzMVs+ze};~E$Ez`NISRI%;al#4Hh^S4*4jOCk8HYk@_YvoLt~Mp3N1}8Y&T{N1U#dCkE|w17a;qSm$Hfk+octJ zqcs(`a9o%puxm&^z`tNl-P!bKLG41n zZWQXO)l^HAH;dc)%Z_zeh#kFTzGQe}>$w{O_0|3wEu&i2U066{`cY%2*Wz3_npSwT zvg|HmvM@_0cd$xaSc<-=nD|+4gaJlYXgM}L8UV~cpT~f);sSRh;mfvz( zmp`hwuCDs*vZ*v}7rS)6sI;V(c2F#ij0U2wGG}pRh29Na;n!Xh+M4dO+Qg{xL&5Sh zn9QwRq^_wy9r3K%;hnggV+~^JJ>!XUG!DM4iP{b_j1H@kb#;`XL$8f%Pe=JV^&>mQ z(4j9JuHLb>=0MJkRm4~)fybnqkA2K3xA7!rey;8G97-#m9yAzblUU6!=4eonz>c=2pC(tsK~{&Hxe=g=$$ruVZm3mpI!wKZXyy+ z&&irNI={OTbg-x0nx2zE?fwL#EGqs4+wBUEDyjBY)`!cy-3N@u>0pUgTWp%PC|l^z zNKdbzeRZ&Gd)cq;V)c%&vB#p%u%NQqiiecfR?clee>J?`Co-H2r3$?L zWzKxnf2sG&-i#knadlUOX6tL`V5?s7?Am&4L8XN4{!!%4{%DzsXwen#QH5Z-Giznu z5|?$zZM|LeZTICI+EOk30QVQId({jN`P`adSrq* zcIFjNjvc#_yD7_#Y3V$VEl4cSCT4ME+Gzq}cV*fsEuHC+iDufsEUrwGkwo|LcUPvJ z($bk8lVE*zY^F7{;ixLqpR#>}3i)$AioIz?_$R7ezESasMB0t z`ZUg3QAur0pb|?5>V=Dr0*{|uSU_Xg#g((G78Vwc!8HX2dEIM8Rn5Fwe$?VuII5I8 zo;F)vW*m0@rrVKe3`cqmRS6|yt(etqOiVKBwia?qWj)65{%X|}iM$t%a=NFV<9SI; z3)NOPQmi!MIj4Kpb9Qs8+rV(NRjMvFaBz|;rRcz`d`jDySk)a?xARSvo2Z+S8g#y? zo{XCHm1=OhrPH&Tb@l2A`A}p}Oyo|lFt>9g0L3-B|0Vf4-qU%A?>#}1ozq0NsdLdr zDvo0x@;N$yxnKsgK8uGN0jOmd!QZahawsK=~;q9dpJ-%rtJEnGAS1YGrmMn1N zeM`>as3g3PplS}*3)VEu<5+8?Uuc^q%Iy^*0=u9szc*qu+F5^nU2Sz`0PkpNKlub6 zu<~TLbwUr3m@1v6J$4 z>S>h@^Xr_(9bL!nRe6V!j8Er|tc8)ZqjclroztR@<}p0{6PrP)oSmBH2#s}yNk{aC5s9CBNo^8>m53*w>a1)q&H&=kdWexTsoq; zw%(CHgU~4`Srv#=fK69N(e`H3Ja|DH9iWGh37581S6--$7(01J7eUEm+2*u zamX@+cBfUeHMHc3n>xG?v0`CWeW0L<41b&F1*Iycs zrq|!&jK;fL?D_k@mkB;5JjXzvX!%Y~kWWz@^zqn9Jn2e4@uVA%y~UHR|gvY@FH%-M-*6QGC$nk=F=Z+UMQCbv@GGNh11t1pO~8 zHZkpjXG~piToZb z@+I*_0)JT0Un20e0$(NYM+BZs*Q$3vS3S%6_!!E4SJdmr4Sd!KyOQm-#3u+lyjRfU z^R#@B{YxC5U3A1}3taX~b^geoJSpVVc24*;BHbetAHronr&QpwpTAV$B&R9e&4zTZ zFr+K{lQLa7eu*dDrw!>|Wk^@{CuO>F928Hw&l=KQX-HR&D`mRp3O@0q`<$Sc<$IkW zUD=B@1LDcx?u9;98#_DI?lK99{uv|UXSxU{Rw6rPH|(ynec;8Gr`2Pu!#gOo?= zLCPcb&>4B89ZGqm9ZGqm9ZGqm9d9a*}v4=uN59`=c^S?^e+o}?h*8_0N4Fk zY5)Hb^iqDQXDPqbvy@-zS;{ZN_)Fd z;L_eM61cRtO@hB{*WNeap9=hal#8zKa@;EUNIwvdAM1=Bq~DWzkbY0Wm(wACr2JeoX2?`mrBV5Apc7&genAWWpqKt_l)$%(bWc<` z^_M;YuE)LS2wdiOxxhaKJ*7{_XVxG7y+QE*M&ZPNmEhkE*L2YHGOoUlz$4^WIPp0E z*V>=oBIspYYoh`GT;LB2K0Syr4w6U4yABe#jCV~@IQ^-_e=Se7z-4|H3qCTx%LOj; z+bnR|e*IqHQqOlPoc_pk9~AU5-FWQbGw3I24~g5u$v;zjpt_T^hs5oHeEZMQKYWq2 zhYqzDr~XXs;mf2wbjTiN`~>Ymj+fQH-i6Ifqx5J`)wVcAvwPj_-TUvdx4*Bz#9ZE`L9rTH2)g}F8hZ+b@|hU9z5uy z>V8EZk>3>HTK{@pmAbQ1Z}SDcEEhemP4u!{E>QH*_^$*m`QK*X|B%3Cxk$T}c4d

    in|eox@E58iwR7)zxUHq{A1N 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%0AA&de}v^sh=#oIqTB%*tJf` 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

    wDwE8QF`5yo8QRUeUPp5b)r^ zgg$GB2yZ0xMfhn#3c@+3(e=X9dLnE-Efr~ySKi7**Zd*EqQpK3wH z)|`%1Un8`_($ifp4S^5e(-Gd=+lg>~?`VWeS=ihg@pkk^yxqNBbB74kefl7LyN?s$ zx<1hezhYrY65`EGLcB+lTyszsNqrE0o#aG#cXBksf3R>-GUC+}6rw5FwSB1IKEsZ1 z{uxe$ub&Z(a22B*IRo*k`XXL+U)SmkVQJsq2zT^#B0SPJ8sXnkD6B~-gnqpr;+6MH zZbU=r*9YO&eoln@`$Z$Xw?Bn7{gK{M@PwiSS=%Mk8Fs!j>~r z@d@OJ_=(h{gDB6`(-9s^bs~IVKs3SyEPQ_eqO2c~yb0ME&=29$1N$RG23l2h;U@ z7S;|P3H(C_70>((>P@d?#G@-?pg1#TF~*7aEeVxYVV{K*^p8f^ms^D;5zfC^g>NF> zfjC634<9x1|ExZ|kgMW?X~dz^CY3nM7MMDmX~v=Sgr8!O;c0vaaIGv)Q}p3{8#H(` zKI1n!&_`N<`%`RxKq{!)3E5|k<3OGmmjuA5w(7>ttH?1PdT|Hq0kU5FIlm?Emry$Y zNc!f_4f^Jr>BY>x2I%R!&ux+g{;*&|I+%~LNpK;%xhFv3s8owI8rJD3r&QFm`w1Yxp zJJ^PH08&BSmufq30+6qK4=^BdI~Z(e2mbhoZ6^Bg5cBP$|437%fm`F4G;kvA{i#1S zlfj<~1R_y3wPd9YU+Nyyb_*8opMykIG2nB)LNV2_l3vxgXRazw3!|O*)&tY;7wh!< z?EGqycysyK)FY^uJN@egBz?V%387y6`{y|FS|`hoLaYy;{44tLX{!84mTNNWLsZLd zWdCOW?1QAw{*Vx||GeMuQUN`=st*h?|NiZXYe(<_yx%MOaT149g}2}Xt~Y)FjgKHH zZHvZ7IzYz1U$iwou7KXzxBT0Z=b#604d#DgJnt1&ez`tJ9%@wi6OA`Rmv)+N>Up!P?uADL>>9%!6o?LiwSF*KUA2je*D-yg||9kmB8dm0Q0 zXaXi4tWDL$hnTJ`IlPrjQ4YDHLEd;9qvk8}#`eu$7(10#rj~=MC+9NR!6xGp^$RvG zY3qg%M%};qm%}S2`evp6!js?2Yo8lvcq*f5A9z4n{z>wCEW7}tivu23UB=1lACUC@ zdt|%%_m@yo^Zsonzi$MW?C()W=K5)s-AOvJoo6V*wuK7TACUa8`ChP(fpnJ>{+h<;Q`rs&kk>q)`LWIMLs6;xPF`W%k=|kTr;QZ=Q{m0wE_PLoccMNz_orpq+R`E1@zdVm#>^(MI)!Q2fh9p`864z zJ8i!1h5XXk%v^PNcak4CR^Dv9MqA|i)DJ)pxODU`V!H4gSs&Ey@tM~ea6qa)^+(vx z^`bBH=?`I!$4c$#+MBFTC52{$%iZ{P_3uZZ)egOXOI6r!5(tRzMDvyPt+p=dg#Dg(3eC+`%MW?K#bGJ2xXqOvccs5IZI@5g+5Tx&eEy*8b1?_mA z$2P}%bq9S9q{KjIU&;49$i*R=Pg|)BAoSGjX2Rb`4?@!I*hiDT8%07c6eSzvAYOr? z{MdJ*7eVoQ8+4^SzxZrqxt6kA>%B_Tn=}3FSnZzryPU3Mqr@rQ1;+IX_$j1khhl!` zd)_KAJFs5i(l*`rrqj2Zj}SCJu@OR>PvhG)zRiOA+IM^l+#clpjCf$5`g0Oz8tv`diyaVtu0N>79y03B zUmFJfc@o0)5wQrp5zz?mu~NwN=Py{H9^Yo|RW(#NPO9_;WCPh^!_}9zWGK1k+U*E8 z*h%5N+iru#F%rD;$Rw!Z7DdJ*{3J3KAynrGp*lyXSDhzAd3(2mw7CyEoCsfXkUF=H zQCdlLUP<=up6H|(h6%MSJP;j=Yj?M3gio`O9RS-zs`K}|B|SDwD2eHV@Lw^p2%BP} z5q`$PR#Kf;Iw?J8@&icEnS}6wGZvw{do;qQS-6N)=k?tYucR;Tu{w7yOI#z6Bmo{ z?{TE8|2GS3?z6kG6NI|%Sg)Is3xGo{3_-m&jsimj6pu%lA zja0i2CdMNCXCf(em$R@r5wF}q%JbccE-2HhPw$Pe_VieUn@*2L*vi5ZQi{(drTC-0 zT~N~2_D({0pm!`ncb{m4PqT1QAH=KggLqAST!eP$LzsuBlVTD6CyCGw>sk0kk_1Qw zDaBVLCqu8>nw*62=`&&x{^yKngzH(@LQ3%?XCU5*Gm_^+que(M;pcs05gzSJYW)XO zm~uY_@s_3_-a9EtbCF(3Z-h1dVi7LsM@su<7Pj<5yo01XKhn>2c&PA9e>=h*{Rv%C zPCg3mJyV>6jGWmM;j%O15pH4O5f(m2YVsFTlYyRSPVI;ASZaTS&kdlkc|bhE)&Y1! z=|IG*97y<#l>_YvKOIQ;jDrISpWz-vl%<0ZZ}T9WFua2l=DX8eKu=VsCm~#(9*gkf zbiz{{U||W_u+1e$29FMQLAPH!m~{U82gf3;%ph(5Q!HGPK`&UFL49poMts#!y}~^4 zKC7@Fr@`8V$0O_wR^hD(=R;QE08^OD1D{@RKK?bbh}2+CSXQB0ol`^Ir73LHr6Kp-y`x#pT1Tl=5ECx!il zJe}ZEmXVg5y+!%H_VU8dMfgty%bTgaJmCW%S`3a4NFjVcnh!o81?8gP1JdMbpyj=W z4@jdJgb&E{#RqV$acKB}V4u`xQwzJ|JGaPv^B446!q2O`Nl_Z6+1m_`1+b_N)3E?$ zn3DL2s*?SPVzjm|GDR1h70lW`pUX+rbMmG-q{fRKlzxGGMM3&DDSNYWjHZ~cUb>^+ zRXZax)hLkb3#l=OjRyG75G&)#_lgf}H=OSCXT*c`HIB8b70YgBH<{3m!!&)IO%fL_ zhxf_Ig6vkYq6oY~I>GZ2i{w5ar5~2kVM%^5JQE&^6)PU;i)2cVM2Z!3m=~@El~9gIa5>o|Ry@Qg z<1Lkv1vDJX1lrx47EvihfMx}4_8-MJ##<{T9E>8_=>A&V+bSg+?(K9x5%=~=$&Pyz zNz-g-JuZ)|EQ;KdrRWdX{z^OFkfA~(cb$~JUs`t*=dx+_)~XH)dT7W?IM9mwN+?pG zA@!R7Nh|yrNRWMya72FGssK;iUN}E+WKA3lRp_TV@WDEcK)h8^!2N&&Ef?o6crZ;`I-h~76U z-@QNI{gu+Sy^C22O25IN{bPME=_|(x6i(nZazOvRF7xk=>hSljU`P-4y*hunp_f;A z2cI9;!RPHAe0~LkjCA1pJNW##4nA+!o+o=>GyUJ^KwoI`+{|Sdd}%GoJFzU^sM32l zp#$Q;o}!Elh15fFoNZNRRj#AF_O5}$Ym2KPOTrmyu1j={H6CMcJ?o*_xsJbnYUrJi zt9yS<88M7+)W15EpNS4woTgHKAab+SBPgub4HuN7S_|c-#V6it z9m;5!&xb=c7J46H&y>)hL;BRrH_0AY`2cwwWmY{@zz6chA-iQFpnNEA6rqq`32`sC z{Gnn-FW;<>Q-nA@DyL#{@ex-gu~+8=doRA8-g_|Edl4sx%w8~>hW6fPna={eH$XYD zr2;d;mIvd;{8R@O5RJgOq(( zER6-L080n=(Sr12<2|;yyf#1b{)f4VI3jlSJ5g02)Q~)Xm6cPfs}$4l!J>qTJbavpT2fQv3TP)T({sF zzK3qyfoq(mdF@*Ky@&hlxc`jPuU%a%Zozq)*RH|;RmI}(>%{b2I)!@H-wNI9dZccQ z^#2$strE8$DTa}5Vx%FJxb;X*M!J%bGAnWGk-9TdJ|m5+#H~ldA`NdGPNd7TDvM&h z197R!;o(G>3iY=-Tu8NI!!|_SvRrIfOKG69QAblc;*DEzj}FH=pT5(H<-50ET>8OE_e*M45?~-k-iV^8YLS`Lip7RTYID?XXUOgLeGt@k%chAY5KPf7yX_HKE+y^-Dcw_B`VE(J^9 zZvECTm(%%AYP-$HooTxbuzq1HmKn`7TDB;w8D;&_fT0qe#r)PU@1xPu`i0guVXt2b zv)74be+Ej!uzs0N1mpVU3Py71$Iv`RGOSATuV0FBDUX|h z_Y0?F-Tt+F?jJT7K^8I%Gysl}+o%B>Ub6**E#;Ks&VHuK@Cvx)hwbZnN^ern1kp zEyu<+LdrfeYh$5%CEsh}jh0mf*(=4e59k2HC5}prcH=E#v6HjmRHD{=1`Z)3C)PIFY^-ZS3LXg70Ow@Tc5#z!*R6i#zi;@&f!?>O^0 zEw&Q(p7DIknaOFcO5A(K^F3!0r}e1By=Oe%bUHXKz7qGI@qE|$EgcoOL`tZ{y=Oe% zcD8U@VkPc9$@ z&|vbffU>O|yiPaX$O6jtjW?mnwbrns4pF~>$GNcPWwQ|s!ahFEk<^W(eWs#0b)2JE zPKssn4d&xql=ewsn zG-N@6y8%9GTm{oMlB;)q$P=r7QYHSKP@awOoJQlJ>{7dN9MeL2iOA-w5R!E)OF?Wk z*{_g|V9D}zQ3&bs^KaC2|I%6MrWx})wX@RY=Rm3Xy}VP>b?-9fb`6R;Sm}mPt}bJW ztJ+9WkxwujL?kJp%deqBk8USh>uR#pbriTceJn(#UQ(Xv@wWg~DEzmu!ty@i!zU#p zfBa5J%e(`b?|94)%r66HjK+?{I|V8!{=P)zfi2jkdguG3$Idw5&mG6W?j3{#wfsP* z!P>R>M!dC>>oFjco7L*=iDM0i*H%}>msZ9{k$R&5^5p&A@A0X4MrZ#NU$2YM>fOR4 zDEb%Q=ihGY`NxdU8}fAo`TAcU{u1ZdN@oPmU>*2ZfiJmRNrk`CTi!x9pWq%hyCKYC ztx<+;uuk2X*J^_5g&wx564eVmH(BcKtm_t=c)lQ9nF+X_C1GEl@J|bH z1q&j!V$68SHe3+CvJJ)wOyuk7C40ZJvBKx}1cW7#kcvDM*%z0!kv2it5Q(S{lc%T0 zqWXQCE3A)7KnQYRuX+=+ztI$ihW z31!{m5Y}{$hLfA_R$Q*^9*wYt;HO8rBif1Xu97@qUThq~MX}h^y%%f6<)+wZgu4lS zdN>vjKOm+F!V+;x^;qFWLYXdfO<9yDRFe;;`ElScjl;=0@5d#q%M-qiLkYC@cpI!G zr-8NhH0YG}(N$$4B0Z6q@UOAL+lh!&d-_%!it|D;ShdMuZA?yBFjn|B8LT5`5NmsX zu#WTx%X4PJn`4ES&jf2x>JqSa4Vv;vp3syA(Bj&3#M+&XSSQjGn(~Cl2P4*_87EN% zj|_dz@;0IkLuNJ&L$uamh*o}9!p=P5*|QL>Ci81do{x+GYvBmwb1hx%8nG15&OfK{ zNS<)dD17alQBxkx6OPg4$x+W)p3M`MXW_ar%VT+btnhL61Y~>Bc@vOm<>(1$1TCW{ z;2W2YnSeZ3pMMGR)N=j=6wNyqSi#+RffX^oyTFP#^DeZ4`^tq@q_E;bE8>57p%pPJ zbKXT3(7q}yF*gXp49ABS;R%Z!;nNn!eG$T1iyh$}3)>HwlXKc==ql8avxoB&4$4R@;WVa)H-|l!RQaEO} zBYc=zV`HSF)gpWwX-8NVb(z{xb-2vDKhM0O3zw-v!4!;)JThaU8Xjgde8^w;PXxT75fV%LQQq^r79@K@$WN5E0 zJf?y_?ZRW~@R$Mdh=458{#d6U3LS6yoQ8L7*Yh`Y@c989eEv&dAh~`8f?g(jRN#YM zcuXpp@Z{}XcuYu@w;QnS9mO;JB=MLG&oJG9XE?QZOonIZ!ejmjcudLTub-*~Ofo3W zV1C;;N>e@C@7sQ^qy6XgILN(K{N*7%{?Z#5fB8XM_{)D8@R!g0vhbJ949%#=u`T2H zM&N`r{N;>^jK*{Z84`A+U@0>W@xt;aGIgr z4(2pNyG`IUL%WS&G~R9xopSu;;|Ba?g&u$T=fL>O-?oLnyv~5XoE#?plA(rY80<$F zpq=bTP6_^!*^jsh52+tT?_dB)n|=_zfsq{gG4ygqGT<*SWF)j$4SzX=kqr3D(-{eE zSQ|eh8OeaZJjei&Xw@42vW1aS^@Hd8jD&Ws;V<80Bm@5P1x7;4*YKC~7|DRYyqicI zf630S;`=QP9|6sS0nZi|&cg(oVQR1SJ%d8#zhYJ4 zL;I(-!~6C4%ew>PFN=fXFW-02VnxAU5<2M=;4cdafB7jxF6!}@YdDtCfWKVIX$Jh| zvz%tYUsiLP0e^WXry1~<(>cw6znsiz2K;3Xry1~u~XxbJ#;c$3N43;bq!$!SI)9ELs^2ufg$`CpG+JP@Lta z5aV^>F$pam);!&X$D}oYio5N?V^XIzg^z}e^X$T7rl1TNQjcJ{oruRA(FPv#C9JN3 z;4yCwgvZRlcEk*ixf)y4E<7edFwO9on<2EL>pw-i}Gkym@tMV+g16{Tg=IIqBq*knN2Fbz-(2`N`uk?>JpAq$&UuUlo>) zVK*=mo}l>0tdl$=^O%)z3h_J_L2}tlPIlMrlS&(*2X+1h9;-%6*{j95b#Nk;3)|s* zN1a&q6lM>=GLzvt6ITW9Ba#~qsrGFdURzMN+g4!NOmY<13X_TOt*hbfG8#6+mSXXG z_$j%yxmdhrU9mVFuBqblaO_teLHb;U*>$ttR~%?s$WzXE<`A<2FDMq5^(=O~Bu^2n zgkjTs8>daO6uUw36u~AK)ZfU|2vDI#D1rqrs29mpE2z*K6v5sX)J&Ob0~K0=B3So= z+FPdDL4{VJ2)4YSlJOvNFewsLXaR}HO=Q#(nd$@;$N3iZ26gr=^#1Ok^adq~D8C^} zEGS8PCRXFx3Rg%lh^j|H<-v{FN4M|Ula0+MmnV^2U-i@44t!}*Z`$6%+sAvp{yuL( zy5ne8gqJqG!_RSoA`5eWZ1DK`ESI~<_%!xlJN-lp!`22Sr z^nbaygU`?E;PdBb&r^Fd^IzEmQQD0c-KgO;f28(2gtuo?f38Yv24b3dbp6EOm6ANz zb{@Vou)Y&+J83vDb-E!G=eyf>P+9Drijm&OL*-56-cz$b4gCI~a$M#8WDHLZ1k8-# zdzileD|pBZ>HPuh;gvTBa9m*e&e`932)Cq0uS zc_$z;D0-`|E3T(KaEP><7cdUxqH?t7>{C`Wjul3N>Ev z{QXvq7c_t8YWXw6K_)UbUmsxo;D-;;Wo$3Gz$Cvt!Smms`qMmB_<%16IHTepe}(s{ zOWp!@V_5QHL7RuAtXMh}yaG=SU-C9c>%Ngn8!TAVcAtHNs?i2XkklE_sD-4TtCvH_C_pf$t&Nr%f)otJy=3uSz0#>hyS%or7cG!Pf{ry z!(+MKAeQ|LsL(2`NHL`4!J~VvSV8#GsR8MstCN`7Ey+qg}>m@t|QLo9AS-(TtV|n$vq0t`&bRdb%3Cw(e4GFKjJum{U}ut`Oh1o8>KVw-%s2FY(xfLQlL^vNRV`m3|5l_Js7h0#5=s^`?7~sqI+S3B+Z3~6cTwO&RVOI=j!wjXjL z^+&DWzRQW!`LvGvA}6MRsP){3I57=Gt?QO>VkU@A@1JlJ#BQad_4GIpQCdB5e5u_3 zjxwO7c|C0dFRXgPII7mu%~VhC>FP;!aT=ta>dfnDGRvf)o^lzdfLp1yq;F$<`mXbKF~s1JrTZC?N1Zgjd?wt1D<(3U2T~6s&)NI zo9_rq`a$6NuE}J+YZc4t2&8GKk%dI@neQHBG~;|XhtZ7l-JckZ>P_o4zhgAxe0K?> z@%fJMrESbxrsHB%+s}2hzm-Ml>+xYgN!5CEvl~M_sv^5T5HEC*-K&sdagp7#xH1vh zvHI?yybcZ}Ilj~=uUpQrq|1EdbuY_QqrC26nTpn;lh>8VRHMA^CYfrK*G-nGMtR)@ zGSw)rOOvT+bUJxm51DF|*L@F20Lj;k^17We)hMrPmZ^GqomlavOx4Tm#ENHSDwErJ zA7*#7t~Qn5c?n>;h;NL;ff_TK!rxw^Hp6Pe&VAxZvn`C)U`1ZBRi9|SzXxgvnfRUk)y>F1m zD`eb?zf1HYN{Gzs;p3j%ZLXeWJokiTIuntj>L7jw+mJ^Da?q!?iGUvZlu``jqR+Ja zo*@7y+2M9>`4!3KhnDGcZVWBBsqE zG>t;v4d%5@ledJBJojIxPyW_6l1I6RkS_P%r%!i2O(H=(B!-eM$G7Rzozp4la(9mU zbj6OREBhPNr+O6QZtzmTI37azazBy!l-IVIGWv_o@1Wxg;LF}3xwR$_1z+_CxBnfY4}-vf0sBDjlW*Y|?vrm( z#ItZ4ciav<)?1P3f^aAj1`@|3`#n8cSQwRnusI5noLy1LxU42`d(V)!y&V)hL*Djw zQ1A?)yJU#hMDn(W+Xg2RTJ7xTJx@64Oh8!E9VT~+yAy%=**n-B-D*kf)T5(?e~XB_ zM4Y+>m*hroiR;qxF~ZYvxO^dQ>fdllM>D_BW2y(4==nM_yfz^kkgEiOTqPu|A1yq7 z8cuBMwaK0^(R(iDp)P4V11XG@WdEl-T+E^ z0KI?HAh7lgLedYU;c7t|BE6HAuxqriH4Twk(i@Tg7l!`R^5$sat6})AeZ&4~X&4Qk zdnnzdnIOEA>3Vgv@L^^g!XueTvt4(O7UqqJ zL%5V+VXH=@;IefDBAlfAM@AynQzMH|<0a=5p{zEaQ-mBZ8dZd^tvt5~AJ%g2rO4jW ztRfWBL)liuT%2u1oQ>I5aKFp8BIdmFtcdfY8oIw8uT z3;zYYRTuutA0y@^`Gc$nXIP*{{`rmeA;Rk{;LcBCH%MXUj^;)`V|() zBy9Li=Yn2>4slkzA659-|m~6@V}=EW!D~*oli5O z)q(t@_VAO(f6c++$(m8r1Vt< z?q>M$iYR~=r174ScVFspTBYoRIpW*~xRQqxu)2K52V&XV(BMd=$3}}4|Hjn>cb(+^ z6i&eQO72ez>by4c2UcMDShGifJ!vF_xf|gQtOtzN;cKBb2R;{Ea0>?S2_)pb28P(v zVUT_6hGOvs68wH98)tux>t-=sqIj#pYZBA1sfE!t;@k+s?V=VjJ*TxWd)2JR3f-{O z|GZVQY=8%`zmcPdvg?sMI1pn-_HfAnbNb5}Ws-%M*hKIEEviCb-_CqXrFLe6#R3+V^<2JHE^24 zjeAc~Dx>|I)1uwD_Y|cu+LN5t&5e6c(GW(vm(yb0xc3xgf;Rgvc&F2iYfsTgy1xnc z-QBqM6lKx|OGB6Zn0nqvc7(yKczu}Qth9)0b$F~d{P0~`yce{1LG$-lT|ATXO|K#LyFuQg z$A|g5{nGMtn)V(O{F)YT9}Gfe`)k8IsI#N)sNan5(ciVD?p@5)m+YtJkLVJU!t+ud*-5?Ut4K`a;x3v0?-B!)4>{ zfw1}niO!$Jc{A{6;$6%*E!Jf2VKse!D(nH$GdBk=T0d7fV+#zg=)W3?EtPO$F{cY#y-nK&h7= z=`(v~Az^k3 zO>Yy$R{c@y_Di~P$#gt>fIWCh+xzzhzf5P~g=%|`V>gEOUWfst00-?=e8>E2;Yh!9 z3|x&;-9GpkfiLyaBQdiJB=--)Ylp9=$)uS1TPj84y|Waf)pAQA%_t3xmGDECi=iLm z%ty1fN^q^tW|buPp>txuJR+9O!wV!#C~Sl($gUGB?qL*6AAE#jv|BjMg%Qeo9j<-+ z8SBcoqvQTOLpdFS!z{I&yzIujoZbhI9ewCuP80Rzr24Z!QQ5{Km^l_c#cdm?%*eMN z$_u4ii}5xC5W^PGjYDHm*-ydD$ZM>y`$+zpww8`TL@E3xr2c zFn?biTepmn*DXl0jdcs0{13qk4eORZL>OyWw>TJyty@mOX%@GeGF`WP%6w`uyDe>> z0;yyB_hSJzZPRV?$$iY2$aHI$7~3$JLUgSb?3E znU&{h>>K2Hr!&ek*HK=3*FY*yWX8u&6)R2nsFF+6=%%}bxEmz*I9I{6jgsfiRM|06-RBXkH4>8MYINFQK9AJ=gpj=K z4ojbWLR-nJ^Favd%l@$R=^w%;2hDys>C67B^y$y;%=BfyTl(~W)tTwbezNrGlYXOf z%17~+rB9vCM+ufX-}mVJM7@NSmUo^k@74LcO8gS^EksxAi-tng}OypQ=kuldV@6v4a2hp+j=A|Jrs-f(Zlx{a(!4vs2Pxq7Hk z=tTWf`fJk^^btb2Ruf?tsKcN84-SYn>wQ|aW^tcZwGl7F#nRl!Y(dyUKCK>(f-j-R zqWXQ2C9I7~K-fw?t>!qAaJh(lTGf*~t5Wi0RZl@FxwES8HW7}kj3*ZEbRwZW&VFxZ z3G=%rAgm>yRvWvg;IbqZ3C)d#$Y)dRl(({lRpirZtvKZ$*}`)2Y1QZ|+>kB&n|xX= ziJQ`xExbrRtrqr}@_aUYT2Y1@$){Bd`Ly~jA)!25m`6UXDiiNRU!G4st(K5at4(y( zdO9MN_fGhCw(uEuUn`{3s+d$NV6hv2JT7~-+4Md=Jhk!&6c!nUEVqgleYL*o!u z4}*y5*>XuA z%<^-si22;PR>WCxt`+gWJlBetaK5?0#mF5zPviu@a!V>42) z+Y!EEPjp8K>+JS5QNs6jdwrDfSfum8C}BN0VA~YwXowKXqU;ElMGZnnHTbm(0obH0 zJr$QkVc}rH#{-4^M6mp{m*@M<;iGMQQ|Ppu_yAH)ZO(kZ!tXxp+VV@G!{5_|Yw8?a z6SdHvJf7*1E<95gp6RE7XNvo|;+cY+cPNQNnstDttp=G5c@pnB@9;YfFBAxmv|iqy z>hu?(pXd0HmVUdQ|G$T43V7b3t~D!wrvL7FhlS#h-M(U6$lHv^9U|AtVWs&bXT?Dj zRXxmPkN?8}O`+hKg1uM8Gll%#gAC{s?7hL|-KP%E6zn@mw#(d!h5Vf{ZGNYMXA1V- z@XL2D!xjk#kKPdx$uoC0e|o`FTK# z7YtuDokc5S;-_C4p2-QxQWu_SEc)zr(vZpH=2(ZR{^Cc#GriM=XZl6snUcEjOp2XM z7oLehEPmN|CZ|I`zjWc5u!u1AKlp4Ho+%Ygg&K=3mCwRK{a3|z;h9opKfHnPOd;(T z0z~q`GnvIw@hr6WV0b38J_ypmjAoVRCl3e^iMIpV)iPX@SuC|3P%MUP3cVe~(znQd&pQp*bQa20 z#b+Q>dVG^wx*EXAXirHcdp}8s0^8RT`vvlT786opX$Ol z1%bzP3cl&F0Qe?H8~COXZQz?;YXjeO2?Qy@@J+`l{lNI9_qy;+)R}&=KVN)PNp^62 z)3*%YgplEzDji92Y|~CLb*IcXZ9)hrd15zgplEzKI)!=OFh2n*Q-^0 z)30CD@J%~ZeABNtsraT}zhR1RdMFfp)ACU8O?yJYH&qA3H_bUO5WeXnAAHmEmg72n z({>+xlRKO6O$Zsj>A7K6TrM3Jjqr2AH|-ksyyeMk;ZedjEh2o=;!M}RY++4i9Ku$@ zHz;_@HEqY*A5eAByxZ`wrorq6~?L{Ze9JrOOSX2e94UCGFa_@tJR6OqZ= zYDQg#k~lHSikJ@p*_16TKG%vk8_%^O{&(kE5%ZxeD`LK$Wkt-NF21Q?)W{G3PO8bl zFAd?;Cf3Fmd(+wX;iH4Xexkj&s$kEx15*`tzJ2TF=Za$TX);u-aBsb*AG?6XKql^( z(4f$LSpIK*NT%|ncEX|0Y)TP+`uHS(LNuk#Q3wE39@6|R?S+~27vyt^?c-#-*pFcTybXURG`~v?Fe%wx z;_r9q20VGg5yXXGrEB4X=|=ckx^*+IVSjxinO1*aEEXRt&KGZmlct+C;o>@?9)$;{ zYW)8Y+;#bI#e}49f-9%%j>*IgaNV>B*Q>?!J8D2*h5K5%=kZk6PHT_=thKMh>u=J# zbrQ=n0i`#%c3Q_o)^4DOCD`Cf%()XxCSfNxi_<2-YQG4^+0dpF^>;Eg0#uk{7jY*| z1v1qNY9grICDRC*3L`D%lqrp+kStT}pppwFap%tQMbrcXt+S}6iJM_LZ(K8DuG(Ws0(FkH&BZ}ox-Spm#HzJP672AMlF@8ko_5``yMr?%9Z_OInXzXwv$Nm^xejswCAo8tkO!zed$Lvg9n#lIVfcaa z_5XA>pnE?{|4*{NoP)WdD}RMR{|Z;gCT=9OklgWgWRfLiZ=U7vFXs^1gvfG~cHwz` zLjIou;hlQWH&z?uF`?s~Hg*v2)PuF2#ikglHx~h%R+WERf#xuil>G4w1G(S9-E}aXsbWDI%x`@3Hk+(0= z-%*q<-dG{jamK$D$nr5w++^w=_k5b7Kznr`PmAwg}t27OZ(FnlBdqvdYI*L+HDo|JN5$8LPK zMkBE`fcWv&FKrS+;BOaW-2lJDXK1QgJrB zeAbgj|50_!f7Bszg#-su67$c3EeX6kea>lPvH4*BqOc_ab&X6#-7@b`*ph(yhD^nV z0=}U$j$T?<1TprGHoAc;W5>3 zgl-+HYagc19VVwpeM?YD0o#@7bMLnOTu0mET7Vj~t@@?pmP%=lxpXsa0yRi@55d-L z;X1h6X_m;j&H&p~jER+9|mYz?kO;B)yRpkY%-GX@cJxv8)#Q6sd~#vEIexREhaXDP4|r z-Uzf>)cOX=Jp((mrrW&Uc`QOs!1C>AIoS;5G?3*?9xqR4H|FEz323qcjF*#?@p2{k z)H95iY^@zI%c$3;HFY!d&J;$!nvVz6e${UMyyqbjD^?XBEAlnS z&aOKS;wQ3fjbvw#tC4)|CcNf4yy8|SPlIrdW<0o0pMoWe?<}@TEFWnuTN_ILrhH^; zr*oQ*Y|ScDjk2}902YzN$tYXfBvUcz>11nlGSw(sdr77mWor+~RHJO|uQC-KS0`J$ zQKlMYYm;QEQMPuzOf|~Z2FX;tY)!0)lc{?7npklhzLr!On|Cksyp)f5&`-{G6n;EE z0NZb$hDK-D7lyS@3$U4jFDZ;?NGTX@NVn$;f*Ug3aN5=H)b^Xc-+|$gzUyFsEVBK* zy1xz(iGK&hqQTiTsT_y=9TY1F4$kyD&S##TsJ;S!NAP`m;WTr%c*sP!;Ry}lq(XSCEM4;8bR6?va3?$^v^)s`AEf#Z(h`58 zjl{M6c?jvN{+qP)@9)g?RsU03`WJO(`l|mXE&a&OOkZ`+rKCS|YOsn`_5nISNqex) z_a2h%SMyU-3fz$r+DQ3v?83aGef%5g{4)IyqyT&VA@4hNewAXdLiA3P<-} z{UyKjG=EE2NO<>v&sr&|{`7u{7;?>*sE=?euGN>S7y7rTMD@atOP%Ov{sYwGCB2^{ z_`CV1g&g-pya$-cOHn}n?1@Sjgy$W=n!M!b2j4i`9SI0aq9Jv8G&&iVwb6*WfxIKl zCGSWZ$UD+&1ROd@!E1ybI!M85-4Pt>j)abP?|1xMVPR|n!sb|*>FkUpLbZs5o)Ixb z?-Hjzo+W%v&XIPxrdH#UoFnauyY%%eVLdrV+SFreEiQY~WzVVb4pbZeI$Ri?JS`fz zN+c&li3xK6(n-X(EIPdmee&JjU~TFRS38I4s=5y%J=Z7U88{N^Lm!+p50l#VGr&50 z1|mJu7gr1W;%Y5j?V_tWDY&Xh!Gnua628w8KBUXTDX$>)h2%S_sXy+w^-q9br|uJ1Ajkws0T$SgJ|i4%W$`FId)O3Cqty5{+lQVA-4{ z+)MbN2ZldjS&$_>bM{1JxMajccu?blF#M28fO|Vvp=V|)q(Y1( zm40wiY6Owu0c}CD*F<&kfLKf$LNVy;u>NAhyEC-_7udI9opWbu3XAUx)lgpGIfo~` zi>K=InN)lR=toM}(2pMjcoVFaeQTz(?}NQtE#!`c&Xg$3^KrD?W%Bun!JCtKKhfaLuU&DI_i2iHnyuPOgQ zuNM@l-$5}B?T|GnRi1&gb>~K1nV{eXa;~~M_cys$=l-^y9mOYa}_)us?y$TqEp{hWin(S`WDaT4ATZd9jqxT~bW9xh9+w0C2p}{&2_~>?QiP7{BrXJM;5KnC z^en8MQNk|b@^jl>(p^a5;v1Q`#9%z*KxCmOXtIh6?buNtimNumUlX+;o^V1BPgl9kW1f! z?d~|*@I!!Ialh(%I}~c=h4ZzB`nf*19F3M`m_;$p!W|QI)3A7<`o5t?snpRk~{ePHl}`O z?+=7WdXx12?ZqSgKP`QoJU;aDIlqI?pHTJb?W>=6I{5tm>)`X}YtPI5H+=mH>!jpg z9{LsLU>^FF_-b>#1n;EmbR@2qX!g-dP|IJy6#Jc*pTWpa0DTWlXI$5ViEG2G&-{8} z67u4QpVH}3JFFiu_$hgnumOr*^C@;?Sb9KHj&n+y#0tUQyEHa&l%Sagjk zMQ}4euLKfh8|L4s@8hpgOaNY2Ik)7%tPjo3Es4hqX_kSa+IB#k3Y}S;g~1s})+93^ zr=B{NRsp#-#%hsSM5YNIhnc(&k}P-9_18`;&-`xsrQC1vI<-6}vKxc`6Oe9xKF2x4 zGe1}CSJ;;GbHxhjD!{p7qARr&f@?ZgELA?AqaonAVmP1UJ&5iQ-wId=Evh2eL1GIz z5vouiNI=a)qr~}QkIH05!npysHIA3M@>5po`ED;w(tL)#5>Ke>X!CM6eXg(WImp#h z-Xzt)GGF}w={e8>u!P-*n%-TUE8ex2FS^O6I~D^pH0b@NAu@396uFfme`gX|XD^M| zw8cW~BNY3DZ)~I8G-7|jW49EGckR$eCfMEO4l^_QbAb|2$|vx5=2xX5WqpeJFY~pd z*FKzo3-|{8fy`HP?{h8)*n#sqhk*!6P#MN~y{&d|neI95JK45K{jjl)DymJYAgsOv zRuJ;X^-{E6R_jN+>$tvr7|_wIz#E{^*Ysy{yYkJ4+^*VcDjmzo7~~|__-@)SqS!;c z{IzoQ?H8;ZsaK#JgZGN69NO))Rph)KVQnp!IFfCnM^xp|u7dgl;)c;52I=q$+V=&h zAGPw$I;U^H57swL-6lQ`AONeM!1)N?FMa$M%KggpU774%Wz?;h9x*_>Y4yvaGB)u6ZQyqGK5gS@@!*Qsrd7k%4)uA}RpQRp=quIp7&&8zDlcH=W&V}FNZ z;Y-VjSGwB*d}o2XmYsL+nL+qY9RJw}T>--^`QVjCmIALNUe$oLjyyxx&Du@SuhLyO z`P23euXd*u(l9CeuvpfQ-jV)8VRqxpp$EmgY;WaPSx9Qq)Apu{1sn4ad&+WDvH;)( zEZEl!8Nj3u7R=y+cMH?7hc`~Yz@Fjt^&_x)Fd(uTD<)ga+ktO%?(iSEglGc4CMK7mhmLC+S)Or`Nq;l8}fUSS{38}Q$ zVP~Z7^1g@|#dN+sy&vd1cE&x%FWTMnlkRtTD-b6H4YaCZ)eb-!gHbG)mR0FrA*8PA zx3$y{p)~|cU6XHykiM#a*3y5YGt*b~|4RBZ{}MFss=nBv=$XetX5=N4C)&U3^vM5< zb))w<(N+I3#8>sjF<5VTM?-pQyCY5Ug|@9nWv z3=@v@!3*ZlK|S-65Th}vc=a%0RWc&1O`g7Km{5BL_-jc)z3U9{AL#pz<=9Z+s}w}o zmoojqVZwoaxIEmi@X2Aq=lyZHtN-=KhY6pa33ba!I?(5lRLVjsWr42t(N!fK<@3aV zgxy1hw+GO-3?yCoLeeug4#HdZ4JzC*On5KtSx^t8Peiol!4vUyi!vtS^Q(tUK-KOY zVgiG1Lk=+QF2>YXzagl2{udylAnXv!B%jjWDO+f6q#aUqtfjz_} zVBBx~;GnqkpqM_Rq*$D>^o~{WrM5dV42cF=Hih z*W+&`9;qQfI+)NKORa_30H9AoAsBSW+_}SErY~i>V^l9GQz0Feb;s+tE|u*MWTp#D zSv&k1=Q7=~%uOUN*Z(pDa^TWgJK_na5SMFsZ|Bc4-Ld>^8gaP}_t%`ubjLC`lek<< zJDPKu?pWq#5tr*>lR1~^j%98RakH2n_9Q7!mrY_@CYdV{H-~XQ<6NdYmbpd5l^D04 zbD8c~=1w7Q5#v6`xlDH~bFU%p6vmyyxlDH~bEgyc8pgembD8c~=FTAQbjH1ebD8d# zxWt*^J%^~kYZ&_5ZQPB!7`C*pIFAmS4H3bBjh)o@@wYL z0?ITs*Z%%2D969o?8%wFo6llyku>y@`(gr;dB;*5qdp;Y{b^(e^}`Jv)W24A@cD~6 z_Gy&(+e+>G2CCev!&M&Sm7SDpU><`#c7K>>g9}s{0$pP`#TMmf7Yd9cI*?vHr zi0fb1qkCYsWj<;h(C><6+wcHVi@_g_)@MQgnT8o}@_REegPw)iHVrfAAxwve!BfFKEih7pw@N`e7zV@IQaB8z}P zL_Y@@2+EA3qDhdpZD9r%95+6- ziJVz9-U|hHRR6fAxrVh66B4_>ST3|9kp2;PTwmg|8wXh3CLP-)`jh4L0A4Jd7yG=z_gN)rcec0{wQ!BM(_aaMCpD~+=;dbx#8{j4#cBsjAm zZ0PZ+Q{e6!h7LK)TVI;Ki*2G#OG#$Mx-^3;as^$o z`WaI{5BNl%Vj06p=;z~sQs9oz&kH>_bnemc%v=*fKQ9bt&;{U4tsN&Dz?<8-X4bhr zj^R9zBG|Imh=Fg$dTemfNQlby*x;Ipj(>}wmTeIKO#OUg=QY~8jot^9`oQ^a+Ic~J zpcMU_^rkj_S0nJX(x&fi3>}!?#P5om_+7f~J8NBq8mN=h6|`iXLE|n`SZ-L^ld0*tRKXMA=Z^g<_NrtGWjS|b?q+w6)Iznr{Ve*nDybD zf|Ji>AL+kv+b-;vP^A#d}XadUSD4ymNU$r5HFvtG{sy6k^($85f|A4x< z9-%?FuwBqR$2}Jd6R6kJk6ZN~RsDE`e|e(%aZ``I23)A#2?A0&pV<7i@5Nl{OB>LS z<75#MD-YbYrrP52s0%19l) zhLZWD@(#83K9b8GY26y>yf$v6_qNG{I-ESM_q6eb`m*x2t&uKmn*v9_wq5bKy)C-( z9sQo)j#S9)((dWYUZuxv?e4@d50g54aTjeA1>Z*c@Wb@9 zID-mhq&?J^y_tbR+dIC4LeF$w;M#u*`p`FO zD5*V#?LHCivkOS${m-80(|UT^Mo)+7>F#Viy_k)scd}9G{_LytT=r|u$27!~QUIw? z?+Y>Vn%);;kd=Kd#3+`WT!hK}<>X}K+<8he-o9{3GV7#cB6viUKe_`#O1j)iM{1gkm{~+z=$Nzw=VWWl7h4>c{U6r-09CK>~Xhpb2Ijy zThSHvgFAJF!v0SgMT^ALi~FXPPMJAv;?;w%o<8Y+3MNmUIc3(Y?3@9azG>G?y!y(? znKP&SY4(&^rI{tuXJ$^GSUNGY^v^So?64yYW1*LnG)FR(*19fsjl$us?d zZ%8j{s?>w-EI+n=&q~w+M@l!)k?8k#qzx59bfR*IbZ9C|Jye2T<7ilfhau8+S+pv> z!ps&7Wvu9lJdp^+<{J4^2KwUJ@PbCwYmDxS)1|Df_ATSf+MV)Y2la>lqnv_~1tUg6 z9CJ`B+nw#uj;2F9dTxZbtmP_8{O7qi_KwI(hsv{Ek8ISbR&c|^vbEVl-wC(ZLOR!- z>#6;K=s%VBYC%X~&K&HOYG<`@b?pkFZyApxm@R}E9lk3nOYfC-=|NVzfXip1mYcmz zpGNzP$vf}#uv37wcI+T1WCVOg|2{zhlq28Q z$n^y0(R}!R@^|HY{l{L9dJh!i1VvDa|J)S2(YYtffm*x+JMx;hK^6cqc4 zXHK6nWoGH0FP?by>?uQMPXD8^SJAFCa@wrfGiFSmSvqC1V>jx_EFXPvj=}5YcC^#n zj=u8+stx*%0GzZPNg*O_M~KJBZFj`ZL6$qlz7(-3^`VYZKn)LnpiRja=xqzAf$dow zoC;6~Bd5L12%bUP4DW;3;6Rs~)gAVzcdpj3ClZ;KKOGyG{9Nol>*Pk)q(H#f23+} zYgP4`TGfHfoYmT-je$*&yiTjyzg5*%Ym4c*rbNAZo!a^wkKTiKyO6pSV;#W5DdBpz zqu#Z=-naNx)L^~YiPsAwuB+GZdS}P4H!JaaVNrJVYF=-b`1PhIUhf9fTgB^L$4zP) zgo7vXdh1c|dS34zn!hAb?oE`dp`GFX zgMVO-6?I{2&L#I~+2t$Zk{?fE{c}m|bK;d>N^&E^CdU~ueej=4 zrxeVbIq}bS@y(>^)2^8^bJms9r)8FamCm%wZHQ4e{tZzFyml}e7Z6G!yDP4dozl@bQV%17p@n z#qut#O`2=3s3zCW??U&Oo!`{NmI*FJ61KCS9&aq0<=Vuf;K62n{4 zf~7dZ1uypWt*q@S_*U5KPA_88oVaYYmm3_{@w8rTJ*-X(o(G`#JZBcT|GLE&=$ED6 z3Q29mtP3ChMzWe}^&@k0k8Vd19h&iT+*f?Y8rttsl;~ zfN}dbPane(A!0nWZ%3~m7G~&ZL}!QUZDZCG4c~2p1#-If>hIalSGMt>A6P#$*HHei z%p|DGl_UQ`u8z0BbGl{(Cnrl9VPs z1-5GYu{t-vO}~{oZ$A!*zOr9jYIzqA(U@=hR^m36&EFd9N1fjJ95M-oHG!KfWDAqs zYU|DgTyLKD!R&4RKn<>7!gVa|*7);kN?U8eerr%H3I9P-0{yCdfq_|iACq6V!P}VM z1n7|vJn6eQw`;&B0^bs-$H4Oky+f1~$Xttg~&gX5Q*Oyw?*Uv40k z8<0Rbj6olOMD`E(g2-QdxxiovF%T+t1L%?=2z;P_hMxfNY3h(V z4d-x4w6EigH42G(1I(!$d_>PQHm;5~2!!3w1hH z8g~fc<{Gd@$6wGrSd*)*+qL%Pt(*M`Czh{+Glsv~a@hL_na8SZbBzS7sH4Df41Ik* z7cAm0^pbEP)-sc61+JpEHIxHKDHn+#Dhbi);Tvep(tQv!;tUFz1W_ik3!4K&-UI5q zA~de$98i~w$RfHG&yDDbv{mOdtIKJ@O4+GF2IhC<1c1!=jrlyPrTzAGka4E1h0f%YPzUcT7e8{9JyY+)nX3DS!S9ggwIr zbMJ|aWMm}qj5Q*|jf`ZT@tnv|kb!V$_=LxE3l%p*hQc!zq6B_4({I6plv|qn03nJw zU(R_$cum>{!gqn-a1g%l0_LSi#vVZ1J7qhz288E4FEubMRnY%Nw;y#M;=2mk8ioK7 z*j1h-!+cX-X^x9fy)omWp1K3W+`P_ls8jH3N2k7)k@fwCa9?1zpEvg1l}7tyMQh$+ z6+Zp`K(+}&!5RSexMzgJC=az7^p-!9!NT!vE4~fpM9U?UDgSzf>ubE zB*VP#wPZJARmpDrew(M;DdSKw%HHJmKGF$V$W}<#xRLvY+l|MqJgp&ZCC&08($$o4mfLC;(dJ>Kqt`_4W5 z@t^eg9Dl6z0Eaht+$gZsgKrPf{TDZ-^tq!W+fD{rKhm8S50E+5L&v$1x$HQ!vWu?2 zc&5c?81=H2c*UcUJlqP!m$vHjDZXq)HBnNby77CV3Ok^sYPTmlve(tAXxiIp1={mM zOtjnE?NA20z4dnJFTQWvYHde$xGk9BdF|-&j&|t%{rvF>dVHQgu5JftZfNI5fzR5Z zitpRC+Jw)j!2I^~cvpLj>4ElcJigE#1va*C^g3K2l>0C}KFJ?n?tsrK zJGha%sY4gW>N>QV+ll?!0lRm3Iz9e99Wc2o-Hpd3=_pW{-fA(>Asq$Yt>^r{mJaw)aqpR zvp6U;tg9y}>rD@tE?2VHUZxiANAFOle`q)6F zKLGA)ZMsxl7K~q0vJjFJuBk2z&T{)FT_^TZ7)r&8D!=cBlpz&|)di2BKREQ_i~uh7 zJRlF6grtJb{>Dv}{Wkf6Bk_JqX-9;(u5B;*YOtEPLXzJfISeMkbu)L@9d4oCSy^5= zyU-Ve8I}fKb$|wyxmIzwG|L}sPDAS853H{t7|0j!949*@p2u&>kc7S{fI9qvTK!ub zOBWUfX1EIj;K(LbBfh~pUISF*2G4*f`vG_X;yCB=sn38O*K1WZ1J#N$YN%?Lp%)Ge zVFhKsx=MQ%goYmWAzKSU=pe^4g!vI84JKe(**Y+<-^|{v1!wWIQ+Ep{&BX1U0w(%y zeqf$UoiSjfmhVR%HiOOhgJ9xbeHR}1;0!?-%mb_oLF8CLvCgEWISBtJV98ER+nda8 zbK%$jx&~7eBjhbh`X6LILImoClmn+IvvkXY0bfYXAll=>KOuRQ|Mrko~O<_f7R_%MAMabF0`X0k-xbW2F&?I8wTf+4)kP-FzI!4LxGTuE?YISHyE zf)64JOw;cRp)-O!19KrovG*kN7-Sb;C6g#u&Lr9RV7G`O&dOU;+8ewm*)iaT0at;# zya*>89_+CS1}I7E2ZMNE!4cuk+cf(Vn==NllwaPX9{|My|7-IPO59(6CBBU=ueR=6 z(845h7@O_B1sh);XOMGgEEuOp2(1wv5}r;GgZw=DAlvhf<_kFvKdTvX?4#LF99l3L zvY&2>kul^@ls-UC)zIV1uziHz-q()d<({p`P@XI``@=CJa@P!xf7I$!oT_xQFJR671prEPHYsl z$3Nd8%5JB!JEK&K-JI7;e)+;78UEFF_i8LT5~CvyIMmoC*%ur1rH~s7KTt0Pi_yqo z6UaFlp`QsEyW_PrzsGL9HcHd{u9Zg4@kRr=Ld}k4b@a&5D1s3Xa2O{F~?KN3?iM8`QG9@Xk0VwB<4+ z3MdsQ=C0eDpVn)*|d*qVo~heMuY;{T>+X<91F0WzG9hz(R)Ik75-T zyabi@qH1DNP&y`)BDe`EosQDPr=T>9p>O!a&U(b;CsHs#EqIN`3Z2V8)4%6ITx|0b zM4T?fDMA7ceFRvI6;|98@W%*;$H1}&8NY>sSdqn!_uPi)*v&8a;U@8!$DxxA%`a&t zol*(=jN;xT(rViQ?cfLTK3sAm-wPgaRBG7gG3RL_qPj?ZwQ(E~_g{49FHCxgn03S# z5?iR*_`(( z;DkycDn4uDeJ+Rn*ro(2k4sVC7P-H)^?sQHUFj60bK9ea#qE)Me|zuEIqdoNB}kW~ zA-;BX8gk!AyT!G)C)?fu#rAbT#=#D^xV}Zp8OT_gfsCgzytn7DwHf6u{MpnI+1omz zL-idIydu;o?bn{{$xe8DrxOl}4|K){4|ksDTA9O^bwSY$6vg7LF5cI3*p4nGNH@`4 z4mHOkchB+OZ?akW3FDF0QGkp26wo4+>D>bOWR@U(h^}?`XVvE%tQx z&g;d>vr3TO+yfc6^tjFSbx&O20QKmO6E%bk>3I@*g^53b!cFu^t8uXllwdNOqdb(v z?slbq?_zJeHbQMG|8aSL0{T$sLP;k|=Gax+-M(ZnpT}Gu3Ki^mZlMo-o$L9kzJR?f zB%fPKv17NXZ43Sy@fJz0?gcXo`@6w)THc14wWdP!98)2hC-t7)4TWf0xI*-}W2Fy0 z)6|DbvzRb_D2%1!=tIwgK6GPgcP;1=nrVPVeZ~$GLnR9RgU}hP<@FG>Lmx`E#atg+ zg9nrL!^xo0`p|R2^r5gHdNmoVIJQ3Y^nU-b8)bmaO_k_blVL(#D+IP52B>j!&i{G4z@A^LH2 zi6ALNg?`Nx#5(kE6h-Ek>fdr4atc$A5jg<+{m?dzZXP-)<>68f1iTa~mZK>57r>rN zAca22ln3x@03v{GzrVoN*AQ2FV(xA7s>Jor7x1qOkFh-TeCK>feJDj;jIIx*Hx&3C zN3O_8do?=NkwVn&|8orGrMV4^Ct8nVtdlKJILhq!4hqsXJ8gZ26 z0z0@jq(^9KE1~K%#>dx(O7};A@=g)zW`9a=kvs-D%`{jo^2Wg1t+TgPtE7zGOG4MFH>V^d_o3#!FlW zY3>ukm-ra)pHBOjrs5Ob{`(u_lcCpZBtBiv)uhJ~pB(g~$$0-V6p-fnJgW4KtX)n1 zrD^AlF8n4BYrj9L{R@X*)8_dv(32h;_&NG#>PH*PM}N$3!5}kZ(kDGezZ%k~`J?O8 zj6IwT`#{6Fh|q3dc5k0{gKBT9ONtYHC*}0_cN~le8T!o{l*;G z?q|3QFT?eyw8F&w40G@{zUov6>`8Sx13ZK&KL4-kH1bA)XfUAz-GAu62;J#*pFyLT zoCTF9sZC!=zR4Bp#Ws-I^m9_1e&w!kJq2wid8C##gLc)>oj&Gz0XkRmCcTSvr}uj1 zyS~q6%Sd->1pS}y+Lw73H4+*A}>OuEziQ@xv^!AzZibVd>10#I>eKm!zS_<)k%zC2hXzPAD@;Yg$8E(>)!$>!9pS zuW;cH*PT9?L0a1kC?G#4E$UYpx43TV#p+0ZIwE>$O46NfCEe*~UA!+r!`o#t((R->ttZ{-FUNazXn0S!0_ogLHV4B0Q#DF z1=2^lc86DR*V|q9XS2QC@N$2*YS%B>Y(o}GZ_h%;&MfcW0FbOJkk<7mWNg!kV;TFj z=SculBXp;P+L8KGf3Rmk(49pNrES98Madp8aImp)K**8bcM^OqvBXM;Bl<)pZlfEd z&btQ^`xW`eXD8bi}Xsho)}#mF=vTQIUPFwG?fm((j_(ZrYnX{05J< zNs&X^YC)1E%*1|2Hvv|ccD3Y**!5f29ZrG}0UnxF^mg_)_@eIcaop(?;qB45KX__U z#XhzC6+9OOOW;4ctEgg!TK)k4eS^2)HBv7WKk-!gkg5wiML))lJH@)*tP9jnW?luoNFI1DW(;+(*{HQgVOzNmhHiSGaf zxH<>pz%-NYjsNil@)5)37XDlt;`@#-c!Th>;4$Q+o1+#uDQwE%JFAvog77!8Nj0oV z<9p#;tM@@kUO(XPA^7XpK?gucg2@B_z)SOeMCzr0Z=GrV9)AL3`Q09Mvxi+*U|y5E zK)q`Cn9@k(zyIRffANj*`nSY4EtsYSoBIO5;qU#y!B||wKrH6q?+lMGXM>ir-w4yQ z`GB?=ro^i?_1sNlrO^#>=2U~vL&!V4DOC&A7dsb}6y|jvT3Xw;a!ub##QK?C?*rZO z1ux{)T1~{M{v=fImHIWK{tl==mFiFB_18Wi?Tiso=#I)YSZyucFr6NcI1+CYNuu>M z68C=xe&G_7I`vs>TL>`3Y0ZGT!_Bqejhxi93W)nsY`Y#G6USsc1PTw9Ld zFaD6y9Xuk#; zU*Zc5MbGN7=e7s@;NE*dCfqKyvko6-?3(rz4(z5cQQKkdrq$b3#JAX3n)Px%jk&BI z-LJwo=6Hu7~E0 zZ%c!)wV0zDE=SkV7#&S5=!CQtC>YPt&L5n@qRp{d@en%9_v{}~t&c)F&<-n5*VyEQ z<%Uj?>dpB89Q`?OoEI9H>PyB-34Bac!S8yTPl|pgFA5He;O)aw@&{h00{kuYUB8N# zU|P-^U#K5KL2O4AzR*Asn8F{tp6Pz*mQDC!_s0!(vUe)4hZZFu!^2t`+kOuW1}17? z2_%l{ozW1TU(NoW7wSj-^%E8)&kQe?+cv|)cF~xvjjZ?>Rg*y_O(m92`Vq(&XrnVgVuwiPG}*a zPJa2m*&{?e{0|*yVaJFM1V(T?H!(tQM_^j0m3@hR46dQIp>N~9y>rp9SWYiz;t9RU zFI{5JAMuM-z{gPW_S#!1;F%V>utvWgd_P!U<4v%#RLL1Q-(Rwn2?K(&{ zYyKU{$t~T)!LOUbRT)8dk8Hf=_mt4a^fk=`rbCDyIIm6!JJ^#yKbr(l9@9o>c5_0p@x)N82f6cq%XpJ-F6kashoi!g)G)HTxB0Phb z0^X#F8iG*Rup+fZC&uzx{*etEU=E!>@cwc8D*vRfN5XA$+S=jTBnX$My-}iGUPW`_ z>~mk3oo+8tKRDMdLd|SLHNLoupgH zc3n-qvc;Vl=}XAaGHP5Iy0T(v_6Y?;&xx>pB8HroIco@|%A zWm5@yof{r2JeQZ3hc0a1PR_Vlfic;9 z=8b_gJmV2H7&s(rG?sy7=?OjNx~M~zU&tEemsU`3;3-GNM)a=HUo-|4)r^EG7{GLFZJw_v>?71FVUWhd2 z%lQnfy(CI%q4^kSZrz~;1T@)kj!%*uA5yVLU2p|%;Iy1ce+It_wg)EX5Pj_CKVXSJ z690#|xdT9GV3n5ljyi7>y$f9e8izCB>%PEdUzMKhE30xLAoRxbL+%z@-VgceqH2F$ zRe`#wvd~klmiy_OvIEzu^9JLo2ww(12mc1$%E!K{8aE#I;QtPv3vP6zAAOOVr7@C1m;r#D9IgM4bvwdCEulk2opQHzOYGyCv$C z*hr?Mwu#&DydKYp=}~f^q)?rX!dHEWhs!DVXEmo7*0j^#!`sb;YEC|?z6w=de!$3l zSIyCu;rR_UXU-DjzmDIP^jnmhz6rmnD{rC#bmww3e^nJK-Hy8ID6VS-#hoYq7qMtH z*SiQRx7nAsSuGC`!>+DGZlLwwD=57l|IMc!~1h3-Z!whH8qH*&$FASYCu&U5KL zW_&*!hd|_zc#z7TYUH|+3lrnwY@XZ2$W@RFT3wvWbDJBv;0BNrD(=s7zXyI%z0Hx^ zAG!HF_Y)%*%ocJ&#Tw6DXXK_JS3_(sI7nHvf$1dDgnAGiZNdmS%EPYQFMwxD3D;p@r;0BeKH<2CS2_Jhh0YO>_sELMMD+SdB#p7#)DnhDW~QX_1)r67>}D z#xpnWRmbA5^)Z3yH8JltyPd@0^G6)Gcz*ZCRY4Uk&()Sfd`2CP0{9ZZ2@2&gFnzjxqxJk5q9VBQE1L7kI4<`cWf;~Vi z(MvoPTh!Z6fU6@=UC1ayshcb!0Axp$&)O~v2~{`I&SRWQU?z%FiCVq`-X{1o8UN37 zp!nMsiu3RK=GOA_H}vmhUzU3``h6oBm!wMzrM_$RySBSQZ-@$+{YDH6I#cDnp_Uhl zPw8fe^PI#Bw>}HvCA+;gVqMzocO?xk4Cto3O5bL;ySCwZyzl-Q|GOi#7k(MaU5kY~ z9Sxc+Tn_z+77wIKo!64yh5m&9aPG{hhG??%O0DeI4%bZ5s=iI`yAd~UlvQJ6-LGx_ zPV!?}Eg<=Vv}CnQ&4J9NtO^+O;q0%q0Ip&E5*KfzzR#(Y>kS?>{{yvrDeR?rV0f>7 zKR2BwJTF5m#NerX-XMAj%)rjQVWzJCl^3A>H9CBc6i#CuaB9VSX0W<0`Vj+8JIUs{ zk#Oo~gA*i;ap1I9EuTw`Py~OkJ{ymM?#F=B2wvdW!RbdtdbaTCYnV%$`1BF~;T53b zM}jIp1xTj53|_-KUnn1UPhgc*6Ap3wDXZ^r4J2IO_XWfJ-A1iSPtvNsNaB2mI^A6s z9GDEo8O-xlRm3>Mq-eEQ&1pw`iJN33kd@RyzX~>xR(N#*gtr#FmUGK(1Fs(EKcd4cgm*FE zHAceglL&axse{9e4jKeEdDv*Tn!`@Q4e?7N;ntD5GsywC<~%D5a(iL%gc#TYbUV2T zb@=`skM2FgznaU*!7*CT{aV@Kem3=49$owLA7Mw=emJ_m4LuIM3tb#}bj8{93?Zw> zNzFKo!UA!dR`pFXupH(W?LOn<$$>cf;}XOJo9_M)lkh(Dj&v|3JBfT8KGI1x_&!Z=laiD!9Y#0j!wgPKDZn8=9~r$&F?>e&zYaYp9K1>AcSO0DwK z?tC#!r8RXGCefvZ3b6B4<2)_$&cWdjIiUhjW#m#ADwL$TMNX(7o#&<*xj674CscqV zBg!%(7gLU$P(e1&{f5Fxp#~h{kP|A%<+<+}xj3#B2}opbOAS{7WhHD zL+m&|l40NLS9{lh*q|Aw=syGwzkS~UfDC!`qPh!-G>)C34 zOg}XB<%8iLOS?`$lQZ6?7*qd%VowSB9J}9OL6~uJ`hog4vkf>9evsln<8>FG=eyjqh<5H@C)q5xc+sN!blRkDodXL8k%S*zj2nWoTUZU_MOlRL<)1nBSdXg zg`T(7@(WE-+qqoSR%I8p={8Z@M8J#?;|N^BVEryWPYp)85_yaAYUUn+f``hax@|2YLKT9 zWd-FN6@^;9u2%HpGB$7yUrHGph^SiL1BTd;964lctwmm#jO`$dk4eVll(FqJa-A}^ zcZ^&RSDTFOB_r1MLTr<sJW$hFJa)OkOU`LvX^={vclHSPb=#cEn2(B^39ZV6M$lq#> z_-Dqx7Y?tZxqtAHTKh*FvML}&8<0nCK#i!t1Qu10Dl2Hj4i*Dm6TfK~UJdVG{z+4@ zOeHqjnFGVWWfJ~IzBdPh{SV8=@jdN-G5Y#~Zk*pB7UALj$UY(0kUm2r$`^&cfR~EL z{~S#`Xv8eEiHfwJ*3iK6X(11#70nqVEQl(#>}O~Zh_R~VI$u6uK6J_Yi80^HDEb>+2{C_BsvX$Isu>3UBXtaqDqZdSx$5XqOXPkemqJVbczC_#GaX-cFFTM1x$%u z?k!nPUEWZ!$52eP+inQ(&@rrF>aIfwPx8U(+Vnp!oW9%+;F{^(!SV} z8g|clUkm*;D^u8aRDCIIK1gA?45;K=4--#roxp2@;+8JYW847FkRK*cd3t2!x5ufx zWMKmJ=0?_=7O&ourM*@H^?M`h--ppR1QbhukU;&}k@YW6xc-QlF8>0H8i%z^cv+Fg zxneokGQGgk3vv4q@#-9~8Tu!9W%ZXn#bw3f{SV-h^+^%$z4Cn-PW}49i1*p@Jw@u& z&y=QChV=l)nna%)RTvg3W_k0WX_@w~?9UO^(mME0{s%KC-L0O**d@7)-ResFFrPi{ zg84#a(pooTPc(<;Rc-Se#vUVYt0z2N7w5BWo}oyeOM#^5!xRr5YsmZRU7xOd68`JqN2CF z-ggJF9p2VRA8p+X>8q_%;K#%tYg(haxfHpwqK$X`Aa-Ay)<{2V(+ug4ZBXovw)D89 zEs8zU7QffGg%#2+dOA!`57M1}E80PP{Z_lQZG+fudR)-{DNv5}X?V3g4ZnX%OFNj) z?&yHW7dz0a@6z#Veg=NupON-J_y!*tvT({-36+JPy^*!<7_MWKor=Dq#ptsqmb7{^tyt?J& zMM>Xbs&etki@A%Ep2}xm{sGUs{;;MHIdS$?c7}(-7FGSDl&b$zi*);G%w7Bf73jvCI&sKmu|95sW z%B(v(8E518kenGX0w*)>nBdnT=H*NoLoj{*c6;bCtmHEXlLm z#nvS$NZ(JofII^||8TRfk`<&i$)0LAyVI>8eb!C<&4Om09~Aa#GX-f?GtY+#`?i^a z)cKFw3x&nwJOy?JWZK_Wn0FS8CDTCMKFIY~c7HOgeACLuL-k54AN(adIDW4*mp7aQ zudl$mQZm2D6gKyhFsCc>QO4#?)&};(PJgmG(^${7&h#gPU)ft^YmI}^)v)w|AvRPy zZAIwK;4m=Bebi&`2%kK=oxH|n`U=0b`frhmy#`ap<9#%6eK~fCM zTY20v{z|(+tjeBbW!@!|T;}#DaG5)ov2R>0_9^V?R&zizYXU?9&vU{9-#udFO$)V@Ir_&Fl^lNhO9+Tx?Jn~=H zbz|Lnp_oA{0SHL~GXVxFic(yv zMqUItOb8FCmjC8n2s6)%qS!# zVKq&HVa95ZE&=M8)exu&L}oEuq2Ot#2D&FT3P62%>(q+=5}@!Dl>pUeApk20;pxCa z$cY|K1>GfAxT!V@FKAFWf*85Lw5fhu7`hWf+~x75Ib3C7oJ?YWwan2-NeumD;vK-{GK3E4!g! zOp*j#4)v>%U9#4Y`9VO;o}(5BGNRx!%s|%7E)ORT`Yvod4by^Ek+cBTQx39RdcBPf z)V4F^8GM{_neraWAO7GhtaZ_K9~_NA>xYHf+15TsQO76I7ilsU>Fm4tpzI5DOLMV6 z`QjueW<8TQv>2OC!3yVW76ven&hgC*pGw3QVUBt9hf_1?$CvlZmZOY1bu>}N8h4U& z4C$D@sxXi)#**(TL|nchF#Rw8J21{ZU+K~2i{R~?rlE)o!u^tb zRlD4K2dmz({h{S;Jr<7ij_HK4KjxDPxcfs3Or+S@p#$Hoz|La`a5#jEJq4j5uDrqS z**8Z_V#{X6E|oZ+K!covK^`uh9zJ1hOBOoji(v1ZGl~&{exut7EI0wwVvo`LM*R)l zj|^lqwi~%QP#}Q=7S@U;&3)SJvcXSDTqp<)1uA>gigVD-m4XX1I6c6}&-p(HwhIIG zFwO(ctK~OBz2U%0U)g$>A3AuizD@2v1+Vc%4e;>;pV1cyd)$UCmWP~yscw>gpNWbK z;r_$l4I!7m9OO9Xz#kIZlF1)N&Igz~b2{=C(tH%#=c73Kd=wYFO!Gk)iuq_)9A%k- zb2a88*srnJ3INl2FChS*+9f7{TcM7oBKUmVsb)v;IrtqNxTJ?^7_J2-{0Y9A9llz0 z_-X>*4fqcHcf$9^PBG!z44oIq8n(D-xqwPh2-(pa$$-gPXncD>cBQe%Ib(+HThKqr zJ?O*XlMu6N&`=zV%pIq1cwMzCh;^?n%$o2{VUQJs7Sqto?tI~^Hj!*@Y|Ku+i^#i#7^gvJsY4AikZA!bxyInn)Ky2N|8=k=iq-#^ z=K+9zjvLJ7pTa?(Ch*=aZ;A>3c!vUm0uV!GvS*R-&uysxVVF}W#c0GHYgo)1BiUn| z*_=2Uv;QmO9BOR+&-a8zy3Q446~Jgnt-+Sr`B;1cO-!+#f!@F-2RvReGtXPx<)XhOz zZh%7DvFa`UQAHiG02~Hi3%ocX693)?)!Nw`(wj#IZghI@wbOeieF`RqL40CHxIuBgD4)<#2~kUzEQ_(68n4*HHY@%#!`_ z%lvT?6j6DTqJCh()@$B0w1IuI_*2>l^ z<+wu$#}w3n08PT2OTB#nkU?NBqBsTJS<(~<_C0t*)%${}Sz55bQ;W?<$oJLdZAoKN zR*6Ot@g{g7R3@9?H=hOP2yRo)E7aTLC)m%S25g(*rv<-yxE;hI8}arNU&>HkqQAR6?A8VfJ6#*Z6|lZ zzRESo_uB{oZ*O=4b6QitRSZ#%K%^WJGRDF{e{0M$Fy?)~i}`!}OUb|(fR_?P>MUS1 zDji8NoDd^V`!G^8NQiaX?}$^CnC~dnfp<>@|4TyR1_d1YdpH}!tR-4kY(jZc@UWnv zO0b)ZO2uq{f`?)Vb4CMaq6>6rls2?5tEcmewd>scRRgXp1`Au36L!~GJ4 z!}&9i5}0QA1BmNnFl-Q)k&aampM>=#<)?y5a9OK;vS&n}>=_9yKA^svs~~&ViKr1K zn=kfJbTW+Buh>URAlvG_6%-Z3ga)6_k=gDpq3=DSWwRDuD$Zr|9CBhzDds88d{(2E z3G>@DMd9-)rx82=^k2V%bKtWH@@-n+BtEDA#HK=XI@La>Q=`x6RIz{!1zx+DB$dx9 z@gG^se&7)qhoFDL+3n za1RZQvw;1H1>A=@r-f4*M`X@ zaJl(QsD=+i7L?L0Ava$bWz#E_mDEWUYd}^aHyq9gyJIgX*$8`muTnJ(j7>Vn0YVgxrvL0R1=Rt1o zllSWArTB$_do!Eu8I? zoRvjy(B3I~`B=~P^07M@zpYsH*xQX=za1FS+lpOJ^zyO#W6zIWr@cS+XM0=reEYM# zjQ!bO#{O(C6aTsKeYUqHo@ufFfBFx8r_ZIfp1@eCd+Qjs!gUVP`AN!~W7uO!z3}{5 zl2SQ_9ZYJ6=jW0Yq+cf^Soq;&_iJO>3inbM{**OSkcOH;<@9Vb<-Rd&eKTd@81{WL zrF;x~u(?t{nr&#Vyg7<(Z+<3YPkNM_#3B*4sz3dB@@V`;K$p zc^TVuTwkQOw@`MDV-L4ziRX7(C`k9VK-0lg_fqsUwFv1WEfu6sx6Fh4L`(O^v21ax zETkJ-Df2I7AGe~MpIa$N?^6*W{YBNi;!;+lW+1)I+Xd-U-YlfLS3x?jHMQT`{qtD1 zp>+n*ovm9UJ=|KU7{_jFL;3$~qaa<|1_eKED?NIO^?c6n&vaRg~B3;`44@iG*ue>&%1=Eyg$Fs$0^!A0c6r`W0DM%|iKsDRcBYmrr zQa6fy+==q{bxJ|{U}pvCb96QB`p&05GMa_xKH7)6WG%z&bb&$shT~7#Fk0M48#>|C z$H%eHPC!q-J;A+rG+UNA4C&vx&O~}|w-lsnyD3P&>4w(lc6UEIo-OU3fplH>RHUDG zS2m7kwLE`bmV%szvrzD*EcaT#KPv-iMUPaZ5A;yxj%H8vp#16{3evB7Kxccfhx@0? z*wPa-kghv173t?EDz}YhwI@>kyq*fuhkK&nD?Q!+dl{?gnSrz-I~C~z*~&|ou_v-A zzdBn%`c*d7nC-p?^O`dd>0P~YkiOYV`SeouQ7_8>saFcp2ToFuu007o{rDtzXe?XO zyAWx8?;NC0_fa-o%3kS1`5*R4K|1$j1?giaqxO|2yWa;goH7vU2dCs9y)9SyVm!Mi zm-1i8O+os3u7dRY+?k9$@CT^f>i#hJz0vH|Q-?FQsGqxH0^8otgY=ful*cEqdrnjC zpTHhFjq=x=mO*d%^McbAJl}nKx4%tbn@>l}`swbiK#?;%NVlD#d@+`Ne}?k@SoZ4~ zlz(sk40_w2o_F4i9wi8H*Sc8A#tcs|C`XXDLfA zWqZ$}{LtA7(!0+FzCC&NX^)O&U(@5kvwJ@~mOVKLk5z+Cdh$~CJw49LAM*V;wkiKK z#sUTIU&gTw1p|@ZHTVxmcMVovn81D>tULuQIEUUod`=3|H_uU!{%{U@a%-XcBYa<2 zh;-?Y9HgHQQT{fL)efQjTZX0}T{cuf`oU1Z@7tm7&6lwi=PF3&Y96GIYl?mudqq<| zyNqqn=X9{%;uCs~YCM2~&Tbf^^e)9;CmVr-a6{1%BnN zaqK=nyMPrxh1bH7hQnw{KlU`Cnc{!`Xik!Qi&xgdqProYwmC;j~2G7*2S% zeK^sUpN133xOD^}?t>!;+n*mnSg~dVApgdQZm*7Jdq?2p@~@FFC)_-;+fQTIuOr*+ z9?hP<1d^`LF6ju2oj)oCDYlL7C%%u&JC*d$nz5G@Wxj{)P?ST>*}P_{UpHfw%??2( zB>vg%_43V{o`7pKbNKg}CtP_Ao*`+F`Ic3fan^}Z&b&r1?ECP1%PCj3AkXnuONM#0 zlzEsnhP!8q->8R=NSrau!orUvyb-H0*~qrA@0|JO5zp$3)tGesY7{^vK&)dGn5f`& z!lRI!#e`?D=zgT%7#%Z(PR#IoJ7%82jvg3__NXJ)>)}QtXHNnceZlt`{)udSJ#*!sDsbgh3JUiv(KL>^h-jxA`&h8^mDYK8I{x zImv>)j>H2~oqm22J9(UTe}DoUP%BO?4sS(EM)pdC{9q-4+%S^_G)$47q$eO%!dT74`GcNb!HP zcFK9lmnm|IFbIVVkL2C>V|UGlr|Jj5V?$E>tHc>J%V$8p2O{%@O`4w@4V8ii9p)a$ z*fVH`4YfmU2b=w?uum3ECOA(pWTc6L{bD2t6ZDrC?MeI>N{j@iuV4kAKR9E?p1_7Y z>YdGsiR6OZ_|v&cOecBUmyq2FcU6iqt8lnq8f8}X9>`S5pPF36p#l;v;xp=mi#R+= z+S6oF5D@3iD`N;4xh4ZZ&S(iceTTU|lbVQH1N^0JidghE*JqMw&!LEC&4ihu?3dve z8pSXChhDV&qWFcAJ|)68oa3W8W@BO;&iryAP){uC6va0j9TjBAu#}=T37Ww#WY%z5 z(B^|`MduUAC)}gnxw;(2%)@dpcoUS7(7}uWwne#6qf9v}#0hiB5=1ud{pXwh?yM+!@B;g&fY(PIceW_piP+1vEj@ zE7}x@(%VLYU(tu5mQ$oYDsHD&(3MEAM4?w=H5htNXkzwD&^hQaZ%|7X^thUV;@eHv z5Zwd*sL(OOT;V(1i%`!&ZiQZu7%w+_!=GLoiV68mbGAl z^yk6H7<9n$M1LBY!k?`P_+WZ)sO7f-kPe&>{>_rk{`>v6r{Dx^@f~u4<>cA0Ma-E4 zVQk*&kMeO^mW>@PeYqX~e~0#slbaC$@PCHQi#cu@3f1GqK#_#<_Pa;tm_DS9H;+!F0nds?FqrDjw0NxX1)LImW1blh($4~ATG=4ceJ{T zVVNQ6rL@fO>bp4aGnbZkWAMfdPH_RMhNY|YG6n34qRp@qtWaP)C%&yZmi8k z621xJR}!RKeBG<%6ERk&N!tZ9ddKWZOVEXp>&I^H)HgAIJOC}9XbIMjbIU&$d^cV3 z#W!uYr}6gsFje|Xq6^~6jxiTR8o^ZHVSMZUMtjC{e%oLH_2KY1Cw?Q5cH&u)*FL_m z0YCZEFvygkbWHh*k`k#Fo~~{3yfu2cPZ4kF-+^erZbB*ABnDi z?vp+v+%Y=weZL8wveEpC7ekOD=eIHYkMOBKlKvkZzx1sT=lpy6e{}rP)0^6V@;oj* z68JaXQ#A_y)Q$oDYz*EM28A6yjpBzg z?dJ5E=#?Q&;}SfwNd>Sn6XA!{#;+G_Fn^XCjKpQR!Gxa>@-ew#CezZ_h@#u_{l)at zzL$KlPhggZ_pQh%S!nrq|Aqgy{Kc-~zs>K*7~h+&-owQArnC0|{(J5X9w3||SOG4M zH0+Btb;u?yfS|YUbCfVdO>1zsg54dwG}|v6WnhL|+QLUBwoX@YGS978ii$0^8!;;5 zy9clGNMt07Uzpu`d@#G!T<{_v;;qI-76J119^xrG=uyk+VQsN*ja#jljfN;J&t>r6 zR+o=t^S%4lB&p>W;Ah}t^+kXCUrPdh@2~pV$T)WVr+y=1F&XDE9Nnc;`9`>rgMXCH z_Ale7DKAWL{cyUfmcM9sDSrTfvd$;*4Zzj%W9V1j1w9Kx@qdS3xdo5L?OQxfqFO!( z#y2=N^Bqh7UBUO!mcKLj+P4;YmN51ZDZ=DVzX=8QI@fl;bt30AoVFV2OuUm{>kPj! zd@9#vU);!N%1;}EFM>agh^m=5f8Y4?cQk+bm-hW<_y1>5OB4PH;Zwq1-}~S@-Z(mc zgf83_XfScP29PkJb#V%>buQne&Hdvq@DFe7{$T`)Iv1)cJO6bCemnUub3P*FQFeJ^ zEtluUjeiOLt2hxM-f!U z@B@#)XQ%%+-H|5NZvy_`pQ3QMd>l*q==gs>L2l1D3C8sm#^g?ov$${&X{_h>AxOL| zmK}~d@mY4gp1y&sLmc%9{Bww88SFq5y_krs_A^FGnrImrS*MXln>(&A3)gQr=Wiw2 zOL+daqj32ANgn2?_W8ThJIE8!@enp zF?TitIa1W}$UCKNA@`wk-;W%Jg@Bn$e(b)#qiY(sf5Biy+#^u>=WvN?q&=5mdlG5y z5H~a)(Md7JFq^gL@#o>Y$?+|UiZI+?8s|1FjxYi!eWoYF&XMEy^_Z`Cf`n}-6IPGh zn%eOW<+FtPb7N#ZvOi?7n{a=giL6KV=W1{%R8Pe8j{(;W`9`=vP_Gqoi-`PpW8}XQ zBmdzT`N0_Zvtr~Ma+HYvoD-uwkFOVHTy0~NKL}C8(RJyb2xsU8OtN0ztub%=XpdBx6h$8HG z{S%X4zt|5ZHe%*cIbuw5>~KgS)ruy|ucOe(NYjp?yNt<_gjr6OSD#Fi6@>UMTE9y3 z>JZmJGvXSwB0Eg7S=$bjGo8ej|9YF zP+PXEUJG~wA49v}9#4L6y_SQ&uoAD)ayGd>F8i{+?0`qTdGPy(597J-#=zTURj~ha z=lTQgGx9di{7&zQSC-(Fgs%L~VlH_NwM(ZTTX1LbYKqI?sZL`0H6UJmRKbyq+D6ld z(DEVuv-jlXbCDj;k)aI|DHGir+wOsFf3|y;JD(fd)*5bFtJ5S=$DNHNQklI>^g%Sf zgZ4VDXJ_B+ZCPcUZQ0A%pRMw->$J+-%h;ctZCQ233O!)|*8Uu;eC&LyZ_Yj(Nxs#8 zXWy(ko%vRIXFsj-vGeU^?9Z|4wDRqJus=KDV3kiK-&v3S+eDsY^*=J7*4Y1#|KQMi zYpd3iC=NpXD#N(=F%KXXft7bgAIqJKuIeq@G z<_gkEiru}Vxw3X5JJ4L&G?6{xQC3W3TRp9}mazFLgBaVIqHLSMzD-fyoq(_jskIZ> z563Alj%W9^P(Gc=^cGOH{nEm{`*OB4wFv1QEfu8yYKd;HZRvg!m9*-G^yOA)__bD9 zc>K1NvZI8RsqOLnimD*ppblXyLEs-urQ`Syq_oY$(i)jkdPtvHyH1~E4uERj2dpckgbsheI z$EtMYj*0BubY;aAY0=oR(swiP<&F&Z{E2L7M+IqJM-S4wJ1NViu*W+o zk4$09JJH)OI<-Pt-wE{|?9>&H>pN5NcRF|5bOl?~1+_fV#r^6OR?}r5(x;9`xn;*^ z<8kNl%BPdr-s9=z?I)xleenbZ>5db?Mtpz5sY^@Po0)k0C^KuvBsRC}{Wxmg-_3nr z39IQg2nh6M=oazdu1Sfs#hw~>R!r|li9nyDF54D3ew<7D0tsV z?u8}n^^+8&KTt+_Z+HC^R@qxYI=_zx=`($lC0DSjKFS?eu($ir+n@WiLb~u|41Lkb z-SD{mWGY^Ba<}pl_V6jF<@rtpkKlgIejw)7JSjMV9iqp;z|*!)VjBhy1cc6VA0AJE6ObZs z0#XD{SOFyB`3RhVoPV8-me-!`-f%gqJ39kuXiy8Jj}B7GC$Z-SQT|(l6r?{6LghE* z_r7}qdov%8ALS2OIElSlfX9smCoP`B<__)$a1M6AGoIBC9*Fd{a|oR0`~i=DD^zwN zPDi2g3Hnn=Mcyh*LAtL{LHh6znusCpC6ihGkby{F8%kde&B5cop-RnUR(3AEeDK^9 zq#Mpvkp6HkzA4w-OC}7;3zKSa&>r zKa7h1JgnQ36WPDcqtTz|J~WBV_bW&@`8`N~@hi_yVhf6t+b(DK717)EMXiv2UW8h{ zDC&;K7tW{RubtnmW+J=k0??{EFL2MD!q#4(ApPnBRQuxv?)N}PinEY@RIJ=Kg?&>@ zIe`lmq)RSLK`%C5NPVffFa=2Yw~GihmtB;CdOx~|YOlX21*8G-7LcwPPOJ43#8{Zb zei%+AgChtbA09zO;FS>slXpi@$=VS_kjh3<&G(KZ`2K4oq01X172wP9?1acK(D_b#Q;%pFZ@Zo_B~((gtqZ%$%2 zjZrEmvD?ScihOBIE2Nvo;L~@<3j<6$2_ z@g35?g=ln9a{7FQy_l@Lt*|eXm30a$cc=bMVJqEFLwqm(+2T8h;12#PXO(8>49N6N zyJq6mS5D5HG=17NQ)bS(a{9E)l9|*0m`P53-0irADv)kR^2pS{??gV@#w(ST)qX9X zVpkjQ3n^>~uYtU~iyf`SDj6$3vTvdyC4Ym-g#_*P9>T=}Tt?5~|p2sRw`?##8 z_Cfii4~jaL=slMeH`vt%U&>~qp>XXB=G!OalitEMF1-r?X1?*-e#nl=m)7s_NpbY9 z_Cv={y#Q4@bDp(9M}Nfr;~QJ^`e*oIk9)Ju9``0+3sg&7j&z2HDQmtzG&xI?zS>6I zn|x!FBS&pbY!@hsQt%IhR1s2SjX&UZu`e)=hfjsey|ueY7=$%#2E1`1qbw~cp$tRQ zl|Rsy1$lyFMag<4220q>FJWLRny7tPX1z&0mj5Wz8SkTP_f#z~Fl#b&+C8#SjD|j{ zZ)I?(x2*m&^%nY20%?-_X3e$f?8DnF{ey@<06-4ui|7_tXBA^eZ>aj! zt-1E`A?OQHmFzccO{oyBd;SGI_Eqh4`(58UMoQ`uO(VMw7orM?cXDu1ea}m?VJsWA zghU;5^Y>rrtyv2RoJDK6qsIqnt38y4FK@ki^Ke=M;`7c~S|Hi5Kc%cuw#)0!I~m{! zy0f&hwNq_Z*PHe}1Ro9;nE4cNWj^{C13)X6%Qm27 zcw5&=(PsOA99Z5!#sR6E$3(>|2imglW@}fJH%3;A>x?xi9B) zwR{Ge^@T3ZEDE8`vIB#zIetYx0i^6eeyJ+^GO26x{AT6?JJ#mkKYG8yLNGY`6K{ct4n5^q7?XL2@+~|;*b>kSKJ_My z=9FN)3;l3IH!VI$_-5V{2%g4ZY$83;EQ-W2od5||*(6A0P+<_I{{a>fo@178U)UY> z8z@D&)JbVqaelBL0+V5HA!LoF16M2ZfFzByN6}BiH%>hI9m8jSx8DVPD8`P&A8itl zQhlaQ%%(IZAwGm#wc#a2jLVyW*}b_ddLMHCL=#A{bHMC)YHyJKwqf%QPREEH09$Qq z;zcvWPSfYbeJd$Cm-BMUFw`RoGq5fU_s9e?9RED(0t#lQm4WGU>1Rp2h_+wzKmmf& zlHCq#6%3t)?M6%dt9*Cl7YS_I4mV*vkg{`&^|Vb#)t9J*vKK;wVq&`DN2}}#Q%UB5Lk?(2yFq@fQXjR zosOls5o6)^C8dWMYZc>2WNiouxr6F{evHbu_RAy2D}PpYo(B4NRcF908LCL7UO;@ z7l~X2>a?90Ek6ufH>0gR7Dy&X21e{^k2`!=xccnstZ+QbZvvhT49Bxr{Oftq`9x>P zjwY~)PdnJevv^blJ3mc+sgbl)EY=wGQ|$A5X$npHY3%ceZ5yAzbovX^eny*GvRzD2O9}zKlmx4 zCxdAqCOr{w*5^uk^1Fd|8C>P#!F$#38QzkAy&M-EgyVJN;Qc5jCz7}wZTyCjKumZe zdf8GFr=y>uPHh5epTfCi!aZx>Y%=|5LkRQxr5}qZhDfY!aj?4Fon5Fd|2^Zgq#u8w z@HJudKl)VjQ-!Of;^(F&y5rsnKT?2T9?b+}RQ+ z8G9g(k7J=Kv_~9LD{`8!6ZYUcp`DM8#n%su&e#7x_Pzu@iX!{Jl9?eB64DdSWB?f= zN5UBpmEe^?0yANP0YUMOTym)_Cd#_H8_fiWLnOMa;*E+f%esoYEV7Ck4gnQ00xE(> zL{wUkjffZ!;s1Tr)zjURo-4%N-{<%L4Wy=~`qisfuU=KXdR6t>;Hsk;YW<4_wSL+@ z)ox@MH=88~up)51b04wSIBz)Q`LW2sKZ50eOLEYPR`=%XGtl<`)H;kT&@JcoP4pow z@vz+*Bn#B8nkfN?52CoH-W_?+$Uf8-cBASkP4@l%^LE6`>s5JB=&=%IfqfqCKnHD0 zD=*a^6L=^L`DT_xbYlz@A#<2+M)I;?+X<743`GXx5RFMxR$9|snhg~XgL7Fipr*-J zeXd`Bnb*I??5HZYLe!luyT)2`|D5Eed7`NIq|Z?A8guyrH(Rc~HCjxp-%1;N_^B#? z5$7+tHMaP)^|Aziat6t4GU3S|W2-CB-vX-~Y0Y)G@n~|F(^r^?u^|exL$)g zN%vJ_SmL6MD^Crlixa6g0<{nhuhj7y zJtZRiL>+u!z756yPOTCVzW+q-pfmLFeQr3%;lGP8H5ra5;{8pfh5F-(X>>eMJDF%FeLd2l#3gVXpsaI>$ZG9%6Iw$Enm9XDM@}pQpKR1pybK&dgR7_H7xn+X|YR@ zqMp~&pCUUyM0&Rn=?Njy|Gmo`|3@Lx-w2WZ=Md?OL!{pxBK`Uh>7zoV4-ApsDMb3| zow2Wu{*K9#lr%T3j?5Ia(hDLhXQiD~#f)?^H&-&`%~14X?4}26i~K`+m{B45)`C9t zgH|5@@A)y^6fU7c`bWa3AdckX++o$ZN@W)CBzYCsMMoFS@RnWxoH%MLylxnf7HCKd zfRr0n0!}*~08(;x?5jdV&8~CWq3)i`GdLi8)Mar%g?Iy?a_CJ?#B(p-YcELiX4Sf@ z*1O+7?#_8{?&avTrRerbp9H75b%<(C$6&P^2IN!(PCT$)n~>&>tM^nLLW*PB7BE8| z{39I~SMQj~XVK4`&9}EYR^W;+O>|e^CHDW{m)-9lz}viT_ZM*tUc!*aQT+R;aQ;DO z^z}XhqKO-QADH_Q(Bp|6UhiMvOyYXl%<;rZXEb#&`eo3UtI=aD*Br)JmL5hQ*Kiu) zV@o&EW1d$JqmQ3Sx&Jfr>iMaUoAV)dnl+q8zJ*F}sd8h*qtRoO;ZS&Dg%5@2*G<>+ zJXAco`u@6fhLS5i&7olad+B-^XdZuPg8$$6!DadNj?@v1-3HyIBCeZnHhVTM{ju3> zbDRrtIj(cfY*rI*MSM-X1z~MG{4hLZ0rWD<^_yn0N3By3{>|17;RiM(@3Gyn?s`_= z3LYY!OvqS%J=>J91_#(q*i-A_S|qU}{CPZ|=s^69L?>K!e3fWHyde>5mF=yOeQ)b@ zcp3PqwR3d|dpwDJn!K81LAW)^iUn8_Abw6tglB=p$tehzC8xu&$@*jm;vXbS2){}0 zyy-@EUmGjpe`#YuxV8;)e$)mz54Is!89^aeoPGl-eL%=tyrUVSjU25#Q*rAgpr$?x2Hcb0or}$imb% z2$!Zh;mqarRPr>kE7gLqJ{533r2=k6Tl=yb*;{RGaEtSP+jKasIo8&S6o0!!gv;7d zd|Ny6H?pf;2Ap)1w@1#0+9T)I_I5arklWiDrm^qar^EHlgB`3$`D=$ngta_=r~^5e zINBj&`7E}qBXYjc5jpERTDMMT6`e8>Zt7%%UyyB`oNxnjtP`a_n+A}TX&u&0XB*Nw zu9^-nG^vOmO>@G<%_Hd+#Q&KNkXO>%HBMr6=^f#g=Wx1&c)8O_j%u71#8)||GWJww zawf61GYbB!GqN;xw!&pfT^BpT!(D8R)7i-`u0zw=imsIYTGw6(UpR}N)}3WLFq7>* ztM?}}*@AAFNcprIxm)?FTLzp9)wqCh4SAudb6J-oe|I~=x4YZ6PG!5hyWpt8mqFXhqX+gNK7vTQf3vg?DSr^S>3wzrU{-w9Ad=`7DxAW*swzoH>H}vj| z@a0S!!Z$KAmLeq+ITvRk=dvto-AvY)Wk>jMAKR{3?5RG^rPJ9veJH)YPiKUG?rTH% zV&9Bavsis!dy^|#eeXZQDa?wZbC?N8}-{hbIO7+^#A$bgKa z@Fg<Tj!I=nm4Yngr!G0b>={4teM)=XWHiVy_o3V8kt2qxjUpx;vYtOU7ea+JI?Fj#MzO8W< zTYtXu&@6WFd`d4L>O{CKzI%gOKi&_w;#K6fbUce@YM{n zE}O{?46`HjUtn81ll}1m=kqh!YZp-ZjtjaVeC$FS!sQoc!23|$g~)mELgf7U!bJG% zS$I(r!Ur#M*3V+=F0vxN<01>f`ilTJ|6;%`z1X^BCj8jg5k7PYxkP#L66caB?5#^E z{j*EDAY74aL%1q81HN6p%SEOmxgBas*u8ljeQ>Xnmx}nhJm+I2Y+s%Q@n6Wn%{{|A zES$m~8Qu}jSJn|)| z5GOsr`Libx&Sw@DCLw&V&k7#!&5l9~!tV;H*uoBQ>~rtvj&K09Vst7w`5Ene zY%<$7+Jbn)Xq?iy&r2@4mU$6<-AjIE>bz8dmkRJE!rRfpqGW^*6*=LC=d~g$;ya5h z2xiI z@S$*PUb9V`Q_cANuUtVTG_~T_X z-2HM{MmfB5ji-U?pW`#&45$3^voODIxSVEL`3eidyC+&`Aem@^xV<#d0(Yoed$h zhz!R{91!?xo3ukI?7cR&e@W~_8{2addpITON2H`&p=eJ!e>|H8k|1XaB^+GcvRCgds`!G}XYAFHuY;99zJ@#Nr#YL0{3)R+nr zmZ>VROh<>*A8JlhJ{edP3?Vyl!91!0wK9S(fQhaVi5B@?-0fC@i5C*f!NDxOnw?iPt+eO7W~$*=n^?r`A4;O6XW@82>V@Rd*;6{mV20Qf)canT@%B8I&2je;M-2qTj&f z{$+4H4o8TTX$MM28tvxLHmM`hR<7z_27Ki@jqqz!f(nFi+aoVU)2i*E${+cciR|BK zVhi{;0uJt8qM81UkR3;Y;TuKSza|ZBy3W7Rqu7iJF|K4DEjg zYzyUohM0wOn19EFq1+!=$kQCqEX5OYKvP3gia!c}K^PtQMla{d88{5;h5`)^gSu)C zgHlBMN9!*LwG8Pn=w%uN$zjk7hzPu)`~~>|!tbYFj&t~^sCFShCjUn2d8k0EaUjFR z0p*;BXjJ(E6`$z8%DJ?l?#su8nEdweUKX?8o@8=E}0)y}UgugF} zV@y`N>c59qOj&}FT28jFl1To0c;AWLe-F-8UIc}Q&wpn6j&|=RFndO!^Mvu=13Dup zJ+I;1Qy6-bdnd6`6T*K_WLgG+mKqv=;lC%}#DC9cE?DRJ;pJ*C8Vde<;E18LhnM{K zxRsRy88rcdCWNz^Vk{rLaLt0_cR&bEVojm??}6fC?!f1H9O^R6`=Ku<>izd*WAxw_ zQZqTt=J(USRs8q7OOROnk)SzZ^WU>v=VwKCFOht#l<-=+6fP+Kd(t%jJzQSNe@`X` z%V_-fY$u;E#t{>p1~;^+=jicOUE$QE< zgkOnlG1)s3!oLr14%G_|`S)?D{(ba~Vr&lIRP@JagzqAP)A{!i!WXT7A9OIqi4@)P z(>amKR3;X60UJ)x)S5wO7XE$o)#Cnrf@Q5G{QFGQueWe7B;b27)V+t7hfG&>{-DVT zxx@NNRn$p-4+#7c7Jv)+#erPCKG{q?;3|@vp!>fEo8{j}Y5Yk3Pxzo3wGwdO1tI+V zaIrS?@57tlD9)8F=idkVXpDS@k25}=JVIS1FrIM#J`TB@kx4BdPofy`>tO*Es;N0d{vJNAu=w_Yg~Y#ry&)RE2rkN_=qsvU1PqK^-`Jq| z1rquOZ>O|_cSX}aFA^R4!H_E#4zVgbg?V!=G!dpM8_F1m892rsab*aPKxw38kf}rQ zhfso|RMmp}LvRFjiWc#Q5ON%h%^w11K{Uf4_lE#zF$|uI7m14gqig>#e$LGFOvMjE zAH`3RzTIQ&pU;BfhW6(z-@@Y|9i&k;FtI2{*AyzI>fc1)_Cc-QLjItdKMt;JhYAFZ zgVD`5{}KM~#rdfJB7gsftZzT%Z&~N_lCEDx_A}x_7YG_xOEIpJzu*nTSYx}Votd8z zW&WcbFWst+E7f8{Oy}$(#xb@sgcl(`#%g{>^!<$c83`U^o9kzU`*)c5I*wz(Qmo#R z)% z&qN_D;jX+CeN^>t5)M9F2XD|{nQ^bKAt(jo_HEc-Bw|qg+ z>pw-58`WfQKb0y& zq37|ZKH>Wjihq}Ie9Y#;uZ))w6}UKW?{&c1AWU9;ZrpnH4|VrHUnZC+@M0R;jWCSu6MA zjah3Z;I7-Tjqy_D5+o_(OW;UK!1dGv)F%e0@~ip-3fG<`$f3fU%R5FDQC>)G)MPwE zE^~i9s{CSD3f3u=-Mz3{uc`h@WtsZxi7fYj`PfW!t07?=9#dDi)B6p= ze)uoy{xiX6V}D%lHwe$~()$I%Z=32DNZ_9uct3#Rr|3JqpCOd@Rlu&M;GYV|qrAPM z^ed#DNab%ljKsUg;Ic%S?>XP9@zcOJ9Xcc5CIeETi~I^D=<;#DLcynF`N>!ngLZP3 zC(Cca>y2*x$){AIA8h|XrO&80tTCjQ1k9387}C*q1)ljK(r*rtetC%Wi$kRM3Xz@? zBK=r^@5Xw479xFfi1Zgiq(2xU{r5=fdIYO6L>)I!TE?SPy^Qge3CJuF{@XMrnLW;^Mz`yHCd2T3^v z>Pd{l%)#1F{(%C1hnnLf=oln3ltZJ^Va;=9G>dRn!ky40L{wi$X6}TBb3iyKn!^F_ z;!cwcfXdQDF2-}TY1Q5;hktz6lU3u>PRdWhf8`qim4&nw{x(iUWvOnTM!(+1yExZl zgn&A;IiATEAxqU>>E-cVPfY`kQ}WeF;6t%;)6Cq@LnuELq0*!ASrIC4tm#Jo9tX&o@n4^ZTD@W~D-=I9oT1uLUzR=|3jWOGGcrA) z%MF!RUw3_6gV)zfA2*g|p4SMY;fyBTSXONKL+5Qi9wW|Z>JnR7(eNZRjJ_;=Tu-My zT_4xO{2KA-%c6z+|Hcn)_kYTL1l|ACuBo+{j)` zay|z4LrGS|k0x0VmL~&ZSu!C0k(~J0jciMD3c}sV>FZ{*@U zgbm~_$WLy79(5!xfioOO8-%rv^wscS@Z0cIj(pu{G_iNO`ASBEoteU)0`) z_>%S+yKiK*9)gZ;oH_LmN}qwrMIA-#Sw`>=x*DF-_wA}sGn@#j0*5U%c+ zacBmsCwD=o$z4!QC+muv*v3wo2z_a`1GCtoH0LKMIgQf4B6mUGrgf;jiQSXlvF0YW zEIk$R)#=VC$pNac7!i$4nIGOFwp!DMz zy%8Qfo1Xruhpk~Id%Q>QlQY@29(|GWY)>1)zxB*GI*IM>35-9GyP%3*iR(~)uVjQz z_Hr(n#op{?Mf{Uq7K8`LUC@HwfLq$zx(dI0+Ywe}+Ug-Zna-`V*{hk9UYFS!;X_$A zgimH=JU^AyWg+Lk$z4!+AM4V|Y9u`3BV5qWhH!De zjJoNpwjcJ*KkaAxWD;xWM-}f6BrEz`*Uey!{p|=J9bj8JgFQ3Axo8G^cL1gD8_)&e z^8;-NR}ajny^+-qM9!ZFBBwt)aVsP+I|<=)+0ODAY+JS!@h`J22ph5ix0w6{EgNLr z2Cqhg>n5?6awvUsP8WnV z!)yqb4$IgIh73cd9m6`DgzKDP9UG>wg%_kE{@4Z1g;UwxSp z_Tq&Wz|@i-q0h;WP{W1RT_tSmMRtVpMYf|;+4mQvESk&~U2H@6)W!64&BdJ&{&KMm zVdW(mjc{gk3G%;p3G&xpVqH6l{V_Ka;jUcUfvN11T<0fK+59|8Uy+9felyQ@2>!`XN2G7+YtVkpRw&mwyXg8UnSQ-?-V2+g6tI}A^f_)xo#R;G}4OrGb1esUmFRK z4I?|8ypio0*>OL-XpKxoe9V*lx*m zwzjb2!s+b8LJ9E$h0bLVl+hG_Y_xOvWcE6b*Nt{I+{k_!Z9#gumssVs`EF#Z$f3|X zcEFpA@F%Zx?R55dkrnaPMHYm$MSy!@4B*y`8Mb03E58(%Vb)!0`vh*c z$bZn`OKrPmu&@{HPxMTe^wzW7F@lT4KyQZ;IJpRB~=hkU#^;k;ZI@Vcp zBm4JQ3*zPE7wA#)3-s4Lb@!Al*-2gNc6CwP4t;Ycpyg zCD-=God2)uh9RuJz8%7!uD=9sz)JA)3-TY7c0FUhxU{$9*@`&ZCJWmcXM5Gcj>IMH zL`wW~Z4}K)=RZhs9yEIDZ!f=LcG*<#j9W`Hvxd1mH{W){>={#BlW)2CwyAS(opH;} zu4!{`xyc1fkhvoVZsv1WeX3Y-)k8F5-$CyIXmg(bE{6hzt=3%b0!T4w2tPb@;#VZV z7@SMiA-C$HN4NmWrCQ)H4qc*9?$nS$4N$y#WS?>q1U)YHRHb;TM%r;Rnr`3}8|VuZ zRE^V!fLA>LDXyLM@Im{*!ZD2Mj3?j*2p)}s-2kaM1x`^lHRnfaB;YiMN`*5cyd#B^ zs&0MJ0f;mu1u<-;qy&jdB=6Gcnj--gjQ%F7d0spC(cp<9>Gg zEe)sD>qiGH3e}Kd3w5Dlg_;qlstQ7in_{}IqI2BzP5}5gPtgE+U}UBA+@N%tC@9?> zl)eP%bVkeLzZUq~x&6Z(?!LqA?)8mUPtIoSrV>8Y3zOeMrw)p6#(;W&XZ<(U!s^nY z3YRznJs@5YMLotFcS>{`!G&VphC~TiGLiqdrpHjfg}+$ntDtL9QS1;y9zZh5#G9oP zAXzSV#feL#`J?U7z;mfND^BD}zOnep&wU9$2=0ml0IY8yB3y3aBA#}X?e4fYJ-8|7 za9i+%QqtW1(U8ayI7~4ck8{?SW|98~i~tiLkMZQ%1W_~+UU5{5R~?Z|t}pwHHbI6q zoK8~SjZ}FYi#|6H40V(9`-A)!Y|B+YyDLvizU};X5pupaccA<#eg)p|Uu{6J$=R@To1-n!!D0|xrY6sPFmkZdZ=U)A#CH#upe&p8g{Bfr$nf#iRGKxS( zG8LyPxFDe4$MPy0`kty>pk4s6fOq`sFu*ACT+w)rRGCVmFD@pyX?CaQC(fNBsChBSLt!ktH+0U+P2Z$U=Ky z#-Zi&5VL_=k-#ARTewEx_m1yU`h#IartVJ15}!0h z18qcF1KzCQ7H?K)!<&U#1cM{QkTaf$bO*gyVFUSQ2%KMV^Y=EG74SfF3-Bq3{`Numi_P(WOpOw`1)9?D<31P!{nX0` zB0+6O-42qfQOFX{P|o>D@EH-{<8|=pKtt&s1mqx2KB>Gqj?2|ZjJp`J6EGx5zAy0r zL#(_P-^#raDrYb4Aqx32qw7^XSNlhE;Qtr_|E(H+a$BPe*c;--fc>fq453lG)Txta zb=IYJNaN-@!c??*K9 z^{LXEG}Qficre{#hQeH|MuO2+7GkW8QR$LL2FB-DbKZ!YG+%oC7PE<@^wO4_LoT5CgOMGvx8ss_cVeH#VUfHh9@E$B@fpj~SdAsWE{!d- zT5CJ8H>?>5zp%Qtbz**-<&!kF)MnX~##Y&EfLUwHSOUma!w}!oDrtWw_EW1?h|6}Y z8Bf_$AM3;(PPD8|W6vd8R(E1AB&IfWVjB`OPIhAZ6LS&&OY4M%X^O4ACaEWKZclO} zd@;ElVU#Q=`+$U7kULY+q1U!;v!WB*(H6b&kL_?v;mLMw@%x>2HiSFdWz=+Hm1K{u zZlB@nMC*N*qbFm-)2rjzjkdaY_CTC%OFVliuJwcQ?CZE!Fs3OV-FiRZFF5KYKVLZK zD*BmN*sJ=7Iu5FHimH#quwE4Q1X}TC@-kFhI^2pjqd^1~y$5%Yf|RSvjGx&Y&B2ci zIuKtdYj6i24itkNupB@;G?Xr zqrpR2Z$b^uH5y4&>Q&Q)q2ypAiJ3h}HEIOxB3OW`b`c{|^^(5IRW+w(7vTb|*$?u@ zd#a9d`@wXwA2gOiwVrNzAva{IwWh$t%qu!&frtqe-xVue^7kX&LXu`E|C z6o=9ew^%4Te*L9EPvw3PU#<#^17EEgOb&cqU?R0@Edu=$wV9~%yZ9tsXGI#;iJPYD z{4R2P!~*_Mr@)ogqS^;v#kzv8uV(Y-|7k0XH2-|A43v`~&@xJ0Ej6{n$Za^J&_lV- zL1Lb%xz)Z_RCU<1 z{%h-)>I<`j6)fMwTt*|Sg})&4Ly1I7^5jP)7a-6FP;>doI1ohQBAX(7EQ8aD>Fz@{<*_Kmu^^1<81IwZ!*$& z;`4j@6;6IO8|7!dwVCqsTQo?FEDkR}4+5c1e*Dm+&QyM~HTgNkuhW5V{{{IO3?4_8 zA8J)hU^M*DLS3D~NQ2S_Cyb0VI$;g#@wd`yM*}TogHq6nxSUJFCppg4K>jH}+_ba8 zVS}uMk3n)MJv%6Um&gb+q`_|79`JNuSAK@u7;tak;-G;@@~wh4i)CMe$NvYuq%yqp zbChbE@>Gq2o2-k7=742~{Lv_KT!gofHbK0g*@zo?H|O&Wq@fAoV}!Ulrks!Uc!xH@ zdvkN~KCH(J`&p3b;I`)CP1W#Xyz>{NxiQP+td}bG1EafoY#c^Ysp8)xy4+?|u^!|6 zahS>HVYZakl({Otj&t9QzX+?VDzrL#m$yneXDu)0R@rjY4Hwujhd&(w{vHjUPa>YGEe)rO zm}2SotwHHtXvRb3mo+<=3EUR~4w~;T@-}Xp%;kL+g970ZUR|}S-Z*p4e1|p9{^%M1~Ym@ddS46(Njq% z*F;OtV&v7)lNpkpX#mu$nk9ha*oR~z!>%$!@_@TzJ$|vb*$TgDu(Ge26KxwIl(&$%kX}=9y+STDp`wNLe#Xej-8-9SV-sHQQ zr1S+v+X^>-zy=zD|+Phh*y@w{l46 zKeg_h4W$2w^{{*w;57V;s5XJp3VB8K{GZ(DTWJgo=mRG2jN(7$qA+k{c8k8OaX@u{O2o7nb5Z&qq~IE&pKXL&Y@RmG*gl*Jy8%Xlq| zy%Bd2;&;a)e$_mx?T`P7MKCosyk;!Uowx2TD zOSU!$7q_w_T#;b=9B>I0aR)QmCi?*Vs7xfF>cotdnRxqfhlN?}z1DVwc*XErS*#(c zBJP7M=4&$mKi+I(!-IF*WUR?#|4gxN$YdK+EITvV_LMQ-0aS7!TeZHNOEBml7I@=k0t_xQCfA8YJ z?@zke5bp1iaXgD1>e?B=%g$_Ddh0yVbfzrbjU_>nF59Dk%-OaCYc!HW=m2f%HUYuYf+rn19*$-oE(Xi~` zJ5TN^?1XU2ap4ef>hk5KX2rj;@)1yi63xY|)w4DYFt?P}!RuqFRWVovhdq#K(ihNaG2tRr=V z7AQC@RsW5LrktQe7bKYX9aSQz-F5Hdt2l(?!G3E`5_OXFiGyk@PMj+(z)uJ|_Bt4= z+Tp1>>7H!8-yOI0;?wo29Sa>0VkqW=YRpbp(NFV!#mi3 z*T5Hu4YYy4@rR)X0c)bS%74PTQIWTB8f|+dy#IdHN9Wq!4h8S$@C>AC8~>Lf1Enab3!OTN$ksf#Q7tM>2TUBZ~7WxgPr?QH?JH4E3R|Bs!O-=c@CMEQ9%x<{i>GweiXn zpHXjC=gR@0IErz%j{(17UW=xGZN=tC*!ImjGyKyd;qP^3`0bJK_dGNFD`MT+<_0N}cGCy}Xa+V$o{o&wP^S*zk6dz<98kl%IEvc)9X}BL>s$GSm0>5c3%< z&|;q4K>KXk{1=X2PND$|V(Q5(cKu@_N($Q^cw^U@;BTZows7?0?EjhIUm6KN?kSuJ z{-K0lw7=HyIFX5l-z>z-sP>Y0ajDX^emr`Wu02D^6WKykJvxFst%95f=8q=y!Iq#^ z8iabPJ_@W_gQ%Nlm#1)CT+U7Pw*+9DrYLY(*uV>(-!!&heH$(P4UoHF`UQ!+YvIH( zNA-i4FIRD=v_7Q5Mi8R^z;+|_$9n*6;J0bLV7n0T zBY1-z9fIO=@p>lGRlBbI5gx%JL`RQSc*fyvD=rfgZEx{r8~%_Zkx#Gs(>9L0RBky5yo|J1RM_IWAvN=S4IH57tc9s$?~Xf44!E`n(fh+ zD(n9@JpadAWpDrgr*_An_rLUmo$!OLQbsX$jcZRo_#a9>+?UnF*$^)$kA{mZu2=fA z)t2NJ`mr@u|+U7Wt#g5r*h%an~O^r>hT=TQo;Z}|lne0?68{$h7 z0KGiH^iJ;8BrANE;-4e>@w_Ss#>`mh)5j&J+0*X=gMciWM?-|m{{&88p)5fcCG2hHnmPz*^kw=PI#gp`>3@IDdkCc zxG2f>KtHxRDfzhptTxGp_}(Pg5*H_1{yu;$O&$)1amkib16e~dfKMj79vH};YvY(d zkgaKBLwt7|B=2wII?|8bm*V)kAA2IjhWJ|YjkqbrwFXs9ajeW@r&4T)FO`tITykyC zV%wyI4Owirl&~j@eJ*&f)z)=ye|D;^;}ptoXG45NJ0!1e=en;i`>dVgp1$mGI~(E)>0;@U_O9*y z*z4^b8~U;B?QMu3pyZ?NU5^Z4PjqnHH-Np+!G`$84q(Ag9W49$vWkwwP?L_X&-$=K z9TRr+VLx=VA-=E^;p^mjp$}WvDf#I>Y-=YQ;s+@CXeZa6f$WJi$M%8jg)|%DTgemR zt~A%{ec7or$KU(1`_gTQuORP-tJ7T@2C~o69cu=%!|67}7di>I)Ad|m_PW#YNME+y zX+!(~B_DOVjsSOO$JfB!*@pPm&V;+O>qFq~?06fvyVww4L2eRPcX6EbXnPcSc?nz_QlIfG*f(%!Tl&g^RxRn^O9Jb`uhhtX-B?X&d6(x+ zfa@xE)i30|Dm&kQqw(@-=AhdA3#K{B&d#ei8Q9yUwHM3Bj@M-CJ?^+VzO$PT-52XY zM}E~lwRkVy$1SW(c~zUJ3W}vjR}+|`Gj%sPuY#3{@K$WfR_}3cq${p&{}pzxA7}Xc zz$KEyi;dPI{{*BKpz3?PS-ZVixG_;D`G#Rtt1I=wxPtWkdAP5US8*ur-~(R&<-l?& zd=9ns_~X2E$9C%03Kk(z)Tl z$u|k9(wZ*uL%YP4e(SCJ&|CE$Zx};)ayQyS6U3AI5Pw^^-~#b8@iz{HOvII*Z{1Y~ zKs>5|6OWQ_19t6-az2oJt$Uy%IiE_to4^r|Ki=bS=k?=NivBzBhZh_GfhTLLJL@BF z&K55gtkTGzIK59{TcIhvexwHIm8yH;XWlwccUt}(ZNnL8^l}>K>S#RTHPCn)r}0C{ zR{@i35z+V!YT6X9DCy6rn5SX`&dG1I7v%uUMGBU( z*YnoVx=oh(u0uIVnAd+ZYI=*kV9l8k)+GahPn%69vQ@y3A&(kX!| zJk48wvRfXm&&YR%1-(uWI+lZ84uWtym6{R_dIz{fjY0yHi`Lxit~&0{+U(AH-<`7^ ztqDGRa!}?*81LLUA7R0hNe$r~nkL;tY0`pf)SfPAx+^xsanPj-XxYbt9eecqRidH5 z50niFa>EzPdy;PrVBC{0wR$H1#+viJ9lZnL{`hvaJyyQq6I?w+Aa(u?o8*MEUWApdR2cf2Q2-B8v~evioRhFg;Z4@e90 zD7j(--7Cd?Qoy~hz)8NXXj{C)t7b!O5i^#cDYiqLjmd;r@lIQE3eg^MABru zJq$gaDqKC}h&$&9IKxTZT9zp<084mvrYhCJ?HarlgkW+N7|C}zB6yWkp%sBr9Yow# z)CS*5ZKyK;;*}Xp`*B+PU~u8>Q$%EU#Ipi_u{F>CTh!x(Zphy`rA{s@Tg&>$Ujb-ZjWlqpv|t-0 zR&21MK2{EOv^x@rj6dTEC~r;FO9R*6R>ukdEjGT?b2%aCzZ@V2`fnBj7NEZqSk;7n zr73=-4nH}Fex)^zxj1EIz2z+m{R_tO?yx~?jGYRI5F_ceS-F^Cc7a&bFI`tsZag@(s_p^QBlR>UqG((H!!NKuRK-RZ{hN>EtsT5 zltBD^2odlyI{9czw1lAZ80}3>o&!1y6*|#}`*Kl7WvVZP_$I&2d)n`KgEykVcY>=m z=u2quPpN$|qACK6{y0H_!rNl-1Rbw6bw0qZzim6`+yWHWwBPCYHqC^dk^tW>Tm^dW z<@9votE*O(fpN!!!Xk{9 zy#QhuFArn8%P`(|gBXSwFMoj`gcvV7;*0aa9MZPA=p^Fn|-&0Dd1ve&Y8nio9xalB9r0 zzCt`v$PUl?;oo{2KDzHCeq&F}gJO>!4TckFs!@(f*KsRYn7zaqj6sg!_XkkS2Iy_4wS^2RwPkM0EsOl*_ zPRmas5%cXRI|2^NL8}x{s16!r8PbR-QowUY*`X&B5G|dtMuI!x)5TLOW@O!Q^5t-8!YW4D1Ur2wuh?nJSIHp$QjKK0sbTB24EG6+LJIR$GR#aFhZm z`Lgi@{0i2C{(v32U_HoCh3f!dsKTqkZuzK z7au3F56p+?ujE3H_k&${qMHvlVlOV_c=#M18pgvfIqS*XA;!ad(W^X@O~=FO)D_Lg z!<%9Ep#@=YIhW{$es#OTb8S2vt$;|rad={wH&a1W(|MD|!$7}1OdE(n^Y}va3iEk< zB$W+nvgFsmYCexI?j1}|cLhlD#RupS&t#dA1)LX-@Ye?}|m z+H(Qd;sfIvMw;I#ppvf@8dg949^qS|$~p%9mHKQv`fFJxBIB&mz+!7zSBlyZwU@P} zXfnDSekDu3e)vg`vQ12j|!M;&zCZ5 z@%Ppb`O>wUDR{4d))Wub;%mKB`K6VBum1plpGX7ulqDg8Ye3g;R)CCVmuy`P^8NOF zf7=3@oPR-q{=#JcT&w>oBu=#Zi<2?v<$Rx4g^lqs>#Me4h#PYv59;Z#yqrCGRlD=6 zJ};2QY`{#OCyhBy54yvu;oS~6Z(Yv&W$gf#U$r|=D%!(giq_|Blpd=!QuFk|Ci7W9 z&gRpzAUVqp#Tbr}(v}ECmm)e~W@z{H7*1@^2D~ zSLZ2|O9ZsVAD`=TiTs^qZ4_cLNuLW~B&}DbFKIzf<@cW3T65gK4)`r5u+}=f5WzJ3 zkuVP@frV`alqq5jte?~ShcQiYOQp1+j{n?qTOyI`+kjsJ<;(QoWj=dN<5SdgNKj|5 zN9f@i{%|PGZ1?J({T^|{w09E{@}$Q%6-aCLD|6`8NYPDx-X;LUkYXr2s|iRa0@0C> z&;;T~db2VhIEAw<@NPoJ*?ehuy}SpH)OLu*0$v**+5#?D>yV)_v+);?7TU~(uTZEH zZg6P|0C{VpiH(Ll2-aqvf_!gk8pJsqGa1}2wfj5z<4A4!D@dtc+fa1+4@wi>eY*b9 zQ>Uc`34pDBMM;lijH&7W#%sAL-*r$g^Q0$qt?&V!s7!#IWaAHmV*?)s-Bvyf7Fs3W z3jo8TLQ3H@Dl(OMK&9D0ayg)-fv1{C{&Xs=>J(kp8URyzJ8e8yw9|&tv9P7b4eb(N zdibtnA%o{2Q;lZVh6Ue^L&aplue=!56;N%c$Zkm9Qu_F9cPdZSlLsGRFxnRLB>neMYuIddH>#<_ljFlCP@O7<- z$LT}QDuweL{QevU5VGi3CR6*9y<6frN&laGx%~nxL}1C5d=1D)_H4N?h6VTJE9`j} zTn4U=z@rOsK#$gf^1rcia8DkKMRr(E2*oy`z ztWMrQE2PTzF}d?f6!MqMEBscdRm*)qrM8Mh)qgRZ5dKcs^yng5)pP<0QdYA+NtPSt8;hW{F>Eci;59fBR%k4P!&EI-6C6W@7z zZ9#isu}!ZUqxR}X?S!^zLSP8(>DDjg4zw~nYw481v zPv2v^P{BT&w;Xx5;n+`nL79C@|1}6rE46-mXs9tf>IzZgRsRD-&6KLH@>3jfIUz>9 zHM+7fy&C9B3DEUE-nOE0eiE{~tF|i!17*7muRZXMMzW`>4llQX>cp+;2~y>L%wqJD z>qSs9Dt96QjKDxhTV$uocG5`YKvo?eVY)VS%Fgn?>oq=V{c<5@QA5A%i|H}YN^hyH z^mk-74iRr~`NR;>n#?!V$qjrUAe+j3z$%r%DO}nMLLGhvpXgUEbg)qvtq*d(ZNWY* zZHpZ*`+%xY#3^J3j%)pFppJfwi=v+~&>!e$5Q99dMFaipZB-0@_#E@6L5S5()LH%r z&s6!+`p+ux81s8865p@6_&OELN*DSgB!dgs!#sC6s)H4;ew_RTg207nFj*>Sc*kfn z3(!~w@cpUEZV)_+xUg_MgKiSU!E0e###$g6cr004gouC?{aoXONv5zS&M*WxZ7&1mneJ zYrBW={so}$@C2FBBmRUx>&p>;C{>P85&w=5tNjo4<2pwlkS5=NC)DOwitn-F+atd7 z#CMMP9wffA#CLb`oi4sp#djjUJykGdV%yV;sj6slo!4)Nd2>fmb(i;PCiGP8fF@IF z@%q~q<-7xDyr?mWW_%vn8ce}(LqCUG@jDNqdW8BUrZQ5$kU{BfPk&0q)be8PMKRvV zAA0c)GAah1lrgD#Fs&=4v_>_H==8|V$diXfT;9-hsq%MNs6hDPI(dB@o|b)0%x}hkp))R*=1_KM`9YTzA2gu^3^CBIPO?vq(jD=F=Y?|gPHuC`q z56iwGyhlILs67D-Lp0RZB2R$YGBawQ;8-_sYCCbP>%D#lQL8Xur)Pb=wJ47CM&h=! zh_vr+U=|H#mT6!w90I-yVW8h5?36GZquXCda)p|QEM@Og4F;nu3~0P8QaAZ_wH-Uz zA9~TO)X!+9SNJlR^96SLU-ojfi_bw)Li!dq5pm zyQIo5pdjiQz(wO@006ru=U|?+L|As;L>eC#)+rA$FlY}~5Ju4w^Jxx^hKyS&lOUsy z!Z1Ds5yLnc`1SrtP)IiCXm3 z2Z7rEphXX8(NDGL4lTMxi>^bIQ?Kg}E40UtYtaV~JwQsJ5UqQ(N4Fyy%!0{*$C$Gu z-+27QPA!(~bV_b}K>34x`)=sBgO15NA=HE3lC4vs`Jw_)FUt4dY% z5F8W2rqLiG=`Fb(G630c3E46EZROWmtl#nMLHar-pHK=)fd&N*$TtC};Ljv2dIh5N z^inM;pC{GI$v*`$4AP$V5>Kx@K^gbTKOa}V%keGHTR6yG`AZE!!_L6due9hME&84o z-K0hTg(wyBSR>6~mpc$A{#25iZ}~9|?tU#gUyJ?@QBsBq20>Lsu4BiLYnt}_YAsrf zD6zpUzH|BaUU{BYh5j0Jh8FFlMU#1+9rEu$oZ!Uq9f9a!L<lN_ULaS=~?mpxcL5)_^uY;mE!v@@m+>*LC#E(G)a74CBDar??UlCTzn71 zw>VoaQ}_Dc`oZ0Veeu#*Yy;W0Uc>H*!!3r|xQiLv7T**187xqG7Fe+`-)8**>(W&T z*bVw50ea;w`zXf#nTXgkt#cXsr8QzT$$0u&GGbfXAht0D56T^g)ubX=+7`izb_iCr zr=SCZ+Kvdm>xdkUoe+CA4Y5_}h<%!l*a0VEOUOxRO&7%0bwRAQD`K0@x{$G#yFEqb z2^SI| z`z}Fn&+yNH@MIBI9$@oXZBm|%W4&#@cvfipIgZUp-W|u5#bL7_Z+$n27s*}uMLel2 zbu)h!w#;GbOaT`s=yl`Ep< z;yZvt{TrTM3a_(p^APrmqei|+tczghumK`P~H zjVOK0Iddk@&KYsb&80WYxOwW_0u?sYH-{f|ZvKq9Qzw@OvUzSOh?rBs7$X1lGt7VM z8RjoN!~8SOF#pUm%s=l8^Z)h?^G`d&{8OUMA1s$4`!SxRH+cbX^+~xVs7v81A zlxB)Q>fW#NGpK%1_x=$1qwf77@<-kKL*$RT_lL+Ib?*<6KkD8eB7fAqzp2!j%7eal zMCg4H^GE1i#{5M$l+K+oFZ$Uim>(j4v*l6bZ?-&&{LPj}k-ypUDDpR39!36U%cIC2 zgFKqHf3wF+QGOKTrP>or%Wt;)i}LmPBgnr>$Nzo*9|!)A1HV28PAi{3s3qZNAWmtg zgZ?4u(x5;5tj|Nhzv=aH`ahT@V7<`)5nO|S4}4!Tfq$O8gq{N52;`yo_53FVqehGv z=E|HfsqE&`GS{F%0|pPs?tgw6|2a5IBmj(7ueA2IQI;_i=;S~xrD3C`SHKmoMN9qk-QWv)d_C7$WP^jgWDD* z+|elEx`>5%q;lzPVDyOuH#kN;=MEUb4vi9)+HZ=09cRFMHSk_$Xy-*y!mW-H?vp6ttfDhTqOV_+aO0zdyE96- zuL|eD)7+|l70d`@Ou%#e$wSe7( z@r}3J@D#`5_~9vO_gRLgxT>wgQ!*FX@=~(rx5`TyT9IHG5!X5;J1->@4*>*VbjHG@ zNlgAAl_4_7mou4$aX{&mY6uqo93c-im zhw-{VJnkb|swP=lWX(^>oKLb;(aQ2UP-o`pWN1`UX;4Z*l4WpwP+DG+3;3sta{3_7 z%ORBWZHuhcmiuU$CYWskW&`4kk41$k^>OhlTXW_pcp9RBX-@)+PbfUphK&MGG;K(F z?R0^&T+E$Z{}pN2bDk>C*?9JefZMOafv45+-juXOBzNoFa9l5tp?K8rDTs5IRd?=k5M z@qY>u@{viF`rz)7mt=7^?F_(A^_eHidI52@tVLMzC}To}wIooX;YmFJvqHcZs_<7( zn@`5zHO8Q`)d{#rve78uqU8_qw4V_4Sn`y_n1^_?MC6H9HZ}?PXk~+ZHP9#8dQ1Uq zCT>K~r+Z}Cs0fk`cao*Jscghw*#wMsr0YaExJ)j_!0~*3BKdq?JewVn2Fve)3j`4h zgVP|OGlSD;fk$nS<{$zXdjWq|itzqvE}!Li>=y7J0a%3(qm$&P6vyA(I%OzkmLSCh zJt+=EnLL4ZvJnsRn`Ci=W|Gfju|sd62}Pq9Q&t7$vFs_WQ(UNkGS%iI&xHVEBG2c@ zqtabX^WP#1^3At`x(eGUPkr zZzld_5%AZF=bwhhUlNbn)8rkXzd)g%wIwDn77rVNLVt;YewTQj5+47Y_)X^cOPb)H zW58c7p3e@Czc~KJApC;=wIY8g{@07=Z>#m=bD&B4ULSpOJwMpP!&}gr$E`5Pl&)xgvik z`b)&~mv#8{`X&0;d|Q4>N&E~2e_(+EjfD8KOyqB)wqHs~Kx?G_TPvQ^E3Jd*=Q@ts ze=WVmNEhe;qml?e<9=IlfGdFC*neH(c_jSt2ZHzm<)84Eguzd1gL3iwSws641a!1f zDdq8&X`o%}x!eYqi@fVZ-dTvNb=T_<81t^tk9m1Xx9LVeWt?Xnkr|(>@yBssc$`nR zn+n)&vg1c6Y6wiRXb<8y`F5kvQ}|QMG#xLox-!V4=udM*{$JGmLE~kOc>V|Vd8q!1 z<*Na|ke9j$_#4FYJ!*T0!XIM1C%-xL2}OUgcrNSk-xr@B&>;izF2=K9d9M-q6V&`V zdCy0=tHkpRtY1|AH|bA&y+)JPZ-!{^E<+oRNQ$3|W*w;$cADEs?p6q#?Lzbu z(a&=&Hw5?d;Yn1N10ugw?8FxZ(|6J5qbu#L_M>pD68BEbLqYT;y+Vy=z7OSnJ(*hV>qLmcqB@)_b1FUmB^s-wT@O(NC$p z*NXhH*1JLE>!H&}&E(8-mw9_3g8f|YqJEkmidFH*gC2iIGf$0myWuK{Og0BYr;Q; zzWNr%m)%pT@8i+aHz^!_b_PT>12diov-N1v;gQs0)sH%H)mFM9eO2uEM7z$aml zz<+M{ZPGuC^89uN1`A9!pc1r|jBi!!_`>#IHdv`|OZDGkf$xs!$AbapxUp5)z@R=EX`}Q-(m(TH)w=ljsfv+%n z`sieUiGGmB>2sZ{)VHPZ&50dfFLU~o`Lb5vyDIwno@0(r(T5!8DfMls{#zpOwN(FI zCGfq{Lj9MWuhh4t`fsto*HZm=S?u`2_TL79uci8LE*VVmX(@a)0$)q@xB3>wmz|^3 zH-`Q(*1W%sQpP`lF9vy;Z;nqH59$QI7{-H6=J>?;H%zH-OZDG50$*YD_PTiNP?(I* zihZ|M;5!lhc<@TN`P^}VQr{ENkEc7$`KOGhB?8}`=<(4`l1Y7)`Er%O7eo6F35Sm# zdO($9=xn`mZBbsc%d5-x7hZb=2(9Y(o zAODp3s94}@ss6T1r7!yVvQN1AQuR>GaX)VpPi3?0$-c~AMWt#@oD2su0H{f4u2Q-G>O;Ol6pFK)dEUlmQx!{x@qS%Jy)f!m+c@Sw2C?axt3xhQ9= zC?{}l250`ny%@-m-j6}NIBBWBc>_9uBY89edIy|IdvnnfaSj zT%)$(KIpsfPq3XXV(VNQK&a?yOP~<-9?Kk2hRHctfCuiIW?Lqp*BCCxdQv}}NC7@SB2cHw3 zBseR8Cl%Hn&x-}zB`O@!$OJoGq_07o^Pk_p;y$9t2TFe62=AyQxS&Z>E@|UF8MV!F zk@q}r4+VBy3wxh z`naK@++mw7aII-t55S`y?*>TEOQH+If(?X##P@lTzbDS}t2|sxccS!uf3&%6R7!1J z{4=JVO7W#~QsC>|O5j5VeW#+kd@c&`8Ka}Q$$d|hSsXN4J;KFiACS{EZ-3q_fs z_(kL3^8)4yT|1ie#oV%>jz<^9DgPmnzhi{_!mCr@W}~XR^c%16rMdZMi~JviA4_sW zmH+%1=07CzuZ~cDDE{@Epwz#)`Dcs#UqvWCWc@{c^82Zd|IxNT4TFb7{!@sD$!|86 z|ItLG_+9VZ%N3q91Lu+;oa8Qz&vQ!z&hvERg0P7}4{ze%4&EccF_R?&$t}&B`&$^_ zkSj!;b^RzjeYcv@2la;2=WAhny9B=VEks|BiAsH23SX(f_f!kfx2c8kwZBrS@5e1f z-xPtbCF(l`q^%bC4(rB&u<}<7?aZWqKu6na`Tza_xw>!PdQWZ3J2wbwxVt%^_{&GWki%y^x=gz2}1 zDGhO!8_YKeu+ma|qh?;G)bsDE+~gsbezAzh)HjL++}^CnyseM3RD`SRV*=OPYMJl` z8r&Ca1bOBIFV9#Y=@QujM(U*1FAQ(Vt_7d2CW9|p)CGLy z0^iH(ToYv1qB55Ym`kE9vnDS7ccz7oOrkQ63Vg2y%B(RoCADK(2?BgJcGv1@&R2M- zin9zg>62V`{vUhq0_WAd{r_*DPZ5!%L!2-rgk(O`G!>!COiHQLNUqaprkYGOW~Lh< zgb<33`y~pYL&!Z&6hbb?HTT>d$L-*_9f$vWt-aQJuh0AaS$ls%e&7G&ao!L5%zp0I ze!bUz-}Zg)0^?CN%KT%}2fROLmT>EF_9&G6F8RGkUUB(-Pa1fSMf{kG>(?wtyRqw6 zS{cS3m)|(j{2uu&%Ok(Fq}gDmHhKN}lV-c$A;0-~vxILK1Yy>QXcP5uDCh)sfGZoL6tt;l+!$Ag}qPxus1$>z4Z^ zUj@eJ4f1Kuc{%;Ar_qEjfi`2j=>*&lykknZsx{C*S~Eo-^r`}r-0wq!bs0tTZ)z6# zd*x=%AD+H3T-q~7-tLyq9K;nEpT*>3uM;}w`XH}0q*=a2OkVcgXy&A~n-|ql>uO_W z(xxf$aq@yOxjSj(dog3S17_up&p9HS%ZzwVbT;|5`crc3qf)2(vD16qo+F=2Z0w_C z^TOlJZ+_?4OUGbw1^eX@dtK@@KXy|H1;%0y`9!g2bq#E)OG(q4*UwxFh%a~T*e89x zIS$CNVeZ`=no*mv;W}-|d|I0P-Sn!lTbSz=jSN_;wVbG^m9v)-JXZPu^(Q7xLy zG<-Q}9x@B!vWaDps?52{eVeCKxeLP_BASaUIo`Po8$TF7W{xxen1nxgUB;X?jNT9E zymR+B@q)eZ`@g(AG)Z0udWR)m6EW}Q8zEoIcVP3nERT+`Tn$7Jey1eJet%`3@FGh1 z{z`Lr7<@_b&N6>T`9<#mG(!=5a3FdQpgBoXYP20GkKH$lmXqTcz9-+jRPOYRhnQOm zzV_R=@#$}T>d0qqL2jSu8Z+*9#BR5ilUIW>zE_$2){#cO_bI-=m=|~E=oRM8{!iy_ zA_K6$^dE0BGigKS1IIQ?DWBejQTfHJ4<7LU!)*L>tP-4l!@kz!IEXw5j%`Yw<}86c zw1Ip(lID#r`R6;YNzQ!je&Y=Cydx&x1*GX%l2^V5wpg%H`oP>31(!o{eZL{kM>gU0 zUEr;6n_4IlvrWx6-=!O+7n_5C9OZ28%n9?YCC_JUzDu+6h3)EG(u~_Y_xj@fBGLPf zN?R=5D3$vL-+_3nvyS}s=Iw=9z^&UR6JSk)Ui?Kw)r`mg`X!el9b5pjy_62%OLy663p1G# zoOTybln&;3df0}g1RsUU@Sk*Wp{IvA>EI%dKWunPa2lr2C>{L8)4z-Qh|@4l`b#{0 z+K^Nb@ofF2o*sH;1z|hRXE(8?5A|_y29U7_*)8J zr|@?a{+`15OO@HNrh^X^{YMIiyYT#!4n9%%rwac};a@2HOND=>@UIpAZ-v8^I6tL> z?-l-o!vCZ2pA`PH!hcctMrNRzpW(wa-;msAkg~H)%kDt;( zONDQxaCn=$pVC2Vg~J^;eo6=1DttSIZ?EvS3g5xwXP6pK1rc8*6zO0`F%`v|4t7#_ zJB7Dbcn5{=qVU}m-cjLuD11+a@1=0Kv(ZoKpito%g?CYSvBFCf-p%7Ma;Aca!}kR_ zrR~>!nS{UTpodUJ^U}e-9`9#JN^tnTAg6S&pQo=zedNCfi_LF3fV(99ln#0+ypO_5 z6%Nt*DIN4zI6VF0r*tq#;Rh>xu)>EZe5k??@%Y(>Y!vKmjwaD^YK@S_!8q3}wDk5)LeB0r^ru?nwI_;CuKpzw(buT%K(3U5$&qr#^se5%5y zEBr)-pQP|p6n?70PgnRE3O`HX(5n5E4$f8hc?vfVjO0k>{D8tQR5*Mc#ZT$rVufF- zaCjQgPwC(agn(}(%qqwxC_{(#5V8j=bk|5VmE{Gg`~^M$u9`Y9betnif{hxa+B zg2+ER-$y-tnD65Xe?s9;dAyyu7Lf`f|Lk&p+S7;mKCAG*EBpnI_r`o9|LlBU^7LW8 zuPFRgg}?6cV=>>zKf9dY^z>oAZ!7#Ag}>+V(=p%3KRe$KJbjq&M+*Ok!vE><>oDKQ zKRe&gJbjq&7YhHE!oT+TBbaaG59gdYrGtNa`Y_+`6#j$9-$nn(N1pLa2mkT(q5pps z{)@*qHy0aI!YA9`3~@Pl9wEaJa+8Pw8N?!lx*Fn!=|m{6vM%Q25CTKSklED*QBs&rnC%4T;Z21{7Qwx*I)c(u8%8xfx@p-_(FwW zukafbzF6TmDf||NFH!id3cpR^w=4V(g)dY1T?)TP;rA;1euY1v@COzCkiu6e{9%Q! zRQM`|Kc?`<75;?6pH%o7g+HzEXBGaO!k<_83krWp;V&zEt-@bb`0EOPL*Z{J{B4E5 zqwseX{=ULLQ20j*|5)LlDEyxa|4iYZEBs4^|4ZRtEBqUUf2;8C6#j$4e^mHS3jeRd ze^GdN>#@7VFvt7is3@A74$=y5s_=~!-b~?}D!jSE;cSMV(m@M_!`Hq1ln%C1cq@gs zR`{P3zOBOBD13W`|5@QXD11kS7bv`)!gp3UJgws=a~?q9yD5Bkh3}#8P72>k;d?8* zP~k-i@1pRo3NKN3cZI{*Fh7~=+6wQf@ck8jfWmt#ypO_56<((B0~Ow1;qX>(Kc$0# z3O`ukgB3nh;fE-ExWda7K0@J#Dg1DSAEEH06n?bAD-=FT;m0a`w8EQQ;>k{A7jCRQRb1KV9Lo6n>_{&r~I3TH)6y{91)yr|?Azzh2=t zDtxiR;VspEN(Z+n{I3eXRpCn&e!If&RQNK5->q=C%HyYWaG%2OSNL*;KdA7(DSU;( zA5r*9g+HqB#}vL=;ZG?1DTS|5_%jNBR^fkF`11;XQQl zuT%It3V%=G?<@R6g@2^*e<=JDg@3B>&lLWJ!oO7bR|@}H;r~|nw+jDW;Xf$+KMMaz z;Xf<<7lm&m?uw1ZCvzS^;Y}3YRN~AE@vF3Loh4!wg9Uk^jF%@tOPEJw41$ z2ZI$pMB#@he3-(^6@I9~VJ-ZW4n`{c2!$W1@S_xdw8D>3c!k0%6%KDG@KZXdQh2q( z$0~fB!pAH8IE7D8_(X-*DZJj}jfSLx$OqnC&M6%RE1Ah_=yTX$>Vn! zk_sY!`CxlGIK|V4ah|I1(-nS($6qicCH%AVJKfK47Q#$y?)5E-Uu#r%)8hBdaO+CKC zkd*L;_X~4M2b+i~rr^J+!ka663y*(bNJ{u;ukV(g9&$I=@fE(c!vEy)=H^M&R1o=R zukW^=KFoJJh5uRMJ9vCA%s2AS&UYtIALiRm;X5mQ7mpu;`9}WP`O3Xo$T3XmV0X_4 z=A?r?6~33pr(nL3KfKSGQ##mNOfd!jjKX0r$WQ5@tH-azd?SB&r!yyWf4-Pv3i z_`V9?&*KkazL7t?+nG~3I6zD>g?xJ}ysyH`JiZR|jr`@4gz4ZwPY=1Lg8>R3sPKb5 z-n1F?qsU)Ak(dsKc=|BkLlh2sn|?CSiFCCo23TkH3fcM*i9Pp5p1ld{0&Q=?Xu?{V4L6caW!p zvpjv6@7W4JSK;S*yc6ad`EM!iAT;m6^Ymf9^AvuO!vEs&!I*F4-#jbdOFVs;?_~BD?)SNNR@zf0lwDEvN;Z?ze;|H%K6tT^xY^kJOK75qJ+nzM zd&Pb-*Si(oMBy8IyuEn=t{I{%hj$xuGS9P%DW)(EY^Lzd72d+*@Qt~Y@P~IBb29IR z6H`nf-&P85?eXK$Kl0f-YaHIj(?c%lppC+}_xLsFANib=<=@uRhyFV%yg=dYJ^mc# z8~LvmXHwEZ2Tvd7yQ{)GDtr%*H#hHGwu`#N~U8&GE9QKgQ^T;GIp( zZfjN=O*{*l33$(SF8u`L?|T0Aq=$Da%QO}Fd!Bv<@&i+DJf{+u9`N^>#NQVCL%`<{ z-^<|_5^wMDONqB}_|?Q^xr6^A;_`hWz;7o0JxqwSl=$a@!Jl^%|Ip#fiNEFWM~J`R z@YTehaQHLCS2+Ad;`ciIHR6AD_&VYX9sVKlQ=M}Al=xJKe?@$P!@nm!+TlMFKhoh% z;KkX&fvK(z-;B6Y;e&{mIeZxL0~|h*cz1^%LwvYX&Q-+wJA6Fx{T*IM+@+!6%R(;qhmYALH?tkRR*u*O8C$_&dnQd;BBh zCwTlb-J>DGoUp&4Q@`WDX7WpEN?|^)X$9F~! zZ)wX;yCYxj@x771>uqPdBA0Ka4gK~-zQ*(Ejr>KAABg-7j~|TueUA@E{;9_gNB)h+ zE0F)_@oMCoinA|a{I$rp@^}OC?L2-0@^&6S75VNSpN;&TO$xG$Ke&Ln`P@oYx|n#c zEE)t?A%AZZ_lDO+$lu+>-EX;te1OJ z|1DMqt{&eVd1sFoA}{fHH{|AK~%g$dB>(5y;1Qyb}3D zkB>t>#p9EZpX~7|$j|inNyyLl_$=fXd;DDFS9|8O5x$mbf`A%t~()-zAF% z!H2{h9DGLHU4d_i@8vA;ALQS;@*sr+)h{036!|9JaaK#@TY7w3!M)@m-Mb z?D0;>z0E~%5OQxg55^&PM`3e(huj-ZfaEdC5~tmG{IDRK-pi*JSpG&nPhcSP>$lasRAovvdo}T^}1$Pf1PCn6v0@de0-c>H1HLp}aB@&+5#Hu@!gTTXVZe9Kk^z+ zKN0zOkIzSboX77+UhDC7$R~Jw;~fA^^mr%alRQ2Qd7a0nAwS;ZS0k_Y_$uTL9{&(| zqsN=>2xzj$_e4I$hY<_r+NG;(ekAgf zJ$@?kQ#`&9`Am;Lg4{ie7X%+8Kh4v(C;)W2$BU8A^7s+R&+zz6k_yexAp#M}EG?pF)0t$Nz0d#}M z%aGsb@#By$_V_&HH+lRX{63Fw-VxCK9xp=v zfXB;`FZXx@@&`SB8S;lb{x{@*^Y{nIS9rYn?tmWlcn0|+9zP8EN{^p}e3i!+B7fB5 zPauEHG2uJpYr&1$k%v$HS(uD{yFkzJl=XwK+k%7 zALP$@d=&D(d;Cn~&wG3^@)tb*IPw=g{u%O@Jic`&Kref|2l7`uUV(hA$In3is>g3Z z{+h@Cj{J3xe~0`HkMFP-pf^3<7x`NrpN#x%k6(v;oyXrq{*K4D>*JZCBT>yclx5w9xytVEy3J)d=o{%7RZc|L86Af6XI zpB{#{Px<=8kVoI|=6EKf&$FJ-g^GSD^60zX?DGuz{N3~Ur=s7q3&a`SEx|s!8Qw1S zgy&PL=#NDneFvOZ0{3h}(|`5b6?`;@P5KpuU6d>A$CdFXSG z=X0x~UxPgQE;;*rf~lE!Jm~pMQS|eXN8eRvpF7a!KF{Y_ zMgJM{=zHr&PBf z=sWDp_eLIlZ=LzU$fNJ7Gd~XbXEsjeXCsfklg|7`4J_4r=MxA*u!qS?>09mx z?fDkl4*L^tXZW?LBQ0-2{CLB2?Wavc{b5$m`*o`gZ=dq>eG_?SFP<+HzR~{Rld*a} zvfUbavE@%voZSu273cm6KiKeVQ%BkOd3_fkA89$S*Vl%(PetFkeuVPf>VVw&9-#1{ zhPO}kvhlOeWJP~7>ic;5M-}~-sE@v*{Sd{u|K>r^DiwV%duBSE(X(53WeHZ&o%J)v>hj{uQ3~!$rZuz_*Ouc*O=4T^6%l%gMh5SfQ|CGYtL0;kMzf<@YeIU-!R{t%Uy*)@!mE)VXZ5_kCn|g% z@`+Z@Pmq3~@E(03{^PCwR*L6b|ECqj`Pe6X6)$@AIRQN^6 zPx16ODEvO;r+fM}3V$2W_?5z&mce?RYxP`@Z4|yI@(Zl~eJaoW6@Ccv=sVZ# zHVzjUV|cD{Z-Syf4SDqa>pxSzS0InRe_c!dUnsn9KUm)@Z2a6#E<_%E=bGQ}`-$PX z;{2Dwe?Xt;``2m8sr7*{UfpQ(eVhL3Yn=dPi_p|pPxzp0AL9VL5-MpF+HY8Ms=d+FJe^l|ygj9W4I`@jB$4 zEN{PAXmqaOX8*+Uv&jEt9#E?~1&e_1T)rVT9sSt?&~Seu2Ul zDExNA+o$|^o=3iqjk5`r+m{M&F$jG2v-(|Wy}BrTB=TNXKcDm`Df~L*eXX9$ZKcBB zN8ZosIsVka5U0-zkPonWj;BoF%JJ{2@KWTJ)}Q0A zQTX}DtE`^mzf<9Bkw@QSoloWegTl8T3h_tZW99g}D|`g<=zFYdsQgb<_yXk7_gI^d z{!xX0f;@Ukp5t$R2*m00PROJ0v2y$eDSRCA>9#yM{__-m2l5$K&+)&a@Sl)J-(zj0 z^54On*lC~g`ToeG@3C_HM=AUSd9|D*7Na)|#DtLOI9Tj9qdkG{vs@y}HF)yS{1 z{l?wkD`2wpyipqbBLm^I|7a?D0^<4hL72b&a2CL`zFI4zaT3P?D!kZld@w{Nym%oJC zS>ff#qwln`{se_DKpuUk^;yd4F@=AM{0$q=mULXu>PU#w=iQM<-)ZIcbA-ZYAdkM& z%I)V0h2M`ndV3kSpLGh~_$Y`o`c5nBJ1Kk^^5{FQ+#aSW{A%Q%+wx)kDusW7Jo-*6 zw}+NTL!3S@LH>>PXZ=wMKMnbJR?qEWvBIB09(|{k_1`Fb`(q%^|5|@;KfM$_26;fO zCJ4Cw%u)Cq$kSH;6parrD*RjI8(TfMpFdSVoIWo`zNyvo7V!v$&qTht)t^9XeuKi- zAm_CV0zR|wmBQPMf;d}Qf7b7>@G9hgvii%Ze9lq$Qsiws{mTmf3HhI`{$}!TUkP#g zyg%|CJ^e(5&qvYZDKJSElH>>CNGg#qu$oH^%Za)_&{8r?9 zSv|L(7Zv^^@F-teTgZD@J-44GRS=KQ_dwp$ z(+^en6yyh3J-44L75)hFKA!$#g}11NIHT{hvVXC{k3b%Mr2Fo| zi^yxO{s@ZaM}-&EK%A4Tp4(3!g;yc3w|Z_rrz`wALN5`{mH{8X#w_Vc~McRUW_oaO0D6+RyMSys>OXRgBUMt+W` ze?#G^T8QU7tLOUdsPMta=UP3NXQRR|M}Cpjb9-B^@VAgh-)ZIc^IwIxodEG)X8jMM zzxpVA9P;Qptv}Lub-u!vA-~4@|49AiHHE{YXy(30tACC3yDEGT^5{FQTt4**zZ7}& zomOrS4=Mb8 zh%@?5E0<4+!bc*HzSGL>XR5+4Mjm~qmD|s9g};kD`c5mipJvBHoIdZ2e5EbVAF2Gy z6@CKp$E^M}(l1c>W5}PddM=+&72c{I;*7r2%I&AS!jD1zto7fA;+duJn~_J~Y2A$U z&nf&{1Fa_d_zSGL}dyvBGkpE!)$5Z?lD||Wf=sT@Pkp3-& z2U8)Q=sT_4es)s${>W2J!?iT;sierN6n+l!rdEGB>6a?}W#rAQeh=Dy{iN{r(;)ul zR=+*z`zw4R@)lOlMy7AT&M7jr$aogt)AOYCxs6~zOB`B`$kKHZD&BfJ|BR5Z|l$T%u@K@kQZ6~HWbe{ z3g7)C$hWK2Z$kPigEXxS9|*Fk&mIaj4 zChDhK-Z>TOFEc#XxUo#(YtZLZ>vIG7e5B|%nw8ssN5fmC&bB^$hjDjBU#{>8=o5Xf z^Gk~7Y(>9F;g6utWj3Bo(qZ|$sp!8`ci^xe$EXuU2% zepAyhI`dv*;twKU;_;7=-)1>Kd9u}+;2*sOpZUJX@3Q)3)PAaw-|O)UkUwDg2c*9b z`9qd3C;lGthb{k^R^-oTK|HHGJ{)=Uy~q-(my?i3--Tp;Bl4#sA1a@}BagoG_%reU zAdkN1_%QKZWEqrdGsAd<_nQW-&=f@{GUc1eOHn7-yx5_pZGbI z+umnGJkfU&`F@_U$fNHeayyx4c&k+OeZ#$r!-BrU@M}}>6|gXoebC|@;BQ+_VFqIj zZ5Ay&qUta@-4Rw^$U;>u>1hxE07;z`O0>o z{vG6pdptD<;;*#4`;MW$J@Oil_eFlZ<(uvh>PI1;Zuxe^PeFdFjjpy9d3u?mHsuJB9HKl*Ob@-0IDdkk-% zy3NMJ_YZ%7`sn*X;d}1Pd)Uqgee~TQ)^{#f-i4vh zYQtNGe`fvrg~GdC2tLtwTi)mrE_RsVxqPleeaenM9ZN#}O61Y^P}UIt2zm6qlJI*K z#`_}3H~P-V4pi?wkw@PL*@oJGJ@V-L9p#kYbL*$2hy!(9EA1<_f zD=MXfk!LLDbwAc{{+p!uGaL0?tp3k5^G4*wmQ(n_V~Wogs4ua4_G$4Kh_jpJ?6Vj0 z9+tCy5b}L2XZ>-=ds@!=bCB<6IqPpiet_kyUyZz%<*fe*c^}JJzwyNoe_zX4zYFp* z%UNHFyr1Q)AC0`f<*Yvq`2fpVe=YKXma~2Z@!%_wx19BhkRNI}>;I1YXv=B14c;|8S3CR;^`oqQJ8FlmFNHWOEoc7> z^3j&FelYSX%UORM@-dcgN&Y7zA8R?sHV=7?2OzJvob^W`Z?K&8(~(cMob?wYpJF-d??gV$a@IeGe7fbV{|xzw zma~4d%VE7{SkC(0ke_Th>r0WJVma$8k)LY$ZdA^5ke_Bb>+eB6%W~Ggi~J1BS--^< z5a(Hzb3A(>pKUqo4@7>B<*ctley-)LKNb0Tmb3n9#v!btSCVe9KwCH}Z=uXZ;}LmsrmF8swK*&iXTvUv4?;7b3sXa@Mav&Sw__`&`(Y z$glDAKO$dXIs0#W6|C2Fma~5`@`aYO{t)EXTfQ5$pBcz+u$=WbB42Dd>z_w{ljW@c zui-pakTw47cy(?bjHs-yshrr@d30S}P;tcIfnDlG*Jip6Z>*eHRasxvyS8@H=*q@P z^*#ESKaLw-b3%35gwA!9^^KhiBYBqtt0z|1*Nh(CSYI=7?10gOhgW2}3}~3tcU)zC zd3|L~V?!Ar-?gkP)2;8M3C6Fw@1&~gp_6JRHZ}|xo~amKR8dw|Gi>1C;e{0gMweHV z7nl@1^G)|D++N=9a(Fju* zlj;XmPaNAgP7Sr>;7T+2Oe;0jH?g6{3=^7C3}jJrf;HjRRMf4{^v3Fjq1E*`pERNO&;diu zxMoTu?EJ<4H{dkRF0d9u%hEsP%{ZC(}xFSN)kjS!$T8Q(E1a6%)oPK zk_G}QDNZoLfRa=upnmZ_Mo}8C$e3{YcA-9{7Bz^HqTyN#JDzG~)(mPbK^4|of{1D@ zUIn!luYk?Pp-Gys*5ZwzJ`xqB@rt5C)3>VYCsx+tXw$o@s=m5G4qo9%;SLWlWYEU3 zY*?;=0(S>^d??F3Y(QIpy1|_WwF03nbSa8o3v5*-#hwU)cXzASXYbH%Bt|D~B%n%j z1duh*nSqFQcBbeBVmEkdftY3(+6<~`PzSvXjLE$37AGt+tucFZ9INgkY$5;|8#|ay2C%+;GdFEgQ8*-6r;8n4T^DYmmZ+(f(v!Q zrMi?LL9Z^jY!_U%OPCKX+Xa{H8fJ>TEAp;kj_6s84jJSbWe}>`eZP+491qh*ou)9BPmAG760xU{*AeG#az0gLs!(}pGD!n2#Ro_B3!5l7cy^< zgkr-GN-&%f46P*Os3}2x2`*cLJ|*bc4MXmR%XY(MyWz6kaM^CSY&TrC8!puy_1#g^ z9rfK&(;c0=qh}9v>w%gcIJXDR?SXSMg*ZD?i1RarC@?$wunw8RP(sBYmUD&*J%b@- zs5-(j%}@bTX=lR4!#c@?<&p`DDpQ253(g32QAAR%9luw@lcKGhu~f!n(+W)sP8mAQKjTCM@?%Smc?ov@>CG zXS#)J)IBV-u-r3Yk!Qj(&-4gaEG+3v53H#j@9GiTUBa#6dYv7U&e7SE zzFo^|xVvT1X*ucioODc1T9uQI&q;9?(_Oo~PnwmnC!Mnz2YV>F&JfBn_|>^d6FTE1 zOEE&W2qR?6FG9BPB4kT0LbliVksUxdZaaBQe^BFpvf{D-^`e%`1<@XdA;o z8r7^&5IZ+95U@xLq$UicM$HNZv2zmx0gJ>y#)pB7SF=Jv?A*jaz#=h_X<;DK)T~et zJ2x>9ut*GKdKk!bH7gXv&P@yiED{4569zIy%?bsva}xsri^M>x!a&TEu}QB11f32k2SGH z9j|K0%ZrEqc(0ngyvFCHnwFPpdR{8iMsO<{AHAu&c$M9bsy^X{G_g6h`dqSjKs>I4eRbu6#DzWlVl~{SGN~}CoB~~7)5-Sf?iItb*B#ya3 z(46&AYb(bR>mxSz3uh|K?awB~pBRw&fZU!k$}2KjBEQH&aTu8?S2wbxYd_}Tbm&0S zGRrH5msId+JX*-C1zkc>Z!R}0Ho=s6=2t8#FBq*~hJKjQHM(CDX&y_M@-wD#lKm zR$=ayZJ1>4rmKNFX7Le)tb5R+TNaA&mWA>WcmtEY)Me+F1!L-~t4%pnRSt!F8>(uD zPO-(}%S$t{cR<8uX8H)1w`*)JzQ-7w%lfg#=De$BY!;0%HrMTAjm>DQ8Jk68jLk*; zSYxwE(2UKZF~;V8fLLR*714~%qA|wi28UQfx@yK|(HLWQdla9It5!30h53d6+o}9Rz^$6L-ZBKV%~c9? zHA-y|cD}!+c2>@Hqq*uZVdtyH$}m9-nj435HwZglH8zXJ6onb~VvTc+n3Sh7V$xi- zH{1DY#7b|b1=SJL&R30<5t9~FJDr`c8Y`WS7F35~J6|h zv-4GBWniNPy%<=8tRp%7~+QxJ`Q$~e3c4DZEO!JSKYua$k zT+?1+=9)1kX0B<(F>_6WiJ5Cg)R?(u2#T3&#*tieY5!1(ismZoOLLW|Xs%MuG*_u3 znyZus%~i^o<|?H@bK^@RzV_Y5nzLNBo)}XHdHGWOQj6PR;Tzq?nbqyX!wkP?(OsN* z-{)9dTG?3H9S$Z2nFpxB4-O@~9fsdv3s0f2U$io!r_(*D;p*Y>4iR5N<$?!VJ<6ty zuC8k|4^w7}?Vo*XE8+1Zli$Rt=6LAPiBoGPR#gnEZkRlwnuD-MF~8!DSHHNj572&_ zr7WuG;IqU$+&RHKzi4jGJb~9Cn%iweG<#^KONDt5v!d1*RWw$P4a|cujg_O1s~A1* zxQa2AHMRcYnWElxb=4EAB9k0>WV(c+*sQ{5ZRprLig~K_qgf*0seZtrOVmz8PvBDr znW6y=!$()vnuquCkylM`uwotDf3H=e`EdR(T$VqtE;j#T?)lRO3s6^sI+(E zb}1AO#lbA`OdKjrr`I2O;&u8hZIw3Czqx_R9fPRd^)1SImv<&7Eh@7&E(?cDPFhrE z%P>ouix!pHTb;ACxoA&ly zZM(a9H^#(T=V$#Dc(F&QQ@0U zygAWJQ*zCs_oaBVa=j|W7r`3`_(^YmB-`u0F}s1kx}{U2weL%sVlH;!3zPU|Lw>Bz z%T#dE)iGOfbo6TOmWM&wJV8}Asi9_Cg>g1x&{#9>(^K<9`t=)bu4R_@?lY(iJKONa z9>-Qzg#!xh1(pwx(1cY!!U5U)n^E2{n8!Z7C3Yxtgf2F{Ip!AGyM(!hdh>8-Q zmoVj+NfepesG+c9pAv%-i50|@i1Cjp5y(BC5c6A)#A1VB5=G|TWGIo?$JL-jVg)fJ zV*F!D1ai+O#QfGHv1}ojM3K4S7fK}dxj872SV2sQ82^|Of!q^I1T69qCAT(o;yZ7& zPHOI=g%Zhe^9GG0MgS!eD~Kr(T-?8nBr;Df5wJ)s5m=AJ>PM%f5;3=?LW#saNeCqp zD~Kr(;~&#TAos+T1&e${$t8kLNhM75f=)>#V(wpr5{Z4t6G|jj5K|(? zKc++=_r#S2i+n`MC4x>#C1P$0gc6B;+7wD8RuEGn#y_S+Aos+T1&e${$t8kLNhRW5 zbiwk08z9ZbX=0^+GZk$lyv3l@XtA8TzTN^crRZs6%2aCM;;D>3F%Vo}eIlnE)NQ91 zO|Ho4a+f_2@!cW?1Xr13J0B@bImR2r&Mr#6@fdgX^LaWrYTK~^*~T5GG8Z@8+fePH zOtkKqyi`$7iOVtCQH@g-4M@Bp8p|smRndUN+osVgA63zS#G9+pD<4(SfW%v{(JLQS zk$Le{!i~=8m5-_jZkvw3X&Su}RraVPdGtK=;*C^nX(#tQ^h)e`xQ>Z^3cd1C<Exb=CoU3u9;{7r&qJ@oo`+tE zeG0wuQRUI|&?~X$VO)uQ3cd1C<+05}uf(2*aV7RC^vXw-$2JeW5_=xTmDs1yD<4%J z+dTA2?4NL+%j`=w>OBKaO(iPgdLA0Y`scB?i6_VsdmgM!a?eAr#GZ#by@FxFCEFiDbPekT+c&;SpPhF9-fFz?0K*@$vqFf5_=wcCH5)w%14z)&qJ@o zo`-QI_9^trN0mpv?Dp>z_x@!xR3AJrC9y`Ka>fdFYkc^DwT&K80TS zsPgD}=#|*>Fs{Ttg$f}r_d`ORUSPLy%KvK z#+BHo&?_HR9z74e5_=xTmDs1yD<4%JJrBJSdmdbeH2rG2-ZS9RVWJ|g=b=HYe;z## zFJLD2JXo9Lo`+tEJrBJS`xJWRqspV_p;uzh!?+Ur6nf>O%A@C@S7Oh@xDxvmdgY_a z<9sA~CH5AKE1!Ol$N5OOMs51S7`-*aW#vRgTyH^xSpPhF3trq#>@Bc1$-M==5_=1J zCH4dK%14z)Z$Yob-hy!@_5<|FN0mo!L9fK#f^jAG1N6#AmB)4py%M)m7*}GSLa%&O zd2FZ9E3tpVy%45fncLO1vm$W&LZTwB=b=HYe;z##Z=y)-d9XIgJrBJSdmefv_9^tr zN0mp*F#KY28EDt$Av8J zFrQ!l9=Rg@J#y;9ljdf*-}Lf1^Ki+peEFQ&I{n&3<-?lMYv1TOE%o(t@(JYpmol4K zdl%n&EG3?xiI$2UR8xb5?34n{XKB4m^H@4}vF5X&cY+Zb-tpdx&w%*zpHz1#5Dz8a&;;OeQ-^NRLf$lqjV#|76e@2B|iMIhOs zQISQjzKCAe@jGN=L;f}2Wp}!ex=qOxl}&6gZ@n;&C?7u=US7#H&K;RQv8rn553Zd+pQZFp`8<%Mfv2I$&U6@@zyX}jORs`Twm~QX7hRaXa?JfPs>|F zS}2+oEf(dKYc89@qrTzi=v~hob0W(eGuhGP#vibEEpyF^Je|2&y_N2EA6J&EN#s&C z+{x*uA|M1tLn?9lw~rFINy|G%Xl_M}Ov>1>n(dQe3L*oSSRt9}(^EQn`V`f9hb6Br4h0)G zvs9f~RA}}=s_V_G!TZ#j7xDG3s;W0{5DyCoHn&CH#OuUHRMt+G?-MH zf5G=XMM2vkAY5&8ekA(5IE-Ii$|hFjY6D>-lVz2)$C1MgMzuJ%l492_ItYt)h}5G% zZPOT;(0<{1Irzs?>|)+{Q&xR^bkvo#`gG)z_n3!=D&0zJ8q8}ys>_BBFOFWM!{;V{ z#le*J9wUB7&u_4H-*%L1?bl~(qP~b`w0YS{p*i@6-Db!{d$-H_WEQ>N#clo5%fh!u z_NMnU(W%_*jzmMZ-db}XrN^DZNN&7Yo}xR%o`%R}o3$?H@FHwiVn8T4sMKsg#M_(T z4Nrv?=0EfPCi^Bn>INA&)N@`41uuE3!jY}0nCA7JG;xagtb%zF=n#B2Swrse$-V?B z3MX3C-!UswgW+lqg4cQahtL@~Am$e`DVid)846AKjZK=ci!e*jnj_%+UObsqi{1K8 znow6+Z(hYU(A1LYDF-^=r1%wMhyNB;#dQ6~xUARMmJi1+-NUqw#>$$B<}HS>1q|PU z=D-nyGlg&gXj4W zb{<70zlNIi%Enwhjmw5+YeAaprEyEsY;9?Cg*0wynyoEuu8GDiO|!M7%~jC2rD?Xd zw7KpXw=~VxmNr*9r_^PH{fYu-BEhvlWNV z;rk@T($V{z5mNrV8xbCnz%$jNRC3SEy<~QII!k7iX4WoqIACO<-2U0afa6ayb1#|Q zvz;Zg`?WJOyI1F)nLE$y9_=id-JhMA*}XaU%-nfq_he_u?0)Rb%W19xa)>?a|EKZ7+Lf?mTn1Jz6q%+oPGeN4e~ox%13D z%F&WpqnvHTG*h-rlYh=}Hcpy59_eZuvD4mjxUw`n=@xAnGKJxL>IcA1S+r{%35ti0 zGw;)#5;P0KlrleerGwz7U&3^d;P(hF_4f+iU+C`>d=tSlO@m-_n(j`&P0VkR;hb+j z!Mg}vE_kuv(!bjV_TOg%`|r1b{d;X-|Gpd8zuyM-AFzS_2W?>gAsg6#nDFl<`lIZp z$1D6W!L|N-=mz#5Df|mXJaYWmUvMqXBY!8KV}2)}%HPSS>UZ)P`#brJ|DAj${7yb~ zzmreH@8mN@_;eNRR`$off@|%0`fu>rl>A};L9W+6B463R4isF*bELwhzigiy!e6%A z4dE}_;fC;+B=@g2gugtV;`1$VK19Y}sl<7z;8H(XaJjy6 zz2tG$hR#=>pP4WAGx_{a%EbE@!}ScNwTF8wbc4&^NUuM%9A z+yCF=m-Q~oe~3~(<3%~h@;OoHW%-|`a4u)JeitkLcL^@be_w?c5O@7M3ohg2<9fIK z@cBm9XNt)8D$(8^5?sdlnBZ3nJ(oYUH>uxB(eEg@)bA>|^go(7#D9&*caq=>1V2UL zX9+HSz9$ax%W~+vQ8>fpa}~ZV1Za}m?}jP-Il*PV*O+t5klgisn7HfzjNr07|Ec)= zAh;~IO~IJ*m3%9~Ww~`G4nH#f^8}au>nh{vz};-;GV1 zfdu6&c`LzXzWWk){rd|p%l|~-bCSt}$N#e&&i&*{2*xDvzs_h_FZ<&{!KMCs!Sm7I zn1`PGHI&bMqvz`y|9>A>TS6h51nV{1{LkgQGeDDo-*5T|^Dan3{(#_p1z#@saKRrG ze6-*X2`;zee-r$4pJ zn#M^e&((r&E%+0H?=1L}f_D-8DZ%>+zDDrjf9dz{2jp;3jVI(cMATV;41}xU+@^hu}L4{)ymS1cz-px7)sge=7KJ!9NpxwBVl$-XQoF zf}be(mxAL;(R#r?mAuXb^I&~}cYq0#h;zK`KcD_{WRi7IeZS4^C*YU zBwpq4M&jcfK8|>;!;d0f=kTG#8y#Lse44|%6QAMmPQ+(Ayny&Dhqop^+u_ZK&vE!q zG(FehU()n^hrdtLmpZ&7wTCMm-jnKOfx`=lFLHPX;)@;5{!1L*mhxTd@Rr1vIh_0N zy$s@yId4M{+)o0eb1r$G@)sdE^6J9;dVu{?bRrFZ1Q| zgl?P%Dn4UGzVbNnGNJ#MD7S?|f2}x9Stv}nf8~Jv z>+AmmhucJ)vK;;{xGaZP1()mfq2RI{J{Mf-|1XRW-->cr zDB_gmuu^bY4!_qp*@67s_D~|Y*8U|QEcCKp{6)ksw~z9?mh3M*Xn)F$XQ1FR-y;=1 zT5uW9UBumf`m(}#f85pI4*{A4T&@@IXSsSf7KY@m*H6SE>@WTa{ z@h?;S9~NB3S-LT1i}fz~Ai-rnEf-vlKUIQDpVJk7uHe!~Zl~mW9Ug}1wa+nv%Y0`F zF3Wiyakrf1af&Se>xEv%vzOwpT`!aStMYniKKtA9I-1~G6{@kf@!e?&RR z{cTwea(`Qv!-m-3mgVqAjt{V}_5ZqGbWqxJk>IlZ_fhykg3I!pMcmzAx>azw9eH2y z=f!rRx!8Y}{@V#IiNxJ} zR|qcmi*_(=36iTHLL3&8{xw1`eWnY&jGxbUf{)~LgkJjJqWIq{xZK}s34xpB#@~&& z8~>p~FXOKkdKqV(!lwx?HZjt`q!K(`I;FZ6f-$ z#aSER-xGc8?!e7S2*BhaHB<~KuB)8mTzn10jg3!x$d%P$g zxn2e69{S7uIzG<;c56lXP`AK%-V|JJ*KQJgC*d!*ce@gYuzogW!u3@s^sft_QlbAv z=w-i?`f8z{Z+teV>Dj_x_V>98=Y9v}AobUf9^$`T#Ce0@ZwW58?m zT-M{ug3EZ`Quv1o=W>SlVIP3Y{}5^?@B{afFdrxQ-GaYP9O7Rn;@{m&LxS0GO`m;$ zK>`lzzCtW7Ip0^)44_G@4`_Vh`ego1C<|KBFY}J1Z|(55#M?N$CGoZnZ$iAl;e6jn z2Z!^0BOM(+o7T6J!yAdqdV%u!l61w6p6`3 zwX{5!H}f}$FL3-jzzE^p>-s6B9bGw1%u<;}c+^jzM|`M841oB1fxb9pl# zM0|x4Ki^lj%HidtU+r+-KUm}NS~Dg>dM^C2N6+`oc6T`U_nr=)LDRh){v}Pz{sQH{jCg-XKbxipIh@OXsKZy#^!kni z?Pxh@7jnN^mgh!hCbug-j|6%-4)i4-C{H;K98KKS*9g7bubw0HvLDS?_>~G@DE#Gq z_059I{pve}kKC_*Sa7*t{e<9hzxp-7W&H0dT;5M5^|F1gHp_DP4j4!PvR#3G6!Bt5pKII$eIe<4I(lvgy&S%d#$hgRSR8zo6YuZnFC{+6;k;dt z;~x0%{rMYW+)J58!|m#S<6ijQ%Rh45d)m}5mwz3#2U8`%`{Mk-9OBTf(xSc=3H=8` z|E=I33XTJSnFszK3BDP%ci`Ii1NXFWoaRqVuo&O#0sxkW#GI$)__M~$&o%x4=i?wb z{s1qa{vyX8;Kjt{_yfE@aXJ0~=kovs=5I(4C-6GbcK~P-^I62@_yhVC#5p00B^Pd7T8r>8lbr)M~vr)N5xr)N2w zr)N8yr{_4Fr{_AHr{_DIr!RFlPhaV9o?hT^o?hf|o?h&5o?hZ`o?hy3o?hl~p1xP` zHRf+V@3-9HKhgC1ZU^%@uim6dG`{t9xd*Vn*%h7`J!+#>pVH=R}gPazpQ_Q zrrS9Ddzxc;Cps8sj+ztyVAA|lk4wy24 za**c%HpKNcI5y|p}Ey06v#|I)RBv z?6ZnEw`b-{Lz&$VW!^}f`#o?dPo9?J0Ob23>3h*H`*f##OC3IorsX&QKI@3faRB%l z;zQ||{pZs3`i=wbXgO#H+WEkZ%}j1r|2r=JP|_?t=h5@Xe_`x1{;Z3yI5d0QBX=$(8=@O1<^4gl{7h9(t;Kh~#?ri&fU_Z4uzhsB{hd0LJG;J=9c zdzrr>ar`rJD*N~p^gM3JaR4}%zZ?gEbNLS?KlbPShYc|fY+@P-x2yk+1AqKD@Q$f# zF8}4C-r*i>=06F3pWq#+KS4W@-?ceTaQR)EN2vY6xS)+QZ<~3XFJ+7E95^Q)SHNza z`F{q@kmC&SW|ZING@tdnUoFQO&~v+&;|%a}^FJgx&a5-ja{-#vHvGXj*O|Y$Ul%xh z6iv%Y2$GMoMur6i5|50V^b)|u%+R3AL9fF8<|r+b>eA+gVL z()U6d@wLQD9nRMg`aAqmFf>VyGwaNBEpaYy&X?R6GF7gQGw+*u91mzAfgNy8uskH-ADI7_ zz=TP1oB_TTY4-jM@Fvt>TGD*>$+bTN`cl%%aR&HE;&Pk;UQ4{d{0)iy7ZC3dV#{A7 zF2@=0;rAoSaRzuX7@8!<8Q?>S%W($y8sa>zz$BC>Ps?!z^yO4fz0BW`Ko6XsXD9_| z67%__m*WiR`F>?N&H(?0^m3d5KG*yYsd@N=?L^)`{Aa=C{lj|-E{|(?Jb^gj9k$%A zczq4ZI=^u+`G8)Y=NwDi)i(&eywBkhp7iD9~k11_c`1}df@Ut2e^k5 z62vL*b6A5kI=A-Ei8;9XmgAbz<&vm4T|-TuS;&G8V%_6(d8EDs6dfqOYhVZtOi&H!&l`E8DK zBYh|0a-0D@-yhi8(KnJ_jx(SiNjf>s0KbxW0sV5ED`>id!{4WAInIDj8!AUR&H(R8 zT#hps4{&w;e1STfAoZFkr`8j3Rzei|;K62bE6rRPHK$8Ckifo9w82K zzAWmO+mFln{IMGkmm6>y&&jl2ElF(*HSy|ARQhDf9ha=w-f5X?%s*k~bGz<}07Glm6YsIGxom1ebb# z&JN;~`g);XDB8(X5zpsl86KBsD15fVd0gfFUszx8;q3=M$H)9#GY`@d$EP2)57-xi z#Cq=ks~pb#|2ct(SL&UY7s*Za04sKC(S*CdNI< zTPwV+;4&UQpXtWmS?HyIiQv+wui$cg;P(N7ztkTg^m2dTSiz;fL2y~`yd435$$2~C za=Cwdji}!vsGOm_Ef9RX!s`W>K9>=PeE%kVxctFi>bacVeD|mIbvch`uFpJCJ~H3y z6rKhHlU$zy;t;Q9#;S~3An8H=aBk* zt>DtKX^(91ZVR5-r})m`6Dg};1nz;F`F@5@NJB35hY2p@ zU*GF2d|nj7g?GJj|Jqgf%l)FRg3JA%k;K90NAo}XR0%HkbIu|T>npcw7byG^gcr(_$r~7^$7R&Kyu@MGsGVMK;aqU5I>ADTy9qhy{z9o zg#N!mPZ-C6pUp%s0uUc0@CRNB6DBnae=O(y2Hp>4{UFlG^N`@f=f!xxp7rIVZ{zrL z`)KR%qiDLo;iG7}gTt$6x}(F#(KPoLj;EG*q0mFQ@iZS7fF3wccX#wW&Hb14Jl)ID z^E8(?>v@{Xn>kN&c{Ar}E^p>M&E?IUr@6eD^E8(?bDkb0;)nWuj;6W1K@a>>;#}U$ z*Ao9NlY@pKm)%9E#iI-I9_Ih?0U9nRDJ9nRA{4sreRG>=2f zd78%|j=!AZ=W&SnNa8#WG3Vo`Q6e5FpLWux;VX#Garh$Qa~-~zIJZY$UylD$N8g?F zS2~=J-xoN%fb@$TUP^qi!@2yqyg8mur04Qx&iCOgb9}hJb9u9#pI_keWr|gmFLHnE z4f26<-dyOpeYyNH@^LwjD=z2loy*rLJ|8HY!o>c*h0#nU9jp%|@CQB%r?QVvfv+b0 zrZgXxljmEu5?q$&j)F_Q+>es_E{c9%!KJ>x;L?An;8K6I;8I^LxYXARF7+n}F7@)f ziqy;VDpJqmo?D)a6#v@=m;Uz&F8v=9T}F z#vnmCNd2D#m*YTt!KIJ9e?$6oQ}hQ2F7<;1m;U8~OZ`!T%k!2sf=i#{1(!bZdXv=4 z>rGOBk?@iFD+HH%-afnSZKmc=$ecw|@D)7grz9{S~f$3&CYP ze-d2A(_V0?-$QVz?#3}bn z;h9-Tz~2(<1?PMq!H?W8-9d1zGvOJ3fm-V%e;8H(OaJgQ?6@H|``8pA-*Vbmt zADE)(`FbVHK2qd+gQ9;-;V%-0pZ$c-w~Brn(avT0cM$D-ity>D=%*;0 z`#WSmK=|CC=$DCn`w9KaivE3}KUCMcJ|h%8v~5VB&j|gQiXO&NNT8n}^mi-z4;B86 z@aZdjwxJX2?s}CdoWGk1@l*<*F^c|Tg)brwKGTKIV~YMoq31#J5$lm7y2PWf48DvCG_Kk{zFCojnFp;eT!yT4A^cL z8qV91&LPI~*~*N)yg#u$>7m?!vwl~H^Z9}zhx2j%{tn-j@;k`ke4IbR;nk!+*5Q2I zKGETPe13w%7m?4I4(H?T3mwkK)mJgCmsGW zRD?+{JDiVy-gP)1=X~yPKA!o};e6b(@n&H@TG+p5Ek7>Gt z!}+{$M~9Cy>jtS)_+#T7MDAS>~P+1?(XoR(&gZU+ zU5|0D4_pb(^@OJ2oOeW?m>zPgg|@@E<#;^5*;AFm>$OA$L7O0#Gi3^1e|f0=3L{zx_8Fm1(z>$8{+U9^fMp0j>I@@fqrKknt`uO z97cPbP2GlBP~&wP4?*Q0TW`mVxokNe1z(9bx$0nRvl0?s%r24@`jyumo6@`3yKj05-U8HZmK z8dR&6#vy*MT;mY$#nCwQb3N8Cj03;##yE_FJmWACd}ZR$A9=+%FmD-$8(d!FFxt7f z#p@!*pMtx{hl#MuIB>s@arg-GjKde;sW@w{V;F2Oa*5go^r1D%~kRIz&NDxp|?4n9U6yoz!`^u z&NU8~IkykqH?Ia~97a0VIK)1ZapuEQkY_&30%tz(IjTBwi0?gU9PUGYG7giSYaD*( z+}vUurh_vM&q6=1i>M3IID7+n#-Z@w?ERRE1M2}&`LH^S4~)a=JU%cEseD)+#)s;} zVRaZESf7^4hdLO4c;DO{oa1DXa~&tQajxU!j^G?8`Fz50GU`Eeoa_UCI8OEh=Q!Cc z8$0bVe;9|=d3<0TQu#2&0+tnpFzUPYhP{;RsH6I#- zGarh;nGbw^s7@SWpI_s!0Qtr^eBfN;5cNSChi_fJ5Du(A)b{w8UB;maIG>~1fin&r zz*BKxJzgpwR)_I{aaf(l2gV_l539rYP@Ooe4&%e|)!6r39p)E|!|FUfFb=8lp%L!C ze4cCr&iiJ(M_=!o@qIMAjq&+mAJC!5N2GAGUFTaVUd4_qRj#@9i)> zW3lfa^}xmt&&KnpD~ok_wfm?k$qwVR>*cvC*lk&mUeWHc;Iw-QINN&_IPJ2%{Qg&} zy;0As?Pa@Y_lbmEwwHESb$g>-*8TjRU@`n;|1!@R=be#1%>TQ=cSfH40i4%G)bHzc z@n@H}4?aJ<2F~l^UFhd^@g+E~i?uNhu)j6{XP&h6_?SAzZJ$Kk?gnSvSg*pkHNo=+ z;}+kmuzX|O;`>+{H@S z?F?|n?J97_E$U%3Za2BSeK2lg!I^Ippr3Jj2b^*H44iTM2D~P2`8faYjN9veomw}r zF1j!Jg?V@_IP>shaOPpW&tI?K`aaHR9&YU1)G-gY0%sn!bZ+{YhlheQo+p7b4^IbQ znLMnCXZ~K(e^or+O62EwjJ}mgryR=PuwJCp$UU{M^sE=I0^c%+I5spZR$S zIP-HPIP>!s@RiBWnt0~oi~ePPo(InS9OPW{^GfHMpVxsiKW~P9 z=I0aO%+FWAnV)ZguZsMviD#a-KlXVtb-m9)9x^{UU*Pz8F#4DIc?vl5v#)c_&v-AE z=4XtD1-Gy+dKL6DKOY2Vem)J({QNWcs>siHp0Vc;#*@EK#CXR0zD%C+oB%%=&-mW0 z#xs8BSL68y*Q4=#2KpJ#e}FTdYnp@EVIPdA{g#{^_K}Jw-(OT*kX~^eqh@}cU)P*p zGj97N;&wMU^KEsWUo&p0e5;vXuXrD+iQ9_fTXohYsuQ=G`Cy)J)tL|0#52!B-hWqS zy`nntOg$gg%&&jiI9U_VJZ{yQU$0Dl*31Y0wfR{S&wp(^Yv$Mg+IZH?uUCvG-zS`! z?<~Z=Bk@;U>$=31&h29v_Q9_MUv3@JxveK~UEdd!`;1BcddT{33XmI8m*J-O0x771C-*e8m{ip3` z9fLS9ZfAirZhT+*%EWC>Vto4=oN+rCdB}X@?}ISkVjo=dt-tHhe7gjk`Nnz-=Gz_c zhjIHYIOFzv@S3=-IA31Xaf|ok>G(D;k#Bt81@n#Xe`CJ&_Wsp;JK4E?EH}P^Gv9c> zX1?)vZJ2M@yB=#7^KCTv%H&&3+|c@xD-< zxYf*0e_GuB+n+;L#r(87`BoFRpO$Ym^Q@Y<@%e3K=Jl(?b-F6%r!{d~v7V|r^ZJ^& zt-84Vx6iXy#r%}NTbi0LjKaDu_p{=?nzmlb{e>+tFXnphF5q16?c`k7d-rp0A6)PK zvA-vB4D9m0a27b{_2+|gUeEng#_h+>PiJK9u|wmwI_#e^ZmE1r)s6fU{la|vPy61` zt=R8lzC8fWe0vm}`NsXz>cnjt;=}9oFW`*Z>ag!zow&_NjBoFQGj9KB`=_ho`K=~y zKkYfBI&m9}yyA6wFF5mUJzT%MpSA?&{j{xfy`S#v+&*|e-4mSqr~5m%`xN(24+7`- z7Qa_w@*Lkzh5X8lZ#8jSab91Yd@Ds>G2e!QGv7W2XTGh4eq_GYcdq%iv2*)izHJ50 zd}BT{-?nvm%PZ#FUf|5PF5oMZZ#8kN$+v%Jz74>2$LsW0;Ji-12j_LV3G$!UX%pvq zoi=xFAG}U~4$kY8^Eh6oySuzzr-y>`Iz1XZb)D{))y>w={Ia7s|0v9x#-g6KW`3Gq zr<|WMZu=zSHXfY$HUpgbwmQsD8Mjov)yz*f~EZ z+O4QKPQKN|?Wg5iX(HcN=lN-M@~tLrKP}&$_UBuher!~y@_ofM^N61o z&sm7)#)#*P#C5$oKey~zjrr`LMBMHG=e+EHbsd27S;lQ2%ul%vFdm%G$uqzix7A@j z%eWOI4vZUrUxRTQihW7O?PGARJFS&n`*zsJyI7y8?_AfNY^<=u#$m2IZ3WJCrP)g5M3hdx3M^sS9{&-KjcpS)PUxR+ejqj^u+&+ao ze0$Bg_2Y7J179v~;LF7gd}ZRc7~?ie_r!{f=Y1io|*?4M) zjjPPJ4Uj*~w==+*Z&!gc--ajh?I!2e{mi$q;LNuP(9e9kADsF21UU0;Ciu$aTTR?n z%(ug8=BI`0i20VvRS zRx>~SX>qHWpZ>JC)y%VgTHMC^^NEemjk23S{LbkM3Emd-6y8S;1Lu9@*WkR5JOj@A z$n(ziKJuz_y^p*L&Ux7)=;yrbBXG{kmV)y+xvt;8?EaXVmsRIJ!Z>e&IJbaZ#`6I1 z)h(VoR%5<43h`mwR_E_;GH(0$^=o;{dB=Eg#%%^T^KEsQuQ6`Lhy&xs-{WT7euw=d z#%)Ure0JCe$Gu&^Iqr3GuH)W*&UM^71f1jEQP9tE?-+27duM@j+&dpUHSSd>Zi5jY z#_e8k#*M!}#kg^wlyPh8ernuycCK;T6P$6|AMIt_4gzP~jt6JlP6c0?xW)GxOdaF4 zH||G_+v+f1t4_Y9es^qjp66C4Zi5o{)Bl$G9DW~%*Xc>PUU;3J4!$zi=?oj>v%}PF znq92%{QTzv&G}~F;}dcI6F9Hy?cgWJLw=8y<6$?K*YWU3=k~D->$k^&b38o7xs5*@ z4;eSc`BKO;&O^XgCeDjJp5_n7!_5+LyBM5tyBVBuD|fDOyW6=ngK_%}IOFyR^fPXc zgEMX~f-`P&!B-}3ji85d+YOxgb{jb3#&$7o(_CKT_Ox@2+Y8`~+iS4PxV;6=xP1!F zxbgk)D-*ZK2hF!9VV80HUwuCe-`7!{`^aF#hxv9dIODcDya!;nYRqSA)=TsCEABrs zZu?;TAB+3fcyQ+13~=UK6XYSsw+`SO-}ZK{<69T!I=*!W=lIqW`Z>NG2hQ>B9B__r z)p=ho<5r9~Fm5w2|6<(U2WQ+4wt+A^?1OPT1)Oo~>s;g3-?_%^5^%=tD(Gk2t^sG< zZU<-F?g3BT7pfDtDToi__BuG@wg>DoZk(qxZoOSz<94!hjoX>vjN5sz%eY+x&bVC< z&bW;RUzxZSo8#GG>KM1vz!|qcgEMZ6z!|qsoNL^^bZ#HZFmC(+&bY0Geq`L%1!vs0 z24~z_fv-&5+Pj|`w_kuWZoda-++G7`+}?4nar>Kd`(WJu4$ioJ<=p&a+`a>6+}1~Y z7`IKqS0-*X&mk-B2UTZ$s&aOUA?@RiBKntAI_%fp&^>rabY&A9i|;#P`rjL#=S!8yMD zuYNCJoot-7!-l`3FmK(pK=bFfv3QPp7MyWQ)giY*JiD%4d4Jgxoa6BR;2eije(nr^ z=;vT?`Z*!N7l6~xufXZ&58&1DGZoJR(O&wQstaPBIsN>xb>@uc5!LATm(gDOnY!QY zh<4FW_Aldk2;@`oq@O>w-^VBXp9@YuKLV$pUw~J~&;PW3Zw>!>y^KrnbKt3IDqyAN$57}3u3x~~j-i4o=gU{t^Z-pM#(ai&&06koPm;yc@^3%YXhf(*a z{=Wu!w(H#lZ|~gvx4CD;tta?3@aIhEDF(j?oY&El3I3M^ujSXB`7;FiH^KF|4|p?h z+AW5jt0CVD@`r$*3Qj#SPceUnLjD%W9|V36IQ7hMZhD46{!Pdq0RA30_0%y1*ilUUjTj&IQ7hcp23iR6Y?j4 zzXwh|b$ngU{(L3mH^+M23E*7+q@H5vDT913=s5%YRB-Bvx-#?U63E{I`99$HfKyNG zgP5MnA^#@i&jEiAoO@w+w=vKT(@#C)otvKPApaQTJAm80)ehCO(7EXu4*72(zYBO>zmcn+7S2u2Rgmup z`R?Fdz}c=+=(!&97ean7@FC#Ta~C-C;r;~w9XR#;6?`)6ew5(<1gD;dvo!=eEIxc* zo#Wi%$>;44Af79 zJEr9y6?&$5UOgqeo#){U;ib-J3GeC8E6)orcRpMAeCKn7zf&&<{^x?9CuJw~U2bFl zv~(@Wc#NMvR=z3paNH*6x?<#s*(K*XC+~M3yM9Yca;|goe#doA@_*Gj=Q#Mo`}-f9 zTf2B)i}fh;pU)5MFY@`W$KPA>Sz4P8Gq{kPmBMiiTJbtXS;Su z@IArV-cy}ho^X7)ADnshFgVwNSGAwrVV8c!{YCw6jC`j2t>A3eUEry9@j7MvdA&3K z{~8TRiCaOO$sdVB}+)bq7-jq@&u+g;hcI__(~bgtuPe9uV7!)qbW zxbgjRjN4+^W&g(axy(=A7r5R_`Gw|4c4)g!@#j8`=M~OX|47I)&SMgMJUHY0YC?Z} z-&y_qy#e>1?VSbAJb&N0_RCuSoMnHeo=u!T8U%UzKO>?4WpMi0%^&QnU7SY`0H^#QaE?D$gHwJaIM=mq z0jD00&umunt_9%q=TmU%`3C#~=!x|e^OJfSAb+Tb z`?-`)?dNU_J(TD7L#aQ$4`u%B1wZ+|8tUl*{nT?jIQPZ4Uraq0L7sZ}oKN{16Y~6C zC&!ubkf)xh;Itd-7TPZ_L!Q^s8_xAQiu!rIjy`mGNajte7 zI=2sAzww^r!k@EyLCp7?xxBTPc6R`0d^&=2|85^}#+ly>pq}`Cy2hE`L#KSKOPM_P zZ3iXnUJXt?Bf(i0aSJ&8=kpl##QK@}(+k(j)P$aAz^UgYaPHT?4o-jg97sK}&S(B` z-)C_`55Et^ysGcdb(&Wj<2jIdwG}w?xh0+tnO8f3)BoMUSs$`5IOA{_IQ9Gjycqp* z0yy>b1*e_?;H)zl1Wr9ygHumDZ(F}`f0^|R)RU@bm<;`_GnoobJtBe@4#udwgn(N)NVcJYS(`2$_}-=g>(C$-R;2{|6RcupLqY0 z{h9Ld{w3qAGvW6-spllw0N`Vjh=st=h9J(T|&IQ4%FPWf-ZDPJp#p&j;T$~OR~{3hV6TiXhpdbS5={O#G# z4vl{&=NkX0W6``l6#5zeW5Maajp24!ds#PiCOG{+7o78pR6UHzV{zCEdg@@l zOg$TdQ_q&*tY>HrPCaD>@AL7E`!DY$c)Xv}@{00Yr#e3KKc4HjemEBGI;W7BE869A z5#=9nd5aInu`O_4pg$ck{!`Dn3HezGzA&LD>h8=feorK|?o?)uXNP_8`z-e-cstJ% zjdOSB_RrWZUXOepW}eT_av<{a*@XTN6Z*e|{C?SgNB?r&iO)F)A>X=WYb;^c+HQxo z>m10lT^B=sH`pBmc|Om)0zNSN@38wO^e|7pg*@%9>FYw~r;Vl2-Xg3Q@p;VlDDAL* zxe<0xgC5!)3VGU%btc|MoE4gLKf{~hG1f12;RYW!nAR`cpxmp9J&P8-xy zod&yIQBOs?e}_Ed&|uw6adxQPZNd5cbEI?g-)b+TU(SU*?aqcg?S7V!kNPF^htIcr zc%6^g?FqZbp#Fz;f8ma4oG);$?HvWqdEDL5b0X~i5%RR#r$OdmcBtK9&eiS&aL)Vw z2tE_}{A@!1hmfZ~UqZe!{BO8^?x*>~`R@+k8^G?a&b3`fL!Nd^AYTf*mq4EL)4RYY z!R~#~!~A&`^0fOZ}$3DbCgI72tgSEKlfpBEjb+_|gR5ZlkLGJlMJVc{1ef zUhJ1=tt%4p#a`f|{a)%^^YH#2{Nk8!T;oeFvSIUAhos9%6D!FBp=LjUHzv7zm1?%e#@6LISdc|M094S9|O z7bN%{(DO6+c~3%qCghik1LXU|&%Z;S^Nx*tR;UeeSUu!hZ<&AS*(+s>V^019_ZSR4Qr$0wRenKn&4k0_^w-4t-mig{TvNWf959mmQ5=4 zbN~8I>%i==ez`gOzi97+xW5~Z`CDE0KjdQ{XsZO@SNK+0Ozr5E;Fk)Ib@`hU{0ZT) z&ih(|{~$cp85?=rqFurF5+3WhMpxle0_SH7kA2pQg~z_>P~msEo|}Y!>iiDjvG4n9 z;j#bvJK?c!`n2%a_kBtD%Wn5=;ju6HzVO%={8D)A=PeT+`*Z7gK|}O!?DK6VJofFH z3y=M|9fZgJ+#bSXAMOC*u@85o@YruVL3r%9ogqB-w=NJK`&Cy8kNu|`gvWl;ZNg)J z=w9KmKlEGSvCr|O@YuKbv+&rrcwKnxi~LRa!=5Mq5FYyk-w40Y$KN_z=l?MJJ@yG2 z3XlD~&4v50TC1h-*hk!6_%-h5?!sfAZ$IJtn`7B=nDE%2=qY?_Z&#`C*#GM%JoYUH z32)#H8zwyV2}TLGXFEH_3b(n39rp>3_5DYL-{$huh5yF+3&LX^|4rdhhp|X_tmA(! zJl64l5FYFG>-;QlN90MY*KZ;`*5#WD-!OX?v}4EoV}*6C%fa8u+8WOT_k)iH{~b8j z`Qv_KX~5^Yef@r7obm^ObN%1lE%^B^?E190!0!Y1<`(#?;H}(Gi<|9@M!VWMH-FxS zd@6Z8FF#c99?pGwSHa7i`{PLkkNWH)|9jXi@$(kKOZ~jH z@G*YgR`?`8kLxk?Kjpl=$j3fk2jNBb53{3F{!#GX;vDClg~xfZ@Hp=(JkGlbkMoGP zxnXwWJmMWZ&U=cUIPWby&P#;HdBi*P$9W%-kMq95v zdg8EuZ-=2fv;T|ns$PLs^0;2=3-9f^8Vc{{ypix8e%@Gkj8{#B$Mskwe7?88h44~8 zZ!J8=leWU+`j6`|;xOCg+KYTAx7$H@d>^$FxWzfnI}4BVV&QS#Rd}3t6CUT?g~xfs z+uCLR#CcDVkMrKb@p z^VY&+ylN{v#*?@nqg_wATziqPYJO_*Y3F`+g1p5)&N~Z_^J3v~-c@*w82#@oKcj%AvJ|Z9IeTBz)KjCpcKzN)F6dvb;gvWWA@HihV zJkEy+kMrTe<9vkhI3FcE&c_Ik^K#*FK2CU?j~5>26NSh5B;j#BS$LdJ0k=FawT{k? zsrg66xY5)3G~q3ruZsKWR&^@J&vtG%LpAr)ECv>bRee95l=W@gzvB9^?rwyBxiLGp zLpk$`_up4@@fGAh2j2wxo8W%Od2W24*X&Y$2=2eU&&KyFO`h}Oi3YO6KKMMq?;ED> z%lBvhDB^P|{3L%J{#=UZfz8~m_2XsW=8GNnXVVjh$=PA(*V+FKD4Z>SA2;6G|4n`W zd&tLgazo+WUA~d<9)8|fc;rD7;Y+-oMZ%wQ-a>e(pSKns<5*kavEC8mK(y-(muoNb z#csEQ@Da{Cfm@v8ytD8)FBTr>U4_SaH{o&KU3i>Fyscg4Pn`D@`8e+_JkCpm$9cp% z^v8K0k&pAf!sEQ3@HihJJkAFSkMlvo{DDY57ORcw%F{9joF#ZZ!ol zPPWU<6z*R&`?mj{`}jjy-$wkGc>Jxqd0+1A8oN5lN1LeEpq8wsD|ys_|}e%?fQj6X%f<9cr)e1@O57XFQ&w-sLB;~Upw zw5!N@dy$WQ>JGx|dAmA+Tb$#(v+y{Nc-ucW`8e+?@^Rixc${|^9_KxT$9cp%?8bR- zk&p8d;c;FnJkI+FkMq95H@$9qOr z#r^bWbt=d6c5XLAHS^*u1{Q}^JuiMV>+}EL{WSLFEIq1oKYbAQJKj&@K4|UwvG>y{ z@bhcvC*RZa*Ypp@eKUTi*!Wf8*=gahe`b2(FgZI6J(B%jap7$F`>F9V|2Osh?;#)8 zS3}`Z=iEqmRrgcV-_zxqhO8WxxEbh2XMZpXf1D_`N{g;-M~3NIvAY( z9|_L;-Eo;-J2XD0pk0j5x!}|v@B1}9jL-d$XM7%VuJMWY5SqJ;&mUdB(2VRMslGX# z9nV2O;}iEU^M~f}#NeDdF~PmRyHh-AS0{fOL!Q@H zOK|FE+!&t|A9xc7SUiv2 zRiHWF8Jyp@qW(FM=lA!&0H^$S;OwuIKX*f({>1aL`A_}-Dt~?nyNu6V#Gm=I5S)I- z_v6*iMuiT~Djr!xJ_!?Rsp^YDD<_OT588|w{)KVzJab$!#%Jlr&~ zPq8gH`z5}oYkJu4HF3@Yk{zo$&L`$(R=D1Izh*w)mB{B<$b%x7CuvO}-mKY&*!pKIcrKcBDaIPZ>pV?K8UXTBW;&U_vO&V0TToca71IQ72< z&U}8yx#siVoLhP^pZ^ZdbqQWC%;(FIpUmf*!P#E>4!#|h=heyQnmFhAysG1T7V?Mr z%=~1&T@88m?-X$6Gsj`(GoQn$KgLzd6XtU~pKCsE>3L-z%;%Qi%;%pY51G%8fis_9 z0B3t&1Fud#?}_*@&If}t4n4tXm;J&xuWsYUK3RX;VRa1Wx&4aLV@tr+f)GU7GiCK5x*^1@MP{ z^7)qXu@A0!wLb3qY*)vQ@%Yo<@X0? z-ga}Y*UOR4EkAj^90$(pjyP0$C-=^TS+Xnh+ zcXx2wwckLoL+y5jezx}raN0cv`f1mGJHrkO6YZYsT)4^~y%L;uuZ4cvEeEIF zyPd1u`=OuhodQm~)1aSrUjV1wInLFt-3zK}?;>#8{X6v2?ox2tT`PO$u|w_Fcdl{X z6r6Uqc5eMhyRE=EzHJZA@oiUd%I^hE`7Yp;KNOtuM}t$|ev`ru^Plo(gEMaDJJ+~f z;#}i46r6Fp0s0xY4h3)WJhx|+c&_LVeh2F6F9km~>+5(@fY7OCjGEd`<9y;J3ln|CM){7AXMApf{DxWM!k=H`I=Th=xnZRevwY)BndHPyJ6@aI?ew`4#lPwnjt$x%j;;#{X)_ zQ-Az!m&Rubem9DF^%QtH?Ec`~^jJuuAJ=Y}on%L$Um)MsxyIpG$lnb4a})AcLw>n- zL7s8@?M9XU*l+EHpU*j0e-=QV`VVVVsfY177JLNsU*}xo^DD^nx|;@h_T&4Ir`<2X zZ-Cuq`28SW?``q>LA2Wq^0eCz^4CNE;Dr2W$TMzVL!SMzUE|7l-UR*oI@f;b1$pX! z81mG=zyB_Y<>8IcUjoi?^(ydDkRJ!maeF#A`(-XT zo8ZF|`X7Qk^*;qp{qeghdR;G0=r3wg*}qpKp6#7$|8{{q`}ZEmvwsI}U8%n|?t^zG z__GNfzZYQbqMnBS;(O!Q!T%P{)&E@~Pya_lp8gMOTIv6A=r4D!`X7Ki^{?M7*JJY3 zU#~@_{%fJXiF4JzJ>;qXddO4%uvV4&uYvw@=c@k!$W#CN+f?oU%dIQ*Ge6%0XMV2R zrc$1~$hrD+1mxN87bWsD+W&nL{L};=!B>1TbKFGPo`A*2wpGU#z&sz!pSwjCt zJ5;ud{n#H>jS2o-g0Hu8rG8thiR;eYDXa^9m?c-N`w#Z`TfP~O{iNFx{Bhy2U-EK- ze<3{fb=L8I3A@3!6(0K{`y}{D!egEE!UVrnc&xiUl;E!jk9Fq{6MS6{bhInhO`0b7 zzQSYOvsZ#&Bz&6BpGPM6!@^_z`q>2kNO-Id*7kghb_H)KJl2c%PVke2$9mj_34W{a zSf70;!Cw&``@SD0_-1~+M7!d8DH7f=zpQGt5#H7LPQv}RRcjC7r7mAAyv+F_!pof> zEqto;6NJxk-beUn&d(8E-`BG)65iVRmBQnDgTsZ#_XBSh9(7>13y<%G-Ya~O+x@NZ z*l&JPc?i$miO-{;d2`1V2toL8swl{c=38U7$^Dpk9`^-zt1#ZYi|5G= zUA|8C$vP14{(?N~Kw3k8)9fF`eb#Tw1^Kt3e?Q2x4us!dru;7<&pMEsoSUDlm$)s# z?@sXhom&`L2l5d3Jox_@^l;y5I`}D&e-@nkYcGRS{!MVoF94_fhv1a|9Gvpsf>XXh z?fefG&-Ut@#z50aj!Et<-3AYzB@SOdxBHG1f24Hz$xDkobs%1q&({zDbM;w%8y9szZ0DO zIMKQGr56*aQ z3eI@O?|a*yDZc~c*{)rkYrFPzuJJqoob5Uc`q{3N!8y*H0Zu5@aLUJeoBf&f zrMD;K?*V7rqF&MdO#Od^JpFkNobqpjGtPf?u5td*xyJcRaK`z2=x3bkXU`sX*q>>4 zW9Mpj3+HOL1vu@tg?`%Y49@sO{h|58`1FE2{VZ{=exBxB{X7Spen$PF*`=S?BWw@YWE43H_rIX1ZRBS0;l|6!72YGIOF-9bB(9%t=OUQTo0V> z+Ss|as|7giZs%O>?gageXD4vlErx#fV^46#rv#kw830cCLEw}h0nYi_m;@h};IqIP zpO>6#eC9gWewh!>_+;s`V>2Fls#BNP zAoDHct5cV_0pwYiXgL{rVx7SJ`LT70+@ED#BHLS?xJVUlnzU)W0g~5~+Vx z)Fo2?%G4z?uU4imk$J_sMEY5sxJVuTEVeJn); z)^TlIrQPb(B~pG>)Fo2?s;EokxLTdMM2_36OJu*WE|GC&T_QQ_64_qXB~m}@5~+uE ziR7$Hq<+>VQa|ewsfTrme%5YV*}shcrr`8v zj|4w4!G|PxxpVbr7UbDqAAqxtaY;hY`luUZ9-ijh>@pAkfqFb%??t{pZ~eu3#ht-< zzc?J6@hkynJTFV|I}-ef1fSzv<5|01qJP2Z&+ZA{-MQ+&9P;e1`x5-+1pfq_b%xD$ ztn{D!m;}Eu!JkX;TE6jV{Y(A3C-}Juet&}hHNm&=Iu^BiM1o(F;LjxZ8tto&+wKW| zZh}7ro~mQ~G)sz@pDy-(v^+5$>x1ig{FQGjJl1#iN$`_|$2!-A34W{aSjTxN!Cw&` z>x>^Jcs=jmXjiQFZJprz3XgrbUI~7Y@Yp99ncxo#kA2o>6Z|9Lu^&*|^D5dEyqWOW z_v)D7#|V#gdDg#Ko&>*9v}#%yW)2gnkM+Z!ehU!SAt(8 z{C9P8e?}(w^TK1j{te+#$FNZNv$^_Op9zn;geAg1bosS*$^Rqb@PqU9g>POv|HBr- z+xh-YE8($kx0CShF29%X*oQkvct4jvT6pZMogn;cmp?;z>>CXb9`BpDM0lz9*AU@n z+d!QiHwd5Q@fjohR?ovbg)emZ`-MO3`hP3DvA1iQ@O&e$R;_1*cXj_?6#js(gTF5P zIp_0*U+VsUD7>A^=h4X5&+Yn+!<$iX?;jbT=J$hoE?}a@`#G;Kyxe(1;ZON+dbRy+41K z2=C|erNXPKhcy3Z`+Tym$oFWGgMPx_@cHuq;iW!rA1J)4dPuVy>u6;nUsXM%$yZem zX}qd>NaI!2LmIED9@2PK^^nG^s)saQRXwEfs_G$)S5*&be2kAvlOzsR)kB(mRrQd@ ztEz`I9{U`uhcq7bkTK5Kr|qT2^Jjhc$2j-1iom)571y=O$8~3%^2N|Y{gMAFUy_iI zJXHBX3HcG=^k)n>{fT~2{ZkV1v%sl;HaPV!1gHEb;FPcB_dWIJzvcahXTtw?k#7T> z>ptei&a;$VuAb^DaPDJX2mRc~yd9i&<9&&0H{O@1b{|dHeFFMv_Z4vV?_1#P-;crR zXT0B4{ruMD)la@ZpYd7G1hd2PhkiBzr`_hx)$X>=?PD4Gu{}8Lc5<$E4*{p$9?sS7 zvCvPur-0LLyf0Dh#&el*+Px}acR2LZZqzpx{+vBC#<&^pOH{it&oj<^c--|HXFj|L zPWidulz$(b?TTkhjptV`Zy#*eGH}LoZNFb>yS4Hd+7M$`YgHwJ0IOBY=bB*&A&Na@%!5QaK(Ek@)UlYJ-can3p`&;N||Na4- zcAtTM+MNqdyYD(zy9=S8c0UED-I#Z3Uaf5)JM4pYV?L^OH*tB5^UuI(cN^$udpm&B z?%vMTZWrihd%J_vZcpf^-Cu&!Za?R0_X6mr-OIsg_iE^;-I3tT|69PB|965@{yuQZ zKLk$s$G|B+9h~ydf>ZuwaLT_4PWc7kl>ZQ%^5228UutL9rXAWZ^_*)SZUoMLiTX)1 z!+zP$<&D#>{g#0pYPTcwGavQ?r`?00pLUM|r`@QlG=KO#seX{>_oOa>-DcT8iuuLm zkmvWFZiGC)Cp9S{KNa$$vj2|zZ>)ctpRBw42ztoBNbql=|JLlk!+(pR9oE0|!0S0T zyNu^%;H)eD894K88*t|54&apE51j2fIKhuh@PXj$_sg7Xz727%c^-9-#+h%ddt`h% zm|S+4ygiddockAO&Qo=UJ+t^nzhCR}7XPv6mv|mC{e1u7y#)vJ`-}Ba*yZ;=`2NFn za39IwZzS||0B4=yxwsFmoB0&-gCNiS*|CskduKtO??3!YLZ0_o#)sE0-*Y%L zi=iDBCfc>!vqR(DFnbqGaK6uQ8|SKLFUZrMr|MPe;d={TcdmLqg*^52v*2cj`N{Va z4t1`2ZihVeELpFhrl5!YTh9~E^z%K0dpbA$=34ac0gz|^o(Xxzc?{(F9>NC`@-rb% z|68wL=|A5$xVLkS!_knZo(mdQ>R}wN1n2t(A91d6coOoA!y?Et4x4RQwcY06eBa;^ z&dn~builWS-Af=(yW=3w_YF=-$j^j4E;| zUn4Wm_&f`F`ZEul{?ut+=|A~)34VBj_i?WN+yZ&_*MkZ9`H*Mb*O%ZNha0x2^q=)_ z&A~Yi?*q>GbO&b~`X%_t1b-;OXF1pSd=7c~Q@3ShyXen$3BIp$)!!fTjQ=$W{&0fN z24@{wgI1M(lJB43S0(r}3BJ}g3H=FvRf5k-@U>be^e6aL3I0riujTvCbuu%{#V5h9 zO7JJZ?_R6&xp&9h{lYxr%dGQb-Qf-IFUtqxu}|=i1mDEtAM&xj-!{Py5gxzGRhr<} z36Fi6@d^Hd@YsJ^nBWb(f5ZRSk7<$MhX{{#qS6GvPI#>6j!*E}!ejmGqXci@`4j%f z`gn^3KScOxb@N0hP4Mf4$NKE}1b;zzteY=P@CKfr;eX7BTO{})!eiYw-q#g+f?p@{ zu}?ET!JiWz^Tbz$`?RRmJHosAb+t%%Tj!q&FLnM;;bqPX3yRr)N4v_Mud{9bAHkiCo!W_>&wT#SUU(yKZwGL@ z-^Kb`)X9YYVxKp5hP=gRw$FQuh4*$I<3Z>d=nd^A^6@;~U3lkaIp`t0PEihe3UBTD zdke4QyhM13^HSk+yuE#dPxSd)U*S!>!}|#z;q%V{!s~3FgMq^9ZIpvS!Uy>}PMPre zp0I<3kMi}hVZw{NUxo{R-q&|V2=C+aql7o|_wtPq{@J=YC>LJ5P7cNiw>4Qi#^)au zd2Y{qc1+AaDtO%2CJCRmW)3C`A5lLCQ-sHTd8+VOAD<>X?hF37P#ACC&3ugeqjyh% zb04ay>#37{av!QS^f%A`7<#;Hzo3WvQ2Rli`%uS0KjnW3dG15q1bObu{9nDV?*;h7 zI*r%Bxv%sgIORVFr~F!|U!r^iaLP9Yr##=YNBQ_3gZ1wKd3q5MAJl#loCnI6g? zo{;YaPWcnTssESYls^ZY@)v?r{&H~2Uky(ATfup~-09qI^Ggx8iO%hQ!Tn;smyi2* zk3&EA@BR!qyA0p#`{m~pV9953A>jR;FIV=B*jHui7)uAIiXjq5SD80VND6x_{j zW`29D#d9{cP8J;I#X9=W2H`^s^tAg3~VFvq!sISRk`Q<7qW8!5N=;Z=TBU zm5@IIobf*focd1!AAsxkba2XF49>V+;auYu^H=S!n_OP=|2F7n+$Mq3?r#%zABTSS z*9>s>*YnU%yKjTDKId=XjL*m5jAy)O&;CsLwX>KI-F=h|OAz!|sR(9gJ?2~N8f6Fb!I#n8|Gx(b|juY-QtwYJ+~ai-k~&ed+zk7;`! zP1t<``f2wiaN3=luxm1QsNMI$+1`IZKkeFYB-vr@Wj@%u5$w=>vpt&N))z6~*%F-j z(;S@g+ksPlXK>2z0Z#dD;Edam&b7aeajtQT@0A*7-1eSIO4l7ef$2hQ# zj{dNYj&@h3j*fO&M@PHWsiUL(%GA+O&&t%%aa^iS9UaF#*3mJ}tfOPxSVu?BIy$zC zb#&CvIy&lM9UVFA=%}A{bkxr}I_hB^9XadhsJ}XObd;}79o^=*Uo>l6Ij)i)l;Gzk z_y};;(T#U*w>SFvDCBuxC_-Hv>*(5}j*fb|K%ROgqb`nhbTd##M?G^PPd%Mc7soof z9?rF0r$U~3rlVetc`_HA`S5*$Z-ja_`oACQ+1QU~B>0U9J{g>KbTgc5d*@Of_xI16 zR^}DkTen#yXM5Ww_>l>IVS=vQ&77;B`#_#?>kiJi^-J)P3I0%m&vLH*d=7c~ zQ@2%RyXen$3BIp$)!!fT?3Y^;{ErD9zn^B$tE>~-%Ik%cAC=%YC-|!g9(6~me}CWD zQ@*O}-{N=t)b2B0SEGC_o8V@L^8FM1ssw)~!PoQm%9#GU*Q%U1vF`4hEGc3>^#St4 zc&sZeOYoN7FP2v(AM@=_34WaLSjQQV;A4fydef8ye_QwyS)1+nJi#~dJPH3}|Ez6- zvu@4W8|#&(-3NJ_PI5$XT~$Jodv_w?@voHRG|)%epo45uUf1 zXrX^&-|PMae?fSx`!7uJ2A;Q}KlZm+4`%)ZKSbnXzoaz5uM-~o0pk<=1>t+tEu>Ga zg$cfyUti&WtP2+j|3j{(RvY2*9=V-_f93Lf2;b26K@Sk##`%%LWB>aE;Rm|>8Ny>f z`vT#=boncV$Nuzi;rrTvlO1D($3Db(;jvyeS$M2tP7`kTLOW&&k9EnHg~$8u-Vz?) z|NNWqf4cvl2#>nWuY|Ab@=Jxs`#aWdoBJDiGJMVayrJ+`u4i-MU-~%KO!yV1Fgvyr zzOl=<7ygCI=l?2S547tm4mV#|m;N^6lYHE-=K>~byu^8Z;lrJKIaGz7GJkGsB=UWI zUgRGY@?9NxIadX*s(#P>sj7a@c)35X`*2>NXP|QrPX+Jcyq)+tzl!=j)8EM3+X3yl??-{SEe$RMS z^?Syvs^2qSRsEjvs_OTQS5?1fysG*=<5kt~8MkL~J0|8I6?tA&{hrCkzWZd6ud05} zm(?n0y@5MM{pJ!!0#`9;4C&sxCQsjD!w}*UO*D4>^oyr$O5A{d>t9(g9 zegHWA83a!KBfu#?2AuMfz$qW~liJ={3HjOJ)V~m%`ac1ue9imimKBcw)%VMN>d$wY z|6hYMAEI7P;+EwF5r|u6rA!WfWM3J40)@0@G9o^Wm-Y}YJswrjR? zZPx;D+Wo+}+O>C$+F>8GYxfR23LkYV_nm9|^Rn9A2%L5|cdmAeoU7e!!P(xOpr8F1 z-{UcVX!oFm-NT`u?L8Kpc27>&9RNwDL)mQ^6@=6`!lb**)Ffw z-RsVEoQe0#>G<{`>~fs>4xDyZ_50;oWcN5b%slPx0M75%><#`Z?vGuZTYFn%%Hlb{ zJLLI&nG+$;@7F|qp!q}j_@12UAC>*vm_IxO{j8gMEWxKI_$=q9pYM5#dOzdyGMQ-C z>(Ik~d=H#;q@RK_-@XQCel7*4{6^Wm(hiFc+q*@AH%ssXz}fGII@dfu%DKgX_q7wi zd0&g~d7Gb%&ws-E<(6fQh<>b2U7XdpM!sE}wZ{%?*Vv4Q9zI|3{c?Y@fMtitZW`5o5e<9DheZIda)&oqQ?fn4y`F=UO zX6;aU{*FB3(-`^8_shjNqk3XI(KvVZd^67X%l*Q+>NyMY^rz3-1@{a6!uQKv=3MpI zyW{Lof5z0S@He2RDaQZWzR_a-lebCm!xQ}U z1Rt5;k0tnm1h4JiYd1d`w@twrpWPF@yL0WADePG%d|;36cNJv{vcvT7x_-9E=!*P|+vtI6daNds^H?5RsJ>hoXyx$!J&ic0@2|hEy zSuaXGU7A(;Lp~(I`5r~e*KJ<4o-PSKB*AAUc-xIYr+$JRWi^5|cVo`#x@BJA5#QJ{A1V2=GtRJ0{;MWU} zb^Hkl{<82`7yCHD*Y|u_!{ZtI!Yvd0P~ovIa7uz-FFe-eCnR{(35P%Ny{ttdAAEh! zw~&whhL#C_sPK57-YE%wz3^DypOD}$3Xk{QElTk9J^#c1U44GrGQoEh9{2aXh5K}% zR#)L&^UJW-;lkTGKSp?|^OJ>_IqxgH-1&LJr#in>_#Ed$g@5LJgz%_CxJ7upU+ym9 z@qW2q3y=56O%Xn?c5e6&!oPDqQ~0LVaoO>T@Yo-nCp`8+KN24Mj$aGE!S%1vDz_7P z(z8x}zP|8S_uoSJK$mYNJl64d5zTg=dIVuiK{EDFD=dZ z^FFVzIldj%F5?rO$NF6G!OkPEgZFdp9~FAKIq=8o3f|heKW0|&I?jvCnd}Jt^L?Jy zBF7bcPEih83!m&fuBXs5%I6{NL_X?~+6$lJ&u1OLEuKevJUf9~+y=OxorTwOUMzgL z&!1yF2tOOU-EJb^+n;N@3m@l!>>)hfC*D(diQh+i3y=D}65$p^A0yZbuPVBrgWy=<89?%prMg-`LsA0d2< z%a0O1$Jh172yg7`jOD^V@%7Mg!e`aZ!Fb{0Jr5@ek8x&_@OReC!DQjx-Onk)r?~u7 z;junGO?ccF>NvO0b21;}{#YNJ`!7Y{tZ!)zPWevYlrILSd{1!7mw;0~^3eRJeB_&P z%11t^eDu4@N580i#9!rS!B6@#8=U?u1gHEb;FPbaPphd(e+s#B-VEKkL&d zAM-+$Kf!LK*m@jHSuH*L~mERDY`lD`5<(nqtxi3tA zc1*~31gHEy;PmGRaP~_t=h`nN&MkcGm(#)7FXuu(`{hb-+P%iP+8qh~w0j#k?cNRj zv>VS07Ju6PeZuY^p`Ui22dCXR3A>BHY4;Q7+TJgrpLTx$r`@%zLD^v+Y%llaX?H7^ zSGz5oYyWN!PP=@69qsb{bVFUN)c*nM(^${8%(?2>v|i?T zc38hqPptPCXFb~vs5fJKyEs=poz^w&xqjwDS8&#|UEvz~2V=hiL@Rm8s=)h)3db#yG$Imw4jQ?KXjOWP-exY-1*PW23{zt*7 z|Lp|-JfVN{Mi%`Quiw}Y(d)4b@U`pjdHGj-UE5+ z`IYa7sQh%)k1^log0tVhPw)*0LH!u>XVXOe*s!9?{$*Z0l;CeBcx~TTG=He42%Pn1JA?DS z&>fuhW+#L5zH>P^`(-pZ`{nlu{<3q8^P0`7j!&Be?+VU(vs8WB%!K^^YJFOlmX+~j ze6CLLs1LEcqI}&}RqNRnJXQZ@zjbo3&o{bz{MX3T8ISt6(-NHZVZL2WS15$;bNpDIy=7^gOg`4T7m0ju){mKdtgEtqjQmi~ z+vt~A*FGh|M+%R1Ox9DG{@^c)e5_wDO7QhP|HGep*)yLVEfaiK;qg4Mw{V|s)aoj{ zYp%Z5;lkTGKSp?|^OJ>_IqxgH-1&LJr#in>_#Ed$g@5LJgz%_yxJ7tH{hRQL`ZwVf z^>4x}>feM{)V~R@sDBe)QU4}9_E|p?9{YS>3y=N0HMYqE5_wWP%Q-vN7asd_TL^FJ z@~wo&e%nsMWB+3>;jzzgknmW4%)QFzxprL~wpLE+_#e#wH8cK6Q4W0BrZ6uyKFfKm z|AqW`=aJXJ%bfdkszT2apBMSGpn|{Q+#iQ4czl1x)m8BLzKst*6})}3T7{!^{!zgj zI*;oq{OsY+@$E!@zRxS#3m@;#Hyyw&ofbD$gMEHGP~^Yy^_@Y&WBsU1_-tR#8Z5lj6MUHP_@3Ty;e&nMXN2%R-jAb% z_we<;F~Z0A`ewQCzV&i2PI%|Fb1+``V$Z{g!UxvL!6e~T)xTMsXZt$l6p@ep?5VnZ2d^P_8Vb#80YwJ&rWt2 zUoPLkDZddo<+lK*d^2#$$NSmTpPdr&yMt5zzTng!?`>24M#fF8vAF=lbZUs{CVJi_5E!BOZ9K|&ij~O z)YQM_d0Uj-3+&MG;Xk4NjrW}r_tVB7j(e-3{>^IXBTxDlqLZ(WrRv{K%bq`DzM86k z>*Du88&_HXb{OuDyJc+*yXD}le|rdg7s$ta-Qr`vjT?GcpT_#PW+s>&=Fhs>|3bd4 zbNk>vemBUoy|I2^f9CtyZb-;S9kTs-ES}q2Xa8-7an`x*?cDsN-S}Rq>UjftSkLy4 zgr2&{EBf;e_;T?CXZ_e#zV2dv+R{wKa~tR8=W_9cJli!8@~j`TS}8j;4);Kw{!cY0 zvcv4M9`7aRs^>k(FQ*6fb*#sG$@vO;AWuCXSdwLj`NO)YWzJR4rl^0To)`Q=Gd--E z`T(5QMFYIIjdfG4!FkgY0lNpOCe7`4`^tu&D+cTITD<8cUL(#{mh>mAkX}X z@7Jn7??aw;zXWI9T{G0JEjJFJZjE-kL7sWr5Av+Li*-=-b2Q``w+&I}M*mxZ)1QMA z{3PdU_iD&f|Lx$^|8#=CmCzsGU$^{ZU0EYv_f>ydIX8L6p<|;AWQTF9Igjz=qy)bv z!S71&r@&cP7VGrt=X;Q+pCzbgTdsc0x#}4LdFnYFb!+UGQ^DCU*CzN~&ed-GK8(h5 z3G^_|%~0n?-Wi6MUv~_49Mc)1SKd z{Z{(3U4kE;;1?wL_0H8F{?07xulPH&9Dh>3GkZ1a*4VE2T_DQ`w(ED0Cx1P`|C!+H zqppm8wnH5n>$Ua+=l!Szob_7$!Fj(M>U@QGLZ0Br*EOojn~DRMOh%T zL$9yxiVAoIenf(w1J3@6ePivfJ0Q>gdephbVFBc+|7&pS+0yqj)$UHtRsS)NXFV0` z<;dqIUR+b#)yyzp2DKQF;=7ar@Ok0kg!;d9o^^X97r z-`evn{Es@fT@w6w;Zb*YUV`5)Jl0hoN$`2Xqi*f11mD{8Km3pSv|SRsi|}|pIZU`u zA8Pd!-Zc+rtrLZ}b$+_=Qs@1JmpLCKJn9~<5*~F1*9)KHdVVGRGw0)kM;*d_!lORz zVc}7q_Iu$`pEg5y)Tg~5JnGZt3Xl4?awzp-Ko$s$wA}XOa&k2yovBq=Wf12zO!?`d@FccpC_~y zJ@uT&^%Q~ZKRe4;D3ALV6>1{7lzZ&4m01kRO%#S>O9(6Em0{)-JwZVygsinc!`m+sCbl!_MII!1sV2)+g)-eg@M;PkT`oPLf6r~D*v z%0C6pyp8vyY2Ln*kY5N+{a=AIZcChN+}8AQ+WySAH2`PaHgT?T<9p1QpYgp4&0D_5 zjPmh)DU;`WT@Hj@ws#;n<5>ny`C;JfuMyyszZ0DCoakKR`Ji)+=VRcE=XB_29zF|B zKVJr?pKpRwegQb;KLn@z=irq87M$|6t)sHTJ}AEqIOR74r+n<2+n*WdHZHGmZs%O% zygNAKysvZnV4RNxr`=cCL2Ip`Ui|0jJ#upr3Yk&%;@mpRS+X<03!%gQx1#PS0{9p3hgNK5g&J zx3F8C`m{YE&-%1Iz(2tKn)PWrSfXWz<>$KD|H5w6IU8@3$pqgY^5jQ3w-44QoCkTv zCw?!&{>*x|Clm5>o!iIQEY9IiGru0q&rPyF1~12T$~a5}XI(=Ij^Lni37r4cT z^>sgUu6B2YJnjD7*Z)ip>+9;_{cpUk+kvxQ?f|?Oj{SH%UF_@&aK>3L zcZ73m7q732zvXZ0%!golHkWVxAxM{OCV1_ z$3dQTcT*DbGa=9TZ{+LW8qYH4<`3({MnRtb+yi;){{r%iL%h$;?2;eQCf`DF>dA?n$vr#0%?cwMkAj{cV<^jwzUqZ9h4L!SCyhCKV_ zJIK@j-I`dIqdRLJ#dem5_fa!51X-d;@v*%jUj6sd>A< zbGt6=-OllR)f4h;S6M=S960Mmr$7(=nMwKV887UPEV5q7`-T2IUR1z^>ze$p3BGRA zs^!~&vmfL4tSmlk?*T5aychJa9|tDnhbH(f2|bS`md8iiwWV{* z2exY`$g>}NL7wsK15Q0d6a3x;|5Jj`bG}CAC;h42Ja3ozPk%OaZt@%-c85Iuydc4& z{z~KXWkP=47P&v_=eEvG5A*qm1iv`J?@sXN61+~!N`IK=dpfU^{h4)`mnZnl1dlo# z)zhU_Zddt`1fQAUb+@TnPnQHAlHfBFyl(4+{sbSA;4>3^oii!;o%PZrtZ+Ak1UoAZLSME;m7lp?@0pAyAc7yYMamGJdD|ejliz8=! zl<`=XKgIh!+7SeyH$RuRkThuNNNc!V?nwMd6pYKZ_E4L(l*4KlW3% zOYn}uYv;|awXbl0%&2v+@S|M5hwzThj}v~5^HYUi=lpEp_c@v)c<1Ih=plTex3{P8T5h+u@c2F465+MH151U+ z_x<_^pX%#7eTB#GJNFYl*%N1g@P)pfHBfl`9>XBvJ$&7*O!x?2PaG_~+}BBm2`_Oz zT=<~+IT#_lv-45H>-akI7~yZMlY?^M@6^k|IN|fx&cS%$OZ>hzQFsS`{+T4as(Mb# z+jg#JipW=0&uQ{i)pHt;dd~mH-W$N@HJ<jMD-fUUTm{ZL{W%ru53F-gLO%qY`qRO=UJc@Lz5M>wxL#LCZ=CBj2JyLGw}W&0 z-VM$=9|foW32^G41Lu0Z49@#(-v#G=woAlqz4~U2?fdoT(DOdqHFFJ+AOG+^+wH|| zdr@BneRI}tbvQ3N3wqv{ctL_+n&6`lpZD2b3%(Hh%Z-S`?R6VC`{7;SZ2$YfsrUC8 z#(p~kdTy`h#A82vLEJvRLH!HB*$)?qTVAf0zt7t^^DdV@=KTionRoT<9Ar!G*V#GE zx8pkEG4F=pY@f}+*`C{iQ@;~9_5NH}T(5(rkLxv9-0J6g{Sch(c`EY0iT1w$ocGOM z3eGyO0_S>N2TuJ2a2^MK0Z#pIz^Q)eHUQ(p^C zeLXn!4dB!d2d91{IQ327)ZYTme%LA=`=QMh+YM1?@n^xA_fO(6 z?|ku?cOf|QzK8hC`vo}jek~sJcGY!K%)2%?^Y#+A{>i+3!I^hQ@tAj4#Q!F%&D(7t zIP>!RaGCe`MBchY-ZK%Oc`pEG-b)dmd9MfO`rafS*S7`nnfD%W=6wM1nfFO>?!V81 zv;SA-dUL)%ua})8yqzxuPu>4{Qnp=uym5o{w%sRSd!2#vQCoIR@A1#a`RJgmHs{m9 z`F_Hezz=|a1^E8p-EjQmeUJN!TYt8x2hTegdftz81@v6sDbO>ozemA-&HGM2Mx5@* z`%lDS-i@_CTAj>WBW{1j`$$ht=>5KT({sCwMStLZl6Q&6ypKW8IK1ETTlYz7{wBsr z-EY}L^FUT7?~~j{JjU4@de(C<^c!TseEa?iychTg%}ZHc-dA~}c+7h*^vpZWHfpw5 z9NzExqIit+9`ua!uIA4y4)4$O9nCoRm%iEojr0D@eZ*tlW1(l>^>P0s@6Y6YnB4D% zLeKj%&lit*uYsO<&%}L?+>b5<=lz-Yi(7o#q`rNpLC^i@UFf+V^}_v%%)2G{jW}K% zDQ<`ZNJUqec#bbN6LC?JYeM+`oyw7KTBF=k=!{b9| zzWN+VdK5tDoD^-=7xO>!vO8abo*V z0cZQalHgsoTp5S@9TL1+JhsCH(6hh&6rAyYo8WU3@xO$g@w=53u78^ZKPbV^Nbr&3 zaeXI2zXIF+y#(KStCe+9e@24eo8a#y__kXYj(=8y-<#m?CHU6c6pnvJg5R6q?Mii+HKnS$+T+~;>@Ciq8z`*nL)wZHWTi{pHUzxyC2+D+t=%NzEj{kW$R|kp$UFL;Okl+sn?*7U% z3I0*wzJ0r@|9Jh*cL;ou39{vY1V1lu_Z`P1_=AD(R-BLjOoD$DxclN=)o;Ci=Q{=N z^Zth>_<4c*yy2Jxe?0Ja^5qxJ4BUO_7Xx?S_qD*?-~C(Q?xTDfxcheB1n&Oa8r$Xz z^Y*cQ%$8n(yZ=-gxIeeNZQwWO!xRk&-0%0;Gw@%?H?0nQthW1Mf&W_Zj}82D)qir} z{{DzzfiF<}3j+V6;$If{PZWQ2;Mb}Cae?12{VjnnQ{FoR@6k1%_`bl)#UBa0TKxBc z`~3bN1Fx6#cgKg1%J^Ffj1`;?;pq+ApE&!;G=Y%))081?*+E@EL8^?9`sdew-JFCx=+vIjMRM4sGy&# z`KhMBXKB7{Y~W+X#|7S6k_Ws`&+^uZHwXQ))$^bw@bTU9pf&K$dFzr6*{```E;NP7pG?~k8A&->X{ zw}C*m*az=_+g9A#jrvOHo3lD~m@GOSdfvx!Zh~Kw;3E;A_rHw>Ux@a(0deT(`Z(I^ zXaC`SZfyVGArAF3!Kvr>^YXr_zb5n_fiwQ+;EdlrI|tcf^|L+g++<7S{9aw^_ko`M z%D?|^yDZk%XwSo>x3cJ`9|ul9{ba;v`!|9!?ssLY_X4T^(%1d*9E73BXH_@KO6PDpN)Fn&qlq! zchS;NzaR2ae+W4BM}bp+8aVsm+2XMuULYR(|K;H9|DzF~{jeFFd4Db*^WKB_?Eikh zMC||Vh|j#wfHSY(Ul;SvOXPh6oa_58;xq5(;LQ7#c+6Xz9dm4n?YtH^^KKw+;h1+D zaOT}XJm%d6@!8J%fHUtwh|j!7fU_U^^RiYa`{Bt6{h8p@j{xU-{a8G%*EQm?J;#G{ zy;=~T>t$mMTdaQOohlylK92a`WdHW@##7+T`@DGEj(-Jb-nYbK-uDroc|QSXUVlGZ z%)3T*PO&Af@4DhK?}p;Bowo#M-hPPBcCG^F`kJR>OU!!+;&Xk6fHQ9`;xq5L;LPja z+Z*#7A1GB_H3W?$f(d=U=Ob_vzh-^YRhdx_I7Y;Ji<7b?boHVjqV=Uk-jKcqKUR(>qt( z>ai&a&wB~krQTVkkK8$2(s<=Dh}b<~bK`!xBkqgi{^HLo$9k@Xo_TKuzcK5R-cO!EUhb#!pl9Asq38axHtwS% zuNJp<;C&856Z*5EXM0|%dE(ffe19P8oC!VoU&Uj)t)lt<7{3oV;~bRWCyB@SS3%G1 z(hAP_zf16!6Y;-vGrp7ZRF2HzPEU+-~Auc^M1bz5r_LP@4Gt~=PBNIN6!21 z$alj1Y~*zbeshBJJ&la>X+pnF?`%c0CH99Mz}cQBB>0cSV|)G#de$=)ocH_9O2qjK z^xR(>H4$(1f9pM*;<27vp=X@lxQ~wa`<3IqJMQoNeq_dZ0D7LM#^Sy^-q+VE9_xG% zdd8nCf6UgG?YR~1LnGf8ocqgQaBko86a2;m|8;`<`vc>8eGEP8@$V_N^8V?^TO=d*OSBS?B%qBOdFS3O(;voC(hJ_*>wte&ZqSW{l(C;-_~qVlv}Jld0%C%c+7hq^%&n?z17M%ypQh5 z1phk0_ujg2oGTOj$prs8!S~*#aQv$h{P_f5t8d{rM<)2K3I3M^-(cIq@%=s)+g@yE zzyHMeL~NIx@?mn=n4*$9Q1izm)!{z(3J(?4-cmuR1$$_oXfl-2JDk19zY4r-8elbVuL^ zb&qzs@Zb;zcw#b8_fiKtivNrJ6(mbdO ze5%@^KJeFdoii-(MqNiW1U^Rx%ErKZhz}2ZlIB@P1n%D_F*5Kan)ewM_+as-z)RN7 zgRz0n)qL5wz~_|Y!T7+(i#G?pV)Z;|34BzyJZKGk&JXgSE$|}oNr4Y3aNnKnN9JwV zG9~}fv0v2cxG^>G8O3?f9=Q9#(*pN-{ON)FeRm3%yH2?z%jxrYYNi~gZ`f0D?C+@W z15SMzIQ8Y=)K`F0Ujez+8R-X~V9af<1A zU)hG@S%`1lSLXK_nx6NS9Sr?U)bH;Jwm9U+C-ilwhxe783BC~V&qo~ki6g;zA6FAN z+y72*)_HG&KbYW;f%AT|C&8KbMR4|$SHP)%6P)_Lfm8oq;M9KsPW?CF)c?RXc(&Mf zq<(F1>U)7xzZp37+kjKQBRKWDfm6Q^IQ0jCQ-1_F^~Zrze=<1rXM$6IJ~;K4fK&ft zaO$rGr~XE8>Td(5{w{Fp?*pg4BDdA^--DpjoUpB&i#2i zqpP;&$=p3uE51 zpl9BT!0G!x49>hSCiw1IAMkn@{{V2_58(G-SvbbGxj~OZ{)~8BuP>oz-mY1n_c*+N z;2?0uuTSu6#ADue=$Us0IOpNN0B7Ew8ehkD*i}5{t%sg@8^Jkme;+vW&Pwq2#ADu` zx^A#KnYR?2{&fvF^PZmI*NVrye}taLx7Brh6YE(YocA*v2hMtiC-|-6v7YClXFL2E zocBfa>b|lcGH*qKA1fa7HbKw4*$y+n>BD{o&b;fcnb_{)F>gKe%-aag`wH#@ zXWm%}{+@Wu+Y|TaFmEY1{k!A9nRj@C-zpyS`g4bI`}+Kcar*n+HD6+!dACXMao}99 z7I6ChFMu=thY7xBkNozH>vffQT(6&i^Zu^qz?pY(g0Hqt;k>(x$GiuC^FFa_!I^hb zfe{N%>j7~AKA<{`du*S{IK z4*NwP2Hr<;zX-fsyo=_uZM`ghmH66$4-(%v@LF-dKh5Jbi0>TqBgOX#e4O~9fwzhu z7x)zM(*pN-pYsFv?kqey=T$6ad~Cn3)Em$f%jAc3=I5z#jg&$XGtE^1YVXlyfftJp3*7H7ZwP#`#zT#Pmx>P$e7M?qMBuY^ zojEe_TAimy1-?|*Elq*@b=26v{e8RR0-vIB%=o~U_sE0hz?)T1OW^*zL~G#FH6PIy zxW8wAQsC9ac`!L}e~x!b;ICUp%9g45kBg&O&Zvdx$I5_nq!KrTor+yqb_08ba zw}MkY37q;V;MBK+Q$HP?`e(sAlN^3r=6`X>jJ92hM)-8aVaufK&e=IQ5@`Q~ytJ>bvMTXYEP-8sOBg2TuLQ;M8vk zPJKUc>URdG-oIzn>ZE@Eg#J))>W>Cz{1d>bKMkDvbHJ&;5S;qU!Koh&PW=tw)ZYwF z{m;Rvp9oI2gAc{LQ^A>ceu9549@n=_*Eg}9`-9UL8wSq2;}ZNq z@tAip^gO=(cY<#Ye~Rt1JvjZcMsU{IoZyd%$2vcNo_Rk5r(aeH-->x_6Z}f}S?mwD zCHRww!+Kr?XWmudTaj;<;72F;nc}g1+M#DXGr;L{EeB^keRQIU`|sZ3F)w{F=50hA z`ds&dGw&Y~d`Tj2Pt7;P{iPI~KG#ri<{g>fcZ$dLr7yp3^UTM~R`g1;gj>nVnx#d>^R)A|Gb+(V#eoo6IC{Vc|B>}jKx{J4d_m_PRrkB9z! zK#_l>IB~stYQ8!4=TdO`$j5vl@ji-6f692dIQ=Q(RpRugj1Lm0KV`gDoc@&Y z266gR#z%_NpE5p9oc@&YR&n}M#;1tWpEBjYn$&U#{`AZy#^BdYwN82mNfF=Y|A6NqL6`?$?dAftRQ~>jJOSIIli%zu#+E z;N42{pds)E9cLQ@uhV&Jc;HQH=MjM~(DmfVz-!eGqXO@tc5VuMh}wB<;N!L3#|7@= zx$%KlYMj>`czcgLXbIfE*RwV7Ihv1X3w&U49!v_nr}UEp_vi7a1is8VQnpOZe{}4p z1I60|FXVsiiSwW~b8g;)^NQ+rIZk~a#kbX=z6_lDa&YP^z^ShSr@k7T`a$5-4*{pX z7M%KeaOxYtslO7Oe$W{4?Xu6W(az(JhsE(;B1Fu z5ufcp44irWKA@PF&xvrmyZ@EjZL_(-615}!FXnAUUbfF9aJCPh3uB$Xfu7ItJr7R5 za;~`5Y44Ww@$g@ve+~WF$8ouK&c-LM@0wfD{B;WT>xkP&a~8+jVHfD>_wAM72PF6) zar?Lfb-J%)d?C1x?_&Sw^HXepzrV@!Y=1sK#p8+J_Z0Pfeu{d(A1dna$NF;nP8E;+ z@NsebU_X2coc;fK@z@Tpfiv&h;xX?Bh|j#Af-~;&Hp21wH%2Mc|yr^Y?gLUiOCv5TE_w z8F2R7FA<-4yTX6u{r2mFGjEl+trz!~qrsVX1me&SwRN<`){FbgBjBvl@868=umpP6 zxvDivw#4@DCvI^Ve;_#H)F=35iTG{M)6Z&8=%0n2$IqdIj>Y2fsc=YsRNu@s#1?fyJnZ2t{3;IulqzLUk{`c8&##d+`P;xT^e z{m*rpZ;0{h;DgZj91b6Z{h7WD>+cPpg4^pI_zUcB%fZ>-d_K?GhkSr02;%ylA|AK< zbqPK-!RLb0*H|nb^YXbHwu8@CTRmLg$$B0kuGgOu+~zPILYBj9;mu z9+>(oq33$7**jaIY>EA+MelR6dgvoh1?PEiE;#Q?c^{nTwYBlSU+&kH34UCHk4W&J zgL8ZN`+;LS&xW4;bD?wDwKOUU%A5HMr65I`@*bcok zF&FFEU)=Pp=O}R2b3uaNl;Ben{5kPh&)=b^PuB(SH|Bd&Hv-=|8w>gQh3{u(oF78Z zI2V93&h6lg^DsE$JP*z|d_Obebk}?1to<2hb8yBv7@ToV1!tT~!5QanaK@Pi&NwfE zGtS50jME+ONoJhQ!5L?1Y1RPQV(ma5wqK6sk7HY9*AzaVwT;@@`j2s+2e~qEpQrmv z;687-gX;G<4a#>-;6C5+df<0Tzk}Ax_)_Ul4czBh&I#P#J2O1+ajWD5jSAf7%f9>udV2YuK=gM3Y_|CaOwwvQ$GZp`dV=6>%pmS z0H^*+@Hfz&W5nb9{5WyjOq`#;6`b?)J}$8K=ls0)6XVSLxZ=dTPa;0^&IV`Rx#BVJ zVsQEwOTgJa-}|%Q)1Rf@uS=r- zdw(|H{(jvM+lT%v+tYonsQ*9FpXGY_^-5eX`m@ykC;PMI*%-%^^{N-Q zIP_t!2EQ6{CV|t3eHwfe^ozmi!>*cXY_Yse(3gR8-gQ6li=n4K%l^2Q5)qGOqlfmiF^7&03Hx@xpe|DL8+<#ZoiNo^pe96h^AmaBqdq%k`gvqD{8p}S3pm&Ji3EQq!MnjfWt`2#WBb%V zPk**Hp+66LZr`tMz#wr$YmGKi&5yZ=Yt3!|Hwxe{m>ZV4AcQ-c;F@CBLXkv&szLK{;csr{;ct4%_GpCHD1V{HD1V{HD1V{ zHSY5=EusFt%G(V~szQ0Gk@7KnuuRk;P-wC7FY(I;hpqfdH|^tQj#Cw)NN^3tE34$izY#be$-h+BN-oe$2u zuZzdLOTpRx%fZ>6^k>=r-EhAE_5ai7XUh?X@hiX?e{XQM+ri*`p7eO|dDy;n;?|x! zWR2wGv9qCn4f@NW=lgGON$Br}zB!BI`{y&z^SQP^CHS8c{B^{?19kd)Uv0e>g8TEZ zu|Ir;_-xPOTu08v+F6{h5oZl?`(Qs@ADsPg6Y-dLH*mJYJ_&wMf*%3S=lhNWXaBhz zoa=kFcwFD>#O;IYdowuK_vhkqeSZzk{qAva*6G(77Ke4tl|I(_inx8S&bPo>=Lh1k z&ac2(XV>f;WQ*xp=Z4_a+dE-wiTZ89xxeoO&iK27Q@<}b^+$uV-F_$@+wBzb*ly>5 zv)wL4{5P>*_;p6yUgHvZZ$^A>uLG~e0Ru=uTuW3y`$BSlcS}#_MCur=JVQZ**$|Ee+BxjjXj6+dNsJc z8`kqq0;fOtGgg;%@%8iR`kPB;Oq~-61RG~W&inhc^;f~E<+sp zv+L?USA|1aA_L?e+-tj8A`)@&5rmd9kg0w#4{5i`#lJ{(j($ zb4r4bNW`BAJ>yRUXZ$x3+^@@H{afNax{O~5&iE%LxPK33jQ;@i*JHcCoZw$3c&QzX zvc=k&aSl%K3ljYH1fP-MZzgzm&11!Sc1rNU;Czm_UOcwj#nAIS^1eJs?EJZ@|%ZtKOoZ9OuOEynr0u)kL< z*8eQ@j8h}OIJdpBecX>f{(V6)&Uw%?&I0($^b>u)(Bktr+@q&epRb=jZ<%<^yDRnC zxxnk32!EFQ=`?WerwbFjEBsdK`z84P@L{>V&Viowi~?u;dlURm3I1tZv(Bp#-*$a({|Vr1hna}Oyf1?@{wE2(9(-r&cTVs_#bY~M3O(x? z1J3tR+yc(LPb0paQoJ4B0B1WC!5`;)A^f=?+b$dj4uGD|MIH{$=ORxB=W~%afiupp zz!}Hq5Auw8K)08*vNtWS_RY6u8evY^(Kk z{R4S<(N%$;WrA#ZHE_Q^-%<5@9KU|PE^wcp^5>&n@B7OYc&^s!_v^�$13gTLLf7 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

    K$c_|u&T1ezU6!A#E#7??Db<%cwEc)p& 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

    9}=u% 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

    11*J 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

    YKHn68bz;LVTA*b9_Xs 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 rQVaorQO>5&yz@;qX?jR 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 z

    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 literal 0 HcmV?d00001 diff --git a/3rdparty/lib/Linux/libRFC6234.a b/3rdparty/lib/Linux/libRFC6234.a new file mode 100644 index 0000000000000000000000000000000000000000..4c3be51d8e0e135a51f68065d2ebfd6828e7554e GIT binary patch literal 36778 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 G{{Ib1MW8hR literal 0 HcmV?d00001 diff --git a/3rdparty/lib/Linux/liblcms.a b/3rdparty/lib/Linux/liblcms.a new file mode 100644 index 0000000000000000000000000000000000000000..dd1355b9dbf704ae5d7563325b00ed84fb768bc2 GIT binary patch literal 788236 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

    m;P8K~``jP1--&Pmyn_=(=UAWyR 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%0DcxX|rKj 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

q zC~O3sNO@&pCHYFb;_~t*Rxe(>s4`MTURa4xmaG(q4Ko}i)fJI>aCBvg_Qk}RPMuf2 zw4-LD;w+vuFH%}rKD)fKeBsPwr88`DRe6;Twi6eZ&zv`V-pnEd@AfS)EL2rgj;zlt zi7scH;RT_SCQi#cGTsc8R?b@j?TZN>IWbbUa8_C6tfKOYa-yA>H?6q1xM&!eY|hM? z)5>dRmM@M>L%Uc}P7U9#OMTZXo%@q2tx|8Rv}oUxSgj3ZJhAG974znoSDfp1Eo6@% zf8qkP+o74d;}B;u-4K6TuL4v(7k`$-&cu<%Jqjx-7NLGDs?0wDC-W!HJFmQW!H~se zm60L2vfI;cMn-fj4=!1U)OV@lhLK7rf0dT+Kry!ON9`x3%$r}VY7HW3-U#<}Ohs9h z3X;CrYM(8hKT{1y6_$of>!7-#NgU9JzD>fqU)z3SlBP`pd2J=NZ&M%oHVL!Tb`z5{ zZ4wwkVGutHXSJU_n=YPEd(JgxSn-7M6LY7@8es}cxJ{hQ%N1;ojZ-JqO_AUz2SHqS z2;+(x!NbRuFD$Q|H*;d7a^Au@p_vr+hli>bp^sNNsj_Tdq)N2}ZL50HX5dGsoK)Ee zDVw{?HSJ`wyH3r#VZ{rpsw>MUFPwKywHi(MdVpoz4y)W&L>u)-s(vAL3r1$4p+XNGWpJ>{!=L331jbs(jBpMr~Ug#9!wRNP8@-Dx1-_o$I3}+{mux; zpI9CVmoJiBX}2RhULAUQjxIrbl31Tv3c06UM7PXkx## z!!|AUujRWa`N~B!BYJ9=Yf}(Sw7$A)`I=+jbyi^ZI9|BfNga04b^f{K6rZ zmLZF0xXtXqh?B||prfj@m?yI+2SR>qlHO~&f>ZZ4LOY2j7LXVT<>g|gLQeo%Z$4DXu>Ry&9U}BC9$R;vdXfwpqK;(D(6;eMk9o(u{Njbx z3(70YXi|F&X0~RO&72Q+T~gZKlw;fZ%XZU=DHUCPnL%^XM8?N^9Ga^J!bJgQ>-wM=zmfEC{ zG*=!R9m|*pV?1wm{6pBbLR`En(_V|?$<&$F$4bC5M{+g2LqkXS+Qf;DPhz#5S@S9q zQsT#?885B2RYT267uQ6}7t&MOod^wiZBnpI-vOE4w(k&Q-1xG-ki{yhIxrono=r|b zlg##=G;LBYo>opga@vIPlk%nwnO9X=miRb|Tj^bzx?iF1QXz3KAnSyOq5HE?^-!uz z=VaQ1@|o3GPPC-FSeQigS8$r=HK|XJDDq&jiNmK&95rpm43F-BT{=Ihe9HrW^89-H z?|(q7zxRi!n{1VDVq{hUlieNsEb+y#!4*KT6TY>|YyLzYOAMmvFL*l-Fw?ig6D-OIkE>Ho?OU?o-c;vv(d{mMQ-v>Ut*nqm*^)$)t%YaXoVe`zYsA&pB|031*b- zq>x2o<^Y&ij~?~x`Uz!KX?R3eyreiUFEY3M zr0R+aT2h8OU<$@ZKxb;6uMFEnD$jQP(}pNI4b^h?kZIHA)YMGF>j+hg7Gj7KId|F; zEV7-sXaUVZ28JwL6e%Av?xe{_pw*Z;pReaEtRAvhzr%nAKvnMYxzlD>;^`d*yp@Zp z7t2?ke$4qhBND&&V$v$$lXO1P_g+56c^Y4vqaVM+bmo0y;(xmn{Ii&!U#|=hKYicK z$Tdel`4JEK?{q?blL!C1o!~d`G)n#7>jeK3EMM}!-wFN~JoxEdL1Q;_^t0dV9{l;8 zus`_}S5`B=s-q1pk>H^65LQMy@&f$*=I>AKMB33q1J8b%OtL4}SXQnbF%E z{q+Bp2mgtk;J=sod+TCU@oRi1_#g3*U(yNwbsqd5K^K#6bM(u<`OcQ~pDmr>-|Qiu ze9Fi*M?d-7J@{vJfHE?~Z*%n1e~O2E`VOz*Ge2{rBRaufRA)mgDXylrspZxV6@~3oy z|8)=kgF3;#*@K_H*J<=NM?d}l<-tFp6a40*p3?s_JHg*ORmXqne>I)p-@}7{ekb_N zcM_%k^xZ{cH*?$-#Vp^JXJ6B|hP?P|JDC4wAO020&!2k%mELUmUjX)!-`qj|gTd^@zo~=#RHwc8 zjiV>ipV~w({w%H_$@uT~;V)o*+g|qdD?a?@dzv=Aecc6d&P)I4EI*n55B1@%?O^`t z|J-}YU(rE+>L+;dH+PVq+DR||O&#Rl;=^w~(wwaP2f$Cg~F?yt??4|FKPK!HoaC;U$xOgm5Q{~5StxBsX5$lt{B2UzLa@=x)R zpXni=z8h=Hzt%^7pt}}K{WH1Q@~`xfpX(ui8WOVQw;1_|!*a`I`Nv8S=eGQ(jeLvW zVfnetPxddvxh;Qh$f5G5c2sT)SiYe*_lQ<*7cjrw|Ey*HDUulHw*E^&r~Jo~U&H!O zXMWOu7S4@6#;;yv`L_NWSU#mKH(UQaBuE&{n6PbP{*nZ=t^S9D-^>3uu>KD7lm2sX zZtH(C%eS&0FyBWu;}@fbt^Y;LZ|i>)3$pEP%Q+WxUixR9ttCnSIom`3KlsQmW%;E> zaX#Am-0vg5l;uxnKC)j0&NDl>T>Lb5^<(Dcg;y<=Nl|J$}dDy?wL;j5{-_BPP z%TH$i7ntAn-<8bIpP6(sV9RL%otOOzXtDrXE_0Iq&{)&9-*zAQ%`AT|^P7Whzb|~` zFJ}2QLOy*L+LqtHC&ynSfR8!AX-j6mV&=EwZvpc^uaj|qZT*Q(+0QcUX4ZctbCUhe z!?~^hVwP{m-=6$k?f$N0eWFVx4&KZBw*Kb-y51TmRcE&Tclzkx#1FulnVu<}m_3sKg!fgFFG5@VB-yH1p0-*DJ6~AjLwf+wClm3_E z-1eWJ`N+@Z?`_{~$+zuC-|hF3-^}uxg#0T!QDc7z_$N=KKftG9k*oq zfA6Dz6Z4z@FJ}y3+kd-{{+n5U8NY7z(Em6j=w<&Eduxdt#*Fwj_HSZ-+y2eWPv78| zo2`EgfS3Ji=wTr?8GmlWwQc|Ree_?lk75rbYrn=LgCxn;zlr(p&}!(!@N4To7W`iN zXPv7VrT^avep~+)EZ_G3QT*VI-Po0HsT1giIP0Z?Ejgc z{`Akfu}S+=U9$B*8SN}l+WLpM;Z0_L`v3LBZ~M=5=3khk|L{lfd)a>->)(vDX(RhT zileQ6PgGDZ{a?&cYzhCHlMtenTLtsm`fp?YIi#G}Z2y@9elPu(*J??!|MLXWvGsr6 zNB`4~&_Z*CY&x~|&qoC(%+|k&`BRhFe+2lw^v|NjTG)(yvj0=Kw)LOpBY(wE#U5C# z5ALsRzter>m$LjC<|O%)mM#DHEZ_FuGFBYnHDNN6qzMcOX&d>;^GY3nZK(mkj z4>13qIsO@bTmQ#>^lzrcde}19|49FJxVH7*=%fGnqZE7KXZqm&+WL3d+q?Y!&isDm zZ_*jY{M}p$`s4%Vr#^$+tm+gv0{p7{BoWTnU#cbWG9nefUI1?Ae}<3zrXzKNpYwAZ zle}&JsXp>Y(_%qvn@BlqWd9d&wB^^cd^=y49Iw~{jr!pJ8oL?b_snnCpJ0Ke;9;C0 zcjK2yXR}ZKvzh;Tms6kEdcNzE|I9`$!TdjR%KuA9!p{Ez=qD4UUH;7lTHc@Z!Tq)E zzc={3%75+^TK-DrB>8{Gxh;Pz%eV8jv`{k+aV6^$ooXCBkNIu;uVnu0IH@`_@=ZFw z_2GYk`Efg8GkoUwH|DqP_W|?U<3Br}FM!|6ei>J42{Qh@3Qdgu2pekK;UhmVM&Ey# z>CC|{zi)ixr(dPzZ(v3$zl}JzeJD zbW^U=_OD@_^nV-Yw*7N4P9#dpOo0bj{tWAeZNJ07@8y5%S-zZqe%C|(xh&t#*KQNE z;*<2j{nfd0F9RT4Gk>!9`Gd*7r9dt7Z?Od0`TyGF-{N1+9akAYKZM%0{b`&_ zBJBRhe9m}bJge%=QYUZ{^V|8qm-(&YbL)>u=X~b3>rXTDe`E+*4?F)$!0%OmHr%Kg zW&XDy4Lkog`Q-oZQ?I9zm(SIBBpJY`yTmNT#^w0UFmL&UMpLpoMKgRh) zX_wz|XK0O+wLcdyzg>P6%)f`pI3G>^&GCNbx68Sf`ERiJEjJC^1%9vkJNjlVL6+a= zNXst2O+NCo&eVeUv;^Ar-{>QM`7K(0EoYSC*S|dEr(vFgNGvgdk!NZ79ESA;emOb! zdIa;^_Fu;Q=pH3(hTj}3nBTVl4a}d+{&T?ZW&iXQT7tCyc4%VT|27}___sM~OJ@IH z`^cYitClbA|BZ+I7g@e-|Kc(&Kbig0vUHi)_P>((5ndBEtyR1nk7s_{{`WF}GW#C| zelPoP_>Gn%?f(NbvF(4JkNnaZAjX!={?%FD@^fy}@}>RBd2RW3f}bdD`R)XKTj1u89fQ`8*N)Ugfv) zb}eBgCrt69D|Vy5(JKmmqO|3g&ew9y|Cu*h*zv0#{9f`)`32-=A-}ta{D)Y+ov-hf zXo;tga$>VC1D`X$-F}zWXr@9dVO#&L;8*(Fbbrv2MzcV&Ur+3|{f-)>?Ps@tSDmNj zX9?Zul#_GOE12J|{|_>MvikoV^V{Y3BJ-2Zaq-4-4$*+@?E;`IFhdH~78sKYfFi zu##1!{2z)vov%&*>1RIjA7J^(>_5pze)_9gzO?`09`dhY`L_LsuhEJov;V8iZ`=P) z=I_P%H3zMgwmD$~4)wPG@0q{aF!IsXb06?~*+1~6mb8KS$o{z=`7ig8pSxBwPO~y# z`~P$w`5Rb%L06p)$sgt+|7MnN=j+P9YQ85~e{(<*3EKxg`iIwRvMVeG>oV}RkN%nO zX-e}Q6w-ercH4ia9OhkqoBpQd58f?7-8SogCW7Cq{1$(p<*#7-ll&t+dcmNIQYHv&-h$RlJ);65B+O>{Fbu>4HX{vG2Xe>Kau^L6SLEp>(zj&q%>IJi5W^Al!|pPHFJ+4!k1_?7)E1=jyt zOOoTK<3030i{;znrxY&uthlP`%+~)Q=C|Y5K<3}ehu@_0k;%VBH=6nT7(%{pWi#-; z$-l*){*`8w<0txlnqB_}4Dt5g(oc1Qr}j@w*!G`&!0+Y1fv>gv&7%Gld&nQl^6h-x zL6Zg8Zr2A_3F|U&k)QrF*vFRda_SRX|8srx-<+m3YGQth9}afge$RrxFKD=$xYC+f zzM(fa%(XeL_K{!HRm(T+Jjp-NL;g$Pr?l*KGB+fVZ}d4B>s)>e|FR#+|H_Z#&&_RL zfAUSa+1Cv}lK&0xqgdKJe=zp%BZcGKl)HhyWq!N-R&x27@;CH0|CiwRihoV)KMpgJ z|4j7opS|&b(@XzmmT$+e45J7i3z^^6e*^Q|^tS%TfZt314Xi)1r#906R1f{<`RE@= zr(6XB}n({O0mig%4#PaRuH?}=vKKeh}Hmk-v`RH!~smFU8ZA^FNxD!$$Jwc*wtz<=gddGf!OWRCF5jYhQok!~YTUTk5O29#0KrGJ@?dL7Z=6 zemlSR^;zIo_P6-g_12miKcoE9E5(N2;O86pR>rn>Q2r7l-{RloA)j8UwdLQ*@=cs{ zv(Zai?jRS?CmPi@Bjf?*x5xqqF~5x)euFoIzdJ50^#eJ~pJfR7X!JMm29|I0JIr6Y zr=iqGoBw6-dzIgIwqNdUnvcq_61(9y~%Rtx=;na&iXMonK75S5!%|CSH@Zniv%WZS6kx?T?s5`^+@`mTC z)9F2z6^F-mNl9_Vrv#2`Q@=>I^O8#vC{W521pbuza4P9?4t6?LVy8z|^w@~5tN0k< zBh4cbPLBoYxRj4Id_0$r7vOjy_KUDD!(NO1V(i3o3HCbd_1GJ*UyA)Q>~wEA_9*tB zV~=6K9D5^nx_349Yp`F7{RZqeV!sJH-TNi>Utzx)`>oi2gZ;PI>E3PFZ^wQI_B*k! z#C{j{r?IcWPBeF8zX$uhe0?8|_hbJZUq683gV=wM{bB5X!u|+$;{5~mKVp9f`=i)t z%JFgRbngl5H21U$`%~DPv9HEX_ts*62K%#o-Gbvf?9XBU2liL6{}VgWK9Bv+*k8c@ z684v|{~dciZqj@R(QLr}D)!f~)AdH|uVa6MuiwP+E$o}Hzm5GJ?C)YH+Wz?23wtJZ zx;_FwL$D9!Ynt=R!#<3!hvPT``$+7gu+y9p%`xCFP=KF8>?iOwjkk-iQ&qxWU@U&d zVR!gCgyV_W$Mba31$4&%^P2 zKEHsE7vgvkpPTRU)#CbM#xCJw9gg*U-oVF8alDMrm-8`-dNXY~=GRaJ-Vw zn{d2}&#%Vu8a}@k$Lsj~dK`bj=QrSZBcI=d<1hLAS2*6x=eOYaYd&9riUvrnS}983Y3xcDPTj{)yZdH+zBYZ$jvXoKz0wf7u$xWL zPj;f;yY$gdS7m}`s!A4&9`rvpebV|rp1xD}Y?f2^!|_YT1|RNTw<#t1v~%$fJ9eOv z-qVS0a|Q>t?bzXT-4ukkzf|32P17R<&=L#fk(3NBMQ)ootELu{L+a{NdG*Tk@orQ;80aK)o0;O*6iS?&3vmj-C9>Y z4sb3g)f^Dt+JkQWt@?1>Dv;3n>b;%VxKbxppwiw3s@1`3o1scU06vFO+oKnR9fZ9Q z`y}jhb|)ppCdwaWkL1#whUQ4#wjJrg>z;-Q4xa4976IED8SKO^OxMl?=ZF{HY-Jad z|EVN4%}F;R3MYjd=VXv;O^l7pX=n~!LA{VLm)>52B$Clz;I;fOlle1&hS)huQ zVnBcNTN!CUEB_;m!qjF1S@` zLv}#|cR>>F0&o|AyMSevCUBP~;Vwn>ES@qum{Br?&ZZ-=(%{3zbCDoi2Ho;8bA$cH zPdNiVMwMaTp1YyDHweyz{f{a5`J8?p=z^!9I^O@M{b@40uPXJrmMJ=rkGsLCYeuPz zTWQ)4({{wh)KF09X{;1E9TqPosL(*wM>?_jfVM`4P?&HUc0_tOa1mAS9Cmc7sb}bj zkDyUc*+>0en|{XBHSz1%{F=Px$Edy87JN_*goD>25JisLwxbwcrqk}D(xvDb><2%L zA+jN<=n?u*oSxTwnSxp;qFU>?-LN%SUyLi0L|2u>D$)s+P+hbR#{H(*vxgYv5Z|f( zS@xQn)LwPVDb)m%od%OlCkXlA&^iJp1GF`An9(Vj$%>F_8++YD!aPkjW~WUSHv#ku z))yqPTNdt9-Kd6ZYfzLn7Y(Hg;R#j7eou^0>laKL}x;3r7c2UPIBM z?6}jF!WhPd5KDsf#{+Ov5{_r|Ydru2x*hdsUs{qoTti!jI~CPWIb4Fp%BNFsOKve! zWu?(nJqpKeZ^z$u+GHmylfl20y$X}riyaP@*Y?V54n@CHL1VJ2oGsm{R1yP7u@lqr z0X41{jDxmU#RwBCs3r~!M>ipirxSN5dU!UOfx>v)U!Kart<7}bi9XY!hF4BYfnvZ> zH-#+))O8NjI$5bmPo_iKhN5f99o=+{6QBa^)(=mB$NXPbN>Pq}WsNPXIT{E<5M ziLQwDVT>B}j~^xsZHX5;<05Uz}Bq8Wu# ztKw@tgiS*(J!L=F9zOkR%ODu&qD?>#EwRB=L%5DNm}=652Xop_=6KuVNAxdrr?y_@ zPqmjPAm8o!%s@5_4K3$lH=VVm`>XRFdjh*mRee=IPA!~_&Kf#uUr_aRVq?>{?Z8MK z-5%pB!G`JRqK9G?=m}8|k*1kpzbWBH)y9US3osZ+m`4c5s;87-pnpIpc2UA$_$yU* zroV(l9B>y9_i!Vv`jBvJfm4EzmK8FS5ImIDB_D5}!9O~#L@p(BxSPx%C^4Fp*xOGD z%0v$2t1yrtzdDB)A>T{;1o@fZSH6|NzaX*sQ);>{DgEmgpX-{D4aDf!Wh+2P zZo9WBj9~pQ2x_ULJG7bdZajak6HV2lcFe@^tZ#J8Tvc37%pHdIjVDFV*x**vNy5kP6UH6s7SAamY(bnio z<;^8i=!VsAQPkT|ZYXk0xn9j*D3qe(H+`M**2a(1+z`Wnnfk=miQF5AVe8me``Em}VaF9_Gqeg!>@|gU_ey7!ina(if9d2BZ5pJv= z9XX}_G7m>}uxG`?(NEhcaoz8CV%2Drzl^L!Jul9Cuc7&(Jk=jKDVFv@34C~&ni$rt z0MUZ%#Fn%V$Y`OuwJAmUo0k0@aMqEp=&%%;g<6WT({UqE zh!Z7>kSv4b(n+ZCg6xDKK|qFT5mla)Db4uViQcmUJWgz4IxQ>+w2V=y&JN}%ePbu2 zJ1t{WvUQtNqGJvZI;-&;J0Z=9b&2hUd(_1b1pAF~kdK1A=GoCPm>H$nNospdTrWf~ zD5sTbSlTD>!(crvwh+Fk%0v-6Eoq-n%1+%gDfye1y=dG>d0|Japt4#R zo0Oehh=RrgjZX_>;p`lSBiXs3#!1?SG#3Rt&-%2=-T zT3o0=6Da1(L&OS5%ell3z;|+=;YklN+e{u2X23dt1PNRu>M4piK!B_ z&Z;BM(5WiXx|w`I#mk>)-tJ`xQ0c1-J%g)u$04`5`WQbv95!(MZ~!h6rr!(n{MTt* za=HZ#H_q8cgA)}3leVN(FVT1Uku9m{8Jm`LK--pd6-6A=4WQV8oUI}^Fs*3eG;Uns zVexi!DzdHmO=v^Wj$YV-c65iT{cILAt8N36*mFuHgX-~fLOV*K%WX#~e$n$+JYePK z*=KZc-rQ(5^ zV527pc#y20znF*BUV|Ne^ct)`omv`%Y%|gcMbFGuL!F^+3pKa|qgae}wnp~#9$YH> zQ6dg;7f{bxJRc`+H8kDdkGmEQpp-BJ9ZE)xbc9z?G8pP?rSUO8W=|O5n*JE+kwXb& zdFX*5&(=tCJu-=3jd-klV91kf_ohOmM?p8I;>X%ldFqa^``lSg zFVNJlDU)Es43wK&h?7kr^1!|%TA>Ru!F~}c#H8~JsvIeSA5)G(4^@t0;8=nt8s+$9 zq`&t}fhs?e-?scB=vaUe<>xiU!2NIH&m{g`Qhw?w$QbV8@btoNm=b7o2d%pP(JGF? zRFacthk^@V;NUxDmJ>@GtYaQ(2WIHGfo&N_9ub)B1Q#~X4pyuV_Urx>Av$Q8=O!%$ zY2+X7;}i7l(jUtLvWk8bEvnk6mSW{aPo*2siK)lJPUA=*2)8XpEI+U2cvplzaa7Of zJ>f*>XN03OGttY-BBr=Dp?0*%XsgZW!cMDW;xDFgLafhY;plwy<7VcV9%;w)$=t>I zAP#8zkUqK4XEgLF=(v5dcCkKLQlA3o<3OKMTc5T1shfxQ?d4;sA}fuB7)@F#f$Yt>QZS8^Wg=!ZdL#1@ zQnp6=Q@2D_9@T!hy%DUD!MG-idM`%ga!N2Z9vMp%nQ7F;^N0j}wb1xV9TJKF*q+c* z2+eh<@toxxrh`SWVHw$}Zmn7(qlQ)mx<(eo7NjZF@r=|hWtDAy#9EBmnJdqMrMB%T z2?Vceu5VTuFKtH$D!JDFZa+xXw2sN4CG3fE&}R7N6>74Y@5{K4Rdnv=WDiOX_pLXU6D z)d`oaOOYSL(wk3OY1v{T*$gH_724vG?FSH=DoUll>A_JtTi#H=|3tU#&MtfBqmdu+ zP%vK;V+Y7fHS?y=`v!N3lM-_>((AkXwX>iuBgwq9NF`#`V5aJRO1SNtyTeHc>M z(7P*s-|tO#zvxY=-Q0&#yQdG~&-5Y6-}Ze1@yFd%LFjIeTHmA|f2sZvP3?|D_*>*q z3nC^M_EwRe!twmk)~y$jF2Xuy(&pz_x9aq*EZoYZTk!|)Mc~K)tXe8Du0e2Cm1jS< zMNl)n)Dd&1C7RT83dDJ=gUX^gx*@6*mAWg zmvUV$bK9|VSlYQe)68<)9;0dtK$5HOk_ zS&ln8rkZJbUI}hOt4T^7iC@iu^F%;S!Wbme9SWpnyL~j>hYQv}h;pVG>lg|QtpYvM zmR+b|1HB8y-Kbzay+nnA#1m~b@CirD(aUI#i28+R(im}WjqK+=VmJMMdY)abMwv=Yn1@%Hr5u+S3-Hu^3W_H%*B+j=#<+{fg+=mYHAhWR# zIfT=w27{|mS^*3N(du#gHY+>5wIBRZT`I4OJ|iZ#^*MsbK7BBZJYmq&X@RFx)A0LZ z>fv}JGOg>wX=-{pLnW_VPyGo0%~=D9deYrAr)Iq#PfxC`P4G@EGIRpC6$R!yoYH zGXLBJ{<+Ec3&1~@_zRf7CV{^u8GkAGYly#;_%Tqy+#bd#b+zVdI$e>|1RpNSp1WL4 z{FS^^3V(7?eom>u!cRJBL;=%yX>|Ab_T6Gl8U+lu;2xOC3cBgT01yg%Kjah*Ka z@I0kb_i?RidL7LBsaE<`x0SZ(>4h1hHyt?Q<7wmqsH3Kmwnl1Qe$~q}Ue;Q!V!on7 z^w=7#KN^4!EiJ2cpYy6IGSJiWaUXh`{demZs-Bts%k4D)UmooLW!FI20Q}sVLcedT z-&?z=^DZNRT$6?#+#32pJxuGRM#ygc>UsmRy+*HZLHpr!eL!7vQKG_Oa))0p_%Y8^ z-S$M!D#xZ};(;Z_{`f=HuDEg^s?vM0|DlJfb&pWNtLLh9>*zFAM~b=ig&wUEKvl+l zw0b#!UH%*ik5+YacnztfpRU$zz$tAB4_NCqDGcwd;~8rmy--b$S=C95pR}TSZU>HM zGRk%6G+MU}2YTdMN1srkX=QE&n*QfMZ~Xw3K(v=W&s#4Cm1!kfm*GM;Nu7J%+7quO z9*pO$h5LM+7MPLN&=tnVS#{P`T?03!>~?cktl!PVyRG!R^?7>Kx|M#eO`U~zYt#In zw_==vmZ)h8nLc(xhI1HZuO7SSZoN6Hx2HP6-#txB&(dka_7D_Rd{gyjQgL20nmn1z zN?IT29DR01*#ZC0^W_n&8auD=Y{(<6qRUxVBjAK!ScZw}VebL5>) zzqOAF#k9`&AkXEr<90sjtI1(a{|vz+SYHc7b>!$J8nNKXb=YZ|rHJ3pSe%Uh@&(0sLz}dONv4ocGXMP&gl@;O)!jyI?}%_Ego^Bd^o#!&odzbufqOWCZK41{xm` zz|Yjem^qnn5_(wTx>5BZ^o%W?y2}Ho*Q?%93&C+z7*daJO}`n=rPf_S3VE4IC+=-{ z4;SO@*oB#@(@Aqn8S#k44RgS(7a^IR4j4HWC0LB4wI+R)7W{q@hL3uJIjmo4qj_=j zn#z`o)i@m42-edxQln2^$&Y$!KXf8B*?wB8q?z+LZ~ z<<>!Wy)R8N|98Ewcz=V&N4t2vZ_94}96$q8fM@+4#5G4$T~7<%t~JiT{5W;)WU2|i3On>W^?rY~=3!msN1 zsHPN;@rwrHLoO-!Sw%nJ($6DZazJGq$^;QWys3Dh-u*zdSX*nJ1SUj`8r{4D=fpzvO^SZ>;fi4Wrzsc*45%d$P7LovKI=r^+R-!`Xu^ER z`FPu^CC7<=qFvC;^YAMQdeDyX|C!ki%|?kCb^3S_RRx&0?TCIizUeule@3a~J)*yW zlFXna)l6=DM1LUNkR$r_B*Kj7&AcCv>tA-q&NkOg%tc{61A0)=ardDB+0oSHFEn)XGYpgBDqmm7i&PwC4- zx?CM>ctBr{rOT&-4Y%scaeVh`eObVF>u|XW&z&*n+@k!e9?wG;5{My^Zc>3X%m>nX z8h+ZuJyfbgdmVtUc%hFveki{DmT^Tl47D)c+DJbeXl(Qe{nU4@iO*=n>l2>#Q@q2l z2Zh^k1B9B;5jhdH0?U?T6MH*Rbq65=^P~+cK!j5rAsbdomN|rjgg_qb)Z!H5h1)4< zuQ5Zg;h(revjt7#+OWg4R(jyUG=~W-C1`oOuidkTv!Go=+t{*!+e6f>b|J>>H zT50fuvd!#u5xzK=vNt}t*Ch+zo9lw{^0o1C2W+4=)%wMjq98AQ1VAjk;kk>Bj+Lf0 zymZkBxGvUJ9)W>ycUql#@v}5#wWEnX-R8v3&pgAqxP=g|%cUYZ`W)quEzdHrE zc);ly|2~F#4|=G_`?RBW?lovs>B!eq{o|!a@hAtXxbHuw_s7*j(k>j`p>A!a3)6_u zxw|QUKTW>sLf^+hpHuZRAEY^k9ZfWu6pqc$48`u#lMYkyDnofjIRD*X{XIyE7pPqE zJDkT~xDQ2JlD}{tUp#PDN$ep?oz~P%pfz=PVnmtDFNw{Ds1K_Sqxk`>5$9RNMt%^2 zY+JS%-JPo{JgacpnkJ`VV`K}OH_A&LtvxP$5;_F7 zWSBTwwrUM_v~&dJXp z`KaB&`ff@5lcs3dev1B2xNgs%e}Vg!KkwT&JrFn^{yc6FW?bjNogZ)G&M3Ad(UHgF z@%X6xc`5w){<#Pfcr+akg!iLhy#3jUuIWr5EGvoKL8(*AKbcL#h9y z<)hU9Ur|1Ad$Fk!Mt=&SOuUSRZ#4`h4?e{7TzX(A9)B80zNvdJO=ccef0wWzT_mke zMf(2(`&%3@PUTrSe)*H$;>YSTez301z)=|wjk-KbF|s`vR}RZf#fw@d{m z(;s}D`h(t?t|f#d$ zHbak>@TP*FKfXo&XkMMs{;2z>r1rP^sd}28-1S&Azo44n$bhgQMyShv*-KAT-e=DYO-UATBXnI!7Tk*1y; z!u908^&_!UY2x<(;`(tR>Ib>Cc>setFp%oXeyRWL8kmHW-@5Vq7OF76q)A8+sUf!L z-~7b=r(iv~xN+HF!)v%Q^FZO)Q1!t2MPTuEKUhDMy1hK}Q@1}Z^km5>*?-YrDHG$| z8<7ZgSTLobLs9+yesDILZwgXP}ogbyW_sAX@ggz0~-&CCT{qPHQ}Te-ipDa32oU zb9+iUA}&Q{cZ>U1uzo#IWBOpj)3_>380qRxd$69`AsXuHUT3g=HLlJ4UmeZ)aV#rT z3oN$uQ~gPd4>5riyp-16Ck8n^ZT6;-T>bZO>}WmDp{Bv~wAnJ)zk3Le94J61Oqdif~H*x8P~~--5;|n^5mmDTUPQtto5ha{%Z973KVp_Yz?lv!i%hdJ}o^ z8X;yxTny=37<@RKomKaCigWQd>K`b~a-!>i}e^7X?y41+Zd(LT`l=Fjn zCEQ6_gXHP-c_o@&5m#STPM;m^siel^nN#-;bUuA^E6qV;-qp(73Yjmw3xn_ZYx*sh zCh^bRPewI4trGu7WMfKIAn>;?<;as6Z;OF;n^ATjQ@arw3J}NsJHB=!FU>3H(ait1 z_2bS<8pB=^`BK4xp8j@!^mhv1Ce2?Amv^#gV#ew2M7X;>{Ee_0w z9N=kts|JRo+Vy3qp0Hll!>uC-h@A~=vB_A1JQ+FtN90_mae|6$OAb~Qzwk-QxC(2d zbU!R!|4TP*>4y5>2+l{{#mk6DU%li4nuM7L0QH9toMqj1V*jzm~W z6^}$tY5fzI!?y=QaU9R&*{6+du{ai5cJhp z`my`A9X<7X>eIrp!)Ty*8ujEH{V4J{J@55ZRc^dLk>t73Cw}u!;pl;`(YYYE>}yWk zSB&?TbNi|hFmCAAj%V+Mr@y&_@IR9NkTNb1_$H+n{xwrWmtOcsOE-7PfCF?Pw{SO- zX!rUC#8UBjgk^hJeJI_pjeaNnqa&_MPqq%D^$}|#m>4bPmhV7}9+ZzfnFVE(i|kJ2 z<+gisH#v3hqwVAJPg%olkt+T_V~MRP{o?dcjK2K8AU&)cPt3z7@GWL{ zF7nuL>_U75N_Abs`8%p|w4aBgRqf1sxz9@yLQP3jf5G1Pg?c{SI2Vt4-`~{w1^V=D z+yh>$%@g+u@uhlm6ER>A_3ri?i2q+V=;2fhKu;#m$izR*`gIpP8vC*fRttDK6wlA_ zxDeGqy>>&Zj!PQvRTFfkf|?0CT$Al}hlMBc!m;TY7z{)PpuQvGIE@qG4R6vTB&fJU zy~u#u)$ihSzxJaw^heY(0~%)NU=_UL5u8gW>_9&_zRX~Td3LAE(Tr*$x*RcsIh02; zrX1Uwzw|3d_59ANJ{Vf0`hc<#)Eo%zw~ zPg4F$z)xEKN8;JzgKT?nbFL0qgDEt_bLsyEYv zeDCIHYnGG0rTTta&EiDgKt)-S6CZE2^Zfr~dcLwSqjd$U7nG`3MhP8;Y^(2U7SXzb zXCu3X8ZXk3#;Mx`r3l6{1GJ@TK0{dmqCu+`*FHmWd`w(EHIO1Fp+87fhl?AI+79EpMvI2sln0wxbvUB%t>_zD?$F~@Du~9p z@C)>VHjmyimg7fkGXAk;>2@donaBY8mKqg{QkzN*{Ja=jEro8J4Bo9M@6F^wRm0Im zcfhZEz&N0*ySo0l>U*%f7m3Cb!r7MVwY*T>$AwOGgL4?E)AIBtjOxix-~~=_%=%FD z?7aSn&BsS{}Y6la|@oJrM0m|HzgGIlZU{MxRmQLX3VD zj?TggbA0+YQ`^V%BzZPP#U8UdkQfVWGD^S+N4IFN;E!oy2^`^C%9guL0$V;bXNd&S zcqme5WDYkbQD+M4(#6X?SO?aPN}>Q2AdF8F7KCCaWuU6yQPub1{I7$Ts#kU%3ml~X zQ*1c;J^qtj;FzqXJ)PihpAKH~YYI5|2r}ymf>%H5^xPgT zf~p#B#^*DUav`Zz_Z_BGm*Hlpu_$|>Q@0)SUr*o?6H}*V)xDGA981$u!Ama(Mv?jA zch%g~#cT9`_Y5{vsT*c443cOn?5xbzW0AV4Pw@2=3eXKfcq(V$%Js+qCUhf%P&TSC zLoH)fFyZ(2Xhk~5$8a=4b8B!KJom`tOoVE_WA>uSXq8`6T`S~%N6dz%zRT!z7zd`#;xDowhQ?rnfx#GhK z0hm1;g(_=nMC3!LgT}4Fh7%Aqoakn_Yw(f=oU4`H$Z4>i{<|1wAlUFZ20pEDjUBSf z|7`LplM)K)Eh&+p(^!LS|DdxLZ82G<<+h=emXhd2ncC%gj^#b zN1d2Z6a9fY+LV^J79qVnC`=P4aLG{qOOdIRZUK2Rd^f%1kk#zBm|daaH(vKW(q@l z5y;nn)KjFpzNJqI=)lwZD_l?~302^;s#D{AufMfYExwHYB?l@*q_1{D!$xs6E~ND| zB%;b3N+JODRWnxj9CGx{)?;uB(ZBG^u~}UrcWt>PZ)59ts!gufZg~~Z!*~MlcmZXm zZhHa#3q;CBRA~Aq$y>5o)wk#BHenWj%H~#zqH)3l5(v*hBIpZf!daAJ7E)|I-94jE zPboEZe_)M@lWs=eXVccPd$*}`W{H|kX7wzK)^Rl0($GFf?MiziW5ibuSNZfK+azuLP)xT@06y7WLE- zLfxJ^eLmGlD@2!Bf1tv`WJvsVd z0Dmri6$@2E47%9)&!9#fh=w5^{wCH4Ek3e=;`xpOrO7p>2ou1Mjr#Ui3%1~Ju=etcbpjHbZCBjL-orcO!Z@|i^=lW zBE!sh1mm^t)S9VpFwi%_=@ex~|D77~1@E!cwGc=3-!VSJ6G(VVI*rl(iSgO-;}`KkK-69$^W6!X}t=k+JC5LiG^Tfqk`ad&#DgVuR%v$`6r6-a%k~u;3Xq>zHz7l|H=?7v1CPstT>O@}yJ%TEDYSiKbxHUfEt}7B+yd3T` zQg;pgQR?BSLnvC{E<*kS%JD}H(%!9GtWzBHD z`1ssi*FvL{EDVXyMB$};fDtj`K(sou^-6r+mD=yvg}VRJ`Y!-+es{*S^*h3w)c;~B zg$QHrpk;0zrnRU7Xgx^Pgd*zB<8{zLhxuMH{RGALJ6v^49`#H8MzA)X*jU9IF^s3& zhVK8d_b%{J7FYlHvzI_1m<2=&O6!uwzCjVQAwc3afdqCTfk;5~RSPj$BpMP-He3`H zNrG&bAXVGi)>>MzrB4QKHrhYFqD@R;;G+LTkOXwfw*5%*=Dy*=Ms*vHksD zpAT%F=R0T4+|Jz2oS8}WjxOMgTuetQpw?IgG5Llk=hmUPi6!SBLycQJwOEz(=3JIz zZ1U#3JJk5L_nQ!%Cw&oI)8fy$Z>Vv-Kj$|?jeGpqzV)0x=b53#Zhy{eLydJ=dFa2g zK}J2yC>~Fev~pK0*DK9qM0m|IF|)vFX-W58V;;cLjrB)VptoZq*Ir1LmeYCm6zIYh zOw)Kq==qd=LK}RUi0~SzH^_z|Lyhsv4>)J_&iAE&q#;#Gg{OC8LjDGM>duNXnc4MjLShp zk4idF@rDtH7+YBLT;r$ybmm^E9@-gL zNA{dmrGF26t7ixle}T?_;k$bLyMfO8@uJi{ryvVct9$4i_)OG23qcp@KppM;F0vg8 zaH;Ki4PVJ~ty_VmoNIlD9bOTQ0p{vT+cO``t^Op^@vf&D8iX!7D?#adb|VF}KPC^e zNZ~)dzK6zWk130PW56|I^)b0O0-xd3^F-XFRjp#&oB3TAeg z(nE-NUjJe0$#gi;Ay&mKB@py}JejsBfjWsj`q4Ccpvw@&WIa$DFzA6sK@T)4l^zJX zw=yN^tg{e8Zi>4@jA_H+=t%c{6kU;#iOYCtOR0b!hC@|%J#z1@*eGkT32lcMcf!8I ztUXAfT|4v-lw*==2;&C2UkEZB==uVB-fAeVO8W!rPRD!SJQ{~=-bW=+6}D$|?2t+z ztT~IsLb<2}!xF42&qod=5biy)bm=xF&?AV9HJ$Fe3!fBk(p!BWQ8e{d)9}&PjUPFF zoijQ-{<%o$6M=O;WSXcR&Ggp25Y>Z>0jXz4^_UUtcvTtc1=iEzXgL04_|iXMegSpU z&q*5^ruiBje?dY@kr7Q5;*WXGd`xyc_ebKVLa*hPq^=hNogPYv%m*H&v9t?qQTKIR z%u+oBb(j*Fv=S{emS@rm5cZHh&zY?}%A6PVvF~++9qC@_Aq5C<ZGw)PlT%TtmT= z7KBPcMY7s=F~*n|4=>+2*yx*%;iD=|O9wKFbRY$AGIbz7?cZvZR{yJ1akHsn_0eG| zP=$OO3KOJod(!VIB$cgw6N|8wfQ_w*Q zdKMUP+<7!+TPSfGLZ-o4tJ_B@vNOY=Z{-M#B`0M+KFs*Kw+z3x`i9>>%y`}Be}0&8 zxj(Cam~oXKDvF!@SaiKNs~m1$8-!uq?*?Uo_@zPB*A6po8$1E;8?w<7-;!O8*UN_Z z@q6QtF`)j#kgVH>8Gjmb_zfT*8UP;8A+HEJ`!Ea|r{n);-{XGX-+tcTqDe$mv#Zdx zMVJ5b{+3n|xPgcyE^{ooeBR&w|Fypr3r857k=87O{#J+utp|PH-+tcT%Kr9q`v;nN zes2Hp-)#SoJoWvrwSN#ZAgBFbI@uc^B7DomGFmncjKDT1I%`CcAIao_%V~dZ8ZRBz z{VI0-XGZ&8a>RDF0vz6+(On9-JS@9!p}Br7b6^LS>n!txk+?0-c83C1{%E~d*h%!i zmZXOoJ2V?wYOHO>plIs$HuI`#s3^wc@d`W$f{zM0=JVUV{;#HPu! zTjTHS-CV%BP%K%dC=e_)?o)w$Bhv!;Y|7)bPq944QF#PmmoyJ$@(s@+Pyu@Kc6f~^ zs8BBT+6skc6ENi1%`%`g`l>dVN7^gnPq~}JK`ht5=9BRAeiC`n+FL<~)$?ds&4uaz?0-fT#6B$Lv!5U)K zsP9K0m-aJ6{{%kGB&DLK15r4o_O>VaUD;khK^+=3$}pB5W*A+byvwq1icQu({Ma3L z*1LY=MmijPm-lGAe$!Wu-@p1s;g_r^MjwUp_!Q~{<+^&feN*T6zZDGQsA{chB-ZmV zTD5r)#=$tOny|f_%OE3Eyh`w-V5F!+Vsd&BLHwwQ>e1$#2e3%w22*=;A4VV5ta9NzPsQb*3 zURpAr9qyhU6nir+1s=G4p|v$*#UUvc>SJT9rLeQHzt?6;tY!+>yT4R!-rj*r;~eLR zEQx!?Q6k*P(Rl!8PVx3Xh{`Y5zol-k{}-Y?;N`Ub>ye%z$DV})5j}$tOWVVhzU!$# z=i$%N#zOxvH47fvC?@uy+*D(pFsp|C(|r+x0DZ5tHidMyr`n+coPmf_XoAB;Tt z$(-&J3aU##39NgBT4fJTg&S1u*&X&R&7RdAI})>^H^Zgxx7~*QQl9GgtC1()jKIPj z7Uy4F@m1Vl5RN~GTKaJ4sqpr9{bA25X8PU>wD=Fkdi{`a$950Q>2@s%EZx2&u=q*T z;F{rq5u<8g)Q;^IAGiOmDt~!vY)z5H@NxhcP%wfCmADxpK`|2EQc0T!3TwhFLCO)t^R6-wwz75`(cv z;jwV{gdw!y>GI1UP&j!ImJbU(RpWcYPhz{>uGai2>{?m(I=juy4t)TLSX~vrWcZTu z_|(3)*$kiz<5;X%V@n6MXs|lwcBTsL8`~W|L@VxWjEr48UF60re?c#}3pX){$@}PH z3?=_C#|X!Vi8CC-iDCITR3BS_+7E-r))M$IM-=0#<0ti>X^_AQ?;~1EOJfN;WoxWW&R1rlpkkjf0$ln6HsRoK~qgA$!>UBNPzo^QbRlC_48! znC?7G##)zWeFHVvVLug#{|&8{ID#PDi?wTWgoeE~aabH8(`kds(KXp(KNRgH{T**% zdmpr^$4p0~I#(r5BxbZl3|rV{CJ!)Ki$O*kbGu{5c-d6Bo%GDzr=q1K!;Nj!*1*!r zVYso3NaDYXT>3g0ZbUA9khihHW`hlwtnw8``*ey~#PeWvyk&GBU9YIzwW;E*)cm+l zX3VJ~-wHte8%;To&MoG_o}LU>8s|^0#@G4>aHl{ zQ?F*yp;wp;SVQW{s`y1P*diIg-XrYUrhD=F50T@T!0jW*Lq`uzeA(^^Cr(Avw5zob zO~1UlROXjyx7>dVr?;xRYNR((x_!lk)wJ`DMy@y!C|DJLT;v-pR-Q!5kF7g5!fAGQ zMfSgNbQY{-m&CLC==ebyzMzKTkv+=OFps9ui9HIEo-9tV0qV`Z55e|>>DbJ3Ro?|* zhrH~gX2g;YX=mMkYf^>=I=4`BBhOQz{Or4&0L6G6KIE{Xf0TTY_8MX=t!8>^=7&03 zP2=XDcxJsk$hetoD<7br54~T;_xF6QZ{XKI67RqA6Y>gG<30W%czr1AF#P^83&55^ z1gsy7dB}{$rs#~8)@60E$g<^4(Ph!*SY52Kr8!t&j6W_&HPSE&#s`64#T5K2V9~F=iEQ@{>20hdUl;OCFve(qSiYOxlEBn!b?*Af)5( ziVWj0YTQ30GGQ7@9APMkb9<9G1_deFd$r$yNI``i(mX=Lg;AK97VsBn3d8Ygw0mOP zj8w|14PywA(?w*jIRvjJ~l z*A7QPU^Lc}ngSIU$kS1WK%P#>`lipQ&RXX)R%QLgYkc36^{N*e!Ly$58t-^=e&scO z;k^*%L`^MiQDj3B6N(}VnZ|UOJ7qh{85=L?zB1Z}^X^_6CQKGtC*mqao`>3qO7`G< z+!d8|91oRqAf1u6xyz$C7biJH;$b}pE_|vTHFdG2>0{ssf5oSn{?w^IaN*TPo1*n- z3F^*?rpa?h_@8Qdi}0fj9D_)6Lv&TDoIh~kiHk#ajl!QdbK1g|*7F*hHrSD#7_4s7_-Tbf#0QSoBY*7DZY zy489v9N6$@MCRAdj;>zW(%R6bhkao49|gZW+8S$&x`Zs+yaStl8HW`4E*%Q+Bh8e@IzBX z1Tv7n1CstpMgO_*BhB@#Vjj@sQVIt)|83z*QA{p{&n$eKC?>~2)kXUInZ`$n=6|ey z+RBIWM~UixBtFwyqjfRYagr*d16Mw^(O8NhW3sFqxbPRYHpZg10b_E=A_op|_{jrC zO%e`p_!W(9%bV&}&uDM1C(VUEW;?*)YXjEgQaHfj&tKZU?Cj>c#wI=GpGo;U2F%H6 zrx+aI^qT|LRAGMx;d3u(MnaSR1D<}DURsp>XOMoEUivc&f52Y)0LveRpSD;248l*_ z3m>@fMgN;_ta@POj}?;tY5BJeh*Iaofy;l<|62q0f#+@qwmg#KW2>4e+C|kue0KR` zuc~gn#er|Ht@5JysH*#)h!4;AlZH=vJRIfosp}i9;fo%!kdOlxzKuU0#6vbYFi&~U zzOqe6A!BKZ40B*CDAr~o^xe~b5}l+JKK`QNv9DlBk^YUY%Uh)q6@#Q6=B3Q!xdp`CHO6HNLsjz4YMy=sue6gD$RrItCo$H zi@Er_8 zB`ax6U~#<{Zjt!de3RU?->D*dRGgP;uCGT*9}BGeJ?N9x*PVq?ohZ(q+ud}GH)37| zbvRGIW_o<*9%nmkVaujV1wk!$OFRg2CjyAP9>{*mCOG&&qA4k&rE3gDR+_8dL5bD9fc$=Pp zXuzgzQ!j}~{4p3JY`Pn-9Upry8HOcdI-3yij%rZa)IRBDAo(h+9kWaUTv<0S9b!ZhwQ;#7AS# z^QfxsVh*x@f;ca|GJ95{xRB17wGN^|<($>)FQjDP6c`+7myPt6?pX6A=af9726iK` zh5i?1y{Y6|ZXzL(i#V?7t z6hG^l-*oH_W%jd|JZjHuia*Q@$cTSuUmR_Kw0DWrzr^tsoDmBd-@kHvWqjbP9vxym z>I$8^l#T23NS5QhR{Ml2WT-H~E8-ES{Y2t}Eb)1j;=)#d%u=)?y{aAQ?LS|HM2$Mk zqrQp&_9eaLr7vCbxFfZ4S3+-P0cTimWsv^%Rd8Bp(a=KGGmw{0}*ZSO~bhOJ}Bu0D49u<8sTI!Fd0qRHAWN`JMxc6$d3M9kwh^rx&I)Bs||%bMtc3PAQh-OJ3Re- z5t?bWW6w1;PNK3SSxX2ZJw&k)Xs`cS#fzfx+c1u^gy4vf`o$gtTYQ{_zz%)YW=Hg3 zKfH>9Q!G?LisU@lPch&7-OV1)I?sq2^fexIGr#m?J)7-$(=%sJw&z*z$vxSg>wLdN z*?jEJ`e(N1M_JjAW_x_c~F`|irl z!l}hWvYyB>ZW%ISPmb~Y5CFS}9QuQyzHbek@bFOM*`WabGPLaHIYv(oL=RzHM5)IE zLm_>qo3b8KiI9gt!VZWA7MyzW7bgF(cPdl}|5f>)#*?HIIhKO1{|7i1szgu;F|-HW ze@D3c?)=RN+`)%ZgFcK+zJCvU@AzZoWal34=v_*-?%|G|OKU68?p^v8d9!u1o%tjR zuoWu(S4&LcgCMugaegf3hNee??+&InEK= zv>C#IE_}mO6kGXSG&U)}6J=&phI%Rz3;pHbefgE3sUY8#@rNqnPgcgCt4MsI0!HDR zz9n4>D&o5;5_3WRWT1O1g9xZ1{zxT_7p?vYXG2v1TOCeQk~eCzXkEAN_5emYPxse=fEQ!t4AAw&Wm7@ThV=?2hpq?|87P6 zgnR_hegtx0G^Gr4lreid-uPEXukZL1^6vu!98@>Acl;yqCqH~H5P5R^9wcXY{QeK0 z4@B-qUX3nKc-VNC!n!X^IsO8um|MZeM1k^%{3hCl0dfDnfh zFu-})3J?*bpha*A0|8d$pBAo%tb_lW{ID7JkjEn+EGtix`O6bHD)Fx*oFp04h_bhHO7q?P;nm6_)Lionq$n(PC>JL!e6N)pAb&`ato+Sp9}})JQ=BnNjR?7 z3Ecc7MWLX)^f!^foZo~!7_cFCBfeoH5z$Ee2^tOOA>7K)2V#B`uE(es+dljN(WR7k z?DVjpV6ek+Aa~C*xcvr0h>;P`GZn`#_pf=R9H$Ld;Do`A-=he3`13uSec=v79fZgP z%D29g(b7}JBl!zf#CMk8g~CUj@h`(@Uk)XPZ8XD@MI=b;pqIfEBIsFC21oCh8CkfF^*+!YCq5#5|a&PSz{jDW` zlmUGQA>I&7N+pb*k2Y2>aptqUZbCIVYACP|FeDi9_xB&Hz%KxI2FfII^Mq8;E_R;}R0eE2wSgotaIc zmG_E^Pw^d;-&_N5jD3k!uT_=ozJyN@=OPsSjI=@J3f+gRWcF6Z-z<;6gciLoig+Z> znt*mI9;PTggkdG}PXuFYK0_a%W$ODi?k6bk__K$aw@#Yvp-y~}Vnm7(5U@TYe8*n6 zP|4Cxy3K$y%1BHAQ|Iwt)!PQaUiF%B^B|`{0;Qg+sVBYxe%A7f$?MW10&AN zU&YDNnlLn9!--ZkV{5}f+*v7jm|=J3U(F<Nc4>Aa-E+_eIa^)mdI4zfiCMT;l$s|$9)hXZ#qjE?Rx`XYZz5JG#hR(p77>U+-jiWn&yrG%Kp|gE2 zK=LCUt5EH_Rv~Ywf_CjiFeK^~rB4Ss*Fl=mIipvW9rAtDh|yS}b2U8lEyWM?Gko_C zdMI?9nAOY8I^2ZzUGwqYy~oebF9>w`QHPGF7=F2V~nL=SDvn3EWV4NT>jwV$wucSn64(ZL?Ks`&4zA!2#sw%Nle+llFWZ+8EW zhWw>s2rdtri58%AaG>jC`n%8{=$e8TWa%+rVg$xd$nU#?^-a$4NZ;ija^sYZ#;F5r zF|4%O9?`Tk0haZJ?k%LKP+Q6|S&3w$0j-Gd36K8>DvwVnu<-U*eTm}|7x+c?#6{25Y=)i*1&@lReW>xQwIIA8bUVd znhZ|0Y;5JwT#WN9nKi`~IgQ?j223J?F5;Ucyl5v+qga}w86m!CJ^RK&jv|fzW!W>utiTv1Y4fMLhW6cd^iLfPg#F^)seLfwCq ze*Q^6cMZbN<%7`+{$Vhzf1e(5zG3`+D6seGtcdFmLQ&szP~Kakjc?>;?H*%1mz#Cl z7~>DQhdn#SSQqeLGsgH@U^w2d4UFp?W4sX{*S`gh{b;nYc|cvgeh2*q z#{2Wbm-gNQwp{R}A+XM2XwQNwuRvS{O8Z1;SJTAf&~mo6wzNw760vq;+maZGgJpb2 zf){2sy#dbqzsN%8zwhHB3u|{oT1eGK8*$?c(41rYF0MTfJ%zonL!Ij;TM9$8fgCN8>`&-jdA zd&=;-jwT6L(LTBD-ox;{$2$bSkNJqK)9(~!P?9{CFR1EnDJh>{)qT!zbzlkxHW*UJ z!eKd_?iHhHdHngyBBxZ{SHi1j9X^*L3!?P@uCovCP9z)sme~;?hA;`MZ@n1ZgKk7bex=aCe z{rg+s7VfwZ`7<1K)xMX1GhO@s2{sNxk#NbEY2ZTyxH{>Kv!EEtEGB?IMi;YgVlu0H*l~_s z`{}S~NMK1Ut%OhlYBHKW+{fw1Jmw=vvA4JyND%tUNW0?t&j&#Ezj>7@PK*AisoK+=e z{j@Fklt{X%n_wJQVv_xrpKGMfKlH;sK{WBbrx)4 zlsgvh6rFZ&f4+Fx(H~YXwd$oo(VQX#0l7r00X7}4sAZ0^QvY~W)|eBR!zrkRnTi=H z&8YYgicMshMcuzkgzVHdFR^le$z~!j?-Nn-zZt2`Q2x=5d@ldV@(S&2mfyl0{_lI#J_tG@y9#(|09d||22#F z;}`t#%lvO3{#yr)*gV*He^3^FzfZgIE&d`D@yqRvx+qLu{(?JIAWOMQngg9HF~$ie z_>lc1m$$(cE_5kXlFO~+N3?F?z={l zgUJLvk6>bQCwEb25*;OyuPypli|7xRE|XP=?MH_bKNaZPxNM#5t#I(h5U5DxT)BW^ zAs7C_-FI!nrwFF|uB)y03&m&$qtnsS6}e5(zYxO-pMdC;4&-UM8T3?~I0xwM*hD?t zGZ5yz1z>@ZH;rH9=w&T&RhnQ7^7tDm5IOmFpp$O$W4%|P^Bzj8oE@juePyod>RSrF z*7*OYbTU0O6M;@2aNOTX+A~VY@pMmU6%I){MqaB;?JXTQiJ*if0ugpRC|ZX|={qa` z=yLzt4LG_&rmre-^Kup5YQP61yr4b2pOP?h`cCBVAQkaXNH9v|HFs@Ck^Kw$by?bu z#0e3g%k5rrNgV0VtsXy|xQir~S@kWn;=zi^KvOK%{R35Srb zQlY4j@%P>hV5|K0-w)q{b^qh!SYUU&+Y#&jb&gNIWYdWhQs>cqk6HJ4i9Uj(HcB}1 z<^YY4wZsw+qq5VKbD8dY%pBEf9y9;(POSm^>U)tLxh7Kx7{n=t{Wm#d^$SoU zRpQ~^jHhy0JP)I>T$M1skjKi#|8XB>8>Tk0-H5}I2gBxGzBT+$~A$&Ac3aJm|hAAsmA?y z)@&FmU|w+tIbur%8R@14ws;qn9Rz}+f&`qVVpIT_6PKafvrjNstdiZ^MU5Xl`(7mE z6TFu1Hv{rnm8c(GRr-2tMBw)6+aiteBkVSFEE^IC)spkRMT4}#X}uG1SKrB+rl~w-FC3=6)crd zdj`;^>$dB?Q@^{>yWvoz?i2t2CVKS8FM0eEakS8vt{!TfnzwPNvC5CPH6zvzHLmg; zzH5kayC>^!LtvDg^X3ra8{Xmgz22L*JI8q1`*Tlcj&Yek@3tJ{C;q{B|CRrw-wrk2 z_aFLbj&ViS|GYKSxH~I&O^)$eR@U7^jW@GK;{ESgUwk&lxMtA79}P8b9yAyEKg z)UvY>pL??Nwt{_jHV%v)l7%SWKP2l#M0toG??_?RI@Zd|`p-w?hM@pwv7#??bjJwE zk@=APC>>{#5cQ{uho2! zF5lFT`c@~3hpAv+2CKa_r-_0^5s_*%F+HdMui-p+TJDejd^naV-JB;y88F{l6D^AA`(`qX8sp`gQ;Z11z?Bnsu z5-W6=oA<;fn4#w(^b!hvOzP0tF1`{2s%13Da)#etKpqi(s%SgHhx&RMjGdDFFB_dv z{CV`PicJW3e0tCNvCZsHVtK(3gB+peb~yfpe8VTk8fWGgBsp%CjzMx9O^!oVF~{o37aEH* zsU@&GqekTh5v+a*oqRsY>$9fsN&lKI$`sp2Eh2*iHz7BO-s4XHC(Kw({XrA5mgsMz2~Wy6_k9~qW_zM~aY#XK z4y0q!@RxnY%hZ&ZazXPYQIttm(@FB7w;edoPk7|EgXLqXXgfNtM(R`%1v-nl{Kk(-UblFU#_ONF<@m)h>i8uIJ_MzK7L9vUA&aI4(9-mFT`?=Mkw$e@1(ZWl-mBw3wuI@H5+NsMnN!$yu9WXyPC(xaJpJZ&4*qV(S7!b;f|5Dd$5-~&Dft~+pLkA;7U|>> zxR>PkyxX#kXFY!Opq^~J{)1k>?k$CBl{as5w(+!Yu3`MppR+9+H-6__lWjcc9|O~_ zEEFg;YQr%@MZvzJw`x>!wkK74r3$YN&C$co$TJ84YL;))}iwCUBPbgnA>q^(#E&8_h=#>#H%3-8kUf|{Jl zVia27Nc>t(Mu#$);lsh@{OW}mCZn$)X|#?Z%uRV61Isnt7mBQaJJv9RT%eKC7gzq# ztUzphCe23zBcPIX24OFK6wBcw4#JLO^fz|oX~E-!K48IJ{|K=JicXTgrZdCy!OHK6-& z&)l^nFYaE<{Il%&tlElkQYN)^zwVoxi=n4z&$-T^VW5smjmTsBcHi7Vs5GURy|01( z>U*9%EHvLoSDXFCQ|72O@A6cb!&3t_^CB+U!y&hl%R?KRi3r=3Mm$;; zS`AWNRiw~xoXRy&YB(bNK^l%DNhY9Y#q6smR;co#{VPyaK*RBN?2D;Y73TPX^c+!4 z^?G7Qo1Vv^mP606JBF6pZ25$uL$rLPAAx>Dg^ihIl73?u^c!!JenX82>}nD*o`ilQ z8YGWS{R;FOndw(BAc*qd(&0Y}{l;$6kED#ZIbKVx-!Kc-F>Pyy{gfI_V$!yjGF;b( zr__ThCAqZ&8RNLV(W&MYNp1RJ2c3ZNc;5XqrSRkTaUb@1{m`FvyO>>&t+N_nDY2w@ zsfXoJ-4~Wdf1>6j`>#7WnP@27)7^%C+x)IN9h?!$H54W z1v;Ol+#(&%0lLSrh$VR+?s0qu5!!z}4&CEu)|UfxzujXj!935w{fzhFE3H1~S`di- z9gTQ~_dl{|*&EN~cbnoSl!M7k3-*@ae%Wtj(Iyeh9iQ-=wbyUlMwQ}O@6mX@))&F= zI{zsAQZ*6xIdXT6rWU$3Qz@z2?7~c?gkvPvhwL8uAETNg9f)JsD zCU}=q7QV_Mc04nR;lo;NN4Me}YgKhGPTt;5@r6Z4kizY)ED(PR>5sXDRaqkE(4Z}& zF$kMwcih1=m1w&=9->!aY-bJ<8f8qyxV>Wy7WV_4S5ef}(wVuY?^xyMu=mZ{CN7NA z5?4}`?!?wwA%@?^VWdjL(~%c*l$Qz~)Htl8}2N10y;<0uEX(Cwh%{ z?7<&0#^}gK{H@8BHNGuJuTxM>`ZeAKQ6%?21Ul(}6*hMj4JH>G6DMthfYp+qAS2j! zGsz;3UO6^MV#isGE(?0M97jtONEpXyM6koPM6vCAnd;6&WnZWEN6beh@9)HZ7?clf zB0VuOMh@yb%M22w9a-4t+RzqyS*jQ9=wsc-JV*aE8wJxmBs2f+tFDv z#yW$|baY?8&=&+ct^<8JnO++GUorcC9}SglYgUwAXb+%geR0M4WF*RhL957UHV=J8=L)KfI&wz#V`{Af|e`>|H9=W>`u!R>@)igr!tFA0mbE zzZ}>Pps7&uSe2NR9EaHP`xpLT3Lk|N===ootKx6d-z(i}9}TT!{xSWp2B80zSszTL znN79wv7c2dJ3Ql{^7q+PE2=)JaT{{hF&?_~ty_TDmN3Om{7_Gd74GG7m5RE6@bO~P zY@qWi&}gdy#R!nxpwQm}u4ucM6wMRlR5aOmA1&K#yawYPyFeJYy&^wm)raoIP^XX1f)5d&C3 zkLEv3`Afs4@5T^!xoC?c1-2k?dd&U_m#1OW)j_s*w4kac(G~eirOeBN6r2_0Iby+K zI_H=)v|mh9gCj_YN%q}LwUNi$z{Ivt%jd3L`T&(Duhp94C%gUhVu+EnpQaG~7aM=z(6viB#Ssy>>yi*XVyIcuLxADUdz*ow;lO>dDU zl>_<|tX%vz?4$phy4Jd;rf3tcR;Z7*wdsL#IFtDd0Nv4+DiNPa^4Qo@k*Jo|%u{0+ zDg9@h8s)zj_oVPuA+@X9V$o%3Vl2Wdrc&y2P#i^f`4r}HA|YjM+S zds}r&b0hL21N!o_+hVPC@_I-&ddx-42Lmg|;~nn!G`vCaE#fn|c4=K}w4tVPRkVrD z^mPlt$%DRx|04Ubz>zt%i$YWQ_<3eHzqPJ0)>fIR1UkbI{EL~9JZBgJwErOpeudV( zJuXRQx~ZquwKn22#Jq{vMQ(e0(F?)I%|ZCrt)k}D|%lOYAT zzPGiZ0#|>M&)U!;WK){ZoOxr0UsUWC+&=Nrx&Plma78&kpH+%K>+n9SbbTJq|I0b> z>d8y^8Pp?EvFl`KYWAG`*rUVB9N5h1(~k=lEI7NpIo2Kwg(enFEIejvJAW39mjFEY z@t?Y&Ec~B2XMutKsfRGtXF>DEkLQAUhG*4q&*8%cXK%*jg8Yn?Zm|F0hpay_8d8 z3gI?E($P$n{ZGpszR_EmJ9@pZA~)FK_jV1<9UaacJ}ozU22RW}3h-a;Zd;`M%pgBu z@-s6xctP&y2-9;sHf9hHEJ_=_1cLkZl6%K_Rr z#k-QS0P*ec&CU&a7bAs;F|uS%P6gf(3f^bsaQ;+Dzeg#*)s$9_S0(39oA8bNnM?UY z;jNW^9&yBNwoHq+T7&@~vvV#m-^+8@@7??9m&*Jj>GuaJ+(t^Lcka;K>~PMRD0<*! z_#c!F0a?g#UR(Kr@>^tP!R#FGJoBR>XQ9d_DzAoQ9u67!Uw9KjKteJGpr<^1K+=0uzB}UR4GRxkPL498utcH^W2o}$2+O)eH;rbOPwFk@VkJVS#>=cUtb~Zr`-r;6{IWZo&Gj^4!9X zLB511x1c;X2shM8NDG(Ui_-u1l>hTgc?4~T-#6Q{19`a=#9}BFgJe1y` zYcbbU*nbL0@vc^$C+`1|L8+{0WJ;lExYi4etFX|b}(MMGg z(GTZPn|F=$KLhXVA4$zx@89U__OhJZE!{nezm=a9w_lj~IY-3jElE%92lE4cw>M(O zr-I^Bf%wFcn~~h086AXA}coM%EMmXGJk7)Po^&Kjne;-;3dkt#w>5@(>5lB zSplp^`k@6sm8Y`JWf`BDyT#)h>mACaDe|H`=RAC(*u`grWi4Csrf@{qTRfsVh&;%a ziN|4<{1DyPB#iQ)M)LWIOCGSylZ<^WIS;0BJYW*d&kX#Ecvvz|efTZX{V3&*zf`Ud zNqm+q+>PD}>PI*qyxpcOuq=h)=bzF~NXf!!&icvah5G4@p?2;-4(>$#d=#z4W4YNi zwz^2^4$HjQpSFtpZ;<}KYKy;Jc4S*o`>eLrgV?0v~pX)eY0o_ zPxmN+;PL8cIgmUoom@>sT&R^0f;2OgTrHM-QppvS0d`yS^COpddCxM-Eu7=M*8G^6 zI_~r5pwBN?eSQPnMp4Db zlVvN5%c;e_C$AM(TIg4=T?s=@>jSx6J#>(A*LrC?!ysz0kBA?>#9UA~`|u zUn9ez9sC@h+_H|r>j!Pj>h^E)UG6m~E?Xo`S7vdkKwKV48RV=S?_(()L|n3mAuv4Y z;xa+f&`vpyFJvf9zEE5qPZ{Kl9B*w(hjPxBt1^ho9iLHLg0g{k%a?rQS%svTg?G-E zg(O$?7(~vY7oI;5U6Z6sCx11dyGqj0cv|K2ChDiPanBi|n=}P(c8>2O^t|Z1O$hv| z@c&K8la2&aJTE7nnoL)aOrz|+iV})wB3%V}Bz`4w0{N~(7Lxc?I_d~2ZwiK}yOib) z$^6i-Yhw!@>v_M9MB7tXP5r!M^aq|4#}_5f*D_A?nv_wbad{B@Cdke&oh;Nynsl=b+d9XS1XC^fW+)XEBGix@G(T=aYW;Z z+-x38(Rg|}bp&|KIkYuq#rVrB=O-A!&&*k2w(oMjcjJEgrT+Cz+r&lnzi7Y;<-z@zidlq>UdTq#j`xew@i*L%*LZUrvW_krGks}2v*wxBCYM< z{t#^ky3`aRG9$;=fDlr+Ov_n{a5lB;ixvscT{SA7#+BEFbF4z{~yV)-0CvL zXY9fF!Sh+fXM+sOEj~fS<3>rd8t!|}}IS+#8)sp9xX1KR_ z>;Y3+?^ZOJ*QS>j8SZjlPHK4(X&pwHkEa3unO};u7D}2IRXgC`Pn9KAFo^$Bue0kC zb+%LTT#319`gF)LL;fA)OIc_<&kZ8}&q|)l%(OW3kILuk9BXTXw0RijuikS->6$tcjP*AqK~xxH!K*>?r0f=Q zWzA_R%ueY(cc3s6Ndcgzatrg>G+`Da%#Wn|l}e7eKb&RGmocgFO+aO_rgvhVSvVS= z@l3;ik(M&0CNPL^jdY*n;A_n@iSOwSz7;(0-;joHA^2{S?!78pjxW#eh2CbP*?&)` zzOn)TUzC1+rP@NQTgY|^x+42Lj_cLT+?rETRw`87S3TBXsK(w7twlH$WAK9~p~6Aj zwDu1&vwo1-Zylbx9h#ow`?8yh7vrH6%{0ckl>Eu61hUWl<+!^xL4!$B(Lm-M9Uzbpg)4Qc$Z&A|WGH2!-s@V`5ae*>FS z=t-M?Ns}`D8TfBV<9}@i{ux{|#yUug$>!)-?WmGVs4Ujeq0I8Khs*q)dMX{u|QxUz>sdt!e!C zWZ-{y8vn|;C$0SFi#$r1e(9FZe?uDoYcue_HI4tC4E*m-ki2y9&p$Fv`lVYs z{|#yUug$>!)-?WmGVs4Ujep}S8OXn+NiP2ecrBA|OMRB^!me+`8mhF>@SZ7VucmSl z)2eJtb{v}fNDjh@RC{0f1s9~7qblUcc2yuQa_#gKv_W^6(S zxkmDQ1mAvQ4^Q^FB@J7*NSbCvgD}Vn3oDkq?%gBZhj^`gajbiPWX_9`lfs7LZ_-b$ z$MVzdok4aWNQ-5cLfUvL3sc8|m2)cd;sX5OdCwMR>avh}w;Gs6rO1eBISb5^m|2<)?u*|z#NCK84 zQI4b<`KP2OaS-xX*5O<473=>;0mSo`;sw1x>O6tk#CIREh3XT8#jM_9EqAfxW3?SM z)*=@8lkTEZ()`&LR#UMd^NlO-`MB%e=SP*&<)4&W$=6 zKX^!Opz?(+!|+XITP)qn;K=T&^gVX_fW^Kes4YrmAP@wOhW!nIJo1{6{ zmPcvo0+sg*DT5qf?S1$J1ct}bRq8eg#ggVg$K{#<;zD(|N79^Z%NI>wOEx?$No^VI zA>4GQqmJP$u;qcJuRQ@y#nRo)&I=WR?D|~oykgQnb<3i>EjzCYU{^`^p{{bf#p8X= zF1WLjO>bC^UzB{Ty63DP|CH|6xrS5bI}w7LtOG8dDDr2T8GlO$O!+fky5DKzo2pEF zms4wM?_g$ey}nBNpJDR1@}KI$ZPGnMn;5DKPo%61(AlT6i5Yt=0>k507fRq(CTZr` z`VM;=Gb?wO$G6LoiQErUJF`amwaRCgX>&*Eyhgeo=z8WaL|}N_(n)bCkTeH6E}I94 z%P7RU3r;Ip z`r|V$&_N(R9!cv?KI38?Wco{7@Jn6rbuM_P3*O~|U*>{uaKXRkf+t+?ZWnx$hLh^h zYgqUa8->rf-1a42tC`-yFSJqkjIZ0itXH3Lh4o>3^BGs!zN}ZD@eS)kzEKW%ZTRgr z3ZL;U+n4p~Gp@EiY;Qi}JGL+D)n|Oy`mnwEjPKdLtXH3Lt@R<_p2A+^k+5e|^R+j&JpW%RJPpj4G2Zg41!v`r|VWb;0S3GyU-yV_fjVUGOhz_=B8Yi_ampV0^}xG zDzA-?lmC}Bdcprl7yN%Td>Zq&_&E6&X!L^rQ7*XJ2~AYuS;zb>K2H9}xbPt>JN@w) zg)TUq*sDK2W0DI#*#)2Cf|t19)T`=`&p6HnKi&mD(FG^%mGkN4{IvKu^RrB&C*M9} znhQSN1+R3$XSm>D7o1MV*B_rj_X6sV&!}?2=eXcx8L2-$gLX6MkI$Irg3ous7r5XH zUGUR2{I6VI79W~7s>f&0jw$`|8E3lSXSv|^*^CZ!*~O~|`X7ycOcv#X z#lK7u<1h3=8a+AtjF=0)Lc`ZFe~S;@D2?hHHh-l;u+#t&Wats4GY=5O(F^1oiA7yN(h zf^T!dZ*akX>Vn_og5RRyhi6m%Sh(FM^gkNCh`%}!hQ6!^dL9>gbvlkk8|H8=KF;wx z?SRrB=y_c5do_F|^SAgo`S)n_6q?Vt-vxg_!?!Vii;t84PK{phf5-)YM8jWT{uUo6 z|3@`?!T)g=e3ynFIfTmH;^XB1ltwT3|JDWny@sE`{4G9C{?BUkg8%a__=_6;ZRT(B zaq@pzqZj;Nb;19r;m|C0;;riKq6O8IZ`aq|DOMlblk<$}MX;d7Y3 z#mC8ik47)}|J4Qmn}&BYe~XWk{|6eq;Qx^e{&x+>74^s;i;t84KQ(&6|6eXRSS3A! zbBMpi$H||xL;B-0{4V$)4Xl2mgZ{(?AEx17XZ{u+C;wcHUhr3^Z8_5h zJ&8vDBJ;QSIQfs#=mq~nUGUKwUOJ5O-{Rxsf0#xu_>XnLzog;cV*VB%C;y;EFZk!V z;Q1Qzo2f1t;3!O1en`8>t^Ej~{EH5xtnh91KOpReIZ1StP4K2H9p zYV?BtX)gHxYIq&J8WtZX z|D`%T0`M8MUc=(!gPX1dpdcprkF8DSL9|OZOuVL|V^1nf&7yNH@!GEUV zUuFIlA1D7?G%UM{&%?Gzt-?4n7_rx$^UMRUhu!y1@F=D z94MN+hQ-Ip|9*{L@PEJs->KmMvy8;RTV zmw4`C{6>w>?->7?rpJCk;{3-JsXs7qvqt|04bad zb3EgNHN2ehgEV|5;|FVaHREG6yq57JH2ieNkJRu*j32GxQN}|WejejfHT-)@|IYYb8t&nr)0 zq^E*$Om32%#f)Rno%CG6I0idO&&`aZ6Ha;_Wt2)0aIG(LR`kdgv=;Nax{T@RDs=574^&;|cB<83CrlF0WNkC`~kg!nlskHT#?aYcVE<10*Dh5HQS zD>eMEFB6|tCa(CL%J^y%SK)q*@e52`N%jwcCyz~t=mw@=W6~?hxEJ_1?@d1CpvF7T zGfpRGh$krjz70GT{|8<0tb9tB9_|>%FOgiu9bWWt4CCueT*Y%1@NwR2wD>Fmo+>^Y zT=-nic$dllNcna@;~Pv|h5LaEeiS_Bc@rkR;`3F;uQ2g>@@)<9ao){Z{J#x6Rs64Y z;d8eO{p&9Hh_9sPU+#i`4|tyUYBT@NwQvW<0}^ z!ZV)YsnZ|K_^l?Nd*$0i7d*oF?Hc_VjNfVEJLTI7#_u+9kIbJ+ zzlZVrOg=*;pWiXQ)!gARUgCRP@SLMWc@;`JRbF3V`~j1{vNVk{-fQB@GWAm64TDfE$~!wbv^TW$_!V{ ze4b(acP6eZHQ!_WSrflj=F@0&)p_0*Oq}lAqGvMjRN2n47X ze7l43H%)wwSG?{4o+|%yC#J?Hy5MtM@MahM+rUS9`_1^Mcs|AWJ0`9)=A(`!`oEaC z8ez|2{I42*DdX>(xSA2&!}v!gj_SkD-x&Y9iO-VxQ&vdr`C_xasP_Cy#?LhIZ0Yk) zz(;yNG5Lg4I}u8qpQivH=`|#kVOpqP$#|BDe^tik5yrDkJSyKt7ZIO>Oq}k?qUUtR zhnx71m_5 zzw#}wnE0sH)G&7_oeezCdyGjxOU7rD3;t`yRqJe+CtU1x!7C;ce`~*9m5l$jz{h!i zWR`DGhWnul{V7w3&lEGBbgvOTKV|$W^Bz;BfqIScM~pqvhr$n^O8Ic2$>%l6ryTe= z?=~|&s{LOAJkMKZ(yRRWkqiDO#;yH#N>f%)LVR@mT*haZ{7;c@H@V<@7>}6rs;57> zl=xR^c!Ke{7B1hOVSJv6pCI#L4W_0ez1BXs4I-P3$;YL}mjlo9Dk(DzWwCuP<7b)t zm8JDT$EU8R1;9sot^I4imOjsB+}d}h@E-ur^PX$+UoGSLA=Af9obH^UXX**5!#&9b zp8LC-NK694rkABA7YxV2wN#lHu5 zp4Zxcq|$rvNyNw6Pjsy0Si|_$CVwRX8yQ!lB&180`xA^?`)(#le8kBV?)4@gHPWhQ ze4B~WoeT6_3_MkT*TwYKewl=%f6fIzri|+2*=Btl&D;&+B;cv|*8(5uz1@t@3`u_x z<9BQLPZ+oMn<)Bc7=K8kA6riRt^FN}zMAphYV_+Fe_q4yWBgSOe~)o%|AOK_VH$;N z?K@ET62`6l0t&x|am&tM;lF3xvd>re7p4<`zgK1#pNmWHr!qcN!>?g{xQ73Y@k2Gd zx`OzR)$r>X&(rXKFP%Z^LoqpK<0-)nqk1JCnX_EbxK zA{!RF;O&fC_EdEKF+EQLPu1>y;DUeRf(PcL=JQ1t{1_Mf6yPJhubb&@7SS|*20YJe z*-Z_R6updF_EEXA1^kx_K6x(jvFxMXlYBNQT;`+Fc)rcJq7rBOQj`v>AwD`j6ZlB4 zW$#4i_R_N&_&D!3C3l>IC}3kV(_8jSUz72Ff^jvA66fcVmmwJNkMvshLVuR@)r?zq zJ{QPzUBS3zpHn6$LXR_U+102KPtH8zf4CV>g;z5kH1U&VxCzEB`x7-keSmSxZbY^C zgKLSuW$&R@!e%pW*=gJ<B? z1MgSObY%-R#?y?SrQt^|pmLmR;v*#eag5iP_;88O1+LyD#DChEUd7r_*9RF_F8LGmBGkkWOYiL1EfF}}>i z50><$j5nLOqOW0mxrrYt>Ca{Sd=ppnos74cxT3$7@tBD#`a2k3Vd9GZDaKctIJ#GU z-U6=tN{Ig)dK#s7wMnn?vxxBvOkDY$!}uB#KSnaUgz<|^T=BVu@k>nnSV{jH<7-V^ z(I0v`#b=#~t9(9&@eUJL@u^_E%fthc|3b#so4BGsm+=iI4)Nw^2jg)QSM+25m*S&l z19+G8<&1CC=$8OjekCdYxy%JOW;8ZMXSB2~tBXaJEpLi0i#EsVVvQ}$6YG~RHx~Wx zoY|9>*EfZx*2e0Z8|qpc%A1;6>g!@Ht)sy){D8nccMa6EV5Gtu`ZkRW7+QQn(Rk7AO&P>E1GtWijIjJP} zhfNXK%wO8R?Cj>c#-{yX5SnTxV%gczhK9!Gb23i@`Ats4K643`g3Ija>Xj|64VC-s zyQt9Sdq0XH1n)JiEz6^=vDN#LeMM8?pKHUv!K9)v<1C+ER9Q2d>RoYlG*)LxW@V;g zN7-dYb>DM)vX)#I9+S&kTkBSH6H#JC(+ruCptoC>Ws+z+Hkb4 zA=;{{MyAZB)JD-=pnZ0Y76&o))VkKjy5?BMkqm+Fr_6E+GB15pGfZ^RB$CVN(-FTV z=ri}HB2zR?y+bq%m4mFggOR|k4to_&<;@Fk3N5OWov6o zYh|(s*37OSxF?%Dy{V;*x@pyS@xa18ty3axbC*Y(GxxwvKuuk2sm)9J&b62W;M7c! zwJAAiW^B`Q3PEt2qV+=1Fr>*ajiD0ZEh?J#NOMDUl`ZxI9B%vt>DC$#*`=p}%;vNc- zc+}R>WUj5UW=UhC)f}Z4&Lp1=`|We-e*28=x6gAk_c>*HYqTyF6_rLc{EhqB@)yyN zB}F@2GdtrpZSum_##q$W6mwKUg*GJ9=B1EXB{$B3Uol{AcxzX;#iGkHtqVnhXYv$G z@Jya#XUsIj5!Lzu!F7s;XPEv_F|)Pis)ApNW=+>9WE%C*R1U+@2XQdAnL>(@wcBJQ z<6tLou&x~tM`54G+a=62eP6PFoQ2fLzJ+I#DN14gJC{%<{QsT)C8GfTjV>l5{@f4j zXD^d^0Q=q1h<4Og#-;ooXhzatyr?&sVj{fJ1hU}Ncl zT+}A+A`&WP7NU6f*>{ofom{&6%tuOzR=E4js7Mrz)ky3+2O(!lI`-YaC=)9N`%$b@ zQ%J|YM?|$5Qc5)jGppuKE3aC#sIC3%MUh1VuKu`c;*E(_(~Ib568#j?&t&?ULO)aK zXHtlN1rbwCDrSU9CY8{8F?%d#nqqb>X4hhNoh;b0>tuGF%&wE!bqc#qVb>|_I)z=Q zux(rPG#2;b}eDo5_T&rASn_gMS`SAkQ51$B0(}qkW3OJ$URwHn3z!;!WE}ta^(tz ztHHM&3r((FTGtwF;F&z>=Nyj344W&eZfl(mKa*tFc`CZjme$CU%5<&`Nv`E*xA7t( zC&2D;GAnlNNN5sPd}Hlx)h*492*}}No0&TBq#35eEyd_xA1XL}B+o6U+wwY;?C9{R z@<`}(BlR@on1mIR=_m`ifb2FMv-6P?x}}-WhLXaJk*C6a3@{WbZ;!Rqv@|wDw@=bA zDP%2cIalY^u!Mq{tk&i$po1o#SkkJjbQHa9ZYng8LhsBP&`gqN^S=*s+Z35ef$hs$ zot=eL)j$r!C^9L__obLCRi(9f+7>Y~8`rW4f<1l%mX;!By}qb&Q>&wGZD>ubX2j9F z6uICbfe)}iP*ga*u9=m^&GoIqvZJYKbw*yHNvUg#G)Gs#@kleSDLSP++PZqK z)U1<6*(Ntd+~_DrH=!dvbZAkeW<~8J$gnCU_b?~ZLS%!c{~p+5s1QC?Y=k^HV@NCp z%HI(3S7=c7J%cA9gR5HF+Ez0ID}Np3k41aLqoJv0#WIy7vzsB=s8~3$HM(TtqDAMd zTD1uF1#KRRlYKX>(}GB2g74ImcAOyQ&CIM@o_jV!VO+SHI3pGb>D(j=1jHm^kcx1f1tV{^kI z{qALTA5RBXOZZ>np<+OEnlIlOg(yuz8c8Tqk-&xl+`O4aWSI|(Zgd(IZOEoz7^scUcI{H?W!GK-15 zz>@M*HejNhliX~I)WSt(ktI*Gppu|!rP7(~Txl$CX=_}yXjya_1|sJ)8;cgzuc}+5 ztaKMeRb@36NnOa?88d1t=P#OHKCP;fgRPB~o?X`rL8S15nvmJ z6z46fUwYo6C9qd@Pl>J8>hnpFOp#H^iF62{<|wm&pmq*zc+93H=C*18KPB)Yw1#HO z<~}k`Z8>b_MpEGyw}G)GXi2V9$aT@_1Gujqz|ABY*s(hz^h) zA3Fb&@KXfh`j!O1res5zb2PPcLG_{3B!nW!tW`wqW)skHs zh=DhTXRPIoHq2sI550SW$~w5zisNM z0fti;%ctH#med=t$m!dV+$1rCp>SJ!Yji<#@83_4iIrqaldcHq?17Ms(1_eiDRbY@_FU%z}c z{aMzsBB~;phFwP6&j#jWZ;RYRv-isGRH1#{#WryCXdh6f8`%Co_TB}~s;YeWA597G zc*pywsAxhn!`;%5i-K1W#Y-BDFvuV?;LLzvsd&d*g15Y6VWFW(k!fnF@yk*)Gfgus zD=I8CElM*=t#>_pKhMl})>-T9z0VB2zxV%deLl=Se9v=R&sux!wb#C!9M-a*T{9zo z_b4_173>>jo`kb_;#seYJ_MITH|zPg940azeKQMPOXyI&slz=R-#!-WrDl8jv`H>F zx3;y+Y;cQY=}EL*jILV`7r1M?$L8^4laarD@jO|0lM4!5*~@yU-5v#$dS|Thv_A!y zLpB-u(+2=8qw#K-_wIbsYy@s~?6@Q_K4)g!lfE>DYf+^(2MC;W(Cc0OWH z_hoC=1|ICo)~c(q18(Oh>9RF59_Pz8P?t`?EB2q`A-?P&vLCS<9C*Z{JM0D@t>_NJ zp+_pZ!*1|Vif%LPKSGgh*n8Mco?s}fB#$l>R+48H3M=j%V<)t>~k2#V(4*4^hRQyvq?@!H4d$Eq3X7yBy}b`BA$Z9t%BXm&0E12kdef z&GYPAWdnb{hsHvWZFg7Lr8fn)ub##Clzd@}Y5!rmZVEg2z;+JXwdEe6%c0-t>A4*8 z{)1#W4?DhE&I6CHmh;f#tK~fS_-gqMKauC-a^%u~G|p5y&f;)Ou|ZiEYkyfvf%}X* zPAJ_$RhGwMchX4|$vIWYO@SRInq=LkwV_RK&NyA3bDQK|>NaJ%l9mR$mqKpdXmB@O z>9=;Vx6>U>!5c@)?5uTejilo`o!)z^m(-G*gkujvBqKpmx%B*V$jJKS#xJbH=33oP z*2B1xRG=Zaw3JV+*o{(!FI5yXpPapC->8no_H1D+tCwr_LSlpW@~0YR++;__7j!aM&b`s=Fp8lN0~!8;}Oan7Ro$5nXMgpa57sl z^O?zP6WNbTX4@$9q+|}|*h7*zRLeXcnM1q$qmelbM4yUux`(G1PyOZA!k0HX-PIg1 zT5M6glf~mFBqQgrk+aoQX5VyFiv9#dN*cRkLlKfQ5oZS4^ES?)$oZgij2 zD0eiAYHCmJJ8W@J^0k|F5A?xu^y|((>YTsU#zJn=o8YwqrEc_V3vyh2i@SrfVWwN{ zn&O^U>J(w7rUw++VbN#=) zw_D`px3DUexA$$A^DDm|67qX)#BUz?|80J^L!P%sy@r8r3(j`A82PDDdC8~z27Vz^6uv>+U3d52A5xHG5ZU_F9*LB{0eaUJwu1882>?#XZ-HxXp-W` z|H%kvey(;-tp60v&wjAacm{%Ve`x@xd7i(lsFByi?uGVCxv_B*0}JAM=L^c(AM zA3&b@*-`>@#m~?75pKWKCSNl@qg39Hb38cXyf*P#Rnp&{K%A7XR(aoVe{i<19cM+J z+|(M@w=a&N{ZjU zla)(-nddViycL}N=Njd{{oBCVA9(!Yeq_IIBX+JsyBr(wJ0149U)cQ0uh)67!}?wU z&U$?%V*lIVtQU{_Y?oO4Ghm1De;V;H&I=>l@-Ove{L3Qt?+0i6AB%9-i|w@&C zXOxoS$HVy>>ubj^zrENl%){p*_Br39{YO;Z9|wjP7nJQ^?q|x9;`j5S`F}v| z`1Q5%%I9``6wdbjquTM~SqIMcwf)-91KXGNwRZIFPmS1*<>79~vt7QU+^_HVBK*hT z%)>ho`x``#NAn=h{EUEo&fA$co-c6zLpyiCKIQKPr~DJ}%k#K5Ax}I10H+=M#c*ja z%GX8mV84s*%eO@2FOTpKBYydnPupJ(1@B5e??ioBuWy1g53zi{1$o-}Cphiwi~3UD zehFRjM)_$G`BresUmW2af4+`<9ztC!bG`=7{n38UQ{VkpKR@THgTYy4H8Wxvup;&Yu+V%XsA2B*o`yCdohR zyHzTl$g{q?g42E*OULQr=EC$^RLrjcSO z;dg`6{?ifrFM~7Ab+E(!uoK#m?KK6Q<2L&P+sl4w-EXfe)sAqE+Yf;=KaYbm{{1l? zvK?!bi(034gnXxV1gCxbC0U7+`zgn5@>Q_I{q$vU?x%kM=YIOU^Cw08GM?W=^1%Iz zCcmxBU*dt+P2) z^)UEXR9^Ta?vL#+Uso=EABFrY;Eb~;^20cH2WOo7DEH&E>tzxT;~cE=ew>HEKI5DT z&Ny!ZXPjRHXPoyd_v3t6xgV#^XZ$#yfqlmLJ~-p-D+XNg+x-x5#yMKKALmiZWy5?< z1ZTT{O1azd=&LiNo^K)?8>Ai6h zPDwobfYZ();IuOXocqxw;B5D+l>6;|opP75PVIghINSXW*yn!qI5^|^4LIX@O}QV> zpOyRZ`~#fvY|x`4pNwaBaK^#Wl z)~|%KAM$$Ka_pyjA`g_`OS$Bq=UKM?A^ZvVNBl^!`M+?s*UibdrN_ZL!CBuI!I_`m zfm7bjv&1jY7j{MdX=i_M+BpH7@~4AS-qtas{*>qaLX>|fV&^Gvw#&QVJpTSmxzx9} z`(yK*jRm+On^oYOgFgwrE%;O5dn=cE{SdqkoX3Sjl*{H6_s`-v!sG0hPAus+-*Yl1 zZ|5I=zui}aT@k(#@^-%O=l`TcI+bVsuLNg%-2_hgAA(cGrS&IU-<3Geb=>6tZ>{qmMb@o>NXR6^7Jm+SntP9^o_ID7@< z?{!~_Jt_Z6H_87wo@|VM!u;_5H|8gH|Jz}(!*%}equ+9!@b?iex>6+Wg=m+LfOGxu zU~sM<&Q>m)J={NQ-wVJS9JhWT`-l|T2se3Y3n|9!ICqD~`=nx3woW2nKkxpSooDoW zsTbFEZ5|@>FF^kHD(`c-&Pr`}zD0cq{U`kr;5rm){zk@&myc|DoWNKRz{IV!s}o@+*~#IbOf`Ippd0 z4aoEQ$X_D-18~~k1^JY!i=I!}cqQ%2{M&ftxBG{+A4>mcJKB1$ zZ^!Ph_U$yFKhtmQexy4i^1R=J{q0G}lm8r?$I~8CAy*_$9>;m#HRtED#wbNLoS*Ls z&iT2`!{uwv&j+Zy_~rb31UTnW$H4wsPRI7^Q#@|-bL&@ry9{@_Qv7zAo#KSEUCsq( zK9_@2KDIt!B`8hGg$@odXJZ~bO0eRZD^C{oH?T^Bl|Dwlni&O0IxWMb(zeGMC)i_0- z{HX}%`os0G^D5*SKhFzje+c#qavNu)-I+J8>(a07Un0-^Ul!>n*MZai9f*hae;46v z!CBu8BoJ3*bAkJ3{jF#_4tKgz{C2eK>3)0NnTjX!%qQo!)P-heXg7*)X0>BV4ZSN|6ow&j97pF0Aix zaOTtQ@ABnsJwZ6-xt<_%>F(}Vw>Xwp6$5#jg2SYhdlG}960M$ zg?6XktTAaLe?Bsl$!1E*h`w@W;5 z2%LVoe#`#$C&;tic^*o?8>4;M-?jp0f7?O1Y}nuWK%Rb&2WP$N!C9~72tV5Slj66# z^+TWAdW>*hmp6HF^C$Pm_LpH|+!f*M&vtzD+jm(aUAiB!KeJwTpRL$u|6JeWVVm{` z-|ywGC13D1vu;b0XXe&-H&`53D6Zk&(+}c+Yg+6dEJ5gg{|X>efG~! z!VcqU0Ox)&3!M9fw5b%?aKE@1^7MNjIP3L4;H=j(5q@UkwRFGuwaUxpR`<`2M@8p9 zoQE(!HlB<9=iMK(|2X1dz3jdek$(a5zf^gjzYb3OJ8QoZd2*hQ)9>Msr{7~D{1kB7 zZ&EJ(hxUu^7tcrRtOjpIelCn~yH7*%!13ff&6~u@{rU^a{k%N@dDe^9kC->RJ}Y*} ze;%>FG2*BFk41RwzOQP?Ge0{-{PqE7oP#3#U~snkH06>{u1DPs&Um<9!Q&3&W zJPvZ+%Q&BeJdeLW0q618&YL99JpS_j8T#Ep1YME#WxedWq2I4!*I#Tt>C11ESWoTC zH5WTR?hMZU$@_RYFYT@J5-#VZhrkZ^i+PY=?mk<57kk{|**{|Ez6d`7`Dc55D#B+( zc7VOJ8rtQD~&2!q|>m$z(ALZZ<0C|2LocrD1z!{I-_agS? zm}~o&z0bk-dnoo(9v3*?GM-;Ro}BXy#`#fk=!)Mi2ZOUeTmnw}Usf&~=FRR85&QJ} zcErv{aeqja`)v6+OS!0h*ZnhouE(waUG8z~XE%7<`cn^QQ;MGln-}@o|{XV8#+J)oEPr*4Z z+5Hb9PyQCO^NzD)G^0+m1AFb2B)3T;P0VdJq}Jgc0TCm?Uji9AdIW*pLX8r_kZ3O#Qke~9cM(I zD*O@PcJpFzPob`GPob}?olsvZ1W9t%LtJxk^cbk*m<{b)=T=56yeOzx4|hd&nQU|d7i(l1*g2sNu>Dk^uTeDekX!6 z4~vwGInK9ljmYzTvz*Vr0(l+>8zn$jWJAB#g452I!Pzdq1!w+0P%iPWbpNdXY^ui# z`I>p#2AuiXAIBHwVGQJX-tj4Lo_AaU&OGd_ClnG7&pY;2F7ZEu`0aehxb5eMc=Ds1 zjubl&GI`t2CwlTWzMSE4+izPvZpT^EllVDa{dZhSf1hqm(h8;X%>Rx{X@34YE~R<+ ze{o#;iR;@ou5w%w9vYW~hsGu0b?%=Oj!VLAeBrnxJTxu|w{b~_tCHiajNwvbyyEy@ zEzlL=9RE3A;ylXMbwr-y9@ix}AG7lqk*A&it{bQQKQ{0B@49iCpZ~5Kr+Ih-^C->_ z|2MB2zv%XP8;`hdEZoK;t{V%t@rCQg!fhPky0LH@r?_q`yxIMe!gXWep><>73*0{` zTsIazFQLw!F09CWQn-!(Hs2G@`x5h9AHUHlnVmz`kJusS^>Nzg`6JH@=BOQie756> z&tvzc^n)GRpB&+rg7dtF>%g>Q_domb`~`O2MSga}d8<6LZ+Wxl2PJQ^wrsp;eR=-Q zI4?jvsp5SxakA>6Dd5DMY@+dg-+!uLfeNRW8x!+v? zdA9GhkmvsUg$TFjq$GaY{~qL7uU|&|+H+5Se*OtN%;$z8=!&1WKFVc(WW8#^*}lhv zQ$F^5)0vRx`M%6WrO0ND`)B?6B9B{ty~g9#FS)<}Z|?t-T^*%JHQ2s(yb{j#vi|II z8*hC(v2p45;?xysU-ti_(68A4d7moBANF&`zZ`bhA0CbL!>1yg*ZXMyorwJnBmu7Y z$C1sz+23|lE}PffKkILMd))e)-H&AQ*577}Q&+?<#~GWC2;UmVsYPmE_*UQ&n-t;9 z8`s1C?qn=Zu_;C5ISEIkE zZJs6RAYTA^+F7Gq{4)Q$MEc2;2Gf2*x~ziY3FBSuK(w}i}~3Y{egUo2;V-!IWMIh zdwxga{{rIYd{urs&+^Rco{vJF_nXnaJ+CM2MSf-^&d)^nq6ohoT<)o`IPU^yzmhnl z$d<E=+JKRTT{^Q=x*{WYez-uJGPtr))n-7bT|1OP|)xAZt^>@px+a^$?u?oeoyWu zzk>_)XP49dM!uyCR&|`>si7>GiVPz4mcpdF{ zcWuJtd0p&Oa9$so3eM{h-%8CSc{l>sJ01r=68xjc1Lb87EJgCk-?O_W!XE)&=qhL9 z%roGZgP)^$5c~9N_eBV2oL`B^zYNYealR4ZTS(v<|Ix5x&%Mgmw7<8?OSSiK|IBaSh@FAp^6aq5e;l0s>N@a;oD-A3 zMY;Gr8vG8(kAeMrATRrfU03@7b`BFGu81AR!}}S&0(l;<>G!n6N?Kp~ZB#Dy z>31$T{o4Iqe!VV<*k24gwEuZc<)R{UMUgCNh}tCf9CisWr9{C*Mg+qusc|K=j-ifnkl(+kQ)ZH)V8 z^4~%KXFk8DT;$pAKZZQ>$^DM)KBR{;;ELE`oSy<;?7p=Ae5Y~=m-+lTWb;zFrdD=e@@@%iWz}a5+fwR3%>FFH0B7QkOOi?azGS4$0&pe+EdFJ_I zaOU~*;2ckm(}79+-tU64c7F<-{bYkpouDfcKig{vIO}zoae8)sL0+>SSIdfe_~v*+_9 z4{}ee<-y+1?DrFUu0%NZU-Kh&cz!oR>mi)yiN{5_JxA!0k5S^`e)k&eaKC#OocrB0aJD1Y891KbtMXDW zj^~enb39)I`#it<3pmdQ`y>C9{}MRIVa_u-PWI6D^7Fr~a>*O>Uk%RwAlG`N$cE$g zEXZ^IydWYkZ6rnfPC&nveN&2X`jvArDY9Yz`6}cY|AXMPvl5(f{s5fk5l<_Z4gJ0h zdHVeWIL|x&49@*!nyb4Msc)zLrd-rI^*8WN{SCZRe}jGYpTB^2>TeQ=E3%>dm%!QI zdSL#>{&cNiF7$?Ek|c z&;EQEIO}yR?66;*3VG(I5uA3;0%x3a!P%efeTLGn==Tc9)9+2-?9WTU*`MvXGwCku zCnuu6kxzDVQY0SEtG|%Ylyg3B=UF1pdHYi;FMh9cU)u4sH^xaGPq}`}eAYsq$Gd~U ze+m1Cf%AP($AWXen5bOh=lh`SxjBiSetDlcp z`M=B+ZGZWta*=-?{LkPofLl9?Jb6##jdtw4@e&8)mwVx)h@F$&m|)}ZmEb%++I!IaJI{SBJ7HAwu`OTO1-Xj ze@y?gBJ7IDUxGZ?aZ@-Ue#R;eUAC!yVi{W>3^Z6aX^R(m7R9^f(5Bu-H4#&L@Ax_RS z`Cf5yJ1+V5>tKiDm>q|uUi5406=H|uWHaoL+x%bTY2WrcKOVU^Qi|{Q|JHj^`bdC* zcxu7fuO@&qZnZg3Dd@#@Fme7~`sXZh{^2IN^^uD@}9{sQ_Bxr_-?{QBB?jnAbnA^E$( z*}gKynmptDgL2tC@BXy6qfW^D`tGh=$4I4I5%=t$UrK1&Ub64oJm4YaBG2_t&bzo@zW{mW^EcqkXD{7fq`vgK zC-x)y<#lTM{TSrwcN*-!>OQyk|42O6K2l$fC;!c7`d(A!^Yt#|a~tHJ{c{jF+i`k? z-w4kByc(Q#-U4So+yMROUDp|{pRm7io!t7H^xL<(kO$sB$@%=Ah?D(rFL35qhcOlPyXxGc6zFe={Sb!_C;d9#1(gas1g+^Dq5@@;3emr~F{ZGtNW6DPIlF@ol(r=_k)4{$s#j0RL2k zPXni&OO;Ff+^SzIi$1c|5uW@;4&>J0tvS;I#h}aMnwXO;V&@ z^viLHdD~P1cSSbj+kn&lK;^!Dd6rp<@K*QP`r%Y?#&Z@p{w>ho7(b8Wj6Zf9KL&QTL!NmaEp2W2=W&*t z>m-i-wTkx z0(Qu4z9;gu&-++t-_~P&`L`qSd`JXckq!OE#?Kuf&v*tX_v6D_-BJt z{sQH)*}(lVJK|4@Y)Qy<^G7?b$=AG};YG+Z9@%H5 z$cFK}0eQyrcW}nDpC0h!YmRRpi|`RxALH>??#YxQb~bi@tY59~aqLTp*VOM^=hynl z|CiROHu-Npll`%~*8R3XK6{}5%y519y>waY-*!BAqE+N}oE84O`?F5vt6}F%*s*a^ zQ?wn-3JvV8{ua~+7xQqWE; z{x;Y#-{s<;3wg$G?^-t-vMpz4Uc}C9aI;m;j{SzX$TFVRh@Ds-K2uQsyn^xz3d-BH z7|VfdB@dT6J62Ej!;4{Gp81j@@)v;jO=!yP9r%KVg3p1x;>1oYZ}!f7la+0`_Ofe9 zB4_mw`AZ^xWBbvSkf$BHr&{b=5&Nh-+WBnK(z!@j^U&eVJ^Fk_{JaJG)$*k)(!M*uPTz#4d`ED$dvEZe zklzV>IQY)sW59O-9|yiG_(|Y5A^yqWyFq?BxZOh{Xg2t0$j<|}-$D|!0NkE|60{J! z8g>?e?+Jbr_+H>k!1o4U2HppJ1^7PT4}$Ltz7pKdwFRvL?+f{7!S@G$3H(gte>M04 zkbe#QBj9Vn4+LKa-VZ$KnC?62pZ&q@`4QnW5s%%!A-oCPo_`enQP`;#;EHUTA>S8# z7Pwt!k*{lD$F6?~uLU0tJ9Xe=zz2Yj10M)(&l$D{&w`JH{7c~Wn`k1x8vHEu6ZuYxd_51mTA(X}fU9`@1#Xjf3YomD30gT-KZuQu z4Z7`Ya9djtbTPQTVkaRsE{UC?S2@sV{0bD?Y?W_y##1E8usm4hI};{+^%g2 zZv?k@st8{IzMTLqc3oBc+A}Ni)#o8^YdFGf{a@sF6rkl{$oDqrw$?vI-tN(pujSrs zDZ=fVp#1+e@ZAJxk$Wwqh`c?kBLD9tz!llZdaRY5!1pxhwxhuJ0zVpjZ*bdZBYrBRf zU)h)`yuSb~_P$WzA2sN%I3H~JbDDaJR5EuE;;9Gzn20k2o4ER{^BfuAc9}a#wxX4>f_Pz^==P1bE1^J`F zp9QyjW8~|X!H0;fuLnOK{5J3tz+V8L2>wg(6Ty4x zK~&;D34B-Zlfi4iKM6hz+>Z6~^=$A{AU_{m0b`-U#{Iz-NHp1AZp> z{opgfSA#c!zYg9Ee&D9*eNOvH6!_WTM}v#J9XqFj+r7b})&%|;*jWL7F8D*>=Yc;9em?li z;0wUlfnNx|flgkfz88T{2EPEj5nSY}^}CC~FNOTo;Fp2(J%N{i|IL%PIb5$TQXz@+ z3drvSekJ%k@XNt302g_)|9SAwLjDf$Yrr?!GX0Olb2a!D;39AK`+_fqd@cC3;N!rr z13wx3dhmJRH-KLNek1tP;GYBkDfms`yKa^KN9uc&`)Bj)eZX&q{7i5;?yub-{c;ZY zEs$Rc{(0~x!EXcar6)xa&#mA)fs6b;`rSbAFGBuc@Fn1ZPWiq{NDuM8vH)++2G#-pAY^3_$%P|gTD$c z@_X5L+oc~Qo^Km-+fBf~13nY{A@DiiB5(E=fjAr1S;vz+^e*^imz<&$=F!*ZlAApOz9baAne--ktg8v?TyPeYiNc?NScLNvsLHgZ5 z@Yf-KF!&qbGr?a2p93!P1NFPBz~6-Y4d8EquLS=S_>{O0;yAMk%dz90B|;A6o50X`mF@Nl12KJYOZwtN(+^#8z{pY|%-t4ad-vM^s0^bq5=Wb#x&Hwh`TZ4k*;39AK zr-Ju~ohI;)f-eNOYgl4`F}TQ^{iWdcjvA3)4n6?(SAo}pKL;-IW`7O%V937(Ztpk} zzdiSmziIvlL4Ip+kvIE&zz>3aKX7}7UF?nl9|rmH;39AKr-B~>`6lpBfG-5McN&Y| z#o!`u_LqW>fSu*wBf(dJ9}4~)xX7FRHQ z;735dANY~rW5CCPj|Ufdvp*Hwo}sI9r3w64*jWf}*JMS0F}TQ^{iWc?!On8<3E->1 z$AdoyF7jr74Y)lER^`fD;3vXP&pqYaH2?POzx;n|aFI9reZWs~+)6+2PlAsDKN);H zxX7FRso?gElK5x>pXB7NECfFdd@;DloBgHWr$c@@_!RI};Pv3ofs4G^Ujsf3@^68k z0p4@3v?enDYyjUHT;$DuAMhEF?+1P+_!#g;@bTaxZ}z8xH$%P&d=~gZ@FwuZ;39AK zmx8xIemQt6_$u(Tz@Gybd9%L;d@khQ0zVtP=iVLpp98)%xX7FRKH%p-z90Cf!N-8l z2OkeE@@9W3_<4|T0zV&oA^5rAi@`@Nks5c12xF9Kf$egXJ%;39AK*MMIN`M1C? z1Mk_VBmb9xZw)T;X1@>k6_D=-ekJ%A@XNu+gNwY`p9=n2$Txvs1HKUaYVgJ2B5(GW zf?o^y<>1$WuL55T{v5c-oBcK5H$wg`@Xvww+@~Y|H-K*qF7jr-5BM#R?+1P>_!#h; z!N-G(yxE@${sqW4fqxNvA^2_Ji@`@NlX66BYIe;Irg`0e1&fs4G^Uju$8+7{|)jaTbA%6k*-@#Xc{|)>}aFN%`PgSeI{|Wim!QTV#{n3s*`~!SXaFMs`J43<$ z1^Gk4{|!D5`~&a{z(szP=Km(}4L4NiHn)S@J6Mu$Yf>2z-2n2NfQ!8KpFZIB&NQ*m z5B$ThGZ}ni@J4WvH~R~~H--G=;G2QJ2EGaSU%*A)>~CJ%QQs{gzdiU?;BDYrfS(I4 z@@D@g@J{a~=-)cOsjdF>s{XBQE$Mc;eQIl%*H+bkYJFRMRsYjlTdVpD=s)R{V~!j! zd&iBJ}-jnb@Xw^Oqew2(3Y0^`D5Lu+Pb7d_N9;^6WZ#Vr`ESjJ#^;G zSySrUX0?nSEn2mc#*UjiVZfx(qdVs$?s?FJhPJU&M;~{jGdpZ->#PZFEsf1**ShSV*wWb6P;vSPxbz=2tF?80Vn(vx(lE2Wz3-HCj+&szkcssz zjrGlKY2P_x%9KeB^QJV+Zky!#=*$M`gkq?(REeMVuM;1cM#7QQ4w^8%zNKO6xW;)6 zGe^0dp?pXY@sij|<;n&b5id16Fp0ChMR|oL}I1W*c8|`hmCOi=$R85&uJLl)PHt;OI!aMuV*H^M(v zzleOP;W{;(3~sT`GElmGZOy2L`gEXkqkY+`C;NDpEtdvcTC4IMC?cO}cxu7)ntZ8Y zzc^pWVmas2e= z+QE~OVYzldXO-IE5bsOH!YyMsQRx(M#__FoP*MqrXHxzPOj`QY+PdizZ>Zw~d& zG(nwrvS^*#=i#+O-8AvI!$+JrtL02Ly__(+eo8|+=d2y*a57h)Fu%2}p~=lWqi!*= zFJ!PZgPzljCJ9QH8qIas$#7M`Mn?d1nrAki*)Vgy%}r}_Ss8j*OGASkUfm(p4hkJM zb(&kbsc0+yr-REl8088lwNaWKzh{)+8-voBMh73-+S+(Vv)f(V;k(S<;aT_8O5OO! z`H|)K`LKAl*^CbFn@z=Ym@S{`60?bTrEoVeCaXxci)SUF(k)Ew#*Wtf}LdD`Lc zpk-VS9o;-NwJC%81=|{Pa0Zr#II(&a61!buQl>Rw~YP88a2+xQw;D z*&Te0%S=PdvD1!hn1A-HmZ{~Z!)5l3prKCVR@Ov*plhgO+`6VllC1jG4moV>@e{_l z#lwacb~gTIP3UYCS-f3)^R(I)%e5v&{6ZYgP*cX>-j9g=d)Y5VLJ|1ekwR zs~yrl+Ph9Ub*ikq798xu7K-m%-4Kf8$RDE9C1L+)Tv;zEWWSQ;sFP&+HK?#*GHn%a zqD+$=b=KK?yg%0tbB$GUlu27_a0w5OKp8_tK@SCjudD5JaAFHpkkz=cl8|I#m@I~- zS4qZBk!vvn+*Om2Zk=A&w_}%QGUmZuw%ieHf$?XUOQaoUn8prcIeJpWM)9Vo%?>Aj z-Rf!(SH<&}sFC8e%M(z6>PfeCD@wB)TH5B1uDE`2D-~2QZmgp}6{z80SHon@wCmN( zFjYZaGc0ygSa%@3oIAa;;US-PiBo^PY7_4@-9A_qG+P>G?V)qpW{sQG*zC@C)RSeOGO6RMetD#GaE$HUH*2L!7~Qh_26rLSE&3_NB34J=8Km?3M`og z_N?NTyo)&bhmgp!U3^+peyuP|ucRN~9**?t&ji;~lWV)JNe>R)#!y!0TMKl&^vX}iZ8gP>mW1dJutg?>$))W9$26QRr+l$+ zyUjsn=(z{+isG)!`uYgEDSxsn2-;aM4Z2%L=t0Ldv^KPr?KA7iUq{9AkHGGt!Z^9L ztajkh4Q=%ud$C&q=rEUgj#0)+Y{!X@)n$y8goNR?z!+KU)+t-(v^1R1+<4ZUsEFSyvC9_e_=Cqbx4KhxSB=_9 z?n-X$q^AB;+^xQCv)w6t|C;y(`1R{9)&bV9*LZT{dsuC)yIRt|%a`7+++j2GXp&_r zmXz)Y&hJfSY}On)wS8?aU6>6Vf(ji*Yjc{cAOSfo7igvO=RxtjrFtEX3S@k+T-=g- zmZJSEX$QNvyVxA2wz%~Q+M&3UiZWH}GPPckRLF1z`6*<-qSOp_<5c-hRBWHkW3Pfl zZp9PZ_%8q@xP?$AP*5GX3hf$X)T`dO16>+Q$dBoM9EHr`%3~ zdR98eEMumET9&a^QDe$ArIHJp6*pZ>vC^eUwySaC+s~&IX#s9XTbw9u*XhnRLq<=`67eXF_G}%g|W5$xF*D zdA8H;S3b(E4$0$;?g4=L$)lZVP4GCPOOre$THC+Y9Xu=59m)f*KTPI|A>LFu)jP)? zAL|E=oGItLb2}>C{ve|tc(xH%JM-koJjbh=%VB#PW!$DVcx>yjvm4wkt{FAWYsRZ< zeznl>m0!D~T{Co&C4+JGZPUA2V;Cw{=T3?h)Vh;?N4?A63^Xul6uUMROFk z5$ZpchSPo=D!*g8r_kiR4;|-xS;wQI=Df@lR}UqnxRs7Rlc76I^5H+Q*TtlSZ5GQ+ z%ti(2iJ8iqqq-W&QOOBb*OC-7S}03#BgNAcx0N?fwSy&3ayLlFBNtseSOp9g%1(L(u&MOI0U;WySnb&gOV_2Qsdlk$(wSz)Vs9?IbBtf{oJN2PJeC>x$|F}^!<_x zcWDEZzWk?3bGxL-?B1_#oDl-=?Yq?poiS~ADZO9{Kd)cY=q+einT-~_A6+PO5EgblXPya zS2mNE9|VqR-F<1ZwodTOqSw{C5( z&?UR|-&`TD-QQYaFYBqX!p^$2t%BF?)_-FK-FAO#Mck~X=8Aah{`T^(dTOdzemvC*^5I#?UH`h|+@bxV`jK6~svfdfEE{196(l8WsN&po{pz|OQ1R>Q zVGG@m8x1Arb;4Rdj;>#24_WM5zp402dnA-fbJO*!?S4STueXOSbVI)>c+K69qw81Q zLl(Q%Zz{g>9tkCHze#Qs^e=UE@t_p8Su8&>8x{1Pn5o=j@&LJKtK)J(7qjDAE0&j1 z?FuqdYNX7|9rC;>B6+o?d!a<>1C%kD%dMJ0*hT;^%lSXV13k$J;8t5LOy@^?X^1hwm(Uvd*4#>%Mr)9 zhn4G_&zRXTwsG`mcNb$9e|fJ0PqB{rpQ~E@4HC6=?jD(rT|7-)t`1e^)g|l6UB^zA zJe-{V?C6k@^~rO5!DrCj9ugD{ckhU3$q%prLciVFwcgrQSB2kI zU&vue{xW~}pnL=7RPS)>k8b7mlo1VQG&bAMFBJTdsybge)~b~SkiQyrgOW(_pnt`0 z0xNH+cm;EZR-m>uNo~9KbCPvYBNfy!YO9hyIUu#>&zdW3(LCmgS2>T>iYi~5v~9^< zOcmEYkG%@2pT}$^^{-3E6#Mb2N~>MYO!3;5vsO_h2k5}r)t`APXQzT{mNQpTJ%^^l za;JCiR@|hS#ww_Brp=0~Jut0y$KB19zMZkGp$e*7)?Ou5tsRzBH9ZtnSj(u5;uVaV zs-$jpY2EzeP=&S3VXb(5a~Q3p=6Y}|IS5r)^*rW^*FBHbN-AHMj)EO$s}KHdxQ4Q1KuA?O@KJ=6|R6#w<+N-FlLjp(IN}DvxRs|K# zGFefb?etS;QI%G=jF}2*TE<#OC0pC-TiWK#?my}9qmCVM=uwjZkgya{}hK-!n+*aS{Rx9nT4avKDT~Kaa*}by&_^|;oyUw9D zYTa`zEpDZ=-PG7=qsv;0DP-E6TGVc;P-1sneM|k!nGG}Dt;|yzT3a)MEtNjKwbfo{ z+_e|j51rQ1&~Q{^Ynuz9jM2isG*@c(@QF!7c1O6grkvRxZp3Vb0n_q&2{&l8OTo4; z4C~I2t_+v$Q5_h!Pw++}kz}ACX>I zn%~;i&?KqxW2{MTrb&d#X0Fx~^z95t>>S=OtEr*QyJn3}w$BzeVaS$iRA-(ubiFUj#L z+|s#C_`U}w_0SjgyN;h+Lo2MI4ty{zE8;VnzN zbkNDvC>dC?G(tm1mQL<*Aj?pJT{_E@x94Vvb0^IZUH?0+*Rjg)BI#~8rL|3N*J%Gw z?O^_Ipg%sP9!8z$ex`L=|4Eb1m^W|I?1q-sS8s(|XI zs;agQm>RCEr*7~2P*v6R4Xdg)(*N5wrawmIdO`o#0{SPZ9{rzLK!0*Te`W#w=>h$w z0{YfIjK8^n{=9(ySq1bL1oUSY&|etPKdXTLBGunjx6*&c70|yYpg+EV{;GifaRv0( z1oS5q(68DcHNg5GUqF9X)$gNmNd8VJpg&yox&Pf%K!037|JDNflLPgiSU~?X0sRvT z=-(93KdFHJeS!MlT|oc)0ski#&|j_kZ2waV=x^j?rLg_)FQC6&K>w2k^!unj`~Rs0 z^oIxhpH@I$#u~r=pDLg~IiNqOfWC~iQdobnX~#|5#*Uv?1^m|+(Eofu|MUX-_XPB( z6wrS-p#Qf5`cDV+-z}j3NPj{ z^gkcapH?9LdsKhBv>R5*{Nwln{#OS4pHaa7v#QVev$TozTieF^?@Ow`IpS|BpuZ;I ze^vqgHv|4>7tmi9@ZVBE-x9_8w-(UfTocUvw-wOePW9=3P67Sufd3l{^q;-~{TB-8 z*97#>ED-4BTa zpUVsAZ?5_rf37H?-#g&{$^!b;0sk_m)3mg2WBc!c0smJQ&>tA^|Jefi!vp@WDWE?l z;D1p8{o@1v7Z=b!HQ@i+0{YVf{;w;bKRe+6`U3i&3FzNe;P|~Tpnq`z{p$nzR~OJ< z63~}5g}nX$o`C+z1@iY`K>ykT{=Xm4UtB={*?|6M3h2KQ(EoY?{nrBe-zcE}PC$QY z0sX2T>G;j@cWwdw%>(+c70~Y;(En2b{XPNxIRX7$Ts38>R>jjwyT3I)&~J2Ew_R>e z_eq%R+MP;X{r#Ml93v~$KhWtW@w>XQnE!1E-Dg{mGJK@_5Yiu~_1A7>;wAcx5&g-k zziGQ>`oZ^qcSL`->VG&x|J8{8f}H**xypy?zbI$@zYx)1l2iW=5&ac8u zs-KlVxh5Rae^&Lk%*em3DcgF#iBH}>?U20{+~+#@IqtK~2aR7D@xNOA+xolN_507I zPG62mzW;gZzXtw46YzhB`rj}O*W6USul{ZPvo9o9EYC*b@1=>~hr;f&AO8;{@h{W( z$Ed#K?|k>!&)*x7_y?(fJ6>BDe*D`zyP@_UuKHQ|w>4cq|7!#Jzc3L0Q1$QU|5Wv# zm48`N48=b?Xa3J{`l0?)y@N}vE6o2Tf%s)kE&l!ZZ^)Vd$0G4B$(jF0Bk@ny_}Tv# z2IBu9692fpXetl8(dw2$htNtV}EC0ulg>GPNkRX%lweV&;L;~%X4{o}{UTcuvJ;%|<`KU?+Xo*x!J z{>DiBJ$FqN?LHKV|0~XrAOAIx_@C07LM1mWe*bwQ692QR{}h$oXFvY$MdF{gdm8^T z)tC71cAuSiQmp@f$c@tylb`=v^u%=smA8!_|2Wn6`~M2n&x-#@ryuG+)q9l2zuX1k z$N%X_{O4?&Mw}J@1CjU_ss8O&aozg)zc&*9Dvf`o>Ph}rxX*t4KaRv-t2Yk#{`~x} zi^M-p^&eILw(;$~9f^Nob(;T|5dSv=@$cl0Gok*o<@Tv!R{oDveZT+IsD4)bhdKRF z|CzjJY5X!5@$)|=691pnf7bYORV4l@t@z`bKil~Ezbq2}(7n?5*Q%oQpN9hRFOS6k zxcbkE|JRZDSF8R8UWfDJ|9K?-zI&I(|8OAw4^CI8HwP+e_KSq$4>d`e|toK8`amtcxuf3_0m!G zyz2Y;t5*FldJ2B~KjZX6`K#V1ZU3Rj-}eLg>+KRGB7Xk9yK@?HR{YJX@5leF>fe?T zf1}e6#edSiY5aB{x3vEgf%s*f7mB}07jE3}+NpTqR6Q1ne}U@%+WBSi^Z#fh{$=~6 z@zbe}`ade& zwEy+ne~???P4ed%Sfcv>c79p>_-mYgsQ-@Xml~X``V#+7oFPAdP3qs@|Gv0i>eW@R zQ}N^fRwVuvs&CH$m=QnzZ$#o>R+Gj*9r^#MGvdepQY8MV`==hW;@`}jCxr69K=tMN z0*fDi52qi>f3LbUevW@Km-6Eutp5G{@BWe0YgYU%k@#y=|BoML^rhzyO_BJ=3`pab z^E)Zhe}3V%e*8B?;@@RJqE>aFmp|{nRZm9ZA2%@7pYJL7`Tu?-{*ykI#$T=a692CP z@xK{~|H(nA|E%%5+65#o{NvAR)xRJk{#~4YsQ=9ScxnInO(6b}>fi4_^+VG5#Wsr< zPF0J=Pa*etw(9%!cjBGOJrVr{s_*w-U;ovJ{%2KxpHALN*ZEdE{Um>$+=_$K{7qIa z?f-lC+3&x#?mRnbKTm(9`adQ$)Bdd=|A9_F8Aa!-+m88;vcU1S^57UqJNC)`}OtXTo8b^ ztN#t19*ZB(F-|{}|C`i*U*!K!0sptEf4^R*ADnvqIGwxCe*XU)iGPXeyWyo%@#Fuf zTW1K>e??CHrilJZ)z6xLO?UdC{H+|3W@MR0FYWiX`|P*hBN6|-4oMa7@)GOU|G|j= z=_6A`&cFT^@c(c1@42aZXn5*BYyNe#TPF$Szt^Fu{sHNx{jVSY6{_$1KS=f6^tw|K zUo0<0{Et)pBRs>t|L2{4sQqe2r;6*;p|syWonycK4%j}ezvrgvmXT?c)eP2s_T#@= z^?P`7D^B8=FQn zS+ghk|4<{>5XGU54_TS0rhw`^V{qy*_alrp4)xYPa>X@;q*L~^SefINr zS0w%gs^8!#`0+1|#NYF%G$Qt2SxfTU|AR>UuO5*GUY!yD>294#LhRwm^*AyGe!PC3 zPILO9{IApaYt*i^|7L;sABgy`R{uLYJr+Nndn5k)9-T(ITJtadw+Q(Em-_eXbT;cjruR#3wsDD5H9mXZY>j`JDoXr21mb_k;`j7xHE~(-PuL}#|3g&Y9iBQB&rQ`aPCu0Y z-tw{zS87yS;@>F{|B{IR$?AV&&!L~cTO4);ST3%M-3iG#nApUbB{#U5~OT3Et`I{H<-%DP0 z;tJ0{sssKXQU9KsszDPI^(tLPOaJ5k`uW>(w{ZSWRsF2|ZQ}Gp`5SsdY5w*O#D7}E z{{r=YiWjh-zmp>Vr>lQCW=fI%w@<+T7u3I>zn`C&>Sg6`Z6y8;PfGQ(^7qF`{Ie&P z=C5xc{!zP!+pk*vXXWn`PCwLsOVmH}cR;}Z73$y5-#I7e%inJ-e$T)P)z@iEYRvuh z+y51d-_u`qVrl;R1>)b<-Js)e$@Qaus(+hrSpXu-GEw#Y^}AlDq*7VOpYcvV$-fu> zOBz3qKQ)2)Z;!-(yZX;M{(KOLe}(GnG_JkMe*V`*;$NT>Z{GhhAQ1m))#3cVe`@N| zO>a9DKmX5EYybE1SAANlcDBd;_@8w8q5QAa8-Et6zKkD(1M&CYGaUctCZ+z};jL5g zM`S>soKrym+W=E=)~T&YpJlE05R z=e9rDys#!$V{rmCXJ}nJ9YyW*968{R-|5m5km-hdABk|9Z2YX!M@ndWt{>|M2kEFT0G(plA_`hNdep!!+yH#z-K{;TC>L9Q_VqXO}NKNA1o>4|z~{QK=2 z=|8IfEw93U|JlpwhvHwQ@xPRYk<34j4a7fR{rmavF(XyXI{v*9iN9L)^)jGFQQCig z7KwjJLz;iCpB)#7f4G|rTZBr)u2(;r(y2>aXz>{P>S_`l0w=YD@#-`uS;r`0r5ve*YbHRvNb3JvtRHoT|+Z z2=|{Es-HD~>f!W5{kNCAY}b_<^)C6J9Ektqi2nuZ|Jz=`e*TV+_#dwRnZMHm{%=s6bOYG=P=#qa5_mX|HNvP|`*|IG-* zKk&dbfBydSy87Q-^=%`$X1QJU{rtbH`ok&gK6_zSectJZ^1o1C_Uy{aFN=1imj*2Pn-%bXk^1-R^|ChH@pSG!`}zA< zB>w*Aq>9&h`o5okMB+c`tW=Wyw6zkdGy9Etxm)t}m~nSSv7yb+0i)!bCFS{+LKX9wax@}uGW zjk_rIciqOF1Mu^An9~pC?=@ZcSmyjn5&v>8oIn2Etp5Fa{cd5ZcSgEt|Lf;(T`c~~ zQyejoy-5z=R!H>UQ_5J<-DAjNB z^nE|4I{i@oC!d!}u2p@B|NKDwt0Mkas{gaSz?*QbGJSxV=Zg=`g{?c@H*p`=V zxw1@&#Q)hq{QtK2J^jX|sp96UZyP`U#(`=5{q~=$`rDhLZap_uQ=NXO{g-L{Zg@zF z#J@NY|FTlr=kGPu z&&uCXPCt~tn?9RH#QfbDi2wG8|0?acvgX6$=kN0o|EtvhN>!HjyD8xRck18I-?3jw z72Wi%Q}M#78az0hzt5=th)&w2^KbVsRtDmw)_wQT=;vswUi>R{UVE{(k;yhJ^FCNcBf}`o5o!IQ>xnTX=0M$^0z| z#D8hT|7!KGk72Y&;pgvyi2oW*{3@-m^uI3!{6C}q{d#S?Jazf;cF*YtKY#lT)%`V`nYmBfEXApY~!zkmL^0xys_lKiKJq z@?Ujh8vhD)DDi(a5dRI4_^-S_^*Wx;-Df}k_f+3aLpqgLRDX|7v_s$Q3^^!ezJArW zQbl)q*Qwa}Vfyn_-#>o$SN-KCs8+oHR<%0)(Eh*Tb7}rKen~FPzqRXq>OYn42=x~a zq@VrxegAJq>c7c@slHz?)3`l6>;xnGx|nRQ->Ef4LUq`~RZ)_v_x4aqth3fnL?;O?tunFqc z^liI~8(`(LpZ^PU=6?sLAIkrNK>lSd)UW?1BmS4<%>TrQ{}qA!KOFFXwfgt-|NETz z|Do#p`TwWtZ<3M!E!+ell>dz$N)`S7=EvF7>4);aE|C9~f%+dC@n5a}v-nNI3rsa^`NBl1d4_+J#r{|f>C z@2G!2|1aju|0fO&=l_kI`M*l_{rvwcXZ|m9`l0;46v+Qef%?B3@!#t^RY}R}|1U)R z_mr32yTbAR=K=q{N2K}l^FLAjXZ8Ons_&0KGgN=8B#MqdE`+4m_N%Jz=l>kl&+7ko zI{i@o$7%i9|K(l^fBbzr;(t-j{QoK9e?cJss{{V~jST1i#hm$XReeAIZ)E6O{^dDM z`RwQaUpe#t9j714|EfU#@Mlr#VRoqovwZ1vCa=golsR`u`a|HYj7|E}u$`F}(8xAyX4dAIE*u7k;EKmYIN z%>PDCKUDt*1NmPYsQ-kB|6Y%zfxE9e6~8|m6Y>9AApd_2_`gQ|`}v=!{E{;d)Ji*n|_IpTk^`e*-N z7x4d0_3zi~#hm&7x9a=(e?#?S>z|hY<6VIAxrf(I>vHD*Sf?M#|FS^--w)LPu899$ zkEQ{+?$xRI{b6au|4V`V|102st@`)#KT-W>_5YD$)BO4QpP~AGyq0&{-l+P1{?Cc% z`*ALI`l0++FDdQ+vc}v~v)Nm>uSfhZ%9;N)5&z@Vze{gYWc_cWfdBqSr1|sf^_5Yu#zMuaYs=uivUbmKa+m1XcT>m!J_xB$^&O@AjsQ$ff zPbF*Auk^ny1NHxU#Q&n4`M*2jf4KT*|Cf6S{rzu?qa*!4Xa3JteLw$isQzXd`Cp^@ ze*b?rXa0Zf^h5by7|8#2f%=a>CfxqLR;Gbx_5Y)se#rlWf&A|f@V`R+yRSNxi7V6p zX7&GFj!onD^FKrNv(A4nQ++@G=cs;G|G&`bhw5MTrL;!u|2qfj|8~UxBK4n@|35|i z*QkH?|6K$A$B&EjfAyc0|L>^2pZ_-^`Ll7ywtd|NO8M;P|DO?kzn|>w^h5cd7s!8g zp#C>R{P+4F7nCbm`Cki?f}`l0-f z(fYIhj|$ZP)rkM$>OZUhua5Yi7s&r%0sqw}hx31_`p@eBXQ;lP|65f5!x{bmG1d3; z|0UJW%KxKIef zT>WR|e`>`4boI~i=eU6Xd(^+5|4Vb`|2@_B^M6Yuf0lRKo^Wb7|9409{W!-t{ZRf_ z1oA&IQ2(z-{IATJ|GOjpR|oPh_k#NS-+SucuUC)9^Y#A;r=|Jx^S`s|Z=ccszoq&; zJh>Xx&+7l*aQdPA_x(y*BliDO1NGnOQ{na>uKo}6;_~C!&gqBzpQQfT|34M*->m-q z{9mg6v&NqvtG=KATU0+Q{{tq4>%T(v{rdWG_ILWB`Y#FO|MWop+AXCsM~*`9F4Yr2nga*7$$F>ihMtQGLI@ew-_ueklLF zm!*<5X*H7b-|2z+?@}Mm|8Vu6mH!=_e#rkA_0Rr4BjCSP{rmO0G-v*QrurrQU-h@r z`rBp${b1W8P7l}r?wt7_?es(SUlhoHbD;i@MEtMJng0hP{#OR_KRe)muPJH$-B+DT zk5%b^v-eT0r8Q#zZwu7_ixL0B z)qht1za`>-sQMqH^_S~EbN>%}-vS?1as7YqK9Wrc+yoJVqOKS;2x?+c6QQ~b3Eahv z#s`WI6a^y4v#>?BMOziEVjw{99jGD|AJmFwT^{iTh?e}n zXCAwEZ|;)#Xn+0xKI~`b&fK|o=A1cm=FH5QGjko__nG8O|C`tL`2C;Hbo(Eoae@=vI8uKz{>zccz@iS$nJS2)oB1_$`h2>5uE z^2>OU-*!g-Bd_K7+v$IVNPk#LuKZn!lKfvM(r4J-J6WXfjQ%$vy;J%3Inckxq5M13 zzz+!cozcHF4gA92bBgMsT*Uv29pLMeIW6q;zqyO_e@vve)Biq^zO(hmqo;8AcKSao z(sxGxzDVyx|5>8^R{3+YL;0g=;5Q2RozZ_u8u-f`=)c4P{w@LEPXCOTc*S+b|Ce9K z>1U_^5h8t#jjtu&OaEn&-cJAHMf%R@zaHtG=-=u<|DQXQf9O=_`VR>Bozeevq<4a! z{|8P{EC17$Y@eV$2U{C}SV{I3LjJN<9& zBK@zOnTG$nNdLD)dOQC=+C}3_UPpKD8R$FmCQoyxz#f&R24W2gTM zY2XJ0{Lc9Q*);I?InbX}a(4LM*_?j%a@{Q8cP9TY5$Wyn=RT3Xn~i=_?o0oEk={=K zhr3AsyOG|B{((R85)}#fH2$M5*VKh;L(BSiYn^gq8A>Fx9{66rhR{|AxYiT*1c=)c0D{5#XY4+!|3@qcR?_^l4~ zf5HL&i4kY|-`qv|&k^bE^uJG}?_;YM$@kJ7C$@7x1n8ztREzNCBT?nA~#atHc9=TQCubDilwUcm2+|NThsME@-g^k3xw{~7_` zPXC9yNdG^G^mh6`E7JGtg#LTdlz(#<>Hle(^7|j-C9?AW8i(=+=Q-2At&8*@hV)MK zuN3gD{J+)#{*3~@o&Kl4&I#8U|2K>DcKVMN={uu;&-u>fuM+7y$JH1Ib#(ElX|`1c9;cKWaHBK`j<(%b3(b|>kj{3-gWGyQjUk^X~_ z-iiLX)Y;-^<^R_l%D*rTe5Hl+UuX26p9X$Fz_;>$iv#@U1bjRFM+*3z@qgy^oPKut zUnbJ`;KfK>CEcZeu1Ih1|0av{xrvlKV8=6r^iK3&;z0j59Lj%J8u&E=erNP=NCSVR z1N}EUz<*7^x0h?ZfZrMY^A`yIwPmnPq@Rp&xAkYI=V3_C=x0l>JkBGm=ePYGQTFlk zj|6;|ExrB*hgxO@j`LGq$B!mcfh~$Mp6GZIJXM; zHu81g{})7hJOAG&(%bn$mS6fiMEVRH0hfvNS+;n4`9DT_R)4nl#)|USSokOAQ2uT= zIrIM`J2*i~ZFG@%%jlsZy&eBHk-mp5fgS(Tk=_aaEseZDjRFwW-wp@-=cmE{z)qg9 zv-(?~2LIe$JpDtq3bf8t3%A zM8g|zeHmeU`iw<9y}kZwMEVt=yY*);zl!uu_2+Bm<<~`es=v=2%3mtr+vRW3R~%}- z6*$7G?S7%e-xjZn^mOLB^~bSF#>_{0hJP}Og(_*Vi=Pm~%>HJN1O82E;J55&$(6QF z`ma@K;QLzHG6me_Q;cDu43?Tf804*+}n1 zzxkW^o8v`#s{gMMCHsF_ulFE5L9#V7^m`os&uj?W`S12L@V5x~lSO)h|1Ssl?+EyK zl=8cdK30$4pp@8-{C8@tGyZpr^mcsha85#cC;A0wu!~=jfKT|-w+!v{t4RZYg@8|I zrdWS=d={jEKTE);GpFfC@Ldk@8wGrOxgPNHgnpJfd9k6RUj)j;|d~4$?c( z&qsrG{H*lzI^aJg4g3}XpU%9o{_OZnOas3}z_<3lnGW#(Ea2PA^=u{we1sJ^!Zvi2 z9`(-jdm~MHJDe<}ccS0QxA>d7fKTU77}dtAI~B1NssCJO}v81blnB{2Hg!IXrpdYNy}lY4D#W(jT5k$pdyc zyVBslk|t~TS=(AAL?a$>2 z?fs_>9c618{QKweH#?)><}~>G-tS1iz7F^oFL9<{K)~;eeuI(TiGC#lzLkDQI>7&_ zfN!VY?|XKQew)(Zze%L;jDD}C!GA1Gwr%`(v;+PHhBN)z1pKpY6>jIhW02m7eoF-W zEes3Ze*F&cCkyy?`km5?11=QlrDsD&c|HyPV@3J_GNJJ8a8{&+>3ysi9p`rVrb|1U&( zJHB=}cc#I==tKTyk%fMR4*0jFfuGxlW14LPXvZg>2L5;f-#Y#~(E)y`$?MMsMmeG{ zhkr~b^t(f(&#=9Brbs{B7H@}hE7CjF|2|Uo;I~|)r}{t10snX!_%#B)*ak0h>G=J` zkJ7+j_7R6~<-b!L;Ggz$XZju2kJInR3CKKP=f4J#-cG;qBK=5PdOQ70q<5lUE-8!f zv(oQW2mJq$2L1{G{}~%VJO90t2L4I`f14;U)!z^Y_ytjC`b{~8Ck)%lZ>QgUk={FCTLk?2PUyEL4g3uPzIFUu>Hyz&t26z^^yif7 zZ2WSWNN=a#4I;h0zHP-(#vr{D{d~JR(r=gp{*R`C-yq;$fHc;h9iQK&fnOrv7Yc-l z|ITuN-zMPO%k{y4uF-cYk1N?so_;&jJ?1Zk-ue8CLeou(>ozZUy(mT;_#it$VH_`!rBMtl(0lzc) z)un;IO~AL(k94U%!OT*B_OgI)r{9?ayGFmG|HqkrvqXBk{y*2+m=NxZ^iK3+%3eGN zdhAE-=Nt$87a)BPyn#n4zZC+$EU$bh@1;LC4g3aDHsdGhMDQyd;NK$3Z`VIJ3ix>v zu<-5We?+8r+bUp-NN;~%;w`g%NaAlxzg*y7Bwi%^D;@BEISu}80{)Q_P#XOArolh= zM9x2weli<7{-346e~Z9hx8Q%F1OCU|F8Uu^`HKYn&hS4^q_@+*vWxhSMta7-Hu(N8 zc!U-IiyiP^kOu!*Y2e%W;h{A6FA?eO@7wAB%QW~;7WiBF=TZm!UqyP#(@wvo0=^xd z{l5Pl-!J|3-!uKj@0orO7WfZVe&P-5&wgL?J=1SNdTMEQ`6KDy-3lCGJN@^F^!EB& zo`(PI=|4q!C;ngR!2j1c@K3M1obhiI@cY{ExAXH^BE22|ZC%8_6zQGt-{ye-BnSK_ zr@>zt#N}US_}`uef4@lInf#2V!N2g!j`D|Wfn@#3e4k5$e?Y+R(+T}QOoRVek=|Zk z628p#{WSQ`68Kx?&r}EebMAKLpIHL_VG@w=?f4Xl^mhJP(nb6SA-xm-EOWqrh6DZ= zrNMuhfZw|l{1>Fbe`Oc(pPL5%76<%);(-6J)8OCIMf_h(gMVum@n4$;e}xv?@w4(z z!~y@dH25ondHe0%3H|%r!}-t7KlviPZcA_H|DH(i#6Lv>|M?<4jo;=u;D45YZ7ki}aoG&mYp@KUv^!ZNIe+_`i_`|M>#GW~0BIeqW@)e@Ped z-<<~kr4IPt?0|o-d!6}bnSejWhQFPEt{3U;{Ijo%_*Wyn6aQ>*z~6Ade_I;-{U>w& zKeiM6d*0_PKXsA5Gydt0^iKHibHM-S4)}-Cz#l8%%l0peVdtN+H1G?_*b2W!cIE4D zw>rR|mInSZ0pBmuOV1Af+BEQ61$>D=$*%?n_`ga6zp;z(A4mhg=&O$M=XMA9o72GG z)o;2`t z$yg9Si9f-AzyW?s8u%*&{7Qkp^z8J1ISu@=0)C@NNbrB*0Ke}8Y51>*^PgV=7QP*R zFQj+kzx;1HmVcQ8{E2Dc`@0DLsx^RC#PEQGFa1cG^fe;Az5kZ?(qEh=eS=6(WwZX|z4Y%C>Fwj6r6Rq=Q|4j6 zzYXb~=(mN8Rq>PMC;I)-fqsnwevt$q{AB|E@wRwbozj0%q_@4MtQYC+@iLu^|2xuW z;)d6@j8&8kBE3Hu#X|P-e=6YH)3=KB%ZpPpu&3XF^o)L~uPJSUew89U(eDWd`cZl8 zuqmsCiM*tR7xRptMB2%CQNow?l7+{3)Zw?1J~ofvuP#e{WT#&q9y_HE4B@e^UmQIB zDW{!&n&0v(>Ja8JrwVWJV^L4Z9B zD5rUbc&IE*aOAIr+W_~XxL+sy_3)eFUV?iW?iDzC|24SR;acb(5iU3~`KD(Z;Wokj z4ekxNH{mwJ(X+SUw!r-z?rpfOaPPp;vv=X%gL@xt8{9wOK7gZV|AhMxZadsZa3909 z!qKxB+$V5xxE*ji;da5%v)yoQaG%0`2KPDK7jX3KOSnC7d*SxMeFe84j-DNWYlov7 zQU#MbiBtmkEBUyPdCn1VBxZ}@h~4p5j>LsbPmY44DHIJuX()id@*`Y^z?}wnI@}p> zC2$MDmy6&KR7!C<6K*IR-4Da%$8cwfd$Q*Xzy;w3AJ<#;v{ZWP?fcyhs8TOo`v8>!<_>chO2-hJ2qO&L{K>w zm-FB%;pqN+TrLpd3*lb`HwNxvxJ%&1!r`x6ipymp{4o6A!7Uf}kHG&u+#kgKqwxO- z_a|}x82lA*kBj>!;Qtx!FXH}5_)oz-E$&yse+G`4H2%t8ad{5zd2zoA{tIx8;(j&! zHE>Ph{uTJI!o4Q$-+=!n+-7nA7W^%6e;4=f!`}w?4{`r7eCmf|;{Fr(akw4gekc50 zaJ$8Q8~jhY9_x#B(#eowf=#C?2e>~g?;=UOEsc=6M_e0>H26wu+KLdUVT&cJ}6aG-RVdDNQ_-Bi75dLrx zE`whVH&Wb>g0I7c#QkXa=fH)9amEwL9{3^I>;eG-) z8*UC9(UAI`DR9@p&48N;Hw%uQO@%)VZaQ29t{QGG96g%{e?Ht#;jV{U0Cxi%J-ZS9 zO>i~helh%7xH@tF82lA*kBj?%!v7F%ySQ(KAA|cu+>^SJR30?#r~GO9@eLde1L@w4 z_U?hBJuDe;w3me9yTk7RM|%tCJ|8~Wc^@I}2f-f;KqnJS{J_rZmhVcb>_?9E{D59#EpZ0CEQiwemwlE z;b={9f{2?4pVsKA#QnAKY0Ya2+;t+3){v&bO&9mHCNmRm796c_P?=`Kp92>W_to&{ z!jb-+o-c+^y2v_lPxESuzZX8uaVdPi@M+HZpa|3akDmP!{xT8%mGFNJ|2HE1knn#i ze3~~3K{@+CS4dK5Df3pa`CHyV$|1QFB3x6y8cSQJI;lBs}eG%R! z{C~jzK!pD({14%87vYbD|1tbl5snG}6Zmlv-XZ**@OO#uZsE7V|5SuO6aMG$zYyUs z;qMXQz3}&m@K^Bni}2U*zY*bo!9O6v?eJ;PPIaxqcZskYzDI<;@H0d>6TVM`v*2fo za5wllBHSH*4-wYj=ZbJ1{GK9w82nx$d^r5xBHRalz6ke)e}o7h3BR8R9|iwt5k3aK zUxbf^-(Q4}6Mlj42f-fX- zYwC~QUqusJ@rdq&7l{;ObmL!o?G6CXq;apJ*RDl)_bQsmj0;}Dl2C$>u~tU2_rk`< z%x`a3bBLIS`-+vLFx#9JnLK;a)f2CpULBb<|Eh_T=0s-C{HZcvPT@d*)zwp`O`3SJ zzkK%WnX~;9W=@=RrhmZ1Y=yE-)RB|{2%=&K5SI53<$s7i9r)S8 zKde>RSyZoG@7HS&oIQ7>_Ecu=Hq}_8FFMeUS>oKob)!umptQBO>)vfxGOXKF?P_XR z82}d|K_D_fJEjalwNWo!KX0F2+v;!9j=`gk_UX})tq9lPO=YDY7mEO)d5fZ#?u~TQ zCtTtwZX9~CC(^B{>SXPhIy}H5bEHp?=CtVMB|g1$Lv^qCNgPgXqff70gSgd^BR|t} zT~*pCN+gC`?aoF^dX_(HS=30!P@75lS=)<|shgvGI+}TLTf0xYYYmEc!WiA0iMXAS z0lK-+$Hh`g?6HAsD`N{68d*;c|k(_bAszlI@L7e0$nZ?RrZ?U2?GzkX#S>^A)TfQgr zzckT*oR{c7D)i{WN>&;K0y0n}1AZCEpD1R+1GvYQ;f{K& z3-#KC`AXy>DbSl8WjU}Z5wLj;M;BtqTb@KiM|KQ4F5#UWir!GbTM~tMQ=$-WOBCXbi9(!>SySo?UUMW~l7&0N z@83a>F+$dILEJo+Pvk}|)oUC5n2au$qF9dQ%@Oly(3&kt6}e0|M^sW&P)1dsp_@|? zwKH-u4P*8C_DGg)%0^zxr`d%l^yNa}B*x!(b~$VGb&Mp)W`1!atuiQW+T*OF(eA`R zIdWE8dpX29&$~Ng`YLUAqn1~mtD9V~7|c+W#C~z(Ei5W_A%=x~JYT<4t1HKy%)-mE zSVcHVArl*b=M7a!VF-Cd^<$&g#qci6()W^u|H{dB7VfNAK@?R6J4(!o!OSCb>myq_*hxvLlWqp7&a$VQu{oX zwNI+@>=1fc(ISYjvPE1D3a?s*2-!@NBt|CA^*ypJ*zPGvWUa9hQjG_-JOB}O9ySJ0 zF+)aKL9)^-S*3G+0)krI*@#HwWT|+GU+ieS!22DC_SoEch1XLZq*nOFV1HKODHNMD zzH1bdvTYgil|6dk$Vx%kdggV*Y7w3+?2mQJU#keQ@{Qr6$j@2XX!?vvd|NxDLwT-bPp!Td zAj9UQTq5}OB&zKqT{H{gog!k~5~{#cWCqm(D$HpGB^98;ks&!V7yS<(ld$^eyf-jM zfU*!$tlDB~wYuL@ zRC6sop`VoC(FJ35V+19IV0X({W5ifqV?wa^Naph@B^JWHOh#9qDTRA+M@hxnHdP+@ zA~-I1B^yB}`GdyT6fMV}Qup@eGJs%53yZh9l}To9;u z4`Q6D#ONUvD7!5Rl(6xc%qI3Y&=Z+!x6J`w@dq1-|5E!qrY`5qHwt3+mSt3$RPMw6 z4dOm}LO;o8(FK!<>lpKm$d$3ih{?PH%|th8VZgsodeK!5O)wz%j(3%XlH3RFDw$r8 zjVn<9a=N0`T`Ku4GUebrcF-wHDwlbYC+Wd-GuaQvhO)>SMhiBN`IBUc_(KqD-j<}) zKGfb1wf95qeFPgR9cu4~`ghD34)yPc`uBrt4-WP3hsN{v>FjsY4;>oM9~#f6%o=}) z@qF+SG1m#Q8GJZ;ZJS*5f-0bsnfz~P0`vpSm`Gv%#MQLNbeu?~=t4{m z>Jxt8`TW~#hE94_(ht9aJ4qL(`TV2o?HZIVIiDYb!n67OPC1|7m7LFup-f^vPdh3w zpI?Xhd@If8#dAx4zqbqX`MoLg`Ta7R*dstsWS%mgcU*5_+N5+7`iH56&GpOR(N9j@ zqYE*ihZdgA=%Lb*c6jA-MxW4wT4waL>jj!QHp2g2x=><8sSAa&mg{%J=I@pvo~e09 zqbfqRHxyt^a#pChtiXo{N)UlU3Q&xn0u)n30n*)-SecL_a!DU((I-iDWNZhhOZudw z{*|p42)iSKiv`O^o0>Bg^W!hXC4~9c+ z7nSsbIeMQSyVd9r`6GRrqYdC9c_Iw=le`w zg{k{WUtieG*l&~=uN%70*l5n81f`o7<`|zFvpmLTqcX>MJ81ST{ks+=2C08hTT%%1 zO7J-t-Lu^(O7Yg98S<3Ar2U+;$_D6pqW?tmUio-6jkX9n&%_e8$-yherxpw zLDL0Gf+dgPA)fe3TNa)jG~Ez4utD%7txb;?Y8sS z6UN;}JQl=VQa%RFKq1fps>X0Uh~Fak6Y+zC1}nl(5KpCwk?3ls{8OnFdlj6HIzB86 z;0Fk~Ul5wVBhzH7y&qdoVoL~&k(qTurEbjBQx`(U>CpwUl`Y_gTdG@h(6X_{4 zrbKL3)6-^7m}-lvp1~qfC0rjaWvcX4jG;Tu>>1CA8bkXmjwm1Pf&rt3!0IFl28=Y5zmwTb?q)yTS6OHAq`Rb z?0|M>bD*w0@-gds1&UhT7Z5>RK{NI;US#@rJ{Bq7!}4in*Z~T7hy_IiztTuV>obmWGzP5toa$&25-S|C3fIn?R-#7TnAD!Nyj9XvF@N@ zw75Y%F2(5@>XGOIUEalB<#w0%Rxc#C=RU9UoNEGh=DNLmJj%Nsm{wB*?FPDBksuS1 ziv1WgZcjno_&2(FBgQ9zKzlN3W^~$wJRE?=2FIqp)9rc z5=(o>XA4jx)ZPPPU=aYatWK%QbaTmghCbQN%<}0&XC+4LT3H*FN;kIa#wYC?ArwwY zNoXmzZtRkxHnspwT#P65W={bjrvuAE3dC1gDAdfjwf+8M)xO>OVxwwFjZ3`(ta*#t z4WUQWAK^+u0#v_0Pxa;W?ynRBZyv>)XevI-SV6i_58s0R4aoD~O#h_}?e9SUWO@G= z=+7!fT++7Jv5=)*Yp=m){K$-RWX*UayH2@IC3fe+AwMY`@R|d>;4^{mncmkSz4EQ# zQ!`A(|J$Yaf3Ngh{3;kwNs^_Pry--ocu9v44x4%)WCCj)4PUo3eDwYq4&s2i>-PVl zozh7lY#fLF{~RWUPzL-Q>PIJ0SY-%eYrZ5iS;!;{bli67-Bm1AR5q@|7xa3r6k zO@xqZB(-*Nk}OGNZeCQNLooIlK%%HR6B2POj0%}Rl7KAmxY>}%Pxe>a@In$(M;Qcg zY*c=*&Vb58W;+lpD3-OOV=})1c~JG}#^;O!>uCO|n{M44iz=I(8!nA&bt@>24<+Nh zq`a+d$`6&ktJU4X5+sCt*sNK~@`QnftZTA3(#l>%y`b(Z5%0$Bn~6%-%D!a92(m8c z;qv00Hd&i2XPMDT-M5(c(>M!n+aqg$krJeXAe8u%j6V#E{HIN+`Mn_Tr;+G?SS`eL zql!*}-k0*f&vDABN%_wnh>Ih?(QsrNu(Z^dOk?Gz4ny@$_=)!O^DMznG_bbtQ{lJe zCprWm4Sp$Xag#4aKDHs*_mPj^DZNELiuB)3zFFkscS`R^?Fsq%9ny1Q;5&$XG&4!l zU{O9|*T5;HX&5NAy%uvKn5vQ#;daUm(r%6KyW`tVB(IUr`19YLKcCz1VI^zMmFG=q#TAyQ^yGmUlo zPI04IuGH>RwcBWapgy78qnl%V`s!`4I?QqDr7z976k9e`+AXwtH*CV1RlRm!=GJJ-taAuiHWpEtCE3cMzWZ@odxe4_3MTgc5KKW~ zzL!=tRbk+H*w`6!vk`I`O>bv;LK8OYSVHkr#;ZSYGl<~BVZr8ayQM0r-y?-Uh;MAt z>MsMd_~R^J#)rl_*!D4<8Hi;64wqVA@sb=|SCp8w49I~QC*Txb{Gh$Ma9g&#A@M_^U#7sYt zv>yg{@=ac{65x|yp-RCZBw;^H9TKTG5+(kawO4zId(ue=BMWfKNdNm(<#rVz`lXhK z6ql*x8PJ9DRL}mFSnI~SIu?B*8Wd4}3||DU>tqGdl7mlI*M-1F`MSD=EkUejOe`jL z&|~l{uytxz2+I_Hdmg&lRHbV(8j%f%OhM@1ksYb+n900vy_>D%bw;?u&O!ZMcpeVI zS)rao3gBZo<@hy~e$wKWOzggE-%oC!*7ibg@;(N02y$F-XQ4*!uQ9 zt7E|&O(Ek7Fh{hk@IWyZSD+iHGICMVj6p2&fwC>$O0udKPy%HSoBI& zFWo$E3^1}r zYWD{sm&kFlx>YZIo6ZM_qor{QqDjbdlK*O=kn77aaHZ`eypLph#M%#Vp1@_T@ikok z`By(6#Gix+%^EmfQT|8Gz`fxY86E9a z$VwhonMC+NH_AyMti`S=sOg5XF4~-j?i|Mwl&+5ySHb?9wo~Xu=zvR586~){+=9#4 zRxNMz1}*P`En41Xt-3LKA9cwa+uAkWMWUS?N20#-%|N;_$U+*TpBR@Eq5!OT5`7T8 z51n&!1T;q_{Tp4%tOqb@c*1p}h5o@yXmkP!(P|W}=G5-UM=gk+s7Wtvn}=@c3TzlE z{an{Zy%#il71ZumZ|nuxs}JN;MC=k#LhdU-X!KwCjP5!XGwPNB4wz}~B`E&|8*sU7 ziyj?LfoocIbM!tfuO|pm1cKyhdDr;$(k+p}csQTl2w>vWTB1Fzm#(Hq2Uiy9nL$duzc>>I{QC9E+ zaIIZOCAon3;WF?;1^8hM_+cFQp#uEycJ;;(RQ^ylj49De-;12e_Rq~cPB+g%`XH>FgdjdMpYKx!Xl21)_qJ0|UuY3eC;K(QC&uodaU22jfhK9R?sgh`-PW z{Kjw4qm{sKLLqJ@1IejW^jW}qj*eR0S7n@oO58v1Y#NCc2Ib)QkHj*-x;M)+)LhO+ zE@Imn+FY$=GF^jrv9!yE%{TQ48Dnx&9@o)hMIQ+J4k+E-VKj9QVatDk@yLFm;H z%YH2F>B=G?N=2y5#bvC&%BaLqOKXTnv^>2*%d1?b<&9l|bk&>U#BGG>2ypH5DjWWy3>2gXShM{8ZU5-Y}VIXuHovbS7 zHX$>NmbZGFD;)K>LXa0X(vCFd&f?FtT#rl3 z%UOiF@sK$EL}xRcZ}jMpdMd82ex|FR>ZQ$*lku(#)$REl%der*#<@o!Vz>t}sOh|* zhoZ76irvDDMAi~5svm6T5;i9IVjI~4Rt6v(6?p<~y1F3XffODik6drC@_ z_??Mt=nP&q9$yWsO&!Qbm@F-=%JU?MPRaP)w>fbP`n@n`7qZ321p)rhs{&>i- zuyH`(z$LbPpDps#G$u+#N$J2<>em^6fH$x_qdhe|2U!ocfGpC@3-WbzJS8}SjSU0v zLI9D46scPxD|Hh>22aPb9hR&qhNF>!%5ZdAK_DERSb)43bvFPqs6_8_kxDIaEa=4) zlSWurRZ*-?GL6=xNQiT)BNppp&{ktzDvYL;8%7MqyB87Ok%B_joVnH>`Bz_+N`qw0 zrmH7PKi{%=wgWYyJw=SUXf4%FO1BzNF!&l=+z29u0h-$fyg;w%D98BvO(1L-*r7p8 zMkJ{TP-?!yPCX#f0r?7}Eo{WX28LbDL>2y=5W&D5LwxL9M0!?y$wR`VETF6hW=d=n zWTse$C*bT=m0ybzK?V{6W`}MO)~~J4qI>zRh@o zMF8dY`zNWF_3DQMkljyt)v?~+d)?D?g#Mx){*BlDqI&p8UiTMj{@Y&ngDx+we`eR! zt^mUKy8Spj)lJb4dc14A?k7Cn*Szj`Jziw+Gq3j-UN=~7A)pYP!&P6u-oq4{y(VHs zdrb5fWKfsV46$ik4%l)27HDqakSmalrNiL$Ap47QXoPr&kr>Q7br??qwa^5JP2OA3 zCQzml>xF60#yM9}ZxJ#YLm0(}NaIB+vEgB(xp)&P#dc%-RE3Tr4~i}iQ;DIo=#7yW z2D8o8+rvhqP=~D}3h3%aUEPe1fGNgQD8@3-TjvxA6&8BygP*2>LvmtYK|b?xcI*cd z`l}(|T75_g!B})kkUD9VB0tp zuCjS1gnx8Sp%gTFbSmT{+VZr5v8+gXbc8Niyq`yiHF@m2mQu?YF@F7s$)E~QhSY=< zodp0@iEOAhK*mzY!198g3fYRmx*6cR-beV8HgsWgfxm(VpdqX>v3$gyb=h-Z z5NeF@OFYoW`ANK@mw_av?8kH9*6fo;rN+OM13|~%R_$xrJG*+FOOC~9fFi2MZFavb>mICdD=k`iX;)*nLucrwwMmMc0#BK zyn**1{6(D;kr_IOB6NmW(4o!N93Av|33MV>VX-O)u9FYN{2<+el z*y`Ij1#}7W+72KEmvR_1E8IsMI+s!2nFkCqK<0LVIZL}Tw_xca+Ti? zMTac<6Y6wg&n51ysD;h(sK(tPb%zBd-S=4#eL{h*#!x&G^I3?<^AyCc1XHmWMGqd= zW#C8|I9>)0lYxGWb|QaN9t%k%q_|^kjlYu|p&M%7a-9F|t;<%XdzWV`H+t{RR&GF$#qEwy;MbHbyGrprEjx&^=D_8-{SakeeL2izY$Ounm zf0gX3K1V-QLIV%1=sjh$w+!KTOx+EMuT34_E?~C4t<3y2Ll95Fm zQJ_Zw*|F)-M+^3`mv|vX%d64~c?V_eU0+v_53tC)u3#DY$d>uMSMqClbp<}Wz>A27 z4R{IJ>&-lfJEUbj7_Sx5`k{@oSw&qz3mzwWvE#z#qb!C_UqMf1wFZ|JCp3IKrR>hA z8?Gy;AyB}8`5Yv#{#20L@LDQJis=eSdJi`2iNj`aN~t-49W;~H7~HHYXrxpIdMQwZ z!t^6c_yi7=3p($En3N+IA{6Vvkqd?Chg_0ZY+TiXCXh^8^Uu6bvY!h@e?P;t@v%l_%8} zm5E17SZZ`E%-{;@ld<9vC<;!XUOW+ju?yrn%Yzx|0R-teDoIHI_8Uu8A0RD9P`hhw z^#!R|+j=F+O7cxty1Lj&7-f)Lq;^6o7Dx&VsKaDVhe4qZl?Ns=Oj99AVi9r2havE2 zXX8;JY|f&2lO)a!1-ixN0KC&k1UZzL&M|nZ?btSL=9RV2oWvW)F$)dyg?+Lfx-=?bD)x1+sb>6l- zb)5H=JojwxlAi9xs`r6B_wA~8d7gWt8f?gOKjRAH`l#DWVRz5JuN8BZ^<|V*P6`U$nn9rs;`y^a{+0BdVv+VjNyMDy3Uv>M9iU$vL@7b8=-qO84 zt`GH~Ya6>hr%`xG?isj3C^2Og>9VpzNB&BM1qOy+G8!Cb(`Ws_>&?(hvgJe!lOku} z3@k`Tv65K3tr3y|)>2H6h19iTRk@Yc>vrgTRe2p>RYtD~!!Pq(2oxNxkJYImw6305 zlfqg@04l5itxaviWqcbJmSN*{K?~MVw_#DRjaH^w+S+^krxunU!NPJqhHh5O4FO@s^at@zu%t zPg!56-7%IX3ngqNkF@t7es9Zk0fHLJM00qqK4>`8yaXsCef7Q!vN3^{25yKBO;4d`=c;G|%A8A~H0@+XR(9 zKeeFPTFxSvX&w-V71tWJqU**JM8c{7T`ZfkgwQMn?;0#4s<63YGMI*jTxc@+rkk0s(ueRw6w*!h=~#mcu-Q1TaS{n3;~m|c zgG6l23R~5~1w+8R!S>Cx0!P~)@uZN#e-pXol9m1HZ5hNmx$(hC`wHSvod#4YR{1zf z;|Pa9cqquH)t$_E7$e3c>@Wa_&4u`g0w@qHD%@a>rVm4xg^C8MCwW}}j^ zX99sNLf%@*To*%?%#O2cU{%dGBS2Eq6b|ywGJmT8MfnB>><~#9(j@Bx^<-&dt96LC z02$Lg-O*BH*|C|(GaIsljDyIytD33g!L!L}-C)M&VY9F+?TEi?_+#&XgX06(ZjTt9 zf66LDsJAR5$nU?#h}EBEDxKwiLawj?=>KeYWtn;gEP-9Qf9kIM$>qbf+2zIcbyxrO z-4(-qBf_tGDCSL1|4rSMpL-XnxOqI|SX@8J=#A@=%szK_S6VU$BfQAxLHJ&u7uR3; z`v1DS@~-cCgg?ycfv0z8dvINm4VB|>yHTEh?AHH1JnZ%pgb(DnaV7JV(LZ96oL`6% zV`%5nzZ}jmKeMeJ=l60>?&=ZdE_uyk6Q5^qTa}1 zFlrt@!at!MHBS-NQdzR?VgzHctHi*y3u6~_6FRywtlLJ$!pO@{_NLm+v}u5SY%2J? zA3bynW&5pbNXR3=EWO8)5df4lBB=tN)2qZSC27v{?~02T{8$XZ;(#TL%UhTw&sX zrP94~j!x1KDo-S5^b3{lnzuWtEiFVbB)VbaxCF^q|Bv$cs64SjST!IbgLd&O#x2IW zIB?{HP{|*T!&TJv(S5*jMg4cVlsnW>_!_mEvE8NYq)i2nyQTs@uRk$fWmdmz_lOH? zs-&pGhocVD$z>jc!W%xRN%&vmJ!Ge!n9uUAH}o&*MRXAAHBwF zz}I184NhccSWySGg=JJPGZOm6`055M)(g~|@k%wud7gqq3p%mF7*-H}fa;yYnFSFI z+^Mhsj3tY|F6@@6Ts-DwRzK%Nhn>RCYCb@!7T(}UUE_5=b? zOt&J#rUceF`1>PtmSCmolUU_J)S=`_d|B5CzDw{ytPqt+^Bp>212&+0h)X$#tU_fT zNgv}Z%2$-}!xZHqGP198or_PryM|J!lRws?pH+_M`z@s;4Vz~`a8{Tzz>nvmJUhds zG3{nzZ|$jaWte|nwyynVjkfqH#Dq$B>c)nEcKdq0G&c8G{RNqs_Ecqi&3^y947~f+ z?2946w0qWMZ4T7!iJYYm#0X_=WOUHXpi%X$4-4mn_wlf_BvHz-s`Yk zTadrBX{@xh`gW1iZ6v2jE^d{zK*qJ9=8+%;Gv*)Zi#JlgL`(lDR6WTz-DpKAw8d2j z$A8V*7p&hoF&lWjf({TIu~6wNvxfmeSYk-V1ae7?SsH-X>c&#O^k}!NL{^0%7*nXB z=#8)j|8&kZymTAsvw`y-0Sb{GJS&Mi1U~f+FwfVG;kgh?GB2=g9TiC7Igm9*vSaRp zjybl4&EynRO>oahzbkTY{Pskd-UovmMV;uaDvWEFx^x`jn~=Q0b14Hev_rmeqmi zNYLi|tfh#}7}#ktUG|q~*)G)Shgv<~+?*`wPr(cpkf_%e=-dd*{dkY3M;qwAV&Hb3 zw=pLFSwbXK`X-vo>v=s>w@P&< z2S2efh$lWH7Wjk=cM{F>_n>}n`bKZRK0vKh!RE8eX&)7K-iiKD><-5sRE$OFgM6^h z4iChp#?4yY%S2^}TKZPNZ3y!b&yD9v;T1A_VPFP+n2q`wov#o46vrHuzD(eCZRE?k z@e;2Eye7vITHW2qh-4&{Qj90f3h?`Cz4Wy?zty92(N;d4Jps(Lr`+$VzD(yVYlhS< zVSHVII!u-n@(A{2&xldjg{0obiFdpQq;`lSA6Yvjxfj2k`aMb}s9FOgur9lhYf9qx zvv!!2cUOR*RSgVz%!aHo9^aKQ`W3{^#tV>#vY(8D%zcJ=!3_aLVMh*qLE6#=7bu?m zG5Lq%)aw3>IJsHmU%K%YGtYe!8vtoTE7#^gV$txU7g!>7mj(C%^$)fig>lDC7ijJkTMn^`X3E7oL0XZfEl3YD1d1rsz~s`LM47z za(*kN8twOhCen{Yv(KTo6N8qMDvWAmu{TB)0(zGNS)2i6yq)0v_)E$Bh%O9Je1oV@ zXxxnbq3E!FAvcl@WXW{(J^s>Np{S=Hdp-n28iwr+Zzs@{y%h$l zs1h2)V{9IuQ!NfSI8E*|qeB)z{^X>lnuJM83`AE`zFzw7TxcOM&BwDBC6%jRfSog! zVe!B4dBIS6n-K#^=Do@ko$Qu(aF|{Y=3HGWIi(5ujybSlZ7b6rKZzdmZ)Kec6-EZD zH4I&QBr-wTk(iC3kr0nC{`*50^9GCLKpmVb{nu~47MOW1*WnU_nsw1AItE@#KcQCkklyveuZPy4;( z_ij7n51E=$7w9vsv*qOcNg9`=K1b;|RDyRQnlxraU#I3+fl9RjIk5u^_%4^E z|ooR9Z0wHNHL9I$->K(8bWSb5p}S*xqTeS(4J@|pYz=+GjwxmKJoY>$i(JiB{# zPW)7ipPInG@6N?0EXJL?6B%r$4S;x>V7YgbEO$A2#Br?7h4fC)OUfhG9RO3$G)yWi zzaIc!OqLIVub4rgiTvRBwpi$^)vv*woB(0B7~kE=h7Wu`iT#2Q5VQz#eL_lLM#Gw6 zm>&}t=ATH7pPrPLVPmKsU4S9?96|UFOf(&pQb;5qWen7H;nLQ~iv$VL?JXo5K2BDY z7`?Enl0rdrAADRZ>x*7YzF^V6V7mq5fcO$>(S;C`Pm+pF&KpVn%{y!g37nOZ=x?mtAqyViUNOIySof44uxEuj`NOab4e6KBJ3Z@Crb{<;ZJpK_*=Sp1WrYw zt<w+whSg8BN{rL?;aG-n>F3pNB-r7|knyhQFEHYVUZ2ws6M@;#(@=)c{)Bir-X#UA zpRCA%FVB(I<{-zMY5?z+ShU)|08T4OVxgLKYc)4i48qA21X*kcw=B_NZHCT^NDz}W zVr+#f-apB&x(OPm=&PWsBAr!fQ}sXDR#_bQjk~`^`ips$JH&K5;On3<3Im)bPzs#@ zc8C6x2#ie#dm^LQmRwMHPJV(udqcJBIekDx(qqYGj}Tab^?ejzyg>mUF$q&j69Ii} zT>?CUWf8tJ^p9eGB*!Nq9D4=22C*p3>q)Dq*Ce1;PB{6WP{lUGxeUEb~pl5jtUjTMN}@<;9YzfixO+BJVm{jwN51TUhI7DPSz zQJk?;%RYvhivwQsMis(gO^X}D%F}n?Gq!9VD zx}cgiMvPC4WMJLcJYp8*1b;sH&9yb;;fD_dEa4$33)#K(y8+F$OT`m@0 zK|{rRv3+8i-#kUN9=r16kfhWIzFb;!Z@f}0{{R5oV&|K~# z5;T_=l80MA`OW1;i@U~jBBX6@B!V2F(^3ny&X38k@NlU{Jouy?GN@RDfTZq4%($b{vcTQZNypt zp8_-O|4w|w!Lrg;EbJz%`Vu!+wnZ;G34=gs3iFa&uaoOWG9iY_%pPXI#We7f>p#R8 zFvB^4O`t0rSoi-A4&o#QbNsNMN2G0#kw7S*EkPPP7ynrVBSO{vQGdDMWMaw}Cgrnip zaiGoWc?*JjpptM^&(SxwvK65X+G08a{+wu;&vFPI%SVmPabgrjhAV>jF_? zF3&DTN5;~(ZUl!WOYPm&QTmvAwiKVwK+T!Pc z03Dv?D{jZy(p=JEcZvuJ^cXd_Pig1rgm3OU?VL^pGA7ATmYm{tqx&qo$Gc1v4K z+c2$5I$GWFh^au8+j4_ms~n&8P&Y*`(xbEedhG!iLOp?ZgW6M2`_+DojrVJCiZwx}vIvSBKr)g1tI+MEO?=VheR0$3U8J4{qYDiNkrNfI$8 zO7a7}!^|R~Mmr75O`o%^UD09J;}qE=an90DIA_r(j~E{&*0W;tF*vfnp!BG2ynlKa zS{-Q>M8pSHv7fP&$hj#L9WqK+TPb5KZH;0XS3tKID`2nG0b_x)Km`fr(c6?QQt%mT z?D!OZW@RMMbYKiY6zgCTJgsvv{Zs8np!wX^*e!^F(8;IcPmdS?YQcK3M*R|%dW)M* z3b*|jf3uS^$U2KHhc;)@I}H7h0qZC-%Gw%%#N?uf7WT19dKNQ?9l9_#ay&@Hl&LjH zMk^49^U4-$!K757^!2^LHE2&AhI22W zoWb#0P58jk`Oqx3%#I~8=b%&9kLCJzKeqnO4NIiFVyo|D!z4vusPt8B@y!5CvJ0%m z)qiqfTNb9m98z#zblOQSGWD?NR8dLTKqt1zU~P>Z>N+ETv^=(RB%RtB8;lyV+kLU+ zR^m6YzRivju4*_h8U_#u;|yAvkL1w$xs-<_lOdU5cXJDU5{!#wEESXkh%eR*Mi4q4 z*{8~`4*W5M&epmP#k@rw`kq^927f3m>d^@9qF@~zuJW|&6x`Ri`{LS0c4C!N=7(m? znR4yqh(A~v@|Vw^J##i*w*DADL7Irw#cx=Bz@86w2Trf^^#SMiS+=7l&6qTM%7oDL ztFN7O=9y(zN3K5e%-}S9AL{DJq{4w``hib%Rn?RUQzp%b_-9m4zh=^G|I8}?gvnRW zm@#SEoRswk*6U*Bp~M(cfPFHaGSa+H)GfzY7Zx`{lHU3{NC2CGTZt+`<5hf9?pBh| zwO_ez%0Yjb3(NlcK_Cz*Wx~-(SlY#+>F?3FbUNxMJYh(IK4DBjSbMAuhsF7I?Xfi> z^y>9nkO$N^`1T_t8%h_{&LcZLV9_fyVVxfBw~mUe8+@&tanjrPppj%jeTVU`uNDa)pduq`Jf!+J@?Q8Fmr$y79*(LGy#r^7cWL13GUQDD`_C zEAcEZACr49FiUa?jAELQ!xcDZ3&(U}fPftUz0k=qknzEMy}H~t+8k0uI;q4O4LV)l z=w=VoaiMiWq3=U^OPg-k$S5Ujjl%|+(i|W{;!|Uuf-+-zAz&jMF7V*6OMG!`b(OZc z+|PK&toGw`mw0ZD;k}+&T|_t)T9!YSfw1TZO6cH8yeWl&)s6!CIZW4z?J28d%A^@r zB2^8m4I8M_M1mv?F3(VbfQ$oE7>%SwCM+4)XS3Kc6-IfiMA&|S_oV$)2fD)|qdHc+ zm9_|#5sP6_DLUj`j?0iOY3WVkkchqIrdO=QW-BBR2^e6mj~T49VC4!;fQcpWv6$zezvNGC8cd{&D?YW+8@eY`eIz4%Yo=P02^s&}%<~`hDL?mlalPBu`$M1muRbqKZnM0vcT-km z<+XKF-p)eAhgrRUmF>PKd+>|d%9d!&dBs*VwprS?)MOZeZppR$ThWdB2TR`-L<={u|cj(#eHb7~olWnY#2 zKIwm|zlzX}Wrn)*K{BWkal=`gaGtXb^Qy%hpas898_cuQG->A=e zF3bCQH)TUs-kmwhXVhnXlhymL+3v@)Pv4oXd_#TKUEKn2cEbk8)IN(Ek^CL%zr^G! zZU6Npk?K(Yl{!QF56`pEf4ToJ^k3_Umk#w`_@3aQ{>wU3{g2JL4)tH85A4ePYv}i$ zf6)Pl|MB@3)c7!9Vrwik|2i)^>~x2|D*!bF>3GCQ>i^)pOU^IT%)hQg-LOepSM`J^ zi3HzGPgtSyqhQ4J3;NxT`q_Vzo{-PG67#+9H~&(wKdB4)!9(+|L-Q^!TG-6)2hbJ% z5dBsw&ATqH$x>TgWi38+rJHtGVBYofEOnLF_YQQ3-q7!8-c|OCOtpdLT~B77|C~>G zz~{yFVPEereD0TN-u0I(ZycJyth}G+D4)>0>x-=3f6jJ4l70I2Y~>4@cSXAeUhSs5 z<1p_!G~eoMzI8}n_`kodbx2=$^nPf;|36>XI;1be;*7N3kPAv;$jfbC{_SgAKSaOv zU!gA?Ic3_Ukuzsczd8a7jmXtACct`Q#I%_+Ch1qtm^h7@Zj6A5#>|L+0>%2T_E#Z= zzltUCPZ4SSFyp}6eAR3W(@oR44LCz8#cTsx*h9v4UQ^uiB;CR)eLNe=<4)IAh2~hU zGR89#5poX1waKug$?MTeQO@u#R+SOCKT)P(|1VOp4Y`7K_?tT4caM#M0o|-AqUiy) z-nO@}mqhL<2}t!L)(h$TRqS)QFj{5%kgH&QNG6Cwu_ZThsxUItZhIXG$N-D4F(+&- zJMNpLQ(G)KoS4YrUm}Nmh6-6bC34}Wd8x(lCyGIbU2dbqDaEA2^La7ph)JyQCl=gO z-%FB1?qU_@Vok{%bg(_&W_auPP1cIC8Q9NpxLwX*dlR&HigS&pOl`A*Qt z5ipm{jj7P(H{fW$TDg-NmLDkHLcVb;zExBrGeG3wW){XebWlAb7vsaBM?URV?@=$s z^-J2NQ}6O37D;MGIt^v5-?#9Dq?kogBK(=%&zHfG_62x#(MuOf1h+C(I zj4$MZGCnbpwBggS>s1`6f&=Pt^j)PdGKC*@dMi7x#CS{aU5e4HR+mSW2g6yi$>U$< zqf=aQz7p++)}G2s*x{{)9p1&<4iCi1l~Z1jC%|f7AG#nnvR$07dL-ov9_1f2B@V;( zMz)U<-*%w$P*T(56m^&sj7Zw&>7_3v?eqG>K93!FoM2Zv#U7^|Cv&88V)4Dgo-TH> z1sNgGDZbL+g?&Jc_K-{4Mi`>dA)DjKWUq)BIg>SAZfq~OgO^9z9sh&z3yh_El6~IX z>9AMU>aGQkV1GaIe=Ug@$0=#7Hyke|jP*t^W4)y;`!c!V(q_MW1XV){Y4(hOG2o+d z(_+uO6`$rFB9@zofo%p7kW^>)grq7z`gV^p^%z`kBNlv}E+5k6SFRF7wz;x!ZE+ug z>nFs9H6Dt1$OE>kxOy7N=SdU&BSr@Ov#yRrCe5Cq6kRZC_$4DME>%J^=3YH*O3Fk3 z2?`FN(#_`sK#X&l`Fy1%Os8lG?&CFJlM7_SVBR$uZ|UasQd+_WvJqx?D_BCQm5M(v zk0(jQ+`(I6QwjjFz&U-XNc};=q6Vfo&HPniYE%0fzQ`t}cllC1I&K;4K-soh80n#1 zEz_gr%bE2jyT$!<1=x2wULUzH$o%1g|Bswi)(tdN4EvHo}$?7J})a(Ux-p zSKa}fEqh)bMj2i$ax1&U$4|M_ z(i=&D{N;GPgtDCi@fYPSeRWswzvM4B z>iF12I9kn^Qf6-_V=80&!PsGw;Yue$vhSMK=`1@mG@#I2Uc>!*+9JV%eB@Awl?&hou!NyR0)`6S^29$ms)M51Z)SIp`fw3r4w$C(QC zBm>B5w*CeNpO-mVKu8SshEcEMMUeqZNbQUr%WXcN005K$v%ZA#q;o%#0)vm1?xIX8 z=u52o+n*!?>Cxyc$|qV+J4%A>o9Y`cy%JwsS%+`FQ}<+wyyp8rSM*h4_X376DNtFX zr;{G&t;R^ds@f7I(ivQ9uOsBMKKvz-XP3+!i1NTm!o_+ z6BuKb%QO2SmbChbzzY_#j2`e=J>y`G6-a{<47tJVN)WgaiOn%9$y$t<23(7g84F^| z5Z)fnKLaqKMK4{W)zd3dTq36xVQeq3-lK4^`)4gTgs)H+Ry72*RroZ-k0~Lq78>}` z9S-?W!==v?d8={eSKj)S|y6M@U+}U?zySKWZRX@vezu+yz^;a4016l4j zGfw$gw)^4Ck#A?YSNQUg7?vb>y35ynO_qCERzBjvnQVv(c;#y8kB<7OvV;!e`-AFT z>2a@8y^na@t*ZA455Du;_lMI@w`II?op>QABM5rDjG8LlfQ+XxGa0hGZ4X}fe4A8rTjEo zaHJ{AKldQ{C!cj8e?brIgGiwVa*!ff&JAw?~Y@ z4%kaF#>MEW8L#|U_Sf_=fT@Vu8NoSi;+qi=HGKL;vpND<2r!ph>B?q%*8QLIoVH&A zCm+q~#`fc=u`A&h#C{gmqcIAnLvRdWGX#eu5d0QXR*5fTgT&TJ;xCEcGQy9}&z}rO z;a>3PK^mm|tn@72lN?wXuLmy<83*Wi*bB=r9l^#&;uRcIQx*p~21hqWVOBFQ zaTJbjEZiVZ(b4kGZ@p=UTW8VmLu zD4k<%yeIFdykP@JqZwndy=~btq-_o`xEQ$vu>e>2EME$0cIlu#f??QNF1%7GGt_e$7qr&@}@X#5Ma%XVJ~Ok za#A2l4Wt>R*gGlv!_kB{q@N3**01RU;LulA35l;6=b`U&;SU0!8}+IzcKiMmdHAVXQ@Dt^bS>~nel z=2aHEdm?u}_F3uP;Rgi~+~ z_8Ci+VC@dlQ?7vqdGgg0rcRl0t)H|L(`QBe6DLI`O^85eF=d8-+RS+;O`9}#(loYxal+Np zrk&|ep7Dt8kj=Uw>-?!CJ(zkqOvfTVOMN(4ml2#uh}OqSh21dFon4HQqb9_-nLa6@ zuEDJIshrFzBWJkY4xQq@((2t%Q&HWp3yze=1bL6%>?xr9cxGI9$Sp$bq<6l zJgELW$w~2FQig^;i)5;aBo>IfqIEDZj|b3Wf)!7`;|D%oKUR3<_fZ|}kxn2ZK> zm}6~aDR?Ga$HSy8ZI?z)q@ksTZO+dP(;UwnjWE78F>r%Ea4)`Pp&K}LU_U!}V2!Sg zYSHOP?B&R^xRKPk0nAq$aS%a^R!1A%%Cx6*f>mXuIU^$<>&C}A`WQI{7A!GF+Dip# zV=NG`mMB>{#P-&WnvYQC?BgCKLXhA~yYau%Jd9unRh(oCHoKAgq)Yc{Y^n@=L}N$@ z3Q)^$VI2}&G}io4Vq7(lKI4Qqd@Zcw$dC0w5@dP(PWtjH`zi_pBU+1PqV)rO+35cB z)luF1D$4P_R(jM)Zd@kkw0hhNx;^S~-==2Zx=i&h^SJ-0dRjd0r&RYl9`_p6z1HJ? z)s=_0-*aJ8|2=LmUIg_Qf~c5#^;L7+UY~n-@3G3Ys15l5&n}rgB{FHm%xN=cLuf*0 z8=O7+>YpkNR5WyTN&O!e#8QgL9yzscb;hj=r7BjChu27=HS-!GwD|f&@_U8c_OQy~Hr>Ep$c;R?N`E01a9|cW7V>H8$4p z2fiLE-KQG|@X3KT+Ce!LjVf30EpJzCkxR-T?pd7B-pJd1q>uJ=zhG5qzmbuh z>?8u&zLCFHe-1k7REj3q0EEc_)%h2T86U{XiTxOJbEc@KKrv-|vy$Neic1J~8;`X+6P`Hjnqh(Eh9QfhJMA(&)#)(%eTU9Mb&HgJVk zwLGHE2tCoPNwXtAwe>_DR!dS#TZ8=hGNx4~q%b|z1^uXa$!}^b+OY(2DP79^)U0Q* ztZ%}nP`<#iF`VPKAPs7ht88)9#)#A;No3v z#nr#NcQ-5~WRnmzRkXpbH7IJLShGsoge2rHY%mH~{6qx$-1Cas^X`X?|;tB+XCgpq;RHZ2IqjB@s5TtotrZ;R4G#k4#&hII6N9^4i29fnkq)9#S4(fNP>nK zC|8fcRdYfPLGRc~wL)hs*X+O+f820sgrlJv%&*(7|xR;T`&saX?bw&S`3JYO4(nfdVgPrRNp z_k%svQw`U}{My7q`Y&sjGn) zd+}z{Y}j~Cdx*F}CJ)&l$q0vx37#{80TTk-f<P(kpX(fHrGxIT2C?D3eI zl+$qAY$T3{ItVx2;~qN$!zTg3Esn1s;4B+(E-Vh!Z8> zNEwJj?p5`~#7goBF3KYeKm#F}tCGBCq5cS5N!B0}I+;Kf6oo2}t^z5;K?9HuQz#gX zRA3)PwL6}KWKH@(0Bca%qKPQ&Ve484;YzE5>WQHPW6g9_gJF)*Lh4oXDw3D!O64oL zV!?k)52!#52Rn|ZGF-fh>R&B_;G4*Z|0WCw_*00dJrWyhwEWO_%zR(#Pr33E5%AEF zzc<3~weFEt`_|hY^g$Qp!<|5}eUL*>@Gx)eZMq?-V;a~eHn+DU6~>F=LSIC9M@ziH zj&JjbjfSz|F2=d;%Wxy8iFZgQ-hqg-3{_W6)e9cGE>>%_jP)I3_<|i(l+TsHj(a%{SSsa`S3Oxo4LKX_jGGQYT?O2F z+1(;|4}4PBWb*cIrWl(rZkHo6IdhCDkXudSuAbZk$P)d2WI+Kn67f+ zGLQeTH$xeV*mRf}8GJclE;*hWE>nId<`Uq3Ix3XGV74P1-?`c4wN5eH1jG66DGLS%UXnJXc(E|Tq`g_I`|QC1azr2myb z#Y)JakIdH-Gm|I(m(zT4GR+tFB=MhX=z$`RDmVcN+{9@n!y#t$U`UzKXZ0SvoTAS{ z^h%jJ7^FS*1-(bFr05VO>qreu^|~0jGckO_NGumjzty#Je)_5Ty6a zpncjy9L%l;xV4B$z#>@{hIqVnjGf8>$e3v5yjj%UE((cqnwdqD-F6GfBvh3*7Ub+2gh?obzhOJ#X-d1xJf zOQxT^Ikb_#-;#Ng1k)b66=1WjV7n0zIyY|L2piJDMrEAyL)A<`CJL%Difk0^8s~N02_DV>+YIK&R-8Dk8J)2(oi@SPuw^ z;YwL|=z&pWm7-!jL+ms;Ud4vdIH87b#c0*9w3nKL*;*RRO4A3Z`7mrixHTK&*^u`z zp3S5I4Hr1BZM{v{Z)4PL@8i~@bhY-b*yVIs1qk*&u5<|vwx7d;@ZF*(!jr1N^!y*` zc`bnIltI$-(c-{NR+`DKY2bVdI;yVv#XfN$+7~f!KwIGprN;eVhH~CM*!IPpF(5mJ zVK+rUU*I&>uJw5S>?!;PRG6jr6nLV;u#3v$hwDaifa{ygm%?n|u{`zu@!Zy_Mf>esW*U?_2%D;eN^Qf4o57 z?DxM}pnu}`zgM6y$@AkL@XPb|xOA}oblxz$e=&gG@9}$OfZWRl`tV*e(2w`y1N|=` z?jQ<}@lFa3BsUD2zjxB3T~C$`%LAlAXB4u^jYH@n zkmaD}`cpX)GHpewoA3cFwBA=*Z3>#zyg#`BS_3J62JeBTx0tnDZ7aP7v{756`Wq)8 z8}a#2Rp+UAalNOGMo}>2SGXV0sLLjB%WQv`6_|W&7N}u%^OLzhm4*Z{9HfP=oXE#! z>sy^3stTkeOv+eN-g;&E32rZ9uQnHR=L!phROR4(X^9bR9hZ6rUFy}Y^OXF>i;H*k zwO;KJ4@@FA&{4v_@apjUlXtkL)yBYuiwyQOc>$+mrS~R= z+Z|7#Vqs1ett{0=Y*d7;M6DR();DFr*1>3BYwb73q|7kiK$Qbz7)Un4TEIo2un7uQbY8wQG@u z;k;B^)HM!dR_H|N^mF6^XnKq2kD2G|!n|l;a$5C)O@s!e(~J_Oz-Yi76Qs~3uDvmfN^oxM6`mS&kB>cm zys15h`p?r2^iR_o{9~cHwY8_*Ml^HISE5C!{;h{frS@OQ^OHYg`)&u)FRFbBw`!5E zO#3$AxZWA_z!s%`^^6(wasF5tWfdACHD{B3b_Y%_WHQQF*CHrOT6Iiqjl~hE4@!=R zOTbkxm4bd2M^rbuVY@IVD}Ba;=qgWFr$v&<8-9m6d8ve$f`C)LkuE{-S1m^fToSw|9P)=3REqp`5*IY7klQc@@j2f z+^P+BQ9P8k+#Tqj!2IF@$blw3*_HN0R9|(PqGnakSBSnAe;)dx$p2yVrR0mqbW_x* zpE18>-WhXQp(m;AZq_a^om&j)GYK5%4T>iz-p%|-0S#y}SQ`gey@CNQrVlpft0gZ&^;7}{a#d}3ZndX#DB@1AOepFg_-Iu2+KyJGK{ z+Kt!2S7DdH3AchOV1fvwpCEMn%{8LBN>dyQ@q`pee4Z6sFn=6_eVeAy75u#c{56Ly z7DnBwhe#7vyJOj{r~+c%+prVVWc`@z(S;vCO%mviWuyqhbTC8#{|33jXtl6(Wi#@_Gl=GN}4fpx(mCqBf}U3I}k7+ zJ|;ZEAca6!gF1(o8mqOaYuZ^=2V*w!2OuV4NTEmQs*3I$!0xRC#6xhBd+33arq%Qi zn0gI8!Qo4|w+4q_$vVH_@atLECn^DoCGK9BhE_}MD1EDT4Yn`F$V7u-HT6WQN@Sii zXB0}-qtFON<8ShJB!Tru6Hsa6F!7#`|9U8?VAV3PsTG$KV|!5rEp&nEitp37R)Mqewi$+nCfSdU#-L5>Y@RFh*990sU&yAiL0Dx6Yj{dFX9GSH^a#!beX zc^sz;c_v5NR!tQJ3coaO3n$&yH5IEyu_SRb8trCT8`DDuc8!NZ(ARY#yR|4P#~Mps^9HZOv3#DOwggh_*9xj_AUt6}SCHJjREw8Y|z< zizY+IM^?V>r{!^Fq$??tL1870K;)w_Cj55nR8yaW8uy~IeWAqIqFV4QYOm2{fFS?m ztY9a#)97k;QX7q?W~LG(#!ikP60+=p5*0MK3QY0s*55>kUlXw!;df%=Nso$H4H}VV zQ&D^zCDI_O2M$p=aB$U-mmx^A3H3cr;9iZI?j~%l_e2tBLfG9B8_RS^$}L>eJ%1m? zmy;JvHriGTay7!ULxFQPo2)m|(?HV=OuHIbFNNO#eG~Ci&|X?>1V?YBwV57VdoZai z^>yAQhWRe~>F~!u?c7oSLO2rGgfc4-^}N9yI8~?imx)1A@j+&R*E0W9^AFgXKmfR2 z5~(7!1p&bccRZzJZ_01>MnoAobv;zHLN6_Z0dC&Z%#YbbjC@j?R|}vAd0$3KYLh>u zo~1o;+^?+xvQHBg&?Pn!VuMY*JJ|82Dn6D5v5k0AAU#gjKbjBC>`fR&@v+p*HE8D1 zL`gMh=Fvn)HE8D1L`5}d=Fy-b1I;{Ekq|VCXy!Goe?e6edK-_4hD3j$F&V+ndD5hfjA1zvKP=;+w!vE{b|K;j1jQjxf>nR>j-lh<^-`W!@p24{_jzAWC$phCu3_56K)Lc@E{5 z?im~EC{*l4>37cSRD$&Hs=87KfCw0?l)ubrmg!LQEee2US97m~XDMufcBGa%6i}At1tzh|pOgj=E9Od@rzkCnY848zRSB8m zyy>s_l3HkOR$6Ke2$%CjAhm8-#Y^3)e6h<1+ZQr7_oRLWU(_c>SNrzO#Y%<{>nn}K z$uI)XDB?X38M6IiL?zk&wb)!G*6$O@6zlu2i_BDFwC+#L796*NMvgsH5xDu(2ZxBp z%QHClLJ}jzdK)N9grs^PGLjjH7%VAMAPlqY3`v^D7gl|L1Ja3ge~xH7glaZjli5XD zoo0%TRZ?u`gqj&+Fsa5Q&w>yPP6;(T#3&IZF7;tz1|dne2$=!7Q|xk)29^s=Wf_zr zW0|Fd0v!%ZfzDUz$FL+CatNuC(A;Pn?0W#4te|=+uU$bELF(ak)+hx_Ox7@^aM3D? zEHA6)QB7reTHTXZe}JA@7GjA@ttI1CAnl=rpbYXPqNkb20!8@-4Ef|Kt48$6jK-zr zPfWs?g;mo@jK4rJix;q&;&>U&wBl1jvv`=-z>Wk}B+5xZgH%2nYZ>S|uYDm}M#3)# z7hQxDBgr$%(xqZtrErj-ak9X(L=E1Y6WN5ghFi&*%6xph^9 z&>P{G&psp)e_4*FU@1Z~YUeGugk4ZTB)nzb%Oc6PuCfT49DV6!%JWM-N$V?A zqM{CE!bU=VW{S=oQl!SRlnhb(+Y&xE3w|Wv_D19>u}wrjfc+)MZ9_J3gb-I0W>dkA zw;+}n8AP1Le@(G{F{;}pw*P`!D8~Z48nl}{w+B)pnv^beRCSK37b|aq?Wa&P!h`CD z#7U+)>maCL`ynC#Y87)GYH!-~&n-$V3)CWpIZ13?mhKSqrh|#!pi#IVLWYPP%y*lL zzULGrd{UI)eGlc-S!Cx$o7RBIQzHk`!@9e`0#rxAW3rtTNhX}2F|yAJZMtdu&;a1|2%S zn$RhV3>^%OKFd<;O?lW{_mw&h!>m;vqMqT8Fgu7#RA7rhiRC1oZsrxK4G_GPeca4> zYBj`ftd~@3pVXD|`~1)X&T#5(Bo2Qpjuqecsqe|+`%&?IUuYo`7N9fC{95umgu0z8 zxOh7nPbF6eJGl9Xp12^``;5X6@7Xo_TG{#(Ge;m%9covG+0^f-Ct-9e??u4&MUx{i zpM67D0u{F+U$RM@*t1DA<6$H(5t-INz=qH;?_{&uvBj0C0>5HNmQ%je9wdva!#f~f zgU;>eOdM@s#+L!v4-$7-B>d9Zzu?Ib{2nsP{g?FJ>Y$PI1{&YExzc}zR6fQom7}wm z!uaQO3n@Vf4P`d8J70!l3+$R7mPh&$&^{7l8r|n8#27{B9oK#0!A6ZjOhOLABxHhr zONr;C{XZC@UoZr&J3KS-{+ZYR`yu+xUjOMQr z4AGbP2Xqh7m-}_RSMz(Te;C}C=jH#nRKGqi|7Y;cI}wme2MoAni2l<71J;z_oRd9~ zz#}w;*&b+x=dwX#@qS@Y{zoPH8-wyMEzv(6v@ak(%g^r^qW>~K|4$|Q{rN)xd8Obx zct1V(NW5Pz^yB?T;r{FkgJQvX&={&v^CUdHpLh_B3I7G>{IV_`L^*xj+g+cp7;j zEUJSoV8t{5V+vGu1WYEX8DK_$B-ncdiP#F4e%6c(;ZjECq)Z`8PNm#awX&I-$a5T- ziiI%!TXV6HoR?4mtw+rzV2j26{aLh)_bGFgGAXFr*35#8JE|VkW#4xwbi=UIhW{D! zb5%eCkx$&Wh_ul)1`bkyUUy<>6qLHOBdUf2MW8Ubo;CFdRu5eg3DMDDds`lqNcEwiRWH^jXL%Zizu$mW9K(bZ zl&C37l;PNkuXVL;{AXL2jvHf1W26O--4I_}KYVR`<%iD)BP(m;J@IwJx5gj*@P%OH zK^o5z188Kr>_dd*BP&E3XIq}>j0&TtM({y%aSlKY<&;WKLxuRMq#xPHXyIx@ie&MI z8j=^14LoW>Zf>Y#z8it;*oi168$7KkaW_M7_F`;Or0v2oE!ciI3XU^70))J_XAGx> z?{fLgiQ-n}4En@31d=gA24EUfGmA)kIj11%KmIPwSHzJUwebyHe3q2Vvo&BfU>d`Q zZITB#wd8R-svhcCPwHtLZ1H3wQ1uYI6U{z|SGa{88chmZO<5$}b4>&q<4$}?wP)LT zRIsIflv(z_jptM)25YadGQY z;U|pX_$Q2&uXzp6!`Q`f6?yXvuwzT`vY*fgP3GcoL|WF6%D7Tp`b)$`SHPANfnv)I z=Ks7?mFb-}!A5aE{K1f;VE31zyyy!gON`e?RVsOimv6jX+qTLR@w~$AgZWz2^KO0k zjn>yN5y0KVZEFG~j2wf`aUtX((NoQJV!@6%Ldd5{woNxr-3RO5X%c}Xkt0<0F%v^W zTMNKGW zEnIrxnURF(Bc$tq-u!|xEk^kZP)TKHx3bH5Ob5k1D40-~`l*Z#i2($;%*pg+-XbuB zbs_;()x3F{rVZ9PH)dZPZS}>rO&;nD=!Yw-K44d3G9(*vqb^XJm>j52PS{aTohaCTB@!e0q`@k6 z0z#{<#uHkM0XS>|{@7u^KnT0cc2x_fURNv0Q~y8#36VMOrG^6=n4l331UpVa&S-oL z)26fI@R3@D@X+UD@Cbm%zJ{=h^{1Z2M}7Q}f!oBMxY}@0uwydBh+2+KN>kZE(33O! z2KN|qm@*qlmWi2~qTf^#%~JJxzdFgc%P?qA*lW`FOE34#k+U9 zNbB+X{!*+x;tj(6g17vUV(p*a!jFr!B|2oqg}(hY4F~jT+AH*0>c{KTJglwSIN%hV z2psUgTdZvk?E9-?4GY-sD%P$Y7=-(_f#uH?Yg-4B@23L~d#zaeX?_6jRdmwc8}wRM zfb?%I*!#L-?V$qS(qiqgf*{;46_kHiq%9m=*jB7vHW*1K3XzFt3QxjX>7qJT^Ot7<^`&N!b( z8XVq1QAJi0-13mr`4gF`Rkx}qGETGo2HKsD(#SlTOxRCP2qZ=aklQd$H(T-wI(>a& ze02j3^08e(WiQ z_JqzrxyZjQpk3xU^6h~3sK@t7Kzq>>g!_F@`2z#7L#45OkoH$P=Y5&4v}d4phYwsC zrwwV^^?sZ&^bCy(AJFUiJm9*EUXSD*tZCN`0PIindT{_??+qA%1LOn#gu`Ravz@=g1<)9_s*0IXW3VEJ{*okG=#kmEP&{W1~(oUF~ZRajB@0R{}sa)eKVHyU-(D#;x+1Y%GEfX(o~#DQ*0c^ zm#c{w(-`Wc2?tJ53o#C<6Ok006qyOKmVcmbU**;=RbD-W1C;v=bD!F z2rK7pVeD=Z2D~EL3$N(TBVO@G<`qxm5wCz7yy78h$VF?r4?Bd=Wbm24pOT$JnmMTb$l6d3QpQ$kbK=|1OR62#4X8fL zY2d_Q3q=j|I+zoZZ9@t;iTgW&k4zhHkt!R3B8d(HMO&tah9aE;wrcR24{6mXC#yyX zlbZ_sj==f|Vbv(WcC_SVPyO)M8aiHY-46>R%IXtPR&6&;8sQBqfEXu@9@}L%X~caY zn@Ix(4yn(hMNB+3r;GSs1(F;C0jB|zrH)R-Gj&GuqlsSdu;L`x{s`!SFmVb|SRY7#%tevO zVV?lao$KSziWFc$N$h2%Ff)#|+b~LmR8o{oVuEkr;|ZOT3AP^ysiOXv={SdLX)T2I zS{SlD(Dw$$CP%)3yg*uDz4*vbZQ>jst?x}-MR|-ShC*p@9;Uf37zbl_0lLs$5#==+ zwiuXn!cW2g^03je4tiDmfL3e6>m$MO>kZG7;}WIl2?du%;*WNGaN&0&Eqh^q4C@21 z0HqRhbz|kLUQ)7hCBxfjIf53LwLI9A4Bd^RtS>R*TPaKR;SVl)#Ax%u26uj_AdIDO z!KDj8v~1E4HAdx6)kFA0p9r>hqm*PS2X*xrAbU(%weMm-wSMQz|jhz z$kGl3g&IgGRO(@%K$pB7$zr*Shk8P!ZB-!sOJ&ca)pDk>tsvMjoOEK~5Ba!)AlR`F zePPWgsrG}yJ%W|yf;gxmxl~ZC(n-yf*kN3_ zQvEiw&x)ml@<=k14y8aKyKX8148%wmd zL5O)Hy;cmulA=w6pdDG5zcseaRkWAjvJ^Iv zD0_)G$e`a?G7H@NUuZ1(CdR^C#*&3ZV05Vk24)P%{q~aoYI{i!h9=t(@SkEYIUF{U zhuB`Sf$b&lvAv{|?Ikagy(G!@lI8vO65~JJUec%GNlXJE$3tt-Z!F1SEWv$$Lf@ZS z431&hw|2!|a-Yd)po{#swU-b$*PmsOjr(`dAz(2m56DUzPmB7cS6k4lr6DvSl zVimM8i;h$pNITL59_W`~!FiwpG0mG;v4U?^;G~ngml=sWIysds!S)j|KN8EC&wvUr z0I?E64`=T1ao>JnDR28?`8pmoBFQELW%@Q79@F&2^=0kvc^cKmRxm-vJ+tJpp+4Hb zaM(^kh<4AH3-cG5!C(Qyegw+`My9W4Pz}*Uq7$i0J4ijYLYA@7C4y@$+IyhMiL{-| zn|fgWf}Ruq()@KObT$pi3p`NuH4J}?Y+qj|9b=a5t3JGa1r<&izt+k9Jg@@Tj9+Bv zs!e!!Lr;eJtCVR65>V#yo?gsfrP&66ohtu@`3oC@+5A-p^A~divjfBY^$V(^4D(ml zuA09@Nlc39-TYM=jo(E{a!WMD{|@t)*zEIBH2#F>PFS{H^-xb;1wxstvFMz%o;p_i zCQsPWu|7UQ?(z8mF0sQ0{?!~MJ|Fgj2{lIIicWm6jwja^tzMR_Ni*Z3zREzs`c^3mWOPf`wG z_j&|&uSa0_;@cu4dO-v9H^7B896wP|Y$V1*qx~cw$Db$&*Ct?T@FDtzFOUgo1LE4OJ6EHLoYozT z7n6jBTx9o{xxV0%GO(ePffseqebGS!Xj>3RJ&vlP-9o~6(f&9(`fjz*8Q3wz?TGFO zH8WvHrfEyr=P=U|=VS|ALwpk(=U}A6)uFs@P8#V}VDp7Cx+!IU9Crh;!r$4qXB&yz zIw^Nw)^?$Flvtb@j5QA6Rw>!hoW?-Woyizj#~X!q;MXz+s?JP@F4n;qSZAaj#gx-X z{FzI|`-D2Bz3)l%H_P4!3qv+fb=dnzZh*8=jyx-ALz==(fhgBbNwJi)0aj6Gg`Z(# zrYEbl1Xm+xeX(Xa7P<6hi!$QevZ)&&oWOVpGvXo`x?oU*8S#9$mNZ-0lEHLQk*)DqHc#;R}6Q>3ml6A-pPFC3lJT#=H?m`e@up`4A zYEc>Ph%cFjyA#ZfMzlKL8jDj`AUej2ig0DHocOtm2WDf0FWi_;xHW_>_o+>~)Ew6X*Ga z!R|uh*}({olQKMDt)sBxZe;+mFMKhzAEMXBw>4mgXNL!DD!f;)<0Ie?AB*g6g+q1X z%npok#XQQSb%u?mPL$Ts>ARnv#7Ys_c~gztzGT;otxz?SzMU(GJ}_OZ8ML#cKN z83+@;VOY>gwn1qigzJ7X5GM0r;oF#ZJ^Jot0US@Q-80btXsPzVz^`u{qP;%Qw|$7V zd0-LT3kMCmyHx8QM84|=9o$u_ZOR{j_p$UM?Ok(lI$+c5zPp&-$YN2}cs!Ti7 z93+r9yBcSoFQtnI5>2CM0}o9Uv1bP>Lzd94KnxY(2JG1pSM4-lzs{NXZ^f$r_b9(= z&kjpD@ppLm=`mMT@rE6~O*PlL6x*tls`b{olu2@3N|V8z0c>n4HcexXi-A2Z=1foR zYq+Wt)ygN?h%Gwv%67=TIg~%tlZbC_I)O0e$R;nrr)*a4B%3Oe!Qx4f8yaXALcC#e zFWCeitPG(y~`26_c8T3@8&^;3Ny_DJfm^1rIX;}d#aLz>s$`o5uQPx<^y{n~OrS0QDHH9EKq zcH*qoGfz8f+8MJku!-zizjEb$?+wdG39f@#RU8gymKbPIX#Py!EjVK4@qkpr;^F>k z-KYINPljE)EQ&;lak^cc?nUy@x|`9ZqRAOd_llgD{#8LHiOnsbtS^W5J32Y5a-YwU z$eyA417{yM>&R*o*Z%f7)7*?S@wfK`)VR5p%+_an=?o^>?<*-@wLMdZY0og}{dtq# zpD^hi_c`?1@w4b7?Vm~aCFhvzw4<)XMbAVuw$*IQxS%#}Ea+5l<5$%#ly{gBqX5C- zYT;pyx)x_*8@y9coOOs8=&ph^Q$Nb;vs@3d|FRqB*qrP+zVz#wcErdV{hmvxOWs7U z`#gSpujluBo`c}NkNW5H^!kT)KYTx-?~C^~9Xk7aAzAq1NkcK!YN8Wiq zP9MJi6zvC~b<+oxA|LKAlW5%wk8ZTrY%RPphPM>}sNqd*G<%6*vi~?YnpIGvP(0fV z)Q9B7C`BoVM(M`R*-m_YmJMb!{$ve4oF8+48K|`qxV7FX8H;#Lwl1&U#<)qNHqL_Q zQ5%B_^B&uHEH*fmD4*0|44XXOW>69$FeQOUo0OD(gmFnOrVuDD4sN}F5x8~T0<<^L z!Zv#Sia7J{z2DuA`?QEZtBEmUyR3&+_%eBfffmSOtr$Z%KPrM_x|ESd`e!P`>7P^0 z3Vp44AC}^_UGQ*F5LVkK9_WM*uP6<+(`IEk%RC*t%bI0^)$eqc`Gu}3ofb{}mNH7$ z8sJnOoCgwYe+gMs$6wb#X`tw?9e4;D8Wax|+po0=w@d-7L@NK+0WgBZr~WSkl^j#@rSoj|oX zRXOyXP?JTV7{_*!w$O)Syb?te-3S@P3Q! zM-w+QqzT1GWr<~Zj>`HlcV(%)oH#CVf3}SPik8%BANN$PZ0^e0 zf0jM)-|W1*{`3C+8_xS%46(+VVL^V| z=?sg8Eli-x(F=CPj>m$p;d2Gfr_T91kt}dzqP5QXOCzkBYoz{) zk1zh5zj5~2fZfFOWxDM%k6h_O;>$Yc?=?Q>?~i=WAKWL+t$}}{@&tq{%+)R z{%+%Q{@}(re^2l^fAGaQe=qVme|S63`MZM8`MZSA`GXth{JqQP{C!*`&iT89&iQ+c z&iT9A{hUAQgyNz3hjl*7SAV}+5whLCU+pV#xL^N%HPE7|O6ot~FZcO={rlDW&-a6+ z|3CPAKl^?W*WpPR7?S<_)!YvE+wJ>B`uD5#pYKO9?tj&O*?#^5!}(`ATy(edAJe*p zn`v$Cuf~40|3XU!@dB7V<={`-sU_ZO|E9+Kn!B3&3Yo*{43u+e{i zQUCo#(B$)qxc>W#sB6f|=yhMxmub)7?z}r}8vXYd(T!i`W?a+gByBYdJJI<4_ZNKy z?k_U;`~TbAS5yPi>A$b2|Gpw@gYLhtC{faXUlERV?N0aKSESD2@4v6;UwU6rZ^Ki+ zNh9-uy#D)&Xm3&feMRPy0OvNg{`=CbTRk1yvgoKZx+>j%oo7G)`5Z^^4N;o{cFTQf zHXFtlXV3UN_Z1am-Ey}FFEVcQ;R7=-x&LNjGC%!Cpc=9qf$A~EQ!IUnx_=xu11HAeFH{?EsEEWTl_%;d;Y3T$$Bs+6;WUzL zD93_rY|o?q|F`u`r&e^c_pqNe2d>e$4c^#k+tM8)7;F1bT5pd?ZQ&W_>hMsDCMdM`sDYzvHnUoc@(SPB*e&xrK+HozOi)$Ivyxabic6s({s ztHk+npX`_l3JYL4{i-u78EI`|d_`^I1iC)CHgUEXx8SHWa4IBV9EK81?FYUuQWM7j zrI)DA`0vwU=^TyY3L!|8AERkA{BQU?XMX)DpMHhMhnt$O@f5-RE6*@&5q`?^{gpn? zL*8L{|3nYreGeU1b+ZpAE^PA^zv9)vSAUZ!+l*7Xo3%oBGg9hqMnQM;P;AetE;=_Vcu#5G;!?UV1j?J0ty@`n zbE$Rbh0(9S!ECo*e29b0e)*@w9iy^A=dRb9)1e=Hp{GhW)L1e|wSz=_+=zv{P7 z^~*Q^F80~J)4vdLN_H>(_sci^@=fpZ%^8qv)_TjoF!|;TNH)OVFW>abH~$j(<`FP} z&$9kz?q^(o)4PCET-B8*T@)|9L`gS)XXz$E=K=m3>23D-&scZE^7en&dYi8fy$gXR zxLfG`D4)rvzvw<7yU>@XkHuusxn|<-VR1e{OJFT<1 zp4P#neZ|lDwfp>jyx;6~oy}#m&gK(8t+VOibvAGV|2AG{^ER!s*%xo%$D8s0FX6vF zuXynQZA+dX?`xdvY?!~CP>UOHCQXPY4y;Z1LbO!1NUdQt*XzbV{!4|DRvqW%!h~G} zPcmim%G8BMxgNo3u0@f9>5`22s@PFjC5$DRYlKR*ZR2*VEyW5~{)~85%`}2%bwxd! zW=4W%JxVJ!X9j1l3>IVIV`7MrXu{9DA_JE_7~wUseM!%1ByiJL@zxz)3{_ZDxRQKY z-$v-II|c=>>T2(5jYbm((~Twd5nK^T$ED!b@PnHYtwquBhx37>oiYqv{9CwTGQjz0 z3cq>IyA+zg9;je%dGSU3V6#T3%1|UaET4jKV6}!A3x-R|a6d)${&#t`xo6>K2Jd$$ z8S`=Q^I1k5_ZZu5hpES%6^Q{xVlwXHU4YDDIrl?Y%SHEAR1=zAYz8`px0L4=cR77GlMAbt(Mm=F_1O&D(Q8fNx6auky^qaagOzuY@GG%E@E+gZqmFJ>)qzVj zKn0QTOY={$P}HEFUpC^tP}A@?n&R(}@DK}9!>d)rxP)4*gyrSA9(=Zzq22LSv<8Kw z+uai*u_W*9sOL?tStC9>WNh8hfJ?S#qYQ~jMG?>g7B&V9Y-(>d!Veq4IxYwn_%&ep z`Rq_L-GROIJ*=(3;^MNV#0=Ep#$fwRsJuvc^Vv;wGf5y_$m1(Q6h%N(EfMVAh_t;E zh@b~V;(1sijj*j7iC`k(cg`-0#5eQ3C>iwfk9nXMoC^&aWGhB|bL#6zmd+(ke223y z(NVf9>`4&*1X2kEuX?b3ed~twJF&f4o@;>Ng^Gz4?ub#gLg~vsQ2q;nwj|iRfj@ePL_MAICewhj2H$a3+bb-t@1e)UL zbaeN2#Ipu&ra2=TpB`$CAO*?-LK?Khd624**y%)cKO~PD+=b=g6X=_9;<5@5>==zN zs)-uTQ|btOa=GZn_Ti7Axfm{~=FC9U^9IvKY7+w5=o=Ue4v7R?m(mT00wJN6^^Qzn z_55V6cL9pxEb8i}L@fxbJJ?=Dl=i0`ItJiNQ0(|CoR7VjUlHF5Z;gE~cuyeyaNDb| zw7p%s@c+IRy!yd~ADtS!a%JG*+W1qku#mU6&f7PAy1K7BzTSB1?Y37vvHgVSnphM# zlE>YM=x1+kOI0rX=&-Y&uUfygcE>HLVO(-T+dRx3p*0jI{LPr zKqS09*f9YMUhCs8r2iOAOh=hIUXQI1S4qY{CXR_7hdYmq@VoQ(=l+7yVR>v|aj96W zYlL5h#W!@$CXS<^1d{CYEjujrKS-=b9kU~lu}cOmdV*D z@mI`v=m1u{^=^E560L}BgvIgL{nriBuJTmfG)UXv8TI@i?FR2qy#M0$T|0;_mBV|P z-tNKAJ-%1yC!JS__w56QA;u=UG3TWK&Zyon@J19tZFiB`R-bCAy^(QK(?TK?+GVk0 zotb%XQFg1C)N^bPj~DVjI=YN*G5j(Hiv^iU%%wafE&}t|wqqS#+wcPhU~>o2FK(v} zr-SWYf}s_o$wMfq^k7?mhFnHh{4VB|P zF@)vRY|*7FTWf;DqoL;D@QIUAM-JDiz31L_XVZlvaFgNPa5b`$X*mN zJ0764aHK$)5yti8!H(Pc8_AG=bFhQ=H^IMx{3i!HXbm~VuO$De!Hx@M{A%)_)jAKX zrO8NQ3sGA)P`n)M*aLKzS#h?uk=JNV3@t!sD&;%0S`FMNL3J;BQnzbd+@H0Y`EZWA zPI;FP*PNghag-k2w{(c7d@ybo9bWpZ?m7EJy#DIB+Jm2uynEp~Uj0xwQF+$=OkeX9 z=>CBI&Aq;@MKhO9D>CX6JyJoxV0yfj8~rOuk9U5h>Cx6UyG)O^xc_Q;Wd4=0UoHyn z)I^s-W2^-G{1n?SjKs+hvR;|r5=|ZeATFOfQv3+^bQs3drub2j zDN0BTE88E6HAUKbDj+VO{j~^*&l+UD*h4^0;2rDWan4&LUUL7#MIJ1&(1mh5%fP0j zj4@Jc0{*Hl9;CJgf5%t#VYo&z<1yf((=0&hJ7U<$2YHN9Mltx}TKRXoaNa=;Bx+`a z(K!D^;x#~a3A|4Z;eS8Q3TcI zLqpI*qH@P!6rzy`0w&D@FbrT8FnW!VsG$9pvqKd;11QH(-IN#=0^m6NMgp{Hi$BYQgKN%vak;L2(18${hFK&vD3{jne zvLR=2bgp7Z?-hcsjtPb452I-W&Ccm&gaT8ibHFu>;Xi* z`0#JW%D4SS()SZ%5 z2({iHNz9=+Q?UJF3aFYqyn0?$`nYA7--2E)Kt9hDt;@H>W2YY&7Zer5QD$Re#i-8S zAD)n7O4R1;@Po0xU_dAT9qTEvbN(6u_Y_pp(08ds&?v0sXyVi9jm@9?L#Eq(?grK zto;i)ltAb;MaIE()RdT0f)Y#>P)=e!p4wn16KYI1Dj^C{wcmK+z@>+UocKuK+MN*fiR*? zHxfRcb{KJSYj{-`W8}_917iiDVi4xOedvYAeMM%emzkx80Mc;_&=KRn5M55c<(bNu z!;OUF_VTA00is}Hv=-4b#HSi)>!ydwNt=LPg_0RUn=r!ECO`qZ5V0`alRiPVPxxih zzp8P7t5$WB)VYv*AP1V2%DE&Zsk~uWWIF-TD~|Cxd2@)+8{zKOeNqFERmC4DF(W)Q z6m0)H`P--Gi?8J(VX7=9sH*9M^;?N+M&qyUcoGxI`{`=rN*v*!tPLt0lMBfo(88d@ zMnRoZO=@}vtu_}aq5w=-d_CG!YRg#!<+c=53>s*L5JYHXwU`^NIrE&108yB!GOD6V zGevtBpaORUQG*!;UTBd%HCILIBMcIZPR$;zWXh~AW@9VeeQ;X`#)GS6VWGKilV^1C z2u&O3-|Y8H*ngwnbFpXGcI*`Pd_&W2qKn?Uy(iPRzAxUd==rz!J=ggBYhmN?`JeWC z7Ws<-N6U$a?k*nm-94}HXut6wt_j~gykZtp$d|<{s6-j_r+*>8m~583pI?A&)YKS> z#Z$RX{)_m9MgITs{6ex5?tcrv&0np>Yrs*!Q+oJ^obEo|@=o8;}U=RF2--3HgDSO*)wK0&zsXSWBz<+ z;+)QrO|7vR3!I+FitulkH*ZewWfu88qHzW)=ZuyUQ0O`H`d(U@PE}U?K9^R-A9;M^ z=(;(x=ggaM?)=z{Gjo>6UcZ%*GpC(CgJbj(mSV{Aarnj=bIzO*n|E$+QDpcDv1zf^ z`Au`qIs^65hw!zh&5zBS))M1%+`?o2Za!YqB^+L!R9Zl9xp0g8964duw0Se8H=nU! z#_alOv1x88Sn-uh#6MiNFJ~_@e!{6$-x@P}&a@aKoH%dV8L{~deWg%^*`7Zq{-f&W zw4OG5#^+AJHUE<$XT_>NH+o4QIr2~VtG@NQ6L8D_QH1}9!*>(@k&LHy_Ut(=)2IXQ zz7`hw&xL>Yw6Ht=Z|#;AcE`^x@VQ%fC;0o^!i?vr6Q<2OW7=7nRn*2Smdnvv1w zEwMA^oVD{Y$DZDQyL&6y7w~*p^{~6s>&N$HwOoHXpQQ#Kd$gd&insB*Gx^Eu60mjO zwfxAnHRIdrm&ezLaOxLdjdgWLmsdqrV_|u8 zP+?i5uxNB)pdnx6ccKh`yb2#JEL!CC))oddjqE2e=}&1hzGDlEqVS~eWzz2e<;QU+ zQdEw6r}WPi_tBli-P}vu0P33_w{$C{f39@vcM^AcFL4*{Brd57>B*JueLIQ!QZI40 z_Y#-rY%Z((tGis!g4@rxh87!nJ!kzcxL}BtZefw(w9(CseN9T{=Kyig)87j z(X{ha`rM8ep&h?xwj+fbDZ`zs!XY>4-`^Wl7%=i{@ovoLbf@$&TzenGE$>6P3gqc& z8SYe-zYKnLo?=%Tg=MCUA6gj0(K5n%Pg8*@>ll)ag*NBg=I^K?iTrK3oF|EM10E&D*!-7&^dvs z8R2VW+>1bL92a@LjN&Hs(S_wpDDEPEEeJBtd*h(Oib!EO{6zF)iB<@q2{H0D!g=Kv zfOFFqfOFIUWERivDti>Ta55`DOI3Y>9+!F}g=LpfeI|XQ3oDlR8wx8I<<%Bew+(14 ztnn@%R9GD;tVB&CgjtuMC2HG^5}#Y!)~mMtb!OX+LfoM==;B$c=#cxySc@m8O-dS* zkKQl2lF6T^$oRhp4n-T1jt!>c@0)R&6i;6!~0yqAfsLE;4;!Vwy?!V^+a;XR7WD?sP(F_9mHf+yDDb%XSMS7s z@=p90^x{wXzE=9%^G&ocQo^Ue&2)k`_f9AbkYBU(BlCswi=jjn_}(P_ropZ8cz`x* zgA6^_OG3051Hh9h?a~4Yq-plFi8tOUaoF2P@@n)C$*b$Zt5*r$YBKAF{IOXOa9b%? z%CwHcx1jsVHvb~u56E;G4t`QGDgA7bvX zUB>^Ts&CGFy*0L7YDS@HEz2b%f^guOVoTE@C!y~(XLYpte7)F{1*1BM0@p%`Q&(dY zWTT}dKgsdFfyR5tPmA*EX}qs5Z1(;Y<2@i*<9)r5oz_Wwm#RDhpUfj zMbVMH4p`=~>R@bPmq)(=6`G?KxUI^8bA!a$2Div_m#1yOqP!*kr0+6)sh9Hoi3~&Y zXq9fRe53DWSwRvShV0#YStM;Q^XT95=Pb)O!dZ_0J0(uiQi-xG%V<{$^Rx_O&QE!)r8!VwO#YO@ zKsCZ_mtp2AJja`JEaqLaZQXyml57!{$A76%t5R{N3;h+u;7g7u#?;`Um(9@rW7-e%Y*nD(_n4ZL`GlON9q|x7>Kt+~V|{ zjWH(QJ2O}3GrHG2`q<-77=<-<>hfLzB=z0M)f&uD9>o;pG0XrT#|-ib(ib3K)A7HU z23tHIsJu11&LcasDy}Zydvg}3A>Uh*1p+sl3jAATIulho7Jo#$TXWr+BDyI)HKNQ} zAdG2~0Kzb7h8ml1AdQKiDMkx++U&3ZKJ^lU2!brVhYnP!<=plv&ai^1Im%(5heuqtuoAf6$X8}&3it= zH0DS6E%LlhhWoh+Hzl)Qdr#~xEURBrSk(AvVc-Osh0+uc4Jg`!%Uy~Mfb@J;9Mo=; zC60VmcT;opH6GKruhD$;8cgF|+Gj#$mx5H5qlq!&7ku|=nf9dK##88XOqpV#N1vQ~ zJgrmhSV4>r&uIJ$zPr%DccU_l8{Z}GxiU;P@2rI166trOsxy{>SqCio&68&T;4y~e zr!E=iT@?p3x)XiL4X8b*z66|z@D+UxFFd;o-_+fRuNwKfQ{r0)H@8F9xHZSDqOtk2 zO{&K98sRs~xCvWbNqvmatz2wIuFbcJ{*nB1O%GyBly)_CW7G2oCAV_DyUHmfw}R8< zpxV*--qATdz+P9u1LInjq|17r=}7xNnTPjn<+1Z8YYya{lEt6E4yBZCj0oqM^8%@1Fx)#gnzWqc#yKVi*J`XZ=#BYcWVv0N95?5z|Xd*+^K3U=% zqtdp`8A;||ApM8i_=ltKB7Mt7dVFe-9fT6+c!wva*AzCmSjL~8g(%dZ5 zJXrNdo)4f^oj(XhcxVo~4=tK}DB_mmf5g}E!c(jA zT##1;vB|q6FX_L`x0LoJ69qurr5Sbqrc{{Gpn6D>W+#50uYOWLz^{E1#4uN#?@R zfPsMMXT&hP@VtkAt3N?Lk#;ifCp6Mw@|dA8Kzx#KX3O|Tdu049U5_=lj~3EglG5yy zabk+*xDSKiGi`HI^;w|%j6`emsUL2X@!R3%JQq$ibvGpMX#3L($6(m-JLZIz?xntP zt{x^H=~O@&`Q^aVEb&c)o71Z;oNJ$2P?=&fjD0?9=QrroZT_)^cY3_%WRP5<6jLomkaUje4h0on2QKLe@0H;U5>c7N<0@UJeU#XE%Gn% zCH2d^fKghH$}mH0d9|ly$%B|C(;PH=oWS5!4m`BumYz2JbDl9f&Q7aZhWWf{E!;_3 z)b2OSFf(lBa`aKw|HyWqs(W*jTRpe?KP0|RvwTzSU6kiRW#5D+p52w^EQzlZI7OXi zrb+#3i41dbhVB#m)o%Oda9vYv=B*07Cx(5z6NSID>nR9)p7 zOE8g;>ja=P_v)|Z))Vtwx*RwQ$f$?sb^MDq%H#)>=SmqS;OGc;Wdh?K4@%t#fIgh^eWar@RjR@`!=d##My zTl?H6!|ZDNP+4OKQCU7;EMYutX1YEOlDCipDx}}^L9*_1^*82C+@9m9Jxg-) z2vawDzQnl+Y2<288h<-wn3WjhI84^~$z$5s!ew6Xbz%TE=R#xhshm?t(8Z(Lv>EPy zNSwFXaOUQB%x9T4KgvCzm}N0!I&*>Ftt_);n5Bx}S+WGLU6Aw4tsa`wWXZAy@Gh6} z4?zOC>Vjnno-@KM=Fupw0D)ZsePZ8xOaef8FwyP-Nmt?f+oRuUdO-4uXAjO z$}pdW_xKKD^d_BB9b7N*eHPxcLB{b|`{qh#`;3yXzO_&0*u6l;?OXd;am$g7yJcLr_Mxu5L54Zc)<3O13*O(G zbNli6tP2Q`K>|--!&mQO_*uIUp0a+e41Y>S{%y99n@|E_vodX{kIFdPcFNbK&8hkL zoWk?yeAqRmwt0+Ay9PA|+iFK1&Q+z|tmH26@!aFbXHSRf;Ch+PuGGOg8Rv_xgX$x` zoI2=~>Fi1!JT2pV(RDD27v*7o`UTU$%`%-`se=tN&KF$=HAj9qba1OoXIJXrB^f9E z1@nXYZ;3j%{tKjoW+bs(rgN-~C))KpEdODi-j;`@J{fiaBVX4cz-GW|^9iSRl*s!z zYCgL&Ue@W+r{|XInGe?h-9(A=Ra-u#ev{=~)^9dKzp0-uGi9@=AU?^5*Ge46!7b#i zJ5Bkp2Cx;oA&pOZNh69hhLRA5$G*n0cRugEHs^o>Z4A}*Y>6+W>e`Y^u`fjGO)WiE zeIe>PoqOJ4u1n~WI4=NxQBR!?z3J;ROyN%HQ|gr#dc7-i7NjA+9O;Y<?k3AHyDQCGcamli(lp5EghvJyA35G2OXU0SJ92noPil8AFyO0P;HzEWYh2)K zUEmM9z#nyiKkfow=K_Dy1^$!^{Am~Xvo7%GT;R{Uz+Z5IzvKdc*#-WJ3w)ys{8bnD zYcB9NT;OlIz&E+TNo(bNbS>=!0-|f1UEuGyz~6O&|J?;nRy^mUYyWTp0nxShUEm+O zz_+`=|IY>fu>)QPh*z`VGi@Ps?GxLVa5i#y3!WMNQ%86L=-NMB;2NM z_c`D{1XizR!SAu9qHB4M@Z_y)bfRSDb1y!-USuV&$I$_QWP2v6R+wzms>9~bz(F7W*v@FO`t7W~|d{FFPwi~J08z%O7t7CaNr zHyq&wo{$5+n(1 z@WWl;N4UUgRj2dOwQsq=$ztbxbY6{|3x14C_)#wK@3_Ff>jJNJfsb~9*So-JhlTUe zwMG}X;Q}Xa<9u{pb)E~}_z5oX$u95{UEu%Y0-xdn zr;i9dfp@sTFL8m>Dk|rrYnQsfY4x}B(Q&f8 z6H4{J)CEo}8=Q}>UEzQ);dZg`NVNk;*0n1g;mJeSu6BW6>jM9o3;cQ)_zf=bP8az9 zy1;LCf#2c+ztsi)YZv%!F7V|p@Y`MBceucR=K}w|3;b>u_#a&0e{_MbaDo5H1^#Cj z`28;M2VCG?F7TBu@NO6QDhK>irgIBUdwSKQYik_g$xqjMT;LBm;HN-u=G82?y@%`C zBaZNwad->=9x5}O?xT+IB0rD2z@Kn|Kj{L0$^q}@{8)I}GV=4ZBfQAZvo7%GT;R{U zz+Z5IzvKe{s{DpV4 z@Z_y)DHr(LF7VAR@GUOzcU|CHUEuGzz_+=;-*=E69;@9*S`gy zXbSk8?1wPjW{zDh|d>1(FfO0;%cD4)r92fYxF7WeQ;OD!*Nqg*k zbnQYH_(B)>#V+t4yTIFB;Fmby!=RY*Y8L!xo8+NuaYuM6jjknJ;7J!aom80ljN^1I zJnc4bUAx>7p1h$qaDiXtfYTX)UK^fi8ThYpgctaK>H@#c0skB0xA5>f5t)XLoAzwU znND51(FJ~!173;6*j^i+O#Huagcte$r3?I54tP7`xA2^3=9239*N*T4|7|Yt-#Xyy z8NY?+rVRXdIKm73zjJ}#{oXGJXqBCn1mz^ahUbs{4cw}Uva?qEuj2ca9a1R9$ovJBmDUs-opR73XES}d(9D^ymjpj7xcRRANBC=EQy2I@UEoMM$D?ar2mBK*mxU*@o^?lfQ7*p=JkJFl zaDfkUz$X?`yI64AL!};FD{zFri^E&^H>tq*#kvbec=Fb@pbNan1wOjM9}1K!H{vG8QdUFDAOB0u}Pz(WrBlZ@ZOQihF7PH7_;?riu`clAT;RvM zz-g6&^U*cC_R;d!wG&*zs~an_$@ql*rH%vha)_BLqFpJzrq18 zE2Z*Ucrx){=?FiL!&~rhMt-dIR5md3W39i+gj?&Z6g&a^ns$&+eXHNgUEtS9xJ}I9 zC_k5QT7PYSej(v@xrh9J&G5(ULD_w~gzuT*IwDiyZJl48PO?FJkyI2YgS4U+sVoW%%_D`2Gz4UkAK`;kP>A zhcf(j2Ye*MfA4@F&F~ctcn!lJaKOhfe3b(pW%$Dm`0)&1=YUU^aHvHxo>Lfpkgq%g ziao&+UYP~|KEt1N;GfIzR~_)P8D8Sx8|O3J5nQ{H;SMs_?q;}+`O18)VK|KTS zhp{E=*^3D*lKXNKF93o_n9hTA5$68;Bp7a?n4D!j|Iglez*kjd4g3)scEyH0iJ)RZUPvfwqXk7!P!L7Y5RwN(Ljp-aa4op@ z-Wyg_?7bIQ%i6oU_OkZ2*4@=zUE4Qj?wtGnZ{D5cMQ}gA&&&_52HivIx`Pw;5{upQZI(htX%k5iN za*o|#xjYS-o4&Ao{ak4NTG3{?Ngm(T^3C)3xt90NY%lqf?M=bwc9)HL3?eh4)E$3azNMyKmJK7z0X+UXA5d&k)Psh`H*S72wxe{#Gondfu}9-I%MMHA*Dke7=+AAH?#i=TOVD ztKh2V)&T$5@=x>hY)~rsei3ukGdjSJvHTygyxOzS@~>mAdY&`9q-gED`hCyvq&WFL zpl6kh#LjPG{hDt#%YTfy#`7S5>ZE$K=RG69FAwN{ zCcwW7@Xfm=+j+F%B}LyYq4sFGE(^$C9pHBb_~QZoZh(Iq;47L6O7imt0lrm$Z*6#K zQPjpYw?jym1&lA<5-{C0gn{&CAUi}h4FJs(-VWz3Iue94W)&g}Dd zDqm`O?^wRX{WjR}lA=yay3_4D|K<06EdMFb&I1fj^5%R96vI`ALEONy3KGweGiIUo@RA~V3MopX+~-+VKKopr%0FY}SIm>|)I;=VpUYGE-x*#~w0xd?y_Fvx zmrHld%(p!I{N01jp2scUHI{$W{nlkO$#-{-Q3!IOCR0N*;mcM0%n;m!tUy8UPf$p1dTPY&>T zhIc8dj?251%jA)O{PO|+xz&?>j?aX#O!J$<+IQ0sXgymp548o{v4GS{b$7b zRsJZ;&x*O`d!OM+`Tk(#&xz$#&n9J}e{RgxpL<$a0 z8)A8VLhKOBv(MSx?({rm_`IU4;_*}isn{$%%qyB7^UhAb+3?b$?DKaUx||-c{LVOE z)xVNiswgeWK2N73%3hZLF_yo>>A%79`(r-d{q~*ZPsaRx_giRQXQ&vQ+4JhgSQ z{$&g=Ey_O6WtzE7BLnzVB2H?lnYJXEveg95zT@>OF!7dZL(0sgV&+2^5DzI1!BC!g{5AY`pPintkTlo!RJsO8Q4v>6HW3F*^Vu1hI^6s&Gg|p|g0Pj3d^luu=>yw8A zE#Ewk&$c}KoRP}kY=t7Bq*ZX}+X zX8E|7>l5178=hq6jI1@OQ2Ld_R9} z`IK0{`hT?@#GZVfwtW9s-gL7zjR^3`mS>;G8R_JYw0wH3NBP;7x5Ru8Cx5f$2gLk% z#~(Mmq-g!T{_yR9{I`~8pRZ9ptD1l;E$ZD#S2(VB`nL%19V|a2wnulKonv@O(Xz2U zqnw_{3{R@BPptfEv3#+U-(Xm>{NMm@2=Ge-{3pXpi}LLsWhR`mPU8Dvf6M<6m-ipe z&if7TQgmX>wdOjR0V}Dzn;YJx==4}#3!TP~9S(eTou?K{nJnslY3muXN*e4^n=`j0Za zq-f>1UWz02sk^M6?DGrq9(qZ=cNKfG&nYx%&C80RP1CX)X>{bow^hUGyv+>(Tkc?w0FSS1P3u_Ke|Oin9CR)&6c{g|89o z(H48K;bxsY<|n)Szq0b{$6UUTL(*_FaELv{_AmFn8RqxH4ewHv-DiG;)ANFr-!ZSg zI`1iZ^7+<=mlUm$S6_`*KD*yr>+5fZcPZ)_+o|OpFi!Mm_jPN1-D!B2qKa5v>udSF zM1D}7o!bTYbi+%ER?V|>zLnQe%Y5IIi~r)iCEx76Xti^u;iW}`V|&!j&#ioRpR?LI zaJ)}O?u~`Y+uoz-Jh)b_Y3e#EYI#wR{h^A_wZ!oe<}{lKbsy%d`7bmA`EGyrL^&`OcA$@;%WFUUx#jBJ=)0ulgcT*-^7NzsLQdUm(`qL_DenYUOz zFOQ#M`6V$|o3FL}>X_>|ve5EtVy^N}TYg>4RsK!GRmPcOKfbc^H^%a7yMwDvmU7(` zbG5&x<+sFK<%e5-Ys^)CisiS*d@ZN{aLezAx!QK2<#)w=H79?Y<#)$i<)5^CLCn{5 z@*h~fFy<6zl-I6iusN%-zkRcxenQn)2#eMvAp`{ zddnYe-@B%JoFddph}jEq^lRDu0UQPsd#K-*5RdF<1G2 zSpHnhRe!hrB;P;BT;<1F{(Q_;{us+&h`Gw&ZTU+v-^$tlndL9XT;+@RmwaE1c`qkF z#`4!xfHRdY+x#e%gT=kdMOTKT%T;<1F{%*`w{y59ui@D1G(ee*s zzOu9bIm_3{p^Z&bt6PROG`CbY)MR?rOq-Uf z+H05Ly{FaGr~8gJu(rCXc3^#dV@-8SV^jY@=9m3P*BzLtoZ53*byG{vURm+pJ7gL% zO?5S6Gc`tZSZ!rydgX4zN2jZL)-^X(N0L@=nG+l~wR&=9*e;{1(tU>3H&(Zds+*Om zAJbG_*V0^BSw5t?r8?bfNTxc;oE`YMUcVDh4(+RnNBlM_)O*qsc4Nqr=jcqm z>Avbr0|{#AV_al51iQC(o|j3V)dtck7}HTOxUTlN4{;} z_ZQ#qw!@%38k_bvwKaNLbxo#nH*rh3p@SRi8=FSYZf?m;&Gkq+DGsczA$85u>Z@lD zozY+&6zQt)Y1@XC?K&gVG<)Q<$jf38YN5<}Ne>1q(VUg88a8V9%+bB8yeds=PZmY# zuo_X)+eGc)Db-DGbP4G-@oK7eri^Y0edLJVy#|gN7DsZ!jH#KXYAMBFGe%9UuGznG z)bN_wqh@N;D^$L1mzCRgGan}C3$v6s@kwW(W>57 zVO*Df*Jl6jJGQ#1uDYS6fCkbpDx^$k7MISlURGyb3zkl}{Y}_u^IL1=!1gy{GmVH& z?UfzpvTlkxvV@MrqEXc?Q_Mu5#!V-J!s)0-)*0%gMx12lAPE_i^-}i_$u!qA)wxb4 zn_KY2D6^k=cKOI@nFiaK(3SPET^Z~MjwrdU$&ba@Qz6^aeWY#Y4v;2DV9L)PAJYZR z)%y%=Zmyeb958%znHdr#K>N5k{%&S8t!|iHpBYwHSy@+y(J?TMOqg!9TYZ}zv*Veq zo~Q>bsFd0G4w!By``(PR-L}VlX}(R1MgL;(O_CjLIw#?ZYH|8zaj0+8HR*EOC6Adh zW9r0)>biQ@2j$ zH_J6=oA#LtluAws##D{zWyt8hW`rD*wju@QoZGZN&Kg;dUzVfrIOn&yVKz>xn4|_a1A#IOX zT4qU^Jy;fzK613TJ-fG+EVCJu^|##0_l}fV`QA3m-u7s@l`pq42M2Fv=sT=M zGV4{qa$T;HoCe2Ab<0!+ne{oXr7VmtSha?KMx|xrxU#9Ku_?!@K4$4GUNOx(+S}Y= zYnjo!b7MoDxn-7fBG$)pcz(N1xY&@Q&aA78{AgEtW%W1RYi4!*j7(L_>}i?U=5(Hg z=49)Vyw$yevTn=R{1L?7>1*S(r0%Ye^Adbh$Z1Iv{({f*MxdPY>|$4i4U@h*XPTSM zdLcR=&IZZ?JPn>Oze<-?HZ;#@%Iw}yH+=?mC&&(o@)$EVx}}#O5l2bC-G_~wxSv_e zapwfj7()A4o?h1O+WJv5r)m>SoaKnzkUe@fWhV8ks+v4&R+YK;)ZExmU0>HSyK1Jn z-Mo9l0d)lqNH4t+Kb>s%kUMElrKHQ_U^rW>HhB zs%p|Sb2F=DQdP~A{Z(83WGdHF{#+||Q{IVvqWhnyGymKihvglN3KV&}&`BI4r_gg) zYlWWErfvC6Jtuk+^GP_TP1_RAY0I{x{-jOg5>IN&y2O*(G%so1)mFVGby_*mmE`cm zlL|7=>*m__o|MTysZH-CodomZDSb`@RT{TT1r>wqGu2Jm)~K9riW#zrXDHdLgq#fX zk5{H9HD%)NDgQWgbe$LK*AeHP=njeBH{|S%$=-C#>w?m~M`v21i$l8wV^nLhePh`j zGL2I+Elsn{qJ3SkUrd+B^7b0mPWO7*U+w+ooEb+n&+@LBq>6L^(kWPWl5Gw)956LC zt+BaoR@KzZR5J=pZZLhe*{xKwzx3Eulgu)#0X4I#t8}AKRc2OA#@_fzRk?MEkwb@$ zt~3iU0|$+$tdi1rWR~2K15n8iyfz8B>C5;D&273=6&*Gd`kbg8M+;i{3 zyED}n32t(ufOi^IdKsE)S;nxZGUu3grn%0I&KxtPA>F6S6*gyrtzL7Jhx{u$ElKVi zH*S(9EIIeBkUQ@!@f;z~!){t$@TGyBb@h`rIKu2$L$2<=)FSAsYi_Yo8+MKJx^1`p zD>WL^#Liav)z!n87_B@ZM#YLGfk?no4yjGFd|`ko-i^-@uHPe&^dl-^G`|~ z7)X(N*WQ`%qroe0<-cq?|EUL;0npgJLzX;)k@>Vjf7sdLyN|U+*X(_A64Dd zoQZcEx!oQ~cV>618(nVo*lx{V1o8SN|F9G<>LUCj9Ocq^2T?w(73t1`+_J=ZKr-F> zs#4PBh1-MYMvTcb%;wgr>YC{@>Y6g%b;67W+3Kn#i?4so`n4H9b1x~ZU@odN7xX5R z+UCZpDP|9CeMZM9vutaR$bc1P-(+^2RX3}EGihRDlQ~~E;wD^~^@+AcWc!fbW}zW= zQX1Pb2B*!kM|OcLL6?~oH8#6z#VC#vg!&9?wwoMU)s#+0!DhR&N;_`|DwK{+_S$8l z4T8fOYBRH<;wGBtIR>T04brCLWx_1(q}MsuqASVzF0vHnw0VBszQnSi*LMfYIv43o=ti_lJPWP*xR#!F6ZL+MgOEfN8CT1qrHB_0M*ELfd zY09_>h@FgN%yqCk8r~k7E?^U8tD#obYjAag-1iyQP}7u|nrUb;)27+k$V>ElT22^U zJ#|{WxwSWH5+{)f!IjPxuWg_Bl=g|Yv`>6LCmxQ<@;$1Xhc#qonLVCT>efBeXRuj} zXpxFHt8==pu z&Bm<3BW$HOn<5xqupAqsY$Y-%yc>}2^~Wly+8uB~_XWwuChGaue&JNHj$v!(kdwAt4E6WVO;{t0cj_ui(xk7#Ueo^4B? zZSHN}#^M!zw0S*z%L~_a2*|>3dFAINcLNGPANl*M7v`23v?m;G_1x;wriaNsNU{jy zuD!?emxch#7?Zt!!hw1v*DqkBFqc!(&#fj>i6(607- z&h1z*`|)F?Kc_JSZ;Ghn;$^*{WKutAH__x>s!KETmRhoXwRfPr*_<9eD)U=2eV;Tj z8WQuYtsGrZW&Y_H>u1|Xv{#J_>W_}kZsYi@;Bgy1*1l20Cz%H^%)i(a&(_+?plAKd z!og+jzvG^#Bi()-!5YrnGjBUmpK8fnd?w6m#BPu|oGi`)_S6$i^@=_syDXjuJ>jx*2Arrb5tW-ktd6IXqI zhKXD*K|j~7og8_^bZaxy>SgysZb$MnOsq6FPMhj84H7j|8)s$~hx@WmT`dl6vvI- z?o%Y(9?QQKkhH5aYE^Aym~giu@ot^#zYBI!Xl(e|UN5ABEZn-jX48^cH?K2yc@NCg z?qF`TR_>Oa`0Iu}vjCsJi%-_L?bbfK0@F{HmSnSC-@(;(O(_}<>@m0bD(67pd9Kjr zv3~JoiCG$y4kUEPTZXe}Nyxu>pH(3Pi@O^anHKlY(Vwm-9W%^cImRM({a0>p@@}_V z1TH8Nqf68FlqBG#q~@{slqcLxTfEA>9VzWs9#wGCTs>{p(Hb&4+WSA4kR*w=`G9vk zGs3=5+1SB*JJ}Yp7^Zn{+Ne6?du_S*&)aiJ9|v~gB5u2$PnSt(&6MmdmbAGBeXT}$GWC2!Yj&M1_BG-r6p*}0H&V(z8}&Vusy*|JM_7IMzz zsp28TfXiL)=i^9RdOm8OV-bXDi#L4cmM>@c%+Z$6>qz6xeTj}4iwoG8tfeVPWwxAt zCu=e@9dzA9xtpRYllH(R^z&Jz+?r9|Y_^Y1s-97AH)xEuLdpHRjHujn70=G|w`cW@ zCF3nu=5Bnt%KVEPy|MM)iM0dJiU4@9+xh9GYWG50g%Ee_F}HinOmHdxrvFCnM0cD|Y-_IrY^ zbi3Y4p_`#A^Y)%e-lA#ZODzge zSl+B>0LOkN(bg8VVS zv@1V*jmhkbHTvXDAD@T*Avc zTCYwGU_7nF9dZfAm$mlFj@B~!Mc>vDXDqGKu9rr)WpxoXyMIX*P`%r<@yQ9rO)u8B ze8f2=bpHvv203*q?2Pb)$=|!C?Iv+(&bK8F=(37z6VbPxjcTf!X?9nnqj%>-?w2dH zf^0U=^i3Qk(h1%-l{F?i9w!Je%cxBkn5ou8E5*q^t!-~>EQZ3gUY2Zr?Rhri4u6%1P?*7Ug9)s<;(D zWjmq8<)zl+cM)E{V@lKdif&RQBU+LMoNV!feQ;|PmLIXU^?4i9+h|USrxe%+dpRx6 zKG;{?YNxe0hV3Lj6jGpU9R@-;QE{uqX+4Is8HR!;F-L8U34L(V>TX+6lkh?y?S)$# zxf4z+#K{Hpr%8qQk(0FR&(p!t?(osStNuk`< zDGB9hAc11s72S`s;9h;vtUmp zo>zdUyz>^jrxr=S^;Eky`-JvI#Jg|OeTOxhmG!#XVYTM*C-dl8rYTzE!G<6m*^?&o z>BaE2!`AdKwig|0CRz8zJ_znyveA~j7fo+5ln-v4Cf^^>#=VrlYYEk;M9=2Ek=XEOlI|pqxBlad_?~3$L1(#l zW^SpI54tnG-T%xn>5w}Mcc6KOkJUQ6=pElm&PJ5EvnkJx}Otf0h zB6LD9hol)w>sbWPXgv>aY%d^>q%&L|Nw)wJuA!JodroO3mtY-68}-b)7v$Tl-2OWA zby#v=DR@pR`GhL6m25(%w317(E?dbacurgSB-LkI`6Qha<)d>9)Nu}qq_WePY>$}B zoYe^{-O!vg1;OF?H4&CMjo4iRQSQp3bmHy-Hz|lWAjk>Pz4z?kX71s;?{brG%196> zA3eqFsLdXUwRvYQHrTx>4yxOnd+b8)>hn|g`9S|l8$_BfVS6f?UnEFbJP#eZ^s7W`M5wl7b0JXpHD)* z`hB9(j!s6t+ZE6*ehvKw`?u3!|47(RegOCxkUs|eOz`u-&jRnrH;U)~uYO(;^?n}e zeRan-GoKfL>-XRql)4bSyOS4wk@=zH7vtw*$hUWVUl01vhW@nU(yq^e{=LD^1wRdZ zE_jXO2Bo$)|8+idc7R{(akYc}9_?I|{^v4dl=_o;E`k01oju|Q@N4z%lp&u>6DlISZWq>cs(m9XR!{9o-6hhB&)H~-hTR1NHaz3N|lGGRHGnLT8a%sOLdRXtXAWwUaM!t-nlLCA$IQ8EX z(Elhn?M#V*CP}$?U0EF9JA(6ia~wFYH)YLGlIZ94<}r@T2kZS2aMt@9;H>u#92fnp z_nxM2mn58iJ`SAqeyZc5j`e;aQXj-IFGFZ=RCH_aep3r2RP@k4}x=kxFzQKoZpt?dV%xX z0g&hXc4u(vZ-gFRcN_zG+IcqQIqqB-;8%lF{}TcIyxymstC+q^lK7L?HN66SPjFt> z)PeK5<^b@s%gF5B1AfCP~zB9Yfbue7>`lj`BUpWUkjo zvmF=tlMUDUItrZm{u1jO_rji4VJFv<`@tTTcVK|;2hMUG0M2q<1Wx&D!6|g@;@2mhnEWmZW)UWpikY~Q3bwW8`l6*de_|fBG>zd!l_5@y-JdNAA%m*xh(jTRyvZWe|VpQet6f(OTP32?^DnZ zUqL_pur$V#LKq zSw0wVS{C7tL%;Y?l6;&7zLw)+{}bRFf2pOI6KAuS0TR{_-o*0;Ozg49XFyW>K_DttU0LuJRF?z z^T1z1zB+#S`d@bPV!zBewO+mlXPk6)4iY_LgUWaKEm}`5#BWE#Z|#leUz@zfxx@qG zZGib(lJNHtS0VegAMo{bvs$A5>Lcjc+;Nd-{B!=pxDDmo-niWm_OQLHJ<^WY-eoOX zl5nPe!>)!Kr@)IQK(N1n2(G zI>)8mbN}Zw$4!K>x+C^D=O@U!7QEN>7O;7f5e_2pkL!$_>bTf zkSEvu622Z@htmI7J3YRgH-rB-?Hqx8X{WAZNVzsK|FwTOH6Z`EWlgpmz|>m{yaJ0{|f{1?+4_0-O6~_0rkTA8VSz0ofgQK z`_`y`dcdA@1A4em>^jtYPuN2{M+Nwv;Iw}L@?BzyZ2Yg~+?e_jX39@?Eh(JXy0`W^qc~F_7Cvp06!R~U>xfAqMv z=f^#+?dnC3&k!R_ddK71-oEj8O(dR@vP+V~VyCvZeFd5%<)WXvqJG)m>bkMWv%g|L z%>K3-df4Aiaoq23b^TfFWPdx`$qQ$Hdl>XzY!0gb&j)9H-3U(mIsa!rwv)+ElH_}@ z`LTliE0x;IeF`67{%gJy1H2)?4-N2B0{m?7-C) z5sr&J)Uz-k&-O?^tmfLIuZR1AssCBDU+U>33QY3#^a$`F0sdfszZBr9rLy_5ef0(B zebRveJ}kg@4e-4Kyat@@cj?GX>!15f9cjI<0!};E3Gi+KuKl{WiF!DXBHs>rI8Uo| zT*8R+gb9#;753{q#Lt)4P0aT|=pjEMz)uM9^T6rPtH57_o!bA1ovfE_oV=8m{pv9A z0p@qDFCC{uo?PdLK0n;ZN%HyW5zgat!P!q<0=~RaruO{VaVZ!3v3~{lrs#jzzg2*< z{~Q+R$8>$n&zJXAssGA={ujY1|1LP~Sx+2klH^PI9^jOp2u}G%aLQi^PWjuwDgQY* z<)tnpiJg?!=NIHK<84>;!)zDh0-XDTC_gnIKO?{oa$M|r#{AH@dIj?T0skbxzYg%9 z0(@CDReh&CbCYCfl7lPBzPlD6W z%eosCVn5}(f>VBXaLU($Q+^&eE;CAN9D#$@3mR!pXno zah*SX>hW$){u__S^D1}YtmSp#ms-W+I`3J}<2wIKyL_Y`dHp-xanZkt`LE@g%Ah+xYFm5eLfI+IA3z+=Z$NzKa76nI~aB{-{IiYAG$xNe(>$&{#EKZ z3i_GvnE@VJ@15u5egEGGJ*=;Hz`LNoS^@s#{rw%msfYX7Snr%)QNFtvXp;Dc{x1Wk zA9ew!o)aCH59WJ*K)x8`JM-NVocRuRT+}^derSB^JVfkY1%7)IdgNMF<-Y-^{5qn* zB>7;u_I2DZS7ShaDU6RSR~K-W>u7Mwp8-z!%fV^q`;Pl|eie|Pg7J>|&H!h=r-8HI zzR+>W_c`-_CG%g>)gD*>-|lg3w-0!{Hd2#%+T+@8U-h{53m-UhSp2NYXqP(YoQ_nfzlxMltg`M25PQTrY@)kk<6>yg8 zJ#f|w*AJNyCUemer3eyE0>-@~7bH`e=GkSFK+NoWt_f%3dx z!}4APJE=$4!zFI%XT6UvoPM4MJE`Zd;MB7o@})i7fwSIuf1LUcb@IlQIpf+~=wUtH z4^IDo2~Ksb?vt z-}f{3Yte5du!sJs1gHGh$af92JNA?8H=c()uKHma8Vf z^?t0_Pdj=2LOvCG$f=)PpEL5~;c(~)*|{isc60irzDk$K){E|o5YGCY0D0E$L5}rw1ZNyR2+sao z?hUDa_McyXuMNNHz6G&|*G)18Ns`mPG5_Vbq!N#7eCTzt$`@N{^DM9@AJ>=1WuJm1 zy0m!F}Z`D6spJ99Fe1Pq=7;)YUdU}9=13S~;)T8TZV(0DVhn9D= zvr{wuNO1apPsc?+{V(@Q zBnhXVrA5uKk&cRKhyue<#?7k|Idx*jioa; zN&53nrq5SB6D^H6=ff@F94`igQxEUcQP002&vCFH#$R3+@I6b+w;JO+=Wj=XQ+|E$ zz9{cGu!r{RekbwIIi|g_#*{YU16l6-lY+a&RuVGsSO z>mH(q{^@D8MEXP5ebjRd9_~Zaz2+n!()8L#Z zA1IDAN#ck3o(xVquK=gK>?xHbdT6JtElBeDX2vJVsYlwZa^~9rPI>NI=5_i!$aBBz zW8k#&ZvnodZCH{0ubQ%G{B!}Q{*4@$V)rrsRen>*Q%^a#tWl`^HsFlg)4|V!{9MN+ z->%^EA&Fj5aij8o`n2BBd>P;1$+?rYtVBs?0E~Ee)~K0&~N{OJpJ|^ zIQ_N+?weD8S8&$*`ry>h{p6JA{&40y4tiK$`+`$`5;*NV1f2QK3-Bw!spmRymg_EX z+H*fR?SB}Y`d;MDURILq}0 zIPKB>T~a-?|8J0|{*>DXCGw1u&fx4YWoeMtK*r4;(o4`5Fz5-5r{uAKqi{U282gm(V zaO&^vxVWRg`LFi$gFN-{`Do4`IFIG{ekt^vhw@&Hd^ume4f33?E`U7et1m#F^N`me z&-v=R;GD1OJXQ{KzWOEf({G*JyvX<4(wHyNZ_9(zZ=AA6h{kwouekwTg zgG*MQFatcGTW}wPPJ18khe+tpo7B*Z}k=jC1y%jPu{}IspCFF<jsH@!A^Kge@lu|4EDui*1g9548u4bCev(8GBJ_c?Q3aS-gG{u9AD9-Rr! z@ksCYNw>oNRJ=dPaZvaDihrJge|R63{gOVXCi>Yg4GP%P7yLTtpB><*JMPu+CRs3&@AQ4`K|iFK8$4Z^g|cK z5B;!Cfa~*FQZDwx`uw19_QSoPhyC#H!0ESvj*A{yqt-a&{t%8M`$C@O<$4IqI|uT# z|7dX9&wUiM{}Lzf$KloB97ni6hxXhJdHSF2n*3joryhB?o+Pn{@)Apue7+Gl?c}(_ z=RSr`o6Cl5f`CU2Rlfe3l zDmFh(RuDr>k`Kyv1!w(MfOFj8`W2tY;dK`M!1plF4@WuuQr?j$7x%F+-&yx+vF=O{0B_V76!_QPp+T+Cv@nd1uP&{6y^Myp;VRd8k~!g#JSOP#N$;IXLYf9pD;AQt#tTZ0o#Y4CFcQJrbP$ zoD9x<^?J(J&+9?zuMOx4{bz|1lSB{O(Y2OF zyuUeD%lia4_nE%{&hhR8aF*+HaN6Gkobz_sb0ta2wE_IFwWX1roVW8jj`r)ijp*4B zdM<~aDJZYbKSiG7&cl#rxtn9-J z*Pwq2ILpQ7TWKfzXWCin^!WDZ_#&L++5rLid9Y_c#NlSB7ur)6;QCyNZ;w6?D7@JG z(E8&0k=TxI3+UJNE~$Uo!+rkb{N9A?kni$hh)JS{{U`U2u|MJa&j%UX)c#GK9{CWy zrYJS3JirHdT;p$q$2C6o^tkG;4e)6mZ;8x_#}nUgtGnYqUk{wuLEXUFE;e^uvS+&( z2zj=Pox#~Ib_Zv>(D#0bezy0GoxGp#UeLqqtY&at{~j37b1L}zCKIjq8^HO!e)|3* zv8M#`-4M@=bA2C|0 zh_0imJmW^?Sude}cwLu|*va@QbzJl_et4gS@iPQ^7(XMx89&!9% zkpB>z@vsv7UurVf_*v6&@dM*w7C7rs-`ghk%No1t(f6t;*Zx8DN)p~tFOeTY^&)GA z>d!@~mt6w&BHXVRsUNm$ZD+#y{XuMJdz3gp@Dra_+VMc->7dT8fE0!;Gj>!|>L zA;8}QXM6wJarxNI*rsvN$@E2%luQ1SR`j^`=Noxk{V&&Cl2nhzzv`3EP<-;e=xUe9 zlQTZayGf=d`SQG9OnLVIP#mu zoa595;2fv6bllf}66F754r+Z}9N;$x_#*-SdVnv5_Hr`v?E=pE^AK>#?+Q-&!@()9 z*9+n|%IkWtaLT^`J(OQX9BGm-uj@I!{$5UAKAu5&E1`$qQ?Pe{PY-ae7g5jI0eSW( ztoJt{PyShe{}ABXZ-^hLN7e)+`F9o1o#~R&gW#Q|A~M+_t{eZ&4B#J0shYbFIqbCvy^u(>T4y(#h+tMpP>Ez zIv&??Vq=dFiqxjcJg(!=b{?;B@;iB4$Fs2>@8;wudR*hA!Q(oP9_Vo$caQS8j_>;Z zbM=D@*VIs#zx>Vh$tuT1eq-}P?KujZ>yT%IH<>o8`CjF?=x;V$^*jjq7Rdh#@>~c0 z0i5-_7W#S4Pc{VSc)B?_<$DLX?rReJsb`OXd=)t5mxcZ3!Jn%*E`HtwoY%$dXEuhO z8StmZm)Oa2RY3o4klzM;Huwe*o-M z`=z|Iz(+z}o+a0K({?ZVCz&4_pT|O;ai#a~M1H)fQ`K{tlUKf@`+IrlVf}W2ysQnX zp7kNm`rQ{ndx`=VX2{Z0aB`)vT{I`d5M9%#S3KgE87?V9uL z^Pz|GI(|t%z5fY~Wj}K}gloL*?(|5xglm21esbkUJH3VUOPhDZr@fwKymiE9)IT#m>jUvA zJSjefC&j05jn9=_oJzakd}$5GC7!oHd=@({@|-W}I<|1mmwH2<{hRLl75$tq4RrFt zIbRwEJ)AG;eIm)1{ow@2Gp=;Mhsd+vI~4NNa|$@^KL?!s^KIbt=K{y2TwB7QI?wU_ z`Df^%Ki>qWJs&_n{rMR<{rNTY(4R}1*pMXlQ2(mnEbkWJ^k+FZ{m*$U$C1C)_4_&GIZr5F#%62tT^D}X9Gv4($68RwTf?)(2K$TQ#nfK&h4Zb3xqh4zdB=X_~d7eDeL z_vS8*ij!K!l~=jO!+57h`2;7Q@wo0gneK7zuMhUPt}D54%ZsZOT|R!itp&ab;z94r z`SLv=&vwCm=H&e$&-+sY92Y+@Zuf@#tLC8ktrnd6dA(2md&o0RjsmCrNdbNl_-nA| z3h=4mH-c0DodM2qjq1N|;!n9Zq<+)>U+R(b6W$l&c&g)q$aB2Y_X&%B zj;FfsPB_O??z`i7%ID5lUfGi-$&a@Y0X`9&cJ2qxarsDa#>1E>TbnQYhjYP8&@L_q zryiZ>h#wfwT8}>G{DI???w=7qkavguTMWRm!S@+*T=UiKPOB zT#_Hpdj;gb2=J9ffl0oeEgToKSYN!K$nk4cH!z6&Cg#7!$u@!c$<~-ZP|vObo&o20 zdL20Rd>!CRVV*$wH3NL(0Phpv!vcI?aP|W!%oErTtO(A2U=zoEKM#jI^&bRIzg+@O zKYSM8`hDmU7L;Gw%@c%k-twYrcVcIY`CYH0x?o-*T;pT|kLx(SnaB0|x{t?eO+Jza zdHmoAr*`r9V~*E(T<0Y-JYMeP5A(RrhfehPQBM9WkKgb3B_6-R@#{UVqqQlz5^i7e0K(CzPp1n-|>$7`lmpi`neuUdo&(>KO6@=wC6N% zKF2f{oOWIcPXAo(xNkq#hiU%<0r{t)pYkt*A8vv`>*XzQ+Bp>b2*~dbzR(z}di453 z{Ko!mF#4GzjUK(fDfcWSNqH|bKa@9u^ZB^f92foc+dGhFJ#t?<{qQ~XupZ@^DM_M# z2+GUnBe?$XMWAM6FiAejzy~@m+1!fqW*|?$>HZ&)r{DBFfx_vx`=FnG ztHHS6%bcTj)??hKKbs*>f6jqC{dpod{W%|;@pd2d)1M`n56};lj{AO?1WrFp2d5t{ z1K$;X=z(#c^>`-u0+YG=?Gneu9@>8`IQ{(Z03YVYanVD2CS!c(c-;(ndAEl4*N1vs z``_a|-p%AA>1>Z{e|o9M2UuzIU6UTy{_!4<@8{$n@woc!FCM?t$-n9GdmR77yl-*dFJ&d_F16MJgGCqX^~eiHOEKDoYnppnsfDHg*`68-XB1IpzdoFw6FzqdFpA9tDmD*qff z^Obv=l0=VuN1@7>J1(a!H2;+k2IqB66FBod1)TZ5?zo@tKOxV2^*T%JNyE-{M1e{2 z!Sxe;udK*#4}VUAJlpSyj*C3|)pH@wepTNSD~H*y>h~Q8=X~RC=;1j2JUIJ#zSn~G z=zA^XG}^=WY%?BG=;xU)zt4s1GsOXUhx6iasIfzm_>J*!p`}s1u)T1;#P*`?RLaHn zqSrm5pYg-}b?i5E9xd|hH`pH8Z(N9W%6?-$+9}8P55U=P=sJny%YI`S0VYYg=!fp$ z^g~~8`eB0O@q&z%uC@VZJP&qU z%w;@}hCJh0>Ozv_%l0MDwo4Mu_B9Qh_MGdupYK(WXTG9Wl3!k({|cvmuFtc)8(1w- zyI^^HIxc#c@7CZf?_hA2cQ`oh+0Ajkyb~eMd^_526}Ghb?QxLfe!e5Y z*&ez7knL{YfPP+&v)#1>hR z>w25-&o`jwcoPH~hwp>a&LQAOKz=ef*EjgQEys6VpA$Rfoo^cFdVfkd$MLBc-#L!I z<+vYLdf&wN!@nR;zbzqxCW#)_V>j>}P~L4Emk*Bn#~K+)qGvtG^LrRMFZ#Qa7d>~H zAL@rSM1e{2LBI8PT;%DuT5$SJ-$y6%^xKEf&wBp}dRVU6n19lq3mo_D(f9TXr#;U? zp7t!Uv=KB(m_Jv|iSCT=buaeoWtoBb@z4$NEOJ&-S;xzQK6-CDu0>hrj0QBla7i^$p$U zDeZ{;#wBQ{9N*ssXTPEMYoxid-&hjum;FX5IQtE~UnBOg-`K~=%Ln@neoxlP=pUYj ze#QgWH`vb-C>-&QChlH==%cQPw9r+HW+kU>vr${c?Td zG|Vfwz9C%Wo9i3GHNLsNAzbIN!*SgtJZXJHxUO%w+h2B`Q)SN8e0MPIN0M|~SDPQo z_pvnMd@t@K$EDrzz0KEyUuX2_JWB6d`R!EqF-pF?j@ZE1EJ@^f9l__^c^$#$(Y8WA zytmUM`umvwYR~=VcS)k3dfYVG^3$M4?~95&xz>-bN9)1ouDYzBSzf(f5qXxkz3WS~ zll|fUmHjh^nDR^V{cwDQ^XlsiaIP<%56bdqJssrcx(i&(lye{jH_^(EL=kt}EN6E8nlEe?3N4*LC^c(LtF`mDMJpI6Z zxomg5p4txWZd)CXHOMD_p;)LrVy6;6e*OyKgV3O!zzjue@@i`2ghU&u1V{f4&Y*e|`ndcv}JMOY|q78=@ahggpIlJvjYv z7dYc*6RiKRygjl0!}4wmd6su4aF+K$aK^)iZom^ibA4=c>;s`6D!^G^`aF@;JGrh$ z`TPJkkofg`2-aa(Ufo|R@+|LM=wW#mLJ#eE5b|6fdlvHNnzpIq&Fdc5@#7`7ddFPt)DnA_ZXF~oYaJEN%&yVQgzLYZ8e+p-OPIp}F z;eME-A9~9_-yz`K52NpY7Cqb#GY0b94|BZZ zBF}i1K17mm?hlbUrzGJVPj3UK|78r7m@yq`lq^X-Z_WWId9nEB3d@_xQYK~EX{rtL!H8Hdk8o_4+jPCG@XB+O3a>tUd3^d=Xkw7ILGVm;Oqysa9s4$|AQdU_Pz@^+co*f9c*XtnB&-TLW9k!R%MX^aD&-Nnk29f03GXaz91cD=GV(cz6rtVtW}1E^9$5 z&;4v%AKTEyo5T;tslkZD3ymIapTFkk%Z8%7dcV@|Zx`kHvb&8k^+O@gm(g#F@_bo; zQ#V?V|IO#i7;lU6d>Q?)D9@M4y&CmH_rSW=iQrt3wda#PuIo$Zd3=DAzry3%Ki=Z;{ha*09#=m<;qgnI z{7W9c$MJVPuFsc!;c@Mkzw@}xgSC9pFO{KPk9YYV?h=eJxr!JJBHA&)@ z*MqlP8gX7vJq*t4sYThp!G2>=_Fu8z_%-jpnuq@3Y4jV62kzfsKU2v5E9&_z?7w1p zbv`KZ%y~HXKX83!0~gOy4ZM!)i8$wVTxh?dNcAT`v;xB zOS@+Opz~et=F6X&Gik&+oG&*&<~5UzOf_x@JqZuhkoY!bIAGr9NJUJ`*ZF!{kg7h z9E$6D;kv$YyvMt_c7C?U_4=Rth(yl-C(q~FglqrE=h}qp`UanC6Rz>b=h}o{>h!l?Zc zSvc=A{x{#Bb06xZSPU^q%6mEbJ-$DO?YConqho!8@$gHmZ!ivZ9wK4-Yg^x7zY$vB zDCGS)>^Jm2zTa>B!?amRe!ubGe1FcB=pXq09L58$kJ!%?vc5q*zlHS;mRIM4(hqm6 zZ~S-GCp+42hg6kW?HNLsNAv|e)LwM5qhVZ2I4dJ@Jp~wCHv)1;W zQF$*h2X$ULHNd%#<`l>u3VHHl0{l#Ht{a^1xY)_{hbtjJ6ZyUcemc0$Go{}k-^BPt zlJGMi-w*su@EyR<0-t2HM0z+MKG|_2n)80wo54BnT?o#3?|Y7mowCNI_40S{F5uip zM|pi-TlDaL^iL=k*N2xD!%dP8`hPXYMGyVYc{1y9Yv}1^&Qbdtp@;h|=LF=Bf&2|9 zuhfwwv4{Cy2tBl4o{^N~+kYoG_1p(eJ0Ajn)%>pIdeU+EV7_v$BtPE|!MR`b3viBi zvR6>`IFRpgkY~Q3BUr#i;3==zT9a$G-TJahbFJa>#= z9pl%pZT#Z4n?%$7C9_w{n_wEYLb-dn=%f~jj{+bMV zw)a^9dA%Q%K#wo_zCE#2?ybhfAzn+JFjz@g21@C|9d(_1q${&Yu zjq%3sUt_#|?c{yGb;A87`fVj}*4I#Q_5;%c{5){p|GEKO)~I#e;9hWvG3A|ce}{3h zw&PMR#y`Igl=0jXdRVT$(8IVI0(tspS8(bX2TnWp1!p|#_n!Op(gbQh9z4&UL8YjUZ2d z>iZc)KlyOTv%EW6Yx3=R0Q`I8`ya>saxDe@^uw0mYoc6_g0sAzg7bUT^?UUEe0LIH zlJ8IM6QKTQAWwgeLH#n{dhiEe|5@OamwP2@PglsxJ!R$8Bflr{C!|0o$p`I!8=UrQ zeS&OyJFe)vb~7`wR1Hi zCrOU;eSPa%8gcd;rH)HAOI@oTnX5|@J?u{^EsZ$)hn>M`XLrYa{S&}nLcRw;&!6D8 zbHJy9-vm9he_z)w{CssD<#XA~DoMC}cZ2$Y?QU!2`)9N}#>rFA^SSw5_59W2Yuel* zKWe@m^%(hoan<8Si>V%EZ+22W3fFqnam~gL;-sIeXW<(euKSv{2S3&vRL=Lo9tZnR zbMn$2*^fN}JwHJH{eV2jqaPvP3Gqq3A~^MPpCRqp$;peI?8jX9me)V84Le!hjlkL8 zZVt|VrW~B|>SwWse5Zi?IB?pZ0jD1BFQq-~$0+Y!hhzI0#=}6T-&9G8@h}DXK7zPf z1%4*i^-s}L3i*+cr=Rx$r=3rLQ~w*_)bk-Y^=u-Bm?R&Z*Nt>s>V@+knZrvG&V2tK z;9Ht9N)mb6v!~;78vQT>@{HTtz&Stp7dY)Kmkdo3{Vdlw$K`|a{Qhf}i{B6Uu*pmN znXjOSaaiUWk{o7vw*{yEL%>l;(2Y7f7EP`I|kt2}wRMVA)paQrEcyFXK}czkas|Gvky9lFbuynd$Co#*>)3vh`gEid~M&X>4sh*=RECFaQSX)E$=np?8i6{JOuJuZ;~(L zT%RA6^3p$DL;V9d+haL6%QXaiZP>GWfS>BPZ_oAMoPRz8JujP+)ITpmp7khm07;^s z_1IN_N#Y;2$E_Tfk8jPns=p67^$!E5{?U&6ak39M{VSE~ z=pUl{3%^AFa4_0qNBh%u> zr5-o&{9R=JPx?LvpX>FXaJfGE#>p2ueZrrBo*n@%&sInh`Rk#_Li59PVX39$pqGR{ zZSUkEt5IwI$o_hWQPCX$%{I#9(Z?#kYop#E<7m)wRa4jd}_5;Xwbp@7q zdl!6DaJ{!BNY`6L{sqW8aodhUe)~8eAFB6HAg|?+d_M$dz9BuIL4Hy6e6g7H{CzR$ z`R8KN^L0Sa-@ps;^S>caKetzpzVl!5TogUuEhc+@Xs4b~{Qm?!^k+!ElUxLNskL!o z3CPoL`dtZBC3-^nE)6|;PHXvghCK6K7M%UhOYj5bPs8}jeyI_hdIkmb3f_!QJ<>1uwMnI2VONuGfb7er! zn*lwt4?z?4Tmepd-Vf**15Q1AfKw0qdHQD`$WzZ`@J*e;Qoq#0db}C-_k;XZ-~+&Q zjxC6GvVWtU2S5+)oCQujpTd6XIUJmNt_Clro!~4l^|QP;L4E-A+yXmy1h0TR?f)E{ z_RIS*G|~R+z>A%L)Yq-xw4eHEzpgEdiUIP&B++wQ!2WXRr~O}o)Be-IY5y7E#geH> zlJA}1w4eHE|6PzDAWBRUJ*R`y|8v1<|3AQK{{`T*|61^3$z2r~TAV`|pSR08wI+=(z)S(*J!R zPy6*=hMZ6P4~8Dve+W4Bd;|T|GY9h2a~L@F{3oF2K*&?i@4>0(`+%OqAx}L=fK$(p z0X;`So_dZ3ryjdFDo!?u{?YH66iz)S1oRYPT&A9Gu#JoW4iPCc{1 zY0qxp)U!Kyu@u@QiQD$hXI6my{j8Qq&o}LUss{|{0w|Oa1BZ+*ZSbg3NT4N^xgaNcQN>e0$l0=UaZi3 zZUbHdUI|_bJ|27{@CrLZSJb z2Cnz;<*@eoqDT8);W}p)uJ?$A>zrBm)&gA8wN~M>k6M$i-3i}Lq50H4U-$s{B`i*0$h3@ zd}oE`b4l!f*ae*Lp&A9g1?2Ufi5#u~9}W32;A6n|0oQj+%i%fTVb^Bly1Hx({FURDmA>`3c}B zf>(pz2R;$}G4LAj)!kq$`PPE351s*^0zL_RI{0Mp1>jS_9|ErfU&T!V#Gd`Y*9PAo zd;)kqcpdmu@bkeNz~_TEg1-)~a~?VTKKOLVui_>vVt*6(+ThLLL%>_WcLtvUJ|0~6 z{>kAC`0pWq0{BeuGr>h($ABxr4~G1M;D>;}4t^;3SKxENS8$Uy@y}u4#o&JcF9$yY zd|U7%!Rx^f2cH2h^4;9A6Tpvw{F&g#fG$>0Zpp8|e9_^IHxg6ke&IlK`3bjUvoeg^m};Aet=3Vs%NS2rn_@}3Re z3;bO0{@`=Lj{rXh{6uh(*Lt}O{CvnS0KWkIBk&8s_2NP7zX-f|#pn;=7lRJ~p9ekx z{1Wgv;Fp4541O8-o#6Aq?+3pe{4MY+z&{4R61?+D(H~N-tH4(UzZ$$B_%+}I!LJ3M z1AZO&vEbK(F95#*{2}lg!M_K;34E!Qqd%lvH-q;BzXg0C_^sfxz;6RT4E%QRYr*dT zzYY9Oa9!vTJMRKtc9rN4;rD=#0$&I|4*Xv5%fJ_aUk5Jo8@po@D;%y0^bw-PvF(yB0t3)I|%#{$R7#*DEI>K$G{%~e;j<3F3}%i|C8WrgFgjc z3;qQ7RB)01${jlf{29of3jQqk>)?L|e;@oW;JsFh{t)}01Md$m^4fQd0e=DV`+&a) zJ`4OM@Wa4g2EP^j74U`NuYx}d{u=lz;ID&sTRr+i%KHZRmf(K{uLpklEBZt1`5b&j@GrnO1^*H}4gPoVQQ-do9|!(V@H4=_0>1$KYw(xB{{{Xw z_`ku&bdCOy@_q}x5BPWBSAu^7eiOLJXWX$T!GD1K3*bM3e+m8*__yG8@z@<(VeRM_ zv0tCn60!z(QKv{oehvU%0(=$AzC=UnimA^#TmGT)`8x zzYo41`1lP(Tcm$|@C^6{;75QLgP#aq0{$}ihTw05i~NwtjMO*a`s}|P>a<}bAnm9d z^wfiI3_b%~-&rjht_AN7`P;xnep-}W>RIp}kbebyGw@HrHwXV3d<*c-#Zg95t}Ve= z1=n|bisTmHTS2}8T<@)j{3!4=F6FZdha z{lJ$jN!cX+*~|RbvaJZN_l!hv0Qm2qXBha_;0J+^hyEkMw}Je%;M;=V2EHBmr{MCO zxTdec2Z9%uMiNq9eaD569^gYDKLLCYcpbRNkBQW#=78@2`D4L%1b-HMDEKSjBCqZD zD{y@mhh+T&_z37J-zYMy$b9HC$U?RS7x_&ivD6rFeKuAO?E^jv`p*F01^fbVkyrh< zf{%v$Lhv!*ox4SbiT%5QuL>^mdq!fZEx`AHdjR3EP{O;fr!OsAn0Db|u$h*sj)SciN z$lnh>30yC<#r|6GW!(k1aFJL2-N5T0za{v7;4R=&zz+r&`I5+usdK=mLVg~21NcYa z_27R87x@yWe}zq=U!+{qA-@KA6Zi!1Y2bC>B7ch0e+0PRTbDy8g3pAWm%&@W-v+nx z?%4O>6OGjZ9L%}}< zp97xi5h)b=4+CEo{14#UfFA)~34SE_Ebzm@4+9tZQLbF)gHJL{{X8H1Xy|zv{8;d} z!H);uVzX>{j{&a$7x`D6J)^)+g#0-0lfX{^KNVfyzA!K za-9ZV0xt6E=WW2xf_x?T+2FIlMPA$F3E<~I{z~w<;5UJv5B@#)x!_A}ku8_Vzwhd$ z82m!W_W-{Ld;<8z;4R>nfFBHgDfpw{^T3}27x@X!&QHPTL;h><%fYwUGF#p&!7IS8 z0-ptb1^8j$B7cUn=X`LfuVTmV1iuz~?gzgP{2TCVz&rKK+As1YPJdVMDTZmgE&;y* zdd7g?1ilaWE#Oyz-w1vaxX9n{?0FLWHpssKemi*Qt+M611AIO3JHfky-vz!W_&wm& z;0wUd0KXgj0&tPnc6}#!E&O~x_#dI?EAacke*k{~e8*l{KimtxE4awt@BCa3{vhOM zfIkF&CHTYO3&0-%e+c|h@Nd8$2k(^5+W!Q2IrwAX+k%VyC|9mM!Iv`pOLtB+_*2kx z4EQpTKNb9G$lnRRpUG37nYkbQ8OVPGz6A9D9sF6ycP-2M;W_XU@IQl(0RId4?%>aZ z-wJN!mx%IP2>t@(*Xy0N=SA@D;4guX0)H8N9QZ5XcY<4aXV3lMuR^}KJZsNu;61=! z2Ok6e2KYYUe+6FvZsnal4}rf4`EC_id)@-y68vrOJ;C1ruLge?{626i@9cRD{5{BT z+9zwz``~Ht55UKRe+Zrd{|Nj+aFPGg&9|Qd{}}RH^v&AyH}DGZPr&DZe+qsq_-EkH zgMR`32DtVCVoBG2S$jT*dLq;QxaBeDHsR ze+vFB_}Adyfe+}PE$=tr!@x!U_(&{O3;rYIr-J_kek=G7;0wV;Ui;^l!HZn%NY-zI zF9E*k@3QuH0#AdByy_nTp7UOXp3SqTwp33{^=xiwiaw|4Z!MWwEvcTh)h*Sjo)ep! zQ#}RrtlDdr;k~ET)K^qCH8nQ%-8s|TTs=8cIWv1$j;4DJn`-dj#`?ylA!T_-`wgwD z&kSvBnp)j5tf9H3x}heME~{*4p3#)qy`gUU46CmxQ(qnDX_Y3N7AemcW&XV+|9p`o zZB}%0O-)s1R!wGFOOo#H;C^>4e;~GO3=S{3w%e ze#Pi1)lHe&QFXI2^+QbVktagB(#hflsBPUPd1@nnlRb?FmyU z0~av>PcR|^#KiQ1`sL8%2I~rQG5&nP;)6TGT#Qc{*h0e72JH=FF@umX0B>+Ig2V>m zr%WCaZ?MG#@P>{bpf}iJTr#GgQ`uNkSr_TQcZ|Prge%`Od> zPpWBZti=4>kmVQavQp<;>@}ol`c!^b!890)xeTXR%!%Z{FY>qw2u~(Yh?$Wb0Ns6M z77pd%%!2AlIaI<-DC$@f?chuHBbMvShDdGDqW#EaCKp4bHektq#7<{=#vxK0v}oUQ zwXSO@im!DC9LU%V zePDeM_TS07t&;iO1!v8hHA9?#m9B1zR4?-=md))h)ZK@1Z8w}%P#vkPS~|0_ei`;> z1M9;Amh4L`)6RxSY_O7ji`AOK5Q_C*vLCV2+(X&WXbo1dTdLM5VSMj*{-d`qmET>k z-eUSMmd))hR8zYspjwrmDLC&USc|Bviip{Vu`?)JS{I&HE>}CI#6!aTDvFlNg&Q;(Zl@O%BCh1!gazvU~x41LRC1sv^oO4=DGEa7uVD+DQ&2% zs)o5LE>&pNSI7$(RDo`3?#`BJ48E$;UrB}HHC%qYD%*VBIqWHvb*I@EvRW~sI6Q* zb9tRmXKWm@r{%NzDArW5hGIo_N?-$hr_aoh>9+((L80O!J!aaR`nu^kVVz2T%7%&r58#Ys;g=i*Hp=K04KMf$_-DR zS6#WN1Wwhe8zZY_c;*x})t5#ZVRVMbjH?k-{dtxWBp5ski%Ifj;dHc6czDoe`YI}r zt-eZ(8LTc0a;5O_+D zpo=s2mCFZK`o0hyz}W*3?Z?xB<2#!!^23$=0O|)xgw&W%8e3;l!xsj`^c)r44ISIwU+&Wl_+;QVLa?6UIGX|aF(jE;jUH73%3Y-o$ga;aNa5iB_T z78yJ`{FWSZ1l1OG#^LFe4K?L8cy?4?FHgBm^DzJ6GZbaV1pBJF$!9OGZd|Pv2=MBJ zW3-81Juuma6&)@wg4Kc2Ddql8(f0*&pg7nU0%G1*ja#+ifzGd|W2EBRdx`P#P~2cK zL_9-ki2oK49k&KxhMQ$bjp+YObuhwZ$u6;uhM1$)-3zLlsv2uVe`7qQcKgB9EQXH3 zCBC7yuw-@>U8|$Zodc*-7%oiWhmOG|elV2@mm^??yaLWg%+iOd{2>*dRn}OuY@aO^ zsKSR-a?IDxvygr5_js-$H7Exb-ixd2mPD5BtMG|u7*g@-L~R)~{C!gg@eD5Uj_xeL zH3jC5V6*xmq;Sd4j&}0>-o3A7>!+B0Z@Y*UW4Kqw?LvM*B|rY!uds& zRTtwVV08(%Z0;XwngIAOA!dMKRvv6MbAVIwL6Hod3H?WhJ~i%epvOY$Q_JWZqBId8n7+`}K-4X1`7 zLp#^?9XtNdSOy%PZVI;_2P!{)PGt`6_|qWY-ia@M=wyed!%Gb6Y9ck2weV!*qFIgg zD+}iZxr*Z30wa^l7`n3uT7JKiNG)6J{!Ovuo(*G?eCe8)X>un(;o3OZkAVMu5%2cK!f$Lt1F}}e|mm<}T;{H&2T*j3w!!YiJMScPy7>UoI2wG^600~;QD_G=gr2kVs zXC7Ap;b}0LQqKp8Nmc)anew{}o&vAwh%9fKQx8*6_4X~JZ@A3vBHda|=U(#3BSU^y z!Q`QS3v=di6%f|+_gfO1*tCF+u>Nz#pUj)q2YgLX@qA!K|8rn| zNbx`89vp>ct8k3V%W%bNE==R8Yo$B%2YS-k|CO;J<%#dTi^J2QOR!;a4<2vIi@-Y@ z8Y0pbWmv3tj-EwfJ@^G0XBYkoF$aRT0O<1LB(qbQsqz+k$83f8&eO{18-4KP{bUx05rCBD_Zd`5Y!+z(AeS zUzvVA(|;LUs2H8xe^K5slOz)b*NpWgQRieq zbWXlXalFKAGCY%s_X$kn-Y-^D6Ma0>wKB|%OyR4jPi8NpT-`8TE75ralaR(jaLuakX zanN6Aa*q}EW2AWUbV#ed%<$?yY{&oWLSn9Vbt#O`W6qG5Tm3ZzpS}G+3paKgLui1J z!|eg~hDz;yATD3~D`o(_YOH?MTEIS|8l;bg!nl5#kF&clbmCmidG_M_s^=V_7O5I%`yIhiNzB`>7R|Ul<_=Tu$*OSDs75@Lr5oGr zP?E$vrA%=5L(HF{@VH$eKp6uSpk1GL)w3@NL(#W!vm5svvjbo<*8l&SY5jB|&aTSP zi7;XFf7WXcOp7}PWqB7QlKOYT+asBju&VkU-|8ai!KbsQ_P>j32xgNu@G-({OSpiH_?#Jh`);44w z-&aEpYwZw^IWc#bdQVmbm-gH~W2_!5RsS#X7%ZV5|8Z^G zQ3a+>&F6USC~2T#2J2#DTVz_mV7dCQPR`YV82z}ASt@W;LV)V*zn}q131sfz#159K z|GH$n6Nu1{|F|=Yfz_o)NdpxV$l?IC$;lloSO3*HXhz>I)JFe7)Tg24}Ipmus*#V1*$?$W+K@Yjo&FD4oNB6}2k1@T*t#+D8o zEr)yaX&|)8)v_!n+Xdp%~z(D#Ld`x;%q_Q!xykS!Ltm3&d@`}sLo0eZxUR2&s z?_zqW58oqzFFq`<#J@oa1Aw}dqO4R*JaY2u;V-||)WJYUqr;-gNG0AE23aSSpI=tQ zWYfwB!xOQM@Ry0BMHMZM{%H)hG!wwH+(kjll>k?{@Q2Ew8>+5_im$3}YUYU~9=iK{^s8|*)Fy(ud`p1g*QehSi8+}_W{V6A}CaA(TF1tsWUd>M{ zlW%;6zo5l;6ijAaW2TtFiC3xg>$$L&Q7>nTC}&o6{j%yv_D>6aJO=b9G*VYdP#LkqVvuBCur9X&S-zct0GAsZ6(+4QT55Fm9 za1LhZ-WV%PrT9@`2%KO742AgNH^ojc0j5%XD`4Vh01B8=GzHN&N%hx(Ix}hb*jZ?Q z1;pjjO5je7`j2^LWdZ?uxz0Dd^(PKS)!577m~vb%U+G_+uk5&fP>bg#a!MPUPBE2C zS)#KhJ&RVBzgd(Ah@U3uAZBXgDb6)f@I<&K16~Mjxc9>N9=n4VWaYvJ@4$xJvt6bq=k?FqUSaAP_fo8J?G`Ws9NDAD&zXMC!#0QR}OkB3aHa_;xcn*1|90 zY49zsvSm9cI2V!^Pbx28vT9X%Lv>?QeH~nsimWbQk!itS2mK>gpralV+VY z|3p|Vth$)KFR5ETsiCnRKoMN+!@{eVmM?CsTviPit{Ur?H&{cooqvyI9l(^8OKB;z zpPX!2m5G)GJF%&~32#%rG}hOBF!<~M_?-+sCjdSJ!1!)jQVpDt5_@Bk#69V817<^&? zd>MmJ3V>h4;IU4W-D+>LKf>Tg2f(*7_%j34-;E4DEdc*r4F2E%_y-yMAp!8uF!?;L-M z1Jr*7!#^hgzJbA?6#(DN;O7RwcQW{r0QfEje^LPdZ)EUi2jK5!@bd!Tw=?+Z0rdAU z`0N1qJ_er?0B;R*kKd&M>`x=SbN+T}0RAHx{AmI36Bzxc2f$}D_<{g&o#Wqm0q`lq z-R*B_fci^k@aG5MpTOX+3c#Pu;MWDf+YG)V0Db|3zditdDdC;#Z{H8#zh;L2rU3k% z41Rq8d>4biJpg_qgTEsHzMH|{69B)R!EXqF?_uz`ra{AEbZYu>yUl@Qto8jLSfWMgGFAu=Kkl}wk0Dl9+UlD-6nc?pa zz<(pd|8xNST?~G60Q`dteoFxSGlX|uzjz@4{sqE2=YKB-!0%xA{}ceGWb0K@EHvLj{)?bz~G+` zfX`y^zYU=OR0jWT0DJ+1|8oHS#e{d({~H1D3mE<#0q_+J|BL|mT89740Qd;Q|5gBe zGsFLO0Q@?J|1SaXH!}Qx4S>Im;eRIpegnhb69B)F;eR&({&9x?y#V-U82A0o2Eb2X`2QXNpT+Qh765-L!`~MGZ!`S=2!JnP`2QIIzmVboR{;DXh99qK z_-(%p4FBf=@T(a9F9P6O8UFtSz+cPo?+$=p&+va40N=&%e-!}#8;1Yu0Qd(P{%-={ zyBYp(1K_tY{Cfi6Ut{?92Ef0~@MG}%jsKkte?kC!AH$y*0RIicpA-O}JkmY>;5AA3 zCpNV=t^cGE-Z}mZ4}ec+_(uf5XE6LJ0q`d<{Hp`RPd0;Z2y*_y;By1;moWJ20`M(!4YfD*AFna^wE^_^F!;Lz;6GvTl>zX(8T`)!;FCwW``>E=;L{j6^efPVsmKQ912i@`?%;By)L;sEv+6W%#~eHZ{=#^B!wfM3YyuVwIKAx!XAS-RXJ zg9bjA5JSfL+mb8Zc!|3GIV9INZWDtR^> zaQIHb(`96p-G#3);JbX{yA1e^gg+?CEDv=3w?Z=Zg?Mkab6fY7Ovt1}ynlBK9IJR# z*H!-rX`KDriGPflx~%FpF#h2!mImFRDNCm27~@S(w|8{ z)c-OZ>-zCI1JtDJ|AhEyr|3oA=odIh1~(yI_rJBj%yq0YGaT#s_Zswv@Mde+Z1HJ{ z^|RODSl53X@$34JC4Mje<2@0a{!GGq`Cr}BqxT<6Nx#$oZ!r3AGUzWRelP#`81z^8 z^#5CcM<40>*E9ZqlhKd&=+ zVJ?2UefnRmsq6kv!;5XOIpeteaSO4=5gZ_1l|36~%hhc)l`M;3((KpTw^E$W739tLVgz#Sd z58mg99D4k0XZ(+2y&gZC4Ek$*`ac;azFhn_`}F@_gMJGyw!`L(|4$hGXAr;M|KIJ? z|Lq3-8-4o!D!_C8w@JS<{y$^%Z!ze9!KeQZg!?o&|M&Rx|NemI^si$4|4&B$9OBpg zKP(k8!{!zLKQ-u2BfMAq<9$k;{%*$qpMxGf{(o=Ke**D)^*?_#=+7nmvBC?n4}Jdg zKL-7MjQ@8t`ga@jSNrt;(clmfKQW2osDbc{wRBy7sR7^P6W>C3+1g`dGl|H{|9G98 zi~kD3d(Ho!1Uwf%+4!&?Y&J>4`STt)hU{Wf=Vd#IUyuI>h+pL=n9!<@aeowCC*bsV z6TZlq8ICDAnwk!HPJc7$@1&flKLLo89;JUO@$35cqn8qR`Ts(tKdML`gb4qzmagkR zPw98%gNYSv&ht-vrd`*M*V)j2di?y^r~Xl}PAL2@*kT`jKJ^a=yzqYvDvs9Cii}hL z2uA<;#INhW=RjGYm;WC%=Qfam+vX}ltAp_d4>#rcZm;M6)&*|@D^rtcUtBGHapF>H!q17T6?Z%9Ht1i94-3P#f$-S>9K`5Pg7XZ{e+|Tc7va@T??3h!_|x!V zW7wShhcNt8h+p^L!G}u5W8^OSiCUdoMCsQG$R)hj_)`yfQU4l#6X~~!4E>kR=wGk& zYxw^ne$`(p&AR><4f?wXf2jh}UibetgMKU7?fierNxEG^4+P_%-)i_Y%KX`}>nYf45Kl&l~iIhPnIiV;KEM!8{H9 zr|Zw534)jY%LuRgzl88!{$B}r&j0Hf{TYn@=MDOw^QnI#1T@;O>+kWYKLhZb{C#M*nW5U&H^& zr~VURo+bRR;d=;wb(~uF{C5K2h5t4DPSW4)(0?MMe=hOs^WP;$NT8ShuQcdyCcKyb zFE{AlFha&pg+qTPqyHX*{&#%pf6Ji1kMMuR%5iLZ{NOyB^M6W;)W4DN7(Y`O{ofe$ zzeFegUjEO5c`j1u>t{WL_tJk7;5q%9_LKU19Qvm*`sWkB9zRbUEuDsCJ2xsWn$%&? zzn$>UM{~*p-T&(h`qz(=`knKi97g{pgZ^8_Nj{neL{;ee|83B}k?_w%k-YxT4El5N zWi7CEi%)s|2j3~C<^$9{TRCu^fSPpwM?w+^(~G!G*MB|X_4w%wN!YtmMzjpw|JMMX ziyv!$3Ctus#{U_N{;dZ6mt;svIK7SAbp40Ic?PEG`kM*wrT+lHbNVyW-1=uQ`sWhA z?*GaOQnr`=+YR~~2=Ar;7K8qZgWUQH8T~s9`p-VWpZ*DOp2GRRg79AYzXN#A|DA`r z_1ld8O5)f3pO@)R|L+X?O9(#_#W^-T{(oc8-+j2$kJsmL!}y=g=>OQD|NJb8^J>2* zLkGqAzk%@2$YP?Oy8fwv=lmbSmj%JrEk33Gvl#u=#IO55YpMi#>A%gOzl8AH&^X7Y z>;KrmpFUlJ=rkf)f>xYW1Q|I0WfJ~@C{iBi`~`sL{MSSN+d+7&|5C<(wZyOc?>*wj zvYnf*zl-pC|JO(OXPsa;*7e^CcuxPOqh!vL(<<|33}-y9s}z zhyL*}5TZ|X{<0hi^qN0iNchPbPX*ym(bARw)&3^J>*r6m5x!N!YtwYA6Y#?STD}eA z-2Pw4`2Ph1f9Pac;5{0lUjJJS{Od!KKSULX^?xD5|2gq%G}e|=CBMmk%G{ISJO_QL z`!DS@nd2mtk@mX&?*X3k-=++yKa+5%zmm~kVc^dt{^LCOzi;5*N&Mg*u_1pI!+*Vj zzriQ}H3oj`SZTkLznbCiHt=`(d?jj7GjZ(EH!F4g9N!-zGfvA8Q%@ ziLlNF$*%tQ$b1R(nm=Djc)kC~B>ZW_uXeir%K^{DPdDjz&fnHC`X4jsU*=Q)Fj%KU z`*r=zgs)V>X|L1*2GeO| z)C-BxBYAL*fxm?Ko#W^A41a2f_kRiTdyStX0nhn=8^eDC!@q|3b-NZ8T4M7WKa-E) z^>-28tN!)^Kc_$Ud+z$XkC;w!? zbM?QI;r}_q-(=v=oF(hu%l~x-e(QL5{C6?@_Z#>deDeRwz@N_W-^uXrGVpICey{ld z$iSb;@ZZJoXMBh1KQY?G#X%48pBbO*TK^jdcv1fv-X?zM_u=wqjzgWV zC>c;h-1bw0{#?R)>A%sSe-)$uUPk{r2L0Fg)ITkQ_kS1R7sXlYK7R=Vp7Z|((qBP% zoWK2s(SJVR(WkoqlZzx!@9%a0Ur%^_{WwJUXEcCb-Zg*+X|CrlQcg$`0z!mG{rAJM ziU&0>d5HLR{U1=p>*w#99P1OpyY$bN_CG9l(NA6f-vAHNT>2-RDD`h3BF(VurL z@Bcp&|DjQ4d7$h6CE<1beS{yU0d)O$0-n>qo%E*=9`!%O=>Nu`KXs1O3(NCynn|6efZZy@|5PVsQ8>)&e7zm6{4t9FX<^8};+xCwmx zA6FuYy{`ZLnDDy)a|w^vJe-@Z|2n{P{_i6F&i4BhqyIyL{@c!$tgyTmw`p=Ldm_b8 zTrSJ%CVY}MuIl>p0Wb7xcsnfPr-IVa|JWC&(05fY_Y=QHV{I;#8NK4?xbN}$-y}R- zo{rmep7DU^^lu>jnS@6DTN(Wq8~FQ({~FEVy8jj%_;(P$v;LoB`0pTo-L6aLOW~8^ zte3uWChb)EwE{L0{zDJ_?<@TpzIn2&f9Lr50;50uc)tDJbgopX&%ZS})_H^8&On+UjO$S_`9&n%Tb@Y{y!S@r{zff-Et?^|KDKrA8{fdztgKE<8_Ld_L@7b<%HMc zcMIVk((sy_tOmey@w*-W*bQvB=71aaUvDz{UpDYJFOoR*9#Z+uJ^sF6;9q*WfC-rcs+hM*2!FjWWU1b^}ibMSZ1y!pl_zs@9cly zVf4SG^lSLf>m{St_;J`l-=a-vhkRAI%{T*3XjqcThU||2;;Gd$ z|8|4^5^|iE{!`$_BeY4^UqN^%K5oee>$O2|EG-pHsaUMKW^};f2Toz z7vXWu(z)sS-#6$Fk^UVH{e6u7)2Hz9bLtNzaJ-Wojx{;f-Gq1fpYV9i$+_wJy8zGm ze>drOp8x%e(f_qU|IW)KD_q`-+cY`WMKHi)nyx?XatXUz1L*oM06eGPnk(a{o7gda zzF_n}O#FKMJoF<8gvn(9Ab0{3^4!?7mE+F{UNLipJlUf2JsLH~p@slS5os6U0#|1X37 zTZ!Lm{2iCW`+pVK{zymp#pr4xRJNBvz6c;SC7-}-Z8{5$m@!RX&&;IANl zaznIq-G5IR_;b&d{JY8j=)WTw{%?pMeu~>3x=wzjWq{~!T6J3ar}F(@=JgV?I*ODB zy8hDv&&6*xzHAvbr~k$=`fnqCz5U%w{9gUX@Y8tx-Gui#e@Xy6r@x2vr%SWN`S*B6 z|JlT^>;H#O{r4I4Tb+`4s#amT|2G))?2WpL&A?euwaCr^&Ib(|P|_ z5dH@;3>4fo{(NoFzw>+v+)jaw@jrplpF{k*|DV56QhN0tZ3g{4g!j_l3V1GlHeKM> ze>|iADTDqq*Zb3-c80D+YvrGV%3cai>X0;B#c zM*pt?j}*H9zy6s7jwQU>X>zR8JYIk3=MwP{a5^_#|46`d`YRSm|L-6$>YvW&Uq<}8 z{@1%C@JJ^)9P9euHt4tRkigG1fUf@yz;pVutEK*I!lV9^8U6nOJZ91Le}1Rr&z8IB zClwd{e)J59hh?z1?ZjWmuZP5?#_U(+oJDxo{FCr{{p|0(oc=|3S~)`{-_9>Ra= zasBK#z;piJPWl%R9{pdy=)aEm_4s@HUMZA@v8WZu<=heqc>N8(lDUr3Do~G~Zw&e; z)Fz1nocd=m`m2av*WbBO@_Xt3vq696@BHb18Su%FRlk1Ke2H8CnT-CNLg_zUf5{{M z^xsE#J%0KKe~5?wHvpc~zhi}4{~Sht+Du-5$`k(dw-R30-$i(@__+e`oc_$q-1(q>H5nEKT~C-z0Q*gcus%kl~R8v;jsTY zm(jo2z~4pun^i|k<>>uSrGY=xBKe);_jwHeuZUl_Ytc4IxR7|&4sCUAdzF5zfNsK1 z)Y5hRUjbhDPs_KURq79s{pi1ikSB%6(`kQR5#N4$pO+c(onqlwbEowr;q~}G;g1ps z%iD3A!mIsJXY%p0i10Y(IyddBl@54ezcUjYuUaeZ?~^-m{$0V?|3d@+#usIQ#}A7y zSoi-51OL)CNt{g;j{d)h;r}D?>vp~UisaoCPcLkBCY>;w{HGPr^{UJT%WH9)uKzf| z3;*f(4yiwr(5Szf(O*FP`uO!G@#}o5-j%3j2K{|L^)EH(-_Gb?%ILqrp#OWXNrhhe zw;1&268;orDDCy~o-*jSu9NK|)n6%oJ$@Pu`ulw9UuMw1fzf{nqyHL%{xe>eioNvz z-k`sP@aHPSX|MbLw+8(w*UR`>ML6_-gwg++LH{p_AM4h+>HZ%+hmW6)gl~6(;aJz7 z0C+Bbnn`~J;ZgreMt=tJ>+y5SpCxcK;nhypUuw`_LU=FzXBqVOF#f-k(SM0S|64xw z-)g}B%_sgvgZm(A{+ke81+}D_x25otRYtNy`)Yj# zc;P?I&UHVQ{&T+n^lHX`Czg=^H2kT5kqO_?(slkC!t4GkC;S)#UX}CTgxBq_BYdld zr{)k%-2`~f{_LBi{m%2ZcE@Em{c&5|Flnc#-; z+rjXkOZ*y*73mQ$t3mFfpUCCh?j^kL{||a(u0x%f;aK@y?f09<+y52eD>b~XGa2xl z{Y%$N`*#o??Z1JszsA5{@va1Voxd$I@aO(i@;8&A$p2%8|1sj%?Yj1T$zMVG)lT>S z;ib}llT`-Ve?oZE_^JHAlJI)`?>#|L$9){Tm34_Wy*j|8)a@$p;d+ zP6?%Q^!VRy;9q*H=l}8}aM@ zPuVFA^78+;gxCFFO!z}IzbL<}{rTtc_FqK!^EAA!b3WiX`}@d#XaDmH#{NeP{N2P) zk5NTc=<)x6fq&c2rT@2)q1gWJX84E02?}P>?fUmFN!bu(mIr97bE_o0?*B!f$Xs6j zf0FQe{9j7=JDg;2tm}Lf@SOiUyQKZj{`X$S{-YM~^&k3F65p%|)BT?gc#c2qPRUSf4*{Cp^Bh z(z)sOCjwsBuNly=LE68R@M!=2jQ!JzUq64C@`Ys0a+1TbCdX9|2qlarQvm*w*a2=|Azae z{m%aPS;qdq8Td25k;K(XDCyAS|2+eL+V3R4^ZMIXhX0rgc>mw@tt6bL*{{j5mJnX| z{~rl|xB;)qd64kB|34snmxkB0lN&B7eUwDJD|JMfohW#aR z#z-f-`})H@2L2sSNd7)*Sm^)%Vfe>h#QXoo!zBL+au*dr)fxT%6NQJeom+Rh1e(@w zRo))L>+Sy~!hfJL(q5yn-U2-5|837o`%aSOsegn={GSDQj=yiK zd^#=a1t~ zl=j2)JZ@9_4c6um7&e($ajb0qOo919*;q`wq$P?En77@UJF*-T&{O zBKcMPC^zW-?^F7<0(wrBIlcO?T}r=(U;h`W-`RhC!RWu_2Yme}&yf6AE8(=)^(S4- z`@fU$`)PRH|9gO+^M5Y=;W20b^(CW!k>c0v?;?J${;M4Df?vZgAbw~6^)zaqR>|5Xck&VLg=koB+P5Bsk@jQ$-4{?II`->d(6)xe+rq2zb= zUlt^#P&}x54KJhk)8gcZXG(sr{_9r4>*Ie9;qh-KI5$21ZU#J8|LguH^@j+L{=+|M zt?PeP>DS`tf?^5W-$@R~njGuMI;wvS-$3{?G`z0=Fu-&AH|&)9D+rJJhco)mQ~Vmw zM&jS8rE4;+GR3duOX-#T&i*@v;eWxv-!(^iYLUnJ!&U=-<}S&ET+hc} z@&d_E%Q#W%^!ocH;q~~l&XYND&C0py^>-)Wx%%7GC-v_pLe#%MqyM-D(y#G6^?eD1 z<%PIS*T0GI`uH7MD06!C-@gaE&>zQQSsVW;^{aM{`qLQw2VEld>+}DK#BXXp%8q8j z>-wh=9^}PsnwzX20-n>qjr8vzH0nQy(f_G|ewg6B!hf2b>pz$Jo&9Gzqd%vKkKg)A zN&H;GoLw`zDzru8)7g?=sHrZ3$3$1?gSN2Dg5KXj2)dZOlV-G3(n zp5x!~AIXnC!wuu_D2D%f;@9meSuFW~BjM3cO^)@gLH{>|*Y)Z=yAAsLzLLT-i5c~W z82wetdH3gMA|Jj4GO@#}WoNDJ>1qn?uonjCA~3O;`S zoA9RoOBGu~cs+ieC;SI0BkgsaivZ8rKj9l`zjOTkE@S^+4E!5wq@{b+gopTb|L-vH zm+X=J&hw`U41fMg@}Fks{f&~}YyId^!t4E4XOqNxoj*MUc;P?IvFS;e3h%#=W{CE8 zJfr`VReb$FxJvSSoj<)uc)k8}S4+It_`418T>W?i%#M>zD~6h{A@2LA2D?{)t4GXwv6`oq=E^QWl{|JTH?+jaaJ=|8XYr-~o)@q0Dl zz51_T5nhkq8wvk`hyU*eJm>$E{iXk%{Z|fS|IskPK}&W1<}0QBUhCh71D@m0OqKl3 z{_7Nmzm@oP|6koM`MvtDua$nSfQoA+-mCxmLh0A=yAP83o&6U+OQ5=Q)h}FjIbZ*+ zbm7RW{~Gfn-v4R;CG~stU;6=`^MBW2QoquP?JtkfU$6Kz`$NR<)qnj!@oV@^#P96C z@)`b5iC^!({&bVH|9ma}Woj((vMYH1eGmUw7i?br*Gj;1{#$p1^q;f;n#t&Y-@xBR z{9gUnUk&`L#!7x?|7A1$r#4gk32S2?U;k9vzc7|0j&%Rs(agv1x%kJvVDsv~J~ZGL z`NV&34bOjxPkg-r|0AFHKM>wE{~`Q^3BnE04}JdjAmBy(Xz{=EC|Q3cgva(bm#M!m zh+mKYzuzi>di$s1qIwFhr1;nPt=nYIyR?p7*MA1!IsMt=r2YoS`p-N@|1XGN*MHZY zlD{IVR36AuV~Jy0`1()&g+F{N;r04!AiP)oT>*H`{tX#Ysk8phVeEg}p#P=2q<*jZ zJD`=XzaGMS)!%5qbNY85EA>0;4_}FzxL<|c7kwBK2O7clnUK>WJ>zrD|2{k>z*-%WV0`g_x$f71z4zq9@-82zVT#kZeD z5BjUWdky$!eB#H!1P7V)_LupPzxq1@@Lc^(zz!2OXZ_(Twe;C2|A}q9{dG_JtG~+#uj_9n{IwqA-%7x9`m;}V*Iyl@|80Z*(Odl0pM4E)f2~ja zlZ4mp-%j|sQifp2m|Ftl;8i@Zr&EdNL76Klbay9<-`I0|Gc;vs7;onO9 zx?N@4C9qg4SC$$}JiUY0-$i&Y|K$Ll)4!=eGCBQsIivp(1HbjM)bHiL2Mqibg_7Ut zzbhF2@z+uNiMd1^eejAu|NWfsdi%+IRpLwKE?T-?|33x1@Sj$J%`@Hl@s(C7RFYa( z*roJq_!j(QU9gR&{A#Dkv5Kze>;HPf!}3bprsE3$FZ9RdvaGIIQhy2oFn;lsO1l0B z4E$-YOJJ`@|8t*#e}gUgan6Pt@?XvH@88MS|Cet{{vS(t^i#KgHR1L4f9+c`=lxNn zJkYAiiU1y!=4$y;ilu(%_qplz{9h8k zZdb`Wl7FejCrgbb=HI}_-zLI)`R{bVbN-t^H@-XlcRizjt%1Lx$DjY24g9OlcKh!J zhW`)5uluk0eSiMjW6uh_8t+{oxZ`@i7tGC&UaDQ?UB zK!xx%%5d{HmWrete~b!m0EN0FO-i`A07CAE1b7uiJkG;q||hx`6O{ ze#Nhfy;SMfDzK0AXHrJgkFR78MAFGHA`d>8Y?|4SMDw=??BCVoAB`V9Pf zJX~tfpYoxMe?7nQAGy_9ZqUDx^gH7RAL&+j<^Nv*9@BLHr4zr(ulV%uy9bFcxp8p( zzZ@h!;imriWfUvxWvs-$S=Kp&#QzrXT>qo|zrT|Vj&=XPKzP0WCisk>t$^p^zlVt* zd?Z=%tN8iYpg)`Vz4WKt%(q{g@QO#dLGi2aNr30{r=25f&Zdmm|KKCF3a`rjF7fN_ zw}SW&S46be+hd7Af3r{hvkm$eF#7S4R9*k22K`+=_1|UC-|bWX?FRi_jDCEiQP=;H zL4ObNALilzFAVy36JD<`#jlF}he7{N((mj)@sUV{SMhW7Px$tm_L1zr4^l*i_?ba? zSNkQrm;TcL&&7ZGxibEp`X6QVFE;4UCH_M_^miEaFYu{Km<|APko4LWQ$zd^|0GSXuKxnU>;B*FQ~v_MbN*k?=*LG&mHp|Y z>o$XaYp0AKFaN)3(4R?o#iQJy_|^B<4f=Z+{eNQgr{BW+zk>L^{C_Utb^mwz)ISgK zoc|}BC*$84Kd&(QZ#L-f_No7MgZ@6B`nMbOH!%8NXY?O@EARhMuZ*9QR7KN1q%w`garFYyR+%L4WA`GX7Ql(BHAmwN?vH-w=Zzp|0TnJvw^?DC;trw{!WJfYli=i z2L5KB{96qCI~e|N8U8&6{w|;VUmEyB7rOnwm*LOs;^V)Y_`Txqc)%l*>-q!nZ=gWI z_)CEQDt=V_U1Z=-`P5(hU0~o(D|g$EkA&&`HyijT5Pu2jS38AQ-){gsGU@g&ApUO3 zi1rU-_}>9MH-4`2$^RzcIsWttOtq|T@hPwWk6`#G-of*4^U0q9c#eMu!;g<-DgUYZ zZ#3|y{~f&o_g|8JwNrTYeVKuOeWly}Q4Ig%2L7c!`5!UxFSy9fkB>wt{mTB~ck=$< zMEoITDD4$qB_{wLne_Neuaf*WWyJWyN1_y7@tp$Bk|4D#{VqNv0y$Dm| z=O2eL{LKdb1wQ$IXy9*V_z!3Je{JAj<&*y&1OGOLe=NiQhJk;*PySa7{Aty0|KlS$ zDt=V^8-5pG|C@;47PT1rP3)J@}PHe+N9;qQ`$H#h;2ZjDLJ2N9k7S z2(sXK6U@${cRlHz8S3oPO#6p>G+v7wbey+i|Z#eS&qmXp2rhJYIiUEG1VQ=E8HqOGIAu18Tx` zk|W?hu28!0vFj-Cmy}d=PKMO7ARgUjm{Svrg~J+nbzG)P7lpFf27{SYGM@1sTe;;ZxX z=B)i7a$OWH4HI>us-t(=UfdE=4uDv~Q9+q4h*U07KY3;IOVRmu+tZ_Pgw4S=t?w8xfd zEpE#{9n!E><8jvaF-lX%O|-UdlE-l z*0o9di%?EZ6DNqE4w|sR* z>Q&9q?Qg`GhQnfmZSkk4-EPPAJ#C)n+0r`b8% z8+)VfW$mBmZGU7^w3_2Id;*4`hA07zg8@CY>s~c};=tQpm~Kym`ODMx%U>1cyqqoc64YxgE9W>iOjA72uk@)Q4w=T6z-fHDB%B3$vQ5av;%ed);31q1Cr{uf68k z9=MX++MT*KBz};-FKU~aVkbOX)K-VSpRgzV9HfBnQ+jWL@uhQ4`w1DW4{>}gw2Eln zFh@E=4=o?=VZyEV+HX-#u4S?_we@*mAE2#sMd3pK?2h6S z6YZR*Ru2E7Fq9a{wL30>s@nstWGtvFKwI)e-GRwickcnK-PUIxE2?f7)?6W09jX!i z&C4I#FYknwlzR26z+!h4r0xlSA)8HR@0;Ji*ed3IcFTLv)PAtDw-b_--yebF{`~$E z_+2#IXuC~qeL>h_spe}#^X=V)%s^lx!LQ+q0Eu>nbJU$gcyMGerGtmy(?kGvK+vcakeq{JLID$^X9@+aL_t)Cbr(U! zvR#a?VX6wu2uN?^LoPg&BLs(uwg!*I1Ex>Nz8s>n6*CX zWH^2k<{DN{(s$tSXUPY_=Y7KtfX}}V8;{n!It!eHei0c3WcpGBq^GVu0xXUNeo@;N@70Fc9R+737KZoQZOIvUMllKIO)v`W zhEb>tO3QmP7f9iIZfa{Qd>7+l!rtPX-79w&wR{#TZrdw*1DrAxC2R$=(ruWELAZ1j zr0kK?hRmY&<ny_9ZAA z56*+Yxhc zf;}A~K58Sr*~vy5k0l$?qT;r#v04_Vme5{{+pF2SPF?#ekPGL!sjVN2l4-pnZaO3v zfO?;U4Cu%rSnn$8I5o?j_%FNNh7Re}OYM$>$J!lPmk6_ZuY-(g{1y3s1ep$=R@|No zwr`Pj2-Vbkfg|6<%|#tqxy1=RSQM0=E3y@1wy+rbTS2Fo2@PyjrFRsNE$$ThrFP(J zKr*b3;`S0W=~5z1&glKE&?W*$Xm8tMx37|aQ5xNkwbr}Fp}*x_sN>Z;dk>R1m~Y8Y zU;A9-6uaYW2qruw`30B|3nnp7UQuheZP$Zo`MKmj5i_GzxInP)bp%REG*DiFKzUjQ zO54f3yTx3q8U1Cq^kD4m?0r(szv5yP&WCPS^%R{at?JozjhrN1x^q{v4Cmf8fX1#1 z78Q%z{u5gqRI?iBHm8q)j`8pem|Bdrtjpl|RqQn1N{BqRpY?9y8xWw+CKtiY9K)`G z!%v2P4xg{=2RY(5(Ld5ja?2-ai|qE~V<(^;ZLmUSwJHgD9G)063RayjIrdix*5l{`vCXfmyr{N16sZq2 zR#z?xHLYHDQGIPqRj9V6?&45YeO;uwF4A;zh+oBv8?o$;%Q8YTPNS!<@*F%a+pc%T zkXhWZD5FIBrlS;Eq3GAaZ15DN3WYFnhfpubfH9{K7RsP^B&#~a3N_)BjVQqu@ZLHY zprt1^_u@nfk45pDW$`4jcV;Z#u8+wlxD)kF=tH8b5cU9DfmMlfIN+k)w+t9v95ZqkCZp#O~2PWmOujrQ4|m zyG01VptTMSv#WMM=L-wpu;9?PFvEr!L(#-N#X0{5%E?FTT23+M~GBmWpV8CjA7z4Q~gC|XQL?%xlF$b>J7bNX;1^7jyQffU`iZnOoa z66tor4m|nYf{u%1go@f%z>IDtEUWZk&s7o$*&W3hww<#X#&>LG+w9a?PuuOn9il8a z#UGP;Q#YJrw|0S_Wv!rtp{R~2duHe@E1ibd-p~r z6?M#_s(TztaaP?9s7g7H?6>-g6JYr(R(*5U?oD0027=L1D+j_?Q7gU4j`;|Lv{*aK z*__&P7P`2jGyx~%EqL#g-7yQxDlX16_WuX#@{k3CHj$<(!f z!vMh56*wvS68vi?ykoarp0;I#)!Qq$b79uEJGJ#~_@Wvl-WUj{)2XdnAyI@0u7*L^ zAT9>LqF74reW(vYAjF3N{%O+zg+QCo)QXK9yN$Hsu^zBX?R^=hcb%#? z3qv(>ZjbnC8{1%z4(NfRj+xXXdI9`cF4T?e%>D*n?S!}BL=jiHc7ZK&_JAY5ov_(% zyCA(d0eUUb8tnFk86jcjkI~G%qrl4E1z+RzUe!1BcAR0Utznqqfn$ajwZrrut}@20 z(awaP4}{=~=}b5&5Yv+A8tqM@PiYoELr023MseF$qLzApAp0A*PL$f(xEljnUO9H0 zu&8ND?>zWj&2KS(57bD1`McqFHSdQ0?8yWS92gn1F@oky{0~M*Mpg@SAid5W6M-G1HR#cWq1L8z;TCTxn7tm+mAdyYuMSl;XlH! z(eLMa_&K%p2527x^Yy}5{1mmXr1tes*}lT!x1haE@1MmOkc&%3sjc5YJL<3g-j21i zM{~gn7$afHXAQWl6Bb|WoR_g@`Z(0PJ66vy)c0V%~IKuuvGKQ|pI7Wb7KUb(-H$EyLS3r?e`Y9lp4xa~~ z3Gd-a8?3mBwIy}(2j$C~1==dA1tCha)*T#pY1JaE7XaCpl>dGPu9LCEyd!Cxl8?%hK%>F&eEe>>LdPX7-k zfjI}KonToP4}-Tnu1xDru(}e4!3)Fls;a7+nnKlheFoM8#7R6XX{;8G$Fq5u);Le( z;ljK4iB7xVk|)HvI5p_!L|(0S!8VUQ41&3EYw%8I<^hB7I4^d+Va+GIA*t=j!Wu%4mrDN^?n**Ohqkrg&BeMC=S@g6ja zG@%;8cPl6Y&qFoAwY>;T$&CvMk@NDzd^$08Ekd@yy=M{z*Am7=rzou{V2a%?Epx2X z9EoRDYo0*|xYucbeQDd%cq(RDYre87pl5FFf>~Po?6j75_q5GUgTxRduEiHXZKY}LaPZ!faPY-53B*;Jwg#@Rr&*A=p*b!s zB+_7z6q;ndT#*)vOS2LXn--szh-oSDX~~$D9G{kkX)u*^a9F5xgVL9uhL;|5+w#+> zBWi+qIV}`|18vcwPbo=j8o9XT&86cb}(gfOV1f=-s|3LeY4;8wtTp4u@&FlB*ciGOJ1~a z2$<#+kWB)zqXKe>E+;DBWJ)qhfKm#g^o2xUi1ah#=x0I$giFrQZl8b}g(hcQ0K74Ow#gR^`CD} zZz9Y_7I%uKn4lWlx3aOp*;?w_3iw_8nyh~PkNh<^?$pSw-?&z=BP;()0v3<(Y zpxwQm^L^yQ}=3&Z4-(2#n+PxD*jl3!$wkF_4W;o6orP|2Ind+!oc_go8z_UuKXB0&U8 zPjG&HHT>A$`SlV3Zic#rb)wn~n>$Hee%c%?>TNg;>F?Hp$Hi$%uIOG~Y6d6t-Uca) zJK==L>#i`mBMfg2i>^2<1F&d3GIR(Mj;xvp*ICv&5+x!~ULRWu|RPvd$Z}+KK@6H3^5mkz_rbFsw5f z-m!lK+!VAi@xTX@t$!zu{%NxH`y|K~?U!k=MW5p)<^y=|fxOjSyTFFeDSQxx!ZQe} z(~eBH+mqpDCtM(h|mw9+A=sy*6Ut z{7h`>c|P?$;nI>~k$c3g`1@Fe$%Zc(0s(i{z#e(5nPbwfO`JU@{i>vbF`>jcBgdrY zjY*p^CS~@hOQXkmqXe!3^TT!r{1@1oF=CdD4LaLbq!NQW~mYaRT@?FslF ziYFOTw%$DJaEhEQF09$5^NuME1w?`$FBxq@QqY}^4lI&6F zpB==L20@{CI*{jDth1|7`W6M_Fa)Yg$aW6XqWQQK9+ z^TuSij3^jWl2|u#Og5zCjhO&BqDp6uN=ks@nO_P=C2ocv3S1ByG~hF2ouuI@I93|2 zO)QAkDuKI^c$C$2! zmJwGCzjjzh@^wkqCze3^snp=`0+Q0|;*9xg)|icnCcmKhRtWxgQkkcLJ)%qiIeF1X z_?}?g5}}S2ZwJ=XwHW(XCC>sM6@ibyYcg`?j*{_DIE-~!cIH*d*CutK>qPvEM9aeG z_4?Z|w34lV#QH5q<|Nk}>Ew?|;t51YMmkIqPb6~bs%MJ-ElE7F7@vmUlEhPtT>3HY zM3H~IAw9#8{#{o(gc|g{v2w)i7?dl?I?k0J6OzQ!mF}OC#M72sI`)q4ElE6$$)&>r z8M7scr#0O_Bw6_Mrh7{gPjhnV;?X464@u%_PggS7%STg^cp8+;F9&q}mn7>9JxP2| zvhrN%=&?jARt~mdwIx~k>M(AfWbs3Pk_B^1Z95OXCpyZ(wyL%y%T|YR`y}hkxbNyq zlIXqEH@RO8yF^Dh*f!OcWX(~B(f!?Ul;}uT9{-cbaX~bnI(SVSOjci``~ML~r$)c4 zgTIP{8R~0v|Gqe)P9>UZS)Yqz>P#Hzr(wq-W-X3HIK;a_-G8AQ)_Ea)d}4YuvzoJP z6zPXY({Wyc8~#b7V-hcvU*Hqx7P$Qb((g!|FTcR2QkDnxc1NNb?PK|GfOMzN74Rp9 z^xF;T_$Pw6a()Z>$0x@6w>yZS8`6(SJYUg8Bj9C2`8y2dd@Ryo8ciF{sc`!S(hp3G z^=~+L!tD^K!UGdy{gv{_WJn*MI8kPTPn-kcb}6Lak$8^$0-wsCFN$=yzm7KL{}5#0 z%2_JXWBr>d|2{+dKSg@1f5SNxZX<^AejWqq#m{U=zaw#>%mklQjn*#> z`8OKUUooWbg7jk&7evcfE$|yd{uG%1a5^7^5)Mo(jFyA*B;1ZNl73T-R!5xYCHUqh-^lCUbCK2CaAU9m7 z#cc(obAG$skp7?{{dGgS<$U>sReruW&&^heQ}b)9D;o<}OscA{U4*~R#?#>F&*AJ+ zx(~J(Zi6kWY+OPNxrJldfn|)Sk`LxnVV@=(XLL#13JalKh9S`zt4cpv-`Ukj42^3rl8KMO`gL zPoD#q6f2ihOX;Exatc>fRX0Rx>g&Q;(Zl@O%BCjBRB-O3#_GkB%FCCmT2t62$om3av6Lssx4Uo`}uV%Yw8x2 z&#P`)zN}i2QB_VB{wO;qZf!;)wVdHtr4u$YmJ$tT73~Tf{UJv*12jB_8dUH|qEBEZSRBq_MWTPF1}6EzGsW{7TX6 z%#q+*PI&tKx|+J0NDVa3ORE>nYOG&bIB(f9YgzTOs)p6LTUNg!8uSgds7CaT1NI^` zukxlyW!1&yRZA}}UtC#JizfT&)HT4>`BaoHFG&1Ntpb5C z;uMC%k)_pVEw8P`e$>K;F7QzcPDZv+5uS$bK^f&$t18PYWmjEYUak5`fR+`-cNHRM zWGVQaP}r?G5#?|jM_qln==GtiwQ9k65v3suN6B!wa8;zSvMO>`<+AF+xUtJxvMf>q zomQo|Bg6u;#7!Xz9_?MC!&f|-MmfQfJrf*JQW;sQF_fP_OZI+)ak-<(Q;%*a)OTRJ zODrpm_x$UPKy?-y?=Vq@Y%DFD zIkUcTS!D#@q9q%qHb`cbE``RmLav|Tyb4Zp#Ht2d{Sw7as5oCpN@&J>FG0N zva1}R5F4HrOojid9Cdz$>3H^_(zn1dZkUem!&2!meH0t=o(%s-%dgQD6kWeMAH#A^ zf&Z$U3c~67ml)EU9O-!WqsqCS()IFx=16ziwV$ILr~bK)bZ7ZLaFpZJ|3gQ9XT4l$ zNLM;_|79XY{(BwiPCxv? zkgm=r^>Y47`BA?!K2M_a89o1*l&;tNxsG(F-_*4WJwM(YiW`>i)W6P2J87KER z(y=a--<<8m=}&cLkGy$~{5Blprt4H^V3>af{8!~)h?!y2(^cH+k4~pQojRTAPMyy3gX+v6{b;YV9JNx2=}z7mj{MGabtbKs(@OdEdikv*-5IwZ zIMQdqv8u08jyQ4ZJlv7))HBhLjt@cLrt8G#^>IU;PCa)R(nnzdu<7L-?nsZ*V@MA> z(w%nIQM#_D+mY_VY;)uq+tSV|Bt;lfsd*>`^RUpzz`reK!7NyF-9AzVyOByqqZgx;Ev8{ ztfJVufC{2TpfCY!RhCS^aST$IF4|gLYqg8ky>$s|T&jXg>n>Uqu2IAlT!8=g``mM8 z&fJ;FrvBdd^Z$51$(?(jd)DVX=RC`K&N<%lbLk^5Z~4_xtQqM~F~XbWoRtGU-+-It zr@fFDKbz&RHsEIYxu}O1!<+CA47e!|^oL!ImpA-i1745sn*R4N;AT2|N-CN7sW#vy z9%^&I^|<84b4-P2IZZrVZ@|s|@?;M9z#RQf&$WB$s@e!|mS4};d&_xrj(+;{9Pqo1 z^hcn~8qaEr>zNBZ33Oy_IT73UK)+{FJT18#=Vl5?I_=@b8EeQR^Hui0K^_@%18{4w!= ztAPiT&hItgCVn;=@S~BIrXLe;CVYPbZ($>Rg8?`5ovh%@#-#sgIpB>3+^p9MBYm?x ztvTQ|L@+Kdo*y^hCLW$K;3hr%%)pOXFX|4w7|rDGvjytHDNAU4-fX~+G2nL_@OlIO zpaD0_L)nrS^EJz#OU~Ehsy94kQC@`C;$N3jkGEcU4Z`pu+$_&nfo7KHL<4>To^|?@ z6`W}Ot^uE};7p&h#5(*O1!s6uUrQ)B!`I_qhre9G8J@Gj8va`YKEZ%rr{GM7W!B+u zGvKVFhCgn=&3vCR;3pa3^~@N{W74yp2`Aj_7kb9q3!kFW_olN%!C8KDeAr>Y8}O{l z&$Vd0m`)x3HGCffKH7jEoCAKi0XNe*QNg|C;ruo)=1ZG^&i7R#JZE1ud;|mH@|N@a z27ENW>+s`qz>hWHW;xGLaBn&9&jByYG0s#Q@Z*j0T&Uno&dm2}BfL4D{K*JE+DPa2 z9PkGWxS2lB@#N*r*D>H``aE|`hd1HejZDMM^h*`oi#IKQdf_J-a-&(_g$nL1=kIfb z|FaR^Ea#m$;13&cv;3QLz&|zMX8OI9yvlN#@L~gQraw}_y?9uX1HLUsI)%z`;LUe% z4mjtfv$a>Xf@hQ`2Yh{wblx+oATt_{uJJJ$K!bS)%TzZPdX%A*XvOayh??C&I8x--|HT@mOJ0e0skxqys+5K zNS8;aGav_i4-fo0RnGl9@VgXTk(J1+ru@me^J2dH<6q-pUjlIv&k_7<_yGjsVt7;j ztQV*op3gcw+msi>oAM`R8(xG@z`qXvV*+t8-xKk#;Zq32MYx&%c>;CewRqOy8x6QA zpEntB6AyYmg6Y#XtJC>|5#Bc7e^YQT-tINRn|OQLfFEU~qwSW=*MysLquDRcFzDID zKX=gJ<;Bmk9PnS|fM1&fev^WG+wso^+-ygzuuqo9Y{%6G+-yhggwBiQH}wT>{K3l$ z&tpLp+)Sq^2b?>yWD7qs2b_I@7e8|h(Dd+Y0&%fCrXKM-fx7UM@vOr?q~J`)l=It+ z@T7Si{w$+BKQZ8@orm6nI{Yjpud+NQ{QVs8xeSQQTb>09&L8SrI{j;Ng#TlX@auAf ze=0}#k{t3L{Uv!Zn#o6MjPRrJO_y_Q4mkZQd9l8A_}Afokt6+!4YA$4l-t;#caI?KWG~gya&oJN<@vQN%Q^8rz3Ind1UGP5{aIAxs%QC{7@F51AbcTp+@*t1FmVCpC2{gyBXoP8}MNUT%Q=o&%+J4t%!;6-3|D02AtuaQs1T< z@V$)i=KMmr0oU^gOrLx~UymB;lmqy4_2EqezK;%!-}el7r2!wVh@R(xo%k zemZ6P`7C@RNp{&KvwJ1& zX0jQ@)DG0Hb9GMI@dTSalYJ^l?W!Xs{jJ#(M~xiiOK(DP^z;VJPOdqEW|Y3iNY3TZ zof83He@+>d`Fh;ObJpN%O5W4-N#E!kD~yB^YD`Kn2b?bXvuB~APIB#ls5*_As$bgh zm2~}{n}xW|D&>e}V!%7>rP9t`@Gd0Tc?r^8*3)sCJp)gSPDl7;H9Qehgbttl+0n*X zBTw)8Dlv)7r5C49o;`c=`NGCEtLkx|G`!wr=?rCqT#0sPNkooxziuaeRoooO_OQUR zpr9i}beYo_Sm-p-uT7Mn|1rjP7sfgqM#o_8KjGx3d_F*7=4BsLE^P?ij-_p@g-j+`}nCRP?V|?oW zU5!6c#n<`+<8$t!tMQ{MzM21l-H0E{5`Sbj;$N91{z2V{e`A*Tw0m^5{&!`G&-sb2 z#$S^qKIcQa8vj`p-=v>Ix)J~7Eb&KoBmSFN;-Art`0r+kKe-$6Kh6@L_Peg)@5?Ol z>$(xYK-o=9{GZv4`2AFTZ5L+$qaCoT+<%PE=B1KNg7(G}VaiOBglm83BtSiQrSZES z4|UiEJYDu;bXS)|0e9ldR|3l`Dr)wmcIlA%2xh|6hZ3#uae2Ye^ABu z_MgX8eA5QYG(2SDI|T8i{5k{mJB!Q)SGD^i^izRnZ~3R@$bX~CU+=4vc&XW4S)T?vs00$t6Kt??9Lrf2}G$$2{}$w*T#joDF}0 zW8GM~pRxRUtl<|8e?{l-sX)0Z&@bI&l6Ph@zqkM2 zq4MvH{w`7Rz5S=Pi{)=d{A~T_ku2rsSnDnSb2-X?oSMw(to)-ur>wuX{F79Cy-yN? z$mPZV0f?Wi{IeR|@U5yJ5dR0^-&_8$%HNCsMg86Q^W2~0onJ!`;7o&Z6vHq05y!C%rVR{?bn)Tl>vY@%6q{I*zye@8l@|eJ8pxs*Ljg4?y1XM^Jg@?=Am$#W)Yw8LMB7 zcMX0(#rNWWxr)D12UNe_^52X2+3>${q8nkpibwnh@$W6aRhYf}$EnFUul(XI{|pu1 zOMlZ;{3?~d{?YmCbZ%Agy>z-<#eYjjRKKb@lF*wFU+SNPxDOLgc7HiO^O}Nx&Wr2( z_4xaCj{Fy@0DAv1roqdL|JQTmANYwIe!iOYW&WJw_U2!TinEB`dfmF88-J7gle}xZ zX}~cmz8C+$B(uR~xj)Ifj<0_&RPphXcCAqH&HWr1z+2Awh?ouk3(sn|1tRY z*8k5r^4~~ig-h>~=Dua(pZmOJ%m4PX-57fBTIN3%|K9wcQ2Bf7weKi5{+;em@~-iw z0rW>A3_oet^D4fVUcC8yo}>Jaoa-i6tx{$AZTx%7e^~GA`EOPE=Xnb3EzhBdpACQ8 zRsI1LpZU{%;m!YSmA|)MA1Z>ZL>%+-6vuZ{j`Ek2S>WQBWnSL$ugFn;-*h+Dauu27 zr%357{~L%;RtGkac1=?G>+t%ce%HURStbF{2z2^a8$W*RcAcAkpDU4 z5cx9dkecd41T?8=!PxM)Jiqo(BOUxOqkPOez++C;RV%->z5)IcKcNTWpTC?N;V*Se z;)(2^ESO}-rsTIn@lPG*`}ik%$y;d?<~QmoN8q0_@(=M(S+y4b{8op5qH_%X>+wGp z|Ksq_Z{zWA<3EJ|qws$;{=@j^w+Q}^!9V#P-y86M9R7cV|Kst00{&^!=C>2^e-i#D zs&~@LS@Sr3y+yesdcP6BH{t(g_5OGK-iiOa)cf7| zy$ApIs`uB`?;Gm(zv}l*_4}6keOvu*!tZAF?5N*&@Y}AQ-&Mcw;dhIAeqa4=#qS5| z`9t;l5q>{b&!4E@Pw~4=J#WYFXX^QL{C=UHIZv@eJ@3TtF7-^LkwEb0qYRj@o_ph0 z%XD&vP~t=!bB}Whhi=`Kw;F+si{DKU-@`akPaWZC$9qS3pxwd+190}?c z)OlzjG7HDsh#xt!W?v(5JWBp8g#^kmKk?pnVu5=E^TG?6=2$n)p*XYWp)!OzRZ>cx zAu8#!5pWKh833o_5Gd()tGw(u-(-22{{PR)t7t*DpWB*td^}FFT!3@$aGLhQ3+vdF z9B_P%CurJ9Tv(1%ns6eWG(R58RNxT|TrPnvp4FtAydLM_ke)RD+z)bQ?n6nuwy!|j z_p|abeidNs*ptbmF49|_E`d5&3dG+#S%_SvJ}nu7hnAw`9hG`-l-ez1(;B4y{zEoO zfFq}*B5rw;^=N;FXD=J&{}s!KlQnfbNk|`bg}M#p@vVdNZ^VgE1-PACh}%q#sl2lE zCtc9-IP-8p15rG1;e{s?#SM&MH800qS0`~{O?sPDXExyRslc5#U~#emJ@xj$Q|)(M zIzF7qvS`CUfK56ERp)k9zw+vK zm;QNn+L!;}2sy!SdKZVGQhfBKA9^;{PEfGmX?fAUHqKYGsL3+J^(1o)GUBnoN@}0Wc z+H0Xy23Ywp{aiuzW0u|>tvERK1tsqd$UMeKzufjwq-Ks!88sP9WHW6dQIpp4aN_LT zXV?`~h7uQ43U{?OGvBG!`>l1>fci?DW-5&vj_*sjoG7dty8TyjhTWUdWy#ou5?gAe zo5MNJ?WTbNpr!rMMcqrXzRk5d|^Kq7B?~s<9Bq`Ol<5NvbxgG@@pFB#^R)uQ*DcVk* zwVrllVq*wIRz@OYRZ=Grr}$W;d6yO23(5$BQfxg^vwBM@#m zU|o2`Mx<0^UG_($916Z?EnbCWbbEj`A$ARjB@};mc?iRG7>AG7M1pV6J2eDa2;l(n z2u?1x6UXAqu_d7qABILe8je35jz3~=_?!oj2iM!yxb=4P(^l*Oq&%v%eX#C-c2le0 z4z99dH{e6Pb#Fo4)cRn-xag+YjUcJ~5XnK)o)zOxqbz!j3=kwt<0$LV{MfV>Wd5Gj zR1cD{6Vb|YI~c9RdCo5f+?c?^tnKJ2TY)8%3R6JA~uXGm_(7i;Q=>qRk!A z^c0pMOQu$A88F$SjGgO%gmB`l${KG)&PIAY8@!!!k*0LgdOUPgp-Kt(rWLD^fQnC~ zb>~geS)8E=AOy??E(`lNg2uuvN307a#-TM8ttNVtVgX4}&w^ec??mrV+yqWzXLm^o zEq|dek|-u6hY~*nRUcOpPMq#i^yA_9`f&V3k~4_frD*W*=BFEXbKVEL(fn7_^Gkq% zo{ty@dOo5qx@pena6F7|RJY3?!oloPxL&EU-3G2jcqncF#{j6x#$MPKqN1GOhzb=o zF&o|Os1ghVp%EX1;;X{(4btOKzR&F7Bj|CD*v*exvG1ZF=yCnsp0?78?Piv2JW5t? z$4_7f&r24}M9@9Sl9|wmSu~a_l;~wAevTsj2spD*#94vRh|f_pU9Qh$BuJI(W(Xl^ z<+=)hB*s{-AEe3!q<9*0jTEa_dSjlNDpfB{4b_O6vIh{I)#1c^DPTBpY9JE-Tm}t{ zT8X1ki(iyP;u}Ih;fSYfeA@7NIQUq|8oxnCuYY5RL79gd>FM_7(97|Q?OlNOo_)RW z-ALlX?V+akkT7X#0h%i#+2}8jWJx;xM9((H!uHwshlB6UJDcNEIF7LwM1+x1hzNo) zXenS_1uksGevd-%168OLl>SvoGIBmg?@5(E6#P7TeK`0ZYw3?Lpdg#MzjwzDv#~!S zUl8I%2O|QdHOwq7B2P+$E2~5C2p-riF*adY>)WR9JfED(9`SEb zv)#1LA0DyE4(_xrT`5JxNNvZ5*exfPgyR{PZ(n~u54_540pvGGI_Ksb<9FA6KJG6G%kZ#3j z#B(vE%tSIKd4-)U!@6@mk_=}i8SNRDa7tN1N0|1pC6#*-9hnuQ4GpBOjZd}!yu?Ch1oiESkVwd@jB$uAFY74Q3tIbfwR&h ziN?&v`l*{Z#sZKN4MApOjY}mt4oQkMn@sW`;sUWU%1Z-k&)WYVL|ft*Z<5jTzH0TW zK;(A96%38j#y6o8*o)Rsh)hY&t0U}3pMvZ|2^Zm(2jNPqddlUs|3XM1o-fhB9T5)? zp^r3wYQ;X0fG)n%xc4?U#pfg-3bCZig*XKvfux=sR^R&*B0Wn#UIDc9tR2rKN)kWJ zpo}kFV(UZ=$~H3OONvYjnW%odmpH2OQ8zzz;rES=Zp9qpZtxz&~{oFs=iB0SfLY#h371dX|_v;%h}W z{<@xFEn1ORbPH(a9`2s{5O0aRy`LHGdp$1zlUe?Wc-)#l2=~7fRN(Fu@cDsW{cr?$ zuS460`*!q#Om=B+1m4&ik>Bk7KmQ!=`+We9f8p)(07j`DftuHb`|j?8kga_Hyu1j& ztBMY7AMSgs=sQr#ivV2T7q^#ryQyD6(;mJ*^{d%7+}G6qVn1Fkwf4qKn{_DezbYAo z`^o_p;I9lQM;WdgI0*Oq2ks5X#{+}7w+$ME`)h;t0DMI$zus30OZ~G$_D1P08(M?= z>q7_O{@KvIQM9|tg19f;Z4mB%*sUDpdSN$~?v~vL;SMAf^go9jN!kCz-eko#;yo#a zH9w8Fx)bXr)SWQl_;BJok!Gkm>i`Qun+BVF&2E0liv3yu(;@Bz+pVS;qdW-Y`waPT zb-)h3GWTrSaG?LbuQOL6&!@`KwjZ`T29@|wLgw(O&N#N zt)oYV6Jj9*`l9_rQ}>vK`C<1^8}xN1Nc(V;vI&cvm$C#p|DPTd6AUM%x zGE`z#npb_<$gTzlKPya+nu&Nw0#{+3QgPn3kK44`I&cTc{fkr) zyJWH^5=uh*qr#|B6mugD<#yBOM_NmM3&Odt7G`RAHbgpoGa1#Tq)zWq;ld^d7 zNn06T6G&Q=_Q%s}h!h$mRQm(8yHLuDo189V0ZQvPGmy7Nxib(uLRefayZGh4m zhGyCTYefk~`!H0#CDYMKBJmw{*1cnWQ=7Jz&nvYb_U-5TEZEi!ZPsF%B_hH1?f7%n z8AYoC=dh`7Z_Jv`z)8#*xTM)88mx%$!2G0KS%&>gm`!U<7F&}X83T|^>S?@}OpTYw2%jje49B8!ikCK%ku-F5nn{&uY@)r z;3J_8+mC5EVJ*6F9;{IKYzOQSPulShVay2yKMGmno)cpZm;KoBLokH24@r(UNqh8} z_-fsINZr)nA>*Tt)ieh0k@!lePYbTGg9a zWEXNXn|(zBr9iU5xAQ(K{lFK^_WEkj=MZSdBdf>02v71)=gQrxMTFr+; zOJ<;nh9-L+q)C^PPcyh>sA+8;`lGeXQlN)cYefeDrwY-w8NxYP;6vqM7I+({@eK(#(vD7wE9CW z=YpnJI=7>kcH)rAaPZaWCQzpHD*~F{L#^Jkmi`KQvhz3G+;-j{e7I@*b}M!z3Lb6& zUAHt;g__>RB+%za&aJ7l?ipL&w9#)bf-MA;yM#{dq4>W;i{6F|x+}D3-A2pjqt)zE zd`Q{!0l0GEL**oKKo%fbld0Qa@M|+_G#1X87+eLL34rI_#tidynRT7 z5sbkBk#1ka8wKhR4ESuH2j%O0w9hW9=?1)jCxIbFAkx!mY%1C^p^kWny691BAPaE8o!0U?SArv^^EEhu$B(@9C z(eyYXmQiCIQSp>z^hXFO)~54e#p=jFb27f$kOgY9*OvC#p48TPRHbWYPxn6%D0-Bx zE^kBjbVqlsy!6)+Lxdh;9luz#pe{Wk2y@k?{<&MmSs~%Zm4)Hy5Zr7n6+>>hjJKRxg=|Z) zqulmm%o_&*cL!W=Ak~KAGa%$P`XJguz?IIcK@rhA^VA6~|e`qcR=N-Xl$9M*zrEc#8efH@{vGH{cQg|E z)T*F!Ilq(jUe`&$MLOULhz=d4xRBqO;&((wyHHeY!>*Iex;MTn#I6NnE_Mw8v9l@S z#l#@Zh_oD+z z5TF9IyVi6<`7;8e9(9Q%;&b+3iG@VJBZbmh)+W#c3Uy+6(;I&K2d;#6prE5Iv}h9x z6?hLFh!;>u7!<;3 z(H#Bv859MLG8SXHi}|!kF$nc~o^32f&Ga68BqUs75oG{|%IpoBofim#wXGbf`kX(J zFmwrnkarFIUX1{0_=Wyn?#x3BXr)d+1O~dT=BWTUmoe3*H@4d?qc_t|Q0^QHa7s;$ zjy3gD=P3l2>E3J6P`X+MVQM3na}mDR30HN#^Fi`)xvm2%;k<=$U5Hos`F#}goR1LC zwg0Uav*%ZRhOs9j9T<9E^p{|r%=n7GSNP6>#PYN1Wfi{L{P~M3e0TZ-S6BFA`GvS& zn*Y>T%;Y5+Yjod5J;V1l9=u&Jx!u}9?Awkco4qA4FjYr)6W9I zG`utAp#_>k9EPGeN`UNs0OA+AzRSJ7ObU>SuPYzJ32&U1E0n=bE)xqW6RWo|#K za$>jzH#A~6{qJil&HxJ@8+)(uJXiM`UTMW{Ay-CP6WIczTE*!ThOv~N zsnt9k<3tL*U9#ajQxPYr-=HMZ!ii~cQkn$`1*Y?Gd^3$wkTSNyiz-AHmFCuqE(j+M zr@sxIft2eGoPv&R8U7?ZctV(aaeadlG$qs1X=^y%Dh^JoY-_yh>R1Pc0^5@Izg2#Y z-0a4>_W;g0W1dbfTm1Uwg!!roV#0R!D zW)=0!mT@JK;0~G&8ba2XHQ|J$#boC7vEj$kGy@b&(kn@bz4fyF^g9UvdR=3=vkyp) z?M(F~o=0tkwhL(h&P)PKlSTrD4cKvLhWK|lQ8B9Ze$;|v1dOMMf2Eiqt_Fs|SPehP z-B`8~=>(MhXe1~}b9Wb`w(@yT%E`17CFQ?xur1mr6x?nt{tpoof6RFizbX5T9sI&- zzL}%~ghyI_4jNkN`~mOE{zZ#7tnZ%kikj8JD%9=j{`8=cU=3fFIhM_VLaxS+U_Diu6Xd zlI@$;wAofNXe-kd*=LuW=g@A{6ep?q&$OveEA~SWU5_-nXDJ?XzIh07hBgz)-AYlX zP^RXx9eNqW&^fx%AP zWU^YHITiTUysN@6<#QOf;|(RwLsBq@I#R>w-zeJ4I%-fIXdO4pcOZ%N9r5q* z{%2K|DH>O-6+==(Anbo5>I()V!&X8NCFPWR@m}yHcOCgd{~rG@fM?ia!ao%^T>5^8?B)eBcu4wwdML zFB?T!F|MiZaldSj6Q|O~suQ?kWjKCTMf+Jx@B5Og|D{}QgZH@;*s(R%At7t+COMG*0GoR ze2e`Ri6OpLf8nmdzD@qZmj?TG`VW3;uJKLTvQ>chwvs`(Up#={ zmJg`-Xt3|z0lo12M;^%huhRYSNUfoAEYYg2x|6~!3j!47VJ?OkOK%#?IakRl4nYy8 zG4KH^qFl}!NlXDRcwS}`A>)PPpQOY*YuN=TuWH;fCGXi-&|LY%0Gp(iEs^~F})0))wGGlc(xN^SQBnJFF;SB zdL(@~LRv8%@r|h&sOxY+=f60HGY01sDO|;0aTy~f5$E-7k8<_~#o<*!iy5)BW*WWi|V%5al9@U7`4^AxccDLEOa<5MkF;8B&7c+u$t_i=w@(rT4I# zL4ppo{4@Xw+W8aSlk!t&e`rFZ-s99+^e3D$b4`ZanicjKC|IdEv$=yYiD)l+OH4$I z*1Gd$(f!1Pk@BG7R59?Iv}C}K#)cn*77S^iQcf9K3Hk+VNM|=_O|LjUh$mt-9oI20m$Eo}Bano)MXGV# z@zX|6HO^Ks+4%b~JxWB*oKvvJL^X(h?ghE$Y+sBdFngR5^MRsh6zD;0*LpoH&3bL3 zsUsJoWZv^)=$C%Gtrc7lY;a3x#H*og|CUMJV0+jazcu3D;`|uAQs!Yof|O3p<}PxE zBQSJ7bSv2E;1qfaaDc(|fKnTKm<&WC`{CztOI{Ux9`pC{`5rHL90SR1z4w6IW?(et zpZXvSrF$j$r1=#oiQi+U(LDga!bGLzwG9Vk=aFr;I`xQM&T3kX5|i4d}GZ&4D+1w|>6?RYbV^DE??!Z~;l#q<8{7rFDHaDSplqe!>!C8hHJ=9J27 z!N$#DIn89>(TJSPZr(4mi?~W9wVD$cAc$>{uxqv>ZbgqbJa~u{!m&L?nr9Cscfw7l zo!%5Zn%0;eJG4h33pgwZ?N3=!ZQ+b?n4G#&sr@~_D={UL)Gk)?L#N65_hG17^Z;%?H8o%0wMTW zPs_9m*opmJyMSSrjI{wXJ<-is3FI^HHz{tZR1hWl--Md74lry$fnR{Pv^o&;o;nP6 zE(9=1&ys$Z>rwSh)nl#Dm&}4^*=-@%6Wlp*Js~MGlO3q^lMqlug$qF{9jRoe;=33L zzLetTo|=4_-`VM}AtiQ@HT`>K^y*l3OQ~pfJT=Fp)irSL(+BMd-*RYZF@MFa#l8pq zg_jrm-tZSLDfYeZ-|O09-{X1caR14JCiZkbG_iXN3ITkk0J`a>0_anp_rmR_-UPnb z8;a|Ffx^%G`+i#l&h>g<+^A{o{ap}_?rfT$>&Y{+!y3iUl5&BP0Tju)T66nz9f$zg z`Ts=np^`M#53dGJ1yrL%|Ib-}HS1bV)?ckyf0@C^(}zCJe2JM_$9-{tv;bsW5N^7|X`)#Ud# z?nXGLQuksv`d~j4F|2PbLZ$V+Pf;;f}2cU zxxOB1@~X>Ujz^V8Z);CMBzP}IvwowkY5xp^uWn2l2d0584_6vK+FOEa~dop%+ z%J<$=6@X|3zV|rZ(kgLTW+nQ!&v*StyTiAqfegQq^6!QcQw_%A^h|zd#oAE*p5*H+ zhm{!uu^w%l1tQ~M9ynW%X&fPQDnCLP@zTc<=rjdcEy?{JzC*n1!A#J0%`ZRe#CPZg z&8mMQc*)IJ59fC>*4gB+9WYi_%3!S78K}ujb3GeO_9ugO^ZBNM$u6k4tiSI*f8jIz ze6RQmoBI3S@$a>*pYNaKv2EnBtH@*DC@2N+vx18De!klZ3t#K!a|#Oqxw;n^>@Nct zn>O^p?eQW4$zc0NzU8k_t-s~3R@1lqRXXpt{8cXyc`K`4`7M8?!9YkQT`&HYzfw-t zN}BU6fBlxfx;vPD%U@-F^;`b>Eq{fAZS0TnEq^sO4DM9_{+7Rf%U`qVuW4eK%oxc) z!zZQBE_%r?VCmQi7HR!g#z5Sj)X zTq|;pPjEMAfe)fPl?)ugyu2Fw^TD{K?RvmACL;AjD#At*r(q)X7@0_gw~srK3eVYY z&Y#l1JKOvz9SKeQt~r0I7KAlFhz6r?<3yQ0{TtpmNr|1WWu58ec!%c`)|qaaJ-}Ij zH`+hppA-tdJ9lPQ|0He!m}S*K>@JvXdSu{I*>ya7dP-%P)$Gm#MX>+_n6`6wiG)kC zhM{+l-k^v@Ye?g1w%&yRU^`~ahql5dCi9_upiyx?Y7fr`93~{zx`~yBewxx1|_y-hV8JoDTb>tvW4cji7c7XUN>3Q*C0GjP; zHI)JqYFY*F^DtHnk9a21{L+Gp!$G`QF$)C_C9o z;2T)M@T{z0c;BU};*@^?4=F~z!|5L|T-Gn#DF#B+KhkmzaIiV$)_2j2r2khWzFyWZ zoU#_Qg+gR3U`XY8Dsr&n;=Y$pn7Pn|nn7R}6^7cspWrWHEl8xd6-4;2Vdnrsnl) zp9}hO$CK$<#}n=+kU5@2&&5~*bSvX@nllExJ>2z^YV9N(F5zF}PEYB<J5tMeCBOh!g`f2j`c zHUkm=ridT@vLG>`E$4orN^q_0(-Vh*bhs{MMAS&0C;2cktu%z<=b8p71WW_y^v@veC{q>>>6?yt(}X?TeK@){YxXKwC#W~GX3@h@D`SyTH`cGT z$2prA>(I6TOrb?pEi8$|ObD8-&D}0VFOhWeIX-ZG{3+;@9XVuh+hDpo%5@??M3 zvpKoK!%P(S532O}=3tuV5`V>mrM^e}h0m43i=yzRQs0ui(|=p)`!Wwad1*eT_J31| zTU%ivfEx?pf$=Xoxc{dYyd$6K4N2}LE)r|+Gwjh)-%Ukl;eLJJLAbxuzX10~i;Ho8 z+bYC;i&b$)sc(5nZ$5Kv?b<+Ikp~b%N<@Y~wktbi^|o*wEWBacUrr+*an#W1 zw6~^xYkz~yVO*|1h8^FTTpio=F2qo{KcsnMOoNCGJ_SLyjUtB{U0P)JU1Sh`b;Zw= zKLfnz%Q&H5!~C+5A{IGMupHqW?8P7TTObPxJTD7{UM! zzpx~Fpc-{9dy-Jhd=7UJt4Na0y4>6_DIcGLm8*#}F?^2!D}SAp!a~cHq4=ZjvdBlR zWk;jB7)%i)f_?7cryhy#42^g)f)xcDcBpjpddcCdlHvvyZHk~nDJS?`a{DnFsFb*o zZ9n-Yd^Y8c#dvpF=J8;evJcr6k>DFv>_Z?IYcoS5p29wM?uKU#0Tf6!S>I-F0Aqb0 za+Nzu{t2l-r1Q!*@R_>|Um#x{GMfIE*uUOd%!PB27MwB=-zeUv$@QU=AcrUGxh`8h zu|^D8y4$S1ieywhO@GhT0Hc26upXk0>mk-MH+O%v8^Txw0H<57<_kVMw@)PaZ)@pq zNCEKg80^wliZ8^tlHP8D90+=&qh$-6m;nhsZ#B;qE|<1QntZa%r38eYX2{_qd5%ic zn)!wh4u1lXTXu4t!9^H~P(o)Bev|T!`(4X5htvB))&vaoh-W{HbTx}U7M&$qSB+M6 zp_?{;jvms@njQ;>o4ioV*m8F}!efv^-2=63K-rFvXKP3NZ-#>#xfkKP<<6l9kgfjT zutzva3rA$=9Sv8K8aWO*t0{eQIfvbHyomR;;oyd(c#mUoFff9QKc?(eYl!!DIQZFY zkoLRSXdgIFtC()$r`Qtky~avsJJ6uU6_0$+9pYjy;Bz+lK9cxORt$BG@rOjE zbkE_^VqN<}@xqx$@<#uW<)dkiB+6O!LKW;xJH%bk`Vc zQHt}nw5+&5?tm_0?+^cKHQWk^{RIm2zS2c7#!s)boxUOr0-d)aZin<0X8<5B_92(p zN|#x-6*cMRn6q_PU**7GsL%i<4Eb*(j}`ike<3EQ7XT1fIq=ZgyE$v|s^taOZ`)e( zXTX$?xUs%g_TtW@MI14L)&X+6?`oyi*M_m^Z}B_m2%nBE&$F60vP+~kD&mfkXy}7> zV(%(x=<4=5cR!v_{|ev-6gwFCj<~j8mDy4C(BF0IFAHHeU3HJ?|BFq8LJAx8k8=5=Q`&0k)uC zX$-I&WfZ+|3s4@4KY{)*Z-}#oZL?Rc=!L>m?gT(TIV(mvtta9``=xac zlq0Tl4T#U!@98nXlB*=Ko1}9BzMD0B6ams|_5}i9;jOC?+ihc%>No~2>`1C@On|@6 z`C=*IE?8*MM-WAfL}WM}xi|{Lq21sm5<~}_>7V?bzQ@(INZZ{9>PkGR+Wr>B5HfP* zI|Z#ld0fpi<;0)M?~u##Sfh@^yJ4UwuJ#YW`GlwDZ`&PvLIrTYJrCxWb@>=jR&f#b zyKp_+-SDN^zOA?bkDIvf_^sBF2zPPGZn!^C!uW5M6yxLL0}63}W`oJ8QaZ13 zpOkJ#h*CGzY*Jd(cG$gL;iLV2trtst4JL+-%hh+i^Gg>a1eM2g)mwdYm&1`h-0VCA-Mp|98uuomQNQtL($+aJ$Gf_r&%E=_W>f87OSrA z`}AYbs6198Pq2KSyX$p2eX>KQPj;9(_X|kUv)*DIK-BM(>nj&uAR{4U@JP$g zFn?n1el<0z-|G33;VC^I_)G2ol+yFh0HZ>l-u<84eGgLmUDcDHx$`F2{|PgdM1F(p zpn`c3YY9(Zi}2wU;Rf9L2_rzcYkg`t4o1(XlG;@r<_15dqM-JFs-iqOF^mm+WtyR> z6eA5AzD(`^bOXp+-m$0_6DXfF?(OiTIN_U6fYatrwpg({@hzu*m5qf?M1-Ep2F4NJF|MBLQq%Ti-zUl>EI#)5!2xRbOQ%n5VD%deM(G<^ z4N|k=^}u5%`mnbirClY_p44L(nt>Yfr0kPQr+_|sB4Ij}(Dp=nK2fB+4h#^7A^-=3 ziJS=w?wmKE{TD7jbN8uwoBL1~WbRXSK=ysAB53g*%=4+d=E*$YG@1>Z5~%^i&nOj| zOz|^0m3IQZ(||uMHI+E4+qORym+4U~Si=t~m|M;D`*VRWux!2XbL%G-0 zZ9{z@`}bNs)b~VQAKc%@UROi0&Z`j5kL6dqG}L!1)vS99F!%R&?sfGKP6a;FdkDTS z2~6R=Pbu!Jix}hMBJ6dwvmdy|I%-iLmJ|SZ*MLE|-!_l|?i^V0)KK4x1AF1QX$XSc zGGsqIQbFQ|S7}O)3mQqP_&fp{VF{3`X4$rA+=T*+bcu(mQ=LpA5=@VCJec}PgOqeHc z$Nbs?@BG@infuMhDZ%0b-F6$4+BKTL+AAswJr61?^)BFR+5vurmi%Xv<1$#I*f=~_p=l`T$ zFiW(`uImN02rqiUbTMY+-kULu@1jxtuj>VAd*HSYre5$j*#q~6!PE=>Ihc9@?$8Tf z8%(_b&(I5=8JtTmz<1~cy!R=^{e~imLA~H3>IGL@1%Nh}48r}H5`KHBq@r!GZ}EU$ zc>ZD#f~+Xr506?U;D9ERMHAqR7vGV&s|e0b-__ez8xD7MJUkVr4%cI(gt_2j9oHQv z^mNLpT5}3mLm-;sEJovU=Ti*l!So|Fphsd~eb|`cgU*RnY+g&hIq*_C?uLUOT1#j* zw(r+xu3~%MGF~caka3ns(73~a%w}Vh19R84X zf8B15+&KJ-c!(a5!oeFrZ{0(+f*~F(dj)EV{VM&R;wV)5a&0NkT36fuJWrMd$;i>N zV9!UllpblTqqiuXf|gu2tmsiRT9i2DQq350a$EK?Zh|hR)L!_abD?O!2`iaZmaX~& z4)@ho_=DN9Bs(?GoYe(MBV$#Ba~g7&&6+W}!u42-+XNXTm%B-qEyt?^%&Leg&u+xn z(V1bgonRKAzr(foN;@_M7}qqwL(Djn2NdDpNF3^^*D00a z)zVcIXBp$ABiZLc3A_-+_SJog1#obvIRb44hnn`KL~My*!@&qFr@Kue`_@yQ&SKII z){oE=Vb*5nAm+sbtj-18ISx?_Ux@3GgQ7EktDL_sCycSVoWl^_>?d^RPtEt3{l$5W zGM8~IR>0Z8Ty+sz@j01k^hkGHH}Z4#VdZpu9NxuqLh9rYP-m8|TRF0KZbq`M#{(w` zRglR@UJ&9M=GL|k*AKn;(Ee_Q&C11}cKQP!JGpodpRc;;wC3eIG&#^9ESVFy$0dFq8H@(M|+)!$MwBSaKAMG3*4)H80Y4G z_@<}(b!K>%;wXC7`}rpw=mn0d3jdmbUF5Nee7eg!Sl9Rlx|PSc*O=W@1FCN3Q+!AB z)7Hh;;E|if!H&I?+XV+whE$vn=ei`wXyutCJCnqo7~9}3MT4Tk>FD*g|EW(``J?E( zVBqy77_{C%Pu;cN?ab-ZY_6J#&TS0ktxUCPP5G&Hr__<7i?t|#BIe+5H?j0x;c#3> zm^RHHkjgqikdmwm#JCCFDpMG-Vk;4~3*%eH05_lo%+e2O0c?TWN>{}vosqU5WjE=NVpODWtvGA5c zU*mU|7y9n?gR9+`*9SX%=A$$GCBNc#g(5fh&Ay{&*ZKzQ)0O@~!;0NBzYHB@2_M}K z!ZEKW9Yo|ow}W85xdGkKF7IX!S;|s?4VpcK%lJ|~1cR|lU&--2I}QJymFT>mMCWJg zBmV9fSF+>|Vda zW9KU(qVr)k)$5i*@dGNw$^Q=$*L4b~KX}vjB5SE^tqmnChbwsEfXavI2dVfOgv}Nl z1Q(xxgV7p_=+->}(w$x8yv-uQUYnweF0D5a>#ke8Ws^Z7*?L3QmVmUQ0Nu^Cw8DlR1|H@I$LipEYv~k_uiY}fNIO-} zD{5by?0;Ds#W@lk~U|BUv&~rlH9ZFj_OLc5Z^gyh2 zIRo`jOpSUXkSp9;;c_Sg6_U5DrAP{cCaJvR={x2*$pE zQ;4QT|E4cbrZ@`c{mv%~GFA9(!nx{MJIH|!2Z9dx+@mQz=V@v>)mZnWuUxRCxt7YDLvt=;l7pnNAz zN&g6`*0T(Ca^w+Wp-4;qLBfk~wf7b6yO7HFSnA}I-lX4dct?i8Ro2pBtbI$pm0Dcl zT#nKxy%uU^xaHi<4iDoIqE6DZ6{}6*MU%G;@^-42qUfWD$mCPntEKgSrN6Q}IGa>> z$>_yY_?@-UwD9ZZ@qFrX8HH^eiH(y&H#^@`Lo(d)-65G{^9Vg8gO|F;*64-P-qBZo zPaCo^Bv0N=4avXp@9y*6?XTF@$M+u&#H;fP7Zzbx{wZ7f_#VnX1kdyy@GUIZ6OY#- zfbTBu%l~Gxiy4t5Id~0YM>Hq#;9#dv1Z%UHA+2Yw(mWpkt?dkW|5v zjq^H>vYXBi_@ZMLE-3L?&9ZRB)xD!wQeKT?9-$)JP?fRp+|YR`n?s_naR;f@iVhQF zsI*6)w%eox@LUS;L7&pse!m;;;c5cmdR!*QU2=5Ybn#>@v+m%XYVIKo^p2 z8(e#w;5Pz3N!_=K>1JJV5gPy=-MPF6u1L0R?9EWcV;FFJp=)cyj0Xj;=1Vd73Gbv3 zI6@17`(Om5;85nGug%>qB(*n#sPQ-#V;0tJOasEV%05qeCjx8PddA1zR(7Hh6G~Fa zKxo9a2-Xd6_=5aP?^AHXTCmK_1FS>AXRslIdup~H^}qrK&w1U{XRz%Q_9+-H`xLN0 zyS^6Z2Gl+b*IJ_tdX~xE6E};N&zFueGXFOiQ?JD2>NLe zu-CN4JYpibN7Le=7{R#R!S47?$rs&}cpWP4U7$7YaMcxB;~oc{(^^QV!mDr$RJ4{| z!*&n;pwT~U%r#Ys((r2_RV$xXb6il2V?su?K8&WIW#9++(UyUKA)7A9nwe(LQAk(L z@F>AU#2UZF>D_Tow<7l*<@695MJqwKA(3qTziZn598|WOBynuZ1^)w0U_8Xq?GQ`X zVO%h$KWZUPrA>PL1p%@a@S8mXP?%Y=(PMNs;%ewB=UhyKbhFCNaX`3e5cQm9=|F?1 z#CPf2{Uo3}uyF!C;LxL-`;oZ%mtfJ@OyEgt@fV=M+)7vq<0k>3o^{!0VgSiHHGLF5 z=&3eW3tbnEH&XMe**TVO2v|8@ANM(R=$ACPqfcbnFO3^dbheIy8>Oi|)AX(rPJ$hQ ziWleFI)8rA_Pi(Buee>flv>Pk!Sx2PYo$fU7$3B5UM#H4mAktU@oN;FrLS25LNA>qurobc2xxWNV^&F%C@d zDN7#qI!o>}u*rD`u0@`DT$@SJl>lX>=)Tgp%EepkDnijRaTIDf38T{I7?nR(v9O>`+H55P9rS%E{L`o@HSVc^pGUMXfvoSTP!alI9nhM_xgWW|1C1fV3h#Yf!Os z7Hg_q4W^?u?l}7+h=+QdeFR&R06j9!YGZk|EY3_uT*M^Pw^ukhtr*ezv?6RldZ{u- z7o>gUrkSd)zec+1anIBv_d{|07(PZXQQr^1qm26050dza9+ZZg5v*2vId=m{C2<}y zcGE2YkUClVCJ*L9rCiV17b>NvlNkmEgtz@=*a*TdxNjJy00OvQk%#xIxm)313kvc6 zU;$>knhW{ZQdqHhnD4Ga25#!bz;E{|Trte|8+c9(^R4Jpv1XX>_M%cew-r@fIn1}E zs283SeHr(Pz7^|-`QGgt0I~H$;%)to#J4~8FT?$X{)2GeP;C7fJ3&~-;QqUkikFA^ zZXQsA6dxUMnIE6qDRJL3s08pA1|5tr*Ov|h_&=qL`%x)B4n7j#D~Allea(TOM9Ae2=G5a5X$Z_754VwVn?W9$+HQ6RxD0_=^osOkuutsY~GHuVG%*? zjLQ*}{+On2=iTGcwIg7j3#lpHE@?+N1Icx2N2sP9fm>kU*!SoRCKBeh*dw+>&Bfu_ z%07inq8W<296V{qKa?qsts!gl2HBYUcNlu1wqrY_7%Kqvndeup$L@Rhfc+Ip$7BD* zQtY3|=wE`Lcy(Y z*b-JH__vzBix=lY++4e274RUH@6x=uGY1@`3p73(ZQ2zYKZ@ZDTUmA*Pe2Dw(s**h zv=RL-x4^|?XRAYrlQ5Bi%`-!ZV*}9mKnagww+x#3tLord#y&2Sua~17p~U#IP~vn< z2tKbiVhz4Bry-0zC5-(+5eR$qt#h}Bg7YzU7vBO4SAHno3shtWUuk?Ll9-2mI6j#( z*p9a^$9yYW)FrRrN3-8&0_Y^L&LN@r7E&wrq``p)Dh0lak>x|MZB1%c^P7|tpipA3 z%WTWNe+dkALC(uGvRsOELx~@{6d=_=9jvA!IDn^WhpL4VsG#d--1zVIf2p!$Dz{eb z9E@8%D$6!QyNn=_Y{O^Q%rJBd_-d-)Ilag)mL_X8AV9XZ_@)^Y=|eXJd`qxUwb&h7AAg6o?5^P7h#^cc^Te_i0HW|(7d66;{T?hnuG`HPB zXjwHkKR)Er+)P8!Xs~Z;tLWF6eF+O#dZejR=@8}Zbs4R5FQirqdBkJ~0RwPK)?X4g(9aFWOHhoSFDJGeHwyUeF2FbWRYx(nMUVobzhHGFA&Cxjss zej#}IBsyHlA#fav=W&c}S_^_*g>PFLols&XmMek;-T~=FFtmn)YpteRNQd-*564$0 z=QPXP`_T`Wv4ib%;kknZA;@i!&a^W2XycnWKqRwEJ7Gc(9gddH zu=mlyB*HEAx$Z;P&GOVur2KIFDJh!s077aD;19qwvyyF3EP!`|);yhSD?nL0*MHb) z^gacK&8h%(?&cWiv7G%87)hzu@N`B_X~X_91Q1MMG&5w_$BAuFT#XZhId0TTP9OFx z66XG&bUZfo<@e4kW2U9h82!a}o}<553NcYv3lwJGkF?*%8CJpuG@l3K|3EdeV*EOM z$cFJ#DJQU+UwqhcHDAK_lo5xUG7N9bE1K? ziD*G#nS!*=_Hn%%&69I{wqkFfTlQ>><_0msv$FFfCY)QiP4T4TP#aGpHUpHk5vSur zmPT}q(MfCKTT(DRgYWDIybCY60uLP-0;w60Vb{0=#cz>}*^_8nPwPpqa?NkBZSJ`# zvfvRTUb5gBDI|-1@tbL7Za-96pjJW_FtghT{H100LlloAW8-o?Dz3DaUX4O}taIFN zPm`AOB)%stVo(a$DCPp9YYaM+iLhkMr#$7Mk8@gi<`B*42DJvHX4awE8z&$(({g~F zUMQxj`dN~dKrg}IlPoW`e>2NUcR){upRjslF-|+4RB~MR<^o&6RirW1mpICoY1_-R z$+=;=V&}^h#)M~2A9}j>B)UFt2#zk9ivJ5M)>Qib;V-D}CGgRosWK#ie+@wz%T?eSB++d*S(wVy5;^aYgGszQ0(7 z2!D4;G44A`z)e~Q9El(+1`fr2!@xnfZyz)bAAdQd9{1mu9rNZszAa@HU!owpS$JNt zdkHdGy?erspqC6s3eOEM!Po7>zlX1_dkh2klRcQuFZaa9XZJi3;M?{p#Qnc=zpfl$ zI$Z4`6Df%c8|?V0wit&NUU)LK?*>qSFIw~vUBDD?(rdMGi#lcSfduE!Qxk*7ED#wUGH;}v7X!G zu&35@mqRe6H3;I||Mq(B#o(W^p8It?WS8szfU&d-t9Y!~Tn@Ujp8F6W*iNqJ=An&H z4%63jj|VU--x-My+8(9(Pl$8)$@Sb^53BuVd$yjNE1zM#frTt|IDA&Hyc)F^0)Vz9 z786n(RwBBDN7J4nK`7K^R0N8&Rvq1+Mwu$ZFK9nhAmv$EcUs-)aKn!YiBNkg%Z}wy zs8mn1r}l-=Q&M6qx&-FTP5)~Qi$@c)%SWmuarL44u7AEV-cOeDpizF#EGGt#*4hIT_A$QSr zeY~%Pmx@mTGu0J$CX#0-3S`mKvO!2c8{I@lbfsrD4@BXGMuf&C!!8lZ!_+KQaQf!8 zG+>0JTG`T2tj0?WV6w)jnBAZ(+1RnifnDilZa92IbeSTzanfZO=KyMf&?l^Wh9s99 zt;6vDgp7$?cJzjGE@Tza=M_rR*43{>(YU0(S^}y5m1SN1#Rz9NpBDbl>*~1#KIgi63?;ga^PNi|j7?px*U3+(bcJ>D_Zr=y8ZdNBhhkfD zU8Qp?a!C0PCI!ZsQfZi3IULC%xMFK5*PXBv>>=pN(sRgj%A`$AI`B3u_X9wyN?@#t zE0#6(EGU{C!dM(;y9EIh z>&Uo23f7Uii1Mr?D<{@k#utzJRE;?Eik)lOOCG9~Hs(GV*WxLKuQVC@Z?x+rbwa#! zhzX|*DJSccZ9jm+QR!q=;KIWFAe8L8o{~QIIw(hRoVU@Uu8h1U6@*7U3MyUs*OXgR z@~kP;V8%tuus?G*0(icJ8v)?{biVbk65l8J=&d^n3IS*?oZedE+gUgg&nvhT;?dqG z;_>D_g$Vc8K8M{^;#*W?&9GFRrlGIpXA z9d?WDe_C3GqkoFki#)~AzdX5fj%OO2=k9q0rwdR(cSjwyDn-dowHUvZoJT#_-8;k` zUz*ms`}Q2fzNq%?VVL%%@;%fxR_H7%?!VXhlw-75PdB#XID=ZF5xO-08H%6hbB18l z`Ud4cIsI3spOSB|U(QJ+N)g9P`IKaPH-Q*4+1@m=yVQO;9{J`deC?8a1IHy0hRgS` zUyh$*v=E30IP^!-^yP56!Ib|Nps6GjkEPL}vT!ly7JN74zq|3;(R|KTseBA}dm3XU zx1-_SE~uYN%COZM`}feKL}P6^g^dFxExfO?TaL#5JrMuk;=mPy0heV(!&=tpBS=3Q zn-qNpm&hyd2Bc%#@TRx@_96`aK~{ylcn>sa4d2me#NNb8&S1D7?Y*s*58x!~ZE zCk;K==Q|;Pb${O}MYr|GDMN+0-P0we&PDH3r0{i2>r4RV>$3;KIBN=eXUTBZBiv?Nu0|7M-Sclj?pTA9h z_?Y|4YJN7ZV-B8m=JZ2lD+hPLG`@B8DDg&(s%wnSY?yh@jOdivp<|9e{rh9wWtO83 z9?P|rwpv;_7N15PdVCbGlV_h*KV|w9hClv$r;o*zJ(uk1*NmBY-WfAT&z%32Gm!L? z$>k_S_M!QnbKXP+}G z>Wj>rF>}tW$!AW1weZZDvnNN-nLEXI{P`fh>0cA(#*Z0uSb5ciGa6?^8_P$H8u`7E z)dzmRQC`0{LIIE!1_vK4?}hjuf6N4`rmciQzLX2rY`OeD|B=r>zr;VRU+=(j@DRos zuD)U8eYpsu?UonQ_{Wh&vVjXqKZM<%l4Bos{F~zCTYs*Y%aQS)<}!r{kW( zcE~#xWwQI8vJNfble)gE!abzJrPcMv$s&#G>$drD5F0P(auOf@S&eS7-qIJ{9INxHNX0XC3n#U%b39e{2zQ zML9gV0*fv^_fwr}ZZhBHg=WT+0IybIXtb4lCl!}0V_jQV*GmhK_7c{$saM|JtBb4Z z*AItITiDZI3xC4X67T~TpWol$)o1tBe5sq&yzNAgIu6KSD7+5Y4E z&P_g}7H1*+dKH%o%XHlAZ6SE6FK%eaij?}k`8WBqeyQtA{MSh0KHpITR6g0-yq;~Y z@V~;Je@a1)1d(1j{x4N&&cd@i7O(J|_-DRcYQ<|G;7T5Wo6GXXXQ4HfZ>v9lX<^6t z7O27S9Hi^!+nSayX}n5>IRd{DM(R5*nXjFsafR1O`LAWi-*~~_e3jn+!2hcY^{59b z@?Xl&T90~7zyDHc9-XX5CjPdnFxNo7>{7nV{rST>$+sS9@tTN#7k|ss@W*zWrow!k z`99Evd^dgr`5uBcts_@AEv*%)R$_-|f8T zJ?lMp=89A?rXhP9`vjh*+^S*CF%&m*iD$XuIZC&))V^Pt8uI$r{CNM`nACj+ib!BW zmzp=A#6ZY)9=CQVJ^ge)PI}On)Q>mzoi=Dr>I}*6`E;7h`(&;hlz8b%`gBfXU*%Pn zKU>}JR(`P|p9Wv-+v~fK&vE~ly6@=mkLU-DdhUAtZ~h=^$8-Gad3^jckOWg&Mjx4{ z0J7+ z7KblFXRV@n(b6Ww#}Q(zoIj{Gu+3j*fza8ittq1_k}$7F;g8 znKuK@Q6?m=15U05&$HlDEI3D2atb(8lR-iP&NK@ivf#&BaIP)MDc}?)gM7_z`Tn^T> zfYX>n&p<$oFp_TtoJ*5H9+RemoJ9GTCDAhwa4xstS0v%@3;A(5iSk>L=ott&S6T31 zCgJ?Q(Wy>c4$s|m3OK*grwPY^b9KTsU(6smDNbLCBAF)Z6FLT*YvD?sE)aU-@)P6p zx+HoA0?rK<{I^N?okD(GPNMu9ljs=;I5%7HTaxg93i)w4iSlnvqGurB{N94!Zo%)g z;CET@yDj*=Nq8C!08^c~92}_xocogK83;HJSn!oec%G0Smy;;}4@vY41e}L0_#+nl zPZs>o7W{Dw{Ee2iSpNYba)bQ z*5aji9&pxs=lWzMwcn{uT+T9mgN^}b16;*V1I{z?3pfin&%u>Eoh{_Y<)CK+&htt1 z3_Oik8XBk*yWU9A1`#VUcvYmc@wom@5|^?Q## zL!Hebd}L}e{X+te_v*71eJZ(lWa{Cb94(*Mmqw)0kU*sjb-dp~9~j7Tj?(0w{U-}N z&%^b|qnhv$soOj}SDjr^Khd-mvY6!nI^*s;QHE@-{-|=uAhrvPq{@IQ2 zk*P%<{jKV3f5Jzkc6hj}&L&&r9Bq+vg23bRW!>|Y2|PY8)+5vv7W`wv{mOSx&>!F5 zf*)zY=UDI?EciWyk4!D|{KL;(Iq^m{KYVvGeq?HeB%<#})!CT>uk>(!KFaBK!u|5Q z+JbMe;4cwABsD&N;ci&m_LfuKsd{551n(KkPH;q)&d=WcmH-#nk>w98P| z`+&TlZ;j^@J~H(W9?s7$IGrx=N8|;4^YaN#br$?mAwNE9PaTJHjZuk~<#Zouhgf$P@Jad=&y(|+W?A*nCQ3;NdM z=O-iA z!?nywd-%&go$wKl-5%?D#u6f@T_?I3|;Uv;`0{_axwcepW^Vd7kf*)_eYb^K`7Tm!No@2{uYn_r) z#NNzsc6M=jWGZbL3|H1icrz>kHFc5lxp{SUrROqmXmO;jvU;A_4LeEihRv(0swpdt z)YS1_*n)*c%$T^%bH??f zvuXeC!kHz-<4cNWW|fSstgkB_o3(@N2_}$Fr^S6*P&7T+Ia*y0NE1XS`gmOSjPeCF z3(KcgE-s&2R2eCo&&6C{urQIQw*@*rZ|>ZJ8Pmy83rJ9PeWbRorgm(W>8XU`&OVfw zPO7VnP^1)}TOTQ3KoY>~i54ZYP9WA$q_nEC%-8%x;>kqZO@0#@*s$WV(yG!ktIB&I zKS#Q>r&$SSPpmJgS6jrn8r2u*vNg);P$^hfAU0)c>4M6tN@6hzEHML~q;k-U zJdX=ec@@+C_A;vX1v9AF;#d(uIc<zErV7wz=SwSRw{Iv3F+R0xgd)ZKg zJBzF-^GoYy)|FOLW6sxp-7X55*yGL`xm1rhWg>M^W$bqmJ<`NUh2{12rSm9Qbb;t7 z%^p`!UEfewKC8O&oCdi6L%da!KaTX}pES0vykcxg$-KpjOKRya&T6WuZ-|^*vXFb} znJ4;3vk}-H zY584waJvL{<-+Z61-ka*cFVOpbGt=$>Cx?%3U2j^Mbuy~x;&UOrE0FOs9ruN&k7xX z=2A-^@>pK=BCpj` zeNuv_B*ui?KEX$G-?~GdGJ50c5Z2e2HR)q?0Dfc zaY|KrX5!Y zqMIkP_hyzajuccn3(6Oi)t<`-p73ffCDu>tbXb#5;E{9oguI31==gLnp>z^S4-M5P z&NUN<-L!Go69qsFhaKZ zlcto4-Y;&0o=%L@(+Qr7YA_o?!`kgy380p-ruWp}x%!8}HfFqH;;qEAg|v@6d{?$c4U;HdP( z88#%Zk9d@EXJ)HK6d{VM-83~1HEMYoPuItX>T7y1gYV%eZ^uMh?CkL}L$Z-GixX=X z5A3tExH>K_J+pFQ_BcAPuPiC!v2aP`+}iSz%Ib<59!siv86P?eP>TB@=E|Vs2NRc= zx9mxjPoIog@(_=o-mOX~Mal_YReJXj(!^Z6lz)ee{f*KD13pq#SkR=eWP45B*@0NNSr!68%&Q{dfyL(}JTt zyi1`s_8|R_Vb6+Q+Jp2zls)MG`@kOk9GJ@y{V<8HIWc}eeY8KdJ!ZKtWMWEYxnC*a zB)kG}-X)^rMDK%OIf&CXK#^E4+E0&>Jsj=V`}j=z!$6O5d$z(&y*B&x&KWbm4}%y&)XFWQfB{y5#!aXwkmoA&E{ zE-Z)Zl+M>2pvQd8v*7iBW4`o`J5&Bmiry?Qj8C-xc#HhAKn~h}KG3867h7;`r|BQA z3!F^*ACYiUJAAkWKSbfCd>81^{*!a-3-sqd zCApwSe{QnidMBGHe~Q`{$@ZXp{+Db{jH5sKcQZLL&bDd$_Xm76;QZbwC)S%mA5Gtn z&N;ChESEt7l{l8maKMp118}525OAa)2RPCn0XWj<1CI2^0gm)10*>@^07rTq=cXU( zfF9+n0e@n<^rpgD4wj?-%`x^r#>v+p2k}n8Q9l1g04Gy^Cg8uL`?`E5E1VA~XBN<- zo#jA}_S9PN#ek!H@#7MtlW!w_m!dcA*S}-Nw^8pZkdOFtfTR2^7WrQSj{f2Q1>j`b zvoGLCf4J%hSsdy;UE!vjvj9gq*IMNK5$Lg8)&M>F;ROr+Pr%X6m<3Nw6K+WI!w`jY zeo^n<7JL-os5j3d|2V+WKW71sepm!J(tn_Evs}_t$8VO)-U>JKHQIt_0gm~aV!`Jq z+|*kO^yts?EqEi~sP|e6{zrwIde;Cw>V3h2{}XW38?)g3clM8;y%cWxd4CIj2;ivq zT#Ni>z%d@~0vzM#VZf38CBTt>6W~a{4REASR|_2Mf21D`IMPp6xapsxE%jJ>Be#t+UmHj)?-(jKu1K>#i0^lhB4ZxB9Yrv7d zj~ZCB-;h27aHJmtIMPo79LN7t6wdx1MISv5Jl??7rE{u*XAlpkc?Pb>>-7enFUg$? z4P1}En+<%9qF<(tW<1}la5JtR0D6pPJzqBCZ8gwiT#ky)F3u zfNubLT;D*wM*uzQoo>Nr0p3dI+Mc<9qns+hQEx8b7!Noveu`+cd|ZEf7Vxm8eDykp zS%3BKikWzwMGnRx+PMYd0r4SFzR!W3cdL0H-^Msx2lGLUEB<{RPNtokEO-oXl>Y!% zASDO!7ZuJ2)cbFs$NKe&1^)_gl>by;p;p8#`sZA=Fl72czb9?lvl8ghoxZ6CZg_+@}&zV5Tg{~O?#uYUuMe*O}0q#vxt|7JYw z131!8Qn=}dnLv+v%YYvJaFzvM2srxTDhqy}!cF@h2YS@|qy>KgaMb&u1@EKA?WW#c zVLXp|_p#tV2ORZIwa7mSa4eVAfMYzj1O6P;>lDlQd9($;%z|G7INI|N;1~~20FLyp z1CI0`0*>?nHSRV2pAIBlfgiSbqR(fAPzQeqtSx&lq6F9ICppAI<6DF+&Ihd5zX5u*^G*wH8?UCT@uaDD42&~T?~y={dh;!K5#Z>zxqy$L zyy^0-Rybz^>(MH}(H{NZAxw|)Twocm&b5qJ8-O13b%6zs0*?8zjki~TUbJ(yMb2A5 zkNN!==+VyqT5v~=tIhHq3FB>)p947B*=&(>JJ6$?hk+jLeB6Ss2ORy`VUgcAjS8HS zS?(hMM|;Ksj``C6|G{#weTV`**3(g{12Fx0jKWzC>YV}f=!cUncsbzchbD{sUjmN# z+GLUQJ`Kzxao%+z|qbV07rW+x8Tw5+$Bqi{2> zE&+P9r^SNb065z7kVXD~EqDqWLWvI;ha&+;za0WN(l1iD*`8bt^eE?kpvU|^Y{6Rr z$NcVM=}-3o9PL!yi^%T=%Cn9)HEd79>F2LRV)aNr5^x-69tijvam$N5u7h zA=di}$T`Ro=dLB5X9GR@p~Qlp4LJJYLW}$>0LSvW6Xc8l`*S!$l(<}S=%fAfJm9GJ zKMLmq)|YR99`mLDNYpI%fhzvZIN2BK1Fdj#Nv3|zOHdm8vi;^Fjj16S&taR!d2X|v?e=J(M?4E~lz$}P=r`Ton*PW4k5CTReNJY5oF?I<^{bOCcnRPb zhl>@?_F%is=bRYFcKa=XN_()~Zc{kZWBdHQ1s~5DqGaYv|GqEdSiepHdc;o#9P?GD za5G=`0sartq2uH~AP3vwwa`AJ{CA-}$NKdd(4(Cl7Q7D|NQu>>{9y{`1Io_?9OG)4 zMb2$Nk8&OYdbIN~3;q<~XyXyCfNZZ>e;USDV6N0V+&D%^hR z7o?&-$l+LHgmRenI+SNBV_)s9)GGFz(kc zFz(kcFz(kcFz(kcF#c1&kT|YBiG0F|`)eGZ{M0YVILG_v;rJ_v;rJ_v;rJ_v;rJ*ZqQi-qnY&-_b|ccm2GJ@eP36_P6X$G@ML& z{Tz&OT<1ALP)mB$n-4hB9|!mqz}A>-_xx$edU{t}m4Wj_d!^IYX4p{LWW6%fYzC_kyt>yb$Cd-V8YU z;UdkIL7A%3ODV) z0qD{G6+n;nKWM>mKMC4z+fROB8aalNY0r%cH}lK?+o_miOBh-JUWGKHIQa)kxI0dSQ6phf;)0Y^KZ0UYzS&4LfuS^C+` z?{0vvBNE;IMa8t%S+4W{9-?Kw4!Ic zg+AKO2;dkemjI6S=voVYGvFv^wZhpCuhU2C{TOhJt5?}TO4`l|^3wSjaO`)!R=DZ^ zYW4hraqQn);kgFdsoy7JdbH;wphrJ^VZl2ANBR4*U`lK*;$r|u`A1st0>DwuY=!e7 zA-@)S{@-d&Y!B*v%YuIZIO^?GI3G~&yO#cUtHPNc{X7WzHMD0>3qBHXv`0VJHs#Cz zO-`iwLioW7QRaG(X>18~e&p~6l1rvQ$2UIsY&`E|gtyauZN z%Z$(cE&bYLpvUscx8PyGF<%uR{~3x2-9Fg*_q%}}^ZOj&m@nJ@%!@7k*RK?A)(h-U zF~4^JJ?85ZkdO9UrTQH%N5u92j+*7$N9`wM9P>L8_8FqyBY_^v{WzdU`%kgpX9AA$ zFSN+N0&uib|Iex!S9__B*39og3OD^f&VnBWINHho6V1t#|4$3f|NE@z6YK{Z{W)+K zfBK^UUq>W5o=;Uc=c@?tc?LdOigoG@{4j-IXyAHW(rn;*UVWW`Pg8P!Z{RAMdble5 zhJMiFGWO>N`sjS=ahZvaQhFH2@sA#tF}@1qOtR4D1CI9C))P**(3b;__8g&bGd_<6 zJfXf=@G}9&IQ*gBm-$l3XTM=PssDG^#1B&I3}!t#!h+`mj`r){C1CmgppP#12Q2jZ zciWgA+qW4EP%`~|j>7qX_3L7wNB>`G!LJ1z?Qgf>w*9nw!?*?YW?FFE*MWNR{hAS! zH|@9kl^iw;^ZOUTG0w+W#v5T6pP-!6fgbJG`}fRv(EInya%r^4Uk*6h`6cK@KMaNO z2HH7F;if$YTX6lJi)rU{i~QMuqn+n~e6;gQphr7z0($hPevihqee(3FcF()edX1y*09P|5Uum|;S1bWO@4Cpam?G}71 z;3z*0#%U;jH^9-(F@Pg|g$1t%9OWzr9Oc{uIMUw*_&R7m|EO>-NB#{KJuX>g;G^gs zr)LdZg@^N+flrd;&c6*@x7(i@_*6yzoq_Y%j+547))#Fr;~VIs<^ME}lFud2Wam*b z+r9sr#!;_P{&czjpE8bmi366BSuP(doDW#9ao;SqSA8twsC2-wy~1%9j-#f+cnRxK zZ}&TmvW#1%DBR3fG0fMdQETjVbT9NWX2Epi?Qdi4J@K#z95Y{54Hj&^=) zk>4N2GiawCkC|~&4)kbe1B{o@PJ9l9xL(&XzJx|keF1L;Ir{^S>wZeDuzwZM>vd4R zkMw)cH7C=49+Pk~=?{=_lKgDIQ9iC`K1(#(pWL=^V)<{;N8=wcNXd+=Z4wrELj0&W zXL`hk0gmyb{};oQzX0kBmhS~12jw?f@T&kvy?26qtf%^SCQW<#F+hp^gZAtSIL3*7 zkI$sX`i}G^AP42wD4Y+N--Q2kl_z;(Q?H1H9`!-?f` z;^Y59oF6Z&k@jGmp8`0>`F|D8*+akSb#KPe{}|7R?`w&-pWD7`Is#d@|rz zFQzM;?L>Rdv*3?_oGXb(`~Q8Q$A0-xb{Hj7zHSd0$M$m(&|`mhDd0$d72w!jT?aVI z$rRQk_k;R9duBs_9s~4<9}778vq|BcFKquG037}N9^km&X#n^c2#;cfL{Xap>hWMU9kMa+P zaVg5j-%G)`x&`Rb{=Wf^alRXjKT(c;KFI#W_#6fF7@y++M>&T9j`V6dS=6uhNr$eF zL+G3n`{ye9Xk52@Y|p;|&!lrsO#e82bo+TEgOp7B^Cc|k|3>Fp{&c`U0K8b?EayYO z&juX*QxEtSpvQGx^uzr?kL9%$a2zkCLcLf3@_+KD?B939pXY!-^|}R@JI1r#hhoN6 z2GMac@dG6+a9qFD?Kab6JRAe`sCT9Xudv{?fMa}K2sp~ede=fUx?UWu=(&Dn13m|E zY_IA7$M)@F3w}A^Ccr*IaR1NpiRaFmbhAt+}J(4+m&SaAHG z0+g?RcaH5rd>?i&C9}M2`++AYdX|Is5b&IgQ#6xFYp z`3(Y&diC#gnfclu=uvO3!cDzbSn%fo$MSt0aIEk8c@WD-`bGT+pk(U3SK(%U*8)At zc@^l<51TFc7QoRDec(9-${!3k=4%GvINpmY+_e8Xz|qdTEI7XJgLZxgdNEFRQ_n|C ze=Y+Y^YtshF<*B9j`BmQqcY|H$%6lUXIZ|cAEqeWjE7>NNB`*O5oSDB06qHWYK#02 z0LOd{R|6W;&TNI7cIE;-+KK;jhj=m2qn$Mt`4<3=<)Z)pj_uh*AKky;z78zkhb?m4 zU1YhioOK}QMuoE<_?d#1zrw(W(>+cP8+e6;omKf7@>0 z`AYux2Cm0ddYsPrMStS>Y6IQV`Q1m!V|pAfjRhR#;P@Z$V}X7Zooo500gm+Af2czZ&o}0Dltj8vtJexLyxuy-xxD z2+*$u{9g*^1D3mOy<#WJcrV?8?+rN0pQLcM6Z4w~IM(ZH0mt}x(<1*9z%d@SS@3>r z2qn`G2Pm8m7!R`m$9U)f9P1G(p&m;?8065B@Wx;V@H_ES7^jr)WC${&*Kd{KxzmIDAe;d%F z-eHz;U6}q^p9%bN57poh>W9T%704XrXSt`dX)be z(4(LA|821x#QOw=+NAz#oWj{2l-~q6#_fH8V}G#$aFnC}pNr+AAKn9cl=IMFX(!XK zqmM4f4GQOcoeTIs3|x=zHyd~s@o@Ucz)zE~(_!HA72ZcJXllJ-g{K?13NvRf1J~>L zqYeDmO3nlWKT_ej2HvFbuz}yE@Db{0`uPCB@1=9?&uqXS0$k^V<$MhIu8N-h@JIS+ zI_+=9R{(w}opWM2ZS>K4bLpHD)4xq0jUUS(C8qy`J{s5S)l9z`@H6O~6Vrc6A5CAw zASI?>LLcoH{oF+3nqC#Vkc08L2MeLZ@>kJE(`$K*qu<8TH7CYV&SZf~yp_(ioLs!v4?cRNJ`;@Gk(*Vuh4UI|~)ge!zC% zG@wU2%PhElK5okY1<1#CX|n|%0P}+9$R?ey(ST$7a~$Akf1?Fo4mg&(o-eQ;(9S~{ zpu`8XXByzBcfP_+KP&_s{duVczY1`StGg7=2ek8_7JLNE3zid)_UFkkFTnm+&kI=G z^FXi1`HZ9gFN5(p`r$#q(a!e)M>&7CjH|O?e2e|d5ejENUkrBY|IgC6uK#);yT)}p zg6|2k9NjLcVPI1Gp!wJj*be-Rt~oK@N+0d#{pg$%=R?5JKl=X* zOnYq4-HMrzl1V=YaEv$IUh!?Lr@sVxY&VX9_5|CF`vAvycmr^he-*S3Sl{t?=Pn_e zbe!L%=()TY*Y)#{2CnPXDg)Q`@L2=b^;y9p4!NY`aVN8JNsDZZF=>dTb7M__1+uC(GMRm zpc2ymO@nkCuFlz%Cjid?{87M11O6Mpvj9(neCfDm=pCTX1^S(U9_`->^l1OBfTR7l z0giG+aH)GJ=MJDpId=k%a?sBx=Ru%HIV%CrQ0JW0-vW;Q)Xx<7c9x=HdcAj%A@t`! zi{Er#$@FOF-3+LNcHW~wI%0nHZ>#ccl=Cpqqnt+o&rs(-R(`cAmVc4Hpd;FU1>k5u z<2$Q+Xg}kcE<@dC`HT-!*H~VRk5G7)I%@iZ)wMn_ev7`KV}?5C_LDz4>E}6&sjgMr zDpmxH-=xm@FkhWBuDU*foCCP($^^0$aNTz>6a`!jbp>)e;M%tg-4FOq>YNWe_Ta?! zXdmpq!ry^oja)zS#VP9f0iwF|~0fDdIrr6qvxra?O12)OQx`Su-v>sVv_Ily(S zGX5&ydoZ9<8XHcD4||F;`861DJ$B$bIPcyI==DA{X4@O^IUr{rz$*dY7x2pf9|1Uy zhxY><-`C3k{2h?P^xAjd1O9WM@2e^g-_~`OZx;bR3g}M;oauFZL;yb!=$8Pl$7pq9G1^g($(^aF!_8bBD z9)L4_nYuRt@I0VD67XXH*Xs!^KNs*{8uTUV-hF@<0R1C?PX!$Re>@-Xom8XDdYN9! z&jdUK^kV=&7VyP@yMSK=IMZwSHv(P=^mhP$9N_JMhXMZvaHhXf-5aVp70%ZQK)*NO zy6@xL^8qgc`f~th`VH#d6@Z@z^w$7>65yKwp9OdfaHhXi-Rq+|KeqoApx*`XQvt{4 zk|zURYS8QYqMu8${L_IRe~$5bz8& zSmb;y0sH{KnO=|8ash7y`VinvfG-F9V!&?zoawdiaNpylK>s(OzYOp`gX9I}~n^ag{Utc<}ykKGcHs75zrKUPkS5uWeuAsWUp{{&Zb>%q?f~u~(s??Lj zq}kbd4Uw9nn#$@(d0ptZ;u4Q{e8Ix<>WEufJ-4d7uD*b7Wlt=Q&}C`e-2C#Ya;7gH zS5i<=kUx$Mm{(R-QogvXyf#uoS*a>#TYp#$KaTNPKf3WkL-)o{o>H^m%$j3r7H9ux zuHSwYKa%;qbN+Uj-$UPgCoSGZj_Ck9y;V!F&u zT#O|?62hTtlM+24X_M?Sh`Kb+k2XP|=mT;JL~C1FQ=L7*JDpNhT3>H#(R#p^peEka zbnO7y8(A{0Zg!brq)DhikEvf@ZxW%ayJgu9}wDf3I~X4aKfMr7ACNq0?o zRaG@*rIDJtZu_Mj6B{?Pp}MN_?DDE}b%z(u&Mq#GOf4-d4_DSlxKAaZrY=%GH?OX) z^jroGm01y;s-NZ5sV*#H#)K#=m@$23i8D5?S@p0#wnAIa{$uNnXVi3Y_T-Wh8oZR8 z(@2)DBzhzJ zP_p=>y2=RklEvrNN6HtF`Oql(L{V=ASo54vuDvm&n=DPBEQKPaRh4Bu4XSJ(mL8hz z!`WlsPbNcqUjwo&Y&|sC!rfz|Ibe#*N~?Ij-edpzGWF14U)~;@nV9SZTD$mn5a zdLpW)c^h}A%$pv@a%oI0T~Jw7S>B_Tv>W!G<*4UIbW>|5$;|Y!;`(#-%=B!3=AODg zTa{(6D}#-%hgRFz<96$gbB9JrlkzL;YisJu3yO*-&&*5mhzE7o z-WkX9la3A7T_HLspnW1L} zCi8XOBGD@2l!m%GdP>KROPuTZG_~Cn!Gx~Fb(`nxZrFR~f$pUE7n$f4j3#L!c!rl^ zd9V@Zrbe=-On!#dHt- zDX$=l2f})_dB+y#CRfyzi)HEpEp*z6@~Q0(4F#pxnzFOI6I(_VD|>vXzNQDu`C`2< zS@Mr!uCLG?GS;igGmC|AIp87xh#(QeCOR8iS3?CmGh~qHVU^`jP)vz2Mh--;n>;z2Lvy zNB`Bm;BWQezor-bZz}$Db!7iN+6(@V6d&gQ+FtPMckNLBb-mypuJ&0X|Mk7#AML~c zbT9bz|0tmTXL`Z!`sm-(3;x+Y{BQMwf4&d@JH6mv?8ARUFZeH0{Mddx)(igSKK%TS zRZrWW>wWmY>IMHTKKy^`1^)^k{;zw%ztV^Qn_logrufx%WYKaM#bv%qYtJF6hC5o&a{|D&;?@w1nIn| z{QSNR*OBezKbUxh{f50u)iu6rOQZ?!>hkq;`uOqRqWIP8fJ`cq9#80Ne)q+Xf2HC- zQWL79$yE|!&2k#>+|@J-`CXbiGFAIIl`DS)yV(H>RQtiiAYkazH*%L z1Td!mZ_m4<3S_ni$P?54vBd0W|4YjLIf|d{A4lif9&LYA={N14t@P{mLWvQ!>T^D} zD}K}dIf}nK|F>D}&*F?x$`ar7PB>joq;u2$Y2;_7H0{4h>DTm1Op^T%Dt^=cl|A(T zJ;d+l|2fM3IZ83xKbg+8J=*{MNROZWY0B~4`M+B6oA#$G#_s%IN&J5HxBB@1a3A~m ze>?o_FI4(Kp=lbZFn-N*k&`Plz!rQeJn{9jdVJ0IEB zghUOLpZ%@Mex9>pGVAYm7W<11k(yc+GsjOJooj#U`1zUAZ`waoHJqkCDK&1iSU zieKy39Hu<}{UtyDr>j5MYgdeHe?Fa?_MfTroAzg^4w3suOs4%;TI?@U{I4N1otySY zE%rO=2gTBqLbiVz@tgKPV6lJy{!;O7hJMrjw=MSPDt_~~hfMqV|5p6`pEgcvnhf?I z>tlbX#r`QOqa(YqpUa6=nDtlxZZyyNF`4!sMErjC=W@qLX@z2D{}Hkxeelva! zQ!mQyuK4vqxkFz%*IDc@QvA1il=8&1|5q0Kw_S?*DNua_75d~zxY`?QEI~YIgtdJ_Rm%NP5+;x-mmV?{#I>28cF9%6u)V&ng7SN z{RaQ&LnURF!rA})y8@>DhY`S(R167exzc}@q0qEvBJm6VC2%{=Y^7hXgR%ZoiN@4_ zr_xWupoH|Ta@;-%sI(QK{V2};>>sY)qvr8FCL=q}KE&^5f9oVkiS6GRB*?UXp+&!b zAN(ry9=5i@^xrua{T)iN{+}TB-y9$Pk1PGA|Mpc2$7&d_)eB#F7j!b1>WT25A)sh) zNu_@mQ}dYi4(521;3<0v$t=I$SnOY}_#aK+PVT?2 zvDlwpAT_N}{Otb#{_P5<9ILfW4p58k)*ig)R>Yy0DnI9sjwYYp7wZ`1Z0bnR0mWxK-J|5bEu`u`AW zCz#S~zj8-P#$yL70qS7-??B@BtN)v)N&WhNAy|Jk$uRZLQTmNyaxNb)6@HkgUf7Dz zZ5I3MCP*qSGfbwQn=JO{o*?Z<|M6OdY5)5c{hO8k{iu8}nf}{s(VsO#>c5`)Cr<3Y zdODi=_oQ~3Db0KZatWk#yF7T`QmS|9%u)Pi`LE2CG)K_*6q9NHsl@MB{u@q~n)Esx z+s}Q8X+Qs72UD8%e^el~W}$LAH|;-&`Ul2L`}dkE8K)ckrkHB@_$9~cjv#8h~KaL)2fsG zcbSj z8Y8Bje#GzRzYO&QoEU#C#BavmY>WQoN`EPh?=Vqz6H>87e}~e)SY?ds?^VQU>c39u zH}mybwN!I$f;QTdk-uEqY^^JVUkxSoF6m{hi&6zdo_(pR-KrpAG)w{UfIS%w45VO#gk#m7UVv z^5A`&{;N>@X8pasS+aEJzf$7&EC0t@lKpohi8SrM%c4L13aS6=ZtCxC7X2%(l=^Y} zdb5xI*Oh+LfBm_zDcvp)-nZ$$eTJ&~V+dHO_<78R$*ezn5Wn!B!Jm7r)U-k|bN#uM z&Q1RU36~Rf1X9Z_;V+s zf7noH`me#Fe~Z$u_c5@3uFIzWhn0Rqjq~uW((ps%!TXlE@-CfDi~a8@{)ur?ac1iI z)?$CI`ax{;-+d&(wEtLIU}2lg^2@kQD(=pI1;p=HelIEg=)VVi^k1suS z{P&XLA1BGZ@4y}M)XbOmzdml&`8NzmSNy*CpK%=tloeYUogkIDY;>ET;eW z8s=aB?&V;oq^3dgg1)ug8VDS&a{AT&BQ2YlQ{93>E!zVib2HigtKmR5vCL^0pOy?ho=)C>+ zQUgAJ{4?QN|8PZr9Gx(w8E11i*csP`%FCqZpCRJ+t3MsLOGa1mvHu^Zb5s82^Xg{WpUC48YHS8H#^d0(bKKYcJyWvwyj=zg_Wj`LCh# zB>!3TuT=UI{>*{+&H7(z(ZBRAnN$57nf0&r(SMWDZ~AZLDrxu^^5A_-sotgYzQz9A zTO|$0JSJ1mW{dsp4@yn={A>dWGX1yr&-}}8&T6T(h~@{FO#clhe!udY{gBjui<*D1 z|DGX1rv7P4znQO4lF1Fae`5%&|yYa&ki~Svcm6}|oitT@%&Q1IO zYSEwZs$?|V57U2tvgptKo79i-|DuonElR)XzuzhS>M@?mg)D3Df=)7sfHj%@&*O?; z=U4MctKxFzD}J;6d`j`>Yesc6?JOgHzxc^|LTXyB_}Kp(651YWc12og(VzZLd4H~E zQ1qt%@3rV}Rr>Y+Zm@pNk`|}+|3~RJ^A&kZDpbn|N_*UI8ko4Z#7zHvuJ~O|sE($d zEaLa`-}O&Q|E*AbZ2v|&H|?*t=+AvyGQMaSX8Nz%qCakDB$)m?cpv$HK>`weS^uo z{`C&>w-G;k+MNGu|Luax>0J9?!#ib2e$)ROmH%})X?l~t5AlogH_Fdded zT=Q$W`xC#P{eqb2rz?JaAo7INNC5Mj_7|}-N@ji0`sH26`9+4m{mYg8S&ESD{|}vO zer^BT#P4VS9Hl?3`1OIv6VeeQ{Ow=aL;EKYzn}kGeeD03G@JI{p!A#Z(`wOg`tvUq z`(IN0+D|&uTED)2#A1KDPyDp|*#CyberJo+aDrB(jv2=Fkt6;6KU?ve`8DmIO#FWS zpS&SOXu|m6v9#vbe)*l!Z~DJh>EF$;*R*G?#s13_zt*G0X#M)S)nfmAWxuNkIsU(* zbIq^iwp;YyqV#Kitxxmo>o$x2l}dlBB4qs?bguce{$2O;FTX8He}>}M2hFdq2NAzt z`PDux%g+1%K{>Oaue@{%BU+aI@qJOl~pQ{zA zqvqG}CX0UO8JYhTijecajm|Z{)}NN?@BjHd%zuFR{rtZ|>32atH?*ey28;g7dYJ!O zi~e?>{PX*hrvBe5{pS2*gVH}bUL{{|()tblT=fF3juY13-$(zTQPLN>oz!}AmHwY= zKpjbhNcuQT@hjLnR49HAP$!yCn03Mao8m_;fCY*0H*{_C??hOD360b- zm?hKyZ_@l6lSJdlU^?~Ve{7?qETa5jGWq#u)W(+8){d?dD;lUL?2$O9z&n8 z^x@|gjAzq_>o(Wp3G|srpF`=x_a@PY>nG3A`1&yV98RAj=#xvIJo+3%AHH`aeU75f z(e#-@pM3fh(1-6$rO!0_xa#^=I^IT~->d7}>39cy?o`)z(QyTR?pD|L((yj}+^??J z(Q!R}HmK`o==dyso>SK^(2>_-UQ*Zpq9f03-%!_|t0RwB*uMX&d`S{RiLcqz|9)ITr#Sxozclb@-g$Gv~I7&->9Aw;Oz(Mqm7& z*nGY-eewT4^EuZGKJKE9L+H3GeZC0p^R3%_VwxN6aHGT8J5$#X5hT7ptJrP)D9vr| z%edQIL#IpAiPvqOoxVk2jZcw)Pu%EwH@flE(>pgaD3g%iA~~b|RfDf@(vk1y&2%Nj zEH}DUsEYOnxt~5UoCr_PJ56viLn!)`8CLAALYZMQLSK`P{J?;t$I*%4+78AC@s{?#|L5XwCX` zH#)6dh+ozk$#k1JN}arDYj&&KB4&X!!A@=59{J?% zH6%7|0Od8GK9Hn8vs**a@BhMjX9<6<=jPjK4?ZL;4PO0Z(<_kzx0x%l<1YI+GQe#v zpb`|tl-+u%EH1)Fgrl3?^#y567m6O7>5^tDh&2^sgZnly=&Tw|UnVuVA0i7*WTsf z=6U2)pJF+xJ+HG*W~ljsOi?gFuVC_mgYz?W(S)O;*q@%|kQYoHcInn2n9!rUb8gl7>cnV|b{!iu|0jCD?Q+<svd>yKeL~_v^RaoM+wOw2sHb zjo`GG+>~u@%BP}0-Nv~G(R(=adV1$(YKw{VJ_S)6n!mp(T7fZXJ_c5 z^_zo^)6^On^;j;c$Xk^`-^80685-O-*Kt!?-JB;Eb%a|MZw@tn*b$C)3Ijz5g`#WS zoVSBb{CtLbH1`1Vf!nd7e{fkXsdXE_86Lc(g3ngR0-=_Iw2Dx$`uXfv+{V=@6>hM) zqas+dH)*4GrA9QkZuEtUVAYG%B)$BJYDX%9=?4#^`>V;tnd{xg)|86iKc1z}lN9e& zyOEM7sVvqldX0F4Lpt2X54Mr$Uu<<-`tT6LA;}v!(ede-EcT>E^s3tS1|eVe3=bj;; z!p#L#a1Cjp<|3-2xm0#fM(W+@%kBZI-IjAZ8sDMF`#l$WV`qBsk{kGJ^{0XCr@6$| zr-Y*4gkFxtTP;`ClvhO=P!_ijJUlU)zZCpcqt<0B8e6KhBC)P%V z7><5Sqf?c?xcs$DN3B!N8lvkf=vrfs^RZ=d8dvGqQnE<&x6!p>)kh2SsZ$b1>J3H> zrn%#BwT|;q%0<*CH1#{caaQ&lxqN5m*Zu!Y<@>o9K_reN`4^9kp(Xu_{mp4NCTFcnQ6hRS2sN!8OAp+ElP7+7R$jl4Lz5&HgL}> zGb0D2iDS`h`DjxRw29K@66YlQyKsx>MtN{JdM+s#HJWa@)Ts{7ZVf&vhJO?U`?xJ) zAf%|Z#$~O+Wv7#G!qLo3)s?TOMw+E-!)YWIT(+8kaI;WEy>qbXBG#dDIy5<_4K%hU z1LnF1NpnbmP(qEzQ=@s%DdNO!J|gqdlPFBqOK*_ZHuPjn-gcX8Csy%LRQM(PE1IuR zl@=Fj01%4y$y7s(*a_61RnT}PGm`_sDadZkYmQ`24z*Cxv<=qr-1tdK@UqwFetxu- za=&wK@apxsO`VYsLoF9%Y7>J^|D{muiJ7ryiBR-Uat@OHm5{Su6bWgeLK3G6pe9_H z-_x0iE=f6K2}eJ0Tf}rm`anfgY(HUx9N%L$dN%tJ5uA4^MMP{H)kYzjqmEqdP2jj) z=G>^-nRHGy^PoW|JI;+MKXaUAseLc*>-;LU@0ER>n^XJzrmyqY)H0e$2l{^1$Jx|} zdU-JyBEOvGxrv2~#2RQ?`DL*i{Z7te`*#-U(WKjaeta%V%{n#1ZgXv#dw6ZS3J5ot z-_GM$n$*6_S_Wp&(nOk)%?FVKoE=}NC3Y5#rkZk1E3>chI0U_(Nqe+zb8eQLH4A&Y zFqdZ8dh(q+Sy{H(lkV9w+-<%vEum)9aM_#QeBiF{lgUg#lUe2Q;LTJX^? z;+keBJEW`fnX{w%=KJeY_BMWz(!I&12y1-Q_C7uqCz~hz?-PGZmr@avieALu(#tr4 zD7taQrwe~CUrzL<%Z0ukmhaN*lNENQ@0K0ax1x9YR_>_2$9ku)bw~AWu;}xPkC%v6 z#fNT3sEP6F-qMZT+~3^IeQsv7eE;@zc{`E##gDH&9U#vqKg)Tk%5CoF)85OLe!vh~ z(5C*?NFv^RE zjq*BQ;U=0I-kF)hPd>wK4vX>9Krwt1&Gl&6Tys~|hnC|{-_I~#x4%E2eJMYNeH2)` zYlk)0QIA|lnWmxeWx`o%J(>IF=JV+0dFj+ocXa-8GL=C*K*$LL`_Q0%Z(8sBK+XyKg}-DtGpx8{Cs z57yjgB`mlvd!yk3F(2Rs>%*6%M}AI&R9fW-UUe}SGp&&9#w{l;z!ePVqgu+QK3T4$ z>2HU;Z|f^J?(o7rKm{!sZE? z$G23mt7j=!FC^E{a_dxBZ4F+ML!cXd)xGF_UU79VS}RvvgUd3+4e9$(bZVNLvNja0 zX5WwAmi;s#f-JI2n`h8W9ks8T$Th5`P z+eRzpKO^h%IWKu)rJS-%S-a$2(&|Rr-BF_G`f|w?G||EiTO-<=m;d9wOv}qp1~2_P zX>nWfgWGt;gsV+f>~&hXQ|qpc@6sCjSzBVu2@=m?$nSrm^RE1U9o-izr(V4cHa#cu z;;qZmdiLhnW2~7JxUAq_x)4mFo(FY&d+Yc_zlbu&^unOC=t9wN%Z((^uUkY5>RU2m z!}yU!;|C;v>Xz8fbiutLty8q^B)Y}unzl?@^b)I`BL4Jx9p7!+tZ8-;1bTH$)98ki zI^25x0m5QhXuLjUPkO^JW#kJ3oYzulWU?l;?{@>7XH&~x8{j+WsNvW0{8Nr#eHf>iW=CIp*)!FlbruZ^6- z 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�-m?obFYw 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%0A<@~{<8n0f6+>rwOay5$&-XTBa{ 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≪xjvJ3&`*fFmF8 zJxTF=Hh?_(#eVNp;->q(e2z7 z{%3+6a-vc=E|EUB2U&t5ML)?eQdUztlAL|K@<5-T1K;Bi~ z5dRg(qkSCr(Y|ZkFBCi6pJ4goc!&M!H1PWzeb)W|X@FxtUjsPytEX`Vq{IirF9sa_ zUJE$-)$1KTjehS0d9<(R=bYaf=r?-PcTSAsI(M)_J)XGE9SS(EbB_T08Tzc_gY9L4 z!*4C%$@u*{*xy#a9Hy7R&ItOl;_W!IBs>o|1E{a+tG0_?Uy^`M*;pa zeb(`u2{`inmN;-S?T5SD@xC6c_+$OYc8&8iJ^wM=3q1x?CB{)c2sqk59&nTo0gm!@ zfTR5RfTMg1;3$7R;9)4Q-wA#Q9p?i6d%-!L^8mjaaGt~KdC>!ca~u|cJg=!aF^+z@ z4s$a7zUINI9MSLlfTQ0}1ULO|2AtO*y8ig+GbgjWI93`*o&yCpd1eW2#^(^gk!LR0 z$M}o`9LsSM;8>0`07sr@2yXJM7u@8@+&D3gJQsp}*K9=L}0Y|@o z2K(sualp~9-cK|A>L*;A`F-8t_dT$Weot4?@#@KJlF{{NSFnTqkAAZV`$b$o5twlt zr*30_64%4&VE^aRUonpB;)?;tdXmk8l=#pDcCHuP*W=uK20ls%?J9a4H=bkY^4$w?9*Z@8AmF%9qUSkm z2m7m$AdmeUUe`l>8XKU*2gH%*Bs!=0AkS9-|4;GUlQ?i<{>TUCrMMo!{X>k~IAtY1 z4yncs=lR^`bld`BpPMVL`%VPE=YzZ+*EnB@p9%74ANQHjeyhl{U+l+_C$3ME;fd>9 zN*o{bJH~+@3pm{$AMP>R}Gx7>7a!uKOi3&WlB! z!-R3T32>}$JhpOTdBmABC)0iw;K(z_f#(B`#^-(q{s`b0AKsJaWR|b44{7{J7B_Ll0IQp#+oZVpDW;yUVfMeX2gMH-F=D_ngkd(}LJ_R_& z;RV34KFo&rV7~PFj@1y?`}2&WeOacf@eA({)azZA$Ll6T={qNOkJnA|6zbu4-9-Ck z`Df_AF2@p)XZsVNyh;UU`3l1I{NQzj`rUa z+_e8W;239p{}0RK{J#?H_6O5vPK;j+IPYxKGU5<-ckdkTtX26$%-!{Sd5EFlp$MW3-@>ss#IB?yc znD(N*XURGGi(R_o(OgjuL2zNrQb`=cCZ|8bogBfcCen@=fGD3j`rIDM?PBx z=kmh*>UE8o-@RCnl8NhmY{t=kA;=?MF1YE}wceQrb}-J10Z04G9r(k7^8xd_9^}!! zet)-_-*-VC{r(6z#=n=Wr`Qgb<9-hOK)}&XzToTz$K}f$_yd4ryL%0AjDu@E*bCNi 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